Subversion Repository Public Repository

Nextrek

Diff Revisions 1084 vs 1086 for /s2s/data/CE4F231B812401459218A74604DDF88C533C.json

Diff revisions: vs.
  @@ -1 +1,18 @@
1 - {"uid":"CE4F231B812401459218A74604DDF88C533C","isLoaded":true,"lastModificationTime":0,"items":{"name":"Component_DataGridBehavior","type":"game_script","order":20,"content":"# ===================================================================\n#\n# Script: Component_DataGridBehavior\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_DataGridBehavior extends gs.Component_Visual\n class DataWrapper\n constructor: (data) ->\n @data = data\n @viewData = [yes, no, no, yes, no]\n \n class DataSource\n constructor: (source) ->\n @source = source || []\n @length = @source.length\n @wrappedSource = new Array(@source.length)\n @wrappedSource[i] = null for i in [0..@wrappedSource.length]\n \n set: (source) ->\n @source = source || []\n @length = @source.length\n @wrappedSource = new Array(@source.length)\n @wrappedSource[i] = null for i in [0..@wrappedSource.length]\n \n itemAt: (index) ->\n item = @wrappedSource[index]\n if !item\n item = new DataWrapper(@source[index])\n @wrappedSource[index] = item\n \n return item\n \n setItemAt:(index, data) ->\n if @wrappedSource[index]\n @wrappedSource[index].data = data\n @source[index] = data\n \n @accessors \"dataSource\", \n set: (v) ->\n if v != @dataSource_.source\n @dataSource_.set(v)\n @resize()\n get: -> @dataSource_\n \n ###*\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n ###\n onDataBundleRestore: (data, context) ->\n @setupEventHandlers()\n \n ###*\n * The data-grid behavior component defines the logic for a data-grid. A data-grid\n * allows to display items from a associated data-source using a specified\n * item-template. Unlike a stack-layout, a data-grid is optimized to display even high amounts of items but they all\n * need to use the same item-template with same size.\n *\n * @module ui\n * @class Component_DataGridBehavior\n * @extends gs.Component_Visual\n * @memberof ui\n * @constructor\n * @params {Object} params - The params-object containing the data-grid settings.\n ###\n constructor: (params) ->\n super()\n @params = params || {}\n ###*\n * The item-template descriptor used for each item of the data-grid.\n * @property template\n * @type Object\n ###\n @template = @params.template\n \n ###*\n * The data-source used for the data-grid. Can be an array or a formula.\n * @property dataSource\n * @type Object[]|string\n ###\n @dataSource_ = null\n \n ###*\n * Stores the item-objects needed for rendering. They are created from the item-template.\n * @property items\n * @protected\n * @type gs.Object_Base[]\n ###\n @items = @params.items || []\n \n ###*\n * Numbers of columns.\n * @property columns\n * @type number\n ###\n @columns = @params.columns || 1\n \n ###*\n * Indicates if the data-grid is initialized and ready for rendering.\n * @property initialized\n * @protected\n * @type boolean\n ###\n @initialized = no\n \n ###*\n * Defines a horizontal and vertical spacing between items.\n * @property spacing\n * @default [0, 10] \n * @type number[]\n ###\n @spacing = @params.spacing || [0, 0]\n \n ###*\n * Adds event-handlers for mouse/touch events\n *\n * @method setupEventHandlers\n ### \n setupEventHandlers: ->\n gs.GlobalEventManager.on \"mouseWheel\", =>\n r = @object.dstRect\n \n if Rect.contains(r.x, r.y, r.width, r.height, Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y)\n @updateScroll()\n \n ###*\n * Sets up the data-grid.\n *\n * @method setup\n ### \n setup: ->\n if @object.dstRect.width == 1 then return\n @initialized = yes\n\n if !@template.size\n item = ui.UIManager.createControlFromDescriptor(@template.descriptor, @object)\n item.index = 0\n item.update()\n @template.size = [item.dstRect.width, item.dstRect.height]\n item.dispose()\n \n if @params.dataSource.exec\n @dataSource_ = new DataSource(ui.Component_FormulaHandler.fieldValue(@object, @params.dataSource) || [])\n else\n @dataSource_ = new DataSource(@params.dataSource || [])\n \n @resize()\n \n @setupEventHandlers()\n \n super()\n \n ###*\n * Updates scrolling.\n *\n * @method updateScroll\n ###\n updateScroll: ->\n @object.scrollableHeight = Math.max(0, @object.contentHeight - @object.dstRect.height)\n if Input.Mouse.wheel <= -1\n @object.scrollOffsetY = Math.max(@object.scrollOffsetY - Input.Mouse.wheelSpeed * 0.1, 0)\n \n if Input.Mouse.wheel >= 1\n @object.scrollOffsetY = Math.min(@object.scrollOffsetY - Input.Mouse.wheelSpeed * 0.1, @object.scrollableHeight)\n \n \n @object.scrollOffsetY = Math.max(Math.min(@object.scrollOffsetY, @object.scrollableHeight), 0)\n \n ###*\n * Resizes the data-grid and creates the necessary display objects from the data-grid template.\n *\n * @method resize\n ### \n resize: ->\n width = @object.dstRect.width\n height = @object.dstRect.height\n \n itemsX = @columns || 1\n itemsY = Math.ceil((height-@spacing[1]) / (@template.size[1]+@spacing[1])) + @columns+1\n totalItemsY = Math.ceil(@dataSource.length / @columns)\n \n item?.dispose() for item in @items\n @items = [] #new Array(itemsX * itemsY)\n \n for y in [0...itemsY]\n for x in [0...itemsX]\n index = y * itemsX + x\n if index < @dataSource.length\n item = ui.UIManager.createControlFromDescriptor(@template.descriptor, @object)\n\n item.data[0] = @dataSource.itemAt(index).data \n item.dstRect.x = @spacing[0] + x * (@template.size[0]+@spacing[0])\n item.dstRect.y = @spacing[1] + y * (@template.size[1]+@spacing[1])\n item.dstRect.width = @template.size[0]\n item.dstRect.height = @template.size[1]\n item.index = index\n item.ui.viewData = @dataSource.itemAt(index).viewData\n \n @items[item.index] = item\n @object.addObject(item)\n \n @object.scrollableHeight = @spacing[1] + totalItemsY * (@template.size[1]+@spacing[1]) - height\n @object.scrollOffsetY = 0\n @object.contentHeight = @spacing[1] + totalItemsY * (@template.size[1]+@spacing[1])\n\n itemAtIndex: (index) ->\n @items.first (item) -> item.index == index\n \n indexForItem: (item) -> item.index\n \n ###*\n * Updates the data-grid.\n *\n * @method update\n ### \n update: ->\n super()\n \n if not @initialized\n @setup()\n \n scrollOffset = @object.scrollOffsetY\n offset = Math.floor((scrollOffset) / (@template.size[1]+@spacing[1])) * @columns\n i = offset\n itemIndex = 0\n itemsY = Math.ceil((@object.dstRect.height-@spacing[1]) / (@template.size[1]+@spacing[1])) * @columns + @columns+1\n \n while i < Math.min(offset+itemsY, @dataSource.length)\n row = Math.floor(i / @columns)\n column = i % @columns\n item = @items[itemIndex]\n if item\n item.data[0] = @dataSource.itemAt(i).data\n if @object.clipRect\n item.clipRect = @object.clipRect\n item.index = i\n item.ui.viewData = @dataSource.itemAt(i).viewData\n item.dstRect.x = @spacing[0] + column * (@template.size[0]+@spacing[0])\n item.dstRect.y = @spacing[1] + (row-(offset/@columns)) * (@template.size[1]+@spacing[1]) + (-scrollOffset % (@template.size[1]+@spacing[1]))\n item.visible = yes\n item.update()\n item.update()\n itemIndex++\n \n i++\n \n for j in [itemIndex...@items.length]\n if @items[j]\n @items[j].visible = no\n @items[j].update()\n \n \n \nui.Component_DataGridBehavior = Component_DataGridBehavior","parentId":"01A95DA3K01E8A4CB4SBE17E790BCE1FC035","folder":false,"compiledContent":"var Component_DataGridBehavior,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nComponent_DataGridBehavior = (function(superClass) {\n var DataSource, DataWrapper;\n\n extend(Component_DataGridBehavior, superClass);\n\n DataWrapper = (function() {\n function DataWrapper(data) {\n this.data = data;\n this.viewData = [true, false, false, true, false];\n }\n\n return DataWrapper;\n\n })();\n\n DataSource = (function() {\n function DataSource(source) {\n var i, k, ref;\n this.source = source || [];\n this.length = this.source.length;\n this.wrappedSource = new Array(this.source.length);\n for (i = k = 0, ref = this.wrappedSource.length; 0 <= ref ? k <= ref : k >= ref; i = 0 <= ref ? ++k : --k) {\n this.wrappedSource[i] = null;\n }\n }\n\n DataSource.prototype.set = function(source) {\n var i, k, ref, results;\n this.source = source || [];\n this.length = this.source.length;\n this.wrappedSource = new Array(this.source.length);\n results = [];\n for (i = k = 0, ref = this.wrappedSource.length; 0 <= ref ? k <= ref : k >= ref; i = 0 <= ref ? ++k : --k) {\n results.push(this.wrappedSource[i] = null);\n }\n return results;\n };\n\n DataSource.prototype.itemAt = function(index) {\n var item;\n item = this.wrappedSource[index];\n if (!item) {\n item = new DataWrapper(this.source[index]);\n this.wrappedSource[index] = item;\n }\n return item;\n };\n\n DataSource.prototype.setItemAt = function(index, data) {\n if (this.wrappedSource[index]) {\n this.wrappedSource[index].data = data;\n }\n return this.source[index] = data;\n };\n\n return DataSource;\n\n })();\n\n Component_DataGridBehavior.accessors(\"dataSource\", {\n set: function(v) {\n if (v !== this.dataSource_.source) {\n this.dataSource_.set(v);\n return this.resize();\n }\n },\n get: function() {\n return this.dataSource_;\n }\n });\n\n\n /**\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n */\n\n Component_DataGridBehavior.prototype.onDataBundleRestore = function(data, context) {\n return this.setupEventHandlers();\n };\n\n\n /**\n * The data-grid behavior component defines the logic for a data-grid. A data-grid\n * allows to display items from a associated data-source using a specified\n * item-template. Unlike a stack-layout, a data-grid is optimized to display even high amounts of items but they all\n * need to use the same item-template with same size.\n *\n * @module ui\n * @class Component_DataGridBehavior\n * @extends gs.Component_Visual\n * @memberof ui\n * @constructor\n * @params {Object} params - The params-object containing the data-grid settings.\n */\n\n function Component_DataGridBehavior(params) {\n Component_DataGridBehavior.__super__.constructor.call(this);\n this.params = params || {};\n\n /**\n * The item-template descriptor used for each item of the data-grid.\n * @property template\n * @type Object\n */\n this.template = this.params.template;\n\n /**\n * The data-source used for the data-grid. Can be an array or a formula.\n * @property dataSource\n * @type Object[]|string\n */\n this.dataSource_ = null;\n\n /**\n * Stores the item-objects needed for rendering. They are created from the item-template.\n * @property items\n * @protected\n * @type gs.Object_Base[]\n */\n this.items = this.params.items || [];\n\n /**\n * Numbers of columns.\n * @property columns\n * @type number\n */\n this.columns = this.params.columns || 1;\n\n /**\n * Indicates if the data-grid is initialized and ready for rendering.\n * @property initialized\n * @protected\n * @type boolean\n */\n this.initialized = false;\n\n /**\n * Defines a horizontal and vertical spacing between items.\n * @property spacing\n * @default [0, 10] \n * @type number[]\n */\n this.spacing = this.params.spacing || [0, 0];\n }\n\n\n /**\n * Adds event-handlers for mouse/touch events\n *\n * @method setupEventHandlers\n */\n\n Component_DataGridBehavior.prototype.setupEventHandlers = function() {\n return gs.GlobalEventManager.on(\"mouseWheel\", (function(_this) {\n return function() {\n var r;\n r = _this.object.dstRect;\n if (Rect.contains(r.x, r.y, r.width, r.height, Input.Mouse.x - _this.object.origin.x, Input.Mouse.y - _this.object.origin.y)) {\n return _this.updateScroll();\n }\n };\n })(this));\n };\n\n\n /**\n * Sets up the data-grid.\n *\n * @method setup\n */\n\n Component_DataGridBehavior.prototype.setup = function() {\n var item;\n if (this.object.dstRect.width === 1) {\n return;\n }\n this.initialized = true;\n if (!this.template.size) {\n item = ui.UIManager.createControlFromDescriptor(this.template.descriptor, this.object);\n item.index = 0;\n item.update();\n this.template.size = [item.dstRect.width, item.dstRect.height];\n item.dispose();\n }\n if (this.params.dataSource.exec) {\n this.dataSource_ = new DataSource(ui.Component_FormulaHandler.fieldValue(this.object, this.params.dataSource) || []);\n } else {\n this.dataSource_ = new DataSource(this.params.dataSource || []);\n }\n this.resize();\n this.setupEventHandlers();\n return Component_DataGridBehavior.__super__.setup.call(this);\n };\n\n\n /**\n * Updates scrolling.\n *\n * @method updateScroll\n */\n\n Component_DataGridBehavior.prototype.updateScroll = function() {\n this.object.scrollableHeight = Math.max(0, this.object.contentHeight - this.object.dstRect.height);\n if (Input.Mouse.wheel <= -1) {\n this.object.scrollOffsetY = Math.max(this.object.scrollOffsetY - Input.Mouse.wheelSpeed * 0.1, 0);\n }\n if (Input.Mouse.wheel >= 1) {\n this.object.scrollOffsetY = Math.min(this.object.scrollOffsetY - Input.Mouse.wheelSpeed * 0.1, this.object.scrollableHeight);\n }\n return this.object.scrollOffsetY = Math.max(Math.min(this.object.scrollOffsetY, this.object.scrollableHeight), 0);\n };\n\n\n /**\n * Resizes the data-grid and creates the necessary display objects from the data-grid template.\n *\n * @method resize\n */\n\n Component_DataGridBehavior.prototype.resize = function() {\n var height, index, item, itemsX, itemsY, k, l, len, m, ref, ref1, ref2, totalItemsY, width, x, y;\n width = this.object.dstRect.width;\n height = this.object.dstRect.height;\n itemsX = this.columns || 1;\n itemsY = Math.ceil((height - this.spacing[1]) / (this.template.size[1] + this.spacing[1])) + this.columns + 1;\n totalItemsY = Math.ceil(this.dataSource.length / this.columns);\n ref = this.items;\n for (k = 0, len = ref.length; k < len; k++) {\n item = ref[k];\n if (item != null) {\n item.dispose();\n }\n }\n this.items = [];\n for (y = l = 0, ref1 = itemsY; 0 <= ref1 ? l < ref1 : l > ref1; y = 0 <= ref1 ? ++l : --l) {\n for (x = m = 0, ref2 = itemsX; 0 <= ref2 ? m < ref2 : m > ref2; x = 0 <= ref2 ? ++m : --m) {\n index = y * itemsX + x;\n if (index < this.dataSource.length) {\n item = ui.UIManager.createControlFromDescriptor(this.template.descriptor, this.object);\n item.data[0] = this.dataSource.itemAt(index).data;\n item.dstRect.x = this.spacing[0] + x * (this.template.size[0] + this.spacing[0]);\n item.dstRect.y = this.spacing[1] + y * (this.template.size[1] + this.spacing[1]);\n item.dstRect.width = this.template.size[0];\n item.dstRect.height = this.template.size[1];\n item.index = index;\n item.ui.viewData = this.dataSource.itemAt(index).viewData;\n this.items[item.index] = item;\n this.object.addObject(item);\n }\n }\n }\n this.object.scrollableHeight = this.spacing[1] + totalItemsY * (this.template.size[1] + this.spacing[1]) - height;\n this.object.scrollOffsetY = 0;\n return this.object.contentHeight = this.spacing[1] + totalItemsY * (this.template.size[1] + this.spacing[1]);\n };\n\n Component_DataGridBehavior.prototype.itemAtIndex = function(index) {\n return this.items.first(function(item) {\n return item.index === index;\n });\n };\n\n Component_DataGridBehavior.prototype.indexForItem = function(item) {\n return item.index;\n };\n\n\n /**\n * Updates the data-grid.\n *\n * @method update\n */\n\n Component_DataGridBehavior.prototype.update = function() {\n var column, i, item, itemIndex, itemsY, j, k, offset, ref, ref1, results, row, scrollOffset;\n Component_DataGridBehavior.__super__.update.call(this);\n if (!this.initialized) {\n this.setup();\n }\n scrollOffset = this.object.scrollOffsetY;\n offset = Math.floor(scrollOffset / (this.template.size[1] + this.spacing[1])) * this.columns;\n i = offset;\n itemIndex = 0;\n itemsY = Math.ceil((this.object.dstRect.height - this.spacing[1]) / (this.template.size[1] + this.spacing[1])) * this.columns + this.columns + 1;\n while (i < Math.min(offset + itemsY, this.dataSource.length)) {\n row = Math.floor(i / this.columns);\n column = i % this.columns;\n item = this.items[itemIndex];\n if (item) {\n item.data[0] = this.dataSource.itemAt(i).data;\n if (this.object.clipRect) {\n item.clipRect = this.object.clipRect;\n }\n item.index = i;\n item.ui.viewData = this.dataSource.itemAt(i).viewData;\n item.dstRect.x = this.spacing[0] + column * (this.template.size[0] + this.spacing[0]);\n item.dstRect.y = this.spacing[1] + (row - (offset / this.columns)) * (this.template.size[1] + this.spacing[1]) + (-scrollOffset % (this.template.size[1] + this.spacing[1]));\n item.visible = true;\n item.update();\n item.update();\n itemIndex++;\n }\n i++;\n }\n results = [];\n for (j = k = ref = itemIndex, ref1 = this.items.length; ref <= ref1 ? k < ref1 : k > ref1; j = ref <= ref1 ? ++k : --k) {\n if (this.items[j]) {\n this.items[j].visible = false;\n results.push(this.items[j].update());\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n return Component_DataGridBehavior;\n\n})(gs.Component_Visual);\n\nui.Component_DataGridBehavior = Component_DataGridBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsMEJBQUE7RUFBQTs7O0FBQU07QUFDRixNQUFBOzs7O0VBQU07SUFDVyxxQkFBQyxJQUFEO01BQ1QsSUFBQyxDQUFBLElBQUQsR0FBUTtNQUNSLElBQUMsQ0FBQSxRQUFELEdBQVksQ0FBQyxJQUFELEVBQU0sS0FBTixFQUFVLEtBQVYsRUFBYyxJQUFkLEVBQW1CLEtBQW5CO0lBRkg7Ozs7OztFQUlYO0lBQ1csb0JBQUMsTUFBRDtBQUNULFVBQUE7TUFBQSxJQUFDLENBQUEsTUFBRCxHQUFVLE1BQUEsSUFBVTtNQUNwQixJQUFDLENBQUEsTUFBRCxHQUFVLElBQUMsQ0FBQSxNQUFNLENBQUM7TUFDbEIsSUFBQyxDQUFBLGFBQUQsR0FBcUIsSUFBQSxLQUFBLENBQU0sSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFkO0FBQ3JCLFdBQWtDLG9HQUFsQztRQUFBLElBQUMsQ0FBQSxhQUFjLENBQUEsQ0FBQSxDQUFmLEdBQW9CO0FBQXBCO0lBSlM7O3lCQU1iLEdBQUEsR0FBSyxTQUFDLE1BQUQ7QUFDRCxVQUFBO01BQUEsSUFBQyxDQUFBLE1BQUQsR0FBVSxNQUFBLElBQVU7TUFDcEIsSUFBQyxDQUFBLE1BQUQsR0FBVSxJQUFDLENBQUEsTUFBTSxDQUFDO01BQ2xCLElBQUMsQ0FBQSxhQUFELEdBQXFCLElBQUEsS0FBQSxDQUFNLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBZDtBQUNyQjtXQUFrQyxvR0FBbEM7cUJBQUEsSUFBQyxDQUFBLGFBQWMsQ0FBQSxDQUFBLENBQWYsR0FBb0I7QUFBcEI7O0lBSkM7O3lCQU1MLE1BQUEsR0FBUSxTQUFDLEtBQUQ7QUFDSixVQUFBO01BQUEsSUFBQSxHQUFPLElBQUMsQ0FBQSxhQUFjLENBQUEsS0FBQTtNQUN0QixJQUFHLENBQUMsSUFBSjtRQUNJLElBQUEsR0FBVyxJQUFBLFdBQUEsQ0FBWSxJQUFDLENBQUEsTUFB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PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiNcbiMgICBTY3JpcHQ6IENvbXBvbmVudF9EYXRhR3JpZEJlaGF2aW9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jbGFzcyBDb21wb25lbnRfRGF0YUdyaWRCZWhhdmlvciBleHRlbmRzIGdzLkNvbXBvbmVudF9WaXN1YWxcbiAgICBjbGFzcyBEYXRhV3JhcHBlclxuICAgICAgICBjb25zdHJ1Y3RvcjogKGRhdGEpIC0+XG4gICAgICAgICAgICBAZGF0YSA9IGRhdGFcbiAgICAgICAgICAgIEB2aWV3RGF0YSA9IFt5ZXMsIG5vLCBubywgeWVzLCBub11cbiAgICBcbiAgICBjbGFzcyBEYXRhU291cmNlXG4gICAgICAgIGNvbnN0cnVjdG9yOiAoc291cmNlKSAtPlxuICAgICAgICAgICAgQHNvdXJjZSA9IHNvdXJjZSB8fCBbXVxuICAgICAgICAgICAgQGxlbmd0aCA9IEBzb3VyY2UubGVuZ3RoXG4gICAgICAgICAgICBAd3JhcHBlZFNvdXJjZSA9IG5ldyBBcnJheShAc291cmNlLmxlbmd0aClcbiAgICAgICAgICAgIEB3cmFwcGVkU291cmNlW2ldID0gbnVsbCBmb3IgaSBpbiBbMC4uQHdyYXBwZWRTb3VyY2UubGVuZ3RoXVxuICAgICAgICAgICAgICAgIFxuICAgICAgICBzZXQ6IChzb3VyY2UpIC0+XG4gICAgICAgICAgICBAc291cmNlID0gc291cmNlIHx8IFtdXG4gICAgICAgICAgICBAbGVuZ3RoID0gQHNvdXJjZS5sZW5ndGhcbiAgICAgICAgICAgIEB3cmFwcGVkU291cmNlID0gbmV3IEFycmF5KEBzb3VyY2UubGVuZ3RoKVxuICAgICAgICAgICAgQHdyYXBwZWRTb3VyY2VbaV0gPSBudWxsIGZvciBpIGluIFswLi5Ad3JhcHBlZFNvdXJjZS5sZW5ndGhdXG4gICAgICAgICAgICBcbiAgICAgICAgaXRlbUF0OiAoaW5kZXgpIC0+XG4gICAgICAgICAgICBpdGVtID0gQHdyYXBwZWRTb3VyY2VbaW5kZXhdXG4gICAgICAgICAgICBpZiAhaXRlbVxuICAgICAgICAgICAgICAgIGl0ZW0gPSBuZXcgRGF0YVdyYXBwZXIoQHNvdXJjZVtpbmRleF0pXG4gICAgICAgICAgICAgICAgQHdyYXBwZWRTb3VyY2VbaW5kZXhdID0gaXRlbVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICBcbiAgICAgICAgc2V0SXRlbUF0OihpbmRleCwgZGF0YSkgLT5cbiAgICAgICAgICAgIGlmIEB3cmFwcGVkU291cmNlW2luZGV4XVxuICAgICAgICAgICAgICAgIEB3cmFwcGVkU291cmNlW2luZGV4XS5kYXRhID0gZGF0YVxuICAgICAgICAgICAgQHNvdXJjZVtpbmRleF0gPSBkYXRhXG4gICAgICAgICAgICBcbiAgICBAYWNjZXNzb3JzIFwiZGF0YVNvdXJjZVwiLCBcbiAgICAgICAgc2V0OiAodikgLT5cbiAgICAgICAgICAgIGlmIHYgIT0gQGRhdGFTb3VyY2VfLnNvdXJjZVxuICAgICAgICAgICAgICAgIEBkYXRhU291cmNlXy5zZXQodilcbiAgICAgICAgICAgICAgICBAcmVzaXplKClcbiAgICAgICAgZ2V0OiAtPiBAZGF0YVNvdXJjZV9cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQ2FsbGVkIGlmIHRoaXMgb2JqZWN0IGluc3RhbmNlIGlzIHJlc3RvcmVkIGZyb20gYSBkYXRhLWJ1bmRsZS4gSXQgY2FuIGJlIHVzZWRcbiAgICAqIHJlLWFzc2lnbiBldmVudC1oYW5kbGVyLCBhbm9ueW1vdXMgZnVuY3Rpb25zLCBldGMuXG4gICAgKiBcbiAgICAqIEBtZXRob2Qgb25EYXRhQnVuZGxlUmVzdG9yZS5cbiAgICAqIEBwYXJhbSBPYmplY3QgZGF0YSAtIFRoZSBkYXRhLWJ1bmRsZVxuICAgICogQHBhcmFtIGdzLk9iamVjdENvZGVjQ29udGV4dCBjb250ZXh0IC0gVGhlIGNvZGVjLWNvbnRleHQuXG4gICAgIyMjXG4gICAgb25EYXRhQnVuZGxlUmVzdG9yZTogKGRhdGEsIGNvbnRleHQpIC0+XG4gICAgICAgIEBzZXR1cEV2ZW50SGFuZGxlcnMoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBUaGUgZGF0YS1ncmlkIGJlaGF2aW9yIGNvbXBvbmVudCBkZWZpbmVzIHRoZSBsb2dpYyBmb3IgYSBkYXRhLWdyaWQuIEEgZGF0YS1ncmlkXG4gICAgKiBhbGxvd3MgdG8gZGlzcGxheSBpdGVtcyBmcm9tIGEgYXNzb2NpYXRlZCBkYXRhLXNvdXJjZSB1c2luZyBhIHNwZWNpZmllZFxuICAgICogaXRlbS10ZW1wbGF0ZS4gVW5saWtlIGEgc3RhY2stbGF5b3V0LCBhIGRhdGEtZ3JpZCBpcyBvcHRpbWl6ZWQgdG8gZGlzcGxheSBldmVuIGhpZ2ggYW1vdW50cyBvZiBpdGVtcyBidXQgdGhleSBhbGxcbiAgICAqIG5lZWQgdG8gdXNlIHRoZSBzYW1lIGl0ZW0tdGVtcGxhdGUgd2l0aCBzYW1lIHNpemUuXG4gICAgKlxuICAgICogQG1vZHVsZSB1aVxuICAgICogQGNsYXNzIENvbXBvbmVudF9EYXRhR3JpZEJlaGF2aW9yXG4gICAgKiBAZXh0ZW5kcyBncy5Db21wb25lbnRfVmlzdWFsXG4gICAgKiBAbWVtYmVyb2YgdWlcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICogQHBhcmFtcyB7T2JqZWN0fSBwYXJhbXMgLSBUaGUgcGFyYW1zLW9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhLWdyaWQgc2V0dGluZ3MuXG4gICAgIyMjXG4gICAgY29uc3RydWN0b3I6IChwYXJhbXMpIC0+XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgQHBhcmFtcyA9IHBhcmFtcyB8fCB7fVxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIGl0ZW0tdGVtcGxhdGUgZGVzY3JpcHRvciB1c2VkIGZvciBlYWNoIGl0ZW0gb2YgdGhlIGRhdGEtZ3JpZC5cbiAgICAgICAgKiBAcHJvcGVydHkgdGVtcGxhdGVcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjXG4gICAgICAgIEB0ZW1wbGF0ZSA9IEBwYXJhbXMudGVtcGxhdGVcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZGF0YS1zb3VyY2UgdXNlZCBmb3IgdGhlIGRhdGEtZ3JpZC4gQ2FuIGJlIGFuIGFycmF5IG9yIGEgZm9ybXVsYS5cbiAgICAgICAgKiBAcHJvcGVydHkgZGF0YVNvdXJjZVxuICAgICAgICAqIEB0eXBlIE9iamVjdFtdfHN0cmluZ1xuICAgICAgICAjIyNcbiAgICAgICAgQGRhdGFTb3VyY2VfID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFN0b3JlcyB0aGUgaXRlbS1vYmplY3RzIG5lZWRlZCBmb3IgcmVuZGVyaW5nLiBUaGV5IGFyZSBjcmVhdGVkIGZyb20gdGhlIGl0ZW0tdGVtcGxhdGUuXG4gICAgICAgICogQHByb3BlcnR5IGl0ZW1zXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAqIEB0eXBlIGdzLk9iamVjdF9CYXNlW11cbiAgICAgICAgIyMjXG4gICAgICAgIEBpdGVtcyA9IEBwYXJhbXMuaXRlbXMgfHwgW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBOdW1iZXJzIG9mIGNvbHVtbnMuXG4gICAgICAgICogQHByb3BlcnR5IGNvbHVtbnNcbiAgICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAgIyMjXG4gICAgICAgIEBjb2x1bW5zID0gQHBhcmFtcy5jb2x1bW5zIHx8IDFcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGRhdGEtZ3JpZCBpcyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHJlbmRlcmluZy5cbiAgICAgICAgKiBAcHJvcGVydHkgaW5pdGlhbGl6ZWRcbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAjIyNcbiAgICAgICAgQGluaXRpYWxpemVkID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBEZWZpbmVzIGEgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc3BhY2luZyBiZXR3ZWVuIGl0ZW1zLlxuICAgICAgICAqIEBwcm9wZXJ0eSBzcGFjaW5nXG4gICAgICAgICogQGRlZmF1bHQgWzAsIDEwXSAgICAgICAgXG4gICAgICAgICogQHR5cGUgbnVtYmVyW11cbiAgICAgICAgIyMjXG4gICAgICAgIEBzcGFjaW5nID0gQHBhcmFtcy5zcGFjaW5nIHx8IFswLCAwXVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBBZGRzIGV2ZW50LWhhbmRsZXJzIGZvciBtb3VzZS90b3VjaCBldmVudHNcbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwRXZlbnRIYW5kbGVyc1xuICAgICMjIyBcbiAgICBzZXR1cEV2ZW50SGFuZGxlcnM6IC0+XG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vbiBcIm1vdXNlV2hlZWxcIiwgPT5cbiAgICAgICAgICAgIHIgPSBAb2JqZWN0LmRzdFJlY3RcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgUmVjdC5jb250YWlucyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQsIElucHV0Lk1vdXNlLnggLSBAb2JqZWN0Lm9yaWdpbi54LCBJbnB1dC5Nb3VzZS55IC0gQG9iamVjdC5vcmlnaW4ueSlcbiAgICAgICAgICAgICAgICBAdXBkYXRlU2Nyb2xsKClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBTZXRzIHVwIHRoZSBkYXRhLWdyaWQuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cFxuICAgICMjIyAgIFxuICAgIHNldHVwOiAtPlxuICAgICAgICBpZiBAb2JqZWN0LmRzdFJlY3Qud2lkdGggPT0gMSB0aGVuIHJldHVyblxuICAgICAgICBAaW5pdGlhbGl6ZWQgPSB5ZXNcblxuICAgICAgICBpZiAhQHRlbXBsYXRlLnNpemVcbiAgICAgICAgICAgIGl0ZW0gPSB1aS5VSU1hbmFnZXIuY3JlYXRlQ29udHJvbEZyb21EZXNjcmlwdG9yKEB0ZW1wbGF0ZS5kZXNjcmlwdG9yLCBAb2JqZWN0KVxuICAgICAgICAgICAgaXRlbS5pbmRleCA9IDBcbiAgICAgICAgICAgIGl0ZW0udXBkYXRlKClcbiAgICAgICAgICAgIEB0ZW1wbGF0ZS5zaXplID0gW2l0ZW0uZHN0UmVjdC53aWR0aCwgaXRlbS5kc3RSZWN0LmhlaWdodF1cbiAgICAgICAgICAgIGl0ZW0uZGlzcG9zZSgpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgQHBhcmFtcy5kYXRhU291cmNlLmV4ZWNcbiAgICAgICAgICAgIEBkYXRhU291cmNlXyA9IG5ldyBEYXRhU291cmNlKHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKEBvYmplY3QsIEBwYXJhbXMuZGF0YVNvdXJjZSkgfHwgW10pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBkYXRhU291cmNlXyA9IG5ldyBEYXRhU291cmNlKEBwYXJhbXMuZGF0YVNvdXJjZSB8fCBbXSlcbiAgICAgICAgXG4gICAgICAgIEByZXNpemUoKVxuICAgICAgICBcbiAgICAgICAgQHNldHVwRXZlbnRIYW5kbGVycygpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyBzY3JvbGxpbmcuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVTY3JvbGxcbiAgICAjIyNcbiAgICB1cGRhdGVTY3JvbGw6IC0+XG4gICAgICAgIEBvYmplY3Quc2Nyb2xsYWJsZUhlaWdodCA9IE1hdGgubWF4KDAsIEBvYmplY3QuY29udGVudEhlaWdodCAtIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQpXG4gICAgICAgIGlmIElucHV0Lk1vdXNlLndoZWVsIDw9IC0xXG4gICAgICAgICAgICBAb2JqZWN0LnNjcm9sbE9mZnNldFkgPSBNYXRoLm1heChAb2JqZWN0LnNjcm9sbE9mZnNldFkgLSBJbnB1dC5Nb3VzZS53aGVlbFNwZWVkICogMC4xLCAwKVxuICAgICAgICAgICBcbiAgICAgICAgaWYgSW5wdXQuTW91c2Uud2hlZWwgPj0gMVxuICAgICAgICAgICAgQG9iamVjdC5zY3JvbGxPZmZzZXRZID0gTWF0aC5taW4oQG9iamVjdC5zY3JvbGxPZmZzZXRZIC0gSW5wdXQuTW91c2Uud2hlZWxTcGVlZCAqIDAuMSwgQG9iamVjdC5zY3JvbGxhYmxlSGVpZ2h0KVxuICAgICAgICAgICAgXG4gICAgXG4gICAgICAgIEBvYmplY3Quc2Nyb2xsT2Zmc2V0WSA9IE1hdGgubWF4KE1hdGgubWluKEBvYmplY3Quc2Nyb2xsT2Zmc2V0WSwgQG9iamVjdC5zY3JvbGxhYmxlSGVpZ2h0KSwgMClcbiAgICAgICAgIFxuICAgICMjIypcbiAgICAqIFJlc2l6ZXMgdGhlIGRhdGEtZ3JpZCBhbmQgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IGRpc3BsYXkgb2JqZWN0cyBmcm9tIHRoZSBkYXRhLWdyaWQgdGVtcGxhdGUuXG4gICAgKlxuICAgICogQG1ldGhvZCByZXNpemVcbiAgICAjIyMgICAgIFxuICAgIHJlc2l6ZTogLT5cbiAgICAgICAgd2lkdGggPSBAb2JqZWN0LmRzdFJlY3Qud2lkdGhcbiAgICAgICAgaGVpZ2h0ID0gQG9iamVjdC5kc3RSZWN0LmhlaWdodFxuICAgICAgICBcbiAgICAgICAgaXRlbXNYID0gQGNvbHVtbnMgfHwgMVxuICAgICAgICBpdGVtc1kgPSBNYXRoLmNlaWwoKGhlaWdodC1Ac3BhY2luZ1sxXSkgLyAoQHRlbXBsYXRlLnNpemVbMV0rQHNwYWNpbmdbMV0pKSArIEBjb2x1bW5zKzFcbiAgICAgICAgdG90YWxJdGVtc1kgPSBNYXRoLmNlaWwoQGRhdGFTb3VyY2UubGVuZ3RoIC8gQGNvbHVtbnMpXG4gICAgICAgIFxuICAgICAgICBpdGVtPy5kaXNwb3NlKCkgZm9yIGl0ZW0gaW4gQGl0ZW1zXG4gICAgICAgIEBpdGVtcyA9IFtdICNuZXcgQXJyYXkoaXRlbXNYICogaXRlbXNZKVxuICAgICAgICBcbiAgICAgICAgZm9yIHkgaW4gWzAuLi5pdGVtc1ldXG4gICAgICAgICAgICBmb3IgeCBpbiBbMC4uLml0ZW1zWF1cbiAgICAgICAgICAgICAgICBpbmRleCAgPSB5ICogaXRlbXNYICsgeFxuICAgICAgICAgICAgICAgIGlmIGluZGV4IDwgQGRhdGFTb3VyY2UubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSB1aS5VSU1hbmFnZXIuY3JlYXRlQ29udHJvbEZyb21EZXNjcmlwdG9yKEB0ZW1wbGF0ZS5kZXNjcmlwdG9yLCBAb2JqZWN0KVxuXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZGF0YVswXSA9IEBkYXRhU291cmNlLml0ZW1BdChpbmRleCkuZGF0YSAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZHN0UmVjdC54ID0gQHNwYWNpbmdbMF0gKyB4ICogKEB0ZW1wbGF0ZS5zaXplWzBdK0BzcGFjaW5nWzBdKVxuICAgICAgICAgICAgICAgICAgICBpdGVtLmRzdFJlY3QueSA9IEBzcGFjaW5nWzFdICsgeSAqIChAdGVtcGxhdGUuc2l6ZVsxXStAc3BhY2luZ1sxXSlcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kc3RSZWN0LndpZHRoID0gQHRlbXBsYXRlLnNpemVbMF1cbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kc3RSZWN0LmhlaWdodCA9IEB0ZW1wbGF0ZS5zaXplWzFdXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uaW5kZXggPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICBpdGVtLnVpLnZpZXdEYXRhID0gQGRhdGFTb3VyY2UuaXRlbUF0KGluZGV4KS52aWV3RGF0YVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgQGl0ZW1zW2l0ZW0uaW5kZXhdID0gaXRlbVxuICAgICAgICAgICAgICAgICAgICBAb2JqZWN0LmFkZE9iamVjdChpdGVtKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICBAb2JqZWN0LnNjcm9sbGFibGVIZWlnaHQgPSBAc3BhY2luZ1sxXSArIHRvdGFsSXRlbXNZICogKEB0ZW1wbGF0ZS5zaXplWzFdK0BzcGFjaW5nWzFdKSAtIGhlaWdodFxuICAgICAgICBAb2JqZWN0LnNjcm9sbE9mZnNldFkgPSAwXG4gICAgICAgIEBvYmplY3QuY29udGVudEhlaWdodCA9IEBzcGFjaW5nWzFdICsgdG90YWxJdGVtc1kgKiAoQHRlbXBsYXRlLnNpemVbMV0rQHNwYWNpbmdbMV0pXG5cbiAgICBpdGVtQXRJbmRleDogKGluZGV4KSAtPlxuICAgICAgICBAaXRlbXMuZmlyc3QgKGl0ZW0pIC0+IGl0ZW0uaW5kZXggPT0gaW5kZXhcbiAgICAgICAgXG4gICAgaW5kZXhGb3JJdGVtOiAoaXRlbSkgLT4gaXRlbS5pbmRleFxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBkYXRhLWdyaWQuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyMgIFxuICAgIHVwZGF0ZTogLT5cbiAgICAgICAgc3VwZXIoKVxuICAgICAgICBcbiAgICAgICAgaWYgbm90IEBpbml0aWFsaXplZFxuICAgICAgICAgICAgQHNldHVwKClcbiAgICAgICAgXG4gICAgICAgIHNjcm9sbE9mZnNldCA9IEBvYmplY3Quc2Nyb2xsT2Zmc2V0WVxuICAgICAgICBvZmZzZXQgPSBNYXRoLmZsb29yKChzY3JvbGxPZmZzZXQpIC8gKEB0ZW1wbGF0ZS5zaXplWzFdK0BzcGFjaW5nWzFdKSkgKiBAY29sdW1uc1xuICAgICAgICBpID0gb2Zmc2V0XG4gICAgICAgIGl0ZW1JbmRleCA9IDBcbiAgICAgICAgaXRlbXNZID0gTWF0aC5jZWlsKChAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0LUBzcGFjaW5nWzFdKSAvICAoQHRlbXBsYXRlLnNpemVbMV0rQHNwYWNpbmdbMV0pKSAqIEBjb2x1bW5zICsgQGNvbHVtbnMrMVxuICAgICAgICBcbiAgICAgICAgd2hpbGUgaSA8IE1hdGgubWluKG9mZnNldCtpdGVtc1ksIEBkYXRhU291cmNlLmxlbmd0aClcbiAgICAgICAgICAgIHJvdyA9IE1hdGguZmxvb3IoaSAvIEBjb2x1bW5zKVxuICAgICAgICAgICAgY29sdW1uID0gaSAlIEBjb2x1bW5zXG4gICAgICAgICAgICBpdGVtID0gQGl0ZW1zW2l0ZW1JbmRleF1cbiAgICAgICAgICAgIGlmIGl0ZW1cbiAgICAgICAgICAgICAgICBpdGVtLmRhdGFbMF0gPSBAZGF0YVNvdXJjZS5pdGVtQXQoaSkuZGF0YVxuICAgICAgICAgICAgICAgIGlmIEBvYmplY3QuY2xpcFJlY3RcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jbGlwUmVjdCA9IEBvYmplY3QuY2xpcFJlY3RcbiAgICAgICAgICAgICAgICBpdGVtLmluZGV4ID0gaVxuICAgICAgICAgICAgICAgIGl0ZW0udWkudmlld0RhdGEgPSBAZGF0YVNvdXJjZS5pdGVtQXQoaSkudmlld0RhdGFcbiAgICAgICAgICAgICAgICBpdGVtLmRzdFJlY3QueCA9IEBzcGFjaW5nWzBdICsgY29sdW1uICogKEB0ZW1wbGF0ZS5zaXplWzBdK0BzcGFjaW5nWzBdKVxuICAgICAgICAgICAgICAgIGl0ZW0uZHN0UmVjdC55ID0gQHNwYWNpbmdbMV0gKyAocm93LShvZmZzZXQvQGNvbHVtbnMpKSAqIChAdGVtcGxhdGUuc2l6ZVsxXStAc3BhY2luZ1sxXSkgKyAoLXNjcm9sbE9mZnNldCAlIChAdGVtcGxhdGUuc2l6ZVsxXStAc3BhY2luZ1sxXSkpXG4gICAgICAgICAgICAgICAgaXRlbS52aXNpYmxlID0geWVzXG4gICAgICAgICAgICAgICAgaXRlbS51cGRhdGUoKVxuICAgICAgICAgICAgICAgIGl0ZW0udXBkYXRlKClcbiAgICAgICAgICAgICAgICBpdGVtSW5kZXgrK1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGkrK1xuICAgICAgICBcbiAgICAgICAgZm9yIGogaW4gW2l0ZW1JbmRleC4uLkBpdGVtcy5sZW5ndGhdXG4gICAgICAgICAgICBpZiBAaXRlbXNbal1cbiAgICAgICAgICAgICAgICBAaXRlbXNbal0udmlzaWJsZSA9IG5vXG4gICAgICAgICAgICAgICAgQGl0ZW1zW2pdLnVwZGF0ZSgpXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgXG51aS5Db21wb25lbnRfRGF0YUdyaWRCZWhhdmlvciA9IENvbXBvbmVudF9EYXRhR3JpZEJlaGF2aW9yIl19\n//# sourceURL=Component_DataGridBehavior_172.js"},"summary":["name","type"]}
1 + {
2 + "uid": "CE4F231B812401459218A74604DDF88C533C",
3 + "isLoaded": true,
4 + "lastModificationTime": 0,
5 + "items": {
6 + "name": "Component_DataGridBehavior",
7 + "type": "game_script",
8 + "order": 20,
9 + "content": "# ===================================================================\n#\n# Script: Component_DataGridBehavior\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_DataGridBehavior extends gs.Component_Visual\n class DataWrapper\n constructor: (data) ->\n @data = data\n @viewData = [yes, no, no, yes, no]\n \n class DataSource\n constructor: (source) ->\n @source = source || []\n @length = @source.length\n @wrappedSource = new Array(@source.length)\n @wrappedSource[i] = null for i in [0..@wrappedSource.length]\n \n set: (source) ->\n @source = source || []\n @length = @source.length\n @wrappedSource = new Array(@source.length)\n @wrappedSource[i] = null for i in [0..@wrappedSource.length]\n \n itemAt: (index) ->\n item = @wrappedSource[index]\n if !item\n item = new DataWrapper(@source[index])\n @wrappedSource[index] = item\n \n return item\n \n setItemAt:(index, data) ->\n if @wrappedSource[index]\n @wrappedSource[index].data = data\n @source[index] = data\n \n @accessors \"dataSource\", \n set: (v) ->\n if v != @dataSource_.source\n @dataSource_.set(v)\n @resize()\n get: -> @dataSource_\n \n ###*\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n ###\n onDataBundleRestore: (data, context) ->\n @setupEventHandlers()\n \n ###*\n * The data-grid behavior component defines the logic for a data-grid. A data-grid\n * allows to display items from a associated data-source using a specified\n * item-template. Unlike a stack-layout, a data-grid is optimized to display even high amounts of items but they all\n * need to use the same item-template with same size.\n *\n * @module ui\n * @class Component_DataGridBehavior\n * @extends gs.Component_Visual\n * @memberof ui\n * @constructor\n * @params {Object} params - The params-object containing the data-grid settings.\n ###\n constructor: (params) ->\n super()\n @params = params || {}\n ###*\n * The item-template descriptor used for each item of the data-grid.\n * @property template\n * @type Object\n ###\n @template = @params.template\n \n ###*\n * The data-source used for the data-grid. Can be an array or a formula.\n * @property dataSource\n * @type Object[]|string\n ###\n @dataSource_ = null\n \n ###*\n * Stores the item-objects needed for rendering. They are created from the item-template.\n * @property items\n * @protected\n * @type gs.Object_Base[]\n ###\n @items = @params.items || []\n \n ###*\n * Numbers of columns.\n * @property columns\n * @type number\n ###\n @columns = @params.columns || 1\n \n ###*\n * Indicates if the data-grid is initialized and ready for rendering.\n * @property initialized\n * @protected\n * @type boolean\n ###\n @initialized = no\n \n ###*\n * Defines a horizontal and vertical spacing between items.\n * @property spacing\n * @default [0, 10] \n * @type number[]\n ###\n @spacing = @params.spacing || [0, 0]\n \n ###*\n * Adds event-handlers for mouse/touch events\n *\n * @method setupEventHandlers\n ### \n setupEventHandlers: ->\n gs.GlobalEventManager.on \"mouseWheel\", =>\n r = @object.dstRect\n \n if Rect.contains(r.x, r.y, r.width, r.height, Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y)\n @updateScroll()\n \n ###*\n * Sets up the data-grid.\n *\n * @method setup\n ### \n setup: ->\n if @object.dstRect.width == 1 then return\n @initialized = yes\n\n if !@template.size\n item = ui.UIManager.createControlFromDescriptor(@template.descriptor, @object)\n item.index = 0\n item.update()\n @template.size = [item.dstRect.width, item.dstRect.height]\n item.dispose()\n \n if @params.dataSource.exec\n @dataSource_ = new DataSource(ui.Component_FormulaHandler.fieldValue(@object, @params.dataSource) || [])\n else\n @dataSource_ = new DataSource(@params.dataSource || [])\n \n @resize()\n \n @setupEventHandlers()\n \n super()\n \n @object.scrollableHeight = Math.max(0, @object.contentHeight - @object.dstRect.height)\n \n \n ###*\n * Scrolls to the end.\n *\n * @method scrollToEnd\n ### \n scrollToEnd: ->\n @object.scrollOffsetY = @object.scrollableHeight\n \n ###*\n * Updates scrolling.\n *\n * @method updateScroll\n ###\n updateScroll: ->\n @object.scrollableHeight = Math.max(0, @object.contentHeight - @object.dstRect.height)\n if Input.Mouse.wheel <= -1\n @object.scrollOffsetY = Math.max(@object.scrollOffsetY - Input.Mouse.wheelSpeed * 0.1, 0)\n \n if Input.Mouse.wheel >= 1\n @object.scrollOffsetY = Math.min(@object.scrollOffsetY - Input.Mouse.wheelSpeed * 0.1, @object.scrollableHeight)\n \n \n @object.scrollOffsetY = Math.max(Math.min(@object.scrollOffsetY, @object.scrollableHeight), 0)\n \n ###*\n * Resizes the data-grid and creates the necessary display objects from the data-grid template.\n *\n * @method resize\n ### \n resize: ->\n width = @object.dstRect.width\n height = @object.dstRect.height\n \n itemsX = @columns || 1\n itemsY = Math.ceil((height-@spacing[1]) / (@template.size[1]+@spacing[1])) + @columns+1\n totalItemsY = Math.ceil(@dataSource.length / @columns)\n \n item?.dispose() for item in @items\n @items = [] #new Array(itemsX * itemsY)\n \n for y in [0...itemsY]\n for x in [0...itemsX]\n index = y * itemsX + x\n if index < @dataSource.length\n item = ui.UIManager.createControlFromDescriptor(@template.descriptor, @object)\n\n item.data[0] = @dataSource.itemAt(index).data \n item.dstRect.x = @spacing[0] + x * (@template.size[0]+@spacing[0])\n item.dstRect.y = @spacing[1] + y * (@template.size[1]+@spacing[1])\n item.dstRect.width = @template.size[0]\n item.dstRect.height = @template.size[1]\n item.index = index\n item.ui.viewData = @dataSource.itemAt(index).viewData\n \n @items[item.index] = item\n @object.addObject(item)\n \n @object.scrollableHeight = @spacing[1] + totalItemsY * (@template.size[1]+@spacing[1]) - height\n @object.scrollOffsetY = 0\n @object.contentHeight = @spacing[1] + totalItemsY * (@template.size[1]+@spacing[1])\n\n itemAtIndex: (index) ->\n @items.first (item) -> item.index == index\n \n indexForItem: (item) -> item.index\n \n ###*\n * Updates the data-grid.\n *\n * @method update\n ### \n update: ->\n super()\n \n if not @initialized\n @setup()\n \n scrollOffset = @object.scrollOffsetY\n offset = Math.floor((scrollOffset) / (@template.size[1]+@spacing[1])) * @columns\n i = offset\n itemIndex = 0\n itemsY = Math.ceil((@object.dstRect.height-@spacing[1]) / (@template.size[1]+@spacing[1])) * @columns + @columns+1\n \n while i < Math.min(offset+itemsY, @dataSource.length)\n row = Math.floor(i / @columns)\n column = i % @columns\n item = @items[itemIndex]\n if item\n item.data[0] = @dataSource.itemAt(i).data\n if @object.clipRect\n item.clipRect = @object.clipRect\n item.index = i\n item.ui.viewData = @dataSource.itemAt(i).viewData\n item.dstRect.x = @spacing[0] + column * (@template.size[0]+@spacing[0])\n item.dstRect.y = @spacing[1] + (row-(offset/@columns)) * (@template.size[1]+@spacing[1]) + (-scrollOffset % (@template.size[1]+@spacing[1]))\n item.visible = yes\n item.update()\n item.update()\n itemIndex++\n \n i++\n \n for j in [itemIndex...@items.length]\n if @items[j]\n @items[j].visible = no\n @items[j].update()\n \n \n \nui.Component_DataGridBehavior = Component_DataGridBehavior",
10 + "parentId": "01A95DA3K01E8A4CB4SBE17E790BCE1FC035",
11 + "folder": false,
12 + "compiledContent": "var Component_DataGridBehavior,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nComponent_DataGridBehavior = (function(superClass) {\n var DataSource, DataWrapper;\n\n extend(Component_DataGridBehavior, superClass);\n\n DataWrapper = (function() {\n function DataWrapper(data) {\n this.data = data;\n this.viewData = [true, false, false, true, false];\n }\n\n return DataWrapper;\n\n })();\n\n DataSource = (function() {\n function DataSource(source) {\n var i, k, ref;\n this.source = source || [];\n this.length = this.source.length;\n this.wrappedSource = new Array(this.source.length);\n for (i = k = 0, ref = this.wrappedSource.length; 0 <= ref ? k <= ref : k >= ref; i = 0 <= ref ? ++k : --k) {\n this.wrappedSource[i] = null;\n }\n }\n\n DataSource.prototype.set = function(source) {\n var i, k, ref, results;\n this.source = source || [];\n this.length = this.source.length;\n this.wrappedSource = new Array(this.source.length);\n results = [];\n for (i = k = 0, ref = this.wrappedSource.length; 0 <= ref ? k <= ref : k >= ref; i = 0 <= ref ? ++k : --k) {\n results.push(this.wrappedSource[i] = null);\n }\n return results;\n };\n\n DataSource.prototype.itemAt = function(index) {\n var item;\n item = this.wrappedSource[index];\n if (!item) {\n item = new DataWrapper(this.source[index]);\n this.wrappedSource[index] = item;\n }\n return item;\n };\n\n DataSource.prototype.setItemAt = function(index, data) {\n if (this.wrappedSource[index]) {\n this.wrappedSource[index].data = data;\n }\n return this.source[index] = data;\n };\n\n return DataSource;\n\n })();\n\n Component_DataGridBehavior.accessors(\"dataSource\", {\n set: function(v) {\n if (v !== this.dataSource_.source) {\n this.dataSource_.set(v);\n return this.resize();\n }\n },\n get: function() {\n return this.dataSource_;\n }\n });\n\n\n /**\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n */\n\n Component_DataGridBehavior.prototype.onDataBundleRestore = function(data, context) {\n return this.setupEventHandlers();\n };\n\n\n /**\n * The data-grid behavior component defines the logic for a data-grid. A data-grid\n * allows to display items from a associated data-source using a specified\n * item-template. Unlike a stack-layout, a data-grid is optimized to display even high amounts of items but they all\n * need to use the same item-template with same size.\n *\n * @module ui\n * @class Component_DataGridBehavior\n * @extends gs.Component_Visual\n * @memberof ui\n * @constructor\n * @params {Object} params - The params-object containing the data-grid settings.\n */\n\n function Component_DataGridBehavior(params) {\n Component_DataGridBehavior.__super__.constructor.call(this);\n this.params = params || {};\n\n /**\n * The item-template descriptor used for each item of the data-grid.\n * @property template\n * @type Object\n */\n this.template = this.params.template;\n\n /**\n * The data-source used for the data-grid. Can be an array or a formula.\n * @property dataSource\n * @type Object[]|string\n */\n this.dataSource_ = null;\n\n /**\n * Stores the item-objects needed for rendering. They are created from the item-template.\n * @property items\n * @protected\n * @type gs.Object_Base[]\n */\n this.items = this.params.items || [];\n\n /**\n * Numbers of columns.\n * @property columns\n * @type number\n */\n this.columns = this.params.columns || 1;\n\n /**\n * Indicates if the data-grid is initialized and ready for rendering.\n * @property initialized\n * @protected\n * @type boolean\n */\n this.initialized = false;\n\n /**\n * Defines a horizontal and vertical spacing between items.\n * @property spacing\n * @default [0, 10] \n * @type number[]\n */\n this.spacing = this.params.spacing || [0, 0];\n }\n\n\n /**\n * Adds event-handlers for mouse/touch events\n *\n * @method setupEventHandlers\n */\n\n Component_DataGridBehavior.prototype.setupEventHandlers = function() {\n return gs.GlobalEventManager.on(\"mouseWheel\", (function(_this) {\n return function() {\n var r;\n r = _this.object.dstRect;\n if (Rect.contains(r.x, r.y, r.width, r.height, Input.Mouse.x - _this.object.origin.x, Input.Mouse.y - _this.object.origin.y)) {\n return _this.updateScroll();\n }\n };\n })(this));\n };\n\n\n /**\n * Sets up the data-grid.\n *\n * @method setup\n */\n\n Component_DataGridBehavior.prototype.setup = function() {\n var item;\n if (this.object.dstRect.width === 1) {\n return;\n }\n this.initialized = true;\n if (!this.template.size) {\n item = ui.UIManager.createControlFromDescriptor(this.template.descriptor, this.object);\n item.index = 0;\n item.update();\n this.template.size = [item.dstRect.width, item.dstRect.height];\n item.dispose();\n }\n if (this.params.dataSource.exec) {\n this.dataSource_ = new DataSource(ui.Component_FormulaHandler.fieldValue(this.object, this.params.dataSource) || []);\n } else {\n this.dataSource_ = new DataSource(this.params.dataSource || []);\n }\n this.resize();\n this.setupEventHandlers();\n Component_DataGridBehavior.__super__.setup.call(this);\n return this.object.scrollableHeight = Math.max(0, this.object.contentHeight - this.object.dstRect.height);\n };\n\n\n /**\n * Scrolls to the end.\n *\n * @method scrollToEnd\n */\n\n Component_DataGridBehavior.prototype.scrollToEnd = function() {\n return this.object.scrollOffsetY = this.object.scrollableHeight;\n };\n\n\n /**\n * Updates scrolling.\n *\n * @method updateScroll\n */\n\n Component_DataGridBehavior.prototype.updateScroll = function() {\n this.object.scrollableHeight = Math.max(0, this.object.contentHeight - this.object.dstRect.height);\n if (Input.Mouse.wheel <= -1) {\n this.object.scrollOffsetY = Math.max(this.object.scrollOffsetY - Input.Mouse.wheelSpeed * 0.1, 0);\n }\n if (Input.Mouse.wheel >= 1) {\n this.object.scrollOffsetY = Math.min(this.object.scrollOffsetY - Input.Mouse.wheelSpeed * 0.1, this.object.scrollableHeight);\n }\n return this.object.scrollOffsetY = Math.max(Math.min(this.object.scrollOffsetY, this.object.scrollableHeight), 0);\n };\n\n\n /**\n * Resizes the data-grid and creates the necessary display objects from the data-grid template.\n *\n * @method resize\n */\n\n Component_DataGridBehavior.prototype.resize = function() {\n var height, index, item, itemsX, itemsY, k, l, len, m, ref, ref1, ref2, totalItemsY, width, x, y;\n width = this.object.dstRect.width;\n height = this.object.dstRect.height;\n itemsX = this.columns || 1;\n itemsY = Math.ceil((height - this.spacing[1]) / (this.template.size[1] + this.spacing[1])) + this.columns + 1;\n totalItemsY = Math.ceil(this.dataSource.length / this.columns);\n ref = this.items;\n for (k = 0, len = ref.length; k < len; k++) {\n item = ref[k];\n if (item != null) {\n item.dispose();\n }\n }\n this.items = [];\n for (y = l = 0, ref1 = itemsY; 0 <= ref1 ? l < ref1 : l > ref1; y = 0 <= ref1 ? ++l : --l) {\n for (x = m = 0, ref2 = itemsX; 0 <= ref2 ? m < ref2 : m > ref2; x = 0 <= ref2 ? ++m : --m) {\n index = y * itemsX + x;\n if (index < this.dataSource.length) {\n item = ui.UIManager.createControlFromDescriptor(this.template.descriptor, this.object);\n item.data[0] = this.dataSource.itemAt(index).data;\n item.dstRect.x = this.spacing[0] + x * (this.template.size[0] + this.spacing[0]);\n item.dstRect.y = this.spacing[1] + y * (this.template.size[1] + this.spacing[1]);\n item.dstRect.width = this.template.size[0];\n item.dstRect.height = this.template.size[1];\n item.index = index;\n item.ui.viewData = this.dataSource.itemAt(index).viewData;\n this.items[item.index] = item;\n this.object.addObject(item);\n }\n }\n }\n this.object.scrollableHeight = this.spacing[1] + totalItemsY * (this.template.size[1] + this.spacing[1]) - height;\n this.object.scrollOffsetY = 0;\n return this.object.contentHeight = this.spacing[1] + totalItemsY * (this.template.size[1] + this.spacing[1]);\n };\n\n Component_DataGridBehavior.prototype.itemAtIndex = function(index) {\n return this.items.first(function(item) {\n return item.index === index;\n });\n };\n\n Component_DataGridBehavior.prototype.indexForItem = function(item) {\n return item.index;\n };\n\n\n /**\n * Updates the data-grid.\n *\n * @method update\n */\n\n Component_DataGridBehavior.prototype.update = function() {\n var column, i, item, itemIndex, itemsY, j, k, offset, ref, ref1, results, row, scrollOffset;\n Component_DataGridBehavior.__super__.update.call(this);\n if (!this.initialized) {\n this.setup();\n }\n scrollOffset = this.object.scrollOffsetY;\n offset = Math.floor(scrollOffset / (this.template.size[1] + this.spacing[1])) * this.columns;\n i = offset;\n itemIndex = 0;\n itemsY = Math.ceil((this.object.dstRect.height - this.spacing[1]) / (this.template.size[1] + this.spacing[1])) * this.columns + this.columns + 1;\n while (i < Math.min(offset + itemsY, this.dataSource.length)) {\n row = Math.floor(i / this.columns);\n column = i % this.columns;\n item = this.items[itemIndex];\n if (item) {\n item.data[0] = this.dataSource.itemAt(i).data;\n if (this.object.clipRect) {\n item.clipRect = this.object.clipRect;\n }\n item.index = i;\n item.ui.viewData = this.dataSource.itemAt(i).viewData;\n item.dstRect.x = this.spacing[0] + column * (this.template.size[0] + this.spacing[0]);\n item.dstRect.y = this.spacing[1] + (row - (offset / this.columns)) * (this.template.size[1] + this.spacing[1]) + (-scrollOffset % (this.template.size[1] + this.spacing[1]));\n item.visible = true;\n item.update();\n item.update();\n itemIndex++;\n }\n i++;\n }\n results = [];\n for (j = k = ref = itemIndex, ref1 = this.items.length; ref <= ref1 ? k < ref1 : k > ref1; j = ref <= ref1 ? ++k : --k) {\n if (this.items[j]) {\n this.items[j].visible = false;\n results.push(this.items[j].update());\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n return Component_DataGridBehavior;\n\n})(gs.Component_Visual);\n\nui.Component_DataGridBehavior = Component_DataGridBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsMEJBQUE7RUFBQTs7O0FBQU07QUFDRixNQUFBOzs7O0VBQU07SUFDVyxxQkFBQyxJQUFEO01BQ1QsSUFBQyxDQUFBLElBQUQsR0FBUTtNQUNSLElBQUMsQ0FBQSxRQUFELEdBQVksQ0FBQyxJQUFELEVBQU0sS0FBTixFQUFVLEtBQVYsRUFBYyxJQUFkLEVBQW1CLEtBQW5CO0lBRkg7Ozs7OztFQUlYO0lBQ1csb0JBQUMsTUFBRDtBQUNULFVBQUE7TUFBQSxJQUFDLENBQUEsTUFBRCxHQUFVLE1BQUEsSUFBVTtNQUNwQixJQUFDLENBQUEsTUFBRCxHQUFVLElBQUMsQ0FBQSxNQUFNLENBQUM7TUFDbEIsSUFBQyxDQUFBLGFBQUQsR0FBcUIsSUFBQSxLQUFBLENBQU0sSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFkO0FBQ3JCLFdBQWtDLG9HQUFsQztRQUFBLElBQUMsQ0FBQSxhQUFjLENBQUEsQ0FBQSxDQUFmLEdBQW9CO0FBQXBCO0lBSlM7O3lCQU1iLEdBQUEsR0FBSyxTQUFDLE1BQUQ7QUFDRCxVQUFBO01BQUEsSUFBQyxDQUFBLE1BQUQsR0FBVSxNQUFBLElBQVU7TUFDcEIsSUFBQyxDQUFBLE1BQUQsR0FBVSxJQUFDLENBQUEsTUFBTSxDQUFDO01BQ2xCLElBQUMsQ0FBQSxhQUFELEdBQXFCLElBQUEsS0FBQSxDQUFNLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBZDtBQUNyQjtXQUFrQyxvR0FBbEM7cUJBQUEsSUFBQyxDQUFBLGFBQWMsQ0FBQSxDQUFBLENBQWYsR0FBb0I7QUFBcEI7O0lBSkM7O3lCQU1MLE1BQUEsR0FBUSxTQUFDLEtBQUQ7QUFDSixVQUFBO01BQUEsSUFBQSxHQUFPLElBQUMsQ0FBQSxhQUFjLENBQUEsS0FBQTtNQUN0QixJQUFHLENBQUMsSUFBSjtRQUNJLElBQUEsR0FBVyxJQUFBLFdBQUEsQ0FBWSxJQUFDLENBQUEsTUFB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LEtBQU0sQ0FBQSxDQUFBLENBQUUsQ0FBQyxPQUFWLEdBQW9CO3FCQUNwQixJQUFDLENBQUEsS0FBTSxDQUFBLENBQUEsQ0FBRSxDQUFDLE1BQVYsQ0FBQSxHQUZKO09BQUEsTUFBQTs2QkFBQTs7QUFESjs7RUEvQkk7Ozs7R0FoTzZCLEVBQUUsQ0FBQzs7QUFzUTVDLEVBQUUsQ0FBQywwQkFBSCxHQUFnQyIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogQ29tcG9uZW50X0RhdGFHcmlkQmVoYXZpb3JcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIENvbXBvbmVudF9EYXRhR3JpZEJlaGF2aW9yIGV4dGVuZHMgZ3MuQ29tcG9uZW50X1Zpc3VhbFxuICAgIGNsYXNzIERhdGFXcmFwcGVyXG4gICAgICAgIGNvbnN0cnVjdG9yOiAoZGF0YSkgLT5cbiAgICAgICAgICAgIEBkYXRhID0gZGF0YVxuICAgICAgICAgICAgQHZpZXdEYXRhID0gW3llcywgbm8sIG5vLCB5ZXMsIG5vXVxuICAgIFxuICAgIGNsYXNzIERhdGFTb3VyY2VcbiAgICAgICAgY29uc3RydWN0b3I6IChzb3VyY2UpIC0+XG4gICAgICAgICAgICBAc291cmNlID0gc291cmNlIHx8IFtdXG4gICAgICAgICAgICBAbGVuZ3RoID0gQHNvdXJjZS5sZW5ndGhcbiAgICAgICAgICAgIEB3cmFwcGVkU291cmNlID0gbmV3IEFycmF5KEBzb3VyY2UubGVuZ3RoKVxuICAgICAgICAgICAgQHdyYXBwZWRTb3VyY2VbaV0gPSBudWxsIGZvciBpIGluIFswLi5Ad3JhcHBlZFNvdXJjZS5sZW5ndGhdXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIHNldDogKHNvdXJjZSkgLT5cbiAgICAgICAgICAgIEBzb3VyY2UgPSBzb3VyY2UgfHwgW11cbiAgICAgICAgICAgIEBsZW5ndGggPSBAc291cmNlLmxlbmd0aFxuICAgICAgICAgICAgQHdyYXBwZWRTb3VyY2UgPSBuZXcgQXJyYXkoQHNvdXJjZS5sZW5ndGgpXG4gICAgICAgICAgICBAd3JhcHBlZFNvdXJjZVtpXSA9IG51bGwgZm9yIGkgaW4gWzAuLkB3cmFwcGVkU291cmNlLmxlbmd0aF1cbiAgICAgICAgICAgIFxuICAgICAgICBpdGVtQXQ6IChpbmRleCkgLT5cbiAgICAgICAgICAgIGl0ZW0gPSBAd3JhcHBlZFNvdXJjZVtpbmRleF1cbiAgICAgICAgICAgIGlmICFpdGVtXG4gICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBEYXRhV3JhcHBlcihAc291cmNlW2luZGV4XSlcbiAgICAgICAgICAgICAgICBAd3JhcHBlZFNvdXJjZVtpbmRleF0gPSBpdGVtXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gaXRlbVxuICAgIFxuICAgICAgICBzZXRJdGVtQXQ6KGluZGV4LCBkYXRhKSAtPlxuICAgICAgICAgICAgaWYgQHdyYXBwZWRTb3VyY2VbaW5kZXhdXG4gICAgICAgICAgICAgICAgQHdyYXBwZWRTb3VyY2VbaW5kZXhdLmRhdGEgPSBkYXRhXG4gICAgICAgICAgICBAc291cmNlW2luZGV4XSA9IGRhdGFcbiAgICAgICAgICAgIFxuICAgIEBhY2Nlc3NvcnMgXCJkYXRhU291cmNlXCIsIFxuICAgICAgICBzZXQ6ICh2KSAtPlxuICAgICAgICAgICAgaWYgdiAhPSBAZGF0YVNvdXJjZV8uc291cmNlXG4gICAgICAgICAgICAgICAgQGRhdGFTb3VyY2VfLnNldCh2KVxuICAgICAgICAgICAgICAgIEByZXNpemUoKVxuICAgICAgICBnZXQ6IC0+IEBkYXRhU291cmNlX1xuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgQHNldHVwRXZlbnRIYW5kbGVycygpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFRoZSBkYXRhLWdyaWQgYmVoYXZpb3IgY29tcG9uZW50IGRlZmluZXMgdGhlIGxvZ2ljIGZvciBhIGRhdGEtZ3JpZC4gQSBkYXRhLWdyaWRcbiAgICAqIGFsbG93cyB0byBkaXNwbGF5IGl0ZW1zIGZyb20gYSBhc3NvY2lhdGVkIGRhdGEtc291cmNlIHVzaW5nIGEgc3BlY2lmaWVkXG4gICAgKiBpdGVtLXRlbXBsYXRlLiBVbmxpa2UgYSBzdGFjay1sYXlvdXQsIGEgZGF0YS1ncmlkIGlzIG9wdGltaXplZCB0byBkaXNwbGF5IGV2ZW4gaGlnaCBhbW91bnRzIG9mIGl0ZW1zIGJ1dCB0aGV5IGFsbFxuICAgICogbmVlZCB0byB1c2UgdGhlIHNhbWUgaXRlbS10ZW1wbGF0ZSB3aXRoIHNhbWUgc2l6ZS5cbiAgICAqXG4gICAgKiBAbW9kdWxlIHVpXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X0RhdGFHcmlkQmVoYXZpb3JcbiAgICAqIEBleHRlbmRzIGdzLkNvbXBvbmVudF9WaXN1YWxcbiAgICAqIEBtZW1iZXJvZiB1aVxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKiBAcGFyYW1zIHtPYmplY3R9IHBhcmFtcyAtIFRoZSBwYXJhbXMtb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRhdGEtZ3JpZCBzZXR0aW5ncy5cbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogKHBhcmFtcykgLT5cbiAgICAgICAgc3VwZXIoKVxuICAgICAgICBAcGFyYW1zID0gcGFyYW1zIHx8IHt9XG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgaXRlbS10ZW1wbGF0ZSBkZXNjcmlwdG9yIHVzZWQgZm9yIGVhY2ggaXRlbSBvZiB0aGUgZGF0YS1ncmlkLlxuICAgICAgICAqIEBwcm9wZXJ0eSB0ZW1wbGF0ZVxuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyNcbiAgICAgICAgQHRlbXBsYXRlID0gQHBhcmFtcy50ZW1wbGF0ZVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBkYXRhLXNvdXJjZSB1c2VkIGZvciB0aGUgZGF0YS1ncmlkLiBDYW4gYmUgYW4gYXJyYXkgb3IgYSBmb3JtdWxhLlxuICAgICAgICAqIEBwcm9wZXJ0eSBkYXRhU291cmNlXG4gICAgICAgICogQHR5cGUgT2JqZWN0W118c3RyaW5nXG4gICAgICAgICMjI1xuICAgICAgICBAZGF0YVNvdXJjZV8gPSBudWxsXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogU3RvcmVzIHRoZSBpdGVtLW9iamVjdHMgbmVlZGVkIGZvciByZW5kZXJpbmcuIFRoZXkgYXJlIGNyZWF0ZWQgZnJvbSB0aGUgaXRlbS10ZW1wbGF0ZS5cbiAgICAgICAgKiBAcHJvcGVydHkgaXRlbXNcbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICogQHR5cGUgZ3MuT2JqZWN0X0Jhc2VbXVxuICAgICAgICAjIyNcbiAgICAgICAgQGl0ZW1zID0gQHBhcmFtcy5pdGVtcyB8fCBbXVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIE51bWJlcnMgb2YgY29sdW1ucy5cbiAgICAgICAgKiBAcHJvcGVydHkgY29sdW1uc1xuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAjIyNcbiAgICAgICAgQGNvbHVtbnMgPSBAcGFyYW1zLmNvbHVtbnMgfHwgMVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgZGF0YS1ncmlkIGlzIGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgcmVuZGVyaW5nLlxuICAgICAgICAqIEBwcm9wZXJ0eSBpbml0aWFsaXplZFxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICMjI1xuICAgICAgICBAaW5pdGlhbGl6ZWQgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIERlZmluZXMgYSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzcGFjaW5nIGJldHdlZW4gaXRlbXMuXG4gICAgICAgICogQHByb3BlcnR5IHNwYWNpbmdcbiAgICAgICAgKiBAZGVmYXVsdCBbMCwgMTBdICAgICAgICBcbiAgICAgICAgKiBAdHlwZSBudW1iZXJbXVxuICAgICAgICAjIyNcbiAgICAgICAgQHNwYWNpbmcgPSBAcGFyYW1zLnNwYWNpbmcgfHwgWzAsIDBdXG4gICAgIFxuICAgICMjIypcbiAgICAqIEFkZHMgZXZlbnQtaGFuZGxlcnMgZm9yIG1vdXNlL3RvdWNoIGV2ZW50c1xuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0dXBFdmVudEhhbmRsZXJzXG4gICAgIyMjIFxuICAgIHNldHVwRXZlbnRIYW5kbGVyczogLT5cbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwibW91c2VXaGVlbFwiLCA9PlxuICAgICAgICAgICAgciA9IEBvYmplY3QuZHN0UmVjdFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiBSZWN0LmNvbnRhaW5zKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCwgSW5wdXQuTW91c2UueCAtIEBvYmplY3Qub3JpZ2luLngsIElucHV0Lk1vdXNlLnkgLSBAb2JqZWN0Lm9yaWdpbi55KVxuICAgICAgICAgICAgICAgIEB1cGRhdGVTY3JvbGwoKVxuICAgIFxuICAgICMjIypcbiAgICAqIFNldHMgdXAgdGhlIGRhdGEtZ3JpZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwXG4gICAgIyMjICAgXG4gICAgc2V0dXA6IC0+XG4gICAgICAgIGlmIEBvYmplY3QuZHN0UmVjdC53aWR0aCA9PSAxIHRoZW4gcmV0dXJuXG4gICAgICAgIEBpbml0aWFsaXplZCA9IHllc1xuXG4gICAgICAgIGlmICFAdGVtcGxhdGUuc2l6ZVxuICAgICAgICAgICAgaXRlbSA9IHVpLlVJTWFuYWdlci5jcmVhdGVDb250cm9sRnJvbURlc2NyaXB0b3IoQHRlbXBsYXRlLmRlc2NyaXB0b3IsIEBvYmplY3QpXG4gICAgICAgICAgICBpdGVtLmluZGV4ID0gMFxuICAgICAgICAgICAgaXRlbS51cGRhdGUoKVxuICAgICAgICAgICAgQHRlbXBsYXRlLnNpemUgPSBbaXRlbS5kc3RSZWN0LndpZHRoLCBpdGVtLmRzdFJlY3QuaGVpZ2h0XVxuICAgICAgICAgICAgaXRlbS5kaXNwb3NlKClcbiAgICAgICAgICAgIFxuICAgICAgICBpZiBAcGFyYW1zLmRhdGFTb3VyY2UuZXhlY1xuICAgICAgICAgICAgQGRhdGFTb3VyY2VfID0gbmV3IERhdGFTb3VyY2UodWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoQG9iamVjdCwgQHBhcmFtcy5kYXRhU291cmNlKSB8fCBbXSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQGRhdGFTb3VyY2VfID0gbmV3IERhdGFTb3VyY2UoQHBhcmFtcy5kYXRhU291cmNlIHx8IFtdKVxuICAgICAgICBcbiAgICAgICAgQHJlc2l6ZSgpXG4gICAgICAgIFxuICAgICAgICBAc2V0dXBFdmVudEhhbmRsZXJzKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgc3VwZXIoKVxuICAgIFxuICAgICAgICBAb2JqZWN0LnNjcm9sbGFibGVIZWlnaHQgPSBNYXRoLm1heCgwLCBAb2JqZWN0LmNvbnRlbnRIZWlnaHQgLSBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0KVxuICAgICBcbiAgICBcbiAgICAjIyMqXG4gICAgKiBTY3JvbGxzIHRvIHRoZSBlbmQuXG4gICAgKlxuICAgICogQG1ldGhvZCBzY3JvbGxUb0VuZFxuICAgICMjIyAgICBcbiAgICBzY3JvbGxUb0VuZDogLT5cbiAgICAgICAgQG9iamVjdC5zY3JvbGxPZmZzZXRZID0gQG9iamVjdC5zY3JvbGxhYmxlSGVpZ2h0XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFVwZGF0ZXMgc2Nyb2xsaW5nLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlU2Nyb2xsXG4gICAgIyMjXG4gICAgdXBkYXRlU2Nyb2xsOiAtPlxuICAgICAgICBAb2JqZWN0LnNjcm9sbGFibGVIZWlnaHQgPSBNYXRoLm1heCgwLCBAb2JqZWN0LmNvbnRlbnRIZWlnaHQgLSBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0KVxuICAgICAgICBpZiBJbnB1dC5Nb3VzZS53aGVlbCA8PSAtMVxuICAgICAgICAgICAgQG9iamVjdC5zY3JvbGxPZmZzZXRZID0gTWF0aC5tYXgoQG9iamVjdC5zY3JvbGxPZmZzZXRZIC0gSW5wdXQuTW91c2Uud2hlZWxTcGVlZCAqIDAuMSwgMClcbiAgICAgICAgICAgXG4gICAgICAgIGlmIElucHV0Lk1vdXNlLndoZWVsID49IDFcbiAgICAgICAgICAgIEBvYmplY3Quc2Nyb2xsT2Zmc2V0WSA9IE1hdGgubWluKEBvYmplY3Quc2Nyb2xsT2Zmc2V0WSAtIElucHV0Lk1vdXNlLndoZWVsU3BlZWQgKiAwLjEsIEBvYmplY3Quc2Nyb2xsYWJsZUhlaWdodClcbiAgICAgICAgICAgIFxuICAgIFxuICAgICAgICBAb2JqZWN0LnNjcm9sbE9mZnNldFkgPSBNYXRoLm1heChNYXRoLm1pbihAb2JqZWN0LnNjcm9sbE9mZnNldFksIEBvYmplY3Quc2Nyb2xsYWJsZUhlaWdodCksIDApXG4gICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBSZXNpemVzIHRoZSBkYXRhLWdyaWQgYW5kIGNyZWF0ZXMgdGhlIG5lY2Vzc2FyeSBkaXNwbGF5IG9iamVjdHMgZnJvbSB0aGUgZGF0YS1ncmlkIHRlbXBsYXRlLlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVzaXplXG4gICAgIyMjICAgICBcbiAgICByZXNpemU6IC0+XG4gICAgICAgIHdpZHRoID0gQG9iamVjdC5kc3RSZWN0LndpZHRoXG4gICAgICAgIGhlaWdodCA9IEBvYmplY3QuZHN0UmVjdC5oZWlnaHRcbiAgICAgICAgXG4gICAgICAgIGl0ZW1zWCA9IEBjb2x1bW5zIHx8IDFcbiAgICAgICAgaXRlbXNZID0gTWF0aC5jZWlsKChoZWlnaHQtQHNwYWNpbmdbMV0pIC8gKEB0ZW1wbGF0ZS5zaXplWzFdK0BzcGFjaW5nWzFdKSkgKyBAY29sdW1ucysxXG4gICAgICAgIHRvdGFsSXRlbXNZID0gTWF0aC5jZWlsKEBkYXRhU291cmNlLmxlbmd0aCAvIEBjb2x1bW5zKVxuICAgICAgICBcbiAgICAgICAgaXRlbT8uZGlzcG9zZSgpIGZvciBpdGVtIGluIEBpdGVtc1xuICAgICAgICBAaXRlbXMgPSBbXSAjbmV3IEFycmF5KGl0ZW1zWCAqIGl0ZW1zWSlcbiAgICAgICAgXG4gICAgICAgIGZvciB5IGluIFswLi4uaXRlbXNZXVxuICAgICAgICAgICAgZm9yIHggaW4gWzAuLi5pdGVtc1hdXG4gICAgICAgICAgICAgICAgaW5kZXggID0geSAqIGl0ZW1zWCArIHhcbiAgICAgICAgICAgICAgICBpZiBpbmRleCA8IEBkYXRhU291cmNlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gdWkuVUlNYW5hZ2VyLmNyZWF0ZUNvbnRyb2xGcm9tRGVzY3JpcHRvcihAdGVtcGxhdGUuZGVzY3JpcHRvciwgQG9iamVjdClcblxuICAgICAgICAgICAgICAgICAgICBpdGVtLmRhdGFbMF0gPSBAZGF0YVNvdXJjZS5pdGVtQXQoaW5kZXgpLmRhdGEgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmRzdFJlY3QueCA9IEBzcGFjaW5nWzBdICsgeCAqIChAdGVtcGxhdGUuc2l6ZVswXStAc3BhY2luZ1swXSlcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kc3RSZWN0LnkgPSBAc3BhY2luZ1sxXSArIHkgKiAoQHRlbXBsYXRlLnNpemVbMV0rQHNwYWNpbmdbMV0pXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZHN0UmVjdC53aWR0aCA9IEB0ZW1wbGF0ZS5zaXplWzBdXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZHN0UmVjdC5oZWlnaHQgPSBAdGVtcGxhdGUuc2l6ZVsxXVxuICAgICAgICAgICAgICAgICAgICBpdGVtLmluZGV4ID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgaXRlbS51aS52aWV3RGF0YSA9IEBkYXRhU291cmNlLml0ZW1BdChpbmRleCkudmlld0RhdGFcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIEBpdGVtc1tpdGVtLmluZGV4XSA9IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgQG9iamVjdC5hZGRPYmplY3QoaXRlbSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgQG9iamVjdC5zY3JvbGxhYmxlSGVpZ2h0ID0gQHNwYWNpbmdbMV0gKyB0b3RhbEl0ZW1zWSAqIChAdGVtcGxhdGUuc2l6ZVsxXStAc3BhY2luZ1sxXSkgLSBoZWlnaHRcbiAgICAgICAgQG9iamVjdC5zY3JvbGxPZmZzZXRZID0gMFxuICAgICAgICBAb2JqZWN0LmNvbnRlbnRIZWlnaHQgPSBAc3BhY2luZ1sxXSArIHRvdGFsSXRlbXNZICogKEB0ZW1wbGF0ZS5zaXplWzFdK0BzcGFjaW5nWzFdKVxuXG4gICAgaXRlbUF0SW5kZXg6IChpbmRleCkgLT5cbiAgICAgICAgQGl0ZW1zLmZpcnN0IChpdGVtKSAtPiBpdGVtLmluZGV4ID09IGluZGV4XG4gICAgICAgIFxuICAgIGluZGV4Rm9ySXRlbTogKGl0ZW0pIC0+IGl0ZW0uaW5kZXhcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgZGF0YS1ncmlkLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgIyMjICBcbiAgICB1cGRhdGU6IC0+XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgXG4gICAgICAgIGlmIG5vdCBAaW5pdGlhbGl6ZWRcbiAgICAgICAgICAgIEBzZXR1cCgpXG4gICAgICAgIFxuICAgICAgICBzY3JvbGxPZmZzZXQgPSBAb2JqZWN0LnNjcm9sbE9mZnNldFlcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5mbG9vcigoc2Nyb2xsT2Zmc2V0KSAvIChAdGVtcGxhdGUuc2l6ZVsxXStAc3BhY2luZ1sxXSkpICogQGNvbHVtbnNcbiAgICAgICAgaSA9IG9mZnNldFxuICAgICAgICBpdGVtSW5kZXggPSAwXG4gICAgICAgIGl0ZW1zWSA9IE1hdGguY2VpbCgoQG9iamVjdC5kc3RSZWN0LmhlaWdodC1Ac3BhY2luZ1sxXSkgLyAgKEB0ZW1wbGF0ZS5zaXplWzFdK0BzcGFjaW5nWzFdKSkgKiBAY29sdW1ucyArIEBjb2x1bW5zKzFcbiAgICAgICAgXG4gICAgICAgIHdoaWxlIGkgPCBNYXRoLm1pbihvZmZzZXQraXRlbXNZLCBAZGF0YVNvdXJjZS5sZW5ndGgpXG4gICAgICAgICAgICByb3cgPSBNYXRoLmZsb29yKGkgLyBAY29sdW1ucylcbiAgICAgICAgICAgIGNvbHVtbiA9IGkgJSBAY29sdW1uc1xuICAgICAgICAgICAgaXRlbSA9IEBpdGVtc1tpdGVtSW5kZXhdXG4gICAgICAgICAgICBpZiBpdGVtXG4gICAgICAgICAgICAgICAgaXRlbS5kYXRhWzBdID0gQGRhdGFTb3VyY2UuaXRlbUF0KGkpLmRhdGFcbiAgICAgICAgICAgICAgICBpZiBAb2JqZWN0LmNsaXBSZWN0XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY2xpcFJlY3QgPSBAb2JqZWN0LmNsaXBSZWN0XG4gICAgICAgICAgICAgICAgaXRlbS5pbmRleCA9IGlcbiAgICAgICAgICAgICAgICBpdGVtLnVpLnZpZXdEYXRhID0gQGRhdGFTb3VyY2UuaXRlbUF0KGkpLnZpZXdEYXRhXG4gICAgICAgICAgICAgICAgaXRlbS5kc3RSZWN0LnggPSBAc3BhY2luZ1swXSArIGNvbHVtbiAqIChAdGVtcGxhdGUuc2l6ZVswXStAc3BhY2luZ1swXSlcbiAgICAgICAgICAgICAgICBpdGVtLmRzdFJlY3QueSA9IEBzcGFjaW5nWzFdICsgKHJvdy0ob2Zmc2V0L0Bjb2x1bW5zKSkgKiAoQHRlbXBsYXRlLnNpemVbMV0rQHNwYWNpbmdbMV0pICsgKC1zY3JvbGxPZmZzZXQgJSAoQHRlbXBsYXRlLnNpemVbMV0rQHNwYWNpbmdbMV0pKVxuICAgICAgICAgICAgICAgIGl0ZW0udmlzaWJsZSA9IHllc1xuICAgICAgICAgICAgICAgIGl0ZW0udXBkYXRlKClcbiAgICAgICAgICAgICAgICBpdGVtLnVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgaXRlbUluZGV4KytcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpKytcbiAgICAgICAgXG4gICAgICAgIGZvciBqIGluIFtpdGVtSW5kZXguLi5AaXRlbXMubGVuZ3RoXVxuICAgICAgICAgICAgaWYgQGl0ZW1zW2pdXG4gICAgICAgICAgICAgICAgQGl0ZW1zW2pdLnZpc2libGUgPSBub1xuICAgICAgICAgICAgICAgIEBpdGVtc1tqXS51cGRhdGUoKVxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIFxudWkuQ29tcG9uZW50X0RhdGFHcmlkQmVoYXZpb3IgPSBDb21wb25lbnRfRGF0YUdyaWRCZWhhdmlvciJdfQ==\n//# sourceURL=Component_DataGridBehavior_174.js"
13 + },
14 + "summary": [
15 + "name",
16 + "type"
17 + ]
18 + }