galaxy-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
commit/galaxy-central: guerler: Charts: Add zoomable heatmaps, add chart type definition to charts model
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/cab2ae91c6a9/
Changeset: cab2ae91c6a9
User: guerler
Date: 2014-06-05 00:57:27
Summary: Charts: Add zoomable heatmaps, add chart type definition to charts model
Affected #: 19 files
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/bar_horizontal_stacked/wrapper.js
@@ -15,7 +15,6 @@
{
// finalize configuration
chart.settings.set('plotoptions_series_stacking', 'normal');
- chart.settings.set('x_axis_categories', [])
// draw chart
var hc = new Highcharts(this.app, this.options);
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/bar_stacked/wrapper.js
@@ -15,7 +15,6 @@
{
// finalize configuration
chart.settings.set('plotoptions_series_stacking', 'normal');
- chart.settings.set('x_axis_categories', [])
// draw chart
var hc = new Highcharts(this.app, this.options);
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/highcharts/boxplot/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/boxplot/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/boxplot/wrapper.js
@@ -11,7 +11,7 @@
},
// render
- draw : function(process_id, chart, request_dictionary)
+ draw : function(process_id, chart, request_dictionary, callback)
{
// configure request
var index = 0;
@@ -29,7 +29,7 @@
chart.settings.set('legend_enabled', 'false')
// create configuration
- this.hc_config = configmaker(chart, chart.settings);
+ this.hc_config = configmaker(chart, callback);
// request data
var self = this;
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
@@ -1,10 +1,14 @@
// dependencies
define([], function() {
-// widget
-return function(chart, settings) {
- // highcharts configuration
- return {
+// highcharts configuration
+return function(chart) {
+
+ // get chart settings
+ var settings = chart.settings;
+
+ // initialize config object
+ var hc_config = {
chart: {
type : '',
zoomType : 'xy'
@@ -23,7 +27,6 @@
},
xAxis: {
- categories : settings.get('x_axis_categories'),
title: {
text : settings.get('x_axis_label')
},
@@ -60,7 +63,6 @@
enabled : !(settings.get('y_axis_type') == 'hide')
}
},
-
plotOptions: {
series: {
animation : false,
@@ -89,44 +91,10 @@
},
series: []
- }/*,
+ }
- // highcharts stacking
- hc_stacklabels: {
- enabled: true,
- style: {
- fontWeight: 'bold',
- color: (Highcharts.theme && Highcharts.theme.textColor) || 'gray'
- }
- },
-
- // initialize
- initialize: function(settings) {
- // stacking
- if (settings.get('x_stacked')) {
- this.hc_config.xAxis.stackLabels = this.hc_stacklabels;
- this.hc_config.plotOptions.column = {
- stacking : 'normal',
- dataLabels : {
- enabled : true,
- color: (Highcharts.theme && Highcharts.theme.dataLabelsColor) || 'white',
- style: {
- textShadow: '0 0 3px black, 0 0 3px black'
- }
- }
- }
- }
-
- // stacking
- if (settings.get('y_stacked')) {
- this.hc_config.yAxis.stackLabels = this.hc_stacklabels;
- this.hc_config.plotOptions.column = {
- stacking : 'normal'
- }
- }
-
- console.log(this.hc_config);
- }*/
+ // callback
+ return hc_config;
};
});
\ No newline at end of file
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/highcharts/common/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/common/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/common/wrapper.js
@@ -22,15 +22,13 @@
// render
draw : function(process_id, hc_type, chart, request_dictionary, callback)
{
- // create configuration
- this.hc_config = configmaker(chart, chart.settings);
-
// request data
var self = this;
this.app.datasets.request(request_dictionary, function() {
+ // check if this chart has multiple panels
if (self.options.canvas.length == 1) {
// groups
- if (self._drawGroups(hc_type, chart, request_dictionary.groups, self.options.canvas[0])) {
+ if (self._drawGroups(hc_type, chart, request_dictionary.groups, self.options.canvas[0], callback)) {
// set chart state
chart.state('ok', 'Chart drawn.');
}
@@ -40,9 +38,9 @@
for (var group_index in request_dictionary.groups) {
// get group
var group = request_dictionary.groups[group_index];
-
+
// draw group
- if (!self._drawGroups(hc_type, chart, [group], self.options.canvas[group_index])) {
+ if (!self._drawGroups(hc_type, chart, [group], self.options.canvas[group_index], callback)) {
valid = false;
break;
}
@@ -60,9 +58,17 @@
},
// draw all data into a single canvas
- _drawGroups: function(hc_type, chart, groups, canvas) {
+ _drawGroups: function(hc_type, chart, groups, canvas, callback) {
+ // create configuration
+ var hc_config = configmaker(chart);
+
+ // make custom wrapper callback
+ if (callback) {
+ callback(hc_config);
+ }
+
// reset
- this.hc_config.series = [];
+ hc_config.series = [];
// loop through data groups
for (var key in groups) {
@@ -92,12 +98,12 @@
};
// append series
- this.hc_config.series.push(hc_series);
+ hc_config.series.push(hc_series);
}
// draw plot
try {
- canvas.highcharts(this.hc_config);
+ canvas.highcharts(hc_config);
return true;
} catch (err) {
var regex = /\www\.highcharts\.com([^&]+)/;
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/highcharts/heatmap/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/heatmap/config.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/heatmap/config.js
@@ -3,18 +3,21 @@
return $.extend(true, {}, config, {
title : 'Heatmap',
category : 'Data processing (requires \'charts\' tool from Toolshed)',
- execute : 'heatmap',
+ //execute : 'heatmap',
use_panels : true,
+ keywords : 'default highcharts',
columns: {
- row_label: {
+ y: {
title : 'Row labels',
- is_label : true
+ is_label : true,
+ is_numeric : true
},
- col_label: {
+ x: {
title : 'Column labels',
- is_label : true
+ is_label : true,
+ is_numeric : true
},
- value: {
+ z: {
title : 'Observations',
is_numeric : true
}
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/highcharts/heatmap/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/heatmap/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/heatmap/wrapper.js
@@ -1,5 +1,5 @@
// dependencies
-define(['plugin/charts/highcharts/common/wrapper'], function(Highcharts) {
+define(['plugin/charts/highcharts/common/wrapper'], function(HighchartsWrapper) {
// widget
return Backbone.View.extend(
@@ -13,13 +13,14 @@
// render
draw : function(process_id, chart, request_dictionary)
{
- // finalize configuration
- chart.settings.set('plotoptions_series_stacking', 'normal');
- chart.settings.set('x_axis_categories', [])
-
// draw chart
- var hc = new Highcharts(this.app, this.options);
- hc.draw(process_id, 'heatmap', chart, request_dictionary);
+ var hc = new HighchartsWrapper(this.app, this.options);
+ hc.draw(process_id, 'heatmap', chart, request_dictionary, function(model) {
+ model.colorAxis = {
+ minColor : '#00FF99',
+ maxColor : '#000066'
+ }
+ });
}
});
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/nvd3/common/config.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/common/config.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/common/config.js
@@ -198,7 +198,7 @@
show_legend : {
title : 'Show legend',
info : 'Would you like to add a legend?',
- type : 'select',
+ type : 'radiobutton',
init : 'true',
data : [
{
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/charts/nvd3/stackedarea/logo.png
Binary file config/plugins/visualizations/charts/static/charts/nvd3/stackedarea/logo.png has changed
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/library/jobs.js
--- a/config/plugins/visualizations/charts/static/library/jobs.js
+++ b/config/plugins/visualizations/charts/static/library/jobs.js
@@ -60,7 +60,7 @@
var chart_type = chart.get('type');
// get chart settings
- var chart_settings = this.app.types.get(chart_type);
+ var chart_definition = chart.definition;
// configure tool
data = {
@@ -70,7 +70,7 @@
'id' : chart.get('dataset_id'),
'src' : 'hda'
},
- 'module' : chart_settings.execute,
+ 'module' : chart_definition.execute,
'columns' : columns_string,
'settings' : settings_string
}
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/library/storage.js
--- a/config/plugins/visualizations/charts/static/library/storage.js
+++ b/config/plugins/visualizations/charts/static/library/storage.js
@@ -114,6 +114,9 @@
// initiating chart
console.debug('Storage::load() - Loading chart type ' + chart_type + '.');
+ // parse chart definition
+ this.chart.definition = chart_definition;
+
// main
this.chart.set(chart_dict.attributes);
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/plugins/heatmap/heatmap.css
--- a/config/plugins/visualizations/charts/static/plugins/heatmap/heatmap.css
+++ /dev/null
@@ -1,76 +0,0 @@
-<style>
- /* disable text selection */
- svg *::selection {
- background : transparent;
- }
-
- svg *::-moz-selection {
- background:transparent;
- }
-
- svg *::-webkit-selection {
- background:transparent;
- }
- rect.selection {
- stroke : #333;
- stroke-dasharray: 4px;
- stroke-opacity : 0.5;
- fill : transparent;
- }
-
- rect.cell-border {
- stroke: #eee;
- stroke-width:0.3px;
- }
-
- rect.cell-selected {
- stroke: rgb(51,102,153);
- stroke-width:0.5px;
- }
-
- rect.cell-hover {
- stroke: #F00;
- stroke-width:0.3px;
- }
-
- text.mono {
- font-size: 9pt;
- font-family: Consolas, courier;
- fill: #aaa;
- }
-
- text.text-selected {
- fill: #000;
- }
-
- text.text-highlight {
- fill: #c00;
- }
- text.text-hover {
- fill: #00C;
- }
- #heatmap-tooltip {
- position: absolute;
- width: 200px;
- height: auto;
- padding: 10px;
- background-color: white;
- -webkit-border-radius: 10px;
- -moz-border-radius: 10px;
- border-radius: 10px;
- -webkit-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
- -moz-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
- box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4);
- pointer-events: none;
- }
-
- #heatmap-tooltip.hidden {
- display: none;
- }
-
- #heatmap-tooltip p {
- margin: 0;
- font-family: sans-serif;
- font-size: 12px;
- line-height: 20px;
- }
\ No newline at end of file
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/plugins/highcharts/heatmap.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/plugins/highcharts/heatmap.js
@@ -0,0 +1,21 @@
+/*
+ Highcharts JS v4.0.1 (2014-04-24)
+
+ (c) 2011-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(g){var j=g.Axis,x=g.Chart,o=g.Color,y=g.Legend,s=g.LegendSymbolMixin,t=g.Series,u=g.getOptions(),k=g.each,p=g.extend,z=g.extendClass,l=g.merge,q=g.pick,v=g.numberFormat,m=g.seriesTypes,w=g.wrap,n=function(){},r=g.ColorAxis=function(){this.isColorAxis=!0;this.init.apply(this,arguments)};p(r.prototype,j.prototype);p(r.prototype,{defaultColorAxisOptions:{lineWidth:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},color:"gray",width:0.01},
+labels:{overflow:"justify"},minColor:"#EFEFFF",maxColor:"#003875",tickLength:5},init:function(b,a){var d=b.options.legend.layout!=="vertical",c;c=l(this.defaultColorAxisOptions,{side:d?2:1,reversed:!d},a,{isX:d,opposite:!d,showEmpty:!1,title:null,isColor:!0});j.prototype.init.call(this,b,c);a.dataClasses&&this.initDataClasses(a);this.initStops(a);this.isXAxis=!0;this.horiz=d;this.zoomEnabled=!1},tweenColors:function(b,a,d){var c=a.rgba[3]!==1||b.rgba[3]!==1;return(c?"rgba(":"rgb(")+Math.round(a.rgba[0]+
+(b.rgba[0]-a.rgba[0])*(1-d))+","+Math.round(a.rgba[1]+(b.rgba[1]-a.rgba[1])*(1-d))+","+Math.round(a.rgba[2]+(b.rgba[2]-a.rgba[2])*(1-d))+(c?","+(a.rgba[3]+(b.rgba[3]-a.rgba[3])*(1-d)):"")+")"},initDataClasses:function(b){var a=this,d=this.chart,c,e=0,h=this.options;this.dataClasses=c=[];k(b.dataClasses,function(f,i){var g,f=l(f);c.push(f);if(!f.color)h.dataClassColor==="category"?(g=d.options.colors,f.color=g[e++],e===g.length&&(e=0)):f.color=a.tweenColors(o(h.minColor),o(h.maxColor),i/(b.dataClasses.length-
+1))})},initStops:function(b){this.stops=b.stops||[[0,this.options.minColor],[1,this.options.maxColor]];k(this.stops,function(a){a.color=o(a[1])})},setOptions:function(b){j.prototype.setOptions.call(this,b);this.options.crosshair=this.options.marker;this.coll="colorAxis"},setAxisSize:function(){var b=this.legendSymbol,a=this.chart,d,c,e;if(b)this.left=d=b.attr("x"),this.top=c=b.attr("y"),this.width=e=b.attr("width"),this.height=b=b.attr("height"),this.right=a.chartWidth-d-e,this.bottom=a.chartHeight-
+c-b,this.len=this.horiz?e:b,this.pos=this.horiz?d:c},toColor:function(b,a){var d,c=this.stops,e,h=this.dataClasses,f,i;if(h)for(i=h.length;i--;){if(f=h[i],e=f.from,c=f.to,(e===void 0||b>=e)&&(c===void 0||b<=c)){d=f.color;if(a)a.dataClass=i;break}}else{this.isLog&&(b=this.val2lin(b));d=1-(this.max-b)/(this.max-this.min);for(i=c.length;i--;)if(d>c[i][0])break;e=c[i]||c[i+1];c=c[i+1]||e;d=1-(c[0]-d)/(c[0]-e[0]||1);d=this.tweenColors(e.color,c.color,d)}return d},getOffset:function(){var b=this.legendGroup;
+if(b&&(j.prototype.getOffset.call(this),!this.axisGroup.parentGroup))this.axisGroup.add(b),this.gridGroup.add(b),this.labelGroup.add(b),this.added=!0},setLegendColor:function(){var b,a=this.options;b=this.horiz?[0,0,1,0]:[0,0,0,1];this.legendColor={linearGradient:{x1:b[0],y1:b[1],x2:b[2],y2:b[3]},stops:a.stops||[[0,a.minColor],[1,a.maxColor]]}},drawLegendSymbol:function(b,a){var d=b.padding,c=b.options,e=this.horiz,h=q(c.symbolWidth,e?200:12),f=q(c.symbolHeight,e?12:200),c=q(c.labelPadding,e?10:30);
+this.setLegendColor();a.legendSymbol=this.chart.renderer.rect(0,b.baseline-11,h,f).attr({zIndex:1}).add(a.legendGroup);a.legendSymbol.getBBox();this.legendItemWidth=h+d+(e?0:c);this.legendItemHeight=f+d+(e?c:0)},setState:n,visible:!0,setVisible:n,getSeriesExtremes:function(){var b;if(this.series.length)b=this.series[0],this.dataMin=b.valueMin,this.dataMax=b.valueMax},drawCrosshair:function(b,a){var d=!this.cross,c=a&&a.plotX,e=a&&a.plotY,h,f=this.pos,i=this.len;if(a)h=this.toPixels(a.value),h<f?h=
+f-2:h>f+i&&(h=f+i+2),a.plotX=h,a.plotY=this.len-h,j.prototype.drawCrosshair.call(this,b,a),a.plotX=c,a.plotY=e,!d&&this.cross&&this.cross.attr({fill:this.crosshair.color}).add(this.labelGroup)},getPlotLinePath:function(b,a,d,c,e){return e?this.horiz?["M",e-4,this.top-6,"L",e+4,this.top-6,e,this.top,"Z"]:["M",this.left,e,"L",this.left-6,e+6,this.left-6,e-6,"Z"]:j.prototype.getPlotLinePath.call(this,b,a,d,c)},update:function(b,a){k(this.series,function(a){a.isDirtyData=!0});j.prototype.update.call(this,
+b,a);this.legendItem&&(this.setLegendColor(),this.chart.legend.colorizeItem(this,!0))},getDataClassLegendSymbols:function(){var b=this,a=this.chart,d=[],c=a.options.legend,e=c.valueDecimals,h=c.valueSuffix||"",f;k(this.dataClasses,function(c,g){var j=!0,l=c.from,m=c.to;f="";l===void 0?f="< ":m===void 0&&(f="> ");l!==void 0&&(f+=v(l,e)+h);l!==void 0&&m!==void 0&&(f+=" - ");m!==void 0&&(f+=v(m,e)+h);d.push(p({chart:a,name:f,options:{},drawLegendSymbol:s.drawRectangle,visible:!0,setState:n,setVisible:function(){j=
+this.visible=!j;k(b.series,function(a){k(a.points,function(a){a.dataClass===g&&a.setVisible(j)})});a.legend.colorizeItem(this,j)}},c))});return d},name:""});w(x.prototype,"getAxes",function(b){var a=this.options.colorAxis;b.call(this);this.colorAxis=[];a&&new r(this,a)});w(y.prototype,"getAllItems",function(b){var a=[],d=this.chart.colorAxis[0];d&&(d.options.dataClasses?a=a.concat(d.getDataClassLegendSymbols()):a.push(d),k(d.series,function(a){a.options.showInLegend=!1}));return a.concat(b.call(this))});
+g={pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",dashstyle:"dashStyle"},pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:n,parallelArrays:["x","y","value"],translateColors:function(){var b=this,a=this.options.nullColor,d=this.colorAxis;k(this.data,function(c){var e=c.value;if(e=e===null?a:d?d.toColor(e,c):c.color||b.color)c.color=e})}};u.plotOptions.heatmap=
+l(u.plotOptions.scatter,{animation:!1,borderWidth:0,nullColor:"#F8F8F8",dataLabels:{format:"{point.value}",verticalAlign:"middle",crop:!1,overflow:!1,style:{color:"white",fontWeight:"bold",textShadow:"0 0 5px black"}},marker:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}<br/>"},states:{normal:{animation:!0},hover:{brightness:0.2}}});m.heatmap=z(m.scatter,l(g,{type:"heatmap",pointArrayMap:["y","value"],hasPointSpecificOptions:!0,supportsDrilldown:!0,getExtremesFromAll:!0,init:function(){m.scatter.prototype.init.apply(this,
+arguments);this.pointRange=this.options.colsize||1;this.yAxis.axisPointRange=this.options.rowsize||1},translate:function(){var b=this.options,a=this.xAxis,d=this.yAxis;this.generatePoints();k(this.points,function(c){var e=(b.colsize||1)/2,h=(b.rowsize||1)/2,f=Math.round(a.len-a.translate(c.x-e,0,1,0,1)),e=Math.round(a.len-a.translate(c.x+e,0,1,0,1)),g=Math.round(d.translate(c.y-h,0,1,0,1)),h=Math.round(d.translate(c.y+h,0,1,0,1));c.plotX=(f+e)/2;c.plotY=(g+h)/2;c.shapeType="rect";c.shapeArgs={x:Math.min(f,
+e),y:Math.min(g,h),width:Math.abs(e-f),height:Math.abs(h-g)}});this.translateColors()},drawPoints:m.column.prototype.drawPoints,animate:n,getBox:n,drawLegendSymbol:s.drawRectangle,getExtremes:function(){t.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;t.prototype.getExtremes.call(this)}}))})(Highcharts);
\ No newline at end of file
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/views/editor.js
--- a/config/plugins/visualizations/charts/static/views/editor.js
+++ b/config/plugins/visualizations/charts/static/views/editor.js
@@ -47,7 +47,7 @@
'back' : new Ui.ButtonIcon({
icon : 'fa-caret-left',
tooltip : 'Return to Viewer',
- title : 'Return',
+ title : 'Cancel',
onclick : function() {
// show viewport
self.app.go('viewer');
@@ -63,15 +63,27 @@
// grid with chart types
//
this.types = new TypesView(app, {
- onchange : function(type) {
+ onchange : function(chart_type) {
+ // get chart definition
+ var chart_definition = self.app.types.get(chart_type);
+ if (!chart_definition) {
+ console.debug('FAILED - Editor::onchange() - Chart type not supported.');
+ }
+
+ // parse chart definition
+ self.chart.definition = chart_definition;
+
// reset type relevant chart content
self.chart.settings.clear();
// update chart type
- self.chart.set({type: type});
+ self.chart.set({type: chart_type});
// set modified flag
self.chart.set('modified', true);
+
+ // log
+ console.debug('Editor::onchange() - Switched chart type.');
},
ondblclick : function(chart_id) {
self._saveChart();
@@ -230,6 +242,9 @@
// update titles
this._refreshGroupKey();
+
+ // reset
+ this.chart.set('modified', true);
},
// remove group
@@ -252,7 +267,7 @@
_resetChart: function() {
// reset chart details
this.chart.set('id', Utils.uuid());
- this.chart.set('type', 'nvd3_bar');
+ this.chart.set('type', 'highcharts_bar');
this.chart.set('dataset_id', this.app.options.config.dataset_id);
this.chart.set('title', 'New Chart');
@@ -262,18 +277,30 @@
// create chart
_saveChart: function() {
- // ensure that data group is available
+ // update chart data
+ this.chart.set({
+ type : this.types.value(),
+ title : this.title.value(),
+ date : Utils.time()
+ });
+
+ // make sure that at least one data group is available
if (this.chart.groups.length == 0) {
+ this.message.update({message: 'Please select data columns before drawing the chart.'});
var group = this._addGroupModel();
this.tabs.show(group.id);
return;
}
- // very selected group columns
+ // make sure that all necessary columns are assigned
var self = this;
var valid = true;
+ var chart_def = this.chart.definition;
this.chart.groups.each(function(group) {
- for (var key in group.attributes) {
+ if (!valid) {
+ return;
+ }
+ for (var key in chart_def.columns) {
if (group.attributes[key] == 'null') {
self.message.update({status: 'danger', message: 'This chart type requires column types not found in your tabular file.'});
self.tabs.show(group.id);
@@ -290,13 +317,6 @@
// show viewport
this.app.go('viewer');
-
- // update chart data
- this.chart.set({
- type : this.types.value(),
- title : this.title.value(),
- date : Utils.time()
- });
// wait until chart is ready
var self = this;
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/views/group.js
--- a/config/plugins/visualizations/charts/static/views/group.js
+++ b/config/plugins/visualizations/charts/static/views/group.js
@@ -74,16 +74,16 @@
var self = this;
// configure chart type
- var chart_settings = this.app.types.get(chart_type);
-
+ var chart_definition = this.chart.definition;
+
// reset table
this.table.delAll();
// load list for select fields
var select_list = {};
- for (var id in chart_settings.columns) {
+ for (var id in chart_definition.columns) {
// get definition
- var data_def = chart_settings.columns[id];
+ var data_def = chart_definition.columns[id];
if (!data_def) {
console.debug('Group::_refreshTable() - Skipping column definition.');
continue;
@@ -114,7 +114,7 @@
this.app.datasets.request({id : dataset_id}, function(dataset) {
// update select fields
for (var id in select_list) {
- self._addRow(id, dataset, select_list, chart_settings.columns[id])
+ self._addRow(id, dataset, select_list, chart_definition.columns[id])
}
// loading
@@ -126,15 +126,15 @@
},
// add row
- _addRow: function(id, dataset, select_list, chart_setting) {
+ _addRow: function(id, dataset, select_list, column_definition) {
// link this
var self = this;
// is a numeric number required
- var is_label = chart_setting.is_label;
- var is_auto = chart_setting.is_auto;
- var is_numeric = chart_setting.is_numeric;
- var is_unique = chart_setting.is_unique;
+ var is_label = column_definition.is_label;
+ var is_auto = column_definition.is_auto;
+ var is_numeric = column_definition.is_numeric;
+ var is_unique = column_definition.is_unique;
// configure columns
var columns = [];
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/views/settings.js
--- a/config/plugins/visualizations/charts/static/views/settings.js
+++ b/config/plugins/visualizations/charts/static/views/settings.js
@@ -33,17 +33,14 @@
// update dataset
_refresh: function() {
- // identify datasets
- var chart_type = this.chart.get('type');
+ // get settings
+ var chart_definition = this.chart.definition;
// check if dataset is available
- if (!chart_type) {
+ if (!chart_definition) {
return;
}
- // get settings
- var chart_definition = this.app.types.get(chart_type);
-
// set title
this.form.title(chart_definition.category + ' - ' + chart_definition.title + ':');
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/views/types.js
--- a/config/plugins/visualizations/charts/static/views/types.js
+++ b/config/plugins/visualizations/charts/static/views/types.js
@@ -32,13 +32,13 @@
// construct chart type subset selection buttons
this.library = new Ui.RadioButton({
data : [ { label: 'Default', value: 'default' },
- { label: 'NVD3 (only)', value: 'nvd3' },
- { label: 'Highcharts (only)', value: 'highcharts' }],
+ { label: 'Classic', value: 'nvd3' },
+ { label: 'Zoomable', value: 'highcharts' }],
onchange: function(value) {
self._filter(value);
}
});
- $el.append(Utils.wrap(this.library.$el).css('text-align', 'center'));
+ $el.append(Utils.wrap(this.library.$el));
// set element
this.setElement($el);
@@ -86,7 +86,7 @@
var type = types[id];
var $el = this.$el.find('#' + id);
var keywords = type.keywords || '';
- if (keywords.indexOf(value) == -1) {
+ if (keywords.indexOf(value) == -1 && value != 'all') {
$el.hide();
} else {
$el.show();
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/static/views/viewport.js
--- a/config/plugins/visualizations/charts/static/views/viewport.js
+++ b/config/plugins/visualizations/charts/static/views/viewport.js
@@ -136,10 +136,10 @@
var chart_type = chart.get('type');
// load chart settings
- this.chart_settings = this.app.types.get(chart_type);
+ this.chart_definition = chart.definition;
// read settings
- var use_panels = this.chart_settings.use_panels;
+ var use_panels = this.chart_definition.use_panels;
// determine number of svg/div-elements to create
var n_panels = 1;
@@ -148,14 +148,14 @@
}
// create canvas element and add to canvas list
- this._createContainer(this.chart_settings.tag, n_panels);
+ this._createContainer(this.chart_definition.tag, n_panels);
// set chart state
chart.state('wait', 'Please wait...');
// clean up data if there is any from previous jobs
- if (!this.chart_settings.execute ||
- (this.chart_settings.execute && chart.get('modified'))) {
+ if (!this.chart_definition.execute ||
+ (this.chart_definition.execute && chart.get('modified'))) {
// reset jobs
this.app.jobs.cleanup(chart);
@@ -171,7 +171,7 @@
var view = new ChartView(self.app, {canvas : self.canvas_list});
// request data
- if (self.chart_settings.execute) {
+ if (self.chart_definition.execute) {
self.app.jobs.request(chart, self._defaultSettingsString(chart), self._defaultRequestString(chart),
function() {
view.draw(process_id, chart, self._defaultRequestDictionary(chart));
@@ -203,7 +203,7 @@
group_index++;
// add selected columns to column string
- for (var key in self.chart_settings.columns) {
+ for (var key in self.chart_definition.columns) {
request_string += key + '_' + group_index + ':' + (parseInt(group.get(key)) + 1) + ', ';
}
});
@@ -236,7 +236,7 @@
};
// update request dataset id
- if (this.chart_settings.execute) {
+ if (this.chart_definition.execute) {
request_dictionary.id = chart.get('dataset_id_job');
} else {
request_dictionary.id = chart.get('dataset_id');
@@ -249,9 +249,9 @@
// add columns
var columns = {};
- for (var column_key in self.chart_settings.columns) {
+ for (var column_key in self.chart_definition.columns) {
// get settings for column
- var column_settings = self.chart_settings.columns[column_key];
+ var column_settings = self.chart_definition.columns[column_key];
// add to columns
columns[column_key] = {
diff -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc -r cab2ae91c6a96e133748900e1c203ce864f52052 config/plugins/visualizations/charts/templates/charts.mako
--- a/config/plugins/visualizations/charts/templates/charts.mako
+++ b/config/plugins/visualizations/charts/templates/charts.mako
@@ -28,10 +28,8 @@
## install highcharts module
${h.javascript_link( app_root + "plugins/highcharts/highcharts.js" )}
${h.javascript_link( app_root + "plugins/highcharts/highcharts-more.js" )}
+ ${h.javascript_link( app_root + "plugins/highcharts/heatmap.js" )}
- ## install heat map module
- ${h.stylesheet_link( app_root + "plugins/heatmap/heatmap.css" )}
-
## install boxplot module
##${h.javascript_link( app_root + "plugins/box.js" )}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Merge bugfix from stable.
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f70167e188f9/
Changeset: f70167e188f9
User: davebgx
Date: 2014-06-04 21:15:23
Summary: Merge bugfix from stable.
Affected #: 2 files
diff -r 72bb9c96a5bad59ca79a669ec1d43a87aa06986f -r f70167e188f9ad42d1651ea77a1208ad2fdc9abc lib/tool_shed/util/metadata_util.py
--- a/lib/tool_shed/util/metadata_util.py
+++ b/lib/tool_shed/util/metadata_util.py
@@ -1694,6 +1694,8 @@
def reset_all_metadata_on_installed_repository( trans, id ):
"""Reset all metadata on a single tool shed repository installed into a Galaxy instance."""
+ invalid_file_tups = []
+ metadata_dict = {}
repository = suc.get_installed_tool_shed_repository( trans, id )
repository_clone_url = common_util.generate_clone_url_for_installed_repository( trans.app, repository )
tool_path, relative_install_dir = repository.get_tool_relative_path( trans.app )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Fix resetting all metadata based on issue found by Nicola Soranzo.
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/fb68af9a775a/
Changeset: fb68af9a775a
Branch: stable
User: davebgx
Date: 2014-06-04 21:04:33
Summary: Fix resetting all metadata based on issue found by Nicola Soranzo.
Affected #: 1 file
diff -r 18777feed30bc0a41e2f46b49e561cd23eb3b564 -r fb68af9a775a956fcc397b22d16f2119401d926d lib/tool_shed/util/metadata_util.py
--- a/lib/tool_shed/util/metadata_util.py
+++ b/lib/tool_shed/util/metadata_util.py
@@ -1712,6 +1712,8 @@
def reset_all_metadata_on_installed_repository( trans, id ):
"""Reset all metadata on a single tool shed repository installed into a Galaxy instance."""
+ invalid_file_tups = []
+ metadata_dict = {}
repository = suc.get_installed_tool_shed_repository( trans, id )
repository_clone_url = common_util.generate_clone_url_for_installed_repository( trans.app, repository )
tool_path, relative_install_dir = repository.get_tool_relative_path( trans.app )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Update LWR client throught LWR changeset 860ba9c.
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/72bb9c96a5ba/
Changeset: 72bb9c96a5ba
User: jmchilton
Date: 2014-06-04 19:16:38
Summary: Update LWR client throught LWR changeset 860ba9c.
Allows asynchornous submission of LWR jobs to remote servers without a remote LWR service running. LWR still needs to be configured there and job updates are should be configured to be sent back to Galaxy through AMQP.
A long running process will be executed on the remote server to monitor the job - while this will always be needed in some cases - for others it would be great to be able to embedded the update steps into the job to be submitted to the DRM itself so that this long running process can be just a submission.
This is one more potential step down the road toward allowing remote execution of Galaxy jobs with ever fewer remote constraints. Extensions to this would include allowing Galaxy job updates via the jobs API (along with staging) so MQ becomes optional, allowing auto-configuration of remote LWR application if unavailable or unconfigured, more transfer options (scp), more CLI shell options (fabric, ansible, etc...).
Affected #: 7 files
diff -r 3d6b71244ff9a708bd6eda419b50315d7aac4405 -r 72bb9c96a5bad59ca79a669ec1d43a87aa06986f lib/galaxy/jobs/runners/lwr.py
--- a/lib/galaxy/jobs/runners/lwr.py
+++ b/lib/galaxy/jobs/runners/lwr.py
@@ -402,7 +402,10 @@
def __job_state( self, job, job_wrapper ):
job_state = AsynchronousJobState()
- job_state.job_id = str( job.get_job_runner_external_id() )
+ # TODO: Determine why this is set when using normal message queue updates
+ # but not CLI submitted MQ updates...
+ raw_job_id = job.get_job_runner_external_id() or job_wrapper.job_id
+ job_state.job_id = str( raw_job_id )
job_state.runner_url = job_wrapper.get_job_runner_url()
job_state.job_destination = job_wrapper.job_destination
job_state.job_wrapper = job_wrapper
diff -r 3d6b71244ff9a708bd6eda419b50315d7aac4405 -r 72bb9c96a5bad59ca79a669ec1d43a87aa06986f lib/galaxy/jobs/runners/lwr_client/client.py
--- a/lib/galaxy/jobs/runners/lwr_client/client.py
+++ b/lib/galaxy/jobs/runners/lwr_client/client.py
@@ -8,6 +8,8 @@
from .decorators import retry
from .util import copy
from .util import ensure_directory
+from .util import to_base64_json
+
import logging
log = logging.getLogger(__name__)
@@ -285,16 +287,25 @@
self._raw_execute("download_output", output_params, output_path=output_path)
-class MessageJobClient(BaseJobClient):
+class BaseMessageJobClient(BaseJobClient):
def __init__(self, destination_params, job_id, client_manager):
- super(MessageJobClient, self).__init__(destination_params, job_id)
+ super(BaseMessageJobClient, self).__init__(destination_params, job_id)
if not self.job_directory:
error_message = "Message-queue based LWR client requires destination define a remote job_directory to stage files into."
raise Exception(error_message)
self.client_manager = client_manager
- def launch(self, command_line, dependencies_description=None, env=[], remote_staging=[], job_config=None):
+ def clean(self):
+ del self.client_manager.status_cache[self.job_id]
+
+ def full_status(self):
+ full_status = self.client_manager.status_cache.get(self.job_id, None)
+ if full_status is None:
+ raise Exception("full_status() called before a final status was properly cached with cilent manager.")
+ return full_status
+
+ def _build_setup_message(self, command_line, dependencies_description, env, remote_staging, job_config):
"""
"""
launch_params = dict(command_line=command_line, job_id=self.job_id)
@@ -313,21 +324,54 @@
# before queueing.
setup_params = _setup_params_from_job_config(job_config)
launch_params["setup_params"] = setup_params
+ return launch_params
+
+
+class MessageJobClient(BaseMessageJobClient):
+
+ def launch(self, command_line, dependencies_description=None, env=[], remote_staging=[], job_config=None):
+ """
+ """
+ launch_params = self._build_setup_message(
+ command_line,
+ dependencies_description=dependencies_description,
+ env=env,
+ remote_staging=remote_staging,
+ job_config=job_config
+ )
response = self.client_manager.exchange.publish("setup", launch_params)
log.info("Job published to setup message queue.")
return response
- def clean(self):
- del self.client_manager.status_cache[self.job_id]
+ def kill(self):
+ self.client_manager.exchange.publish("kill", dict(job_id=self.job_id))
- def full_status(self):
- full_status = self.client_manager.status_cache.get(self.job_id, None)
- if full_status is None:
- raise Exception("full_status() called before a final status was properly cached with cilent manager.")
- return full_status
+
+class MessageCLIJobClient(BaseMessageJobClient):
+
+ def __init__(self, destination_params, job_id, client_manager, shell):
+ super(MessageCLIJobClient, self).__init__(destination_params, job_id, client_manager)
+ self.remote_lwr_path = destination_params["remote_lwr_path"]
+ self.shell = shell
+
+ def launch(self, command_line, dependencies_description=None, env=[], remote_staging=[], job_config=None):
+ """
+ """
+ launch_params = self._build_setup_message(
+ command_line,
+ dependencies_description=dependencies_description,
+ env=env,
+ remote_staging=remote_staging,
+ job_config=job_config
+ )
+ base64_message = to_base64_json(launch_params)
+ submit_command = os.path.join(self.remote_lwr_path, "scripts", "submit.bash")
+ # TODO: Allow configuration of manager, app, and ini path...
+ self.shell.execute("nohup %s --base64 %s &" % (submit_command, base64_message))
def kill(self):
- self.client_manager.exchange.publish("kill", dict(job_id=self.job_id))
+ # TODO
+ pass
class InputCachingJobClient(JobClient):
diff -r 3d6b71244ff9a708bd6eda419b50315d7aac4405 -r 72bb9c96a5bad59ca79a669ec1d43a87aa06986f lib/galaxy/jobs/runners/lwr_client/interface.py
--- a/lib/galaxy/jobs/runners/lwr_client/interface.py
+++ b/lib/galaxy/jobs/runners/lwr_client/interface.py
@@ -78,8 +78,8 @@
def execute(self, command, args={}, data=None, input_path=None, output_path=None):
# If data set, should be unicode (on Python 2) or str (on Python 3).
- from lwr import routes
- from lwr.framework import build_func_args
+ from lwr.web import routes
+ from lwr.web.framework import build_func_args
controller = getattr(routes, command)
action = controller.func
body_args = dict(body=self.__build_body(data, input_path))
diff -r 3d6b71244ff9a708bd6eda419b50315d7aac4405 -r 72bb9c96a5bad59ca79a669ec1d43a87aa06986f lib/galaxy/jobs/runners/lwr_client/manager.py
--- a/lib/galaxy/jobs/runners/lwr_client/manager.py
+++ b/lib/galaxy/jobs/runners/lwr_client/manager.py
@@ -8,6 +8,7 @@
from .client import JobClient
from .client import InputCachingJobClient
from .client import MessageJobClient
+from .client import MessageCLIJobClient
from .interface import HttpLwrInterface
from .interface import LocalLwrInterface
from .object_client import ObjectStoreClient
@@ -71,6 +72,12 @@
pass
+try:
+ from galaxy.jobs.runners.util.cli import factory as cli_factory
+except ImportError:
+ from lwr.managers.util.cli import factory as cli_factory
+
+
class MessageQueueClientManager(object):
def __init__(self, **kwds):
@@ -90,7 +97,8 @@
def callback_wrapper(body, message):
try:
if "job_id" in body:
- self.status_cache[body["job_id"]] = body
+ job_id = body["job_id"]
+ self.status_cache[job_id] = body
log.debug("Handling asynchronous status update from remote LWR.")
callback(body)
except Exception:
@@ -116,9 +124,15 @@
return self.active
def get_client(self, destination_params, job_id, **kwargs):
+ if job_id is None:
+ raise Exception("Cannot generate LWR client for empty job_id.")
destination_params = _parse_destination_params(destination_params)
destination_params.update(**kwargs)
- return MessageJobClient(destination_params, job_id, self)
+ if 'shell_plugin' in destination_params:
+ shell = cli_factory.get_shell(destination_params)
+ return MessageCLIJobClient(destination_params, job_id, self, shell)
+ else:
+ return MessageJobClient(destination_params, job_id, self)
class ObjectStoreClientManager(object):
diff -r 3d6b71244ff9a708bd6eda419b50315d7aac4405 -r 72bb9c96a5bad59ca79a669ec1d43a87aa06986f lib/galaxy/jobs/runners/lwr_client/util.py
--- a/lib/galaxy/jobs/runners/lwr_client/util.py
+++ b/lib/galaxy/jobs/runners/lwr_client/util.py
@@ -7,6 +7,8 @@
import os.path
import hashlib
import shutil
+import json
+import base64
def unique_path_prefix(path):
@@ -70,6 +72,20 @@
if key.startswith(prefix)])
+def to_base64_json(data):
+ """
+
+ >>> x = from_base64_json(to_base64_json(dict(a=5)))
+ >>> x["a"]
+ 5
+ """
+ return base64.b64encode(json.dumps(data))
+
+
+def from_base64_json(data):
+ return json.loads(base64.b64decode(data))
+
+
class PathHelper(object):
'''
diff -r 3d6b71244ff9a708bd6eda419b50315d7aac4405 -r 72bb9c96a5bad59ca79a669ec1d43a87aa06986f lib/galaxy/jobs/runners/util/cli/__init__.py
--- a/lib/galaxy/jobs/runners/util/cli/__init__.py
+++ b/lib/galaxy/jobs/runners/util/cli/__init__.py
@@ -43,11 +43,19 @@
Return shell and job interface defined by and configured via
specified params.
"""
+ shell = self.get_shell_plugin(shell_params)
+ job_interface = self.get_job_interface(job_params)
+ return shell, job_interface
+
+ def get_shell_plugin(self, shell_params):
shell_plugin = shell_params.get('plugin', DEFAULT_SHELL_PLUGIN)
+ shell = self.cli_shells[shell_plugin](**shell_params)
+ return shell
+
+ def get_job_interface(self, job_params):
job_plugin = job_params['plugin']
- shell = self.cli_shells[shell_plugin](**shell_params)
job_interface = self.cli_job_interfaces[job_plugin](**job_params)
- return shell, job_interface
+ return job_interface
def split_params(params):
diff -r 3d6b71244ff9a708bd6eda419b50315d7aac4405 -r 72bb9c96a5bad59ca79a669ec1d43a87aa06986f lib/galaxy/jobs/runners/util/cli/factory.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/util/cli/factory.py
@@ -0,0 +1,18 @@
+try:
+ from galaxy.jobs.runners.util.cli import (
+ CliInterface,
+ split_params
+ )
+ code_dir = 'lib'
+except ImportError:
+ from lwr.managers.util.cli import (
+ CliInterface,
+ split_params
+ )
+ code_dir = '.'
+
+
+def get_shell(params):
+ cli_interface = CliInterface(code_dir=code_dir)
+ shell_params, _ = split_params(params)
+ return cli_interface.get_shell_plugin(shell_params)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Fix for installing from toolshed that uses 307 redirects that are not being handled nicely by urllib2.urlopen when the urllib2.Request has data provided.
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/18777feed30b/
Changeset: 18777feed30b
Branch: stable
User: dan
Date: 2014-06-04 17:05:36
Summary: Fix for installing from toolshed that uses 307 redirects that are not being handled nicely by urllib2.urlopen when the urllib2.Request has data provided.
Affected #: 1 file
diff -r c68aa8a8e769437473bd23586d1b55fc66cc8c47 -r 18777feed30bc0a41e2f46b49e561cd23eb3b564 lib/tool_shed/util/common_install_util.py
--- a/lib/tool_shed/util/common_install_util.py
+++ b/lib/tool_shed/util/common_install_util.py
@@ -448,6 +448,8 @@
# Handle secure / insecure Tool Shed URL protocol changes and port changes.
tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( trans.app, tool_shed_url )
url = common_util.url_join( tool_shed_url, '/repository/get_required_repo_info_dict' )
+ # Fix for handling 307 redirect not being handled nicely by urllib2.urlopen when the urllib2.Request has data provided
+ url = urllib2.urlopen( urllib2.Request( url ) ).geturl()
request = urllib2.Request( url, data=urllib.urlencode( dict( encoded_str=encoded_required_repository_str ) ) )
response = urllib2.urlopen( request ).read()
if response:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Fix for installing from toolshed that uses 307 redirects that are not being handled nicely by urllib2.urlopen when the urllib2.Request has data provided.
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/3d6b71244ff9/
Changeset: 3d6b71244ff9
User: dan
Date: 2014-06-04 17:05:36
Summary: Fix for installing from toolshed that uses 307 redirects that are not being handled nicely by urllib2.urlopen when the urllib2.Request has data provided.
Affected #: 1 file
diff -r 819818c880b543d9ef32aa61a099235c20937dae -r 3d6b71244ff9a708bd6eda419b50315d7aac4405 lib/tool_shed/util/common_install_util.py
--- a/lib/tool_shed/util/common_install_util.py
+++ b/lib/tool_shed/util/common_install_util.py
@@ -447,6 +447,8 @@
# Handle secure / insecure Tool Shed URL protocol changes and port changes.
tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( trans.app, tool_shed_url )
url = common_util.url_join( tool_shed_url, '/repository/get_required_repo_info_dict' )
+ # Fix for handling 307 redirect not being handled nicely by urllib2.urlopen when the urllib2.Request has data provided
+ url = urllib2.urlopen( urllib2.Request( url ) ).geturl()
request = urllib2.Request( url, data=urllib.urlencode( dict( encoded_str=encoded_required_repository_str ) ) )
response = urllib2.urlopen( request ).read()
if response:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix the exception handler in the Tool Shed APi submit() function so that an expected dict is returned instead of a string.
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/819818c880b5/
Changeset: 819818c880b5
User: greg
Date: 2014-06-04 15:21:18
Summary: Fix the exception handler in the Tool Shed APi submit() function so that an expected dict is returned instead of a string.
Affected #: 1 file
diff -r 0cb88fa06c32e13c8881ed90af02b239aa574313 -r 819818c880b543d9ef32aa61a099235c20937dae lib/tool_shed/scripts/api/common.py
--- a/lib/tool_shed/scripts/api/common.py
+++ b/lib/tool_shed/scripts/api/common.py
@@ -197,7 +197,7 @@
print e.read( 1024 )
sys.exit( 1 )
else:
- return 'Error. '+ str( e.read( 1024 ) )
+ return dict( status='error', message=str( e.read( 1024 ) ) )
if not return_formatted:
return r
print 'Response'
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Fix for Safari Caching External View application 302 redirect links. See https://trello.com/c/optldnPm
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c68aa8a8e769/
Changeset: c68aa8a8e769
Branch: stable
User: dan
Date: 2014-06-03 23:03:17
Summary: Fix for Safari Caching External View application 302 redirect links. See https://trello.com/c/optldnPm
Affected #: 1 file
diff -r f9c050410d6a56d7f6fe503b4f22f286bd5a40e2 -r c68aa8a8e769437473bd23586d1b55fc66cc8c47 lib/galaxy/webapps/galaxy/controllers/dataset.py
--- a/lib/galaxy/webapps/galaxy/controllers/dataset.py
+++ b/lib/galaxy/webapps/galaxy/controllers/dataset.py
@@ -738,6 +738,8 @@
return rval
elif app_action == None:
#redirect user to url generated by display link
+ #Fix for Safari caching display links, which can change if the underlying dataset has an attribute change, e.g. name, metadata, etc
+ trans.response.headers[ 'Cache-Control' ] = [ 'no-cache', 'max-age=0', 'no-store', 'must-revalidate' ]
return trans.response.send_redirect( display_link.display_url() )
else:
msg.append( ( 'Invalid action provided: %s' % app_action, 'error' ) )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: guerler: Charts: Improve notifications and error handling
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/0cb88fa06c32/
Changeset: 0cb88fa06c32
User: guerler
Date: 2014-06-04 09:54:54
Summary: Charts: Improve notifications and error handling
Affected #: 4 files
diff -r 9c1a51c9f85f52d4570dede166155700130d8234 -r 0cb88fa06c32e13c8881ed90af02b239aa574313 config/plugins/visualizations/charts/static/charts/highcharts/common/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/common/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/common/wrapper.js
@@ -30,22 +30,28 @@
this.app.datasets.request(request_dictionary, function() {
if (self.options.canvas.length == 1) {
// groups
- self._drawGroups(hc_type, chart, request_dictionary.groups, self.options.canvas[0]);
-
- // set chart state
- chart.state('ok', 'Chart drawn.');
+ if (self._drawGroups(hc_type, chart, request_dictionary.groups, self.options.canvas[0])) {
+ // set chart state
+ chart.state('ok', 'Chart drawn.');
+ }
} else {
// loop through data groups
+ var valid = true;
for (var group_index in request_dictionary.groups) {
// get group
var group = request_dictionary.groups[group_index];
// draw group
- self._drawGroups(hc_type, chart, [group], self.options.canvas[group_index]);
+ if (!self._drawGroups(hc_type, chart, [group], self.options.canvas[group_index])) {
+ valid = false;
+ break;
+ }
}
// set chart state
- chart.state('ok', 'Multi-panel chart drawn.');
+ if (valid) {
+ chart.state('ok', 'Multi-panel chart drawn.');
+ }
}
// unregister process
@@ -90,7 +96,19 @@
}
// draw plot
- canvas.highcharts(this.hc_config);
+ try {
+ canvas.highcharts(this.hc_config);
+ return true;
+ } catch (err) {
+ var regex = /\www\.highcharts\.com([^&]+)/;
+ var match = err.match(regex);
+ if (match.length > 0) {
+ chart.state('failed', 'Highcharts error: <a target="_blank" href="http://' + match[0] + '">' + match[0] + '</a>');
+ } else {
+ chart.state('failed', err);
+ }
+ return false;
+ }
}
});
diff -r 9c1a51c9f85f52d4570dede166155700130d8234 -r 0cb88fa06c32e13c8881ed90af02b239aa574313 config/plugins/visualizations/charts/static/views/editor.js
--- a/config/plugins/visualizations/charts/static/views/editor.js
+++ b/config/plugins/visualizations/charts/static/views/editor.js
@@ -28,6 +28,9 @@
// configure options
this.options = Utils.merge(options, this.optionsDefault);
+ // message element
+ this.message = new Ui.Message();
+
// create portlet
this.portlet = new Portlet.View({
icon : 'fa-bar-chart-o',
@@ -38,10 +41,6 @@
tooltip : 'Draw Chart',
title : 'Draw',
onclick : function() {
- // show viewport
- self.app.go('viewer');
-
- // save chart
self._saveChart();
}
}),
@@ -75,10 +74,6 @@
self.chart.set('modified', true);
},
ondblclick : function(chart_id) {
- // show viewport
- self.app.go('viewer');
-
- // save chart
self._saveChart();
}
});
@@ -135,6 +130,7 @@
});
// append tabs
+ this.portlet.append(this.message.$el);
this.portlet.append(this.tabs.$el);
// elements
@@ -266,6 +262,35 @@
// create chart
_saveChart: function() {
+ // ensure that data group is available
+ if (this.chart.groups.length == 0) {
+ var group = this._addGroupModel();
+ this.tabs.show(group.id);
+ return;
+ }
+
+ // very selected group columns
+ var self = this;
+ var valid = true;
+ this.chart.groups.each(function(group) {
+ for (var key in group.attributes) {
+ if (group.attributes[key] == 'null') {
+ self.message.update({status: 'danger', message: 'This chart type requires column types not found in your tabular file.'});
+ self.tabs.show(group.id);
+ valid = false;
+ return;
+ }
+ }
+ });
+
+ // validate if columns have been selected
+ if (!valid) {
+ return;
+ }
+
+ // show viewport
+ this.app.go('viewer');
+
// update chart data
this.chart.set({
type : this.types.value(),
@@ -273,11 +298,6 @@
date : Utils.time()
});
- // ensure that data group is available
- if (this.chart.groups.length == 0) {
- this._addGroupModel();
- }
-
// wait until chart is ready
var self = this;
this.chart.deferred.execute(function() {
diff -r 9c1a51c9f85f52d4570dede166155700130d8234 -r 0cb88fa06c32e13c8881ed90af02b239aa574313 config/plugins/visualizations/charts/static/views/viewer.js
--- a/config/plugins/visualizations/charts/static/views/viewer.js
+++ b/config/plugins/visualizations/charts/static/views/viewer.js
@@ -21,6 +21,9 @@
// link this
var self = this;
+ // message element
+ this.message = new Ui.Message();
+
// create portlet
this.portlet = new Portlet.View({
icon : 'fa-bar-chart-o',
@@ -53,6 +56,7 @@
});
// append portlet
+ this.portlet.append(this.message.$el);
this.portlet.append(this.viewport_view.$el);
// set element
@@ -91,22 +95,7 @@
if (chart.deferred.ready()) {
callback();
} else {
- // show modal
- var self = this;
- this.app.modal.show({
- title : 'Please wait!',
- body : 'Your chart is currently being processed. Please wait and try again.',
- buttons : {
- 'Close' : function() {self.app.modal.hide();},
- 'Retry' : function() {
- // hide modal
- self.app.modal.hide();
-
- // retry
- setTimeout(function() { self._wait(chart, callback); }, self.app.config.get('query_timeout'));
- }
- }
- });
+ this.message.update({message: 'Your chart is currently being processed. Please wait and try again.'});
}
}
});
diff -r 9c1a51c9f85f52d4570dede166155700130d8234 -r 0cb88fa06c32e13c8881ed90af02b239aa574313 config/plugins/visualizations/charts/static/views/viewport.js
--- a/config/plugins/visualizations/charts/static/views/viewport.js
+++ b/config/plugins/visualizations/charts/static/views/viewport.js
@@ -39,7 +39,7 @@
this.chart.on('set:state', function() {
// get info element
var $info = self.$el.find('#info');
- var $container = self.$el.find('container');
+ var $container = self.$el.find('.charts-viewport-container');
// get icon
var $icon = $info.find('#icon');
@@ -51,21 +51,20 @@
$info.show();
$info.find('#text').html(self.chart.get('state_info'));
- // hide containers
- $container.hide();
-
// check status
var state = self.chart.get('state');
switch (state) {
case 'ok':
$info.hide();
- $container.show()
+ $container.show();
break;
case 'failed':
$icon.addClass('icon fa fa-warning');
+ $container.hide();
break;
default:
$icon.addClass('icon fa fa-spinner fa-spin');
+ $container.show();
}
});
},
@@ -182,7 +181,6 @@
}
);
} else {
- // load data into view
view.draw(process_id, chart, self._defaultRequestDictionary(chart));
}
});
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: guerler: Charts: Extend boxplot options
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/9c1a51c9f85f/
Changeset: 9c1a51c9f85f
User: guerler
Date: 2014-06-04 08:10:32
Summary: Charts: Extend boxplot options
Affected #: 3 files
diff -r c93e85d8ac0d28ea07a985ddd15f014216dd6ddb -r 9c1a51c9f85f52d4570dede166155700130d8234 config/plugins/visualizations/charts/static/charts/highcharts/boxplot/config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/boxplot/config.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/boxplot/config.js
@@ -1,6 +1,6 @@
-define([], function() {
+define(['plugin/charts/highcharts/common/config'], function(config) {
-return $.extend(true, {}, {
+return $.extend(true, {}, config, {
title : 'Box plot',
category : 'Data processing (requires \'charts\' tool from Toolshed)',
library : 'Highcharts',
diff -r c93e85d8ac0d28ea07a985ddd15f014216dd6ddb -r 9c1a51c9f85f52d4570dede166155700130d8234 config/plugins/visualizations/charts/static/charts/highcharts/boxplot/wrapper.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/boxplot/wrapper.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/boxplot/wrapper.js
@@ -29,7 +29,7 @@
chart.settings.set('legend_enabled', 'false')
// create configuration
- this.hc_config = configmaker(chart.settings);
+ this.hc_config = configmaker(chart, chart.settings);
// request data
var self = this;
diff -r c93e85d8ac0d28ea07a985ddd15f014216dd6ddb -r 9c1a51c9f85f52d4570dede166155700130d8234 config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
@@ -36,6 +36,8 @@
},
labels: {
formatter : function() {
+ if (settings.get('x_axis_type') == 'auto')
+ return this.value;
var format = d3.format(settings.get('x_axis_tick') + settings.get('x_axis_type'));
return format(this.value);
},
@@ -50,6 +52,8 @@
},
labels: {
formatter : function() {
+ if (settings.get('y_axis_type') == 'auto')
+ return this.value;
var format = d3.format(settings.get('y_axis_tick') + settings.get('y_axis_type'));
return format(this.value);
},
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: guerler: Charts: Remove helper function
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c93e85d8ac0d/
Changeset: c93e85d8ac0d
User: guerler
Date: 2014-06-04 07:52:58
Summary: Charts: Remove helper function
Affected #: 1 file
diff -r 2df424fc0536831e49b09d4d2ffa3a111fba1282 -r c93e85d8ac0d28ea07a985ddd15f014216dd6ddb config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts/common/highcharts-config.js
@@ -3,15 +3,6 @@
// widget
return function(chart, settings) {
- // helper label enabled
- var labelEnabled = function(axis) {
- if (settings.get(axis + '_type') == 'hide') {
- return false;
- } else {
- return true;
- }
- };
-
// highcharts configuration
return {
chart: {
@@ -48,7 +39,7 @@
var format = d3.format(settings.get('x_axis_tick') + settings.get('x_axis_type'));
return format(this.value);
},
- enabled : labelEnabled('x_axis')
+ enabled : !(settings.get('x_axis_type') == 'hide')
},
tickPixelInterval : 100
},
@@ -62,7 +53,7 @@
var format = d3.format(settings.get('y_axis_tick') + settings.get('y_axis_type'));
return format(this.value);
},
- enabled : labelEnabled('y_axis')
+ enabled : !(settings.get('y_axis_type') == 'hide')
}
},
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: guerler: Charts: Adding chart subset selection filter, setting zoomable charts as default
by commits-noreply@bitbucket.org 04 Jun '14
by commits-noreply@bitbucket.org 04 Jun '14
04 Jun '14
MSBuZXcgY29tbWl0IGluIGdhbGF4eS1jZW50cmFsOgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dh
bGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzLzJkZjQyNGZjMDUzNi8KQ2hhbmdlc2V0OiAgIDJk
ZjQyNGZjMDUzNgpVc2VyOiAgICAgICAgZ3VlcmxlcgpEYXRlOiAgICAgICAgMjAxNC0wNi0wNCAw
Nzo0OTo0MwpTdW1tYXJ5OiAgICAgQ2hhcnRzOiBBZGRpbmcgY2hhcnQgc3Vic2V0IHNlbGVjdGlv
biBmaWx0ZXIsIHNldHRpbmcgem9vbWFibGU9CiBjaGFydHMgYXMgZGVmYXVsdApBZmZlY3RlZCAj
OiAgMzEgZmlsZXMKCmRpZmYgLXIgMWJlMDdkZTg2YzJhNjA2NTE4YTdjZmMyOTEzMjMwYzI5YTcy
MTBmOCAtciAyZGY0MjRmYzA1MzY4MzFlNDliMDlkND0KZDJmZmEzYTExMWZiYTEyODIgY29uZmln
L3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQphcnRz
L2Jhci9jb25maWcuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRz
L3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9iYXIvY29uPQpmaWcuanMKKysrIGIvY29uZmlnL3Bs
dWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9iYXIv
Y29uPQpmaWcuanMKQEAgLTMsNiArMyw3IEBACiByZXR1cm4gJC5leHRlbmQodHJ1ZSwge30sIGNv
bmZpZywgewogICAgIHRpdGxlICAgICAgIDogJ1JlZ3VsYXInLAogICAgIGNhdGVnb3J5ICAgIDog
J0JhciBkaWFncmFtcycsCisgICAga2V5d29yZHMgICAgOiAnZGVmYXVsdCBoaWdoY2hhcnRzJywK
ICAgICBjb2x1bW5zICAgICA6IHsKICAgICAgICAgeCA6IHsKICAgICAgICAgICAgIHRpdGxlICAg
ICAgIDogJ1ZhbHVlcyBmb3IgeC1heGlzJywKCmRpZmYgLXIgMWJlMDdkZTg2YzJhNjA2NTE4YTdj
ZmMyOTEzMjMwYzI5YTcyMTBmOCAtciAyZGY0MjRmYzA1MzY4MzFlNDliMDlkND0KZDJmZmEzYTEx
MWZiYTEyODIgY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFy
dHMvaGlnaGNoPQphcnRzL2Jhcl9ob3Jpem9udGFsL2NvbmZpZy5qcwotLS0gYS9jb25maWcvcGx1
Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2Jhcl9o
b3I9Cml6b250YWwvY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25z
L2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYmFyX2hvcj0KaXpvbnRhbC9jb25maWcu
anMKQEAgLTMsNiArMyw3IEBACiByZXR1cm4gJC5leHRlbmQodHJ1ZSwge30sIGNvbmZpZywgewog
ICAgIHRpdGxlICAgICAgIDogJ0hvcml6b250YWwnLAogICAgIGNhdGVnb3J5ICAgIDogJ0JhciBk
aWFncmFtcycsCisgICAga2V5d29yZHMgICAgOiAnZGVmYXVsdCBoaWdoY2hhcnRzJywKICAgICBj
b2x1bW5zICAgICA6IHsKICAgICAgICAgeCA6IHsKICAgICAgICAgICAgIHRpdGxlICAgICAgIDog
J1ZhbHVlcyBmb3IgeC1heGlzJywKCmRpZmYgLXIgMWJlMDdkZTg2YzJhNjA2NTE4YTdjZmMyOTEz
MjMwYzI5YTcyMTBmOCAtciAyZGY0MjRmYzA1MzY4MzFlNDliMDlkND0KZDJmZmEzYTExMWZiYTEy
ODIgY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGln
aGNoPQphcnRzL2Jhcl9ob3Jpem9udGFsX3N0YWNrZWQvY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9w
bHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYmFy
X2hvcj0KaXpvbnRhbF9zdGFja2VkL2NvbmZpZy5qcworKysgYi9jb25maWcvcGx1Z2lucy92aXN1
YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2Jhcl9ob3I9Cml6b250
YWxfc3RhY2tlZC9jb25maWcuanMKQEAgLTMsNiArMyw3IEBACiByZXR1cm4gJC5leHRlbmQodHJ1
ZSwge30sIGNvbmZpZywgewogICAgIHRpdGxlICAgICAgIDogJ1N0YWNrZWQgaG9yaXpvbnRhbCcs
CiAgICAgY2F0ZWdvcnkgICAgOiAnQmFyIGRpYWdyYW1zJywKKyAgICBrZXl3b3JkcyAgICA6ICdk
ZWZhdWx0IGhpZ2hjaGFydHMnLAogICAgIHNldHRpbmdzICAgIDogewogICAgICAgICB4X2F4aXNf
dHlwZSA6IHsKICAgICAgICAgICAgIGluaXQgOiAnaGlkZScKCmRpZmYgLXIgMWJlMDdkZTg2YzJh
NjA2NTE4YTdjZmMyOTEzMjMwYzI5YTcyMTBmOCAtciAyZGY0MjRmYzA1MzY4MzFlNDliMDlkND0K
ZDJmZmEzYTExMWZiYTEyODIgY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0
YXRpYy9jaGFydHMvaGlnaGNoPQphcnRzL2Jhcl9zdGFja2VkL2NvbmZpZy5qcwotLS0gYS9jb25m
aWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRz
L2Jhcl9zdGE9CmNrZWQvY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRp
b25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYmFyX3N0YT0KY2tlZC9jb25maWcu
anMKQEAgLTMsNiArMyw3IEBACiByZXR1cm4gJC5leHRlbmQodHJ1ZSwge30sIGNvbmZpZywgewog
ICAgIHRpdGxlICAgICAgIDogJ1N0YWNrZWQnLAogICAgIGNhdGVnb3J5ICAgIDogJ0JhciBkaWFn
cmFtcycsCisgICAga2V5d29yZHMgICAgOiAnZGVmYXVsdCBoaWdoY2hhcnRzJywKICAgICBjb2x1
bW5zICAgICA6IHsKICAgICAgICAgeCA6IHsKICAgICAgICAgICAgIHRpdGxlICAgICAgIDogJ1Zh
bHVlcyBmb3IgeC1heGlzJywKCmRpZmYgLXIgMWJlMDdkZTg2YzJhNjA2NTE4YTdjZmMyOTEzMjMw
YzI5YTcyMTBmOCAtciAyZGY0MjRmYzA1MzY4MzFlNDliMDlkND0KZDJmZmEzYTExMWZiYTEyODIg
Y29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNo
PQphcnRzL2JveHBsb3QvY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRp
b25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvYm94cGxvdD0KL2NvbmZpZy5qcwor
KysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9o
aWdoY2hhcnRzL2JveHBsb3Q9Ci9jb25maWcuanMKQEAgLTMsOSArMywxMCBAQAogcmV0dXJuICQu
ZXh0ZW5kKHRydWUsIHt9LCB7CiAgICAgdGl0bGUgICAgICAgOiAnQm94IHBsb3QnLAogICAgIGNh
dGVnb3J5ICAgIDogJ0RhdGEgcHJvY2Vzc2luZyAocmVxdWlyZXMgXCdjaGFydHNcJyB0b29sIGZy
b20gVG9vbHNoZWQ9CiknLAotICAgIGxpYnJhcnkgICAgIDogJ2hpZ2hjaGFydHMuanMnLAorICAg
IGxpYnJhcnkgICAgIDogJ0hpZ2hjaGFydHMnLAogICAgIHRhZyAgICAgICAgIDogJ2RpdicsCiAg
ICAgZXhlY3V0ZSAgICAgOiAnYm94cGxvdCcsCisgICAga2V5d29yZHMgICAgOiAnZGVmYXVsdCBo
aWdoY2hhcnRzJywKICAgICBjb2x1bW5zICAgICA6IHsKICAgICAgICAgeSA6IHsKICAgICAgICAg
ICAgIHRpdGxlICAgICAgIDogJ09ic2VydmF0aW9ucycsCgpkaWZmIC1yIDFiZTA3ZGU4NmMyYTYw
NjUxOGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMxZTQ5YjA5ZDQ9CmQy
ZmZhM2ExMTFmYmExMjgyIGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0
aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9jb21tb24vY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9wbHVn
aW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9u
Lz0KY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9z
dGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uLz0KY29uZmlnLmpzCkBAIC0zLDggKzMsOSBA
QAogcmV0dXJuIHsKICAgICB0aXRsZSAgICAgICA6ICcnLAogICAgIGNhdGVnb3J5ICAgIDogJycs
Ci0gICAgbGlicmFyeSAgICAgOiAnaGlnaGNoYXJ0cycsCisgICAgbGlicmFyeSAgICAgOiAnSGln
aGNoYXJ0cycsCiAgICAgdGFnICAgICAgICAgOiAnZGl2JywKKyAgICBrZXl3b3JkcyAgICA6ICdo
aWdoY2hhcnRzJywKICAgICBzZXR0aW5ncyAgICA6IHsKICAgICAgICAgc2VwYXJhdG9yX2xhYmVs
ICA6IHsKICAgICAgICAgICAgIHRpdGxlICAgICAgIDogJ1ggYXhpcycsCkBAIC0xOTcsNyArMTk4
LDcgQEAKICAgICAgICAgbGVnZW5kX2VuYWJsZWQgOiB7CiAgICAgICAgICAgICB0aXRsZSAgICAg
ICA6ICdTaG93IGxlZ2VuZCcsCiAgICAgICAgICAgICBpbmZvICAgICAgICA6ICdXb3VsZCB5b3Ug
bGlrZSB0byBhZGQgYSBsZWdlbmQ/JywKLSAgICAgICAgICAgIHR5cGUgICAgICAgIDogJ3NlbGVj
dCcsCisgICAgICAgICAgICB0eXBlICAgICAgICA6ICdyYWRpb2J1dHRvbicsCiAgICAgICAgICAg
ICBpbml0ICAgICAgICA6ICd0cnVlJywKICAgICAgICAgICAgIGRhdGEgICAgICAgIDogWwogICAg
ICAgICAgICAgICAgIHsKCmRpZmYgLXIgMWJlMDdkZTg2YzJhNjA2NTE4YTdjZmMyOTEzMjMwYzI5
YTcyMTBmOCAtciAyZGY0MjRmYzA1MzY4MzFlNDliMDlkND0KZDJmZmEzYTExMWZiYTEyODIgY29u
ZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQph
cnRzL2NvbW1vbi9oaWdoY2hhcnRzLWNvbmZpZy5qcwotLS0gYS9jb25maWcvcGx1Z2lucy92aXN1
YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1vbi89CmhpZ2hj
aGFydHMtY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0
cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uLz0KaGlnaGNoYXJ0cy1jb25maWcuanMK
QEAgLTIsNyArMiwxNiBAQAogZGVmaW5lKFtdLCBmdW5jdGlvbigpIHsKPTIwCiAvLyB3aWRnZXQK
LXJldHVybiBmdW5jdGlvbihzZXR0aW5ncykgeworcmV0dXJuIGZ1bmN0aW9uKGNoYXJ0LCBzZXR0
aW5ncykgeworICAgIC8vIGhlbHBlciBsYWJlbCBlbmFibGVkCisgICAgdmFyIGxhYmVsRW5hYmxl
ZCA9M0QgZnVuY3Rpb24oYXhpcykgeworICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0KGF4aXMgKyAn
X3R5cGUnKSA9M0Q9M0QgJ2hpZGUnKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07
CisKICAgICAvLyBoaWdoY2hhcnRzIGNvbmZpZ3VyYXRpb24KICAgICByZXR1cm4gewogICAgICAg
ICBjaGFydDogewpAQCAtMTEsNyArMjAsNyBAQAogCSAgICB9LAogCSAgID0yMAogCSAgICB0aXRs
ZTogewotCSAgICAgICAgdGV4dCAgICAgICAgICAgICAgICAgICAgICAgIDogJycKKwkgICAgICAg
IHRleHQgICAgICAgICAgICAgICAgICAgICAgICA6IGNoYXJ0LmdldCgndGl0bGUnKQogCSAgICB9
LAogCSAgID0yMAogCSAgICBsZWdlbmQ6IHsKQEAgLTM0LDEyICs0MywyNiBAQAogICAgICAgICAg
ICAgICAgICAgICAgICAgY29sb3IgICAgICAgICAgIDogKEhpZ2hjaGFydHMudGhlbWUgJiYgSGln
aGNoYXJ0cy49CnRoZW1lLnRleHRDb2xvcikgfHwgJ2dyYXknCiAgICAgICAgICAgICAgICAgICAg
IH0KICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgbGFiZWxzOiB7CisgICAgICAgICAg
ICAgICAgZm9ybWF0dGVyICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAg
ICAgICAgICAgdmFyIGZvcm1hdCA9M0QgZDMuZm9ybWF0KHNldHRpbmdzLmdldCgneF9heGlzX3Rp
Y2snKSArPQogc2V0dGluZ3MuZ2V0KCd4X2F4aXNfdHlwZScpKTsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGZvcm1hdCh0aGlzLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAg
ICAgICAgICAgIGVuYWJsZWQgICAgICAgICAgICAgICAgIDogbGFiZWxFbmFibGVkKCd4X2F4aXMn
KQorICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHRpY2tQaXhlbEludGVydmFsICAgICAgICAg
ICA6IDEwMAogICAgICAgICB9LAogICAgICAgID0yMAogICAgICAgICB5QXhpczogewogICAgICAg
ICAgICAgdGl0bGU6IHsKICAgICAgICAgICAgICAgICB0ZXh0ICAgICAgICAgICAgICAgICAgICA6
IHNldHRpbmdzLmdldCgneV9heGlzX2xhYmVsJykKKyAgICAgICAgICAgIH0sCisgICAgICAgICAg
ICBsYWJlbHM6IHsKKyAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgICAgICAgICAgICAgICA6IGZ1
bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICB2YXIgZm9ybWF0ID0zRCBkMy5mb3JtYXQo
c2V0dGluZ3MuZ2V0KCd5X2F4aXNfdGljaycpICs9CiBzZXR0aW5ncy5nZXQoJ3lfYXhpc190eXBl
JykpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMudmFsdWUpOworICAg
ICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZW5hYmxlZCAgICAgICAgICAgICAgICAg
OiBsYWJlbEVuYWJsZWQoJ3lfYXhpcycpCiAgICAgICAgICAgICB9CiAgICAgICAgIH0sCiAgICA9
MjAKCmRpZmYgLXIgMWJlMDdkZTg2YzJhNjA2NTE4YTdjZmMyOTEzMjMwYzI5YTcyMTBmOCAtciAy
ZGY0MjRmYzA1MzY4MzFlNDliMDlkND0KZDJmZmEzYTExMWZiYTEyODIgY29uZmlnL3BsdWdpbnMv
dmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoPQphcnRzL2NvbW1vbi93
cmFwcGVyLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0
aWMvY2hhcnRzL2hpZ2hjaGFydHMvY29tbW9uLz0Kd3JhcHBlci5qcworKysgYi9jb25maWcvcGx1
Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL2NvbW1v
bi89CndyYXBwZXIuanMKQEAgLTIzLDcgKzIzLDcgQEAKICAgICBkcmF3IDogZnVuY3Rpb24ocHJv
Y2Vzc19pZCwgaGNfdHlwZSwgY2hhcnQsIHJlcXVlc3RfZGljdGlvbmFyeSwgY2FsbGJhPQpjaykK
ICAgICB7CiAgICAgICAgIC8vIGNyZWF0ZSBjb25maWd1cmF0aW9uCi0gICAgICAgIHRoaXMuaGNf
Y29uZmlnID0zRCBjb25maWdtYWtlcihjaGFydC5zZXR0aW5ncyk7CisgICAgICAgIHRoaXMuaGNf
Y29uZmlnID0zRCBjb25maWdtYWtlcihjaGFydCwgY2hhcnQuc2V0dGluZ3MpOwogICAgICAgID0y
MAogICAgICAgICAvLyByZXF1ZXN0IGRhdGEKICAgICAgICAgdmFyIHNlbGYgPTNEIHRoaXM7Cgpk
aWZmIC1yIDFiZTA3ZGU4NmMyYTYwNjUxOGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0
ZmMwNTM2ODMxZTQ5YjA5ZDQ9CmQyZmZhM2ExMTFmYmExMjgyIGNvbmZpZy9wbHVnaW5zL3Zpc3Vh
bGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9oaXN0b2dyYW0vY29u
ZmlnLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMv
Y2hhcnRzL2hpZ2hjaGFydHMvaGlzdG9ncj0KYW0vY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVn
aW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvaGlzdG9n
cj0KYW0vY29uZmlnLmpzCkBAIC00LDYgKzQsNyBAQAogICAgIHRpdGxlICAgICAgIDogJ0hpc3Rv
Z3JhbScsCiAgICAgY2F0ZWdvcnkgICAgOiAnRGF0YSBwcm9jZXNzaW5nIChyZXF1aXJlcyBcJ2No
YXJ0c1wnIHRvb2wgZnJvbSBUb29sc2hlZD0KKScsCiAgICAgZXhlY3V0ZSAgICAgOiAnaGlzdG9n
cmFtJywKKyAgICBrZXl3b3JkcyAgICA6ICdkZWZhdWx0IGhpZ2hjaGFydHMnLAogICAgIGNvbHVt
bnMgICAgIDogewogICAgICAgICB5IDogewogICAgICAgICAgICAgdGl0bGUgICAgICAgOiAnT2Jz
ZXJ2YXRpb25zJywKQEAgLTEyLDcgKzEzLDcgQEAKICAgICB9LAogICAgIHNldHRpbmdzICAgIDog
ewogICAgICAgICB4X2F4aXNfbGFiZWwgOiB7Ci0gICAgICAgICAgICBpbml0IDogJ0JyZWFrcycK
KyAgICAgICAgICAgIGluaXQgOiAnVmFsdWVzJwogICAgICAgICB9LAogICAgICAgICB5X2F4aXNf
bGFiZWwgOiB7CiAgICAgICAgICAgICBpbml0IDogJ0RlbnNpdHknCgpkaWZmIC1yIDFiZTA3ZGU4
NmMyYTYwNjUxOGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMxZTQ5YjA5
ZDQ9CmQyZmZhM2ExMTFmYmExMjgyIGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0
cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9oaXN0b2dyYW1fZGlzY3JldGUvY29uZmlnLmpz
Ci0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRz
L2hpZ2hjaGFydHMvaGlzdG9ncj0KYW1fZGlzY3JldGUvY29uZmlnLmpzCisrKyBiL2NvbmZpZy9w
bHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaGFydHMvaGlz
dG9ncj0KYW1fZGlzY3JldGUvY29uZmlnLmpzCkBAIC0xLDkgKzEsMTAgQEAKIGRlZmluZShbJ3Bs
dWdpbi9jaGFydHMvaGlnaGNoYXJ0cy9jb21tb24vY29uZmlnJ10sIGZ1bmN0aW9uKGNvbmZpZykg
ewo9MjAKIHJldHVybiAkLmV4dGVuZCh0cnVlLCB7fSwgY29uZmlnLCB7Ci0gICAgdGl0bGUgICAg
ICAgOiAnSGlzdG9ncmFtIChEaXNjcmV0ZSknLAorICAgIHRpdGxlICAgICAgIDogJ0Rpc2NyZXRl
IEhpc3RvZ3JhbScsCiAgICAgY2F0ZWdvcnkgICAgOiAnRGF0YSBwcm9jZXNzaW5nIChyZXF1aXJl
cyBcJ2NoYXJ0c1wnIHRvb2wgZnJvbSBUb29sc2hlZD0KKScsCiAgICAgZXhlY3V0ZSAgICAgOiAn
aGlzdG9ncmFtZGlzY3JldGUnLAorICAgIGtleXdvcmRzICAgIDogJ2RlZmF1bHQgaGlnaGNoYXJ0
cycsCiAgICAgY29sdW1ucyAgICAgOiB7CiAgICAgICAgIHkgOiB7CiAgICAgICAgICAgICB0aXRs
ZSAgICAgICA6ICdPYnNlcnZhdGlvbnMnLAoKZGlmZiAtciAxYmUwN2RlODZjMmE2MDY1MThhN2Nm
YzI5MTMyMzBjMjlhNzIxMGY4IC1yIDJkZjQyNGZjMDUzNjgzMWU0OWIwOWQ0PQpkMmZmYTNhMTEx
ZmJhMTI4MiBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0
cy9oaWdoY2g9CmFydHMvbGluZS9jb25maWcuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFs
aXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9saW5lL2NvPQpuZmlnLmpz
CisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRz
L2hpZ2hjaGFydHMvbGluZS9jbz0KbmZpZy5qcwpAQCAtMyw2ICszLDcgQEAKIHJldHVybiAkLmV4
dGVuZCh0cnVlLCB7fSwgY29uZmlnLCB7CiAgICAgdGl0bGUgICAgICAgOiAnTGluZScsCiAgICAg
Y2F0ZWdvcnkgICAgOiAnT3RoZXJzJywKKyAgICBrZXl3b3JkcyAgICA6ICdkZWZhdWx0IGhpZ2hj
aGFydHMnLAogICAgIGNvbHVtbnMgICAgIDogewogICAgICAgICB4IDogewogICAgICAgICAgICAg
dGl0bGUgICAgICAgOiAnVmFsdWVzIGZvciB4LWF4aXMnLAoKZGlmZiAtciAxYmUwN2RlODZjMmE2
MDY1MThhN2NmYzI5MTMyMzBjMjlhNzIxMGY4IC1yIDJkZjQyNGZjMDUzNjgzMWU0OWIwOWQ0PQpk
MmZmYTNhMTExZmJhMTI4MiBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3Rh
dGljL2NoYXJ0cy9oaWdoY2g9CmFydHMvcGllL2NvbmZpZy5qcwotLS0gYS9jb25maWcvcGx1Z2lu
cy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL3BpZS9jb249
CmZpZy5qcworKysgYi9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGlj
L2NoYXJ0cy9oaWdoY2hhcnRzL3BpZS9jb249CmZpZy5qcwpAQCAtMyw2ICszLDcgQEAKIHJldHVy
biAkLmV4dGVuZCh0cnVlLCB7fSwgY29uZmlnLCB7CiAgICAgdGl0bGUgICAgICAgOiAnUGllIGNo
YXJ0JywKICAgICBjYXRlZ29yeSAgICA6ICdBcmVhIGNoYXJ0cycsCisgICAga2V5d29yZHMgICAg
OiAnaGlnaGNoYXJ0cycsCiAgICAgdXNlX3BhbmVscyAgOiB0cnVlLAogICAgIGNvbHVtbnMgOiB7
CiAgICAgICAgIGxhYmVsIDogewoKZGlmZiAtciAxYmUwN2RlODZjMmE2MDY1MThhN2NmYzI5MTMy
MzBjMjlhNzIxMGY4IC1yIDJkZjQyNGZjMDUzNjgzMWU0OWIwOWQ0PQpkMmZmYTNhMTExZmJhMTI4
MiBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdo
Y2g9CmFydHMvc2NhdHRlci9jb25maWcuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXph
dGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvaGlnaGNoYXJ0cy9zY2F0dGVyPQovY29uZmlnLmpz
CisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRz
L2hpZ2hjaGFydHMvc2NhdHRlcj0KL2NvbmZpZy5qcwpAQCAtMyw2ICszLDcgQEAKIHJldHVybiAk
LmV4dGVuZCh0cnVlLCB7fSwgY29uZmlnLCB7CiAgICAgdGl0bGUgICAgICAgOiAnU2NhdHRlciBw
bG90JywKICAgICBjYXRlZ29yeSAgICA6ICdPdGhlcnMnLAorICAgIGtleXdvcmRzICAgIDogJ2Rl
ZmF1bHQgaGlnaGNoYXJ0cycsCiAgICAgY29sdW1ucyAgICAgOiB7CiAgICAgICAgIHggOiB7CiAg
ICAgICAgICAgICB0aXRsZSAgICAgICA6ICdWYWx1ZXMgZm9yIHgtYXhpcycsCgpkaWZmIC1yIDFi
ZTA3ZGU4NmMyYTYwNjUxOGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMx
ZTQ5YjA5ZDQ9CmQyZmZhM2ExMTFmYmExMjgyIGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25z
L2NoYXJ0cy9zdGF0aWMvY2hhcnRzL2hpZ2hjaD0KYXJ0cy9zdGFja2VkYXJlYS9jb25maWcuanMK
LS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMv
aGlnaGNoYXJ0cy9zdGFja2VkPQphcmVhL2NvbmZpZy5qcworKysgYi9jb25maWcvcGx1Z2lucy92
aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9oaWdoY2hhcnRzL3N0YWNrZWQ9CmFy
ZWEvY29uZmlnLmpzCkBAIC0zLDYgKzMsNyBAQAogcmV0dXJuICQuZXh0ZW5kKHRydWUsIHt9LCBj
b25maWcsIHsKICAgICB0aXRsZSAgICAgICA6ICdSZWd1bGFyJywKICAgICBjYXRlZ29yeSAgICA6
ICdBcmVhIGNoYXJ0cycsCisgICAga2V5d29yZHMgICAgOiAnZGVmYXVsdCBoaWdoY2hhcnRzJywK
ICAgICBjb2x1bW5zICAgICA6IHsKICAgICAgICAgeCA6IHsKICAgICAgICAgICAgIHRpdGxlICAg
ICAgIDogJ1ZhbHVlcyBmb3IgeC1heGlzJywKCmRpZmYgLXIgMWJlMDdkZTg2YzJhNjA2NTE4YTdj
ZmMyOTEzMjMwYzI5YTcyMTBmOCAtciAyZGY0MjRmYzA1MzY4MzFlNDliMDlkND0KZDJmZmEzYTEx
MWZiYTEyODIgY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFy
dHMvbnZkMy9jPQpvbW1vbi9jb25maWcuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXph
dGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvbnZkMy9jb21tb24vY29uZmlnPQouanMKKysrIGIv
Y29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvbnZkMy9j
b21tb24vY29uZmlnPQouanMKQEAgLTMsOCArMyw5IEBACiByZXR1cm4gewogICAgIHRpdGxlICAg
ICAgIDogJycsCiAgICAgY2F0ZWdvcnkgICAgOiAnJywKLSAgICBsaWJyYXJ5ICAgICA6ICdudmQz
LmpzJywKKyAgICBsaWJyYXJ5ICAgICA6ICdOVkQzJywKICAgICB0YWcgICAgICAgICA6ICdzdmcn
LAorICAgIGtleXdvcmRzICAgIDogJ252ZDMnLAogICAgIHNldHRpbmdzICAgIDogewogICAgICAg
ICBzZXBhcmF0b3JfbGFiZWwgIDogewogICAgICAgICAgICAgdGl0bGUgICAgICAgOiAnWCBheGlz
JywKCmRpZmYgLXIgMWJlMDdkZTg2YzJhNjA2NTE4YTdjZmMyOTEzMjMwYzI5YTcyMTBmOCAtciAy
ZGY0MjRmYzA1MzY4MzFlNDliMDlkND0KZDJmZmEzYTExMWZiYTEyODIgY29uZmlnL3BsdWdpbnMv
dmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvbnZkMy9oPQppc3RvZ3JhbS9jb25m
aWcuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9j
aGFydHMvbnZkMy9oaXN0b2dyYW0vY29uPQpmaWcuanMKKysrIGIvY29uZmlnL3BsdWdpbnMvdmlz
dWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvbnZkMy9oaXN0b2dyYW0vY29uPQpmaWcu
anMKQEAgLTEzLDcgKzEzLDcgQEAKICAgICB9LAogICAgIHNldHRpbmdzICAgIDogewogICAgICAg
ICB4X2F4aXNfbGFiZWwgOiB7Ci0gICAgICAgICAgICBpbml0IDogJ0JyZWFrcycKKyAgICAgICAg
ICAgIGluaXQgOiAnVmFsdWVzJwogICAgICAgICB9LAogICAgICAgICB5X2F4aXNfbGFiZWwgOiB7
CiAgICAgICAgICAgICBpbml0IDogJ0RlbnNpdHknCgpkaWZmIC1yIDFiZTA3ZGU4NmMyYTYwNjUx
OGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMxZTQ5YjA5ZDQ9CmQyZmZh
M2ExMTFmYmExMjgyIGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMv
Y2hhcnRzL252ZDMvaD0KaXN0b2dyYW1fZGlzY3JldGUvY29uZmlnLmpzCi0tLSBhL2NvbmZpZy9w
bHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL252ZDMvaGlzdG9ncmFt
X2Rpcz0KY3JldGUvY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25z
L2NoYXJ0cy9zdGF0aWMvY2hhcnRzL252ZDMvaGlzdG9ncmFtX2Rpcz0KY3JldGUvY29uZmlnLmpz
CkBAIC0xLDcgKzEsNyBAQAogZGVmaW5lKFsncGx1Z2luL2NoYXJ0cy9udmQzL2NvbW1vbi9jb25m
aWcnXSwgZnVuY3Rpb24obnZkM19jb25maWcpIHsKPTIwCiByZXR1cm4gJC5leHRlbmQodHJ1ZSwg
e30sIG52ZDNfY29uZmlnLCB7Ci0gICAgdGl0bGUgICAgICAgOiAnSGlzdG9ncmFtIChkaXNjcmV0
ZSknLAorICAgIHRpdGxlICAgICAgIDogJ0Rpc2NyZXRlIEhpc3RvZ3JhbScsCiAgICAgY2F0ZWdv
cnkgICAgOiAnRGF0YSBwcm9jZXNzaW5nIChyZXF1aXJlcyBcJ2NoYXJ0c1wnIHRvb2wgZnJvbSBU
b29sc2hlZD0KKScsCiAgICAgZXhlY3V0ZSAgICAgOiAnaGlzdG9ncmFtZGlzY3JldGUnLAogICAg
IGNvbHVtbnMgICAgIDogewoKZGlmZiAtciAxYmUwN2RlODZjMmE2MDY1MThhN2NmYzI5MTMyMzBj
MjlhNzIxMGY4IC1yIDJkZjQyNGZjMDUzNjgzMWU0OWIwOWQ0PQpkMmZmYTNhMTExZmJhMTI4MiBj
b25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL2NoYXJ0cy9udmQzL2w9
CmluZV9mb2N1cy9jb25maWcuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMv
Y2hhcnRzL3N0YXRpYy9jaGFydHMvbnZkMy9saW5lX2ZvY3VzL2NvPQpuZmlnLmpzCisrKyBiL2Nv
bmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL252ZDMvbGlu
ZV9mb2N1cy9jbz0KbmZpZy5qcwpAQCAtMyw2ICszLDcgQEAKIHJldHVybiAkLmV4dGVuZCh0cnVl
LCB7fSwgbnZkM19jb25maWcsIHsKICAgICB0aXRsZSAgICAgICA6ICdMaW5lIHdpdGggZm9jdXMn
LAogICAgIGNhdGVnb3J5ICAgIDogJ090aGVycycsCisgICAga2V5d29yZHMgICAgOiAnZGVmYXVs
dCBudmQzJywKICAgICBjb2x1bW5zICAgICA6IHsKICAgICAgICAgeSA6IHsKICAgICAgICAgICAg
IHRpdGxlICAgICAgIDogJ1ZhbHVlcyBmb3IgeS1heGlzJywKCmRpZmYgLXIgMWJlMDdkZTg2YzJh
NjA2NTE4YTdjZmMyOTEzMjMwYzI5YTcyMTBmOCAtciAyZGY0MjRmYzA1MzY4MzFlNDliMDlkND0K
ZDJmZmEzYTExMWZiYTEyODIgY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0
YXRpYy9jaGFydHMvbnZkMy9wPQppZS9jb25maWcuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlz
dWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9jaGFydHMvbnZkMy9waWUvY29uZmlnLmpzCisrKyBi
L2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL252ZDMv
cGllL2NvbmZpZy5qcwpAQCAtMyw3ICszLDkgQEAKIHJldHVybiAkLmV4dGVuZCh0cnVlLCB7fSwg
ewogICAgIHRpdGxlICAgICAgIDogJ1BpZSBjaGFydCcsCiAgICAgY2F0ZWdvcnkgICAgOiAnQXJl
YSBjaGFydHMnLAorICAgIGxpYnJhcnkgICAgIDogJ05WRDMnLAogICAgIHRhZyAgICAgICAgIDog
J3N2ZycsCisgICAga2V5d29yZHMgICAgOiAnZGVmYXVsdCBudmQzJywKICAgICB1c2VfcGFuZWxz
ICA6IHRydWUsCiAgICAgY29sdW1ucyA6IHsKICAgICAgICAgbGFiZWwgOiB7CgpkaWZmIC1yIDFi
ZTA3ZGU4NmMyYTYwNjUxOGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMx
ZTQ5YjA5ZDQ9CmQyZmZhM2ExMTFmYmExMjgyIGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25z
L2NoYXJ0cy9zdGF0aWMvY2hhcnRzL252ZDMvcz0KdGFja2VkYXJlYV9zdHJlYW0vY29uZmlnLmpz
Ci0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRz
L252ZDMvc3RhY2tlZGFyZWFfcz0KdHJlYW0vY29uZmlnLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5z
L3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvY2hhcnRzL252ZDMvc3RhY2tlZGFyZWFfcz0K
dHJlYW0vY29uZmlnLmpzCkBAIC0zLDYgKzMsNyBAQAogcmV0dXJuICQuZXh0ZW5kKHRydWUsIHt9
LCBudmQzX2NvbmZpZywgewogICAgIHRpdGxlICAgICAgIDogJ1N0cmVhbScsCiAgICAgY2F0ZWdv
cnkgICAgOiAnQXJlYSBjaGFydHMnLAorICAgIGtleXdvcmRzICAgIDogJ2RlZmF1bHQgbnZkMycs
CiAgICAgY29sdW1ucyAgICAgOiB7CiAgICAgICAgIHkgOiB7CiAgICAgICAgICAgICB0aXRsZSAg
ICAgICA6ICdWYWx1ZXMgZm9yIHktYXhpcycsCgpkaWZmIC1yIDFiZTA3ZGU4NmMyYTYwNjUxOGE3
Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMxZTQ5YjA5ZDQ9CmQyZmZhM2Ex
MTFmYmExMjgyIGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvbGli
cmFyeS9zY3JlZT0KbnNob3QuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMv
Y2hhcnRzL3N0YXRpYy9saWJyYXJ5L3NjcmVlbnNob3QuanMKKysrIGIvY29uZmlnL3BsdWdpbnMv
dmlzdWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9saWJyYXJ5L3NjcmVlbnNob3QuanMKQEAgLTMw
LDkgKzMwLDE3IEBACiAgICAgICAgICAgICAgICAgd2lkdGggICA6IHdpZHRoLAogICAgICAgICAg
ICAgICAgIGhlaWdodCAgOiBoZWlnaHQKICAgICAgICAgICAgIH0pOworICAgICAgICAgICA9MjAK
KyAgICAgICAgICAgIC8vIGhpZGUgaW5wdXQgZmllbGRzCisgICAgICAgICAgICAkc3ZnLmZpbmQo
Jy5oaWdoY2hhcnRzLWJ1dHRvbicpLmhpZGUoKTsKKyAgICAgICAgICAgPTIwCisgICAgICAgICAg
ICAvLyBjcmVhdGUgeG1sIHN0cmluZwogICAgICAgICAgICAgeG1sU3RyaW5nICs9M0Qgc2VyaWFs
aXplci5zZXJpYWxpemVUb1N0cmluZyh0aGlzKTsKKyAgICAgICAgICAgPTIwCisgICAgICAgICAg
ICAvLyBzaG93IGlucHV0IGZpZWxkcworICAgICAgICAgICAgJHN2Zy5maW5kKCcuaGlnaGNoYXJ0
cy1idXR0b24nKS5zaG93KCk7CiAgICAgICAgIH0pOwotICAgICAgICAgID0yMAorICAgICAgPTIw
CiAgICAgICAgIC8vIGRvIHRoZSBwb3N0CiAgICAgICAgIF9wb3N0KCRlbCwgc2NyZWVuc2hvdF91
cmwsIHsKICAgICAgICAgICAgIGZpbGVuYW1lICAgIDogbmFtZSB8fCAnY2hhcnQnLAoKZGlmZiAt
ciAxYmUwN2RlODZjMmE2MDY1MThhN2NmYzI5MTMyMzBjMjlhNzIxMGY4IC1yIDJkZjQyNGZjMDUz
NjgzMWU0OWIwOWQ0PQpkMmZmYTNhMTExZmJhMTI4MiBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0
aW9ucy9jaGFydHMvc3RhdGljL2xpYnJhcnkvdWktdGE9CmJsZS1mb3JtLmpzCi0tLSBhL2NvbmZp
Zy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvbGlicmFyeS91aS10YWJsZS1m
b3JtLmpzCisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMv
bGlicmFyeS91aS10YWJsZS1mb3JtLmpzCkBAIC04NSw2ICs4NSwzMSBAQAogICAgICAgICAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAvLyByYWRpb2JveCBmaWVsZAorICAgICAgICAgICAgY2FzZSAncmFkaW9idXR0
b24nIDoKKyAgICAgICAgICAgICAgICBmaWVsZCA9M0QgbmV3IFVpLlJhZGlvQnV0dG9uKHsKKyAg
ICAgICAgICAgICAgICAgICAgaWQgICAgICAgICAgOiAnZmllbGQtJyArIGlkLAorICAgICAgICAg
ICAgICAgICAgICBkYXRhICAgICAgICA6IHNldHRpbmdzX2RlZi5kYXRhLAorICAgICAgICAgICAg
ICAgICAgICB2YWx1ZSAgICAgICA6IG1vZGVsLmdldChpZCksCisgICAgICAgICAgICAgICAgICAg
IG9uY2hhbmdlICAgIDogZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IC8vIHNldCBuZXcgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldChpZCwg
dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICA9MjAKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIGZpbmQgc2VsZWN0ZWQgZGljdGlvbmFyeQorICAgICAgICAgICAgICAgICAgICAgICAg
dmFyIGRpY3QgPTNEIF8uZmluZFdoZXJlKHNldHRpbmdzX2RlZi5kYXRhLCB7dmFsdWU9CjogdmFs
dWV9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWN0KSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBkaWN0LnNob3cpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9M0QgZGljdC5zaG93W2ldOworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLmdldCh0YXJnZXQpLnNob3coKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Zm9yICh2YXIgaSBpbiBkaWN0LmhpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdmFyIHRhcmdldCA9M0QgZGljdC5oaWRlW2ldOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzZWxmLnRhYmxlLmdldCh0YXJnZXQpLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAg
ICAgICAgIC8vIHNlbGVjdCBmaWVsZAogICAgICAgICAgICAgY2FzZSAnc2VsZWN0JyA6CiAgICAg
ICAgICAgICAgICAgZmllbGQgPTNEIG5ldyBVaS5TZWxlY3QuVmlldyh7CgpkaWZmIC1yIDFiZTA3
ZGU4NmMyYTYwNjUxOGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMxZTQ5
YjA5ZDQ9CmQyZmZhM2ExMTFmYmExMjgyIGNvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2No
YXJ0cy9zdGF0aWMvbGlicmFyeS91aS5qcwotLS0gYS9jb25maWcvcGx1Z2lucy92aXN1YWxpemF0
aW9ucy9jaGFydHMvc3RhdGljL2xpYnJhcnkvdWkuanMKKysrIGIvY29uZmlnL3BsdWdpbnMvdmlz
dWFsaXphdGlvbnMvY2hhcnRzL3N0YXRpYy9saWJyYXJ5L3VpLmpzCkBAIC01NzYsMTEgKzU3Niwx
MCBAQAogICAgIC8vIG9wdGlvbnMKICAgICBvcHRpb25zRGVmYXVsdDogewogICAgICAgICB2YWx1
ZSAgICAgICAgICAgOiAnJywKLSAgICAgICAgdHlwZSAgICAgICAgICAgIDogJ3RleHQnLAotICAg
ICAgICBwbGFjZWhvbGRlciAgICAgOiAnJywKLSAgICAgICAgZGlzYWJsZWQgICAgICAgIDogZmFs
c2UsCiAgICAgICAgIHZpc2libGUgICAgICAgICA6IHRydWUsCi0gICAgICAgIGNscyAgICAgICAg
ICAgICA6ICdmb3JtLWNvbnRyb2wnCisgICAgICAgIGNscyAgICAgICAgICAgICA6ICcnLAorICAg
ICAgICBkYXRhICAgICAgICAgICAgOiBbXSwKKyAgICAgICAgaWQgICAgICAgICAgICAgIDogVXRp
bHMudXVpZCgpCiAgICAgfSwKICAgID0yMAogICAgIC8vIGluaXRpYWxpemUKQEAgLTU5MSwzNiAr
NTkwLDY5IEBACiAgICAgICAgIC8vIGNyZWF0ZSBuZXcgZWxlbWVudAogICAgICAgICB0aGlzLnNl
dEVsZW1lbnQodGhpcy5fdGVtcGxhdGUodGhpcy5vcHRpb25zKSk7CiAgICAgICAgPTIwCi0gICAg
ICAgIC8vIGRpc2FibGUgaW5wdXQgZmllbGQKLSAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNh
YmxlZCkgewotICAgICAgICAgICAgdGhpcy4kZWwucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKLSAg
ICAgICAgfQotICAgICAgID0yMAogICAgICAgICAvLyBoaWRlIGlucHV0IGZpZWxkCiAgICAgICAg
IGlmICghdGhpcy5vcHRpb25zLnZpc2libGUpIHsKICAgICAgICAgICAgIHRoaXMuJGVsLmhpZGUo
KTsKICAgICAgICAgfQogICAgICAgID0yMAorICAgICAgICAvLyBzZXQgaW5pdGlhbCB2YWx1ZQor
ICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVl
KHRoaXMub3B0aW9ucy52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICA9MjAKKyAgICAgICAgLy8g
Y3VycmVudCB2YWx1ZQorICAgICAgICB0aGlzLmN1cnJlbnQgPTNEIHRoaXMub3B0aW9ucy52YWx1
ZTsKKyAgICAgICA9MjAKICAgICAgICAgLy8gb25jaGFuZ2UgZXZlbnQgaGFuZGxlci4gZmlyZXMg
b24gdXNlciBhY3Rpdml0eS4KICAgICAgICAgdmFyIHNlbGYgPTNEIHRoaXM7Ci0gICAgICAgIHRo
aXMuJGVsLm9uKCdpbnB1dCcsIGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgaWYgKHNlbGYub3B0
aW9ucy5vbmNoYW5nZSkgewotICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5vbmNoYW5nZShz
ZWxmLiRlbC52YWwoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHRoaXMuJGVsLmZpbmQoJ2lu
cHV0Jykub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyAgICAgICA9MjAKKyAgICAgICAgICAgIHNl
bGYudmFsdWUoc2VsZi5fZ2V0VmFsdWUoKSk7CiAgICAgICAgIH0pOwogICAgIH0sCiAgICA9MjAK
ICAgICAvLyB2YWx1ZQogICAgIHZhbHVlIDogZnVuY3Rpb24gKG5ld192YWwpIHsKKyAgICAgICAg
Ly8gZ2V0IGN1cnJlbnQgdmFsdWUKKyAgICAgICAgdmFyIGJlZm9yZSA9M0QgdGhpcy5jdXJyZW50
OworICAgICAgID0yMAorICAgICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgICAgIGlmIChuZXdf
dmFsICE9M0Q9M0QgdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgICB0aGlzLiRlbC52YWwobmV3X3Zh
bCk7CisgICAgICAgICAgICB0aGlzLiRlbC5maW5kKCdsYWJlbCcpLnJlbW92ZUNsYXNzKCdhY3Rp
dmUnKTsKKyAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJ1t2YWx1ZT0zRCInICsgbmV3X3ZhbCAr
ICciXScpLmNsb3Nlc3QoJ2xhYmVsJykuPQphZGRDbGFzcygnYWN0aXZlJyk7CisgICAgICAgICAg
ICB0aGlzLmN1cnJlbnQgPTNEIG5ld192YWw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRo
aXMuJGVsLnZhbCgpOworCisgICAgICAgIC8vIGNoZWNrIHZhbHVlCisgICAgICAgIHZhciBhZnRl
ciA9M0QgdGhpcy5jdXJyZW50OworICAgICAgICBpZiAoYWZ0ZXIgIT0zRCBiZWZvcmUgJiYgdGhp
cy5vcHRpb25zLm9uY2hhbmdlKSB7CisgICAgICAgICAgICB0aGlzLm9wdGlvbnMub25jaGFuZ2Uo
dGhpcy5jdXJyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCBhbmQgcmV0dXJuIHZh
bHVlCisgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7CisgICAgfSwKKyAgID0yMAorICAgIC8v
IGdldCB2YWx1ZQorICAgIF9nZXRWYWx1ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBzZWxl
Y3RlZCA9M0QgdGhpcy4kZWwuZmluZCgnOmNoZWNrZWQnKTsKKyAgICAgICAgdmFyIHZhbHVlID0z
RCBudWxsOworICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMCkgeworICAgICAgICAgICAg
dmFsdWUgPTNEIHNlbGVjdGVkLnZhbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1
ZTsKICAgICB9LAogICAgPTIwCiAgICAgLy8gZWxlbWVudAogICAgIF90ZW1wbGF0ZTogZnVuY3Rp
b24ob3B0aW9ucykgewotICAgICAgICByZXR1cm4gJzxpbnB1dCBpZD0zRCInICsgb3B0aW9ucy5p
ZCArICciIHR5cGU9M0QiJyArIG9wdGlvbnMudHlwZSA9CisgJyIgdmFsdWU9M0QiJyArIG9wdGlv
bnMudmFsdWUgKyAnIiBwbGFjZWhvbGRlcj0zRCInICsgb3B0aW9ucy5wbGFjZWhvbGRlcj0KICsg
JyIgY2xhc3M9M0QidWktaW5wdXQgJyArIG9wdGlvbnMuY2xzICsgJyI+JzsKKyAgICAgICAgdmFy
IHRtcGwgPTNEICAnPGRpdiBjbGFzcz0zRCJidG4tZ3JvdXAgdWktcmFkaW9idXR0b24iIGRhdGEt
dG9nZ2xlPQo9M0QiYnV0dG9ucyI+JzsKKyAgICAgICAgZm9yIChrZXkgaW4gb3B0aW9ucy5kYXRh
KSB7CisgICAgICAgICAgICB2YXIgcGFpciA9M0Qgb3B0aW9ucy5kYXRhW2tleV07CisgICAgICAg
ICAgICB0bXBsICs9M0QgICAgICc8bGFiZWwgY2xhc3M9M0QiYnRuIGJ0bi1kZWZhdWx0Ij4nICsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9M0QicmFkaW8iIG5hbWU9
M0QiJyArIG9wdGlvbnMuaWQgPQorICciIHZhbHVlPTNEIicgKyBwYWlyLnZhbHVlICsgJyIgc2Vs
ZWN0ZWQ+JyArIHBhaXIubGFiZWwgKworICAgICAgICAgICAgICAgICAgICAgICAgJzwvbGFiZWw+
JzsKKyAgICAgICAgfQorICAgICAgICB0bXBsICs9M0QgICAgICc8L2Rpdj4nOworICAgICAgICBy
ZXR1cm4gdG1wbDsKICAgICB9CiB9KTsKPTIwCkBAIC02MzgsNiArNjcwLDcgQEAKICAgICBCdXR0
b25NZW51IDogQnV0dG9uTWVudSwKICAgICBNb2RhbDogTW9kYWwsCiAgICAgVGV4dGFyZWE6IFRl
eHRhcmVhLAotICAgIEltYWdlOiBJbWFnZQorICAgIEltYWdlOiBJbWFnZSwKKyAgICBSYWRpb0J1
dHRvbjogUmFkaW9CdXR0b24KIH0KIH0pOwoKZGlmZiAtciAxYmUwN2RlODZjMmE2MDY1MThhN2Nm
YzI5MTMyMzBjMjlhNzIxMGY4IC1yIDJkZjQyNGZjMDUzNjgzMWU0OWIwOWQ0PQpkMmZmYTNhMTEx
ZmJhMTI4MiBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL3BsdWdp
bnMvaGlnaGM9CmhhcnRzL2hpZ2hjaGFydHMuanMKLS0tIGEvY29uZmlnL3BsdWdpbnMvdmlzdWFs
aXphdGlvbnMvY2hhcnRzL3N0YXRpYy9wbHVnaW5zL2hpZ2hjaGFydHMvaGlnaGNoPQphcnRzLmpz
CisrKyBiL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9zdGF0aWMvcGx1Z2lu
cy9oaWdoY2hhcnRzL2hpZ2hjaD0KYXJ0cy5qcwpAQCAtMjgsNyArMjgsNyBAQAogMTBdLGJhY2tn
cm91bmRDb2xvcjoiI0ZGRkZGRiIscGxvdEJvcmRlckNvbG9yOiIjQzBDMEMwIixyZXNldFpvb21C
dXR0b246e3Q9CmhlbWU6e3pJbmRleDoyMH0scG9zaXRpb246e2FsaWduOiJyaWdodCIseDotMTAs
eToxMH19fSx0aXRsZTp7dGV4dDoiQ2hhcnQgdD0KaXRsZSIsYWxpZ246ImNlbnRlciIsbWFyZ2lu
OjE1LHN0eWxlOntjb2xvcjoiIzMzMzMzMyIsZm9udFNpemU6IjE4cHgifX0sc3ViPQp0aXRsZTp7
dGV4dDoiIixhbGlnbjoiY2VudGVyIixzdHlsZTp7Y29sb3I6IiM1NTU1NTUifX0scGxvdE9wdGlv
bnM6e2xpbmU6e2E9Cmxsb3dQb2ludFNlbGVjdDohMSxzaG93Q2hlY2tib3g6ITEsYW5pbWF0aW9u
OntkdXJhdGlvbjoxRTN9LGV2ZW50czp7fSxsaW5lVz0KaWR0aDoyLG1hcmtlcjp7bGluZVdpZHRo
OjAscmFkaXVzOjQsbGluZUNvbG9yOiIjRkZGRkZGIixzdGF0ZXM6e2hvdmVyOntlbmFiPQpsZWQ6
ITB9LHNlbGVjdDp7ZmlsbENvbG9yOiIjRkZGRkZGIixsaW5lQ29sb3I6IiMwMDAwMDAiLAogbGlu
ZVdpZHRoOjJ9fX0scG9pbnQ6e2V2ZW50czp7fX0sZGF0YUxhYmVsczp3KE4se2FsaWduOiJjZW50
ZXIiLGVuYWJsZWQ6ITE9Cixmb3JtYXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55PTNEPTNE
PTNEbnVsbD8iIjpHYSh0aGlzLnksLTEpfSx2ZXJ0aWNhbD0KQWxpZ246ImJvdHRvbSIseTowfSks
Y3JvcFRocmVzaG9sZDozMDAscG9pbnRSYW5nZTowLHN0YXRlczp7aG92ZXI6e21hcmtlcjp7PQp9
LGhhbG86e3NpemU6MTAsb3BhY2l0eTowLjI1fX0sc2VsZWN0OnttYXJrZXI6e319fSxzdGlja3lU
cmFja2luZzohMCx0dXJib1Q9CmhyZXNob2xkOjFFM319LGxhYmVsczp7c3R5bGU6e3Bvc2l0aW9u
OiJhYnNvbHV0ZSIsY29sb3I6IiMzRTU3NkYifX0sbGVnZW5kOj0Ke2VuYWJsZWQ6ITAsYWxpZ246
ImNlbnRlciIsbGF5b3V0OiJob3Jpem9udGFsIixsYWJlbEZvcm1hdHRlcjpmdW5jdGlvbigpe3Jl
PQp0dXJuIHRoaXMubmFtZX0sYm9yZGVyQ29sb3I6IiM5MDkwOTAiLGJvcmRlclJhZGl1czowLG5h
dmlnYXRpb246e2FjdGl2ZUNvbG89CnI6IiMyNzRiNmQiLAogaW5hY3RpdmVDb2xvcjoiI0NDQyJ9
LHNoYWRvdzohMSxpdGVtU3R5bGU6e2NvbG9yOiIjMzMzMzMzIixmb250U2l6ZToiMTJweCI9Cixm
b250V2VpZ2h0OiJib2xkIn0saXRlbUhvdmVyU3R5bGU6e2NvbG9yOiIjMDAwIn0saXRlbUhpZGRl
blN0eWxlOntjb2xvcjoiIz0KQ0NDIn0saXRlbUNoZWNrYm94U3R5bGU6e3Bvc2l0aW9uOiJhYnNv
bHV0ZSIsd2lkdGg6IjEzcHgiLGhlaWdodDoiMTNweCJ9LHN5PQptYm9sUGFkZGluZzo1LHZlcnRp
Y2FsQWxpZ246ImJvdHRvbSIseDowLHk6MCx0aXRsZTp7c3R5bGU6e2ZvbnRXZWlnaHQ6ImJvbGQ9
CiJ9fX0sbG9hZGluZzp7bGFiZWxTdHlsZTp7Zm9udFdlaWdodDoiYm9sZCIscG9zaXRpb246InJl
bGF0aXZlIix0b3A6IjFlbSJ9LD0Kc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsYmFja2dyb3Vu
ZENvbG9yOiJ3aGl0ZSIsb3BhY2l0eTowLjUsdGV4dEFsaWduOiJjPQplbnRlciJ9fSx0b29sdGlw
OntlbmFibGVkOiEwLGFuaW1hdGlvbjphYSxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMjQ5LCAyNDks
IDI9CjQ5LCAuODUpIiwKLWJvcmRlcldpZHRoOjEsYm9yZGVyUmFkaXVzOjMsZGF0ZVRpbWVMYWJl
bEZvcm1hdHM6e21pbGxpc2Vjb25kOiIlQSwgJWIgJWUsPQogJUg6JU06JVMuJUwiLHNlY29uZDoi
JUEsICViICVlLCAlSDolTTolUyIsbWludXRlOiIlQSwgJWIgJWUsICVIOiVNIixob3VyOiI9CiVB
LCAlYiAlZSwgJUg6JU0iLGRheToiJUEsICViICVlLCAlWSIsd2VlazoiV2VlayBmcm9tICVBLCAl
YiAlZSwgJVkiLG1vbnRoOj0KIiVCICVZIix5ZWFyOiIlWSJ9LGhlYWRlckZvcm1hdDonPHNwYW4g
c3R5bGU9M0QiZm9udC1zaXplOiAxMHB4Ij57cG9pbnQua2V5PQp9PC9zcGFuPjxici8+Jyxwb2lu
dEZvcm1hdDonPHNwYW4gc3R5bGU9M0QiY29sb3I6e3Nlcmllcy5jb2xvcn0iPj1FMj05Nz04Rjw9
Ci9zcGFuPiB7c2VyaWVzLm5hbWV9OiA8Yj57cG9pbnQueX08L2I+PGJyLz4nLHNoYWRvdzohMCxz
bmFwOkpiPzI1OjEwLHN0eWxlOj0Ke2NvbG9yOiIjMzMzMzMzIixjdXJzb3I6ImRlZmF1bHQiLGZv
bnRTaXplOiIxMnB4IixwYWRkaW5nOiI4cHgiLAorYm9yZGVyV2lkdGg6MSxib3JkZXJSYWRpdXM6
MyxkYXRlVGltZUxhYmVsRm9ybWF0czp7bWlsbGlzZWNvbmQ6IiVBLCAlYiAlZSw9CiAlSDolTTol
Uy4lTCIsc2Vjb25kOiIlQSwgJWIgJWUsICVIOiVNOiVTIixtaW51dGU6IiVBLCAlYiAlZSwgJUg6
JU0iLGhvdXI6Ij0KJUEsICViICVlLCAlSDolTSIsZGF5OiIlQSwgJWIgJWUsICVZIix3ZWVrOiJX
ZWVrIGZyb20gJUEsICViICVlLCAlWSIsbW9udGg6PQoiJUIgJVkiLHllYXI6IiVZIn0saGVhZGVy
Rm9ybWF0Oic8c3BhbiBzdHlsZT0zRCJmb250LXNpemU6IDEwcHgiPntwb2ludC5rZXk9Cn08L3Nw
YW4+PGJyLz4nLHBvaW50Rm9ybWF0Oic8c3BhbiBzdHlsZT0zRCJjb2xvcjp7c2VyaWVzLmNvbG9y
fSI+PUMzPUEyPUUyPQo9ODA9OTQ9QzI9OEY8L3NwYW4+IHtzZXJpZXMubmFtZX06IDxiPntwb2lu
dC55fTwvYj48YnIvPicsc2hhZG93OiEwLHNuYXA6SmI9Cj8yNToxMCxzdHlsZTp7Y29sb3I6IiMz
MzMzMzMiLGN1cnNvcjoiZGVmYXVsdCIsZm9udFNpemU6IjEycHgiLHBhZGRpbmc6IjhweD0KIiwK
IHdoaXRlU3BhY2U6Im5vd3JhcCJ9fSxjcmVkaXRzOntlbmFibGVkOiEwLHRleHQ6IkhpZ2hjaGFy
dHMuY29tIixocmVmOiJodHRwPQo6Ly93d3cuaGlnaGNoYXJ0cy5jb20iLHBvc2l0aW9uOnthbGln
bjoicmlnaHQiLHg6LTEwLHZlcnRpY2FsQWxpZ246ImJvdHRvbSI9Cix5Oi01fSxzdHlsZTp7Y3Vy
c29yOiJwb2ludGVyIixjb2xvcjoiIzkwOTA5MCIsZm9udFNpemU6IjlweCJ9fX07dmFyIGJhPTNE
RT0KLnBsb3RPcHRpb25zLFM9M0RiYS5saW5lO0NiKCk7dmFyIFRiPTNEL3JnYmFcKFxzKihbMC05
XXsxLDN9KVxzKixccyooWzAtOV17PQoxLDN9KVxzKixccyooWzAtOV17MSwzfSlccyosXHMqKFsw
LTldPyg/OlwuWzAtOV0rKT8pXHMqXCkvLFViPTNELyMoW2EtZkEtRjA9Ci05XXsyfSkoW2EtZkEt
RjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KS8sVmI9M0QvcmdiXChccyooWzAtOV17MSwzfSlccyos
XHMqKD0KWzAtOV17MSwzfSlccyosXHMqKFswLTldezEsM30pXHMqXCkvLHlhPTNEZnVuY3Rpb24o
YSl7dmFyIGI9M0RbXSxjLAogZDsoZnVuY3Rpb24oYSl7YSYmYS5zdG9wcz9kPTNEVWEoYS5zdG9w
cyxmdW5jdGlvbihhKXtyZXR1cm4geWEoYVsxXSl9KTooYz0KPTNEVGIuZXhlYyhhKSk/Yj0zRFt6
KGNbMV0pLHooY1syXSkseihjWzNdKSxwYXJzZUZsb2F0KGNbNF0sMTApXTooYz0zRFViLmV4PQpl
YyhhKSk/Yj0zRFt6KGNbMV0sMTYpLHooY1syXSwxNikseihjWzNdLDE2KSwxXTooYz0zRFZiLmV4
ZWMoYSkpJiYoYj0zRFt6KGM9ClsxXSkseihjWzJdKSx6KGNbM10pLDFdKX0pKGEpO3JldHVybntn
ZXQ6ZnVuY3Rpb24oYyl7dmFyIGY7ZD8oZj0zRHcoYSksZi5zdD0Kb3BzPTNEW10uY29uY2F0KGYu
c3RvcHMpLHAoZCxmdW5jdGlvbihhLGIpe2Yuc3RvcHNbYl09M0RbZi5zdG9wc1tiXVswXSxhLmdl
PQp0KGMpXX0pKTpmPTNEYiYmIWlzTmFOKGJbMF0pP2M9M0Q9M0Q9M0QicmdiIj8icmdiKCIrYlsw
XSsiLCIrYlsxXSsiLCIrYlsyXSs9CiIpIjpjPTNEPTNEPTNEImEiP2JbM106InJnYmEoIitiLmpv
aW4oIiwiKSsiKSI6YTtyZXR1cm4gZn0sYnJpZ2h0ZW46ZnVuY3Rpbz0KbihhKXtpZihkKXAoZCwK
IGZ1bmN0aW9uKGIpe2IuYnJpZ2h0ZW4oYSl9KTtlbHNlIGlmKGhhKGEpJiZhIT0zRD0zRDApe3Zh
ciBjO2ZvcihjPTNEMDtjPDM7PQpjKyspYltjXSs9M0R6KGEqMjU1KSxiW2NdPDAmJihiW2NdPTNE
MCksYltjXT4yNTUmJihiW2NdPTNEMjU1KX1yZXR1cm4gdGhpc309CixyZ2JhOmIsc2V0T3BhY2l0
eTpmdW5jdGlvbihhKXtiWzNdPTNEYTtyZXR1cm4gdGhpc319fTtQLnByb3RvdHlwZT0zRHtpbml0
Oj0KZnVuY3Rpb24oYSxiKXt0aGlzLmVsZW1lbnQ9M0RiPTNEPTNEPTNEInNwYW4iP1koYik6eS5j
cmVhdGVFbGVtZW50TlMoeGEsYik7PQp0aGlzLnJlbmRlcmVyPTNEYX0sb3BhY2l0eToxLGFuaW1h
dGU6ZnVuY3Rpb24oYSxiLGMpe2I9M0RtKGIsdmEsITApO2JiKHRoaXM9Cik7aWYoYil7Yj0zRHco
Yix7fSk7aWYoYyliLmNvbXBsZXRlPTNEYztrYih0aGlzLGEsYil9ZWxzZSB0aGlzLmF0dHIoYSks
YyYmYz0KKCl9LGNvbG9yR3JhZGllbnQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTNEdGhpcy5yZW5k
ZXJlcixlLGYsZyxoLGksaixrLGwsbyxuPQoscz0zRFtdO2EubGluZWFyR3JhZGllbnQ/CkBAIC0y
NjUsNyArMjY1LDcgQEAKIDApOmEuY29sdW1uSW5kZXgpfHwwKSprLWMvMikqKGU/LTE6MSl9fSx0
cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYT0zRHRoaXMsPQpiPTNEYS5jaGFydCxjPTNEYS5vcHRp
b25zLGQ9M0RhLmJvcmRlcldpZHRoPTNEbShjLmJvcmRlcldpZHRoLGEuYWN0aXZlUG9pbnQ9CkNv
dW50PjAuNSphLnhBeGlzLmxlbj8wOjEpLGU9M0RhLnlBeGlzLGY9M0RhLnRyYW5zbGF0ZWRUaHJl
c2hvbGQ9M0RlLmdldFRocj0KZXNob2xkKGMudGhyZXNob2xkKSxnPTNEbShjLm1pblBvaW50TGVu
Z3RoLDUpLGM9M0RhLmdldENvbHVtbk1ldHJpY3MoKSxoPTNEPQpjLndpZHRoLGk9M0RhLmJhclc9
M0RLYSh2KGgsMSsyKmQpKSxqPTNEYS5wb2ludFhPZmZzZXQ9M0RjLm9mZnNldCxrPTNELShkJTI9
Cj8wLjU6MCksbD0zRGQlMj8wLjU6MTtiLnJlbmRlcmVyLmlzVk1MJiZiLmludmVydGVkJiYobCs9
M0QxKTtPLnByb3RvdHlwZS50cj0KYW5zbGF0ZS5hcHBseShhKTtwKGEucG9pbnRzLGZ1bmN0aW9u
KGMpe3ZhciBkPTNEbShjLnlCb3R0b20sZikscD0zREModigtOTk5PQotZCxjLnBsb3RZKSxlLmxl
bisKIDk5OStkKSxxPTNEYy5wbG90WCtqLHI9M0RpLHQ9M0RDKHAsZCkseDt4PTNEdihwLGQpLXQ7
TSh4KTxnJiZnJiYoeD0zRGcsdD0KPTNEdShNKHQtZik+Zz9kLWc6Zi0oZS50cmFuc2xhdGUoYy55
LDAsMSwwLDEpPD0zRGY/ZzowKSkpO2MuYmFyWD0zRHE7Yy5wb2luPQp0V2lkdGg9M0RoO2MudG9v
bHRpcFBvcz0zRGIuaW52ZXJ0ZWQ/W2UubGVuLXAsYS54QXhpcy5sZW4tcS1yLzJdOltxK3IvMixw
XTs9CmQ9M0RNKHEpPDAuNTtyPTNEdShxK3IpK2s7cT0zRHUocSkraztyLT0zRHE7cD0zRE0odCk8
MC41O3g9M0R1KHQreCkrbDt0PTNEdT0KKHQpK2w7eC09M0R0O2QmJihxKz0zRDEsci09M0QxKTtw
JiYodC09M0QxLHgrPTNEMSk7Yy5zaGFwZVR5cGU9M0QicmVjdCI7Yy5zPQpoYXBlQXJncz0zRHt4
OnEseTp0LHdpZHRoOnIsaGVpZ2h0Onh9fSl9LGdldFN5bWJvbDpzYSxkcmF3TGVnZW5kU3ltYm9s
Ok4uZHI9CmF3UmVjdGFuZ2xlLGRyYXdHcmFwaDpzYSxkcmF3UG9pbnRzOmZ1bmN0aW9uKCl7dmFy
IGE9M0R0aGlzLGI9M0R0aGlzLmNoYXJ0LD0KYz0zRGEub3B0aW9ucyxkPTNEYi5yZW5kZXJlcixl
PTNEYy5hbmltYXRpb25MaW1pdHx8CiAyNTAsZixnLGg7cChhLnBvaW50cyxmdW5jdGlvbihpKXt2
YXIgaj0zRGkucGxvdFksaz0zRGkuZ3JhcGhpYztpZihqIT0zRD0zRD0KdCYmIWlzTmFOKGopJiZp
LnkhPTNEPTNEbnVsbClmPTNEaS5zaGFwZUFyZ3MsaD0zRHIoYS5ib3JkZXJXaWR0aCk/eyJzdHJv
a2UtPQp3aWR0aCI6YS5ib3JkZXJXaWR0aH06e30sZz0zRGkucG9pbnRBdHRyW2kuc2VsZWN0ZWQ/
InNlbGVjdCI6IiJdfHxhLnBvaW50QXQ9CnRyWyIiXSxrPyhiYihrKSxrLmF0dHIoaClbYi5wb2lu
dENvdW50PGU/ImFuaW1hdGUiOiJhdHRyIl0odyhmKSkpOmkuZ3JhcGhpYz0KPTNEZFtpLnNoYXBl
VHlwZV0oZikuYXR0cihnKS5hdHRyKGgpLmFkZChhLmdyb3VwKS5zaGFkb3coYy5zaGFkb3csbnVs
bCxjLnN0PQphY2tpbmcmJiFjLmJvcmRlclJhZGl1cyk7ZWxzZSBpZihrKWkuZ3JhcGhpYz0zRGsu
ZGVzdHJveSgpfSl9LGFuaW1hdGU6ZnVuY3Q9CmlvbihhKXt2YXIgYj0zRHRoaXMueUF4aXMsYz0z
RHRoaXMub3B0aW9ucyxkPTNEdGhpcy5jaGFydC5pbnZlcnRlZCxlPTNEe307aT0KZihhYSlhPwot
KGUuc2NhbGVZPTNEMC4wMDEsYT0zREMoYi5wb3MrYi5sZW4sdihiLnBvcyxiLnRvUGl4ZWxzKGMu
dGhyZXNob2xkKSkpLGQ/ZS49CnRyYW5zbGF0ZVg9M0RhLWIubGVuOmUudHJhbnNsYXRlWT0zRGEs
dGhpcy5ncm91cC5hdHRyKGUpKTooZS5zY2FsZVk9M0QxLGVbZD0KPyJ0cmFuc2xhdGVYIjoidHJh
bnNsYXRlWSJdPTNEYi5wb3MsdGhpcy5ncm91cC5hbmltYXRlKGUsdGhpcy5vcHRpb25zLmFuaW1h
PQp0aW9uKSx0aGlzLmFuaW1hdGU9M0RudWxsKX0scmVtb3ZlOmZ1bmN0aW9uKCl7dmFyIGE9M0R0
aGlzLGI9M0RhLmNoYXJ0O2IuaGE9CnNSZW5kZXJlZCYmcChiLnNlcmllcyxmdW5jdGlvbihiKXtp
ZihiLnR5cGU9M0Q9M0Q9M0RhLnR5cGUpYi5pc0RpcnR5PTNEITB9KT0KO08ucHJvdG90eXBlLnJl
bW92ZS5hcHBseShhLGFyZ3VtZW50cyl9fSk7Ri5jb2x1bW49M0RnYTtiYS5iYXI9M0R3KGJhLmNv
bHVtPQpuKTtwYT0zRGthKGdhLHt0eXBlOiJiYXIiLGludmVydGVkOiEwfSk7Ri5iYXI9M0RwYTti
YS5zY2F0dGVyPTNEdyhTLHtsaW5lV2k9CmR0aDowLHRvb2x0aXA6e2hlYWRlckZvcm1hdDonPHNw
YW4gc3R5bGU9M0QiY29sb3I6e3Nlcmllcy5jb2xvcn0iPj1FMj05Nz04Rj0KPC9zcGFuPjxzcGFu
IHN0eWxlPTNEImZvbnQtc2l6ZTogMTBweDsiPiB7c2VyaWVzLm5hbWV9PC9zcGFuPjxici8+JywK
KyhlLnNjYWxlWT0zRDAuMDAxLGE9M0RDKGIucG9zK2IubGVuLHYoYi5wb3MsYi50b1BpeGVscyhj
LnRocmVzaG9sZCkpKSxkP2UuPQp0cmFuc2xhdGVYPTNEYS1iLmxlbjplLnRyYW5zbGF0ZVk9M0Rh
LHRoaXMuZ3JvdXAuYXR0cihlKSk6KGUuc2NhbGVZPTNEMSxlW2Q9Cj8idHJhbnNsYXRlWCI6InRy
YW5zbGF0ZVkiXT0zRGIucG9zLHRoaXMuZ3JvdXAuYW5pbWF0ZShlLHRoaXMub3B0aW9ucy5hbmlt
YT0KdGlvbiksdGhpcy5hbmltYXRlPTNEbnVsbCl9LHJlbW92ZTpmdW5jdGlvbigpe3ZhciBhPTNE
dGhpcyxiPTNEYS5jaGFydDtiLmhhPQpzUmVuZGVyZWQmJnAoYi5zZXJpZXMsZnVuY3Rpb24oYil7
aWYoYi50eXBlPTNEPTNEPTNEYS50eXBlKWIuaXNEaXJ0eT0zRCEwfSk9CjtPLnByb3RvdHlwZS5y
ZW1vdmUuYXBwbHkoYSxhcmd1bWVudHMpfX0pO0YuY29sdW1uPTNEZ2E7YmEuYmFyPTNEdyhiYS5j
b2x1bT0Kbik7cGE9M0RrYShnYSx7dHlwZToiYmFyIixpbnZlcnRlZDohMH0pO0YuYmFyPTNEcGE7
YmEuc2NhdHRlcj0zRHcoUyx7bGluZVdpPQpkdGg6MCx0b29sdGlwOntoZWFkZXJGb3JtYXQ6Jzxz
cGFuIHN0eWxlPTNEImNvbG9yOntzZXJpZXMuY29sb3J9Ij49QzM9QTI9RTI9Cj04MD05ND1DMj04
Rjwvc3Bhbj48c3BhbiBzdHlsZT0zRCJmb250LXNpemU6IDEwcHg7Ij4ge3Nlcmllcy5uYW1lfTwv
c3Bhbj48Yj0Kci8+JywKIHBvaW50Rm9ybWF0OiJ4OiA8Yj57cG9pbnQueH08L2I+PGJyLz55OiA8
Yj57cG9pbnQueX08L2I+PGJyLz4ifSxzdGlja3lUcmFjPQpraW5nOiExfSk7cGE9M0RrYShPLHt0
eXBlOiJzY2F0dGVyIixzb3J0ZWQ6ITEscmVxdWlyZVNvcnRpbmc6ITEsbm9TaGFyZWRUb289Cmx0
aXA6ITAsdHJhY2tlckdyb3VwczpbIm1hcmtlckdyb3VwIl0sdGFrZU9yZGluYWxQb3NpdGlvbjoh
MSxzaW5ndWxhclRvb2x0aT0KcHM6ITAsZHJhd0dyYXBoOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25z
LmxpbmVXaWR0aCYmTy5wcm90b3R5cGUuZHJhd0dyYXBoLmNhPQpsbCh0aGlzKX19KTtGLnNjYXR0
ZXI9M0RwYTtiYS5waWU9M0R3KFMse2JvcmRlckNvbG9yOiIjRkZGRkZGIixib3JkZXJXaWR0aDo9
CjEsY2VudGVyOltudWxsLG51bGxdLGNsaXA6ITEsY29sb3JCeVBvaW50OiEwLGRhdGFMYWJlbHM6
e2Rpc3RhbmNlOjMwLGVuYWJsZT0KZDohMCxmb3JtYXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
cy5wb2ludC5uYW1lfX0saWdub3JlSGlkZGVuUG9pbnQ6ITAsCiBsZWdlbmRUeXBlOiJwb2ludCIs
bWFya2VyOm51bGwsc2l6ZTpudWxsLHNob3dJbkxlZ2VuZDohMSxzbGljZWRPZmZzZXQ6MTAscz0K
dGF0ZXM6e2hvdmVyOnticmlnaHRuZXNzOjAuMSxzaGFkb3c6ITF9fSxzdGlja3lUcmFja2luZzoh
MSx0b29sdGlwOntmb2xsb3dQPQpvaW50ZXI6ITB9fSk7Uz0zRHt0eXBlOiJwaWUiLGlzQ2FydGVz
aWFuOiExLHBvaW50Q2xhc3M6a2EoRWEse2luaXQ6ZnVuY3Rpb249Cigpe0VhLnByb3RvdHlwZS5p
bml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYT0zRHRoaXMsYjtpZihhLnk8MClhLnk9M0Ru
dT0KbGw7cShhLHt2aXNpYmxlOmEudmlzaWJsZSE9M0Q9M0QhMSxuYW1lOm0oYS5uYW1lLCJTbGlj
ZSIpfSk7Yj0zRGZ1bmN0aW9uKGIpPQp7YS5zbGljZShiLnR5cGU9M0Q9M0Q9M0Qic2VsZWN0Iil9
O0soYSwic2VsZWN0IixiKTtLKGEsInVuc2VsZWN0IixiKTtyZXR1cm49CiBhfSxzZXRWaXNpYmxl
OmZ1bmN0aW9uKGEpe3ZhciBiPTNEdGhpcyxjPTNEYi5zZXJpZXMsZD0zRGMuY2hhcnQ7Yi52aXNp
YmxlPQo9M0RiLm9wdGlvbnMudmlzaWJsZT0zRAogYT0zRGE9M0Q9M0Q9M0R0PyFiLnZpc2libGU6
YTtjLm9wdGlvbnMuZGF0YVtEYShiLGMuZGF0YSldPTNEYi5vcHRpb25zO3AoWyI9CmdyYXBoaWMi
LCJkYXRhTGFiZWwiLCJjb25uZWN0b3IiLCJzaGFkb3dHcm91cCJdLGZ1bmN0aW9uKGMpe2lmKGJb
Y10pYltjXVthPz0KInNob3ciOiJoaWRlIl0oITApfSk7Yi5sZWdlbmRJdGVtJiZkLmxlZ2VuZC5j
b2xvcml6ZUl0ZW0oYixhKTtpZighYy5pc0RpcnR5PQomJmMub3B0aW9ucy5pZ25vcmVIaWRkZW5Q
b2ludCljLmlzRGlydHk9M0QhMCxkLnJlZHJhdygpfSxzbGljZTpmdW5jdGlvbihhLGI9CixjKXt2
YXIgZD0zRHRoaXMuc2VyaWVzO1FhKGMsZC5jaGFydCk7bShiLCEwKTt0aGlzLnNsaWNlZD0zRHRo
aXMub3B0aW9ucy5zbD0KaWNlZD0zRGE9M0RyKGEpP2E6IXRoaXMuc2xpY2VkO2Qub3B0aW9ucy5k
YXRhW0RhKHRoaXMsZC5kYXRhKV09M0R0aGlzLm9wdGlvPQpuczthPTNEYT90aGlzLnNsaWNlZFRy
YW5zbGF0aW9uOnt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowfTt0aGlzLmdyYXBoaWMuYW49Cmlt
YXRlKGEpOwpAQCAtMzAyLDQgKzMwMiw0IEBACiBzZXRWaXNpYmxlOmZ1bmN0aW9uKGEsYil7dmFy
IGM9M0R0aGlzLGQ9M0RjLmNoYXJ0LGU9M0RjLmxlZ2VuZEl0ZW0sZixnPTNEZD0KLm9wdGlvbnMu
Y2hhcnQuaWdub3JlSGlkZGVuU2VyaWVzLGg9M0RjLnZpc2libGU7Zj0zRChjLnZpc2libGU9M0Rh
PTNEYy51c2VyPQpPcHRpb25zLnZpc2libGU9M0RhPTNEPTNEPTNEdD8haDphKT8ic2hvdyI6Imhp
ZGUiO3AoWyJncm91cCIsImRhdGFMYWJlbHNHcm89CnVwIiwibWFya2VyR3JvdXAiLCJ0cmFja2Vy
Il0sZnVuY3Rpb24oYSl7aWYoY1thXSljW2FdW2ZdKCl9KTtpZihkLmhvdmVyU2VyaT0KZXM9M0Q9
M0Q9M0RjKWMub25Nb3VzZU91dCgpO2UmJmQubGVnZW5kLmNvbG9yaXplSXRlbShjLGEpO2MuaXNE
aXJ0eT0zRCEwO2MuPQpvcHRpb25zLnN0YWNraW5nJiZwKGQuc2VyaWVzLGZ1bmN0aW9uKGEpe2lm
KGEub3B0aW9ucy5zdGFja2luZyYmYS52aXNpYmxlKWE9Ci5pc0RpcnR5PTNEITB9KTtwKGMubGlu
a2VkU2VyaWVzLGZ1bmN0aW9uKGIpe2Iuc2V0VmlzaWJsZShhLCExKX0pO2lmKGcpZC5pcz0KRGly
dHlCb3g9M0QhMDsKIGIhPTNEPTNEITEmJmQucmVkcmF3KCk7RChjLGYpfSxzZXRUb29sdGlwUG9p
bnRzOmZ1bmN0aW9uKGEpe3ZhciBiPTNEW10sYyxkPQosZT0zRHRoaXMueEF4aXMsZj0zRGUmJmUu
Z2V0RXh0cmVtZXMoKSxnPTNEZT9lLnRvb2x0aXBMZW58fGUubGVuOnRoaXMuY2hhcnQ9Ci5wbG90
U2l6ZVgsaCxpLGo9M0RbXTtpZighKHRoaXMub3B0aW9ucy5lbmFibGVNb3VzZVRyYWNraW5nPTNE
PTNEPTNEITF8fHRoaT0Kcy5zaW5ndWxhclRvb2x0aXBzKSl7aWYoYSl0aGlzLnRvb2x0aXBQb2lu
dHM9M0RudWxsO3AodGhpcy5zZWdtZW50c3x8dGhpcy5wPQpvaW50cyxmdW5jdGlvbihhKXtiPTNE
Yi5jb25jYXQoYSl9KTtlJiZlLnJldmVyc2VkJiYoYj0zRGIucmV2ZXJzZSgpKTt0aGlzLm89CnJk
ZXJUb29sdGlwUG9pbnRzJiZ0aGlzLm9yZGVyVG9vbHRpcFBvaW50cyhiKTthPTNEYi5sZW5ndGg7
Zm9yKGk9M0QwO2k8YTtpKz0KKylpZihlPTNEYltpXSxjPTNEZS54LGM+PTNEZi5taW4mJmM8PTNE
Zi5tYXgpe2g9M0RiW2krMV07Yz0zRGQ9M0Q9M0Q9M0R0PzA6PQpkKzE7Zm9yKGQ9M0RiW2krMV0/
Qyh2KDAsVCgoZS5jbGllbnRYKwogKGg/aC53cmFwcGVkQ2xpZW50WHx8aC5jbGllbnRYOmcpKS8y
KSksZyk6ZztjPj0zRDAmJmM8PTNEZDspaltjKytdPTNEZX10aGk9CnMudG9vbHRpcFBvaW50cz0z
RGp9fSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5zZXRWaXNpYmxlKCEwKX0saGlkZTpmdW5jdGlvbigp
ez0KdGhpcy5zZXRWaXNpYmxlKCExKX0sc2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMuc2VsZWN0ZWQ9
M0RhPTNEYT0zRD0zRD0zRHQ/IXRoPQppcy5zZWxlY3RlZDphO2lmKHRoaXMuY2hlY2tib3gpdGhp
cy5jaGVja2JveC5jaGVja2VkPTNEYTtEKHRoaXMsYT8ic2VsZWN0Ijo9CiJ1bnNlbGVjdCIpfSxk
cmF3VHJhY2tlcjpTLmRyYXdUcmFja2VyR3JhcGh9KTtxKFIse0F4aXM6bGEsQ2hhcnQ6WWEsQ29s
b3I6eT0KYSxQb2ludDpFYSxUaWNrOlNhLFJlbmRlcmVyOlphLFNlcmllczpPLFNWR0VsZW1lbnQ6
UCxTVkdSZW5kZXJlcjp0YSxhcnJheU1pPQpuOk5hLGFycmF5TWF4OkJhLGNoYXJ0czpWLGRhdGVG
b3JtYXQ6Y2IsZm9ybWF0OklhLHBhdGhBbmltOnViLGdldE9wdGlvbnM6ZnU9Cm5jdGlvbigpe3Jl
dHVybiBFfSwKLWhhc0JpZGlCdWc6TmIsaXNUb3VjaERldmljZTpKYixudW1iZXJGb3JtYXQ6R2Es
c2VyaWVzVHlwZXM6RixzZXRPcHRpb25zOmZ1PQpuY3Rpb24oYSl7RT0zRHcoITAsRSxhKTtDYigp
O3JldHVybiBFfSxhZGRFdmVudDpLLHJlbW92ZUV2ZW50OlcsY3JlYXRlRWxlbWU9Cm50OlksZGlz
Y2FyZEVsZW1lbnQ6UGEsY3NzOkcsZWFjaDpwLGV4dGVuZDpxLG1hcDpVYSxtZXJnZTp3LHBpY2s6
bSxzcGxhdDpxYT0KLGV4dGVuZENsYXNzOmthLHBJbnQ6eix3cmFwOk1hLHN2ZzphYSxjYW52YXM6
ZmEsdm1sOiFhYSYmIWZhLHByb2R1Y3Q6IkhpZ2hjPQpoYXJ0cyIsdmVyc2lvbjoiNC4wLjEifSl9
KSgpOworaGFzQmlkaUJ1ZzpOYixpc1RvdWNoRGV2aWNlOkpiLG51bWJlckZvcm1hdDpHYSxzZXJp
ZXNUeXBlczpGLHNldE9wdGlvbnM6ZnU9Cm5jdGlvbihhKXtFPTNEdyghMCxFLGEpO0NiKCk7cmV0
dXJuIEV9LGFkZEV2ZW50OksscmVtb3ZlRXZlbnQ6VyxjcmVhdGVFbGVtZT0KbnQ6WSxkaXNjYXJk
RWxlbWVudDpQYSxjc3M6RyxlYWNoOnAsZXh0ZW5kOnEsbWFwOlVhLG1lcmdlOncscGljazptLHNw
bGF0OnFhPQosZXh0ZW5kQ2xhc3M6a2EscEludDp6LHdyYXA6TWEsc3ZnOmFhLGNhbnZhczpmYSx2
bWw6IWFhJiYhZmEscHJvZHVjdDoiSGlnaGM9CmhhcnRzIix2ZXJzaW9uOiI0LjAuMSJ9KX0pKCk7
ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoKZGlmZiAtciAxYmUwN2RlODZjMmE2MDY1MThh
N2NmYzI5MTMyMzBjMjlhNzIxMGY4IC1yIDJkZjQyNGZjMDUzNjgzMWU0OWIwOWQ0PQpkMmZmYTNh
MTExZmJhMTI4MiBjb25maWcvcGx1Z2lucy92aXN1YWxpemF0aW9ucy9jaGFydHMvc3RhdGljL3Zp
ZXdzL3R5cGVzLmpzCi0tLSBhL2NvbmZpZy9wbHVnaW5zL3Zpc3VhbGl6YXRpb25zL2NoYXJ0cy9z
dGF0aWMvdmlld3MvdHlwZXMuanMKKysrIGIvY29uZmlnL3BsdWdpbnMvdmlzdWFsaXphdGlvbnMv
Y2hhcnRzL3N0YXRpYy92aWV3cy90eXBlcy5qcwpAQCAtMjksNDIgKzI5LDI0IEBACiAgICAgICAg
IC8vIGNyZWF0ZSBuZXcgZWxlbWVudAogICAgICAgICB2YXIgJGVsID0zRCAkKCc8ZGl2IGNsYXNz
PTNEImNoYXJ0cy1ncmlkIi8+Jyk7CiAgICAgICAgPTIwCisgICAgICAgIC8vIGNvbnN0cnVjdCBj
aGFydCB0eXBlIHN1YnNldCBzZWxlY3Rpb24gYnV0dG9ucworICAgICAgICB0aGlzLmxpYnJhcnkg
PTNEIG5ldyBVaS5SYWRpb0J1dHRvbih7CisgICAgICAgICAgICBkYXRhICAgIDogWyB7IGxhYmVs
OiAnRGVmYXVsdCcsIHZhbHVlOiAnZGVmYXVsdCcgfSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IHsgbGFiZWw6ICdOVkQzIChvbmx5KScsIHZhbHVlOiAnbnZkMycgfSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHsgbGFiZWw6ICdIaWdoY2hhcnRzIChvbmx5KScsIHZhbHVlOiAnaGlnaGNoYXJ0
cycgPQp9XSwKKyAgICAgICAgICAgIG9uY2hhbmdlOiBmdW5jdGlvbih2YWx1ZSkgeworICAgICAg
ICAgICAgICAgIHNlbGYuX2ZpbHRlcih2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0p
OworICAgICAgICAkZWwuYXBwZW5kKFV0aWxzLndyYXAodGhpcy5saWJyYXJ5LiRlbCkuY3NzKCd0
ZXh0LWFsaWduJywgJ2NlbnRlcic9CikpOworICAgICAgID0yMAogICAgICAgICAvLyBzZXQgZWxl
bWVudAogICAgICAgICB0aGlzLnNldEVsZW1lbnQoJGVsKTsKLSAgICAgICAgICAgICAgID0yMAot
ICAgICAgICAvLyBsb2FkIGNoYXJ0IHR5cGVzIGludG8gY2F0ZWdvcmllcwotICAgICAgICB2YXIg
Y2F0ZWdvcmllcyA9M0Qge307Ci0gICAgICAgIHZhciB0eXBlcyA9M0QgYXBwLnR5cGVzLmF0dHJp
YnV0ZXM7Ci0gICAgICAgIGZvciAodmFyIGlkIGluIHR5cGVzKSB7Ci0gICAgICAgICAgICB2YXIg
dHlwZSA9M0QgdHlwZXNbaWRdOwotICAgICAgICAgICAgdmFyIGNhdGVnb3J5ID0zRCB0eXBlLmNh
dGVnb3J5OwotICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzW2NhdGVnb3J5XSkgewotICAgICAg
ICAgICAgICAgIGNhdGVnb3JpZXNbY2F0ZWdvcnldID0zRCB7fTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIGNhdGVnb3JpZXNbY2F0ZWdvcnldW2lkXSA9M0QgdHlwZTsKLSAgICAgICAgfQog
ICAgICAgID0yMAotICAgICAgICAvLyBhZGQgY2F0ZWdvcmllcyBhbmQgY2hhcnRzIHRvIHNjcmVl
bgotICAgICAgICBmb3IgKHZhciBjYXRlZ29yeSBpbiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgICAg
ICAvLyBjcmVhdGUgZW1wdHkgZWxlbWVudAotICAgICAgICAgICAgdmFyICRlbCA9M0QgJCgnPGRp
diBzdHlsZT0zRCJjbGVhcjogYm90aDsiLz4nKQotICAgICAgICAgICA9MjAKLSAgICAgICAgICAg
IC8vIGFkZCBoZWFkZXIgbGFiZWwKLSAgICAgICAgICAgICRlbC5hcHBlbmQoVXRpbHMud3JhcCh0
aGlzLl90ZW1wbGF0ZV9oZWFkZXIoe3RpdGxlOiBjYXRlZ29yeX0pPQopKTsKLSAgICAgICAgICAg
PTIwCi0gICAgICAgICAgICAvLyBhZGQgY2hhcnQgdHlwZXMKLSAgICAgICAgICAgIGZvciAodmFy
IGlkIGluIGNhdGVnb3JpZXNbY2F0ZWdvcnldKSB7Ci0gICAgICAgICAgICAgICAgdmFyIHR5cGUg
PTNEIGNhdGVnb3JpZXNbY2F0ZWdvcnldW2lkXTsKLSAgICAgICAgICAgICAgICAkZWwuYXBwZW5k
KFV0aWxzLndyYXAodGhpcy5fdGVtcGxhdGVfaXRlbSh7Ci0gICAgICAgICAgICAgICAgICAgIGlk
ICAgICAgOiBpZCwKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgICA6IHR5cGUudGl0bGUsCi0g
ICAgICAgICAgICAgICAgICAgIHVybCAgICAgOiBjb25maWcuYXBwX3Jvb3QgKyAnY2hhcnRzLycg
KyBzZWxmLmFwcC5jaGFydD0KUGF0aChpZCkgKyAnL2xvZ28ucG5nJwotICAgICAgICAgICAgICAg
IH0pKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgID0yMAotICAgICAgICAgICAgLy8gYWRk
IHRvIHZpZXcKLSAgICAgICAgICAgIHRoaXMuJGVsLmFwcGVuZChVdGlscy53cmFwKCRlbCkpOwot
ICAgICAgICB9CisgICAgICAgIC8vIHJlbmRlcgorICAgICAgICB0aGlzLl9yZW5kZXIoKTsKKyAg
ICAgICA9MjAKKyAgICAgICAgdGhpcy5saWJyYXJ5LnZhbHVlKCdkZWZhdWx0Jyk7CiAgICAgfSwK
ICAgID0yMAogICAgIC8vIHZhbHVlCkBAIC05Nyw2ICs3OSw1OSBAQAogICAgICAgICB9CiAgICAg
fSwKICAgID0yMAorICAgIC8vIGZpbHRlcgorICAgIF9maWx0ZXI6IGZ1bmN0aW9uKHZhbHVlKSB7
CisgICAgICAgIHZhciB0eXBlcyA9M0QgdGhpcy5hcHAudHlwZXMuYXR0cmlidXRlczsKKyAgICAg
ICAgZm9yICh2YXIgaWQgaW4gdHlwZXMpIHsKKyAgICAgICAgICAgIHZhciB0eXBlID0zRCB0eXBl
c1tpZF07CisgICAgICAgICAgICB2YXIgJGVsID0zRCB0aGlzLiRlbC5maW5kKCcjJyArIGlkKTsK
KyAgICAgICAgICAgIHZhciBrZXl3b3JkcyA9M0QgdHlwZS5rZXl3b3JkcyB8fCAnJzsKKyAgICAg
ICAgICAgIGlmIChrZXl3b3Jkcy5pbmRleE9mKHZhbHVlKSA9M0Q9M0QgLTEpIHsKKyAgICAgICAg
ICAgICAgICAkZWwuaGlkZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAkZWwuc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgID0yMAor
ICAgIC8vIHJlbmRlcgorICAgIF9yZW5kZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBsb2Fk
IGNoYXJ0IHR5cGVzIGludG8gY2F0ZWdvcmllcworICAgICAgICB2YXIgY2F0ZWdvcmllcyA9M0Qg
e307CisgICAgICAgIHZhciB0eXBlcyA9M0QgdGhpcy5hcHAudHlwZXMuYXR0cmlidXRlczsKKyAg
ICAgICAgZm9yICh2YXIgaWQgaW4gdHlwZXMpIHsKKyAgICAgICAgICAgIC8vIGFkZCBjYXRlZ29y
eQorICAgICAgICAgICAgdmFyIHR5cGUgPTNEIHR5cGVzW2lkXTsKKyAgICAgICAgICAgIHZhciBj
YXRlZ29yeSA9M0QgdHlwZS5jYXRlZ29yeTsKKyAgICAgICAgICAgIGlmICghY2F0ZWdvcmllc1tj
YXRlZ29yeV0pIHsKKyAgICAgICAgICAgICAgICBjYXRlZ29yaWVzW2NhdGVnb3J5XSA9M0Qge307
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRlZ29yaWVzW2NhdGVnb3J5XVtpZF0gPTNE
IHR5cGU7CisgICAgICAgIH0KKyAgICAgICA9MjAKKyAgICAgICAgLy8gYWRkIGNhdGVnb3JpZXMg
YW5kIGNoYXJ0cyB0byBzY3JlZW4KKyAgICAgICAgZm9yICh2YXIgY2F0ZWdvcnkgaW4gY2F0ZWdv
cmllcykgeworICAgICAgICAgICAgLy8gY3JlYXRlIGVtcHR5IGVsZW1lbnQKKyAgICAgICAgICAg
IHZhciAkZWwgPTNEICQoJzxkaXYgc3R5bGU9M0QiY2xlYXI6IGJvdGg7Ii8+JykKKyAgICAgICAg
ICAgPTIwCisgICAgICAgICAgICAvLyBhZGQgaGVhZGVyIGxhYmVsCisgICAgICAgICAgICAkZWwu
YXBwZW5kKFV0aWxzLndyYXAodGhpcy5fdGVtcGxhdGVfaGVhZGVyKHt0aXRsZTogY2F0ZWdvcnl9
KT0KKSk7CisgICAgICAgICAgID0yMAorICAgICAgICAgICAgLy8gYWRkIGNoYXJ0IHR5cGVzCisg
ICAgICAgICAgICBmb3IgKHZhciBpZCBpbiBjYXRlZ29yaWVzW2NhdGVnb3J5XSkgeworICAgICAg
ICAgICAgICAgIHZhciB0eXBlID0zRCBjYXRlZ29yaWVzW2NhdGVnb3J5XVtpZF07CisgICAgICAg
ICAgICAgICAgJGVsLmFwcGVuZChVdGlscy53cmFwKHRoaXMuX3RlbXBsYXRlX2l0ZW0oeworICAg
ICAgICAgICAgICAgICAgICBpZCAgICAgIDogaWQsCisgICAgICAgICAgICAgICAgICAgIHRpdGxl
ICAgOiB0eXBlLnRpdGxlICsgJyAoJyArIHR5cGUubGlicmFyeSArICcpJywKKyAgICAgICAgICAg
ICAgICAgICAgdXJsICAgICA6IGNvbmZpZy5hcHBfcm9vdCArICdjaGFydHMvJyArIHRoaXMuYXBw
LmNoYXJ0PQpQYXRoKGlkKSArICcvbG9nby5wbmcnCisgICAgICAgICAgICAgICAgfSkpKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgPTIwCisgICAgICAgICAgICAvLyBhZGQgdG8gdmlldwor
ICAgICAgICAgICAgdGhpcy4kZWwuYXBwZW5kKFV0aWxzLndyYXAoJGVsKSk7CisgICAgICAgIH0K
KyAgICB9LAorICAgPTIwCiAgICAgLy8gb25jbGljawogICAgIF9vbmNsaWNrOiBmdW5jdGlvbihl
KSB7CiAgICAgICAgIHZhciBvbGRfdmFsdWUgPTNEIHRoaXMudmFsdWUoKTsKCmRpZmYgLXIgMWJl
MDdkZTg2YzJhNjA2NTE4YTdjZmMyOTEzMjMwYzI5YTcyMTBmOCAtciAyZGY0MjRmYzA1MzY4MzFl
NDliMDlkND0KZDJmZmEzYTExMWZiYTEyODIgc3RhdGljL3NjcmlwdHMvbXZjL3VpL3VpLXBvcnRs
ZXQuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvbXZjL3VpL3VpLXBvcnRsZXQuanMKKysrIGIvc3Rh
dGljL3NjcmlwdHMvbXZjL3VpL3VpLXBvcnRsZXQuanMKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAg
ICAgLy8gc2V0IGNvbnRlbnQgcGFkZGluZwogICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5vcGFk
ZGluZykgewogICAgICAgICAgICAgJHBvcnRsZXRfY29udGVudC5jc3MoJ3BhZGRpbmcnLCAnMHB4
Jyk7Ci0gICAgICAgICAgICAkY29udGVudC5jc3MoJ3BhZGRpbmcnLCAnMHB4Jyk7CisgICAgICAg
ICAgICB0aGlzLiRjb250ZW50LmNzcygncGFkZGluZycsICcwcHgnKTsKICAgICAgICAgfQogICAg
ICAgID0yMAogICAgICAgICAvLyBhcHBlbmQgYnV0dG9ucwoKZGlmZiAtciAxYmUwN2RlODZjMmE2
MDY1MThhN2NmYzI5MTMyMzBjMjlhNzIxMGY4IC1yIDJkZjQyNGZjMDUzNjgzMWU0OWIwOWQ0PQpk
MmZmYTNhMTExZmJhMTI4MiBzdGF0aWMvc2NyaXB0cy9tdmMvdWkvdWktdGFicy5qcwotLS0gYS9z
dGF0aWMvc2NyaXB0cy9tdmMvdWkvdWktdGFicy5qcworKysgYi9zdGF0aWMvc2NyaXB0cy9tdmMv
dWkvdWktdGFicy5qcwpAQCAtMTU4LDcgKzE1OCw4IEBACiAgICAgICAgPTIwCiAgICAgICAgIC8v
IHNob3cgc2VsZWN0ZWQgdGFiCiAgICAgICAgIGlmIChpZCkgewotICAgICAgICAgICAgdGhpcy4k
ZWwuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKKyAgICAgICAgICAgIHRo
aXMuJGVsLmZpbmQoJy50YWItZWxlbWVudCcpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKKyAgICAg
ICAgICAgIHRoaXMuJGVsLmZpbmQoJy50YWItcGFuZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsK
ICAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJyN0YWItJyArIGlkKS5hZGRDbGFzcygnYWN0aXZl
Jyk7CiAgICAgICAgICAgICB0aGlzLiRlbC5maW5kKCcjdGFiLWNvbnRlbnQtJyArIGlkKS5hZGRD
bGFzcygnYWN0aXZlJyk7CiAgICAgICAgIH0KQEAgLTIxOCw3ICsyMTksNyBAQAogICAgPTIwCiAg
ICAgLy8gZmlsbCB0ZW1wbGF0ZSB0YWIKICAgICBfdGVtcGxhdGVfdGFiOiBmdW5jdGlvbihvcHRp
b25zKSB7Ci0gICAgICAgIHZhciB0bXBsID0zRCAgJzxsaSBpZD0zRCJ0YWItJyArIG9wdGlvbnMu
aWQgKyAnIj4nICsKKyAgICAgICAgdmFyIHRtcGwgPTNEICAnPGxpIGlkPTNEInRhYi0nICsgb3B0
aW9ucy5pZCArICciIGNsYXNzPTNEInRhYi1lbGVtPQplbnQiPicgKwogICAgICAgICAgICAgICAg
ICAgICAgICAgJzxhIGlkPTNEInRhYi10aXRsZS1saW5rLScgKyBvcHRpb25zLmlkICsgJyIgdGl0
bGU9Cj0zRCIiIGhyZWY9M0QiI3RhYi1jb250ZW50LScgKyBvcHRpb25zLmlkICsgJyIgZGF0YS1v
cmlnaW5hbC10aXRsZT0zRCIiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3Bh
biBpZD0zRCJ0YWItdGl0bGUtdGV4dC0nICsgb3B0aW9ucy5pZCArICc9CiI+JyArIG9wdGlvbnMu
dGl0bGUgKyAnPC9zcGFuPic7CiAgICAgICAgPTIwCgpkaWZmIC1yIDFiZTA3ZGU4NmMyYTYwNjUx
OGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMxZTQ5YjA5ZDQ9CmQyZmZh
M2ExMTFmYmExMjgyIHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvdWkvdWktcG9ydGxldC5qcwot
LS0gYS9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL3VpL3VpLXBvcnRsZXQuanMKKysrIGIvc3Rh
dGljL3NjcmlwdHMvcGFja2VkL212Yy91aS91aS1wb3J0bGV0LmpzCkBAIC0xLDEgKzEsMSBAQAot
ZGVmaW5lKFsidXRpbHMvdXRpbHMiXSxmdW5jdGlvbihhKXt2YXIgYj0zREJhY2tib25lLlZpZXcu
ZXh0ZW5kKHt2aXNpYmxlOmY9CmFsc2Usb3B0aW9uc0RlZmF1bHQ6e3RpdGxlOiIiLGljb246IiIs
YnV0dG9uczpudWxsLGJvZHk6bnVsbCxzY3JvbGxhYmxlOnRydT0KZSxub3BhZGRpbmc6ZmFsc2Us
b3BlcmF0aW9uczpudWxsLHBsYWNlbWVudDoiYm90dG9tIn0sJHRpdGxlOm51bGwsJGNvbnRlbnQ6
PQpudWxsLCRidXR0b25zOm51bGwsJG9wZXJhdGlvbnM6bnVsbCxpbml0aWFsaXplOmZ1bmN0aW9u
KGUpe3RoaXMub3B0aW9ucz0zRGE9Ci5tZXJnZShlLHRoaXMub3B0aW9uc0RlZmF1bHQpO3RoaXMu
c2V0RWxlbWVudCh0aGlzLl90ZW1wbGF0ZSh0aGlzLm9wdGlvbnMpKT0KO3RoaXMuJGNvbnRlbnQ9
M0R0aGlzLiRlbC5maW5kKCIjY29udGVudCIpO3RoaXMuJHRpdGxlPTNEdGhpcy4kZWwuZmluZCgi
I3BvPQpydGxldC1oZWFkZXItdGV4dCIpO3ZhciBkPTNEdGhpcy4kZWwuZmluZCgiI3BvcnRsZXQt
Y29udGVudCIpO2lmKCF0aGlzLm9wdGk9Cm9ucy5zY3JvbGxhYmxlKXtpZih0aGlzLm9wdGlvbnMu
dGl0bGUpe2QuYWRkQ2xhc3MoIm5vLXNjcm9sbCIpfWVsc2V7ZC5hZGRDbD0KYXNzKCJuby1zY3Jv
bGwtbm8tdGl0bGUiKX19ZWxzZXtkLmFkZENsYXNzKCJzY3JvbGwiKX1pZih0aGlzLm9wdGlvbnMu
bm9wYWRkPQppbmcpe2QuY3NzKCJwYWRkaW5nIiwiMHB4Iik7JGNvbnRlbnQuY3NzKCJwYWRkaW5n
IiwiMHB4Iil9dGhpcy4kYnV0dG9ucz0zRCQ9Cih0aGlzLmVsKS5maW5kKCIjYnV0dG9ucyIpO2lm
KHRoaXMub3B0aW9ucy5idXR0b25zKXt2YXIgYz0zRHRoaXM7JC5lYWNoKHRoaT0Kcy5vcHRpb25z
LmJ1dHRvbnMsZnVuY3Rpb24oZixnKXtnLiRlbC5wcm9wKCJpZCIsZik7Yy4kYnV0dG9ucy5hcHBl
bmQoZy4kZWwpPQp9KX1lbHNle3RoaXMuJGJ1dHRvbnMucmVtb3ZlKCl9dGhpcy4kb3BlcmF0aW9u
cz0zRCQodGhpcy5lbCkuZmluZCgiI29wZXJhdGk9Cm9ucyIpO2lmKHRoaXMub3B0aW9ucy5vcGVy
YXRpb25zKXt2YXIgYz0zRHRoaXM7JC5lYWNoKHRoaXMub3B0aW9ucy5vcGVyYXRpbz0KbnMsZnVu
Y3Rpb24oZixnKXtnLiRlbC5wcm9wKCJpZCIsZik7Yy4kb3BlcmF0aW9ucy5hcHBlbmQoZy4kZWwp
fSl9aWYodGhpcy5vPQpwdGlvbnMuYm9keSl7dGhpcy5hcHBlbmQodGhpcy5vcHRpb25zLmJvZHkp
fX0sYXBwZW5kOmZ1bmN0aW9uKGMpe3RoaXMuJGNvbnQ9CmVudC5hcHBlbmQoYS53cmFwKGMpKX0s
Y29udGVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRjb250ZW50fSxzaG93OmZ1bmN0aT0Kb24o
KXt0aGlzLiRlbC5mYWRlSW4oImZhc3QiKTt0aGlzLnZpc2libGU9M0R0cnVlfSxoaWRlOmZ1bmN0
aW9uKCl7dGhpcy4kZWwuPQpmYWRlT3V0KCJmYXN0Iik7dGhpcy52aXNpYmxlPTNEZmFsc2V9LGVu
YWJsZUJ1dHRvbjpmdW5jdGlvbihjKXt0aGlzLiRidXR0b249CnMuZmluZCgiIyIrYykucHJvcCgi
ZGlzYWJsZWQiLGZhbHNlKX0sZGlzYWJsZUJ1dHRvbjpmdW5jdGlvbihjKXt0aGlzLiRidXR0bz0K
bnMuZmluZCgiIyIrYykucHJvcCgiZGlzYWJsZWQiLHRydWUpfSxoaWRlT3BlcmF0aW9uOmZ1bmN0
aW9uKGMpe3RoaXMuJG9wZXJhPQp0aW9ucy5maW5kKCIjIitjKS5oaWRlKCl9LHNob3dPcGVyYXRp
b246ZnVuY3Rpb24oYyl7dGhpcy4kb3BlcmF0aW9ucy5maW5kKCI9CiMiK2MpLnNob3coKX0sc2V0
T3BlcmF0aW9uOmZ1bmN0aW9uKGUsZCl7dmFyIGM9M0R0aGlzLiRvcGVyYXRpb25zLmZpbmQoIiMi
Kz0KZSk7Yy5vZmYoImNsaWNrIik7Yy5vbigiY2xpY2siLGQpfSx0aXRsZTpmdW5jdGlvbihkKXt2
YXIgYz0zRHRoaXMuJHRpdGxlO2lmPQooZCl7Yy5odG1sKGQpfXJldHVybiBjLmh0bWwoKX0sX3Rl
bXBsYXRlOmZ1bmN0aW9uKGQpe3ZhciBjPTNEJzxkaXYgY2xhc3M9M0Q9CiJ1aS1wb3J0bGV0Ij4n
O2lmKGQudGl0bGUpe2MrPTNEJzxkaXYgaWQ9M0QicG9ydGxldC1oZWFkZXIiIGNsYXNzPTNEInBv
cnRsZT0KdC1oZWFkZXIiPjxkaXYgaWQ9M0Qib3BlcmF0aW9ucyIgc3R5bGU9M0QiZmxvYXQ6IHJp
Z2h0OyI+PC9kaXY+PGgzPic7aWYoZC5pPQpjb24pe2MrPTNEJzxpIGNsYXNzPTNEImljb24gZmEg
JytkLmljb24rJyI+Jm5ic3A7PC9pPid9Yys9M0QnPHNwYW4gaWQ9M0QicG89CnJ0bGV0LWhlYWRl
ci10ZXh0Ij4nK2QudGl0bGUrIjwvc3Bhbj48L2gzPjwvZGl2PiJ9Yys9M0QnPGRpdiBpZD0zRCJw
b3J0bGV0LT0KY29udGVudCIgY2xhc3M9M0QicG9ydGxldC1jb250ZW50Ij4nO2lmKGQucGxhY2Vt
ZW50PTNEPTNEInRvcCIpe2MrPTNEJzxkaXYgPQppZD0zRCJidXR0b25zIiBjbGFzcz0zRCJidXR0
b25zIj48L2Rpdj4nfWMrPTNEJzxkaXYgaWQ9M0QiY29udGVudCIgY2xhc3M9M0Q9CiJjb250ZW50
Ij48L2Rpdj4nO2lmKGQucGxhY2VtZW50PTNEPTNEImJvdHRvbSIpe2MrPTNEJzxkaXYgaWQ9M0Qi
YnV0dG9ucyIgYz0KbGFzcz0zRCJidXR0b25zIj48L2Rpdj4nfWMrPTNEIjwvZGl2PjwvZGl2PiI7
cmV0dXJuIGN9fSk7cmV0dXJue1ZpZXc6Yn19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxl
CitkZWZpbmUoWyJ1dGlscy91dGlscyJdLGZ1bmN0aW9uKGEpe3ZhciBiPTNEQmFja2JvbmUuVmll
dy5leHRlbmQoe3Zpc2libGU6Zj0KYWxzZSxvcHRpb25zRGVmYXVsdDp7dGl0bGU6IiIsaWNvbjoi
IixidXR0b25zOm51bGwsYm9keTpudWxsLHNjcm9sbGFibGU6dHJ1PQplLG5vcGFkZGluZzpmYWxz
ZSxvcGVyYXRpb25zOm51bGwscGxhY2VtZW50OiJib3R0b20ifSwkdGl0bGU6bnVsbCwkY29udGVu
dDo9Cm51bGwsJGJ1dHRvbnM6bnVsbCwkb3BlcmF0aW9uczpudWxsLGluaXRpYWxpemU6ZnVuY3Rp
b24oZSl7dGhpcy5vcHRpb25zPTNEYT0KLm1lcmdlKGUsdGhpcy5vcHRpb25zRGVmYXVsdCk7dGhp
cy5zZXRFbGVtZW50KHRoaXMuX3RlbXBsYXRlKHRoaXMub3B0aW9ucykpPQo7dGhpcy4kY29udGVu
dD0zRHRoaXMuJGVsLmZpbmQoIiNjb250ZW50Iik7dGhpcy4kdGl0bGU9M0R0aGlzLiRlbC5maW5k
KCIjcG89CnJ0bGV0LWhlYWRlci10ZXh0Iik7dmFyIGQ9M0R0aGlzLiRlbC5maW5kKCIjcG9ydGxl
dC1jb250ZW50Iik7aWYoIXRoaXMub3B0aT0Kb25zLnNjcm9sbGFibGUpe2lmKHRoaXMub3B0aW9u
cy50aXRsZSl7ZC5hZGRDbGFzcygibm8tc2Nyb2xsIil9ZWxzZXtkLmFkZENsPQphc3MoIm5vLXNj
cm9sbC1uby10aXRsZSIpfX1lbHNle2QuYWRkQ2xhc3MoInNjcm9sbCIpfWlmKHRoaXMub3B0aW9u
cy5ub3BhZGQ9CmluZyl7ZC5jc3MoInBhZGRpbmciLCIwcHgiKTt0aGlzLiRjb250ZW50LmNzcygi
cGFkZGluZyIsIjBweCIpfXRoaXMuJGJ1dHRvbj0Kcz0zRCQodGhpcy5lbCkuZmluZCgiI2J1dHRv
bnMiKTtpZih0aGlzLm9wdGlvbnMuYnV0dG9ucyl7dmFyIGM9M0R0aGlzOyQuZWFjPQpoKHRoaXMu
b3B0aW9ucy5idXR0b25zLGZ1bmN0aW9uKGYsZyl7Zy4kZWwucHJvcCgiaWQiLGYpO2MuJGJ1dHRv
bnMuYXBwZW5kKGc9Ci4kZWwpfSl9ZWxzZXt0aGlzLiRidXR0b25zLnJlbW92ZSgpfXRoaXMuJG9w
ZXJhdGlvbnM9M0QkKHRoaXMuZWwpLmZpbmQoIiNvcD0KZXJhdGlvbnMiKTtpZih0aGlzLm9wdGlv
bnMub3BlcmF0aW9ucyl7dmFyIGM9M0R0aGlzOyQuZWFjaCh0aGlzLm9wdGlvbnMub3BlPQpyYXRp
b25zLGZ1bmN0aW9uKGYsZyl7Zy4kZWwucHJvcCgiaWQiLGYpO2MuJG9wZXJhdGlvbnMuYXBwZW5k
KGcuJGVsKX0pfWlmKHQ9Cmhpcy5vcHRpb25zLmJvZHkpe3RoaXMuYXBwZW5kKHRoaXMub3B0aW9u
cy5ib2R5KX19LGFwcGVuZDpmdW5jdGlvbihjKXt0aGlzLj0KJGNvbnRlbnQuYXBwZW5kKGEud3Jh
cChjKSl9LGNvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kY29udGVudH0sc2hvdzpmPQp1
bmN0aW9uKCl7dGhpcy4kZWwuZmFkZUluKCJmYXN0Iik7dGhpcy52aXNpYmxlPTNEdHJ1ZX0saGlk
ZTpmdW5jdGlvbigpe3RoaXM9Ci4kZWwuZmFkZU91dCgiZmFzdCIpO3RoaXMudmlzaWJsZT0zRGZh
bHNlfSxlbmFibGVCdXR0b246ZnVuY3Rpb24oYyl7dGhpcy4kYj0KdXR0b25zLmZpbmQoIiMiK2Mp
LnByb3AoImRpc2FibGVkIixmYWxzZSl9LGRpc2FibGVCdXR0b246ZnVuY3Rpb24oYyl7dGhpcy4k
PQpidXR0b25zLmZpbmQoIiMiK2MpLnByb3AoImRpc2FibGVkIix0cnVlKX0saGlkZU9wZXJhdGlv
bjpmdW5jdGlvbihjKXt0aGlzLiQ9Cm9wZXJhdGlvbnMuZmluZCgiIyIrYykuaGlkZSgpfSxzaG93
T3BlcmF0aW9uOmZ1bmN0aW9uKGMpe3RoaXMuJG9wZXJhdGlvbnMuZj0KaW5kKCIjIitjKS5zaG93
KCl9LHNldE9wZXJhdGlvbjpmdW5jdGlvbihlLGQpe3ZhciBjPTNEdGhpcy4kb3BlcmF0aW9ucy5m
aW5kPQooIiMiK2UpO2Mub2ZmKCJjbGljayIpO2Mub24oImNsaWNrIixkKX0sdGl0bGU6ZnVuY3Rp
b24oZCl7dmFyIGM9M0R0aGlzLiR0aXQ9CmxlO2lmKGQpe2MuaHRtbChkKX1yZXR1cm4gYy5odG1s
KCl9LF90ZW1wbGF0ZTpmdW5jdGlvbihkKXt2YXIgYz0zRCc8ZGl2IGNsYT0Kc3M9M0QidWktcG9y
dGxldCI+JztpZihkLnRpdGxlKXtjKz0zRCc8ZGl2IGlkPTNEInBvcnRsZXQtaGVhZGVyIiBjbGFz
cz0zRCJwPQpvcnRsZXQtaGVhZGVyIj48ZGl2IGlkPTNEIm9wZXJhdGlvbnMiIHN0eWxlPTNEImZs
b2F0OiByaWdodDsiPjwvZGl2PjxoMz4nO2k9CmYoZC5pY29uKXtjKz0zRCc8aSBjbGFzcz0zRCJp
Y29uIGZhICcrZC5pY29uKyciPiZuYnNwOzwvaT4nfWMrPTNEJzxzcGFuIGlkPQo9M0QicG9ydGxl
dC1oZWFkZXItdGV4dCI+JytkLnRpdGxlKyI8L3NwYW4+PC9oMz48L2Rpdj4ifWMrPTNEJzxkaXYg
aWQ9M0QicG89CnJ0bGV0LWNvbnRlbnQiIGNsYXNzPTNEInBvcnRsZXQtY29udGVudCI+JztpZihk
LnBsYWNlbWVudD0zRD0zRCJ0b3AiKXtjKz0zRD0KJzxkaXYgaWQ9M0QiYnV0dG9ucyIgY2xhc3M9
M0QiYnV0dG9ucyI+PC9kaXY+J31jKz0zRCc8ZGl2IGlkPTNEImNvbnRlbnQiIGNsPQphc3M9M0Qi
Y29udGVudCI+PC9kaXY+JztpZihkLnBsYWNlbWVudD0zRD0zRCJib3R0b20iKXtjKz0zRCc8ZGl2
IGlkPTNEImJ1dHQ9Cm9ucyIgY2xhc3M9M0QiYnV0dG9ucyI+PC9kaXY+J31jKz0zRCI8L2Rpdj48
L2Rpdj4iO3JldHVybiBjfX0pO3JldHVybntWaWV3Oj0KYn19KTsKXCBObyBuZXdsaW5lIGF0IGVu
ZCBvZiBmaWxlCgpkaWZmIC1yIDFiZTA3ZGU4NmMyYTYwNjUxOGE3Y2ZjMjkxMzIzMGMyOWE3MjEw
ZjggLXIgMmRmNDI0ZmMwNTM2ODMxZTQ5YjA5ZDQ9CmQyZmZhM2ExMTFmYmExMjgyIHN0YXRpYy9z
Y3JpcHRzL3BhY2tlZC9tdmMvdWkvdWktdGFicy5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9wYWNr
ZWQvbXZjL3VpL3VpLXRhYnMuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy91aS91
aS10YWJzLmpzCkBAIC0xLDEgKzEsMSBAQAotZGVmaW5lKFsidXRpbHMvdXRpbHMiXSxmdW5jdGlv
bihhKXt2YXIgYj0zREJhY2tib25lLlZpZXcuZXh0ZW5kKHtvcHRpb25zRGU9CmZhdWx0Ont0aXRs
ZV9uZXc6IiIsb3BlcmF0aW9uczpudWxsLG9ubmV3Om51bGx9LGluaXRpYWxpemU6ZnVuY3Rpb24o
ZSl7dGhpcz0KLnZpc2libGU9M0RmYWxzZTt0aGlzLiRuYXY9M0RudWxsO3RoaXMuJGNvbnRlbnQ9
M0RudWxsO3RoaXMuZmlyc3RfdGFiPTNEbnVsPQpsO3RoaXMub3B0aW9ucz0zRGEubWVyZ2UoZSx0
aGlzLm9wdGlvbnNEZWZhdWx0KTt2YXIgYz0zRCQodGhpcy5fdGVtcGxhdGUodGg9CmlzLm9wdGlv
bnMpKTt0aGlzLiRuYXY9M0RjLmZpbmQoIi50YWItbmF2aWdhdGlvbiIpO3RoaXMuJGNvbnRlbnQ9
M0RjLmZpbmQoIj0KLnRhYi1jb250ZW50Iik7dGhpcy5zZXRFbGVtZW50KGMpO3RoaXMubGlzdD0z
RHt9O3ZhciBkPTNEdGhpcztpZih0aGlzLm9wdGlvPQpucy5vcGVyYXRpb25zKXskLmVhY2godGhp
cy5vcHRpb25zLm9wZXJhdGlvbnMsZnVuY3Rpb24oZyxoKXtoLiRlbC5wcm9wKCJpZCI9CixnKTtk
LiRuYXYuZmluZCgiLm9wZXJhdGlvbnMiKS5hcHBlbmQoaC4kZWwpfSl9aWYodGhpcy5vcHRpb25z
Lm9ubmV3KXt2YXIgZj0KPTNEJCh0aGlzLl90ZW1wbGF0ZV90YWJfbmV3KHRoaXMub3B0aW9ucykp
O3RoaXMuJG5hdi5hcHBlbmQoZik7Zi50b29sdGlwKHt0PQppdGxlOiJBZGQgYSBuZXcgdGFiIixw
bGFjZW1lbnQ6ImJvdHRvbSIsY29udGFpbmVyOmQuJGVsfSk7Zi5vbigiY2xpY2siLGZ1bmM9CnRp
b24oZyl7Zi50b29sdGlwKCJoaWRlIik7ZC5vcHRpb25zLm9ubmV3KCl9KX19LGFkZDpmdW5jdGlv
bihmKXt2YXIgZT0zRHRoaT0Kczt2YXIgaD0zRGYuaWQ7dmFyIGc9M0QkKHRoaXMuX3RlbXBsYXRl
X3RhYihmKSk7dmFyIGQ9M0QkKHRoaXMuX3RlbXBsYXRlX3RhPQpiX2NvbnRlbnQoZikpO3RoaXMu
bGlzdFtoXT0zRGYub25kZWw/dHJ1ZTpmYWxzZTtpZih0aGlzLm9wdGlvbnMub25uZXcpe3RoaXM9
Ci4kbmF2LmZpbmQoIiNuZXctdGFiIikuYmVmb3JlKGcpfWVsc2V7dGhpcy4kbmF2LmFwcGVuZChn
KX1kLmFwcGVuZChmLiRlbCk7dD0KaGlzLiRjb250ZW50LmFwcGVuZChkKTtpZihfLnNpemUodGhp
cy5saXN0KT0zRD0zRDEpe2cuYWRkQ2xhc3MoImFjdGl2ZSIpO2QuPQphZGRDbGFzcygiYWN0aXZl
Iik7dGhpcy5maXJzdF90YWI9M0RofWlmKGYub25kZWwpe3ZhciBjPTNEZy5maW5kKCIjZGVsZXRl
Iik9CjtjLnRvb2x0aXAoe3RpdGxlOiJEZWxldGUgdGhpcyB0YWIiLHBsYWNlbWVudDoiYm90dG9t
Iixjb250YWluZXI6ZS4kZWx9KTtjLj0Kb24oImNsaWNrIixmdW5jdGlvbigpe2MudG9vbHRpcCgi
ZGVzdHJveSIpO2UuJGVsLmZpbmQoIi50b29sdGlwIikucmVtb3ZlKCk7PQpmLm9uZGVsKCk7cmV0
dXJuIGZhbHNlfSl9Zy5vbigiY2xpY2siLGZ1bmN0aW9uKGkpe2kucHJldmVudERlZmF1bHQoKTtp
ZihmLm89Cm5jbGljayl7Zi5vbmNsaWNrKCl9ZWxzZXtlLnNob3coaCl9fSl9LGRlbDpmdW5jdGlv
bihjKXt0aGlzLiRlbC5maW5kKCIjdGFiLT0KIitjKS5yZW1vdmUoKTt0aGlzLiRlbC5maW5kKCIj
dGFiLWNvbnRlbnQtIitjKS5yZW1vdmUoKTtpZih0aGlzLmZpcnN0X3RhYj0KPTNEPTNEYyl7dGhp
cy5maXJzdF90YWI9M0RudWxsfWlmKHRoaXMuZmlyc3RfdGFiIT0zRG51bGwpe3RoaXMuc2hvdyh0
aGlzLmZpPQpyc3RfdGFiKX19LGRlbFJlbW92YWJsZTpmdW5jdGlvbigpe2Zvcih2YXIgYyBpbiB0
aGlzLmxpc3Qpe2lmKHRoaXMubGlzdFtjXSk9Cnt0aGlzLmRlbChjKX19fSxzaG93OmZ1bmN0aW9u
KGMpe3RoaXMuJGVsLmZhZGVJbigiZmFzdCIpO3RoaXMudmlzaWJsZT0zRHRydT0KZTtpZihjKXt0
aGlzLiRlbC5maW5kKCIuYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpO3RoaXMuJGVsLmZp
bmQoIiN0YWItPQoiK2MpLmFkZENsYXNzKCJhY3RpdmUiKTt0aGlzLiRlbC5maW5kKCIjdGFiLWNv
bnRlbnQtIitjKS5hZGRDbGFzcygiYWN0aXZlIik9Cn19LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLiRl
bC5mYWRlT3V0KCJmYXN0Iik7dGhpcy52aXNpYmxlPTNEZmFsc2V9LGhpZGVPcGVyYT0KdGlvbjpm
dW5jdGlvbihjKXt0aGlzLiRuYXYuZmluZCgiIyIrYykuaGlkZSgpfSxzaG93T3BlcmF0aW9uOmZ1
bmN0aW9uKGMpe3RoPQppcy4kbmF2LmZpbmQoIiMiK2MpLnNob3coKX0sc2V0T3BlcmF0aW9uOmZ1
bmN0aW9uKGUsZCl7dmFyIGM9M0R0aGlzLiRuYXYuZmk9Cm5kKCIjIitlKTtjLm9mZigiY2xpY2si
KTtjLm9uKCJjbGljayIsZCl9LHRpdGxlOmZ1bmN0aW9uKGUsZCl7dmFyIGM9M0R0aGlzLj0KJGVs
LmZpbmQoIiN0YWItdGl0bGUtdGV4dC0iK2UpO2lmKGQpe2MuaHRtbChkKX1yZXR1cm4gYy5odG1s
KCl9LF90ZW1wbGF0ZTpmPQp1bmN0aW9uKGMpe3JldHVybic8ZGl2IGNsYXNzPTNEInVpLXRhYnMg
dGFiYmFibGUgdGFicy1sZWZ0Ij48dWwgaWQ9M0QidGFiLW49CmF2aWdhdGlvbiIgY2xhc3M9M0Qi
dGFiLW5hdmlnYXRpb24gbmF2IG5hdi10YWJzIj48ZGl2IGNsYXNzPTNEIm9wZXJhdGlvbnMiID0K
c3R5bGU9M0QiZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tYm90dG9tOiA0cHg7Ij48L2Rpdj48L3VsPjxk
aXYgaWQ9M0QidGFiLWNvbnRlPQpudCIgY2xhc3M9M0QidGFiLWNvbnRlbnQiLz48L2Rpdj4nfSxf
dGVtcGxhdGVfdGFiX25ldzpmdW5jdGlvbihjKXtyZXR1cm4nPGw9CmkgaWQ9M0QibmV3LXRhYiI+
PGEgaHJlZj0zRCJqYXZhc2NyaXB0OnZvaWQoMCk7Ij48aSBjbGFzcz0zRCJ1aS10YWJzLWFkZCBm
YT0KIGZhLXBsdXMtY2lyY2xlIi8+JytjLnRpdGxlX25ldysiPC9hPjwvbGk+In0sX3RlbXBsYXRl
X3RhYjpmdW5jdGlvbihkKXt2YXIgPQpjPTNEJzxsaSBpZD0zRCJ0YWItJytkLmlkKyciPjxhIGlk
PTNEInRhYi10aXRsZS1saW5rLScrZC5pZCsnIiB0aXRsZT0zRCIiIGg9CnJlZj0zRCIjdGFiLWNv
bnRlbnQtJytkLmlkKyciIGRhdGEtb3JpZ2luYWwtdGl0bGU9M0QiIj48c3BhbiBpZD0zRCJ0YWIt
dGl0bD0KZS10ZXh0LScrZC5pZCsnIj4nK2QudGl0bGUrIjwvc3Bhbj4iO2lmKGQub25kZWwpe2Mr
PTNEJzxpIGlkPTNEImRlbGV0ZSIgY2xhPQpzcz0zRCJ1aS10YWJzLWRlbGV0ZSBmYSBmYS1taW51
cy1jaXJjbGUiLz4nfWMrPTNEIjwvYT48L2xpPiI7cmV0dXJuIGN9LF90ZW09CnBsYXRlX3RhYl9j
b250ZW50OmZ1bmN0aW9uKGMpe3JldHVybic8ZGl2IGlkPTNEInRhYi1jb250ZW50LScrYy5pZCsn
IiBjbGFzcz0KPTNEInRhYi1wYW5lIi8+J319KTtyZXR1cm57VmlldzpifX0pOwpcIE5vIG5ld2xp
bmUgYXQgZW5kIG9mIGZpbGUKK2RlZmluZShbInV0aWxzL3V0aWxzIl0sZnVuY3Rpb24oYSl7dmFy
IGI9M0RCYWNrYm9uZS5WaWV3LmV4dGVuZCh7b3B0aW9uc0RlPQpmYXVsdDp7dGl0bGVfbmV3OiIi
LG9wZXJhdGlvbnM6bnVsbCxvbm5ldzpudWxsfSxpbml0aWFsaXplOmZ1bmN0aW9uKGUpe3RoaXM9
Ci52aXNpYmxlPTNEZmFsc2U7dGhpcy4kbmF2PTNEbnVsbDt0aGlzLiRjb250ZW50PTNEbnVsbDt0
aGlzLmZpcnN0X3RhYj0zRG51bD0KbDt0aGlzLm9wdGlvbnM9M0RhLm1lcmdlKGUsdGhpcy5vcHRp
b25zRGVmYXVsdCk7dmFyIGM9M0QkKHRoaXMuX3RlbXBsYXRlKHRoPQppcy5vcHRpb25zKSk7dGhp
cy4kbmF2PTNEYy5maW5kKCIudGFiLW5hdmlnYXRpb24iKTt0aGlzLiRjb250ZW50PTNEYy5maW5k
KCI9Ci50YWItY29udGVudCIpO3RoaXMuc2V0RWxlbWVudChjKTt0aGlzLmxpc3Q9M0R7fTt2YXIg
ZD0zRHRoaXM7aWYodGhpcy5vcHRpbz0KbnMub3BlcmF0aW9ucyl7JC5lYWNoKHRoaXMub3B0aW9u
cy5vcGVyYXRpb25zLGZ1bmN0aW9uKGcsaCl7aC4kZWwucHJvcCgiaWQiPQosZyk7ZC4kbmF2LmZp
bmQoIi5vcGVyYXRpb25zIikuYXBwZW5kKGguJGVsKX0pfWlmKHRoaXMub3B0aW9ucy5vbm5ldyl7
dmFyIGY9Cj0zRCQodGhpcy5fdGVtcGxhdGVfdGFiX25ldyh0aGlzLm9wdGlvbnMpKTt0aGlzLiRu
YXYuYXBwZW5kKGYpO2YudG9vbHRpcCh7dD0KaXRsZToiQWRkIGEgbmV3IHRhYiIscGxhY2VtZW50
OiJib3R0b20iLGNvbnRhaW5lcjpkLiRlbH0pO2Yub24oImNsaWNrIixmdW5jPQp0aW9uKGcpe2Yu
dG9vbHRpcCgiaGlkZSIpO2Qub3B0aW9ucy5vbm5ldygpfSl9fSxhZGQ6ZnVuY3Rpb24oZil7dmFy
IGU9M0R0aGk9CnM7dmFyIGg9M0RmLmlkO3ZhciBnPTNEJCh0aGlzLl90ZW1wbGF0ZV90YWIoZikp
O3ZhciBkPTNEJCh0aGlzLl90ZW1wbGF0ZV90YT0KYl9jb250ZW50KGYpKTt0aGlzLmxpc3RbaF09
M0RmLm9uZGVsP3RydWU6ZmFsc2U7aWYodGhpcy5vcHRpb25zLm9ubmV3KXt0aGlzPQouJG5hdi5m
aW5kKCIjbmV3LXRhYiIpLmJlZm9yZShnKX1lbHNle3RoaXMuJG5hdi5hcHBlbmQoZyl9ZC5hcHBl
bmQoZi4kZWwpO3Q9Cmhpcy4kY29udGVudC5hcHBlbmQoZCk7aWYoXy5zaXplKHRoaXMubGlzdCk9
M0Q9M0QxKXtnLmFkZENsYXNzKCJhY3RpdmUiKTtkLj0KYWRkQ2xhc3MoImFjdGl2ZSIpO3RoaXMu
Zmlyc3RfdGFiPTNEaH1pZihmLm9uZGVsKXt2YXIgYz0zRGcuZmluZCgiI2RlbGV0ZSIpPQo7Yy50
b29sdGlwKHt0aXRsZToiRGVsZXRlIHRoaXMgdGFiIixwbGFjZW1lbnQ6ImJvdHRvbSIsY29udGFp
bmVyOmUuJGVsfSk7Yy49Cm9uKCJjbGljayIsZnVuY3Rpb24oKXtjLnRvb2x0aXAoImRlc3Ryb3ki
KTtlLiRlbC5maW5kKCIudG9vbHRpcCIpLnJlbW92ZSgpOz0KZi5vbmRlbCgpO3JldHVybiBmYWxz
ZX0pfWcub24oImNsaWNrIixmdW5jdGlvbihpKXtpLnByZXZlbnREZWZhdWx0KCk7aWYoZi5vPQpu
Y2xpY2spe2Yub25jbGljaygpfWVsc2V7ZS5zaG93KGgpfX0pfSxkZWw6ZnVuY3Rpb24oYyl7dGhp
cy4kZWwuZmluZCgiI3RhYi09CiIrYykucmVtb3ZlKCk7dGhpcy4kZWwuZmluZCgiI3RhYi1jb250
ZW50LSIrYykucmVtb3ZlKCk7aWYodGhpcy5maXJzdF90YWI9Cj0zRD0zRGMpe3RoaXMuZmlyc3Rf
dGFiPTNEbnVsbH1pZih0aGlzLmZpcnN0X3RhYiE9M0RudWxsKXt0aGlzLnNob3codGhpcy5maT0K
cnN0X3RhYil9fSxkZWxSZW1vdmFibGU6ZnVuY3Rpb24oKXtmb3IodmFyIGMgaW4gdGhpcy5saXN0
KXtpZih0aGlzLmxpc3RbY10pPQp7dGhpcy5kZWwoYyl9fX0sc2hvdzpmdW5jdGlvbihjKXt0aGlz
LiRlbC5mYWRlSW4oImZhc3QiKTt0aGlzLnZpc2libGU9M0R0cnU9CmU7aWYoYyl7dGhpcy4kZWwu
ZmluZCgiLnRhYi1lbGVtZW50IikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpO3RoaXMuJGVsLmZpbmQo
Ij0KLnRhYi1wYW5lIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpO3RoaXMuJGVsLmZpbmQoIiN0YWIt
IitjKS5hZGRDbGFzcygiYWN0aXZlPQoiKTt0aGlzLiRlbC5maW5kKCIjdGFiLWNvbnRlbnQtIitj
KS5hZGRDbGFzcygiYWN0aXZlIil9fSxoaWRlOmZ1bmN0aW9uKCl7dGg9CmlzLiRlbC5mYWRlT3V0
KCJmYXN0Iik7dGhpcy52aXNpYmxlPTNEZmFsc2V9LGhpZGVPcGVyYXRpb246ZnVuY3Rpb24oYyl7
dGhpcz0KLiRuYXYuZmluZCgiIyIrYykuaGlkZSgpfSxzaG93T3BlcmF0aW9uOmZ1bmN0aW9uKGMp
e3RoaXMuJG5hdi5maW5kKCIjIitjKS5zPQpob3coKX0sc2V0T3BlcmF0aW9uOmZ1bmN0aW9uKGUs
ZCl7dmFyIGM9M0R0aGlzLiRuYXYuZmluZCgiIyIrZSk7Yy5vZmYoImNsaWM9CmsiKTtjLm9uKCJj
bGljayIsZCl9LHRpdGxlOmZ1bmN0aW9uKGUsZCl7dmFyIGM9M0R0aGlzLiRlbC5maW5kKCIjdGFi
LXRpdGxlLT0KdGV4dC0iK2UpO2lmKGQpe2MuaHRtbChkKX1yZXR1cm4gYy5odG1sKCl9LF90ZW1w
bGF0ZTpmdW5jdGlvbihjKXtyZXR1cm4nPGRpPQp2IGNsYXNzPTNEInVpLXRhYnMgdGFiYmFibGUg
dGFicy1sZWZ0Ij48dWwgaWQ9M0QidGFiLW5hdmlnYXRpb24iIGNsYXNzPTNEInQ9CmFiLW5hdmln
YXRpb24gbmF2IG5hdi10YWJzIj48ZGl2IGNsYXNzPTNEIm9wZXJhdGlvbnMiIHN0eWxlPTNEImZs
b2F0OiByaWdodD0KOyBtYXJnaW4tYm90dG9tOiA0cHg7Ij48L2Rpdj48L3VsPjxkaXYgaWQ9M0Qi
dGFiLWNvbnRlbnQiIGNsYXNzPTNEInRhYi1jb250PQplbnQiLz48L2Rpdj4nfSxfdGVtcGxhdGVf
dGFiX25ldzpmdW5jdGlvbihjKXtyZXR1cm4nPGxpIGlkPTNEIm5ldy10YWIiPjxhIGg9CnJlZj0z
RCJqYXZhc2NyaXB0OnZvaWQoMCk7Ij48aSBjbGFzcz0zRCJ1aS10YWJzLWFkZCBmYSBmYS1wbHVz
LWNpcmNsZSIvPicrYz0KLnRpdGxlX25ldysiPC9hPjwvbGk+In0sX3RlbXBsYXRlX3RhYjpmdW5j
dGlvbihkKXt2YXIgYz0zRCc8bGkgaWQ9M0QidGFiLScrPQpkLmlkKyciIGNsYXNzPTNEInRhYi1l
bGVtZW50Ij48YSBpZD0zRCJ0YWItdGl0bGUtbGluay0nK2QuaWQrJyIgdGl0bGU9M0QiIiA9Cmhy
ZWY9M0QiI3RhYi1jb250ZW50LScrZC5pZCsnIiBkYXRhLW9yaWdpbmFsLXRpdGxlPTNEIiI+PHNw
YW4gaWQ9M0QidGFiLXRpdD0KbGUtdGV4dC0nK2QuaWQrJyI+JytkLnRpdGxlKyI8L3NwYW4+Ijtp
ZihkLm9uZGVsKXtjKz0zRCc8aSBpZD0zRCJkZWxldGUiIGNsPQphc3M9M0QidWktdGFicy1kZWxl
dGUgZmEgZmEtbWludXMtY2lyY2xlIi8+J31jKz0zRCI8L2E+PC9saT4iO3JldHVybiBjfSxfdGU9
Cm1wbGF0ZV90YWJfY29udGVudDpmdW5jdGlvbihjKXtyZXR1cm4nPGRpdiBpZD0zRCJ0YWItY29u
dGVudC0nK2MuaWQrJyIgY2xhcz0Kcz0zRCJ0YWItcGFuZSIvPid9fSk7cmV0dXJue1ZpZXc6Yn19
KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpkaWZmIC1yIDFiZTA3ZGU4NmMyYTYwNjUx
OGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRmNDI0ZmMwNTM2ODMxZTQ5YjA5ZDQ9CmQyZmZh
M2ExMTFmYmExMjgyIHN0YXRpYy9zdHlsZS9ibHVlL2Jhc2UuY3NzCi0tLSBhL3N0YXRpYy9zdHls
ZS9ibHVlL2Jhc2UuY3NzCisrKyBiL3N0YXRpYy9zdHlsZS9ibHVlL2Jhc2UuY3NzCkBAIC0xMjc4
LDYgKzEyNzgsNyBAQAogLnVwbG9hZC1mdHAgLnVwbG9hZC1mdHAtaGVscHttYXJnaW4tYm90dG9t
OjEwcHh9CiAudXBsb2FkLWZ0cCAudXBsb2FkLWZ0cC13YXJuaW5ne3RleHQtYWxpZ246Y2VudGVy
O21hcmdpbi10b3A6MjBweH0KIC51cGxvYWQtc2V0dGluZ3MgLnVwbG9hZC1zZXR0aW5ncy1jb3Zl
cntwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2hlaWdoPQp0OjEwMCU7dG9wOjBweDtsZWZ0
OjBweDtiYWNrZ3JvdW5kOiNmZmY7b3BhY2l0eTowLjQ7Y3Vyc29yOm5vLWRyb3B9CisudWktcmFk
aW9idXR0b24gbGFiZWx7aGVpZ2h0OjIzcHg7bGluZS1oZWlnaHQ6MWVtfQogLnVpLXRhYmxlLWZv
cm0tc2VwYXJhdG9ye2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zaXplOjAuOWVtfQogLnVpLWxhYmVs
e2ZvbnQtd2VpZ2h0OmJvbGR9CiAudWktbWVzc2FnZXtwYWRkaW5nOjJweCAycHggMnB4IDEwcHh9
CgpkaWZmIC1yIDFiZTA3ZGU4NmMyYTYwNjUxOGE3Y2ZjMjkxMzIzMGMyOWE3MjEwZjggLXIgMmRm
NDI0ZmMwNTM2ODMxZTQ5YjA5ZDQ9CmQyZmZhM2ExMTFmYmExMjgyIHN0YXRpYy9zdHlsZS9zcmMv
bGVzcy91aS5sZXNzCi0tLSBhL3N0YXRpYy9zdHlsZS9zcmMvbGVzcy91aS5sZXNzCisrKyBiL3N0
YXRpYy9zdHlsZS9zcmMvbGVzcy91aS5sZXNzCkBAIC0xLDMgKzEsMTAgQEAKKy51aS1yYWRpb2J1
dHRvbiB7CisgICAgbGFiZWwgeworICAgICAgICBoZWlnaHQ6IDIzcHg7CisgICAgICAgIGxpbmUt
aGVpZ2h0OiAxZW07CisgICAgfQorfQorCiAudWktdGFibGUgewogICAgICY6ZXh0ZW5kKC5ncmlk
KTsKClJlcG9zaXRvcnkgVVJMOiBodHRwczovL2JpdGJ1Y2tldC5vcmcvZ2FsYXh5L2dhbGF4eS1j
ZW50cmFsLwoKLS0KClRoaXMgaXMgYSBjb21taXQgbm90aWZpY2F0aW9uIGZyb20gYml0YnVja2V0
Lm9yZy4gWW91IGFyZSByZWNlaXZpbmcKdGhpcyBiZWNhdXNlIHlvdSBoYXZlIHRoZSBzZXJ2aWNl
IGVuYWJsZWQsIGFkZHJlc3NpbmcgdGhlIHJlY2lwaWVudCBvZgp0aGlzIGVtYWlsLgo
1
0
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1be07de86c2a/
Changeset: 1be07de86c2a
User: dannon
Date: 2014-06-03 23:42:17
Summary: Pack scripts.
Affected #: 1 file
diff -r e33a715ee045acac64b9e8e4ac14bcdc31ef6ca7 -r 1be07de86c2a606518a7cfc2913230c29a7210f8 static/scripts/packed/mvc/data.js
--- a/static/scripts/packed/mvc/data.js
+++ b/static/scripts/packed/mvc/data.js
@@ -1,1 +1,1 @@
-define(["mvc/ui/ui-modal","mvc/ui/ui-frames"],function(j,i){var g=Backbone.Model.extend({});var b=Backbone.Model.extend({defaults:{id:"",type:"",name:"",hda_ldda:"hda",metadata:null},initialize:function(){this._set_metadata();this.on("change",this._set_metadata,this)},_set_metadata:function(){var m=new g();_.each(_.keys(this.attributes),function(n){if(n.indexOf("metadata_")===0){var o=n.split("metadata_")[1];m.set(o,this.attributes[n]);delete this.attributes[n]}},this);this.set("metadata",m,{silent:true})},get_metadata:function(m){return this.attributes.metadata.get(m)},urlRoot:galaxy_config.root+"api/datasets"});var h=b.extend({defaults:_.extend({},b.prototype.defaults,{chunk_url:null,first_data_chunk:null,chunk_index:-1,at_eof:false}),initialize:function(m){b.prototype.initialize.call(this);this.attributes.chunk_index=(this.attributes.first_data_chunk?1:0);this.attributes.chunk_url=galaxy_config.root+"dataset/display?dataset_id="+this.id;this.attributes.url_viz=galaxy_config.root+"visualization"},get_next_chunk:function(){if(this.attributes.at_eof){return null}var m=this,n=$.Deferred();$.getJSON(this.attributes.chunk_url,{chunk:m.attributes.chunk_index++}).success(function(o){var p;if(o.ck_data!==""){p=o}else{m.attributes.at_eof=true;p=null}n.resolve(p)});return n}});var e=Backbone.Collection.extend({model:b});var a=Backbone.View.extend({initialize:function(m){this.row_count=0;this.header_color="#AAA";this.dark_row_color="#DDD";new d({model:m.model,$el:this.$el})},render:function(){var s=$("<div/>").attr("id","loading_indicator");this.$el.append(s);var q=$("<table/>").attr({id:"content_table",cellpadding:0});this.$el.append(q);var m=this.model.get_metadata("column_names"),r=$("<tr/>").css("background-color",this.header_color).appendTo(q);if(m){r.append("<th>"+m.join("</th><th>")+"</th>")}var o=this,n=this.model.get("first_data_chunk");if(n){this._renderChunk(n)}else{$.when(o.model.get_next_chunk()).then(function(t){o._renderChunk(t)})}var p=false;this.scroll_elt.scroll(function(){if(!p&&o.scrolled_to_bottom()){p=true;s.show();$.when(o.model.get_next_chunk()).then(function(t){if(t){o._renderChunk(t);p=false;s.hide()}})}})},scrolled_to_bottom:function(){return false},_renderCell:function(p,m,q){var n=$("<td>").text(p);var o=this.model.get_metadata("column_types");if(q!==undefined){n.attr("colspan",q).addClass("stringalign")}else{if(o){if(m<o.length){if(o[m]==="str"||o[m]==="list"){n.addClass("stringalign")}}}}return n},_renderRow:function(m){var n=m.split("\t"),p=$("<tr>"),o=this.model.get_metadata("columns");if(this.row_count%2!==0){p.css("background-color",this.dark_row_color)}if(n.length===o){_.each(n,function(r,q){p.append(this._renderCell(r,q))},this)}else{if(n.length>o){_.each(n.slice(0,o-1),function(r,q){p.append(this._renderCell(r,q))},this);p.append(this._renderCell(n.slice(o-1).join("\t"),o-1))}else{if(o>5&&n.length===o-1){_.each(n,function(r,q){p.append(this._renderCell(r,q))},this);p.append($("<td>"))}else{p.append(this._renderCell(m,0,o))}}}this.row_count++;return p},_renderChunk:function(m){var n=this.$el.find("table");_.each(m.ck_data.split("\n"),function(o,p){n.append(this._renderRow(o))},this)}});var f=a.extend({initialize:function(m){a.prototype.initialize.call(this,m);scroll_elt=_.find(this.$el.parents(),function(n){return $(n).css("overflow")==="auto"});if(!scroll_elt){scroll_elt=window}this.scroll_elt=$(scroll_elt)},scrolled_to_bottom:function(){return(this.$el.height()-this.scroll_elt.scrollTop()-this.scroll_elt.height()<=0)}});var l=a.extend({initialize:function(m){a.prototype.initialize.call(this,m);this.scroll_elt=this.$el.css({position:"relative",overflow:"scroll",height:this.options.height||"500px"})},scrolled_to_bottom:function(){return this.$el.scrollTop()+this.$el.innerHeight()>=this.el.scrollHeight}});var d=Backbone.View.extend({col:{chrom:null,start:null,end:null},url_viz:null,dataset_id:null,genome_build:null,data_type:null,initialize:function(o){var r=parent.Galaxy;if(r&&r.modal){this.modal=r.modal}if(r&&r.frame){this.frame=r.frame}if(!this.modal||!this.frame){return}var n=o.model;var q=n.get("metadata");if(!n.get("data_type")){return}this.data_type=n.get("data_type");if(this.data_type=="bed"){if(q.get("chromCol")&&q.get("startCol")&&q.get("endCol")){this.col.chrom=q.get("chromCol")-1;this.col.start=q.get("startCol")-1;this.col.end=q.get("endCol")-1}else{console.log("TabularButtonTrackster : Bed-file metadata incomplete.");return}}if(this.data_type=="vcf"){function p(t,u){for(var s=0;s<u.length;s++){if(u[s].match(t)){return s}}return -1}this.col.chrom=p("Chrom",q.get("column_names"));this.col.start=p("Pos",q.get("column_names"));this.col.end=null;if(this.col.chrom==-1||this.col.start==-1){console.log("TabularButtonTrackster : VCF-file metadata incomplete.");return}}if(this.col.chrom===undefined){return}if(n.id){this.dataset_id=n.id}else{console.log("TabularButtonTrackster : Dataset identification is missing.");return}if(n.get("url_viz")){this.url_viz=n.get("url_viz")}else{console.log("TabularButtonTrackster : Url for visualization controller is missing.");return}if(n.get("genome_build")){this.genome_build=n.get("genome_build")}var m=new IconButtonView({model:new IconButton({title:"Visualize",icon_class:"chart_curve",id:"btn_viz"})});this.setElement(o.$el);this.$el.append(m.render().$el);this.hide()},events:{"mouseover tr":"show",mouseleave:"hide"},show:function(r){function q(w){return !isNaN(parseFloat(w))&&isFinite(w)}if(this.col.chrom===null){return}var v=$(r.target).parent();var s=v.children().eq(this.col.chrom).html();var m=v.children().eq(this.col.start).html();var o=this.col.end?v.children().eq(this.col.end).html():m;if(!s.match("^#")&&s!==""&&q(m)){var u={dataset_id:this.dataset_id,gene_region:s+":"+m+"-"+o};var p=v.offset();var n=p.left-10;var t=p.top-$(window).scrollTop()+3;$("#btn_viz").css({position:"fixed",top:t+"px",left:n+"px"});$("#btn_viz").off("click");$("#btn_viz").click(this.create_trackster_action(this.url_viz,u,this.genome_build));$("#btn_viz").show()}else{$("#btn_viz").hide()}},hide:function(){this.$el.find("#btn_viz").hide()},create_trackster_action:function(m,p,o){var n=this;return function(){var q={};if(o){q["f-dbkey"]=o}$.ajax({url:m+"/list_tracks?"+$.param(q),dataType:"html",error:function(){n.modal.show({title:"Something went wrong!",body:"Unfortunately we could not add this dataset to the track browser. Please try again or contact us.",buttons:{Cancel:function(){n.modal.hide()}}})},success:function(r){n.modal.show({title:"View Data in a New or Saved Visualization",buttons:{Cancel:function(){n.modal.hide()},"View in saved visualization":function(){n.modal.show({title:"Add Data to Saved Visualization",body:r,buttons:{Cancel:function(){n.modal.hide()},"Add to visualization":function(){n.modal.hide();n.modal.$el.find("input[name=id]:checked").each(function(){var s=$(this).val();p.id=s;n.frame.add({title:"Trackster",type:"url",content:m+"/trackster?"+$.param(p)})})}}})},"View in new visualization":function(){n.modal.hide();n.frame.add({title:"Trackster",type:"url",content:m+"/trackster?"+$.param(p)})}}})}});return false}}});var k=function(p,n,q,m){var o=new n({model:new p(q)});o.render();if(m){m.append(o.$el)}return o};var c=function(o){if(!o.model){o.model=new h(o.dataset_config)}var n=o.parent_elt;var p=o.embedded;delete o.embedded;delete o.parent_elt;delete o.dataset_config;var m=(p?new l(o):new f(o));m.render();if(n){n.append(m.$el)}return m};return{Dataset:b,TabularDataset:h,DatasetCollection:e,TabularDatasetChunkedView:a,createTabularDatasetChunkedView:c}});
\ No newline at end of file
+define(["mvc/ui/ui-modal","mvc/ui/ui-frames"],function(j,i){var g=Backbone.Model.extend({});var b=Backbone.Model.extend({defaults:{id:"",type:"",name:"",hda_ldda:"hda",metadata:null},initialize:function(){this._set_metadata();this.on("change",this._set_metadata,this)},_set_metadata:function(){var m=new g();_.each(_.keys(this.attributes),function(n){if(n.indexOf("metadata_")===0){var o=n.split("metadata_")[1];m.set(o,this.attributes[n]);delete this.attributes[n]}},this);this.set("metadata",m,{silent:true})},get_metadata:function(m){return this.attributes.metadata.get(m)},urlRoot:galaxy_config.root+"api/datasets"});var h=b.extend({defaults:_.extend({},b.prototype.defaults,{chunk_url:null,first_data_chunk:null,chunk_index:-1,at_eof:false}),initialize:function(m){b.prototype.initialize.call(this);this.attributes.chunk_index=(this.attributes.first_data_chunk?1:0);this.attributes.chunk_url=galaxy_config.root+"dataset/display?dataset_id="+this.id;this.attributes.url_viz=galaxy_config.root+"visualization"},get_next_chunk:function(){if(this.attributes.at_eof){return null}var m=this,n=$.Deferred();$.getJSON(this.attributes.chunk_url,{chunk:m.attributes.chunk_index++}).success(function(o){var p;if(o.ck_data!==""){p=o}else{m.attributes.at_eof=true;p=null}n.resolve(p)});return n}});var e=Backbone.Collection.extend({model:b});var a=Backbone.View.extend({initialize:function(m){this.row_count=0;this.header_color="#AAA";this.dark_row_color="#DDD";new d({model:m.model,$el:this.$el})},render:function(){var s=$("<div/>").attr("id","loading_indicator");this.$el.append(s);var q=$("<table/>").attr({id:"content_table",cellpadding:0});this.$el.append(q);var m=this.model.get_metadata("column_names"),r=$("<tr/>").css("background-color",this.header_color).appendTo(q);if(m){r.append("<th>"+m.join("</th><th>")+"</th>")}var o=this,n=this.model.get("first_data_chunk");if(n){this._renderChunk(n)}else{$.when(o.model.get_next_chunk()).then(function(t){o._renderChunk(t)})}var p=false;this.scroll_elt.scroll(function(){if(!p&&o.scrolled_to_bottom()){p=true;s.show();$.when(o.model.get_next_chunk()).then(function(t){if(t){o._renderChunk(t);p=false}s.hide()})}})},scrolled_to_bottom:function(){return false},_renderCell:function(p,m,q){var n=$("<td>").text(p);var o=this.model.get_metadata("column_types");if(q!==undefined){n.attr("colspan",q).addClass("stringalign")}else{if(o){if(m<o.length){if(o[m]==="str"||o[m]==="list"){n.addClass("stringalign")}}}}return n},_renderRow:function(m){var n=m.split("\t"),p=$("<tr>"),o=this.model.get_metadata("columns");if(this.row_count%2!==0){p.css("background-color",this.dark_row_color)}if(n.length===o){_.each(n,function(r,q){p.append(this._renderCell(r,q))},this)}else{if(n.length>o){_.each(n.slice(0,o-1),function(r,q){p.append(this._renderCell(r,q))},this);p.append(this._renderCell(n.slice(o-1).join("\t"),o-1))}else{if(o>5&&n.length===o-1){_.each(n,function(r,q){p.append(this._renderCell(r,q))},this);p.append($("<td>"))}else{p.append(this._renderCell(m,0,o))}}}this.row_count++;return p},_renderChunk:function(m){var n=this.$el.find("table");_.each(m.ck_data.split("\n"),function(o,p){n.append(this._renderRow(o))},this)}});var f=a.extend({initialize:function(m){a.prototype.initialize.call(this,m);scroll_elt=_.find(this.$el.parents(),function(n){return $(n).css("overflow")==="auto"});if(!scroll_elt){scroll_elt=window}this.scroll_elt=$(scroll_elt)},scrolled_to_bottom:function(){return(this.$el.height()-this.scroll_elt.scrollTop()-this.scroll_elt.height()<=0)}});var l=a.extend({initialize:function(m){a.prototype.initialize.call(this,m);this.scroll_elt=this.$el.css({position:"relative",overflow:"scroll",height:this.options.height||"500px"})},scrolled_to_bottom:function(){return this.$el.scrollTop()+this.$el.innerHeight()>=this.el.scrollHeight}});var d=Backbone.View.extend({col:{chrom:null,start:null,end:null},url_viz:null,dataset_id:null,genome_build:null,data_type:null,initialize:function(o){var r=parent.Galaxy;if(r&&r.modal){this.modal=r.modal}if(r&&r.frame){this.frame=r.frame}if(!this.modal||!this.frame){return}var n=o.model;var q=n.get("metadata");if(!n.get("data_type")){return}this.data_type=n.get("data_type");if(this.data_type=="bed"){if(q.get("chromCol")&&q.get("startCol")&&q.get("endCol")){this.col.chrom=q.get("chromCol")-1;this.col.start=q.get("startCol")-1;this.col.end=q.get("endCol")-1}else{console.log("TabularButtonTrackster : Bed-file metadata incomplete.");return}}if(this.data_type=="vcf"){function p(t,u){for(var s=0;s<u.length;s++){if(u[s].match(t)){return s}}return -1}this.col.chrom=p("Chrom",q.get("column_names"));this.col.start=p("Pos",q.get("column_names"));this.col.end=null;if(this.col.chrom==-1||this.col.start==-1){console.log("TabularButtonTrackster : VCF-file metadata incomplete.");return}}if(this.col.chrom===undefined){return}if(n.id){this.dataset_id=n.id}else{console.log("TabularButtonTrackster : Dataset identification is missing.");return}if(n.get("url_viz")){this.url_viz=n.get("url_viz")}else{console.log("TabularButtonTrackster : Url for visualization controller is missing.");return}if(n.get("genome_build")){this.genome_build=n.get("genome_build")}var m=new IconButtonView({model:new IconButton({title:"Visualize",icon_class:"chart_curve",id:"btn_viz"})});this.setElement(o.$el);this.$el.append(m.render().$el);this.hide()},events:{"mouseover tr":"show",mouseleave:"hide"},show:function(r){function q(w){return !isNaN(parseFloat(w))&&isFinite(w)}if(this.col.chrom===null){return}var v=$(r.target).parent();var s=v.children().eq(this.col.chrom).html();var m=v.children().eq(this.col.start).html();var o=this.col.end?v.children().eq(this.col.end).html():m;if(!s.match("^#")&&s!==""&&q(m)){var u={dataset_id:this.dataset_id,gene_region:s+":"+m+"-"+o};var p=v.offset();var n=p.left-10;var t=p.top-$(window).scrollTop()+3;$("#btn_viz").css({position:"fixed",top:t+"px",left:n+"px"});$("#btn_viz").off("click");$("#btn_viz").click(this.create_trackster_action(this.url_viz,u,this.genome_build));$("#btn_viz").show()}else{$("#btn_viz").hide()}},hide:function(){this.$el.find("#btn_viz").hide()},create_trackster_action:function(m,p,o){var n=this;return function(){var q={};if(o){q["f-dbkey"]=o}$.ajax({url:m+"/list_tracks?"+$.param(q),dataType:"html",error:function(){n.modal.show({title:"Something went wrong!",body:"Unfortunately we could not add this dataset to the track browser. Please try again or contact us.",buttons:{Cancel:function(){n.modal.hide()}}})},success:function(r){n.modal.show({title:"View Data in a New or Saved Visualization",buttons:{Cancel:function(){n.modal.hide()},"View in saved visualization":function(){n.modal.show({title:"Add Data to Saved Visualization",body:r,buttons:{Cancel:function(){n.modal.hide()},"Add to visualization":function(){n.modal.hide();n.modal.$el.find("input[name=id]:checked").each(function(){var s=$(this).val();p.id=s;n.frame.add({title:"Trackster",type:"url",content:m+"/trackster?"+$.param(p)})})}}})},"View in new visualization":function(){n.modal.hide();n.frame.add({title:"Trackster",type:"url",content:m+"/trackster?"+$.param(p)})}}})}});return false}}});var k=function(p,n,q,m){var o=new n({model:new p(q)});o.render();if(m){m.append(o.$el)}return o};var c=function(o){if(!o.model){o.model=new h(o.dataset_config)}var n=o.parent_elt;var p=o.embedded;delete o.embedded;delete o.parent_elt;delete o.dataset_config;var m=(p?new l(o):new f(o));m.render();if(n){n.append(m.$el)}return m};return{Dataset:b,TabularDataset:h,DatasetCollection:e,TabularDatasetChunkedView:a,createTabularDatasetChunkedView:c}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dannon: Stop loading indicator at the end of get_next_chunk regardless of result.
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e33a715ee045/
Changeset: e33a715ee045
User: dannon
Date: 2014-06-03 23:40:00
Summary: Stop loading indicator at the end of get_next_chunk regardless of result.
Affected #: 1 file
diff -r 58a057a02b896ae6d32571f7141f46ccb9006e54 -r e33a715ee045acac64b9e8e4ac14bcdc31ef6ca7 static/scripts/mvc/data.js
--- a/static/scripts/mvc/data.js
+++ b/static/scripts/mvc/data.js
@@ -180,8 +180,8 @@
if (result) {
self._renderChunk(result);
loading_chunk = false;
- loading_indicator.hide();
}
+ loading_indicator.hide();
});
}
});
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/58a057a02b89/
Changeset: 58a057a02b89
User: davebgx
Date: 2014-06-03 23:04:13
Summary: Merge fix from stable.
Affected #: 1 file
diff -r d1d3a8f09b2bcaf23962310f5d535758823e13d7 -r 58a057a02b896ae6d32571f7141f46ccb9006e54 lib/tool_shed/galaxy_install/repository_util.py
--- a/lib/tool_shed/galaxy_install/repository_util.py
+++ b/lib/tool_shed/galaxy_install/repository_util.py
@@ -623,11 +623,11 @@
# Get the tool_dependencies.xml file from the repository.
tool_dependencies_config = hg_util.get_config_from_disk( 'tool_dependencies.xml', install_dir )
installed_tool_dependencies = \
- common_install_util.install_specified_packages( app=trans.app,
- tool_shed_repository=tool_shed_repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=tool_shed_repository.tool_dependencies,
- from_tool_migration_manager=False )
+ common_install_util.install_specified_tool_dependencies( app=trans.app,
+ tool_shed_repository=tool_shed_repository,
+ tool_dependencies_config=tool_dependencies_config,
+ tool_dependencies=tool_shed_repository.tool_dependencies,
+ from_tool_migration_manager=False )
basic_util.remove_dir( work_dir )
suc.update_tool_shed_repository_status( trans.app,
tool_shed_repository,
@@ -881,11 +881,11 @@
# Get the tool_dependencies.xml file from the repository.
tool_dependencies_config = hg_util.get_config_from_disk( 'tool_dependencies.xml', repository.repo_path( trans.app ) )
installed_tool_dependencies = \
- common_install_util.install_specified_packages( app=trans.app,
- tool_shed_repository=repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=repository.tool_dependencies,
- from_tool_migration_manager=False )
+ common_install_util.install_specified_tool_dependencies( app=trans.app,
+ tool_shed_repository=repository,
+ tool_dependencies_config=tool_dependencies_config,
+ tool_dependencies=repository.tool_dependencies,
+ from_tool_migration_manager=False )
for installed_tool_dependency in installed_tool_dependencies:
if installed_tool_dependency.status in [ trans.install_model.ToolDependency.installation_status.ERROR ]:
repair_dict = add_repair_dict_entry( repository.name, installed_tool_dependency.error_message )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Fix for Safari Caching External View application 302 redirect links. See https://trello.com/c/optldnPm
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d1d3a8f09b2b/
Changeset: d1d3a8f09b2b
User: dan
Date: 2014-06-03 23:03:17
Summary: Fix for Safari Caching External View application 302 redirect links. See https://trello.com/c/optldnPm
Affected #: 1 file
diff -r 72dea09e14ab6e87e7537b23f8c9af2cd6f50c6b -r d1d3a8f09b2bcaf23962310f5d535758823e13d7 lib/galaxy/webapps/galaxy/controllers/dataset.py
--- a/lib/galaxy/webapps/galaxy/controllers/dataset.py
+++ b/lib/galaxy/webapps/galaxy/controllers/dataset.py
@@ -738,6 +738,8 @@
return rval
elif app_action == None:
#redirect user to url generated by display link
+ #Fix for Safari caching display links, which can change if the underlying dataset has an attribute change, e.g. name, metadata, etc
+ trans.response.headers[ 'Cache-Control' ] = [ 'no-cache', 'max-age=0', 'no-store', 'must-revalidate' ]
return trans.response.send_redirect( display_link.display_url() )
else:
msg.append( ( 'Invalid action provided: %s' % app_action, 'error' ) )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Add change that was lost when resolving a merge conflict.
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f9c050410d6a/
Changeset: f9c050410d6a
Branch: stable
User: davebgx
Date: 2014-06-03 22:52:18
Summary: Add change that was lost when resolving a merge conflict.
Affected #: 1 file
diff -r 96fdb9168f28b2ffa463195d084c9278efb2465a -r f9c050410d6a56d7f6fe503b4f22f286bd5a40e2 lib/tool_shed/galaxy_install/repository_util.py
--- a/lib/tool_shed/galaxy_install/repository_util.py
+++ b/lib/tool_shed/galaxy_install/repository_util.py
@@ -622,11 +622,11 @@
# Get the tool_dependencies.xml file from the repository.
tool_dependencies_config = suc.get_config_from_disk( 'tool_dependencies.xml', install_dir )
installed_tool_dependencies = \
- common_install_util.install_specified_packages( app=trans.app,
- tool_shed_repository=tool_shed_repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=tool_shed_repository.tool_dependencies,
- from_tool_migration_manager=False )
+ common_install_util.install_specified_tool_dependencies( app=trans.app,
+ tool_shed_repository=tool_shed_repository,
+ tool_dependencies_config=tool_dependencies_config,
+ tool_dependencies=tool_shed_repository.tool_dependencies,
+ from_tool_migration_manager=False )
suc.remove_dir( work_dir )
suc.update_tool_shed_repository_status( trans.app,
tool_shed_repository,
@@ -880,11 +880,11 @@
# Get the tool_dependencies.xml file from the repository.
tool_dependencies_config = suc.get_config_from_disk( 'tool_dependencies.xml', repository.repo_path( trans.app ) )
installed_tool_dependencies = \
- common_install_util.install_specified_packages( app=trans.app,
- tool_shed_repository=repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=repository.tool_dependencies,
- from_tool_migration_manager=False )
+ common_install_util.install_specified_tool_dependencies( app=trans.app,
+ tool_shed_repository=repository,
+ tool_dependencies_config=tool_dependencies_config,
+ tool_dependencies=repository.tool_dependencies,
+ from_tool_migration_manager=False )
for installed_tool_dependency in installed_tool_dependencies:
if installed_tool_dependency.status in [ trans.install_model.ToolDependency.installation_status.ERROR ]:
repair_dict = add_repair_dict_entry( repository.name, installed_tool_dependency.error_message )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix import in the Tool Shed's common_install_util module.
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/72dea09e14ab/
Changeset: 72dea09e14ab
User: greg
Date: 2014-06-03 22:34:59
Summary: Fix import in the Tool Shed's common_install_util module.
Affected #: 1 file
diff -r 465b390ffeeda37663b92de91c1fa50a46743292 -r 72dea09e14ab6e87e7537b23f8c9af2cd6f50c6b lib/tool_shed/util/common_install_util.py
--- a/lib/tool_shed/util/common_install_util.py
+++ b/lib/tool_shed/util/common_install_util.py
@@ -18,7 +18,6 @@
from tool_shed.util import xml_util
from tool_shed.galaxy_install.install_manager import InstallManager
-from tool_shed.galaxy_install.tool_dependencies.recipe.recipe_manager import StepManager
from tool_shed.galaxy_install.tool_dependencies.recipe.recipe_manager import TagManager
log = logging.getLogger( __name__ )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Merge in set_environment bugfix from stable.
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/465b390ffeed/
Changeset: 465b390ffeed
User: davebgx
Date: 2014-06-03 22:09:03
Summary: Merge in set_environment bugfix from stable.
Affected #: 6 files
diff -r beef22110c25635ed18a3c24f9d94442a4a4cc9c -r 465b390ffeeda37663b92de91c1fa50a46743292 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -465,11 +465,11 @@
tool_dependencies_config = hg_util.get_config_from_disk( rt_util.TOOL_DEPENDENCY_DEFINITION_FILENAME,
tool_shed_repository.repo_path( trans.app ) )
installed_tool_dependencies = \
- common_install_util.install_specified_packages( app=trans.app,
- tool_shed_repository=tool_shed_repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=tool_dependencies,
- from_tool_migration_manager=False )
+ common_install_util.install_specified_tool_dependencies( app=trans.app,
+ tool_shed_repository=tool_shed_repository,
+ tool_dependencies_config=tool_dependencies_config,
+ tool_dependencies=tool_dependencies,
+ from_tool_migration_manager=False )
for installed_tool_dependency in installed_tool_dependencies:
if installed_tool_dependency.status == trans.app.install_model.ToolDependency.installation_status.ERROR:
text = util.unicodify( installed_tool_dependency.error_message )
diff -r beef22110c25635ed18a3c24f9d94442a4a4cc9c -r 465b390ffeeda37663b92de91c1fa50a46743292 lib/tool_shed/galaxy_install/install_manager.py
--- a/lib/tool_shed/galaxy_install/install_manager.py
+++ b/lib/tool_shed/galaxy_install/install_manager.py
@@ -187,7 +187,6 @@
a partial or full list of ToolDependency records associated with the tool_shed_repository.
"""
tag_manager = TagManager()
- sa_session = app.install_model.context
# The value of package_name should match the value of the "package" type in the tool config's
# <requirements> tag set, but it's not required.
package_name = elem.get( 'name', None )
diff -r beef22110c25635ed18a3c24f9d94442a4a4cc9c -r 465b390ffeeda37663b92de91c1fa50a46743292 lib/tool_shed/galaxy_install/tool_dependencies/recipe/recipe_manager.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/recipe/recipe_manager.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/recipe/recipe_manager.py
@@ -97,7 +97,8 @@
return tool_dependency, proceed_with_install, action_elem_tuples
def load_tag_handlers( self ):
- tag_handlers = dict( install=tag_handler.Install(),
+ tag_handlers = dict( environment_variable=tag_handler.SetEnvironment(),
+ install=tag_handler.Install(),
package=tag_handler.Package(),
readme=tag_handler.ReadMe(),
repository=tag_handler.Repository(),
diff -r beef22110c25635ed18a3c24f9d94442a4a4cc9c -r 465b390ffeeda37663b92de91c1fa50a46743292 lib/tool_shed/galaxy_install/tool_dependencies/recipe/tag_handler.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/recipe/tag_handler.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/recipe/tag_handler.py
@@ -446,9 +446,12 @@
def process_tag_set( self, app, tool_shed_repository, tool_dependency, package_elem, package_name, package_version,
from_tool_migration_manager=False, tool_dependency_db_records=None ):
+ # We need to handle two tag sets for package_elem here, this:
# <set_environment version="1.0">
# <environment_variable name="R_SCRIPT_PATH"action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
# </set_environment>
+ # or this:
+ # <environment_variable name="R_SCRIPT_PATH"action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
action_elem_tuples = []
proceed_with_install = False
if tool_dependency_db_records is None:
@@ -479,6 +482,9 @@
<set_environment version="1.0"><environment_variable name="R_SCRIPT_PATH" action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable></set_environment>
+
+ This method must also handle the sub-element tag::
+ <environment_variable name="R_SCRIPT_PATH" action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
"""
# TODO: Add support for a repository dependency definition within this tool dependency type's tag set. This should look something like
# the following. See the implementation of support for this in the tool dependency package type's method above.
@@ -495,11 +501,19 @@
tool_dependencies = []
env_var_version = elem.get( 'version', '1.0' )
tool_shed_repository_install_dir = os.path.abspath( tool_shed_repository.repo_files_directory( app ) )
- for env_var_elem in elem:
- # Althoug we're in a loop here, this method will always return only a single ToolDependency or None.
+ if elem.tag == 'environment_variable':
+ # <environment_variable name="R_SCRIPT_PATH" action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
+ elems = [ elem ]
+ else:
+ # <set_environment version="1.0">
+ # <environment_variable name="R_SCRIPT_PATH" action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
+ # </set_environment>
+ elems = [ env_var_elem for env_var_elem in elem ]
+ for env_var_elem in elems:
env_var_name = env_var_elem.get( 'name', None )
- # The value of env_var_name must match the text value of at least 1 <requirement> tag in the tool config's <requirements> tag set whose
- # "type" attribute is "set_environment" (e.g., <requirement type="set_environment">R_SCRIPT_PATH</requirement>).
+ # The value of env_var_name must match the text value of at least 1 <requirement> tag in the
+ # tool config's <requirements> tag set whose "type" attribute is "set_environment" (e.g.,
+ # <requirement type="set_environment">R_SCRIPT_PATH</requirement>).
env_var_action = env_var_elem.get( 'action', None )
if env_var_name and env_var_action:
# Tool dependencies of type "set_environmnet" always have the version attribute set to None.
diff -r beef22110c25635ed18a3c24f9d94442a4a4cc9c -r 465b390ffeeda37663b92de91c1fa50a46743292 lib/tool_shed/galaxy_install/tool_migration_manager.py
--- a/lib/tool_shed/galaxy_install/tool_migration_manager.py
+++ b/lib/tool_shed/galaxy_install/tool_migration_manager.py
@@ -447,11 +447,11 @@
# Get the tool_dependencies.xml file from disk.
tool_dependencies_config = hg_util.get_config_from_disk( 'tool_dependencies.xml', repo_install_dir )
installed_tool_dependencies = \
- common_install_util.install_specified_packages( app=self.app,
- tool_shed_repository=tool_shed_repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=tool_dependencies,
- from_tool_migration_manager=True )
+ common_install_util.install_specified_tool_dependencies( app=self.app,
+ tool_shed_repository=tool_shed_repository,
+ tool_dependencies_config=tool_dependencies_config,
+ tool_dependencies=tool_dependencies,
+ from_tool_migration_manager=True )
for installed_tool_dependency in installed_tool_dependencies:
if installed_tool_dependency.status == self.app.install_model.ToolDependency.installation_status.ERROR:
print '\nThe ToolMigrationManager returned the following error while installing tool dependency ', installed_tool_dependency.name, ':'
diff -r beef22110c25635ed18a3c24f9d94442a4a4cc9c -r 465b390ffeeda37663b92de91c1fa50a46743292 lib/tool_shed/util/common_install_util.py
--- a/lib/tool_shed/util/common_install_util.py
+++ b/lib/tool_shed/util/common_install_util.py
@@ -18,6 +18,7 @@
from tool_shed.util import xml_util
from tool_shed.galaxy_install.install_manager import InstallManager
+from tool_shed.galaxy_install.tool_dependencies.recipe.recipe_manager import StepManager
from tool_shed.galaxy_install.tool_dependencies.recipe.recipe_manager import TagManager
log = logging.getLogger( __name__ )
@@ -483,7 +484,8 @@
all_required_repo_info_dict[ 'all_repo_info_dicts' ] = all_repo_info_dicts
return all_required_repo_info_dict
-def install_specified_packages( app, tool_shed_repository, tool_dependencies_config, tool_dependencies, from_tool_migration_manager=False ):
+def install_specified_tool_dependencies( app, tool_shed_repository, tool_dependencies_config, tool_dependencies,
+ from_tool_migration_manager=False ):
"""
Follow the recipe in the received tool_dependencies_config to install specified packages for
repository tools. The received list of tool_dependencies are the database records for those
@@ -502,28 +504,46 @@
log.debug( "The received tool_dependencies.xml file is likely invalid: %s" % str( error_message ) )
return installed_packages
root = tree.getroot()
+ elems = []
for elem in root:
- package_name = elem.get( 'name', None )
- package_version = elem.get( 'version', None )
- if package_name and package_version:
- # elem is a package tag set.
- attr_tup = ( package_name, package_version, 'package' )
+ if elem.tag == 'set_environment':
+ version = elem.get( 'version', '1.0' )
+ if version != '1.0':
+ raise Exception( 'The <set_environment> tag must have a version attribute with value 1.0' )
+ for sub_elem in elem:
+ elems.append( sub_elem )
+ else:
+ elems.append( elem )
+ for elem in elems:
+ name = elem.get( 'name', None )
+ version = elem.get( 'version', None )
+ type = elem.get( 'type', None )
+ if type is None:
+ if elem.tag in [ 'environment_variable', 'set_environment' ]:
+ type = 'set_environment'
+ else:
+ type = 'package'
+ if ( name and type == 'set_environment' ) or ( name and version ):
+ # elem is a package set_environment tag set.
+ attr_tup = ( name, version, type )
try:
index = attr_tups_of_dependencies_for_install.index( attr_tup )
except Exception, e:
index = None
if index is not None:
tool_dependency = tool_dependencies[ index ]
+ # If the tool_dependency.type is 'set_environment', then the call to process_tag_set() will
+ # handle everything - no additional installation is necessary.
tool_dependency, proceed_with_install, action_elem_tuples = \
tag_manager.process_tag_set( app,
tool_shed_repository,
tool_dependency,
elem,
- package_name,
- package_version,
+ name,
+ version,
from_tool_migration_manager=from_tool_migration_manager,
tool_dependency_db_records=tool_dependencies )
- if proceed_with_install:
+ if ( tool_dependency.type == 'package' and proceed_with_install ):
try:
tool_dependency = install_manager.install_package( app,
elem,
@@ -531,8 +551,8 @@
tool_dependencies=tool_dependencies,
from_tool_migration_manager=from_tool_migration_manager )
except Exception, e:
- error_message = "Error installing tool dependency package %s version %s: %s" % \
- ( str( package_name ), str( package_version ), str( e ) )
+ error_message = "Error installing tool dependency %s version %s: %s" % \
+ ( str( name ), str( version ), str( e ) )
log.exception( error_message )
if tool_dependency:
# Since there was an installation error, update the tool dependency status to Error. The
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix for installing tool dependencies with type set_environment.
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/96fdb9168f28/
Changeset: 96fdb9168f28
Branch: stable
User: greg
Date: 2014-06-03 21:34:53
Summary: Fix for installing tool dependencies with type set_environment.
Affected #: 6 files
diff -r 75efcf77476543a1f5fae8e4c7ece4b551e2eea9 -r 96fdb9168f28b2ffa463195d084c9278efb2465a lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -471,11 +471,11 @@
tool_dependencies_config = suc.get_config_from_disk( suc.TOOL_DEPENDENCY_DEFINITION_FILENAME,
tool_shed_repository.repo_path( trans.app ) )
installed_tool_dependencies = \
- common_install_util.install_specified_packages( app=trans.app,
- tool_shed_repository=tool_shed_repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=tool_dependencies,
- from_tool_migration_manager=False )
+ common_install_util.install_specified_tool_dependencies( app=trans.app,
+ tool_shed_repository=tool_shed_repository,
+ tool_dependencies_config=tool_dependencies_config,
+ tool_dependencies=tool_dependencies,
+ from_tool_migration_manager=False )
for installed_tool_dependency in installed_tool_dependencies:
if installed_tool_dependency.status == trans.app.install_model.ToolDependency.installation_status.ERROR:
text = util.unicodify( installed_tool_dependency.error_message )
diff -r 75efcf77476543a1f5fae8e4c7ece4b551e2eea9 -r 96fdb9168f28b2ffa463195d084c9278efb2465a lib/tool_shed/galaxy_install/install_manager.py
--- a/lib/tool_shed/galaxy_install/install_manager.py
+++ b/lib/tool_shed/galaxy_install/install_manager.py
@@ -182,7 +182,6 @@
a partial or full list of ToolDependency records associated with the tool_shed_repository.
"""
tag_manager = TagManager()
- sa_session = app.install_model.context
# The value of package_name should match the value of the "package" type in the tool config's
# <requirements> tag set, but it's not required.
package_name = elem.get( 'name', None )
diff -r 75efcf77476543a1f5fae8e4c7ece4b551e2eea9 -r 96fdb9168f28b2ffa463195d084c9278efb2465a lib/tool_shed/galaxy_install/tool_dependencies/recipe/recipe_manager.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/recipe/recipe_manager.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/recipe/recipe_manager.py
@@ -97,7 +97,8 @@
return tool_dependency, proceed_with_install, action_elem_tuples
def load_tag_handlers( self ):
- tag_handlers = dict( install=tag_handler.Install(),
+ tag_handlers = dict( environment_variable=tag_handler.SetEnvironment(),
+ install=tag_handler.Install(),
package=tag_handler.Package(),
readme=tag_handler.ReadMe(),
repository=tag_handler.Repository(),
diff -r 75efcf77476543a1f5fae8e4c7ece4b551e2eea9 -r 96fdb9168f28b2ffa463195d084c9278efb2465a lib/tool_shed/galaxy_install/tool_dependencies/recipe/tag_handler.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/recipe/tag_handler.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/recipe/tag_handler.py
@@ -437,9 +437,12 @@
def process_tag_set( self, app, tool_shed_repository, tool_dependency, package_elem, package_name, package_version,
from_tool_migration_manager=False, tool_dependency_db_records=None ):
+ # We need to handle two tag sets for package_elem here, this:
# <set_environment version="1.0">
# <environment_variable name="R_SCRIPT_PATH"action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
# </set_environment>
+ # or this:
+ # <environment_variable name="R_SCRIPT_PATH"action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
action_elem_tuples = []
proceed_with_install = False
if tool_dependency_db_records is None:
@@ -470,6 +473,9 @@
<set_environment version="1.0"><environment_variable name="R_SCRIPT_PATH" action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable></set_environment>
+
+ This method must also handle the sub-element tag::
+ <environment_variable name="R_SCRIPT_PATH" action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
"""
# TODO: Add support for a repository dependency definition within this tool dependency type's tag set. This should look something like
# the following. See the implementation of support for this in the tool dependency package type's method above.
@@ -485,11 +491,19 @@
tool_dependencies = []
env_var_version = elem.get( 'version', '1.0' )
tool_shed_repository_install_dir = os.path.abspath( tool_shed_repository.repo_files_directory( app ) )
- for env_var_elem in elem:
- # Althoug we're in a loop here, this method will always return only a single ToolDependency or None.
+ if elem.tag == 'environment_variable':
+ # <environment_variable name="R_SCRIPT_PATH" action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
+ elems = [ elem ]
+ else:
+ # <set_environment version="1.0">
+ # <environment_variable name="R_SCRIPT_PATH" action="set_to">$REPOSITORY_INSTALL_DIR</environment_variable>
+ # </set_environment>
+ elems = [ env_var_elem for env_var_elem in elem ]
+ for env_var_elem in elems:
env_var_name = env_var_elem.get( 'name', None )
- # The value of env_var_name must match the text value of at least 1 <requirement> tag in the tool config's <requirements> tag set whose
- # "type" attribute is "set_environment" (e.g., <requirement type="set_environment">R_SCRIPT_PATH</requirement>).
+ # The value of env_var_name must match the text value of at least 1 <requirement> tag in the
+ # tool config's <requirements> tag set whose "type" attribute is "set_environment" (e.g.,
+ # <requirement type="set_environment">R_SCRIPT_PATH</requirement>).
env_var_action = env_var_elem.get( 'action', None )
if env_var_name and env_var_action:
# Tool dependencies of type "set_environmnet" always have the version attribute set to None.
diff -r 75efcf77476543a1f5fae8e4c7ece4b551e2eea9 -r 96fdb9168f28b2ffa463195d084c9278efb2465a lib/tool_shed/galaxy_install/tool_migration_manager.py
--- a/lib/tool_shed/galaxy_install/tool_migration_manager.py
+++ b/lib/tool_shed/galaxy_install/tool_migration_manager.py
@@ -446,11 +446,11 @@
# Get the tool_dependencies.xml file from disk.
tool_dependencies_config = suc.get_config_from_disk( 'tool_dependencies.xml', repo_install_dir )
installed_tool_dependencies = \
- common_install_util.install_specified_packages( app=self.app,
- tool_shed_repository=tool_shed_repository,
- tool_dependencies_config=tool_dependencies_config,
- tool_dependencies=tool_dependencies,
- from_tool_migration_manager=True )
+ common_install_util.install_specified_tool_dependencies( app=self.app,
+ tool_shed_repository=tool_shed_repository,
+ tool_dependencies_config=tool_dependencies_config,
+ tool_dependencies=tool_dependencies,
+ from_tool_migration_manager=True )
for installed_tool_dependency in installed_tool_dependencies:
if installed_tool_dependency.status == self.app.install_model.ToolDependency.installation_status.ERROR:
print '\nThe ToolMigrationManager returned the following error while installing tool dependency ', installed_tool_dependency.name, ':'
diff -r 75efcf77476543a1f5fae8e4c7ece4b551e2eea9 -r 96fdb9168f28b2ffa463195d084c9278efb2465a lib/tool_shed/util/common_install_util.py
--- a/lib/tool_shed/util/common_install_util.py
+++ b/lib/tool_shed/util/common_install_util.py
@@ -18,6 +18,7 @@
from tool_shed.util import xml_util
from tool_shed.galaxy_install.install_manager import InstallManager
+from tool_shed.galaxy_install.tool_dependencies.recipe.recipe_manager import StepManager
from tool_shed.galaxy_install.tool_dependencies.recipe.recipe_manager import TagManager
log = logging.getLogger( __name__ )
@@ -483,7 +484,8 @@
all_required_repo_info_dict[ 'all_repo_info_dicts' ] = all_repo_info_dicts
return all_required_repo_info_dict
-def install_specified_packages( app, tool_shed_repository, tool_dependencies_config, tool_dependencies, from_tool_migration_manager=False ):
+def install_specified_tool_dependencies( app, tool_shed_repository, tool_dependencies_config, tool_dependencies,
+ from_tool_migration_manager=False ):
"""
Follow the recipe in the received tool_dependencies_config to install specified packages for
repository tools. The received list of tool_dependencies are the database records for those
@@ -502,28 +504,46 @@
log.debug( "The received tool_dependencies.xml file is likely invalid: %s" % str( error_message ) )
return installed_packages
root = tree.getroot()
+ elems = []
for elem in root:
- package_name = elem.get( 'name', None )
- package_version = elem.get( 'version', None )
- if package_name and package_version:
- # elem is a package tag set.
- attr_tup = ( package_name, package_version, 'package' )
+ if elem.tag == 'set_environment':
+ version = elem.get( 'version', '1.0' )
+ if version != '1.0':
+ raise Exception( 'The <set_environment> tag must have a version attribute with value 1.0' )
+ for sub_elem in elem:
+ elems.append( sub_elem )
+ else:
+ elems.append( elem )
+ for elem in elems:
+ name = elem.get( 'name', None )
+ version = elem.get( 'version', None )
+ type = elem.get( 'type', None )
+ if type is None:
+ if elem.tag in [ 'environment_variable', 'set_environment' ]:
+ type = 'set_environment'
+ else:
+ type = 'package'
+ if ( name and type == 'set_environment' ) or ( name and version ):
+ # elem is a package set_environment tag set.
+ attr_tup = ( name, version, type )
try:
index = attr_tups_of_dependencies_for_install.index( attr_tup )
except Exception, e:
index = None
if index is not None:
tool_dependency = tool_dependencies[ index ]
+ # If the tool_dependency.type is 'set_environment', then the call to process_tag_set() will
+ # handle everything - no additional installation is necessary.
tool_dependency, proceed_with_install, action_elem_tuples = \
tag_manager.process_tag_set( app,
tool_shed_repository,
tool_dependency,
elem,
- package_name,
- package_version,
+ name,
+ version,
from_tool_migration_manager=from_tool_migration_manager,
tool_dependency_db_records=tool_dependencies )
- if proceed_with_install:
+ if ( tool_dependency.type == 'package' and proceed_with_install ):
try:
tool_dependency = install_manager.install_package( app,
elem,
@@ -531,8 +551,8 @@
tool_dependencies=tool_dependencies,
from_tool_migration_manager=from_tool_migration_manager )
except Exception, e:
- error_message = "Error installing tool dependency package %s version %s: %s" % \
- ( str( package_name ), str( package_version ), str( e ) )
+ error_message = "Error installing tool dependency %s version %s: %s" % \
+ ( str( name ), str( version ), str( e ) )
log.exception( error_message )
if tool_dependency:
# Since there was an installation error, update the tool dependency status to Error. The
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Pes-8 fixes for the Tool Shed's repository_registry module.
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/beef22110c25/
Changeset: beef22110c25
User: greg
Date: 2014-06-03 21:19:54
Summary: Pes-8 fixes for the Tool Shed's repository_registry module.
Affected #: 1 file
diff -r da344cf4304429522fd5a214e3fc91697ca682b3 -r beef22110c25635ed18a3c24f9d94442a4a4cc9c lib/tool_shed/repository_registry.py
--- a/lib/tool_shed/repository_registry.py
+++ b/lib/tool_shed/repository_registry.py
@@ -55,7 +55,7 @@
self.certified_level_one_viewable_repositories_and_suites_by_category[ category_name ] = 0
if category_name not in self.certified_level_one_viewable_suites_by_category:
self.certified_level_one_viewable_suites_by_category[ category_name ] = 0
-
+
def add_entry( self, repository ):
try:
if repository:
@@ -156,7 +156,7 @@
model.RepositoryMetadata.table.c.changeset_revision,
latest_installable_changeset_revision ) )
return clause_list
-
+
def get_certified_level_one_tuple( self, repository ):
"""
Return True if the latest installable changeset_revision of the received repository is level one certified.
@@ -333,7 +333,7 @@
del self.certified_level_one_viewable_repositories_and_suites_by_category[ catgeory_name ]
if catgeory_name in self.certified_level_one_viewable_suites_by_category:
del self.certified_level_one_viewable_suites_by_category[ catgeory_name ]
-
+
def remove_entry( self, repository ):
try:
if repository:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix debug typo in the Tool Shed's step handler.
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/da344cf43044/
Changeset: da344cf43044
User: greg
Date: 2014-06-03 19:56:51
Summary: Fix debug typo in the Tool Shed's step handler.
Affected #: 1 file
diff -r d80f43f448db62f5444726220b74d1814f6804a7 -r da344cf4304429522fd5a214e3fc91697ca682b3 lib/tool_shed/galaxy_install/tool_dependencies/recipe/step_handler.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/recipe/step_handler.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/recipe/step_handler.py
@@ -1040,7 +1040,7 @@
filtered_actions = actions[ 1: ]
env_shell_file_paths = action_dict.get( 'env_shell_file_paths', None )
if env_shell_file_paths is None:
- log.debug( 'Missing Rerl environment, make sure your specified Rerl installation exists.' )
+ log.debug( 'Missing Perl environment, make sure your specified Rerl installation exists.' )
if initial_download:
return tool_dependency, filtered_actions, dir
return tool_dependency, None, None
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix documentation in the Tool Shed API users controller.
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d80f43f448db/
Changeset: d80f43f448db
User: greg
Date: 2014-06-03 19:53:12
Summary: Fix documentation in the Tool Shed API users controller.
Affected #: 1 file
diff -r 13ab3f66d332126c72b23290f7d458223795ffce -r d80f43f448db62f5444726220b74d1814f6804a7 lib/galaxy/webapps/tool_shed/api/users.py
--- a/lib/galaxy/webapps/tool_shed/api/users.py
+++ b/lib/galaxy/webapps/tool_shed/api/users.py
@@ -24,6 +24,8 @@
: param key: the current Galaxy admin user's API key
The following parameters are included in the payload.
+ :param email (required): the email address of the user
+ :param password (required): the password of the user
:param username (required): the public username of the user
"""
user_dict = dict( message = '',
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/31b2924315d0/
Changeset: 31b2924315d0
User: jmchilton
Date: 2014-06-03 19:48:18
Summary: Mechanism to define site-specific parameters to aid defining job destinations.
This is based on work by Hector del Risco at the University of Florida.
Various tool-style parameters can be defined in job_resource_params_conf.xml (see sample) and these define the pool of all possible resource parameters that can be injected into a tool. These can be groupped together and assigned to tools in job_conf.xml (see documented changes to job_conf.xml.sample_advanced).
A conditional is then injected into each tool that gives the end-user the ability to select these parameters. The values of these parameters (as a dict) can then be obtained by dynamic job destination that define a 'resource_params' argument.
Lots here still needs to be tested/verified - can workflows exported from Galaxies without resource parameters (or different ones, be reused in Galaxies with resource parameters) (I think yes?)? can workflows exported with resource parameters be used in other Galaxies (I think yes?), how best to present UI while running workflows? (maybe nothing needs to be changed), should exported job parameter data be swept clean (say when exporting a workflow for instance).
A great extension to this would be to support conditional when defining parameters.
Finally, the Galaxy team will make a reasonable effort to support this syntax for job_conf.xml, job_resource_params_conf.xml, and internal interface for job parameters for sometime once this changeset has reached -stable but until these interfaces may change.
Affected #: 8 files
diff -r 1d1d881508b121df607d9096386effdbe072427e -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 job_conf.xml.sample_advanced
--- a/job_conf.xml.sample_advanced
+++ b/job_conf.xml.sample_advanced
@@ -240,6 +240,15 @@
<param id="request_cpus">8</param></destination></destinations>
+ <resources default="default">
+ <!-- Group different parameters defined in job_resource_params_conf.xml
+ together and assign these groups ids. Tool section below can map
+ tools to different groups. This is experimental functionality!
+ -->
+ <group id="default"></group>
+ <group id="memoryonly">memory</group>
+ <group id="all">processors,memory,time,project</group>
+ </resources><tools><!-- Tools can be configured to use specific destinations or handlers,
identified by either the "id" or "tags" attribute. If assigned to
@@ -250,6 +259,9 @@
<param id="source">trackster</param></tool><tool id="bar" destination="dynamic"/>
+ <!-- Next example defines resource group to insert into tool interface
+ and pass to dynamic destination (as resource_params argument). -->
+ <tool id="longbar" destination="dynamic" resources="all" /><tool id="baz" handler="special_handlers" destination="bigmem"/></tools><limits>
diff -r 1d1d881508b121df607d9096386effdbe072427e -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 job_resource_params_conf.xml.sample
--- /dev/null
+++ b/job_resource_params_conf.xml.sample
@@ -0,0 +1,6 @@
+<parameters>
+ <param label="Processors" name="processors" type="integer" size="2" min="1" max="64" value="" help="Number of processing cores, 'ppn' value (1-64). Leave blank to use default value." />
+ <param label="Memory" name="memory" type="integer" size="3" min="1" max="256" value="" help="Memory size in gigabytes, 'pmem' value (1-256). Leave blank to use default value." />
+ <param label="Time" name="time" type="integer" size="3" min="1" max="744" value="" help="Maximum job time in hours, 'walltime' value (1-744). Leave blank to use default value." />
+ <param label="Project" name="project" type="text" value="" help="Project to assign resource allocation to. Leave blank to use default value." />
+</parameters>
diff -r 1d1d881508b121df607d9096386effdbe072427e -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -152,6 +152,7 @@
self.dependency_resolvers_config_file = resolve_path( kwargs.get( 'dependency_resolvers_config_file', 'dependency_resolvers_conf.xml' ), self.root )
self.job_metrics_config_file = resolve_path( kwargs.get( 'job_metrics_config_file', 'job_metrics_conf.xml' ), self.root )
self.job_config_file = resolve_path( kwargs.get( 'job_config_file', 'job_conf.xml' ), self.root )
+ self.job_resource_params_file = resolve_path( kwargs.get( 'job_resource_params_file', 'job_resource_params_conf.xml' ), self.root )
self.local_job_queue_workers = int( kwargs.get( "local_job_queue_workers", "5" ) )
self.cluster_job_queue_workers = int( kwargs.get( "cluster_job_queue_workers", "3" ) )
self.job_queue_cleanup_interval = int( kwargs.get("job_queue_cleanup_interval", "5") )
diff -r 1d1d881508b121df607d9096386effdbe072427e -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 lib/galaxy/jobs/__init__.py
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -79,6 +79,9 @@
self['params'] = dict()
super(JobToolConfiguration, self).__init__(**kwds)
+ def get_resource_group( self ):
+ return self.get( "resources", None )
+
class JobConfiguration( object ):
"""A parser and interface to advanced job management features.
@@ -99,8 +102,12 @@
self.destination_tags = {}
self.default_destination_id = None
self.tools = {}
+ self.resource_groups = {}
+ self.default_resource_group = None
+ self.resource_parameters = {}
self.limits = Bunch()
+ self.__parse_resource_parameters()
# Initialize the config
try:
tree = util.parse_xml(self.app.config.job_config_file)
@@ -190,6 +197,16 @@
# Determine the default destination
self.default_destination_id = self.__get_default(destinations, self.destinations.keys())
+ # Parse resources...
+ resources = root.find('resources')
+ if resources is not None:
+ self.default_resource_group = resources.get( "default", None )
+ for group in self.__findall_with_required(resources, 'group'):
+ id = group.get('id')
+ fields_str = group.get('fields', None) or group.text or ''
+ fields = [ f for f in fields_str.split(",") if f ]
+ self.resource_groups[ id ] = fields
+
# Parse tool mappings
tools = root.find('tools')
if tools is not None:
@@ -297,6 +314,49 @@
log.debug('Done loading job configuration')
+ def get_tool_resource_parameters( self, tool_id ):
+ """ Given a tool id, return XML elements describing parameters to
+ insert into job resources.
+
+ :tool id: A tool ID (a string)
+
+ :returns: List of parameter elements.
+ """
+ fields = []
+
+ if not tool_id:
+ return fields
+
+ # TODO: Only works with exact matches, should handle different kinds of ids
+ # the way destination lookup does.
+ resource_group = None
+ if tool_id in self.tools:
+ resource_group = self.tools[ tool_id ][ 0 ].get_resource_group()
+ resource_group = resource_group or self.default_resource_group
+
+ if resource_group and resource_group in self.resource_groups:
+ fields_names = self.resource_groups[ resource_group ]
+ fields = [ self.resource_parameters[ n ] for n in fields_names ]
+
+ return fields
+
+ def __parse_resource_parameters( self ):
+ if not os.path.exists( self.app.config.job_resource_params_file ):
+ return
+
+ resource_definitions = util.parse_xml( self.app.config.job_resource_params_file )
+ resource_definitions_root = resource_definitions.getroot()
+ # TODO: Also handling conditionals would be awesome!
+ for parameter_elem in resource_definitions_root.findall( "param" ):
+ name = parameter_elem.get( "name" )
+ # Considered prepending __job_resource_param__ here and then
+ # stripping it off when making it available to dynamic job
+ # destination. Not needed because resource parameters are wrapped
+ # in a conditional.
+ ## expanded_name = "__job_resource_param__%s" % name
+ ## parameter_elem.set( "name", expanded_name )
+ self.resource_parameters[ name ] = parameter_elem
+
def __get_default(self, parent, names):
"""Returns the default attribute set in a parent tag like <handlers> or <destinations>, or return the ID of the child, if there is no explicit default and only one child.
diff -r 1d1d881508b121df607d9096386effdbe072427e -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 lib/galaxy/jobs/mapper.py
--- a/lib/galaxy/jobs/mapper.py
+++ b/lib/galaxy/jobs/mapper.py
@@ -71,7 +71,7 @@
actual_args[ possible_arg_name ] = possible_args[ possible_arg_name ]
# Don't hit the DB to load the job object if not needed
- if "job" in function_arg_names or "user" in function_arg_names or "user_email" in function_arg_names:
+ if "job" in function_arg_names or "user" in function_arg_names or "user_email" in function_arg_names or "resource_params" in function_arg_names:
job = self.job_wrapper.get_job()
history = job.history
user = history and history.user
@@ -86,6 +86,24 @@
if "user_email" in function_arg_names:
actual_args[ "user_email" ] = user_email
+ if "resource_params" in function_arg_names:
+ # Find the dymically inserted resource parameters and give them
+ # to rule.
+ app = self.job_wrapper.app
+ param_values = job.get_param_values( app, ignore_errors=True )
+ resource_params = {}
+ try:
+ resource_params_raw = param_values[ "__job_resource" ]
+ if resource_params_raw[ "__job_resource__select" ].lower() in [ "1", "yes", "true" ]:
+ for key, value in resource_params_raw.iteritems():
+ #if key.startswith( "__job_resource_param__" ):
+ # resource_key = key[ len( "__job_resource_param__" ): ]
+ # resource_params[ resource_key ] = value
+ resource_params[ key ] = value
+ except KeyError:
+ pass
+ actual_args[ "resource_params" ] = resource_params
+
return expand_function( **actual_args )
def __convert_url_to_destination( self, url ):
diff -r 1d1d881508b121df607d9096386effdbe072427e -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -86,6 +86,16 @@
WORKFLOW_PARAMETER_REGULAR_EXPRESSION = re.compile( '''\$\{.+?\}''' )
+JOB_RESOURCE_CONDITIONAL_XML = """<conditional name="__job_resource">
+ <param name="__job_resource__select" type="select" label="Job Resource Parameters">
+ <option value="no">Use default job resource parameters</option>
+ <option value="yes">Specify job resource parameters</option>
+ </param>
+ <when value="no"></when>
+ <when value="yes">
+ </when>
+</conditional>"""
+
class ToolNotFoundException( Exception ):
pass
@@ -678,6 +688,24 @@
elif root.get( 'tool_type', None ) is not None:
ToolClass = tool_types.get( root.get( 'tool_type' ) )
else:
+ # Normal tool - only insert dynamic resource parameters for these
+ # tools.
+ if hasattr( self.app, "job_config" ): # toolshed may not have job_config?
+ tool_id = root.get( 'id' ) if root else None
+ parameters = self.app.job_config.get_tool_resource_parameters( tool_id )
+ if parameters:
+ inputs = root.find('inputs')
+ # If tool has not inputs, create some so we can insert conditional
+ if not inputs:
+ inputs = ElementTree.fromstring( "<inputs></inputs>")
+ root.append( inputs )
+ # Insert a conditional allowing user to specify resource parameters.
+ conditional_element = ElementTree.fromstring( JOB_RESOURCE_CONDITIONAL_XML )
+ when_yes_elem = conditional_element.findall( "when" )[ 1 ]
+ for parameter in parameters:
+ when_yes_elem.append( parameter )
+ inputs.append( conditional_element )
+
ToolClass = Tool
return ToolClass( config_file, root, self.app, guid=guid, repository_id=repository_id, **kwds )
diff -r 1d1d881508b121df607d9096386effdbe072427e -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 test/unit/jobs/test_job_configuration.py
--- a/test/unit/jobs/test_job_configuration.py
+++ b/test/unit/jobs/test_job_configuration.py
@@ -20,6 +20,7 @@
self.config = bunch.Bunch(
job_config_file=os.path.join( self.temp_directory, "job_conf.xml" ),
use_tasked_jobs=False,
+ job_resource_params_file="/tmp/fake_absent_path",
)
self.__write_config_from( SIMPLE_JOB_CONF )
self.app = bunch.Bunch( config=self.config, job_metrics=MockJobMetrics() )
diff -r 1d1d881508b121df607d9096386effdbe072427e -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -807,6 +807,12 @@
# individually. This only affects cluster jobs, not local jobs.
#environment_setup_file = None
+
+# Optional file containing job resource data entry fields definition.
+# These fields will be presented to users in the tool forms and allow them to
+# overwrite default job resources such as number of processors, memory, and walltime.
+#job_resource_params_file = job_resource_params_conf.xml
+
# If using job concurrency limits (configured in job_config_file), several
# extra database queries must be performed to determine the number of jobs a
# user has dispatched to a given destination. By default, these queries will
https://bitbucket.org/galaxy/galaxy-central/commits/13ab3f66d332/
Changeset: 13ab3f66d332
User: jmchilton
Date: 2014-06-03 19:48:18
Summary: Fix unit tests for 46a487e.
Affected #: 1 file
diff -r 31b2924315d0b48fa7648ab4bfd04ef754829f71 -r 13ab3f66d332126c72b23290f7d458223795ffce test/unit/jobs/test_job_configuration.py
--- a/test/unit/jobs/test_job_configuration.py
+++ b/test/unit/jobs/test_job_configuration.py
@@ -100,16 +100,17 @@
assert limits.walltime is None
assert limits.walltime_delta is None
assert limits.output_size is None
- assert limits.concurrent_jobs == {}
+ assert limits.destination_user_concurrent_jobs == {}
+ assert limits.destination_total_concurrent_jobs == {}
def test_limit_overrides( self ):
self.__with_advanced_config()
limits = self.job_config.limits
assert limits.registered_user_concurrent_jobs == 2
assert limits.anonymous_user_concurrent_jobs == 1
- assert limits.concurrent_jobs[ "local" ] == 1
- assert limits.concurrent_jobs[ "mycluster" ] == 2
- assert limits.concurrent_jobs[ "longjobs" ] == 1
+ assert limits.destination_user_concurrent_jobs[ "local" ] == 1
+ assert limits.destination_user_concurrent_jobs[ "mycluster" ] == 2
+ assert limits.destination_user_concurrent_jobs[ "longjobs" ] == 1
assert limits.walltime_delta == datetime.timedelta( 0, 0, 0, 0, 0, 24 )
def test_env_parsing( self ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: History panel: allow multi-select with shift key to select range of datasets
by commits-noreply@bitbucket.org 03 Jun '14
by commits-noreply@bitbucket.org 03 Jun '14
03 Jun '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1d1d881508b1/
Changeset: 1d1d881508b1
User: carlfeberhard
Date: 2014-06-03 17:20:15
Summary: History panel: allow multi-select with shift key to select range of datasets
Affected #: 10 files
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/mvc/collection/dataset-collection-base.js
--- a/static/scripts/mvc/collection/dataset-collection-base.js
+++ b/static/scripts/mvc/collection/dataset-collection-base.js
@@ -39,41 +39,39 @@
templateSkeleton : function (){
return [
'<div class="dataset hda">',
- ' <div class="dataset-warnings">',
- '<% if ( deleted ) { %>',
- ' <div class="dataset-deleted-msg warningmessagesmall"><strong>',
- ' This dataset has been deleted.', // Localize?
- ' </div>',
- '<% } %>',
- '<% if ( ! visible ) { %>',
- ' <div class="dataset-hidden-msg warningmessagesmall"><strong>',
- ' This dataset has been hidden.', // Localize?
- ' </div>',
- '<% } %>',
- ' </div>',
- ' <div class="dataset-selector"><span class="fa fa-2x fa-square-o"></span></div>',
- ' <div class="dataset-primary-actions"></div>',
- ' <div class="dataset-title-bar clear" tabindex="0">',
- ' <span class="dataset-state-icon state-icon"></span>',
- ' <div class="dataset-title">',
- ' <span class="hda-hid"><%= hid %></span>',
- ' <span class="dataset-name"><%= name %></span>',
- ' </div>',
- ' </div>',
- ' <div class="dataset-body"></div>',
- '</div>',
+ '<div class="dataset-warnings">',
+ '<% if ( deleted ) { %>',
+ '<div class="dataset-deleted-msg warningmessagesmall"><strong>',
+ _l( 'This dataset has been deleted.' ),
+ '</div>',
+ '<% } %>',
+ '<% if ( ! visible ) { %>',
+ '<div class="dataset-hidden-msg warningmessagesmall"><strong>',
+ _l( 'This dataset has been hidden.' ),
+ '</div>',
+ '<% } %>',
+ '</div>',
+ '<div class="dataset-selector"><span class="fa fa-2x fa-square-o"></span></div>',
+ '<div class="dataset-primary-actions"></div>',
+ '<div class="dataset-title-bar clear" tabindex="0">',
+ '<span class="dataset-state-icon state-icon"></span>',
+ '<div class="dataset-title">',
+ '<span class="hda-hid"><%= hid %></span> ',
+ '<span class="dataset-name"><%= name %></span>',
+ '</div>',
+ '</div>',
+ '<div class="dataset-body"></div>',
+ '</div>'
].join( '' );
},
templateBody : function() {
return [
'<div class="dataset-body">',
- ' <div class="dataset-summary">',
- ' A dataset collection.',
- ' </div>',
-
+ '<div class="dataset-summary">',
+ 'A dataset collection.',
+ '</div>'
].join( '' );
-
},
_buildNewRender : function(){
@@ -170,8 +168,7 @@
*/
_render_body_ok : function(){
// most common state renderer and the most complicated
- var view = this,
- $body = $( _.template(this.templateBody(), this.model.toJSON() ) )
+ var $body = $( _.template( this.templateBody(), this.model.toJSON() ) );
// return shortened form if del'd (no display apps or peek?)
if( this.model.get( 'deleted' ) ){
@@ -188,4 +185,4 @@
DatasetCollectionBaseView : DatasetCollectionBaseView
};
-});
\ No newline at end of file
+});
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/mvc/collection/dataset-collection-edit.js
--- a/static/scripts/mvc/collection/dataset-collection-edit.js
+++ b/static/scripts/mvc/collection/dataset-collection-edit.js
@@ -57,7 +57,7 @@
}
deleteBtnData.faIcon = 'fa-times';
return faIconButton( deleteBtnData );
- },
+ }
});
@@ -66,4 +66,4 @@
DatasetCollectionEditView : DatasetCollectionEditView
};
-});
\ No newline at end of file
+});
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -47,7 +47,7 @@
}
if( this.draggable ){ this.draggableOn(); }
next();
- });
+ });
},
/** Show or hide the body/details of history content.
@@ -117,7 +117,7 @@
this.$el.find( '.dataset-selector span' )
.removeClass( 'fa-square-o' ).addClass( 'fa-check-square-o' );
if( !this.selected ){
- this.trigger( 'selected', this );
+ this.trigger( 'selected', this, event );
this.selected = true;
}
return false;
@@ -130,7 +130,7 @@
this.$el.find( '.dataset-selector span' )
.removeClass( 'fa-check-square-o' ).addClass( 'fa-square-o' );
if( this.selected ){
- this.trigger( 'de-selected', this );
+ this.trigger( 'de-selected', this, event );
this.selected = false;
}
return false;
@@ -142,7 +142,7 @@
} else {
this.select( event );
}
- },
+ }
});
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/mvc/history/history-panel.js
--- a/static/scripts/mvc/history/history-panel.js
+++ b/static/scripts/mvc/history/history-panel.js
@@ -45,6 +45,8 @@
// ---- set up instance vars
/** selected hda ids */
this.selectedHdaIds = [];
+ /** last selected hda */
+ this.lastSelectedViewId = null;
/** editor for tags - sub-view */
this.tagsEditor = null;
@@ -275,7 +277,7 @@
historyContentType = hda.get( 'history_content_type' ),
hdaView = null;
- if( historyContentType == "dataset" ) {
+ if( historyContentType === "dataset" ) {
hdaView = new this.HDAViewClass({
model : hda,
linkTarget : this.linkTarget,
@@ -288,7 +290,7 @@
tagsEditorShown : ( this.tagsEditor && !this.tagsEditor.hidden ),
annotationEditorShown : ( this.annotationEditor && !this.annotationEditor.hidden )
});
- } else if ( historyContentType == "dataset_collection" ) {
+ } else if ( historyContentType === "dataset_collection" ) {
hdaView = new datasetCollectionEdit.DatasetCollectionEditView({
model : hda,
linkTarget : this.linkTarget,
@@ -311,12 +313,33 @@
readonlyPanel.ReadOnlyHistoryPanel.prototype._setUpHdaListeners.call( this, hdaView );
// maintain a list of hdas that are selected
- hdaView.on( 'selected', function( hdaView ){
- var id = hdaView.model.get( 'id' );
- historyView.selectedHdaIds = _.union( historyView.selectedHdaIds, [ id ] );
+ hdaView.on( 'selected', function( hdaView, event ){
+ if( !event ){ return; }
+ //console.debug( 'selected', event );
+ var selectedIds = [];
+ //console.debug( historyView.lastSelectedViewId, historyView.hdaViews[ historyView.lastSelectedViewId ] );
+
+ // shift will select a range, but not set lastSelectedViewId
+ if( ( event.shiftKey )
+ && ( historyView.lastSelectedViewId && _.has( historyView.hdaViews, historyView.lastSelectedViewId ) ) ){
+ var lastSelectedView = historyView.hdaViews[ historyView.lastSelectedViewId ];
+ selectedIds = historyView.selectDatasetRange( hdaView, lastSelectedView )
+ .map( function( view ){ return view.model.id; });
+
+ // only
+ } else {
+ var id = hdaView.model.get( 'id' );
+ historyView.lastSelectedViewId = id;
+ //console.debug( 'lastSelectedViewId:', historyView.lastSelectedViewId );
+ selectedIds = [ id ];
+ }
+ //console.debug( 'selectedIds:', selectedIds );
+ historyView.selectedHdaIds = _.union( historyView.selectedHdaIds, selectedIds );
+ //TODO: might want to use getSelectedHdaViews instead managing these lists with ops
//console.debug( 'selected', historyView.selectedHdaIds );
});
- hdaView.on( 'de-selected', function( hdaView ){
+ hdaView.on( 'de-selected', function( hdaView, event ){
+ //console.debug( 'de-selected', event );
var id = hdaView.model.get( 'id' );
historyView.selectedHdaIds = _.without( historyView.selectedHdaIds, id );
//console.debug( 'de-selected', historyView.selectedHdaIds );
@@ -386,6 +409,7 @@
view.showSelector();
});
this.selectedHdaIds = [];
+ this.lastSelectedViewId = null;
},
/** hide selectors on all visible hdas and associated controls */
@@ -397,6 +421,7 @@
view.hideSelector();
});
this.selectedHdaIds = [];
+ this.lastSelectedViewId = null;
},
/** show or hide selectors on all visible hdas and associated controls */
@@ -417,11 +442,21 @@
/** deselect all visible hdas */
deselectAllDatasets : function( event ){
+ this.lastSelectedViewId = null;
_.each( this.hdaViews, function( view ){
view.deselect( event );
});
},
+ /** select a range of datasets between A and B */
+ selectDatasetRange : function( viewA, viewB ){
+ var range = this.hdaViewRange( viewA, viewB );
+ _.each( range, function( view ){
+ view.select();
+ });
+ return range;
+ },
+
/** return an array of all currently selected hdas */
getSelectedHdaViews : function(){
return _.filter( this.hdaViews, function( v ){
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/mvc/history/readonly-history-panel.js
--- a/static/scripts/mvc/history/readonly-history-panel.js
+++ b/static/scripts/mvc/history/readonly-history-panel.js
@@ -613,7 +613,7 @@
var hdaId = hda.get( 'id' ),
historyContentType = hda.get( "history_content_type" ),
hdaView = null;
- if( historyContentType == "dataset" ) {
+ if( historyContentType === "dataset" ){
hdaView = new this.HDAViewClass({
model : hda,
linkTarget : this.linkTarget,
@@ -717,6 +717,38 @@
// return ( model )?( this.hdaViews[ model.id ] ):( undefined );
//},
+ hdaViewRange : function( viewA, viewB ){
+ //console.debug( 'a: ', viewA, viewA.model );
+ //console.debug( 'b: ', viewB, viewB.model );
+ if( viewA === viewB ){ return [ viewA ]; }
+ //TODO: would probably be better if we cache'd the views as an ordered list (as well as a map)
+ var panel = this,
+ withinSet = false,
+ set = [];
+ this.model.hdas.getVisible(
+ this.storage.get( 'show_deleted' ),
+ this.storage.get( 'show_hidden' ),
+ this.filters
+ ).each( function( hda ){
+ //console.debug( 'checking: ', hda.get( 'name' ) );
+ if( withinSet ){
+ //console.debug( '\t\t adding: ', hda.get( 'name' ) );
+ set.push( panel.hdaViews[ hda.id ] );
+ if( hda === viewA.model || hda === viewB.model ){
+ //console.debug( '\t found last: ', hda.get( 'name' ) );
+ withinSet = false;
+ }
+ } else {
+ if( hda === viewA.model || hda === viewB.model ){
+ //console.debug( 'found first: ', hda.get( 'name' ) );
+ withinSet = true;
+ set.push( panel.hdaViews[ hda.id ] );
+ }
+ }
+ });
+ return set;
+ },
+
// ------------------------------------------------------------------------ panel events
/** event map */
events : {
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/packed/mvc/collection/dataset-collection-base.js
--- a/static/scripts/packed/mvc/collection/dataset-collection-base.js
+++ b/static/scripts/packed/mvc/collection/dataset-collection-base.js
@@ -1,1 +1,1 @@
-define(["mvc/dataset/hda-model","mvc/dataset/hda-base"],function(b,a){var c=a.HistoryContentBaseView.extend({className:"dataset hda history-panel-hda",id:function(){return"hdca-"+this.model.get("id")},initialize:function(d){if(d.logger){this.logger=this.model.logger=d.logger}this.log(this+".initialize:",d);this.selectable=d.selectable||false;this.selected=d.selected||false;this.expanded=d.expanded||false},render:function(e){var d=this._buildNewRender();this._queueNewRender(d,e);return this},templateSkeleton:function(){return['<div class="dataset hda">',' <div class="dataset-warnings">',"<% if ( deleted ) { %>",' <div class="dataset-deleted-msg warningmessagesmall"><strong>'," This dataset has been deleted."," </div>","<% } %>","<% if ( ! visible ) { %>",' <div class="dataset-hidden-msg warningmessagesmall"><strong>'," This dataset has been hidden."," </div>","<% } %>"," </div>",' <div class="dataset-selector"><span class="fa fa-2x fa-square-o"></span></div>',' <div class="dataset-primary-actions"></div>',' <div class="dataset-title-bar clear" tabindex="0">',' <span class="dataset-state-icon state-icon"></span>',' <div class="dataset-title">',' <span class="hda-hid"><%= hid %></span>',' <span class="dataset-name"><%= name %></span>'," </div>"," </div>",' <div class="dataset-body"></div>',"</div>",].join("")},templateBody:function(){return['<div class="dataset-body">',' <div class="dataset-summary">'," A dataset collection."," </div>",].join("")},_buildNewRender:function(){var d=$(_.template(this.templateSkeleton(),this.model.toJSON()));d.find(".dataset-primary-actions").append(this._render_titleButtons());d.children(".dataset-body").replaceWith(this._render_body());this._setUpBehaviors(d);return d},_render_titleButtons:function(){return[]},_render_body:function(){var e=$('<div>Error: unknown state "'+this.model.get("state")+'".</div>'),d=this["_render_body_"+this.model.get("state")];if(_.isFunction(d)){e=d.call(this)}this._setUpBehaviors(e);if(this.expanded){e.show()}return e},_setUpBehaviors:function(d){d=d||this.$el;make_popup_menus(d);d.find("[title]").tooltip({placement:"bottom"})},events:{"click .dataset-title-bar":"toggleBodyVisibility","keydown .dataset-title-bar":"toggleBodyVisibility","click .dataset-selector":"toggleSelect"},expandBody:function(){var d=this;function e(){d.$el.children(".dataset-body").replaceWith(d._render_body());d.$el.children(".dataset-body").slideDown(d.fxSpeed,function(){d.expanded=true;d.trigger("body-expanded",d.model.get("id"))})}e()},collapseBody:function(){var d=this;this.$el.children(".dataset-body").slideUp(d.fxSpeed,function(){d.expanded=false;d.trigger("body-collapsed",d.model.get("id"))})},_render_body_ok:function(){var d=this,e=$(_.template(this.templateBody(),this.model.toJSON()));if(this.model.get("deleted")){return e}return e}});return{DatasetCollectionBaseView:c}});
\ No newline at end of file
+define(["mvc/dataset/hda-model","mvc/dataset/hda-base"],function(b,a){var c=a.HistoryContentBaseView.extend({className:"dataset hda history-panel-hda",id:function(){return"hdca-"+this.model.get("id")},initialize:function(d){if(d.logger){this.logger=this.model.logger=d.logger}this.log(this+".initialize:",d);this.selectable=d.selectable||false;this.selected=d.selected||false;this.expanded=d.expanded||false},render:function(e){var d=this._buildNewRender();this._queueNewRender(d,e);return this},templateSkeleton:function(){return['<div class="dataset hda">','<div class="dataset-warnings">',"<% if ( deleted ) { %>",'<div class="dataset-deleted-msg warningmessagesmall"><strong>',_l("This dataset has been deleted."),"</div>","<% } %>","<% if ( ! visible ) { %>",'<div class="dataset-hidden-msg warningmessagesmall"><strong>',_l("This dataset has been hidden."),"</div>","<% } %>","</div>",'<div class="dataset-selector"><span class="fa fa-2x fa-square-o"></span></div>','<div class="dataset-primary-actions"></div>','<div class="dataset-title-bar clear" tabindex="0">','<span class="dataset-state-icon state-icon"></span>','<div class="dataset-title">','<span class="hda-hid"><%= hid %></span> ','<span class="dataset-name"><%= name %></span>',"</div>","</div>",'<div class="dataset-body"></div>',"</div>"].join("")},templateBody:function(){return['<div class="dataset-body">','<div class="dataset-summary">',"A dataset collection.","</div>"].join("")},_buildNewRender:function(){var d=$(_.template(this.templateSkeleton(),this.model.toJSON()));d.find(".dataset-primary-actions").append(this._render_titleButtons());d.children(".dataset-body").replaceWith(this._render_body());this._setUpBehaviors(d);return d},_render_titleButtons:function(){return[]},_render_body:function(){var e=$('<div>Error: unknown state "'+this.model.get("state")+'".</div>'),d=this["_render_body_"+this.model.get("state")];if(_.isFunction(d)){e=d.call(this)}this._setUpBehaviors(e);if(this.expanded){e.show()}return e},_setUpBehaviors:function(d){d=d||this.$el;make_popup_menus(d);d.find("[title]").tooltip({placement:"bottom"})},events:{"click .dataset-title-bar":"toggleBodyVisibility","keydown .dataset-title-bar":"toggleBodyVisibility","click .dataset-selector":"toggleSelect"},expandBody:function(){var d=this;function e(){d.$el.children(".dataset-body").replaceWith(d._render_body());d.$el.children(".dataset-body").slideDown(d.fxSpeed,function(){d.expanded=true;d.trigger("body-expanded",d.model.get("id"))})}e()},collapseBody:function(){var d=this;this.$el.children(".dataset-body").slideUp(d.fxSpeed,function(){d.expanded=false;d.trigger("body-collapsed",d.model.get("id"))})},_render_body_ok:function(){var d=$(_.template(this.templateBody(),this.model.toJSON()));if(this.model.get("deleted")){return d}return d}});return{DatasetCollectionBaseView:c}});
\ No newline at end of file
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/packed/mvc/collection/dataset-collection-edit.js
--- a/static/scripts/packed/mvc/collection/dataset-collection-edit.js
+++ b/static/scripts/packed/mvc/collection/dataset-collection-edit.js
@@ -1,1 +1,1 @@
-define(["mvc/dataset/hda-model","mvc/collection/dataset-collection-base",],function(b,c){var a=c.DatasetCollectionBaseView.extend({initialize:function(d){c.DatasetCollectionBaseView.prototype.initialize.call(this,d)},_render_titleButtons:function(){return c.DatasetCollectionBaseView.prototype._render_titleButtons.call(this).concat([this._render_deleteButton()])},_render_deleteButton:function(){if((this.model.get("state")===b.HistoryDatasetAssociation.STATES.NEW)||(this.model.get("state")===b.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var d=this,e={title:_l("Delete"),classes:"dataset-delete",onclick:function(){d.$el.find(".icon-btn.dataset-delete").trigger("mouseout");d.model["delete"]()}};if(this.model.get("deleted")){e={title:_l("Dataset collection is already deleted"),disabled:true}}e.faIcon="fa-times";return faIconButton(e)},});return{DatasetCollectionEditView:a}});
\ No newline at end of file
+define(["mvc/dataset/hda-model","mvc/collection/dataset-collection-base",],function(b,c){var a=c.DatasetCollectionBaseView.extend({initialize:function(d){c.DatasetCollectionBaseView.prototype.initialize.call(this,d)},_render_titleButtons:function(){return c.DatasetCollectionBaseView.prototype._render_titleButtons.call(this).concat([this._render_deleteButton()])},_render_deleteButton:function(){if((this.model.get("state")===b.HistoryDatasetAssociation.STATES.NEW)||(this.model.get("state")===b.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var d=this,e={title:_l("Delete"),classes:"dataset-delete",onclick:function(){d.$el.find(".icon-btn.dataset-delete").trigger("mouseout");d.model["delete"]()}};if(this.model.get("deleted")){e={title:_l("Dataset collection is already deleted"),disabled:true}}e.faIcon="fa-times";return faIconButton(e)}});return{DatasetCollectionEditView:a}});
\ No newline at end of file
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/packed/mvc/dataset/hda-base.js
--- a/static/scripts/packed/mvc/dataset/hda-base.js
+++ b/static/scripts/packed/mvc/dataset/hda-base.js
@@ -1,1 +1,1 @@
-define(["mvc/dataset/hda-model","mvc/base-mvc","mvc/data","utils/localization"],function(e,b,g,d){var h=Backbone.View.extend(b.LoggableMixin).extend({tagName:"div",fxSpeed:"fast",_queueNewRender:function(j,k){k=(k===undefined)?(true):(k);var i=this;if(k){$(i).queue(function(l){this.$el.fadeOut(i.fxSpeed,l)})}$(i).queue(function(l){this.$el.empty().attr("class",i.className).addClass("state-"+i.model.get("state")).append(j.children());if(this.selectable){this.showSelector(0)}l()});if(k){$(i).queue(function(l){this.$el.fadeIn(i.fxSpeed,l)})}$(i).queue(function(l){this.trigger("rendered",i);if(this.model.inReadyState()){this.trigger("rendered:ready",i)}if(this.draggable){this.draggableOn()}l()})},toggleBodyVisibility:function(l,j){var i=32,k=13;if(l&&(l.type==="keydown")&&!(l.keyCode===i||l.keyCode===k)){return true}var m=this.$el.find(".dataset-body");j=(j===undefined)?(!m.is(":visible")):(j);if(j){this.expandBody()}else{this.collapseBody()}return false},showSelector:function(){if(this.selected){this.select(null,true)}this.selectable=true;this.trigger("selectable",true,this);this.$(".dataset-primary-actions").hide();this.$(".dataset-selector").show()},hideSelector:function(){this.selectable=false;this.trigger("selectable",false,this);this.$(".dataset-selector").hide();this.$(".dataset-primary-actions").show()},toggleSelector:function(){if(!this.$el.find(".dataset-selector").is(":visible")){this.showSelector()}else{this.hideSelector()}},select:function(i){this.$el.find(".dataset-selector span").removeClass("fa-square-o").addClass("fa-check-square-o");if(!this.selected){this.trigger("selected",this);this.selected=true}return false},deselect:function(i){this.$el.find(".dataset-selector span").removeClass("fa-check-square-o").addClass("fa-square-o");if(this.selected){this.trigger("de-selected",this);this.selected=false}return false},toggleSelect:function(i){if(this.selected){this.deselect(i)}else{this.select(i)}},});var c=h.extend({className:"dataset hda history-panel-hda",id:function(){return"hda-"+this.model.get("id")},initialize:function(i){if(i.logger){this.logger=this.model.logger=i.logger}this.log(this+".initialize:",i);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];this.linkTarget=i.linkTarget||"_blank";this.selectable=i.selectable||false;this.selected=i.selected||false;this.expanded=i.expanded||false;this.draggable=i.draggable||false;this._setUpListeners()},_setUpListeners:function(){this.model.on("change",function(j,i){if(this.model.changedAttributes().state&&this.model.inReadyState()&&this.expanded&&!this.model.hasDetails()){this.model.fetch()}else{this.render()}},this)},render:function(j){this.$el.find("[title]").tooltip("destroy");this.urls=this.model.urls();var i=this._buildNewRender();this._queueNewRender(i,j);return this},_buildNewRender:function(){var i=$(c.templates.skeleton(this.model.toJSON()));i.find(".dataset-primary-actions").append(this._render_titleButtons());i.children(".dataset-body").replaceWith(this._render_body());this._setUpBehaviors(i);return i},_setUpBehaviors:function(i){i=i||this.$el;make_popup_menus(i);i.find("[title]").tooltip({placement:"bottom"})},_render_titleButtons:function(){return[this._render_displayButton()]},_render_displayButton:function(){if((this.model.get("state")===e.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(this.model.get("state")===e.HistoryDatasetAssociation.STATES.DISCARDED)||(!this.model.get("accessible"))){return null}var j={target:this.linkTarget,classes:"dataset-display"};if(this.model.get("purged")){j.disabled=true;j.title=d("Cannot display datasets removed from disk")}else{if(this.model.get("state")===e.HistoryDatasetAssociation.STATES.UPLOAD){j.disabled=true;j.title=d("This dataset must finish uploading before it can be viewed")}else{if(this.model.get("state")===e.HistoryDatasetAssociation.STATES.NEW){j.disabled=true;j.title=d("This dataset is not yet viewable")}else{j.title=d("View data");j.href=this.urls.display;var i=this;j.onclick=function(k){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Data Viewer: "+i.model.get("name"),type:"other",content:function(l){var m=new g.TabularDataset({id:i.model.id});$.when(m.fetch()).then(function(){g.createTabularDatasetChunkedView({model:m,parent_elt:l,embedded:true,height:"100%"})})}});k.preventDefault()}}}}}j.faIcon="fa-eye";return faIconButton(j)},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var j=this.urls,k=this.model.get("meta_files");if(_.isEmpty(k)){return $(['<a href="'+j.download+'" title="'+d("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>',"</a>"].join(""))}var l="dataset-"+this.model.get("id")+"-popup",i=['<div popupmenu="'+l+'">','<a href="'+j.download+'">',d("Download dataset"),"</a>","<a>"+d("Additional files")+"</a>",_.map(k,function(m){return['<a class="action-button" href="',j.meta_download+m.file_type,'">',d("Download")," ",m.file_type,"</a>"].join("")}).join("\n"),"</div>",'<div class="icon-btn-group">','<a href="'+j.download+'" title="'+d("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>','</a><a class="icon-btn popup" id="'+l+'">','<span class="fa fa-caret-down"></span>',"</a>","</div>"].join("\n");return $(i)},_render_showParamsButton:function(){return faIconButton({title:d("View details"),classes:"dataset-params-btn",href:this.urls.show_params,target:this.linkTarget,faIcon:"fa-info-circle"})},_render_body:function(){var j=$('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'),i=this["_render_body_"+this.model.get("state")];if(_.isFunction(i)){j=i.call(this)}this._setUpBehaviors(j);if(this.expanded){j.show()}return j},_render_stateBodyHelper:function(i,l){l=l||[];var j=this,k=$(c.templates.body(_.extend(this.model.toJSON(),{body:i})));k.find(".dataset-actions .left").append(_.map(l,function(m){return m.call(j)}));return k},_render_body_new:function(){return this._render_stateBodyHelper("<div>"+d("This is a new dataset and not all of its data are available yet")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_noPermission:function(){return this._render_stateBodyHelper("<div>"+d("You do not have permission to view this dataset")+"</div>")},_render_body_discarded:function(){return this._render_stateBodyHelper("<div>"+d("The job creating this dataset was cancelled before completion")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_queued:function(){return this._render_stateBodyHelper("<div>"+d("This job is waiting to run")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_upload:function(){return this._render_stateBodyHelper("<div>"+d("This dataset is currently uploading")+"</div>")},_render_body_setting_metadata:function(){return this._render_stateBodyHelper("<div>"+d("Metadata is being auto-detected")+"</div>")},_render_body_running:function(){return this._render_stateBodyHelper("<div>"+d("This job is currently running")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_paused:function(){return this._render_stateBodyHelper("<div>"+d('This job is paused. Use the "Resume Paused Jobs" in the history menu to resume')+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_error:function(){var i=['<span class="help-text">',d("An error occurred with this dataset"),":</span>",'<div class="job-error-text">',$.trim(this.model.get("misc_info")),"</div>"].join("");if(!this.model.get("purged")){i="<div>"+this.model.get("misc_blurb")+"</div>"+i}return this._render_stateBodyHelper(i,[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers))},_render_body_empty:function(){return this._render_stateBodyHelper("<div>"+d("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>",this.defaultPrimaryActionButtonRenderers)},_render_body_failed_metadata:function(){var i=$('<div class="warningmessagesmall"></div>').append($("<strong/>").text(d("An error occurred setting the metadata for this dataset"))),j=this._render_body_ok();j.prepend(i);return j},_render_body_ok:function(){var i=this,k=$(c.templates.body(this.model.toJSON())),j=[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers);k.find(".dataset-actions .left").append(_.map(j,function(l){return l.call(i)}));if(this.model.isDeletedOrPurged()){return k}return k},events:{"click .dataset-title-bar":"toggleBodyVisibility","keydown .dataset-title-bar":"toggleBodyVisibility","click .dataset-selector":"toggleSelect"},expandBody:function(){var i=this;function j(){i.$el.children(".dataset-body").replaceWith(i._render_body());i.$el.children(".dataset-body").slideDown(i.fxSpeed,function(){i.expanded=true;i.trigger("body-expanded",i.model.get("id"))})}if(this.model.inReadyState()&&!this.model.hasDetails()){this.model.fetch({silent:true}).always(function(k){i.urls=i.model.urls();j()})}else{j()}},collapseBody:function(){var i=this;this.$el.children(".dataset-body").slideUp(i.fxSpeed,function(){i.expanded=false;i.trigger("body-collapsed",i.model.get("id"))})},draggableOn:function(){this.draggable=true;this.dragStartHandler=_.bind(this._dragStartHandler,this);this.dragEndHandler=_.bind(this._dragEndHandler,this);var i=this.$el.find(".dataset-title-bar").attr("draggable",true).get(0);i.addEventListener("dragstart",this.dragStartHandler,false);i.addEventListener("dragend",this.dragEndHandler,false)},draggableOff:function(){this.draggable=false;var i=this.$el.find(".dataset-title-bar").attr("draggable",false).get(0);i.removeEventListener("dragstart",this.dragStartHandler,false);i.removeEventListener("dragend",this.dragEndHandler,false)},toggleDraggable:function(){if(this.draggable){this.draggableOff()}else{this.draggableOn()}},_dragStartHandler:function(i){this.trigger("dragstart",this);i.dataTransfer.effectAllowed="move";i.dataTransfer.setData("text",JSON.stringify(this.model.toJSON()));return false},_dragEndHandler:function(i){this.trigger("dragend",this);return false},remove:function(j){var i=this;this.$el.fadeOut(i.fxSpeed,function(){i.$el.remove();i.off();if(j){j()}})},toString:function(){var i=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+i+")"}});var a=_.template(['<div class="dataset hda">','<div class="dataset-warnings">',"<% if( hda.error ){ %>",'<div class="errormessagesmall">',d("There was an error getting the data for this dataset"),":<%- hda.error %>","</div>","<% } %>","<% if( hda.deleted ){ %>","<% if( hda.purged ){ %>",'<div class="dataset-purged-msg warningmessagesmall"><strong>',d("This dataset has been deleted and removed from disk")+".","</strong></div>","<% } else { %>",'<div class="dataset-deleted-msg warningmessagesmall"><strong>',d("This dataset has been deleted")+".","</strong></div>","<% } %>","<% } %>","<% if( !hda.visible ){ %>",'<div class="dataset-hidden-msg warningmessagesmall"><strong>',d("This dataset has been hidden")+".","</strong></div>","<% } %>","</div>",'<div class="dataset-selector">','<span class="fa fa-2x fa-square-o"></span>',"</div>",'<div class="dataset-primary-actions"></div>','<div class="dataset-title-bar clear" tabindex="0">','<span class="dataset-state-icon state-icon"></span>','<div class="dataset-title">','<span class="hda-hid"><%- hda.hid %></span> ','<span class="dataset-name"><%- hda.name %></span>',"</div>","</div>",'<div class="dataset-body"></div>',"</div>"].join(""));var f=_.template(['<div class="dataset-body">',"<% if( hda.body ){ %>",'<div class="dataset-summary">',"<%= hda.body %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% } else { %>",'<div class="dataset-summary">',"<% if( hda.misc_blurb ){ %>",'<div class="dataset-blurb">','<span class="value"><%- hda.misc_blurb %></span>',"</div>","<% } %>","<% if( hda.data_type ){ %>",'<div class="dataset-datatype">','<label class="prompt">',d("format"),"</label>",'<span class="value"><%- hda.data_type %></span>',"</div>","<% } %>","<% if( hda.metadata_dbkey ){ %>",'<div class="dataset-dbkey">','<label class="prompt">',d("database"),"</label>",'<span class="value">',"<%- hda.metadata_dbkey %>","</span>","</div>","<% } %>","<% if( hda.misc_info ){ %>",'<div class="dataset-info">','<span class="value"><%- hda.misc_info %></span>',"</div>","<% } %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% if( !hda.deleted ){ %>",'<div class="tags-display"></div>','<div class="annotation-display"></div>','<div class="dataset-display-applications">',"<% _.each( hda.display_apps, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","<% _.each( hda.display_types, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","</div>",'<div class="dataset-peek">',"<% if( hda.peek ){ %>",'<pre class="peek"><%= hda.peek %></pre>',"<% } %>","</div>","<% } %>","<% } %>","</div>"].join(""));c.templates={skeleton:function(i){return a({_l:d,hda:i})},body:function(i){return f({_l:d,hda:i})}};return{HistoryContentBaseView:h,HDABaseView:c}});
\ No newline at end of file
+define(["mvc/dataset/hda-model","mvc/base-mvc","mvc/data","utils/localization"],function(e,b,g,d){var h=Backbone.View.extend(b.LoggableMixin).extend({tagName:"div",fxSpeed:"fast",_queueNewRender:function(j,k){k=(k===undefined)?(true):(k);var i=this;if(k){$(i).queue(function(l){this.$el.fadeOut(i.fxSpeed,l)})}$(i).queue(function(l){this.$el.empty().attr("class",i.className).addClass("state-"+i.model.get("state")).append(j.children());if(this.selectable){this.showSelector(0)}l()});if(k){$(i).queue(function(l){this.$el.fadeIn(i.fxSpeed,l)})}$(i).queue(function(l){this.trigger("rendered",i);if(this.model.inReadyState()){this.trigger("rendered:ready",i)}if(this.draggable){this.draggableOn()}l()})},toggleBodyVisibility:function(l,j){var i=32,k=13;if(l&&(l.type==="keydown")&&!(l.keyCode===i||l.keyCode===k)){return true}var m=this.$el.find(".dataset-body");j=(j===undefined)?(!m.is(":visible")):(j);if(j){this.expandBody()}else{this.collapseBody()}return false},showSelector:function(){if(this.selected){this.select(null,true)}this.selectable=true;this.trigger("selectable",true,this);this.$(".dataset-primary-actions").hide();this.$(".dataset-selector").show()},hideSelector:function(){this.selectable=false;this.trigger("selectable",false,this);this.$(".dataset-selector").hide();this.$(".dataset-primary-actions").show()},toggleSelector:function(){if(!this.$el.find(".dataset-selector").is(":visible")){this.showSelector()}else{this.hideSelector()}},select:function(i){this.$el.find(".dataset-selector span").removeClass("fa-square-o").addClass("fa-check-square-o");if(!this.selected){this.trigger("selected",this,i);this.selected=true}return false},deselect:function(i){this.$el.find(".dataset-selector span").removeClass("fa-check-square-o").addClass("fa-square-o");if(this.selected){this.trigger("de-selected",this,i);this.selected=false}return false},toggleSelect:function(i){if(this.selected){this.deselect(i)}else{this.select(i)}}});var c=h.extend({className:"dataset hda history-panel-hda",id:function(){return"hda-"+this.model.get("id")},initialize:function(i){if(i.logger){this.logger=this.model.logger=i.logger}this.log(this+".initialize:",i);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];this.linkTarget=i.linkTarget||"_blank";this.selectable=i.selectable||false;this.selected=i.selected||false;this.expanded=i.expanded||false;this.draggable=i.draggable||false;this._setUpListeners()},_setUpListeners:function(){this.model.on("change",function(j,i){if(this.model.changedAttributes().state&&this.model.inReadyState()&&this.expanded&&!this.model.hasDetails()){this.model.fetch()}else{this.render()}},this)},render:function(j){this.$el.find("[title]").tooltip("destroy");this.urls=this.model.urls();var i=this._buildNewRender();this._queueNewRender(i,j);return this},_buildNewRender:function(){var i=$(c.templates.skeleton(this.model.toJSON()));i.find(".dataset-primary-actions").append(this._render_titleButtons());i.children(".dataset-body").replaceWith(this._render_body());this._setUpBehaviors(i);return i},_setUpBehaviors:function(i){i=i||this.$el;make_popup_menus(i);i.find("[title]").tooltip({placement:"bottom"})},_render_titleButtons:function(){return[this._render_displayButton()]},_render_displayButton:function(){if((this.model.get("state")===e.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(this.model.get("state")===e.HistoryDatasetAssociation.STATES.DISCARDED)||(!this.model.get("accessible"))){return null}var j={target:this.linkTarget,classes:"dataset-display"};if(this.model.get("purged")){j.disabled=true;j.title=d("Cannot display datasets removed from disk")}else{if(this.model.get("state")===e.HistoryDatasetAssociation.STATES.UPLOAD){j.disabled=true;j.title=d("This dataset must finish uploading before it can be viewed")}else{if(this.model.get("state")===e.HistoryDatasetAssociation.STATES.NEW){j.disabled=true;j.title=d("This dataset is not yet viewable")}else{j.title=d("View data");j.href=this.urls.display;var i=this;j.onclick=function(k){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Data Viewer: "+i.model.get("name"),type:"other",content:function(l){var m=new g.TabularDataset({id:i.model.id});$.when(m.fetch()).then(function(){g.createTabularDatasetChunkedView({model:m,parent_elt:l,embedded:true,height:"100%"})})}});k.preventDefault()}}}}}j.faIcon="fa-eye";return faIconButton(j)},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var j=this.urls,k=this.model.get("meta_files");if(_.isEmpty(k)){return $(['<a href="'+j.download+'" title="'+d("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>',"</a>"].join(""))}var l="dataset-"+this.model.get("id")+"-popup",i=['<div popupmenu="'+l+'">','<a href="'+j.download+'">',d("Download dataset"),"</a>","<a>"+d("Additional files")+"</a>",_.map(k,function(m){return['<a class="action-button" href="',j.meta_download+m.file_type,'">',d("Download")," ",m.file_type,"</a>"].join("")}).join("\n"),"</div>",'<div class="icon-btn-group">','<a href="'+j.download+'" title="'+d("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>','</a><a class="icon-btn popup" id="'+l+'">','<span class="fa fa-caret-down"></span>',"</a>","</div>"].join("\n");return $(i)},_render_showParamsButton:function(){return faIconButton({title:d("View details"),classes:"dataset-params-btn",href:this.urls.show_params,target:this.linkTarget,faIcon:"fa-info-circle"})},_render_body:function(){var j=$('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'),i=this["_render_body_"+this.model.get("state")];if(_.isFunction(i)){j=i.call(this)}this._setUpBehaviors(j);if(this.expanded){j.show()}return j},_render_stateBodyHelper:function(i,l){l=l||[];var j=this,k=$(c.templates.body(_.extend(this.model.toJSON(),{body:i})));k.find(".dataset-actions .left").append(_.map(l,function(m){return m.call(j)}));return k},_render_body_new:function(){return this._render_stateBodyHelper("<div>"+d("This is a new dataset and not all of its data are available yet")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_noPermission:function(){return this._render_stateBodyHelper("<div>"+d("You do not have permission to view this dataset")+"</div>")},_render_body_discarded:function(){return this._render_stateBodyHelper("<div>"+d("The job creating this dataset was cancelled before completion")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_queued:function(){return this._render_stateBodyHelper("<div>"+d("This job is waiting to run")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_upload:function(){return this._render_stateBodyHelper("<div>"+d("This dataset is currently uploading")+"</div>")},_render_body_setting_metadata:function(){return this._render_stateBodyHelper("<div>"+d("Metadata is being auto-detected")+"</div>")},_render_body_running:function(){return this._render_stateBodyHelper("<div>"+d("This job is currently running")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_paused:function(){return this._render_stateBodyHelper("<div>"+d('This job is paused. Use the "Resume Paused Jobs" in the history menu to resume')+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_error:function(){var i=['<span class="help-text">',d("An error occurred with this dataset"),":</span>",'<div class="job-error-text">',$.trim(this.model.get("misc_info")),"</div>"].join("");if(!this.model.get("purged")){i="<div>"+this.model.get("misc_blurb")+"</div>"+i}return this._render_stateBodyHelper(i,[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers))},_render_body_empty:function(){return this._render_stateBodyHelper("<div>"+d("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>",this.defaultPrimaryActionButtonRenderers)},_render_body_failed_metadata:function(){var i=$('<div class="warningmessagesmall"></div>').append($("<strong/>").text(d("An error occurred setting the metadata for this dataset"))),j=this._render_body_ok();j.prepend(i);return j},_render_body_ok:function(){var i=this,k=$(c.templates.body(this.model.toJSON())),j=[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers);k.find(".dataset-actions .left").append(_.map(j,function(l){return l.call(i)}));if(this.model.isDeletedOrPurged()){return k}return k},events:{"click .dataset-title-bar":"toggleBodyVisibility","keydown .dataset-title-bar":"toggleBodyVisibility","click .dataset-selector":"toggleSelect"},expandBody:function(){var i=this;function j(){i.$el.children(".dataset-body").replaceWith(i._render_body());i.$el.children(".dataset-body").slideDown(i.fxSpeed,function(){i.expanded=true;i.trigger("body-expanded",i.model.get("id"))})}if(this.model.inReadyState()&&!this.model.hasDetails()){this.model.fetch({silent:true}).always(function(k){i.urls=i.model.urls();j()})}else{j()}},collapseBody:function(){var i=this;this.$el.children(".dataset-body").slideUp(i.fxSpeed,function(){i.expanded=false;i.trigger("body-collapsed",i.model.get("id"))})},draggableOn:function(){this.draggable=true;this.dragStartHandler=_.bind(this._dragStartHandler,this);this.dragEndHandler=_.bind(this._dragEndHandler,this);var i=this.$el.find(".dataset-title-bar").attr("draggable",true).get(0);i.addEventListener("dragstart",this.dragStartHandler,false);i.addEventListener("dragend",this.dragEndHandler,false)},draggableOff:function(){this.draggable=false;var i=this.$el.find(".dataset-title-bar").attr("draggable",false).get(0);i.removeEventListener("dragstart",this.dragStartHandler,false);i.removeEventListener("dragend",this.dragEndHandler,false)},toggleDraggable:function(){if(this.draggable){this.draggableOff()}else{this.draggableOn()}},_dragStartHandler:function(i){this.trigger("dragstart",this);i.dataTransfer.effectAllowed="move";i.dataTransfer.setData("text",JSON.stringify(this.model.toJSON()));return false},_dragEndHandler:function(i){this.trigger("dragend",this);return false},remove:function(j){var i=this;this.$el.fadeOut(i.fxSpeed,function(){i.$el.remove();i.off();if(j){j()}})},toString:function(){var i=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+i+")"}});var a=_.template(['<div class="dataset hda">','<div class="dataset-warnings">',"<% if( hda.error ){ %>",'<div class="errormessagesmall">',d("There was an error getting the data for this dataset"),":<%- hda.error %>","</div>","<% } %>","<% if( hda.deleted ){ %>","<% if( hda.purged ){ %>",'<div class="dataset-purged-msg warningmessagesmall"><strong>',d("This dataset has been deleted and removed from disk")+".","</strong></div>","<% } else { %>",'<div class="dataset-deleted-msg warningmessagesmall"><strong>',d("This dataset has been deleted")+".","</strong></div>","<% } %>","<% } %>","<% if( !hda.visible ){ %>",'<div class="dataset-hidden-msg warningmessagesmall"><strong>',d("This dataset has been hidden")+".","</strong></div>","<% } %>","</div>",'<div class="dataset-selector">','<span class="fa fa-2x fa-square-o"></span>',"</div>",'<div class="dataset-primary-actions"></div>','<div class="dataset-title-bar clear" tabindex="0">','<span class="dataset-state-icon state-icon"></span>','<div class="dataset-title">','<span class="hda-hid"><%- hda.hid %></span> ','<span class="dataset-name"><%- hda.name %></span>',"</div>","</div>",'<div class="dataset-body"></div>',"</div>"].join(""));var f=_.template(['<div class="dataset-body">',"<% if( hda.body ){ %>",'<div class="dataset-summary">',"<%= hda.body %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% } else { %>",'<div class="dataset-summary">',"<% if( hda.misc_blurb ){ %>",'<div class="dataset-blurb">','<span class="value"><%- hda.misc_blurb %></span>',"</div>","<% } %>","<% if( hda.data_type ){ %>",'<div class="dataset-datatype">','<label class="prompt">',d("format"),"</label>",'<span class="value"><%- hda.data_type %></span>',"</div>","<% } %>","<% if( hda.metadata_dbkey ){ %>",'<div class="dataset-dbkey">','<label class="prompt">',d("database"),"</label>",'<span class="value">',"<%- hda.metadata_dbkey %>","</span>","</div>","<% } %>","<% if( hda.misc_info ){ %>",'<div class="dataset-info">','<span class="value"><%- hda.misc_info %></span>',"</div>","<% } %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% if( !hda.deleted ){ %>",'<div class="tags-display"></div>','<div class="annotation-display"></div>','<div class="dataset-display-applications">',"<% _.each( hda.display_apps, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","<% _.each( hda.display_types, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","</div>",'<div class="dataset-peek">',"<% if( hda.peek ){ %>",'<pre class="peek"><%= hda.peek %></pre>',"<% } %>","</div>","<% } %>","<% } %>","</div>"].join(""));c.templates={skeleton:function(i){return a({_l:d,hda:i})},body:function(i){return f({_l:d,hda:i})}};return{HistoryContentBaseView:h,HDABaseView:c}});
\ No newline at end of file
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/packed/mvc/history/history-panel.js
--- a/static/scripts/packed/mvc/history/history-panel.js
+++ b/static/scripts/packed/mvc/history/history-panel.js
@@ -1,1 +1,1 @@
-define(["mvc/dataset/hda-model","mvc/dataset/hda-edit","mvc/collection/dataset-collection-edit","mvc/history/readonly-history-panel","mvc/tags","mvc/annotations","utils/localization"],function(f,b,h,d,a,c,e){var g=d.ReadOnlyHistoryPanel.extend({HDAViewClass:b.HDAEditView,initialize:function(i){i=i||{};this.selectedHdaIds=[];this.tagsEditor=null;this.annotationEditor=null;this.purgeAllowed=i.purgeAllowed||false;this.selecting=i.selecting||false;this.annotationEditorShown=i.annotationEditorShown||false;this.tagsEditorShown=i.tagsEditorShown||false;d.ReadOnlyHistoryPanel.prototype.initialize.call(this,i)},_setUpModelEventHandlers:function(){d.ReadOnlyHistoryPanel.prototype._setUpModelEventHandlers.call(this);this.model.on("change:nice_size",this.updateHistoryDiskSize,this);this.model.hdas.on("change:deleted",this._handleHdaDeletionChange,this);this.model.hdas.on("change:visible",this._handleHdaVisibleChange,this);this.model.hdas.on("change:purged",function(i){this.model.fetch()},this)},renderModel:function(){var i=$("<div/>");i.append(g.templates.historyPanel(this.model.toJSON()));this.$emptyMessage(i).text(this.emptyMsg);if(Galaxy&&Galaxy.currUser&&Galaxy.currUser.id&&Galaxy.currUser.id===this.model.get("user_id")){this._renderTags(i);this._renderAnnotation(i)}i.find(".history-secondary-actions").prepend(this._renderSelectButton());i.find(".history-dataset-actions").toggle(this.selecting);i.find(".history-secondary-actions").prepend(this._renderSearchButton());this._setUpBehaviours(i);this.renderHdas(i);return i},_renderTags:function(i){var j=this;this.tagsEditor=new a.TagsEditor({model:this.model,el:i.find(".history-controls .tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){j.toggleHDATagEditors(true,j.fxSpeed)},onhide:function(){j.toggleHDATagEditors(false,j.fxSpeed)},$activator:faIconButton({title:e("Edit history tags"),classes:"history-tag-btn",faIcon:"fa-tags"}).appendTo(i.find(".history-secondary-actions"))})},_renderAnnotation:function(i){var j=this;this.annotationEditor=new c.AnnotationEditor({model:this.model,el:i.find(".history-controls .annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){j.toggleHDAAnnotationEditors(true,j.fxSpeed)},onhide:function(){j.toggleHDAAnnotationEditors(false,j.fxSpeed)},$activator:faIconButton({title:e("Edit history annotation"),classes:"history-annotate-btn",faIcon:"fa-comment"}).appendTo(i.find(".history-secondary-actions"))})},_renderSelectButton:function(i){return faIconButton({title:e("Operations on multiple datasets"),classes:"history-select-btn",faIcon:"fa-check-square-o"})},_setUpBehaviours:function(i){i=i||this.$el;d.ReadOnlyHistoryPanel.prototype._setUpBehaviours.call(this,i);if(!this.model){return}this._setUpDatasetActionsPopup(i);if((!Galaxy.currUser||Galaxy.currUser.isAnonymous())||(Galaxy.currUser.id!==this.model.get("user_id"))){return}var j=this;i.find(".history-name").attr("title",e("Click to rename history")).tooltip({placement:"bottom"}).make_text_editable({on_finish:function(k){var l=j.model.get("name");if(k&&k!==l){j.$el.find(".history-name").text(k);j.model.save({name:k}).fail(function(){j.$el.find(".history-name").text(j.model.previous("name"))})}else{j.$el.find(".history-name").text(l)}}})},_setUpDatasetActionsPopup:function(i){var j=this,k=[{html:e("Hide datasets"),func:function(){var l=f.HistoryDatasetAssociation.prototype.hide;j.getSelectedHdaCollection().ajaxQueue(l)}},{html:e("Unhide datasets"),func:function(){var l=f.HistoryDatasetAssociation.prototype.unhide;j.getSelectedHdaCollection().ajaxQueue(l)}},{html:e("Delete datasets"),func:function(){var l=f.HistoryDatasetAssociation.prototype["delete"];j.getSelectedHdaCollection().ajaxQueue(l)}},{html:e("Undelete datasets"),func:function(){var l=f.HistoryDatasetAssociation.prototype.undelete;j.getSelectedHdaCollection().ajaxQueue(l)}}];if(j.purgeAllowed){k.push({html:e("Permanently delete datasets"),func:function(){if(confirm(e("This will permanently remove the data in your datasets. Are you sure?"))){var l=f.HistoryDatasetAssociation.prototype.purge;j.getSelectedHdaCollection().ajaxQueue(l)}}})}k.push({html:e("Build Dataset List (Experimental)"),func:function(){j.getSelectedHdaCollection().promoteToHistoryDatasetCollection(j.model,"list")}});k.push({html:e("Build Dataset Pair (Experimental)"),func:function(){j.getSelectedHdaCollection().promoteToHistoryDatasetCollection(j.model,"paired")}});return new PopupMenu(i.find(".history-dataset-action-popup-btn"),k)},_handleHdaDeletionChange:function(i){if(i.get("deleted")&&!this.storage.get("show_deleted")){this.removeHdaView(this.hdaViews[i.id])}},_handleHdaVisibleChange:function(i){if(i.hidden()&&!this.storage.get("show_hidden")){this.removeHdaView(this.hdaViews[i.id])}},_createContentView:function(j){var i=j.get("id"),l=j.get("history_content_type"),k=null;if(l=="dataset"){k=new this.HDAViewClass({model:j,linkTarget:this.linkTarget,expanded:this.storage.get("expandedHdas")[i],selectable:this.selecting,purgeAllowed:this.purgeAllowed,hasUser:this.model.ownedByCurrUser(),logger:this.logger,tagsEditorShown:(this.tagsEditor&&!this.tagsEditor.hidden),annotationEditorShown:(this.annotationEditor&&!this.annotationEditor.hidden)})}else{if(l=="dataset_collection"){k=new h.DatasetCollectionEditView({model:j,linkTarget:this.linkTarget,expanded:this.storage.get("expandedHdas")[i],hasUser:this.model.ownedByCurrUser(),logger:this.logger})}}this._setUpHdaListeners(k);return k},_setUpHdaListeners:function(j){var i=this;d.ReadOnlyHistoryPanel.prototype._setUpHdaListeners.call(this,j);j.on("selected",function(k){var l=k.model.get("id");i.selectedHdaIds=_.union(i.selectedHdaIds,[l])});j.on("de-selected",function(k){var l=k.model.get("id");i.selectedHdaIds=_.without(i.selectedHdaIds,l)})},toggleHDATagEditors:function(i){var j=arguments;_.each(this.hdaViews,function(k){if(k.tagsEditor){k.tagsEditor.toggle.apply(k.tagsEditor,j)}})},toggleHDAAnnotationEditors:function(i){var j=arguments;_.each(this.hdaViews,function(k){if(k.annotationEditor){k.annotationEditor.toggle.apply(k.annotationEditor,j)}})},removeHdaView:function(j){if(!j){return}var i=this;j.$el.fadeOut(i.fxSpeed,function(){j.off();j.remove();delete i.hdaViews[j.model.id];if(_.isEmpty(i.hdaViews)){i.trigger("empty-history",i);i._renderEmptyMsg()}})},events:_.extend(_.clone(d.ReadOnlyHistoryPanel.prototype.events),{"click .history-select-btn":"toggleSelectors","click .history-select-all-datasets-btn":"selectAllDatasets","click .history-deselect-all-datasets-btn":"deselectAllDatasets"}),updateHistoryDiskSize:function(){this.$el.find(".history-size").text(this.model.get("nice_size"))},showSelectors:function(i){i=(i!==undefined)?(i):(this.fxSpeed);this.selecting=true;this.$(".history-dataset-actions").slideDown(i);_.each(this.hdaViews,function(j){j.showSelector()});this.selectedHdaIds=[]},hideSelectors:function(i){i=(i!==undefined)?(i):(this.fxSpeed);this.selecting=false;this.$(".history-dataset-actions").slideUp(i);_.each(this.hdaViews,function(j){j.hideSelector()});this.selectedHdaIds=[]},toggleSelectors:function(){if(!this.selecting){this.showSelectors()}else{this.hideSelectors()}},selectAllDatasets:function(i){_.each(this.hdaViews,function(j){j.select(i)})},deselectAllDatasets:function(i){_.each(this.hdaViews,function(j){j.deselect(i)})},getSelectedHdaViews:function(){return _.filter(this.hdaViews,function(i){return i.selected})},getSelectedHdaCollection:function(){return new f.HDACollection(_.map(this.getSelectedHdaViews(),function(i){return i.model}),{historyId:this.model.id})},toString:function(){return"HistoryPanel("+((this.model)?(this.model.get("name")):(""))+")"}});return{HistoryPanel:g}});
\ No newline at end of file
+define(["mvc/dataset/hda-model","mvc/dataset/hda-edit","mvc/collection/dataset-collection-edit","mvc/history/readonly-history-panel","mvc/tags","mvc/annotations","utils/localization"],function(f,b,h,d,a,c,e){var g=d.ReadOnlyHistoryPanel.extend({HDAViewClass:b.HDAEditView,initialize:function(i){i=i||{};this.selectedHdaIds=[];this.lastSelectedViewId=null;this.tagsEditor=null;this.annotationEditor=null;this.purgeAllowed=i.purgeAllowed||false;this.selecting=i.selecting||false;this.annotationEditorShown=i.annotationEditorShown||false;this.tagsEditorShown=i.tagsEditorShown||false;d.ReadOnlyHistoryPanel.prototype.initialize.call(this,i)},_setUpModelEventHandlers:function(){d.ReadOnlyHistoryPanel.prototype._setUpModelEventHandlers.call(this);this.model.on("change:nice_size",this.updateHistoryDiskSize,this);this.model.hdas.on("change:deleted",this._handleHdaDeletionChange,this);this.model.hdas.on("change:visible",this._handleHdaVisibleChange,this);this.model.hdas.on("change:purged",function(i){this.model.fetch()},this)},renderModel:function(){var i=$("<div/>");i.append(g.templates.historyPanel(this.model.toJSON()));this.$emptyMessage(i).text(this.emptyMsg);if(Galaxy&&Galaxy.currUser&&Galaxy.currUser.id&&Galaxy.currUser.id===this.model.get("user_id")){this._renderTags(i);this._renderAnnotation(i)}i.find(".history-secondary-actions").prepend(this._renderSelectButton());i.find(".history-dataset-actions").toggle(this.selecting);i.find(".history-secondary-actions").prepend(this._renderSearchButton());this._setUpBehaviours(i);this.renderHdas(i);return i},_renderTags:function(i){var j=this;this.tagsEditor=new a.TagsEditor({model:this.model,el:i.find(".history-controls .tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){j.toggleHDATagEditors(true,j.fxSpeed)},onhide:function(){j.toggleHDATagEditors(false,j.fxSpeed)},$activator:faIconButton({title:e("Edit history tags"),classes:"history-tag-btn",faIcon:"fa-tags"}).appendTo(i.find(".history-secondary-actions"))})},_renderAnnotation:function(i){var j=this;this.annotationEditor=new c.AnnotationEditor({model:this.model,el:i.find(".history-controls .annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){j.toggleHDAAnnotationEditors(true,j.fxSpeed)},onhide:function(){j.toggleHDAAnnotationEditors(false,j.fxSpeed)},$activator:faIconButton({title:e("Edit history annotation"),classes:"history-annotate-btn",faIcon:"fa-comment"}).appendTo(i.find(".history-secondary-actions"))})},_renderSelectButton:function(i){return faIconButton({title:e("Operations on multiple datasets"),classes:"history-select-btn",faIcon:"fa-check-square-o"})},_setUpBehaviours:function(i){i=i||this.$el;d.ReadOnlyHistoryPanel.prototype._setUpBehaviours.call(this,i);if(!this.model){return}this._setUpDatasetActionsPopup(i);if((!Galaxy.currUser||Galaxy.currUser.isAnonymous())||(Galaxy.currUser.id!==this.model.get("user_id"))){return}var j=this;i.find(".history-name").attr("title",e("Click to rename history")).tooltip({placement:"bottom"}).make_text_editable({on_finish:function(k){var l=j.model.get("name");if(k&&k!==l){j.$el.find(".history-name").text(k);j.model.save({name:k}).fail(function(){j.$el.find(".history-name").text(j.model.previous("name"))})}else{j.$el.find(".history-name").text(l)}}})},_setUpDatasetActionsPopup:function(i){var j=this,k=[{html:e("Hide datasets"),func:function(){var l=f.HistoryDatasetAssociation.prototype.hide;j.getSelectedHdaCollection().ajaxQueue(l)}},{html:e("Unhide datasets"),func:function(){var l=f.HistoryDatasetAssociation.prototype.unhide;j.getSelectedHdaCollection().ajaxQueue(l)}},{html:e("Delete datasets"),func:function(){var l=f.HistoryDatasetAssociation.prototype["delete"];j.getSelectedHdaCollection().ajaxQueue(l)}},{html:e("Undelete datasets"),func:function(){var l=f.HistoryDatasetAssociation.prototype.undelete;j.getSelectedHdaCollection().ajaxQueue(l)}}];if(j.purgeAllowed){k.push({html:e("Permanently delete datasets"),func:function(){if(confirm(e("This will permanently remove the data in your datasets. Are you sure?"))){var l=f.HistoryDatasetAssociation.prototype.purge;j.getSelectedHdaCollection().ajaxQueue(l)}}})}k.push({html:e("Build Dataset List (Experimental)"),func:function(){j.getSelectedHdaCollection().promoteToHistoryDatasetCollection(j.model,"list")}});k.push({html:e("Build Dataset Pair (Experimental)"),func:function(){j.getSelectedHdaCollection().promoteToHistoryDatasetCollection(j.model,"paired")}});return new PopupMenu(i.find(".history-dataset-action-popup-btn"),k)},_handleHdaDeletionChange:function(i){if(i.get("deleted")&&!this.storage.get("show_deleted")){this.removeHdaView(this.hdaViews[i.id])}},_handleHdaVisibleChange:function(i){if(i.hidden()&&!this.storage.get("show_hidden")){this.removeHdaView(this.hdaViews[i.id])}},_createContentView:function(j){var i=j.get("id"),l=j.get("history_content_type"),k=null;if(l==="dataset"){k=new this.HDAViewClass({model:j,linkTarget:this.linkTarget,expanded:this.storage.get("expandedHdas")[i],selectable:this.selecting,purgeAllowed:this.purgeAllowed,hasUser:this.model.ownedByCurrUser(),logger:this.logger,tagsEditorShown:(this.tagsEditor&&!this.tagsEditor.hidden),annotationEditorShown:(this.annotationEditor&&!this.annotationEditor.hidden)})}else{if(l==="dataset_collection"){k=new h.DatasetCollectionEditView({model:j,linkTarget:this.linkTarget,expanded:this.storage.get("expandedHdas")[i],hasUser:this.model.ownedByCurrUser(),logger:this.logger})}}this._setUpHdaListeners(k);return k},_setUpHdaListeners:function(j){var i=this;d.ReadOnlyHistoryPanel.prototype._setUpHdaListeners.call(this,j);j.on("selected",function(m,l){if(!l){return}var k=[];if((l.shiftKey)&&(i.lastSelectedViewId&&_.has(i.hdaViews,i.lastSelectedViewId))){var o=i.hdaViews[i.lastSelectedViewId];k=i.selectDatasetRange(m,o).map(function(p){return p.model.id})}else{var n=m.model.get("id");i.lastSelectedViewId=n;k=[n]}i.selectedHdaIds=_.union(i.selectedHdaIds,k)});j.on("de-selected",function(l,k){var m=l.model.get("id");i.selectedHdaIds=_.without(i.selectedHdaIds,m)})},toggleHDATagEditors:function(i){var j=arguments;_.each(this.hdaViews,function(k){if(k.tagsEditor){k.tagsEditor.toggle.apply(k.tagsEditor,j)}})},toggleHDAAnnotationEditors:function(i){var j=arguments;_.each(this.hdaViews,function(k){if(k.annotationEditor){k.annotationEditor.toggle.apply(k.annotationEditor,j)}})},removeHdaView:function(j){if(!j){return}var i=this;j.$el.fadeOut(i.fxSpeed,function(){j.off();j.remove();delete i.hdaViews[j.model.id];if(_.isEmpty(i.hdaViews)){i.trigger("empty-history",i);i._renderEmptyMsg()}})},events:_.extend(_.clone(d.ReadOnlyHistoryPanel.prototype.events),{"click .history-select-btn":"toggleSelectors","click .history-select-all-datasets-btn":"selectAllDatasets","click .history-deselect-all-datasets-btn":"deselectAllDatasets"}),updateHistoryDiskSize:function(){this.$el.find(".history-size").text(this.model.get("nice_size"))},showSelectors:function(i){i=(i!==undefined)?(i):(this.fxSpeed);this.selecting=true;this.$(".history-dataset-actions").slideDown(i);_.each(this.hdaViews,function(j){j.showSelector()});this.selectedHdaIds=[];this.lastSelectedViewId=null},hideSelectors:function(i){i=(i!==undefined)?(i):(this.fxSpeed);this.selecting=false;this.$(".history-dataset-actions").slideUp(i);_.each(this.hdaViews,function(j){j.hideSelector()});this.selectedHdaIds=[];this.lastSelectedViewId=null},toggleSelectors:function(){if(!this.selecting){this.showSelectors()}else{this.hideSelectors()}},selectAllDatasets:function(i){_.each(this.hdaViews,function(j){j.select(i)})},deselectAllDatasets:function(i){this.lastSelectedViewId=null;_.each(this.hdaViews,function(j){j.deselect(i)})},selectDatasetRange:function(k,j){var i=this.hdaViewRange(k,j);_.each(i,function(l){l.select()});return i},getSelectedHdaViews:function(){return _.filter(this.hdaViews,function(i){return i.selected})},getSelectedHdaCollection:function(){return new f.HDACollection(_.map(this.getSelectedHdaViews(),function(i){return i.model}),{historyId:this.model.id})},toString:function(){return"HistoryPanel("+((this.model)?(this.model.get("name")):(""))+")"}});return{HistoryPanel:g}});
\ No newline at end of file
diff -r 46a487e7d5476429cb71885adcbcfb9746ce725a -r 1d1d881508b121df607d9096386effdbe072427e static/scripts/packed/mvc/history/readonly-history-panel.js
--- a/static/scripts/packed/mvc/history/readonly-history-panel.js
+++ b/static/scripts/packed/mvc/history/readonly-history-panel.js
@@ -1,1 +1,1 @@
-define(["mvc/history/history-model","mvc/collection/dataset-collection-base","mvc/dataset/hda-base","mvc/user/user-model","mvc/base-mvc","utils/localization"],function(g,k,b,a,f,d){var i=f.SessionStorageModel.extend({defaults:{expandedHdas:{},show_deleted:false,show_hidden:false},addExpandedHda:function(n){var m="expandedHdas";this.save(m,_.extend(this.get(m),_.object([n],[true])))},removeExpandedHda:function(n){var m="expandedHdas";this.save(m,_.omit(this.get(m),n))},toString:function(){return"HistoryPrefs("+this.id+")"}});i.storageKeyPrefix="history:";i.historyStorageKey=function e(m){if(!m){throw new Error("HistoryPrefs.historyStorageKey needs valid id: "+m)}return(i.storageKeyPrefix+m)};i.get=function c(m){return new i({id:i.historyStorageKey(m)})};i.clearAll=function h(n){for(var m in sessionStorage){if(m.indexOf(i.storageKeyPrefix)===0){sessionStorage.removeItem(m)}}};var j=Backbone.View.extend(f.LoggableMixin).extend({HDAViewClass:b.HDABaseView,tagName:"div",className:"history-panel",fxSpeed:"fast",emptyMsg:d("This history is empty"),noneFoundMsg:d("No matching datasets found"),initialize:function(m){m=m||{};if(m.logger){this.logger=m.logger}this.log(this+".initialize:",m);this.linkTarget=m.linkTarget||"_blank";this.fxSpeed=_.has(m,"fxSpeed")?(m.fxSpeed):(this.fxSpeed);this.filters=[];this.searchFor="";this.findContainerFn=m.findContainerFn;this.hdaViews={};this.indicator=new LoadingIndicator(this.$el);this._setUpListeners();var n=_.pick(m,"initiallyExpanded","show_deleted","show_hidden");this.setModel(this.model,n,false);if(m.onready){m.onready.call(this)}},_setUpListeners:function(){this.on("error",function(n,q,m,p,o){this.errorHandler(n,q,m,p,o)});this.on("loading-history",function(){this._showLoadingIndicator("loading history...",40)});this.on("loading-done",function(){this._hideLoadingIndicator(40);if(_.isEmpty(this.hdaViews)){this.trigger("empty-history",this)}});this.once("rendered",function(){this.trigger("rendered:initial",this);return false});if(this.logger){this.on("all",function(m){this.log(this+"",arguments)},this)}return this},errorHandler:function(o,r,n,q,p){console.error(o,r,n,q,p);if(r&&r.status===0&&r.readyState===0){}else{if(r&&r.status===502){}else{var m=this._parseErrorMessage(o,r,n,q,p);if(!this.$messages().is(":visible")){this.once("rendered",function(){this.displayMessage("error",m.message,m.details)})}else{this.displayMessage("error",m.message,m.details)}}}},_parseErrorMessage:function(p,t,o,s,r){var n=Galaxy.currUser,m={message:this._bePolite(s),details:{user:(n instanceof a.User)?(n.toJSON()):(n+""),source:(p instanceof Backbone.Model)?(p.toJSON()):(p+""),xhr:t,options:(t)?(_.omit(o,"xhr")):(o)}};_.extend(m.details,r||{});if(t&&_.isFunction(t.getAllResponseHeaders)){var q=t.getAllResponseHeaders();q=_.compact(q.split("\n"));q=_.map(q,function(u){return u.split(": ")});m.details.xhr.responseHeaders=_.object(q)}return m},_bePolite:function(m){m=m||d("An error occurred while getting updates from the server");return m+". "+d("Please contact a Galaxy administrator if the problem persists")+"."},loadHistoryWithHDADetails:function(o,n,m,q){var p=function(r){return _.keys(i.get(r.id).get("expandedHdas"))};return this.loadHistory(o,n,m,q,p)},loadHistory:function(p,o,n,s,q){var m=this;o=o||{};m.trigger("loading-history",m);var r=g.History.getHistoryData(p,{historyFn:n,hdaFn:s,hdaDetailIds:o.initiallyExpanded||q});return m._loadHistoryFromXHR(r,o).fail(function(v,t,u){m.trigger("error",m,v,o,d("An error was encountered while "+t),{historyId:p,history:u||{}})}).always(function(){m.trigger("loading-done",m)})},_loadHistoryFromXHR:function(o,n){var m=this;o.then(function(p,q){m.JSONToModel(p,q,n)});o.fail(function(q,p){m.render()});return o},JSONToModel:function(p,m,n){this.log("JSONToModel:",p,m,n);n=n||{};var o=new g.History(p,m,n);this.setModel(o);return this},setModel:function(n,m,o){m=m||{};o=(o!==undefined)?(o):(true);this.log("setModel:",n,m,o);this.freeModel();this.selectedHdaIds=[];if(n){this.model=n;if(this.logger){this.model.logger=this.logger}this._setUpWebStorage(m.initiallyExpanded,m.show_deleted,m.show_hidden);this._setUpModelEventHandlers();this.trigger("new-model",this)}if(o){this.render()}return this},freeModel:function(){if(this.model){this.model.clearUpdateTimeout();this.stopListening(this.model);this.stopListening(this.model.hdas)}this.freeHdaViews();return this},freeHdaViews:function(){this.hdaViews={};return this},_setUpWebStorage:function(n,m,o){this.storage=new i({id:i.historyStorageKey(this.model.get("id"))});if(_.isObject(n)){this.storage.set("exandedHdas",n)}if(_.isBoolean(m)){this.storage.set("show_deleted",m)}if(_.isBoolean(o)){this.storage.set("show_hidden",o)}this.trigger("new-storage",this.storage,this);this.log(this+" (init'd) storage:",this.storage.get());return this},_setUpModelEventHandlers:function(){this.model.hdas.on("add",this.addContentView,this);this.model.on("error error:hdas",function(n,p,m,o){this.errorHandler(n,p,m,o)},this);return this},render:function(o,p){this.log("render:",o,p);o=(o===undefined)?(this.fxSpeed):(o);var m=this,n;if(this.model){n=this.renderModel()}else{n=this.renderWithoutModel()}$(m).queue("fx",[function(q){if(o&&m.$el.is(":visible")){m.$el.fadeOut(o,q)}else{q()}},function(q){m.$el.empty();if(n){m.$el.append(n.children())}q()},function(q){if(o&&!m.$el.is(":visible")){m.$el.fadeIn(o,q)}else{q()}},function(q){if(p){p.call(this)}m.trigger("rendered",this);q()}]);return this},renderWithoutModel:function(){var m=$("<div/>"),n=$("<div/>").addClass("message-container").css({margin:"4px"});return m.append(n)},renderModel:function(){var m=$("<div/>");m.append(j.templates.historyPanel(this.model.toJSON()));this.$emptyMessage(m).text(this.emptyMsg);m.find(".history-secondary-actions").prepend(this._renderSearchButton());this._setUpBehaviours(m);this.renderHdas(m);return m},_renderEmptyMsg:function(o){var n=this,m=n.$emptyMessage(o);if(!_.isEmpty(n.hdaViews)){m.hide()}else{if(n.searchFor){m.text(n.noneFoundMsg).show()}else{m.text(n.emptyMsg).show()}}return this},_renderSearchButton:function(m){return faIconButton({title:d("Search datasets"),classes:"history-search-btn",faIcon:"fa-search"})},_setUpBehaviours:function(m){m=m||this.$el;m.find("[title]").tooltip({placement:"bottom"});this._setUpSearchInput(m.find(".history-search-controls .history-search-input"));return this},$container:function(){return(this.findContainerFn)?(this.findContainerFn.call(this)):(this.$el.parent())},$datasetsList:function(m){return(m||this.$el).find(".datasets-list")},$messages:function(m){return(m||this.$el).find(".message-container")},$emptyMessage:function(m){return(m||this.$el).find(".empty-history-message")},renderHdas:function(n){n=n||this.$el;var m=this,p={},o=this.model.hdas.getVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"),this.filters);this.$datasetsList(n).empty();if(o.length){o.each(function(r){var q=r.get("id"),s=m._createContentView(r);p[q]=s;if(_.contains(m.selectedHdaIds,q)){s.selected=true}m.attachContentView(s.render(),n)})}this.hdaViews=p;this._renderEmptyMsg(n);return this.hdaViews},_createContentView:function(n){var m=n.get("id"),p=n.get("history_content_type"),o=null;if(p=="dataset"){o=new this.HDAViewClass({model:n,linkTarget:this.linkTarget,expanded:this.storage.get("expandedHdas")[m],hasUser:this.model.ownedByCurrUser(),logger:this.logger})}else{o=new k.DatasetCollectionBaseView({model:n,linkTarget:this.linkTarget,expanded:this.storage.get("expandedHdas")[m],hasUser:this.model.ownedByCurrUser(),logger:this.logger})}this._setUpHdaListeners(o);return o},_setUpHdaListeners:function(n){var m=this;n.on("error",function(p,r,o,q){m.errorHandler(p,r,o,q)});n.on("body-expanded",function(o){m.storage.addExpandedHda(o)});n.on("body-collapsed",function(o){m.storage.removeExpandedHda(o)});return this},attachContentView:function(o,n){n=n||this.$el;var m=this.$datasetsList(n);m.prepend(o.$el);return this},addContentView:function(p){this.log("add."+this,p);var n=this;if(!p.isVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"))){return n}$({}).queue([function o(r){var q=n.$emptyMessage();if(q.is(":visible")){q.fadeOut(n.fxSpeed,r)}else{r()}},function m(q){var r=n._createContentView(p);n.hdaViews[p.id]=r;r.render().$el.hide();n.scrollToTop();n.attachContentView(r);r.$el.slideDown(n.fxSpeed)}]);return n},refreshContents:function(n,m){if(this.model){return this.model.refresh(n,m)}return $.when()},events:{"click .message-container":"clearMessages","click .history-search-btn":"toggleSearchControls"},collapseAllHdaBodies:function(){_.each(this.hdaViews,function(m){m.toggleBodyVisibility(null,false)});this.storage.set("expandedHdas",{});return this},toggleShowDeleted:function(m){m=(m!==undefined)?(m):(!this.storage.get("show_deleted"));this.storage.set("show_deleted",m);this.renderHdas();return this.storage.get("show_deleted")},toggleShowHidden:function(m){m=(m!==undefined)?(m):(!this.storage.get("show_hidden"));this.storage.set("show_hidden",m);this.renderHdas();return this.storage.get("show_hidden")},_setUpSearchInput:function(n){var o=this,p=".history-search-input";function m(q){if(o.model.hdas.haveDetails()){o.searchHdas(q);return}o.$el.find(p).searchInput("toggle-loading");o.model.hdas.fetchAllDetails({silent:true}).always(function(){o.$el.find(p).searchInput("toggle-loading")}).done(function(){o.searchHdas(q)})}n.searchInput({initialVal:o.searchFor,name:"history-search",placeholder:"search datasets",classes:"history-search",onfirstsearch:m,onsearch:_.bind(this.searchHdas,this),onclear:_.bind(this.clearHdaSearch,this)});return n},toggleSearchControls:function(o,m){var n=this.$el.find(".history-search-controls"),p=(jQuery.type(o)==="number")?(o):(this.fxSpeed);m=(m!==undefined)?(m):(!n.is(":visible"));if(m){n.slideDown(p,function(){$(this).find("input").focus()})}else{n.slideUp(p)}return m},searchHdas:function(m){var n=this;this.searchFor=m;this.filters=[function(o){return o.matchesAll(n.searchFor)}];this.trigger("search:searching",m,this);this.renderHdas();return this},clearHdaSearch:function(m){this.searchFor="";this.filters=[];this.trigger("search:clear",this);this.renderHdas();return this},_showLoadingIndicator:function(n,m,o){m=(m!==undefined)?(m):(this.fxSpeed);if(!this.indicator){this.indicator=new LoadingIndicator(this.$el,this.$el.parent())}if(!this.$el.is(":visible")){this.indicator.show(0,o)}else{this.$el.fadeOut(m);this.indicator.show(n,m,o)}},_hideLoadingIndicator:function(m,n){m=(m!==undefined)?(m):(this.fxSpeed);if(this.indicator){this.indicator.hide(m,n)}},displayMessage:function(r,s,q){var o=this;this.scrollToTop();var p=this.$messages(),m=$("<div/>").addClass(r+"message").html(s);if(!_.isEmpty(q)){var n=$('<a href="javascript:void(0)">Details</a>').click(function(){Galaxy.modal.show(o._messageToModalOptions(r,s,q));return false});m.append(" ",n)}return p.html(m)},_messageToModalOptions:function(q,s,p){var m=this,r=$("<div/>"),o={title:"Details"};function n(t){t=_.omit(t,_.functions(t));return["<table>",_.map(t,function(v,u){v=(_.isObject(v))?(n(v)):(v);return'<tr><td style="vertical-align: top; color: grey">'+u+'</td><td style="padding-left: 8px">'+v+"</td></tr>"}).join(""),"</table>"].join("")}if(_.isObject(p)){o.body=r.append(n(p))}else{o.body=r.html(p)}o.buttons={Ok:function(){Galaxy.modal.hide();m.clearMessages()}};return o},clearMessages:function(){this.$messages().empty();return this},scrollPosition:function(){return this.$container().scrollTop()},scrollTo:function(m){this.$container().scrollTop(m);return this},scrollToTop:function(){this.$container().scrollTop(0);return this},scrollToId:function(n){if((!n)||(!this.hdaViews[n])){return this}var m=this.hdaViews[n];this.scrollTo(m.el.offsetTop);return this},scrollToHid:function(m){var n=this.model.hdas.getByHid(m);if(!n){return this}return this.scrollToId(n.id)},toString:function(){return"ReadOnlyHistoryPanel("+((this.model)?(this.model.get("name")):(""))+")"}});var l=['<div class="history-controls">','<div class="history-search-controls">','<div class="history-search-input"></div>',"</div>",'<div class="history-title">',"<% if( history.name ){ %>",'<div class="history-name"><%= history.name %></div>',"<% } %>","</div>",'<div class="history-subtitle clear">',"<% if( history.nice_size ){ %>",'<div class="history-size"><%= history.nice_size %></div>',"<% } %>",'<div class="history-secondary-actions"></div>',"</div>","<% if( history.deleted ){ %>",'<div class="warningmessagesmall"><strong>',d("You are currently viewing a deleted history!"),"</strong></div>","<% } %>",'<div class="message-container">',"<% if( history.message ){ %>",'<div class="<%= history.status %>message"><%= history.message %></div>',"<% } %>","</div>",'<div class="quota-message errormessage">',d("You are over your disk quota"),". ",d("Tool execution is on hold until your disk usage drops below your allocated quota"),".","</div>",'<div class="tags-display"></div>','<div class="annotation-display"></div>','<div class="history-dataset-actions">','<div class="btn-group">','<button class="history-select-all-datasets-btn btn btn-default"','data-mode="select">',d("All"),"</button>",'<button class="history-deselect-all-datasets-btn btn btn-default"','data-mode="select">',d("None"),"</button>","</div>",'<button class="history-dataset-action-popup-btn btn btn-default">',d("For all selected"),"...</button>","</div>","</div>",'<div class="datasets-list"></div>','<div class="empty-history-message infomessagesmall">',d("This history is empty"),"</div>"].join("");j.templates={historyPanel:function(m){return _.template(l,m,{variable:"history"})}};return{ReadOnlyHistoryPanel:j}});
\ No newline at end of file
+define(["mvc/history/history-model","mvc/collection/dataset-collection-base","mvc/dataset/hda-base","mvc/user/user-model","mvc/base-mvc","utils/localization"],function(g,k,b,a,f,d){var i=f.SessionStorageModel.extend({defaults:{expandedHdas:{},show_deleted:false,show_hidden:false},addExpandedHda:function(n){var m="expandedHdas";this.save(m,_.extend(this.get(m),_.object([n],[true])))},removeExpandedHda:function(n){var m="expandedHdas";this.save(m,_.omit(this.get(m),n))},toString:function(){return"HistoryPrefs("+this.id+")"}});i.storageKeyPrefix="history:";i.historyStorageKey=function e(m){if(!m){throw new Error("HistoryPrefs.historyStorageKey needs valid id: "+m)}return(i.storageKeyPrefix+m)};i.get=function c(m){return new i({id:i.historyStorageKey(m)})};i.clearAll=function h(n){for(var m in sessionStorage){if(m.indexOf(i.storageKeyPrefix)===0){sessionStorage.removeItem(m)}}};var j=Backbone.View.extend(f.LoggableMixin).extend({HDAViewClass:b.HDABaseView,tagName:"div",className:"history-panel",fxSpeed:"fast",emptyMsg:d("This history is empty"),noneFoundMsg:d("No matching datasets found"),initialize:function(m){m=m||{};if(m.logger){this.logger=m.logger}this.log(this+".initialize:",m);this.linkTarget=m.linkTarget||"_blank";this.fxSpeed=_.has(m,"fxSpeed")?(m.fxSpeed):(this.fxSpeed);this.filters=[];this.searchFor="";this.findContainerFn=m.findContainerFn;this.hdaViews={};this.indicator=new LoadingIndicator(this.$el);this._setUpListeners();var n=_.pick(m,"initiallyExpanded","show_deleted","show_hidden");this.setModel(this.model,n,false);if(m.onready){m.onready.call(this)}},_setUpListeners:function(){this.on("error",function(n,q,m,p,o){this.errorHandler(n,q,m,p,o)});this.on("loading-history",function(){this._showLoadingIndicator("loading history...",40)});this.on("loading-done",function(){this._hideLoadingIndicator(40);if(_.isEmpty(this.hdaViews)){this.trigger("empty-history",this)}});this.once("rendered",function(){this.trigger("rendered:initial",this);return false});if(this.logger){this.on("all",function(m){this.log(this+"",arguments)},this)}return this},errorHandler:function(o,r,n,q,p){console.error(o,r,n,q,p);if(r&&r.status===0&&r.readyState===0){}else{if(r&&r.status===502){}else{var m=this._parseErrorMessage(o,r,n,q,p);if(!this.$messages().is(":visible")){this.once("rendered",function(){this.displayMessage("error",m.message,m.details)})}else{this.displayMessage("error",m.message,m.details)}}}},_parseErrorMessage:function(p,t,o,s,r){var n=Galaxy.currUser,m={message:this._bePolite(s),details:{user:(n instanceof a.User)?(n.toJSON()):(n+""),source:(p instanceof Backbone.Model)?(p.toJSON()):(p+""),xhr:t,options:(t)?(_.omit(o,"xhr")):(o)}};_.extend(m.details,r||{});if(t&&_.isFunction(t.getAllResponseHeaders)){var q=t.getAllResponseHeaders();q=_.compact(q.split("\n"));q=_.map(q,function(u){return u.split(": ")});m.details.xhr.responseHeaders=_.object(q)}return m},_bePolite:function(m){m=m||d("An error occurred while getting updates from the server");return m+". "+d("Please contact a Galaxy administrator if the problem persists")+"."},loadHistoryWithHDADetails:function(o,n,m,q){var p=function(r){return _.keys(i.get(r.id).get("expandedHdas"))};return this.loadHistory(o,n,m,q,p)},loadHistory:function(p,o,n,s,q){var m=this;o=o||{};m.trigger("loading-history",m);var r=g.History.getHistoryData(p,{historyFn:n,hdaFn:s,hdaDetailIds:o.initiallyExpanded||q});return m._loadHistoryFromXHR(r,o).fail(function(v,t,u){m.trigger("error",m,v,o,d("An error was encountered while "+t),{historyId:p,history:u||{}})}).always(function(){m.trigger("loading-done",m)})},_loadHistoryFromXHR:function(o,n){var m=this;o.then(function(p,q){m.JSONToModel(p,q,n)});o.fail(function(q,p){m.render()});return o},JSONToModel:function(p,m,n){this.log("JSONToModel:",p,m,n);n=n||{};var o=new g.History(p,m,n);this.setModel(o);return this},setModel:function(n,m,o){m=m||{};o=(o!==undefined)?(o):(true);this.log("setModel:",n,m,o);this.freeModel();this.selectedHdaIds=[];if(n){this.model=n;if(this.logger){this.model.logger=this.logger}this._setUpWebStorage(m.initiallyExpanded,m.show_deleted,m.show_hidden);this._setUpModelEventHandlers();this.trigger("new-model",this)}if(o){this.render()}return this},freeModel:function(){if(this.model){this.model.clearUpdateTimeout();this.stopListening(this.model);this.stopListening(this.model.hdas)}this.freeHdaViews();return this},freeHdaViews:function(){this.hdaViews={};return this},_setUpWebStorage:function(n,m,o){this.storage=new i({id:i.historyStorageKey(this.model.get("id"))});if(_.isObject(n)){this.storage.set("exandedHdas",n)}if(_.isBoolean(m)){this.storage.set("show_deleted",m)}if(_.isBoolean(o)){this.storage.set("show_hidden",o)}this.trigger("new-storage",this.storage,this);this.log(this+" (init'd) storage:",this.storage.get());return this},_setUpModelEventHandlers:function(){this.model.hdas.on("add",this.addContentView,this);this.model.on("error error:hdas",function(n,p,m,o){this.errorHandler(n,p,m,o)},this);return this},render:function(o,p){this.log("render:",o,p);o=(o===undefined)?(this.fxSpeed):(o);var m=this,n;if(this.model){n=this.renderModel()}else{n=this.renderWithoutModel()}$(m).queue("fx",[function(q){if(o&&m.$el.is(":visible")){m.$el.fadeOut(o,q)}else{q()}},function(q){m.$el.empty();if(n){m.$el.append(n.children())}q()},function(q){if(o&&!m.$el.is(":visible")){m.$el.fadeIn(o,q)}else{q()}},function(q){if(p){p.call(this)}m.trigger("rendered",this);q()}]);return this},renderWithoutModel:function(){var m=$("<div/>"),n=$("<div/>").addClass("message-container").css({margin:"4px"});return m.append(n)},renderModel:function(){var m=$("<div/>");m.append(j.templates.historyPanel(this.model.toJSON()));this.$emptyMessage(m).text(this.emptyMsg);m.find(".history-secondary-actions").prepend(this._renderSearchButton());this._setUpBehaviours(m);this.renderHdas(m);return m},_renderEmptyMsg:function(o){var n=this,m=n.$emptyMessage(o);if(!_.isEmpty(n.hdaViews)){m.hide()}else{if(n.searchFor){m.text(n.noneFoundMsg).show()}else{m.text(n.emptyMsg).show()}}return this},_renderSearchButton:function(m){return faIconButton({title:d("Search datasets"),classes:"history-search-btn",faIcon:"fa-search"})},_setUpBehaviours:function(m){m=m||this.$el;m.find("[title]").tooltip({placement:"bottom"});this._setUpSearchInput(m.find(".history-search-controls .history-search-input"));return this},$container:function(){return(this.findContainerFn)?(this.findContainerFn.call(this)):(this.$el.parent())},$datasetsList:function(m){return(m||this.$el).find(".datasets-list")},$messages:function(m){return(m||this.$el).find(".message-container")},$emptyMessage:function(m){return(m||this.$el).find(".empty-history-message")},renderHdas:function(n){n=n||this.$el;var m=this,p={},o=this.model.hdas.getVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"),this.filters);this.$datasetsList(n).empty();if(o.length){o.each(function(r){var q=r.get("id"),s=m._createContentView(r);p[q]=s;if(_.contains(m.selectedHdaIds,q)){s.selected=true}m.attachContentView(s.render(),n)})}this.hdaViews=p;this._renderEmptyMsg(n);return this.hdaViews},_createContentView:function(n){var m=n.get("id"),p=n.get("history_content_type"),o=null;if(p==="dataset"){o=new this.HDAViewClass({model:n,linkTarget:this.linkTarget,expanded:this.storage.get("expandedHdas")[m],hasUser:this.model.ownedByCurrUser(),logger:this.logger})}else{o=new k.DatasetCollectionBaseView({model:n,linkTarget:this.linkTarget,expanded:this.storage.get("expandedHdas")[m],hasUser:this.model.ownedByCurrUser(),logger:this.logger})}this._setUpHdaListeners(o);return o},_setUpHdaListeners:function(n){var m=this;n.on("error",function(p,r,o,q){m.errorHandler(p,r,o,q)});n.on("body-expanded",function(o){m.storage.addExpandedHda(o)});n.on("body-collapsed",function(o){m.storage.removeExpandedHda(o)});return this},attachContentView:function(o,n){n=n||this.$el;var m=this.$datasetsList(n);m.prepend(o.$el);return this},addContentView:function(p){this.log("add."+this,p);var n=this;if(!p.isVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"))){return n}$({}).queue([function o(r){var q=n.$emptyMessage();if(q.is(":visible")){q.fadeOut(n.fxSpeed,r)}else{r()}},function m(q){var r=n._createContentView(p);n.hdaViews[p.id]=r;r.render().$el.hide();n.scrollToTop();n.attachContentView(r);r.$el.slideDown(n.fxSpeed)}]);return n},refreshContents:function(n,m){if(this.model){return this.model.refresh(n,m)}return $.when()},hdaViewRange:function(p,o){if(p===o){return[p]}var m=this,n=false,q=[];this.model.hdas.getVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"),this.filters).each(function(r){if(n){q.push(m.hdaViews[r.id]);if(r===p.model||r===o.model){n=false}}else{if(r===p.model||r===o.model){n=true;q.push(m.hdaViews[r.id])}}});return q},events:{"click .message-container":"clearMessages","click .history-search-btn":"toggleSearchControls"},collapseAllHdaBodies:function(){_.each(this.hdaViews,function(m){m.toggleBodyVisibility(null,false)});this.storage.set("expandedHdas",{});return this},toggleShowDeleted:function(m){m=(m!==undefined)?(m):(!this.storage.get("show_deleted"));this.storage.set("show_deleted",m);this.renderHdas();return this.storage.get("show_deleted")},toggleShowHidden:function(m){m=(m!==undefined)?(m):(!this.storage.get("show_hidden"));this.storage.set("show_hidden",m);this.renderHdas();return this.storage.get("show_hidden")},_setUpSearchInput:function(n){var o=this,p=".history-search-input";function m(q){if(o.model.hdas.haveDetails()){o.searchHdas(q);return}o.$el.find(p).searchInput("toggle-loading");o.model.hdas.fetchAllDetails({silent:true}).always(function(){o.$el.find(p).searchInput("toggle-loading")}).done(function(){o.searchHdas(q)})}n.searchInput({initialVal:o.searchFor,name:"history-search",placeholder:"search datasets",classes:"history-search",onfirstsearch:m,onsearch:_.bind(this.searchHdas,this),onclear:_.bind(this.clearHdaSearch,this)});return n},toggleSearchControls:function(o,m){var n=this.$el.find(".history-search-controls"),p=(jQuery.type(o)==="number")?(o):(this.fxSpeed);m=(m!==undefined)?(m):(!n.is(":visible"));if(m){n.slideDown(p,function(){$(this).find("input").focus()})}else{n.slideUp(p)}return m},searchHdas:function(m){var n=this;this.searchFor=m;this.filters=[function(o){return o.matchesAll(n.searchFor)}];this.trigger("search:searching",m,this);this.renderHdas();return this},clearHdaSearch:function(m){this.searchFor="";this.filters=[];this.trigger("search:clear",this);this.renderHdas();return this},_showLoadingIndicator:function(n,m,o){m=(m!==undefined)?(m):(this.fxSpeed);if(!this.indicator){this.indicator=new LoadingIndicator(this.$el,this.$el.parent())}if(!this.$el.is(":visible")){this.indicator.show(0,o)}else{this.$el.fadeOut(m);this.indicator.show(n,m,o)}},_hideLoadingIndicator:function(m,n){m=(m!==undefined)?(m):(this.fxSpeed);if(this.indicator){this.indicator.hide(m,n)}},displayMessage:function(r,s,q){var o=this;this.scrollToTop();var p=this.$messages(),m=$("<div/>").addClass(r+"message").html(s);if(!_.isEmpty(q)){var n=$('<a href="javascript:void(0)">Details</a>').click(function(){Galaxy.modal.show(o._messageToModalOptions(r,s,q));return false});m.append(" ",n)}return p.html(m)},_messageToModalOptions:function(q,s,p){var m=this,r=$("<div/>"),o={title:"Details"};function n(t){t=_.omit(t,_.functions(t));return["<table>",_.map(t,function(v,u){v=(_.isObject(v))?(n(v)):(v);return'<tr><td style="vertical-align: top; color: grey">'+u+'</td><td style="padding-left: 8px">'+v+"</td></tr>"}).join(""),"</table>"].join("")}if(_.isObject(p)){o.body=r.append(n(p))}else{o.body=r.html(p)}o.buttons={Ok:function(){Galaxy.modal.hide();m.clearMessages()}};return o},clearMessages:function(){this.$messages().empty();return this},scrollPosition:function(){return this.$container().scrollTop()},scrollTo:function(m){this.$container().scrollTop(m);return this},scrollToTop:function(){this.$container().scrollTop(0);return this},scrollToId:function(n){if((!n)||(!this.hdaViews[n])){return this}var m=this.hdaViews[n];this.scrollTo(m.el.offsetTop);return this},scrollToHid:function(m){var n=this.model.hdas.getByHid(m);if(!n){return this}return this.scrollToId(n.id)},toString:function(){return"ReadOnlyHistoryPanel("+((this.model)?(this.model.get("name")):(""))+")"}});var l=['<div class="history-controls">','<div class="history-search-controls">','<div class="history-search-input"></div>',"</div>",'<div class="history-title">',"<% if( history.name ){ %>",'<div class="history-name"><%= history.name %></div>',"<% } %>","</div>",'<div class="history-subtitle clear">',"<% if( history.nice_size ){ %>",'<div class="history-size"><%= history.nice_size %></div>',"<% } %>",'<div class="history-secondary-actions"></div>',"</div>","<% if( history.deleted ){ %>",'<div class="warningmessagesmall"><strong>',d("You are currently viewing a deleted history!"),"</strong></div>","<% } %>",'<div class="message-container">',"<% if( history.message ){ %>",'<div class="<%= history.status %>message"><%= history.message %></div>',"<% } %>","</div>",'<div class="quota-message errormessage">',d("You are over your disk quota"),". ",d("Tool execution is on hold until your disk usage drops below your allocated quota"),".","</div>",'<div class="tags-display"></div>','<div class="annotation-display"></div>','<div class="history-dataset-actions">','<div class="btn-group">','<button class="history-select-all-datasets-btn btn btn-default"','data-mode="select">',d("All"),"</button>",'<button class="history-deselect-all-datasets-btn btn btn-default"','data-mode="select">',d("None"),"</button>","</div>",'<button class="history-dataset-action-popup-btn btn btn-default">',d("For all selected"),"...</button>","</div>","</div>",'<div class="datasets-list"></div>','<div class="empty-history-message infomessagesmall">',d("This history is empty"),"</div>"].join("");j.templates={historyPanel:function(m){return _.template(l,m,{variable:"history"})}};return{ReadOnlyHistoryPanel:j}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0