2 <header><title>BioJS viewer</title></header>
6 <!-- include MSA js + css -->
7 <!-- <script src="https://s3-eu-west-1.amazonaws.com/biojs/msa/latest/msa.js"></script> -->
8 <!-- <link type=text/css rel=stylesheet href=https://s3-eu-west-1.amazonaws.com/biojs/msa/latest/msa.css /> -->
10 <img src="http://www.jalview.org/help/html/Jalview_Logo.png" alt="Jalview Logo" title="This html page was generated from Jalview, to import the data back to Jalview, please drag the generated html file and drop it unto the Jalview workbench.
12 Alternatively, you could copy the url from the address bar and use Jalview's url importer (main menu-> File-> Input Alignment-> from URL) to import back the alignment jalview." >
17 <input type="button" name="divToggleButton" id="divToggleButton" onclick="javascipt:toggleMenuVisibility();" value="Show Menu"></input>
18 <button onclick="javascipt:openJalviewUsingCurrentUrl();">Launch in Jalview</button>
23 <div id="yourDiv">press "Run with JS"</div>
24 <input type='hidden' id='seqData' name='seqData' value='#sequenceData#'/>
33 function toggleMenuVisibility(){
34 var menu = document.getElementsByClassName("biojs_msa_menubar");
35 var divToggleButton = document.getElementById("divToggleButton");
36 if(menu[0].style.display == 'block'){
37 menu[0].style.display = 'none';
38 divToggleButton.value="Show Menu";
40 menu[0].style.display = 'block';
41 divToggleButton.value="Hide Menu";
46 function openJalviewUsingCurrentUrl(){
47 var jalviewData = JSON.parse(document.getElementById("seqData").value)
48 var jalviewVersion = jalviewData['jalviewVersion'];
49 var url = jalviewData['webStartUrl'];
50 var myForm = document.createElement("form");
53 var heap = document.createElement("input") ;
54 heap.setAttribute("name", "jvm-max-heap") ;
55 heap.setAttribute("value", "2G");
56 myForm.appendChild(heap) ;
58 var target = document.createElement("input") ;
59 target.setAttribute("name", "open") ;
60 target.setAttribute("value", document.URL);
61 myForm.appendChild(target) ;
63 var jvVersion = document.createElement("input") ;
64 jvVersion.setAttribute("name", "version") ;
65 jvVersion.setAttribute("value", jalviewVersion);
66 myForm.appendChild(jvVersion) ;
69 document.body.appendChild(myForm) ;
71 document.body.removeChild(myForm) ;
75 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
76 var css = ".biojs_msa_stage {\n cursor: default;\n line-height: normal; }\n\n.biojs_msa_labels {\n color: black;\n display: inline-block;\n white-space: nowrap;\n cursor: pointer;\n vertical-align: top; }\n\n.biojs_msa_seqblock {\n cursor: move; }\n\n.biojs_msa_layer {\n display: block;\n white-space: nowrap; }\n\n.biojs_msa_labelblock::-webkit-scrollbar, .biojs_msa_header::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 7px;\n height: 7px; }\n\n.biojs_msa_labelblock::-webkit-scrollbar-thumb, .biojs_msa_header::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0, 0, 0, 0.5);\n box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); }\n\n.biojs_msa_marker {\n color: grey;\n white-space: nowrap;\n cursor: pointer; }\n\n.biojs_msa_marker span {\n text-align: center; }\n\n.biojs_msa_menubar .biojs_msa_menubar_alink {\n background: #3498db;\n background-image: -webkit-linear-gradient(top, #3498db, #2980b9);\n background-image: -moz-linear-gradient(top, #3498db, #2980b9);\n background-image: -ms-linear-gradient(top, #3498db, #2980b9);\n background-image: -o-linear-gradient(top, #3498db, #2980b9);\n background-image: linear-gradient(to bottom, #3498db, #2980b9);\n -webkit-border-radius: 28;\n -moz-border-radius: 28;\n border-radius: 28px;\n font-family: Arial;\n color: #ffffff;\n padding: 3px 10px 3px 10px;\n margin-left: 10px;\n text-decoration: none; }\n\n.biojs_msa_menubar .biojs_msa_menubar_alink:hover {\n cursor: pointer; }\n\n/* jquery dropdown CSS */\n.dropdown {\n position: absolute;\n z-index: 9999999;\n display: none; }\n\n.dropdown .dropdown-menu,\n.dropdown .dropdown-panel {\n min-width: 160px;\n max-width: 360px;\n list-style: none;\n background: #FFF;\n border: solid 1px #DDD;\n border: solid 1px rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n overflow: visible;\n padding: 4px 0;\n margin: 0; }\n\n.dropdown .dropdown-panel {\n padding: 10px; }\n\n.dropdown.dropdown-scroll .dropdown-menu,\n.dropdown.dropdown-scroll .dropdown-panel {\n max-height: 358px;\n overflow: auto; }\n\n.dropdown .dropdown-menu LI {\n list-style: none;\n padding: 0 0;\n margin: 0;\n line-height: 18px; }\n\n.dropdown .dropdown-menu LI,\n.dropdown .dropdown-menu LABEL {\n display: block;\n color: #555;\n text-decoration: none;\n line-height: 18px;\n padding: 3px 15px;\n white-space: nowrap; }\n\n.dropdown .dropdown-menu LI:hover,\n.dropdown .dropdown-menu LABEL:hover {\n background-color: #08C;\n color: #FFF;\n cursor: pointer; }\n\n.dropdown .dropdown-menu .dropdown-divider {\n font-size: 1px;\n border-top: solid 1px #E5E5E5;\n padding: 0;\n margin: 5px 0; }\n"; (require("/home/travis/build/greenify/biojs-vis-msa/node_modules/cssify"))(css); module.exports = css;
77 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/cssify":48}],2:[function(require,module,exports){
78 module.exports = require("./src/index");
80 },{"./src/index":72}],3:[function(require,module,exports){
81 var _ = require('underscore');
82 var viewType = require("backbone-viewj");
85 module.exports = pluginator = viewType.extend({
86 renderSubviews: function() {
88 var el = document.createElement("div");
90 var frag = document.createDocumentFragment();
91 if (oldEl.parentNode != null) {
92 oldEl.parentNode.replaceChild(this.el, oldEl);
94 var views = this._views();
95 var viewsSorted = _.sortBy(views, function(el) {
99 for (var i = 0; i < viewsSorted.length; i++) {
100 view = viewsSorted[i];
104 frag.appendChild(node);
107 el.appendChild(frag);
110 addView: function(key, view) {
111 var views = this._views();
113 throw "Invalid plugin. ";
115 if (view.ordering == null) {
118 return views[key] = view;
120 removeViews: function() {
122 var views = this._views();
125 el.undelegateEvents();
127 if (el.removeViews != null) {
132 return this.views = {};
134 removeView: function(key) {
135 var views = this._views();
137 return delete views[key];
139 getView: function(key) {
140 var views = this._views();
145 return viewType.prototype.remove.apply(this);
148 if (this.views == null) {
155 },{"backbone-viewj":10,"underscore":59}],4:[function(require,module,exports){
158 // (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
159 // Backbone may be freely distributed under the MIT license.
160 // For all details and documentation:
161 // http://backbonejs.org
163 var Events = require("backbone-events-standalone");
164 var extend = require("backbone-extend-standalone");
165 var _ = require("underscore");
166 var Model = require("./model");
168 // Create local references to array methods we'll want to use later.
170 var slice = array.slice;
172 // Backbone.Collection
173 // -------------------
175 // If models tend to represent a single row of data, a Backbone Collection is
176 // more analogous to a table full of data ... or a small slice or page of that
177 // table, or a collection of rows that belong together for a particular reason
178 // -- all of the messages in this particular folder, all of the documents
179 // belonging to this particular author, and so on. Collections maintain
180 // indexes of their models, both in order, and for lookup by `id`.
182 // Create a new **Collection**, perhaps to contain a specific type of `model`.
183 // If a `comparator` is specified, the Collection will maintain
184 // its models in sort order, as they're added and removed.
185 var Collection = function(models, options) {
186 options || (options = {});
187 if (options.model) this.model = options.model;
188 if (options.comparator !== void 0) this.comparator = options.comparator;
190 this.initialize.apply(this, arguments);
191 if (models) this.reset(models, _.extend({silent: true}, options));
194 // Default options for `Collection#set`.
195 var setOptions = {add: true, remove: true, merge: true};
196 var addOptions = {add: true, remove: false};
198 // Define the Collection's inheritable methods.
199 _.extend(Collection.prototype, Events, {
201 // The default model for a collection is just a **Backbone.Model**.
202 // This should be overridden in most cases.
205 // Initialize is an empty function by default. Override it with your own
206 // initialization logic.
207 initialize: function(){},
209 // The JSON representation of a Collection is an array of the
210 // models' attributes.
211 toJSON: function(options) {
212 return this.map(function(model){ return model.toJSON(options); });
215 // Proxy `Backbone.sync` by default.
217 return Backbone.sync.apply(this, arguments);
220 // Add a model, or list of models to the set.
221 add: function(models, options) {
222 return this.set(models, _.extend({merge: false}, options, addOptions));
225 // Remove a model, or a list of models from the set.
226 remove: function(models, options) {
227 var singular = !_.isArray(models);
228 models = singular ? [models] : _.clone(models);
229 options || (options = {});
230 for (var i = 0, length = models.length; i < length; i++) {
231 var model = models[i] = this.get(models[i]);
232 if (!model) continue;
233 var id = this.modelId(model.attributes);
234 if (id != null) delete this._byId[id];
235 delete this._byId[model.cid];
236 var index = this.indexOf(model);
237 this.models.splice(index, 1);
239 if (!options.silent) {
240 options.index = index;
241 model.trigger('remove', model, this, options);
243 this._removeReference(model, options);
245 return singular ? models[0] : models;
248 // Update a collection by `set`-ing a new list of models, adding new ones,
249 // removing models that are no longer present, and merging models that
250 // already exist in the collection, as necessary. Similar to **Model#set**,
251 // the core operation for updating the data contained by the collection.
252 set: function(models, options) {
253 options = _.defaults({}, options, setOptions);
254 if (options.parse) models = this.parse(models, options);
255 var singular = !_.isArray(models);
256 models = singular ? (models ? [models] : []) : models.slice();
257 var id, model, attrs, existing, sort;
259 var sortable = this.comparator && (at == null) && options.sort !== false;
260 var sortAttr = _.isString(this.comparator) ? this.comparator : null;
261 var toAdd = [], toRemove = [], modelMap = {};
262 var add = options.add, merge = options.merge, remove = options.remove;
263 var order = !sortable && add && remove ? [] : false;
265 // Turn bare objects into model references, and prevent invalid models
267 for (var i = 0, length = models.length; i < length; i++) {
270 // If a duplicate is found, prevent it from being added and
271 // optionally merge it into the existing model.
272 if (existing = this.get(attrs)) {
273 if (remove) modelMap[existing.cid] = true;
274 if (merge && attrs !== existing) {
275 attrs = this._isModel(attrs) ? attrs.attributes : attrs;
276 if (options.parse) attrs = existing.parse(attrs, options);
277 existing.set(attrs, options);
278 if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
280 models[i] = existing;
282 // If this is a new, valid model, push it to the `toAdd` list.
284 model = models[i] = this._prepareModel(attrs, options);
285 if (!model) continue;
287 this._addReference(model, options);
290 // Do not add multiple models with the same `id`.
291 model = existing || model;
292 if (!model) continue;
293 id = this.modelId(model.attributes);
294 if (order && (model.isNew() || !modelMap[id])) order.push(model);
298 // Remove nonexistent models if appropriate.
300 for (var i = 0, length = this.length; i < length; i++) {
301 if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);
303 if (toRemove.length) this.remove(toRemove, options);
306 // See if sorting is needed, update `length` and splice in new models.
307 if (toAdd.length || (order && order.length)) {
308 if (sortable) sort = true;
309 this.length += toAdd.length;
311 for (var i = 0, length = toAdd.length; i < length; i++) {
312 this.models.splice(at + i, 0, toAdd[i]);
315 if (order) this.models.length = 0;
316 var orderedModels = order || toAdd;
317 for (var i = 0, length = orderedModels.length; i < length; i++) {
318 this.models.push(orderedModels[i]);
323 // Silently sort the collection if appropriate.
324 if (sort) this.sort({silent: true});
326 // Unless silenced, it's time to fire all appropriate add/sort events.
327 if (!options.silent) {
328 var addOpts = at != null ? _.clone(options) : options;
329 for (var i = 0, length = toAdd.length; i < length; i++) {
330 if (at != null) addOpts.index = at + i;
331 (model = toAdd[i]).trigger('add', model, this, addOpts);
333 if (sort || (order && order.length)) this.trigger('sort', this, options);
336 // Return the added (or merged) model (or models).
337 return singular ? models[0] : models;
340 // When you have more items than you want to add or remove individually,
341 // you can reset the entire set with a new list of models, without firing
342 // any granular `add` or `remove` events. Fires `reset` when finished.
343 // Useful for bulk operations and optimizations.
344 reset: function(models, options) {
345 options || (options = {});
346 for (var i = 0, length = this.models.length; i < length; i++) {
347 this._removeReference(this.models[i], options);
349 options.previousModels = this.models;
351 models = this.add(models, _.extend({silent: true}, options));
352 if (!options.silent) this.trigger('reset', this, options);
356 // Add a model to the end of the collection.
357 push: function(model, options) {
358 return this.add(model, _.extend({at: this.length}, options));
361 // Remove a model from the end of the collection.
362 pop: function(options) {
363 var model = this.at(this.length - 1);
364 this.remove(model, options);
368 // Add a model to the beginning of the collection.
369 unshift: function(model, options) {
370 return this.add(model, _.extend({at: 0}, options));
373 // Remove a model from the beginning of the collection.
374 shift: function(options) {
375 var model = this.at(0);
376 this.remove(model, options);
380 // Slice out a sub-array of models from the collection.
382 return slice.apply(this.models, arguments);
385 // Get a model from the set by id.
387 if (obj == null) return void 0;
388 var id = this.modelId(this._isModel(obj) ? obj.attributes : obj);
389 return this._byId[obj] || this._byId[id] || this._byId[obj.cid];
392 // Get the model at the given index.
393 at: function(index) {
394 if (index < 0) index += this.length;
395 return this.models[index];
398 // Return models with matching attributes. Useful for simple cases of
400 where: function(attrs, first) {
401 if (_.isEmpty(attrs)) return first ? void 0 : [];
402 return this[first ? 'find' : 'filter'](function(model) {
403 for (var key in attrs) {
404 if (attrs[key] !== model.get(key)) return false;
410 // Return the first model with matching attributes. Useful for simple cases
412 findWhere: function(attrs) {
413 return this.where(attrs, true);
416 // Force the collection to re-sort itself. You don't need to call this under
417 // normal circumstances, as the set will maintain sort order as each item
419 sort: function(options) {
420 if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
421 options || (options = {});
423 // Run sort based on type of `comparator`.
424 if (_.isString(this.comparator) || this.comparator.length === 1) {
425 this.models = this.sortBy(this.comparator, this);
427 this.models.sort(_.bind(this.comparator, this));
430 if (!options.silent) this.trigger('sort', this, options);
434 // Pluck an attribute from each model in the collection.
435 pluck: function(attr) {
436 return _.invoke(this.models, 'get', attr);
439 // Fetch the default set of models for this collection, resetting the
440 // collection when they arrive. If `reset: true` is passed, the response
441 // data will be passed through the `reset` method instead of `set`.
442 fetch: function(options) {
443 options = options ? _.clone(options) : {};
444 if (options.parse === void 0) options.parse = true;
445 var success = options.success;
446 var collection = this;
447 options.success = function(resp) {
448 var method = options.reset ? 'reset' : 'set';
449 collection[method](resp, options);
450 if (success) success(collection, resp, options);
451 collection.trigger('sync', collection, resp, options);
453 wrapError(this, options);
454 return this.sync('read', this, options);
457 // Create a new instance of a model in this collection. Add the model to the
458 // collection immediately, unless `wait: true` is passed, in which case we
459 // wait for the server to agree.
460 create: function(model, options) {
461 options = options ? _.clone(options) : {};
462 if (!(model = this._prepareModel(model, options))) return false;
463 if (!options.wait) this.add(model, options);
464 var collection = this;
465 var success = options.success;
466 options.success = function(model, resp) {
467 if (options.wait) collection.add(model, options);
468 if (success) success(model, resp, options);
470 model.save(null, options);
474 // **parse** converts a response into a list of models to be added to the
475 // collection. The default implementation is just to pass it through.
476 parse: function(resp, options) {
480 // Create a new collection with an identical list of models as this one.
482 return new this.constructor(this.models, {
484 comparator: this.comparator
488 // Define how to uniquely identify models in the collection.
489 modelId: function (attrs) {
490 return attrs[this.model.prototype.idAttribute || 'id'];
493 // Private method to reset all internal state. Called when the collection
494 // is first initialized or reset.
501 // Prepare a hash of attributes (or other model) to be added to this
503 _prepareModel: function(attrs, options) {
504 if (this._isModel(attrs)) {
505 if (!attrs.collection) attrs.collection = this;
508 options = options ? _.clone(options) : {};
509 options.collection = this;
510 var model = new this.model(attrs, options);
511 if (!model.validationError) return model;
512 this.trigger('invalid', this, model.validationError, options);
516 // Method for checking whether an object should be considered a model for
517 // the purposes of adding to the collection.
518 _isModel: function (model) {
519 return model instanceof Model;
522 // Internal method to create a model's ties to a collection.
523 _addReference: function(model, options) {
524 this._byId[model.cid] = model;
525 var id = this.modelId(model.attributes);
526 if (id != null) this._byId[id] = model;
527 model.on('all', this._onModelEvent, this);
530 // Internal method to sever a model's ties to a collection.
531 _removeReference: function(model, options) {
532 if (this === model.collection) delete model.collection;
533 model.off('all', this._onModelEvent, this);
536 // Internal method called every time a model in the set fires an event.
537 // Sets need to update their indexes when models change ids. All other
538 // events simply proxy through. "add" and "remove" events that originate
539 // in other collections are ignored.
540 _onModelEvent: function(event, model, collection, options) {
541 if ((event === 'add' || event === 'remove') && collection !== this) return;
542 if (event === 'destroy') this.remove(model, options);
543 if (event === 'change') {
544 var prevId = this.modelId(model.previousAttributes());
545 var id = this.modelId(model.attributes);
547 if (prevId != null) delete this._byId[prevId];
548 if (id != null) this._byId[id] = model;
551 this.trigger.apply(this, arguments);
556 // Underscore methods that we want to implement on the Collection.
557 // 90% of the core usefulness of Backbone Collections is actually implemented
559 var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
560 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
561 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
562 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
563 'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',
564 'lastIndexOf', 'isEmpty', 'chain', 'sample', 'partition'];
566 // Mix in each Underscore method as a proxy to `Collection#models`.
567 _.each(methods, function(method) {
568 if (!_[method]) return;
569 Collection.prototype[method] = function() {
570 var args = slice.call(arguments);
571 args.unshift(this.models);
572 return _[method].apply(_, args);
576 // Underscore methods that take a property name as an argument.
577 var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];
579 // Use attributes instead of properties.
580 _.each(attributeMethods, function(method) {
581 if (!_[method]) return;
582 Collection.prototype[method] = function(value, context) {
583 var iterator = _.isFunction(value) ? value : function(model) {
584 return model.get(value);
586 return _[method](this.models, iterator, context);
591 Collection.extend = extend;
592 module.exports = Collection;
594 },{"./model":6,"backbone-events-standalone":8,"backbone-extend-standalone":9,"underscore":59}],5:[function(require,module,exports){
595 module.exports.Model = require("./model");
596 module.exports.Collection = require("./collection");
597 module.exports.Events = require("backbone-events-standalone");
598 module.exports.extend = require("backbone-extend-standalone");
600 },{"./collection":4,"./model":6,"backbone-events-standalone":8,"backbone-extend-standalone":9}],6:[function(require,module,exports){
603 // (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
604 // Backbone may be freely distributed under the MIT license.
605 // For all details and documentation:
606 // http://backbonejs.org
608 var Events = require("backbone-events-standalone");
609 var extend = require("backbone-extend-standalone");
610 var _ = require("underscore");
615 // Backbone **Models** are the basic data object in the framework --
616 // frequently representing a row in a table in a database on your server.
617 // A discrete chunk of data and a bunch of useful, related methods for
618 // performing computations and transformations on that data.
620 // Create a new model with the specified attributes. A client id (`cid`)
621 // is automatically generated and assigned for you.
622 var Model = function(attributes, options) {
623 var attrs = attributes || {};
624 options || (options = {});
625 this.cid = _.uniqueId('c');
626 this.attributes = {};
627 if (options.collection) this.collection = options.collection;
628 if (options.parse) attrs = this.parse(attrs, options) || {};
629 attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
630 this.set(attrs, options);
632 this.initialize.apply(this, arguments);
635 // Attach all inheritable methods to the Model prototype.
636 _.extend(Model.prototype, Events, {
638 // A hash of attributes whose current and previous value differ.
641 // The value returned during the last failed validation.
642 validationError: null,
644 // The default name for the JSON `id` attribute is `"id"`. MongoDB and
645 // CouchDB users may want to set this to `"_id"`.
648 // Initialize is an empty function by default. Override it with your own
649 // initialization logic.
650 initialize: function(){},
652 // Return a copy of the model's `attributes` object.
653 toJSON: function(options) {
654 return _.clone(this.attributes);
657 // Proxy `Backbone.sync` by default -- but override this if you need
658 // custom syncing semantics for *this* particular model.
660 return Backbone.sync.apply(this, arguments);
663 // Get the value of an attribute.
664 get: function(attr) {
665 return this.attributes[attr];
668 // Get the HTML-escaped value of an attribute.
669 escape: function(attr) {
670 return _.escape(this.get(attr));
673 // Returns `true` if the attribute contains a value that is not null
675 has: function(attr) {
676 return this.get(attr) != null;
679 // Set a hash of model attributes on the object, firing `"change"`. This is
680 // the core primitive operation of a model, updating the data and notifying
681 // anyone who needs to know about the change in state. The heart of the beast.
682 set: function(key, val, options) {
683 var attr, attrs, unset, changes, silent, changing, prev, current;
684 if (key == null) return this;
686 // Handle both `"key", value` and `{key: value}` -style arguments.
687 if (typeof key === 'object') {
691 (attrs = {})[key] = val;
694 options || (options = {});
697 if (!this._validate(attrs, options)) return false;
699 // Extract attributes and options.
700 unset = options.unset;
701 silent = options.silent;
703 changing = this._changing;
704 this._changing = true;
707 this._previousAttributes = _.clone(this.attributes);
710 current = this.attributes, prev = this._previousAttributes;
712 // Check for changes of `id`.
713 if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
715 // For each `set` attribute, update or delete the current value.
716 for (attr in attrs) {
718 if (!_.isEqual(current[attr], val)) changes.push(attr);
719 if (!_.isEqual(prev[attr], val)) {
720 this.changed[attr] = val;
722 delete this.changed[attr];
724 unset ? delete current[attr] : current[attr] = val;
727 // Trigger all relevant attribute changes.
729 if (changes.length) this._pending = options;
730 for (var i = 0, length = changes.length; i < length; i++) {
731 this.trigger('change:' + changes[i], this, current[changes[i]], options);
735 // You might be wondering why there's a `while` loop here. Changes can
736 // be recursively nested within `"change"` events.
737 if (changing) return this;
739 while (this._pending) {
740 options = this._pending;
741 this._pending = false;
742 this.trigger('change', this, options);
745 this._pending = false;
746 this._changing = false;
750 // Remove an attribute from the model, firing `"change"`. `unset` is a noop
751 // if the attribute doesn't exist.
752 unset: function(attr, options) {
753 return this.set(attr, void 0, _.extend({}, options, {unset: true}));
756 // Clear all attributes on the model, firing `"change"`.
757 clear: function(options) {
759 for (var key in this.attributes) attrs[key] = void 0;
760 return this.set(attrs, _.extend({}, options, {unset: true}));
763 // Determine if the model has changed since the last `"change"` event.
764 // If you specify an attribute name, determine if that attribute has changed.
765 hasChanged: function(attr) {
766 if (attr == null) return !_.isEmpty(this.changed);
767 return _.has(this.changed, attr);
770 // Return an object containing all the attributes that have changed, or
771 // false if there are no changed attributes. Useful for determining what
772 // parts of a view need to be updated and/or what attributes need to be
773 // persisted to the server. Unset attributes will be set to undefined.
774 // You can also pass an attributes object to diff against the model,
775 // determining if there *would be* a change.
776 changedAttributes: function(diff) {
777 if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
778 var val, changed = false;
779 var old = this._changing ? this._previousAttributes : this.attributes;
780 for (var attr in diff) {
781 if (_.isEqual(old[attr], (val = diff[attr]))) continue;
782 (changed || (changed = {}))[attr] = val;
787 // Get the previous value of an attribute, recorded at the time the last
788 // `"change"` event was fired.
789 previous: function(attr) {
790 if (attr == null || !this._previousAttributes) return null;
791 return this._previousAttributes[attr];
794 // Get all of the attributes of the model at the time of the previous
796 previousAttributes: function() {
797 return _.clone(this._previousAttributes);
800 // Fetch the model from the server. If the server's representation of the
801 // model differs from its current attributes, they will be overridden,
802 // triggering a `"change"` event.
803 fetch: function(options) {
804 options = options ? _.clone(options) : {};
805 if (options.parse === void 0) options.parse = true;
807 var success = options.success;
808 options.success = function(resp) {
809 if (!model.set(model.parse(resp, options), options)) return false;
810 if (success) success(model, resp, options);
811 model.trigger('sync', model, resp, options);
813 wrapError(this, options);
814 return this.sync('read', this, options);
817 // Set a hash of model attributes, and sync the model to the server.
818 // If the server returns an attributes hash that differs, the model's
819 // state will be `set` again.
820 save: function(key, val, options) {
821 var attrs, method, xhr, attributes = this.attributes;
823 // Handle both `"key", value` and `{key: value}` -style arguments.
824 if (key == null || typeof key === 'object') {
828 (attrs = {})[key] = val;
831 options = _.extend({validate: true}, options);
833 // If we're not waiting and attributes exist, save acts as
834 // `set(attr).save(null, opts)` with validation. Otherwise, check if
835 // the model will be valid when the attributes, if any, are set.
836 if (attrs && !options.wait) {
837 if (!this.set(attrs, options)) return false;
839 if (!this._validate(attrs, options)) return false;
842 // Set temporary attributes if `{wait: true}`.
843 if (attrs && options.wait) {
844 this.attributes = _.extend({}, attributes, attrs);
847 // After a successful server-side save, the client is (optionally)
848 // updated with the server-side state.
849 if (options.parse === void 0) options.parse = true;
851 var success = options.success;
852 options.success = function(resp) {
853 // Ensure attributes are restored during synchronous saves.
854 model.attributes = attributes;
855 var serverAttrs = model.parse(resp, options);
856 if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
857 if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
860 if (success) success(model, resp, options);
861 model.trigger('sync', model, resp, options);
863 wrapError(this, options);
865 method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
866 if (method === 'patch' && !options.attrs) options.attrs = attrs;
867 xhr = this.sync(method, this, options);
869 // Restore attributes.
870 if (attrs && options.wait) this.attributes = attributes;
875 // Destroy this model on the server if it was already persisted.
876 // Optimistically removes the model from its collection, if it has one.
877 // If `wait: true` is passed, waits for the server to respond before removal.
878 destroy: function(options) {
879 options = options ? _.clone(options) : {};
881 var success = options.success;
883 var destroy = function() {
884 model.stopListening();
885 model.trigger('destroy', model, model.collection, options);
888 options.success = function(resp) {
889 if (options.wait || model.isNew()) destroy();
890 if (success) success(model, resp, options);
891 if (!model.isNew()) model.trigger('sync', model, resp, options);
898 wrapError(this, options);
900 var xhr = this.sync('delete', this, options);
901 if (!options.wait) destroy();
905 // Default URL for the model's representation on the server -- if you're
906 // using Backbone's restful methods, override this to change the endpoint
907 // that will be called.
910 _.result(this, 'urlRoot') ||
911 _.result(this.collection, 'url') ||
913 if (this.isNew()) return base;
914 return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id);
917 // **parse** converts a response into the hash of attributes to be `set` on
918 // the model. The default implementation is just to pass the response along.
919 parse: function(resp, options) {
923 // Create a new model with identical attributes to this one.
925 return new this.constructor(this.attributes);
928 // A model is new if it has never been saved to the server, and lacks an id.
930 return !this.has(this.idAttribute);
933 // Check if the model is currently in a valid state.
934 isValid: function(options) {
935 return this._validate({}, _.extend(options || {}, { validate: true }));
938 // Run validation against the next complete set of model attributes,
939 // returning `true` if all is well. Otherwise, fire an `"invalid"` event.
940 _validate: function(attrs, options) {
941 if (!options.validate || !this.validate) return true;
942 attrs = _.extend({}, this.attributes, attrs);
943 var error = this.validationError = this.validate(attrs, options) || null;
944 if (!error) return true;
945 this.trigger('invalid', this, error, _.extend(options, {validationError: error}));
951 // Underscore methods that we want to implement on the Model.
952 var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit', 'chain', 'isEmpty'];
954 // Mix in each Underscore method as a proxy to `Model#attributes`.
955 _.each(modelMethods, function(method) {
956 if (!_[method]) return;
957 Model.prototype[method] = function() {
958 var args = slice.call(arguments);
959 args.unshift(this.attributes);
960 return _[method].apply(_, args);
965 Model.extend = extend;
966 module.exports = Model;
968 },{"backbone-events-standalone":8,"backbone-extend-standalone":9,"underscore":59}],7:[function(require,module,exports){
970 * Standalone extraction of Backbone.Events, no external dependency required.
971 * Degrades nicely when Backone/underscore are already available in the current
974 * Note that docs suggest to use underscore's `_.extend()` method to add Events
975 * support to some given object. A `mixin()` method has been added to the Events
976 * prototype to avoid using underscore for that sole purpose:
978 * var myEventEmitter = BackboneEvents.mixin({});
980 * Or for a function constructor:
982 * function MyConstructor(){}
983 * MyConstructor.prototype.foo = function(){}
984 * BackboneEvents.mixin(MyConstructor.prototype);
986 * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
987 * (c) 2013 Nicolas Perriault
989 /* global exports:true, define, module */
993 nativeForEach = Array.prototype.forEach,
994 hasOwnProperty = Object.prototype.hasOwnProperty,
995 slice = Array.prototype.slice,
998 // Returns a partial implementation matching the minimal API subset required
999 // by Backbone.Events
1000 function miniscore() {
1002 keys: Object.keys || function (obj) {
1003 if (typeof obj !== "object" && typeof obj !== "function" || obj === null) {
1004 throw new TypeError("keys() called on a non-object");
1008 if (obj.hasOwnProperty(key)) {
1009 keys[keys.length] = key;
1015 uniqueId: function(prefix) {
1016 var id = ++idCounter + '';
1017 return prefix ? prefix + id : id;
1020 has: function(obj, key) {
1021 return hasOwnProperty.call(obj, key);
1024 each: function(obj, iterator, context) {
1025 if (obj == null) return;
1026 if (nativeForEach && obj.forEach === nativeForEach) {
1027 obj.forEach(iterator, context);
1028 } else if (obj.length === +obj.length) {
1029 for (var i = 0, l = obj.length; i < l; i++) {
1030 if (iterator.call(context, obj[i], i, obj) === breaker) return;
1033 for (var key in obj) {
1034 if (this.has(obj, key)) {
1035 if (iterator.call(context, obj[key], key, obj) === breaker) return;
1041 once: function(func) {
1042 var ran = false, memo;
1044 if (ran) return memo;
1046 memo = func.apply(this, arguments);
1054 var _ = miniscore(), Events;
1059 // A module that can be mixed in to *any object* in order to provide it with
1060 // custom events. You may bind with `on` or remove with `off` callback
1061 // functions to an event; `trigger`-ing an event fires all callbacks in
1065 // _.extend(object, Backbone.Events);
1066 // object.on('expand', function(){ alert('expanded'); });
1067 // object.trigger('expand');
1071 // Bind an event to a `callback` function. Passing `"all"` will bind
1072 // the callback to all events fired.
1073 on: function(name, callback, context) {
1074 if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
1075 this._events || (this._events = {});
1076 var events = this._events[name] || (this._events[name] = []);
1077 events.push({callback: callback, context: context, ctx: context || this});
1081 // Bind an event to only be triggered a single time. After the first time
1082 // the callback is invoked, it will be removed.
1083 once: function(name, callback, context) {
1084 if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
1086 var once = _.once(function() {
1087 self.off(name, once);
1088 callback.apply(this, arguments);
1090 once._callback = callback;
1091 return this.on(name, once, context);
1094 // Remove one or many callbacks. If `context` is null, removes all
1095 // callbacks with that function. If `callback` is null, removes all
1096 // callbacks for the event. If `name` is null, removes all bound
1097 // callbacks for all events.
1098 off: function(name, callback, context) {
1099 var retain, ev, events, names, i, l, j, k;
1100 if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
1101 if (!name && !callback && !context) {
1106 names = name ? [name] : _.keys(this._events);
1107 for (i = 0, l = names.length; i < l; i++) {
1109 if (events = this._events[name]) {
1110 this._events[name] = retain = [];
1111 if (callback || context) {
1112 for (j = 0, k = events.length; j < k; j++) {
1114 if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||
1115 (context && context !== ev.context)) {
1120 if (!retain.length) delete this._events[name];
1127 // Trigger one or many events, firing all bound callbacks. Callbacks are
1128 // passed the same arguments as `trigger` is, apart from the event name
1129 // (unless you're listening on `"all"`, which will cause your callback to
1130 // receive the true name of the event as the first argument).
1131 trigger: function(name) {
1132 if (!this._events) return this;
1133 var args = slice.call(arguments, 1);
1134 if (!eventsApi(this, 'trigger', name, args)) return this;
1135 var events = this._events[name];
1136 var allEvents = this._events.all;
1137 if (events) triggerEvents(events, args);
1138 if (allEvents) triggerEvents(allEvents, arguments);
1142 // Tell this object to stop listening to either specific events ... or
1143 // to every object it's currently listening to.
1144 stopListening: function(obj, name, callback) {
1145 var listeners = this._listeners;
1146 if (!listeners) return this;
1147 var deleteListener = !name && !callback;
1148 if (typeof name === 'object') callback = this;
1149 if (obj) (listeners = {})[obj._listenerId] = obj;
1150 for (var id in listeners) {
1151 listeners[id].off(name, callback, this);
1152 if (deleteListener) delete this._listeners[id];
1159 // Regular expression used to split event strings.
1160 var eventSplitter = /\s+/;
1162 // Implement fancy features of the Events API such as multiple event
1163 // names `"change blur"` and jQuery-style event maps `{change: action}`
1164 // in terms of the existing API.
1165 var eventsApi = function(obj, action, name, rest) {
1166 if (!name) return true;
1168 // Handle event maps.
1169 if (typeof name === 'object') {
1170 for (var key in name) {
1171 obj[action].apply(obj, [key, name[key]].concat(rest));
1176 // Handle space separated event names.
1177 if (eventSplitter.test(name)) {
1178 var names = name.split(eventSplitter);
1179 for (var i = 0, l = names.length; i < l; i++) {
1180 obj[action].apply(obj, [names[i]].concat(rest));
1188 // A difficult-to-believe, but optimized internal dispatch function for
1189 // triggering events. Tries to keep the usual cases speedy (most internal
1190 // Backbone events have 3 arguments).
1191 var triggerEvents = function(events, args) {
1192 var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
1193 switch (args.length) {
1194 case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
1195 case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
1196 case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
1197 case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
1198 default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
1202 var listenMethods = {listenTo: 'on', listenToOnce: 'once'};
1204 // Inversion-of-control versions of `on` and `once`. Tell *this* object to
1205 // listen to an event in another object ... keeping track of what it's
1207 _.each(listenMethods, function(implementation, method) {
1208 Events[method] = function(obj, name, callback) {
1209 var listeners = this._listeners || (this._listeners = {});
1210 var id = obj._listenerId || (obj._listenerId = _.uniqueId('l'));
1211 listeners[id] = obj;
1212 if (typeof name === 'object') callback = this;
1213 obj[implementation](name, callback, this);
1218 // Aliases for backwards compatibility.
1219 Events.bind = Events.on;
1220 Events.unbind = Events.off;
1223 Events.mixin = function(proto) {
1224 var exports = ['on', 'once', 'off', 'trigger', 'stopListening', 'listenTo',
1225 'listenToOnce', 'bind', 'unbind'];
1226 _.each(exports, function(name) {
1227 proto[name] = this[name];
1232 // Export Events as BackboneEvents depending on current context
1233 if (typeof define === "function") {
1237 } else if (typeof exports !== 'undefined') {
1238 if (typeof module !== 'undefined' && module.exports) {
1239 exports = module.exports = Events;
1241 exports.BackboneEvents = Events;
1243 root.BackboneEvents = Events;
1247 },{}],8:[function(require,module,exports){
1248 module.exports = require('./backbone-events-standalone');
1250 },{"./backbone-events-standalone":7}],9:[function(require,module,exports){
1251 (function (definition) {
1252 if (typeof exports === "object") {
1253 module.exports = definition();
1255 else if (typeof define === 'function' && define.amd) {
1259 window.BackboneExtend = definition();
1266 has: function (obj, key) {
1267 return Object.prototype.hasOwnProperty.call(obj, key);
1270 extend: function(obj) {
1271 for (var i=1; i<arguments.length; ++i) {
1272 var source = arguments[i];
1274 for (var prop in source) {
1275 obj[prop] = source[prop];
1283 /// Following code is pasted from Backbone.js ///
1285 // Helper function to correctly set up the prototype chain, for subclasses.
1286 // Similar to `goog.inherits`, but uses a hash of prototype properties and
1287 // class properties to be extended.
1288 var extend = function(protoProps, staticProps) {
1292 // The constructor function for the new subclass is either defined by you
1293 // (the "constructor" property in your `extend` definition), or defaulted
1294 // by us to simply call the parent's constructor.
1295 if (protoProps && _.has(protoProps, 'constructor')) {
1296 child = protoProps.constructor;
1298 child = function(){ return parent.apply(this, arguments); };
1301 // Add static properties to the constructor function, if supplied.
1302 _.extend(child, parent, staticProps);
1304 // Set the prototype chain to inherit from `parent`, without calling
1305 // `parent`'s constructor function.
1306 var Surrogate = function(){ this.constructor = child; };
1307 Surrogate.prototype = parent.prototype;
1308 child.prototype = new Surrogate();
1310 // Add prototype properties (instance properties) to the subclass,
1312 if (protoProps) _.extend(child.prototype, protoProps);
1314 // Set a convenience property in case the parent's prototype is needed
1316 child.__super__ = parent.prototype;
1321 // Expose the extend function
1325 },{}],10:[function(require,module,exports){
1326 // this is the extracted view model from backbone
1327 // note that we inject jbone as jquery replacment
1328 // (and underscore directly)
1330 // Views are almost more convention than they are actual code.
1335 var _ = require("underscore");
1336 var Events = require("backbone-events-standalone");
1337 var extend = require("backbone-extend-standalone");
1338 var $ = require('jbone');
1340 // Backbone Views are almost more convention than they are actual code. A View
1341 // is simply a JavaScript object that represents a logical chunk of UI in the
1342 // DOM. This might be a single item, an entire list, a sidebar or panel, or
1343 // even the surrounding frame which wraps your whole app. Defining a chunk of
1344 // UI as a **View** allows you to define your DOM events declaratively, without
1345 // having to worry about render order ... and makes it easy for the view to
1346 // react to specific changes in the state of your models.
1348 // Creating a Backbone.View creates its initial element outside of the DOM,
1349 // if an existing element is not provided...
1350 var View = function(options) {
1351 this.cid = _.uniqueId('view');
1352 options || (options = {});
1353 _.extend(this, _.pick(options, viewOptions));
1354 this._ensureElement();
1355 this.initialize.apply(this, arguments);
1358 // Cached regex to split keys for `delegate`.
1359 var delegateEventSplitter = /^(\S+)\s*(.*)$/;
1361 // List of view options to be merged as properties.
1362 var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
1364 // Set up all inheritable **Backbone.View** properties and methods.
1365 _.extend(View.prototype, Events, {
1367 // The default `tagName` of a View's element is `"div"`.
1370 // jQuery delegate for element lookup, scoped to DOM elements within the
1371 // current view. This should be preferred to global lookups where possible.
1372 $: function(selector) {
1373 return this.$el.find(selector);
1376 // Initialize is an empty function by default. Override it with your own
1377 // initialization logic.
1378 initialize: function(){},
1380 // **render** is the core function that your view should override, in order
1381 // to populate its element (`this.el`), with the appropriate HTML. The
1382 // convention is for **render** to always return `this`.
1383 render: function() {
1387 // Remove this view by taking the element out of the DOM, and removing any
1388 // applicable Backbone.Events listeners.
1389 remove: function() {
1390 this._removeElement();
1391 this.stopListening();
1395 // Remove this view's element from the document and all event listeners
1396 // attached to it. Exposed for subclasses using an alternative DOM
1397 // manipulation API.
1398 _removeElement: function() {
1402 // Change the view's element (`this.el` property) and re-delegate the
1403 // view's events on the new element.
1404 setElement: function(element) {
1405 this.undelegateEvents();
1406 this._setElement(element);
1407 this.delegateEvents();
1411 // Creates the `this.el` and `this.$el` references for this view using the
1412 // given `el`. `el` can be a CSS selector or an HTML string, a jQuery
1413 // context or an element. Subclasses can override this to utilize an
1414 // alternative DOM manipulation API and are only required to set the
1415 // `this.el` property.
1416 _setElement: function(el) {
1417 this.$el = el instanceof $ ? el : $(el);
1418 this.el = this.$el[0];
1421 // Set callbacks, where `this.events` is a hash of
1423 // *{"event selector": "callback"}*
1426 // 'mousedown .title': 'edit',
1427 // 'click .button': 'save',
1428 // 'click .open': function(e) { ... }
1431 // pairs. Callbacks will be bound to the view, with `this` set properly.
1432 // Uses event delegation for efficiency.
1433 // Omitting the selector binds the event to `this.el`.
1434 delegateEvents: function(events) {
1435 if (!(events || (events = _.result(this, 'events')))) return this;
1436 this.undelegateEvents();
1437 for (var key in events) {
1438 var method = events[key];
1439 if (!_.isFunction(method)) method = this[events[key]];
1440 if (!method) continue;
1441 var match = key.match(delegateEventSplitter);
1442 this.delegate(match[1], match[2], _.bind(method, this));
1447 // Add a single event listener to the view's element (or a child element
1448 // using `selector`). This only works for delegate-able events: not `focus`,
1449 // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer.
1450 delegate: function(eventName, selector, listener) {
1451 this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener);
1454 // Clears all callbacks previously bound to the view by `delegateEvents`.
1455 // You usually don't need to use this, but may wish to if you have multiple
1456 // Backbone views attached to the same DOM element.
1457 undelegateEvents: function() {
1458 if (this.$el) this.$el.off('.delegateEvents' + this.cid);
1462 // A finer-grained `undelegateEvents` for removing a single delegated event.
1463 // `selector` and `listener` are both optional.
1464 undelegate: function(eventName, selector, listener) {
1465 this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener);
1468 // Produces a DOM element to be assigned to your view. Exposed for
1469 // subclasses using an alternative DOM manipulation API.
1470 _createElement: function(tagName) {
1471 return document.createElement(tagName);
1474 // Ensure that the View has a DOM element to render into.
1475 // If `this.el` is a string, pass it through `$()`, take the first
1476 // matching element, and re-assign it to `el`. Otherwise, create
1477 // an element from the `id`, `className` and `tagName` properties.
1478 _ensureElement: function() {
1480 var attrs = _.extend({}, _.result(this, 'attributes'));
1481 if (this.id) attrs.id = _.result(this, 'id');
1482 if (this.className) attrs['class'] = _.result(this, 'className');
1483 this.setElement(this._createElement(_.result(this, 'tagName')));
1484 this._setAttributes(attrs);
1486 this.setElement(_.result(this, 'el'));
1490 // Set attributes from a hash on this view's element. Exposed for
1491 // subclasses using an alternative DOM manipulation API.
1492 _setAttributes: function(attributes) {
1493 this.$el.attr(attributes);
1498 // setup inheritance
1499 View.extend = extend;
1500 module.exports = View;
1502 },{"backbone-events-standalone":12,"backbone-extend-standalone":13,"jbone":50,"underscore":59}],11:[function(require,module,exports){
1503 module.exports=require(7)
1504 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-events-standalone/backbone-events-standalone.js":7}],12:[function(require,module,exports){
1505 module.exports=require(8)
1506 },{"./backbone-events-standalone":11,"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-events-standalone/index.js":8}],13:[function(require,module,exports){
1507 module.exports=require(9)
1508 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-extend-standalone/backbone-extend-standalone.js":9}],14:[function(require,module,exports){
1509 var events = require("backbone-events-standalone");
1511 events.onAll = function(callback,context){
1512 this.on("all", callback,context);
1517 events.oldMixin = events.mixin;
1518 events.mixin = function(proto) {
1519 events.oldMixin(proto);
1521 var exports = ['onAll'];
1522 for(var i=0; i < exports.length;i++){
1523 var name = exports[i];
1524 proto[name] = this[name];
1529 module.exports = events;
1531 },{"backbone-events-standalone":16}],15:[function(require,module,exports){
1532 module.exports=require(7)
1533 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-events-standalone/backbone-events-standalone.js":7}],16:[function(require,module,exports){
1534 module.exports=require(8)
1535 },{"./backbone-events-standalone":15,"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-events-standalone/index.js":8}],17:[function(require,module,exports){
1536 // Generated by CoffeeScript 1.8.0
1537 var GenericReader, xhr;
1539 xhr = require('nets');
1541 module.exports = GenericReader = (function() {
1542 function GenericReader() {}
1544 GenericReader.read = function(url, callback) {
1546 onret = (function(_this) {
1547 return function(err, response, text) {
1548 return _this._onRetrieval(text, callback);
1551 return xhr(url, onret);
1554 GenericReader._onRetrieval = function(text, callback) {
1556 rText = this.parse(text);
1557 return callback(rText);
1560 return GenericReader;
1564 },{"nets":undefined}],18:[function(require,module,exports){
1565 // Generated by CoffeeScript 1.8.0
1568 module.exports = Seq = (function() {
1569 function Seq(seq, name, id) {
1581 },{}],19:[function(require,module,exports){
1582 // Generated by CoffeeScript 1.8.0
1586 contains: function(text, search) {
1587 return ''.indexOf.call(text, search, 0) !== -1;
1591 module.exports = strings;
1593 },{}],20:[function(require,module,exports){
1594 module.exports=require(17)
1595 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-clustal/lib/generic_reader.js":17,"nets":undefined}],21:[function(require,module,exports){
1596 // Generated by CoffeeScript 1.8.0
1597 var Fasta, GenericReader, Seq, Str,
1598 __hasProp = {}.hasOwnProperty,
1599 __extends = 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; };
1601 Str = require("./strings");
1603 GenericReader = require("./generic_reader");
1605 Seq = require("biojs-model").seq;
1607 module.exports = Fasta = (function(_super) {
1608 __extends(Fasta, _super);
1611 return Fasta.__super__.constructor.apply(this, arguments);
1614 Fasta.parse = function(text) {
1615 var currentSeq, database, databaseID, identifiers, k, label, line, seqs, _i, _len;
1617 if (Object.prototype.toString.call(text) !== '[object Array]') {
1618 text = text.split("\n");
1620 for (_i = 0, _len = text.length; _i < _len; _i++) {
1622 if (line[0] === ">" || line[0] === ";") {
1623 label = line.slice(1);
1624 currentSeq = new Seq("", label, seqs.length);
1625 seqs.push(currentSeq);
1626 if (Str.contains("|", line)) {
1627 identifiers = label.split("|");
1629 while (k < identifiers.length) {
1630 database = identifiers[k];
1631 databaseID = identifiers[k + 1];
1632 currentSeq.meta[database] = databaseID;
1635 currentSeq.name = identifiers[identifiers.length - 1];
1638 currentSeq.seq += line;
1648 },{"./generic_reader":20,"./strings":22,"biojs-model":25}],22:[function(require,module,exports){
1649 module.exports=require(19)
1650 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-clustal/lib/strings.js":19}],23:[function(require,module,exports){
1651 // Generated by CoffeeScript 1.8.0
1656 Utils.splitNChars = function(txt, num) {
1657 var i, result, _i, _ref;
1659 for (i = _i = 0, _ref = txt.length - 1; num > 0 ? _i <= _ref : _i >= _ref; i = _i += num) {
1660 result.push(txt.substr(i, num));
1665 module.exports = Utils;
1667 },{}],24:[function(require,module,exports){
1668 // Generated by CoffeeScript 1.8.0
1669 var FastaExporter, Utils;
1671 Utils = require("./utils");
1673 module.exports = FastaExporter = (function() {
1674 function FastaExporter() {}
1676 FastaExporter["export"] = function(seqs, access) {
1677 var seq, text, _i, _len;
1679 for (_i = 0, _len = seqs.length; _i < _len; _i++) {
1681 if (access != null) {
1684 text += ">" + seq.name + "\n";
1685 text += (Utils.splitNChars(seq.seq, 80)).join("\n");
1691 return FastaExporter;
1695 },{"./utils":23}],25:[function(require,module,exports){
1696 module.exports.seq = require("./seq");
1698 },{"./seq":26}],26:[function(require,module,exports){
1699 module.exports = function(seq, name, id) {
1706 },{}],27:[function(require,module,exports){
1707 module.exports=require(25)
1708 },{"./seq":28,"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-fasta/node_modules/biojs-model/src/index.js":25}],28:[function(require,module,exports){
1709 module.exports=require(26)
1710 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-fasta/node_modules/biojs-model/src/seq.js":26}],29:[function(require,module,exports){
1711 module.exports = require('./src/index.js')
1713 },{"./src/index.js":36}],30:[function(require,module,exports){
1740 },{}],31:[function(require,module,exports){
1771 },{}],32:[function(require,module,exports){
1802 },{}],33:[function(require,module,exports){
1829 },{}],34:[function(require,module,exports){
1856 },{}],35:[function(require,module,exports){
1886 },{}],36:[function(require,module,exports){
1887 module.exports.selector = require("./selector");
1890 module.exports.taylor = require("./taylor");
1891 module.exports.zappo= require("./zappo");
1892 module.exports.hydro= require("./hydrophobicity");
1894 module.exports.clustal = require("./clustal");
1895 module.exports.clustal2 = require("./clustal2");
1897 module.exports.curied = require("./buried");
1898 module.exports.cinema = require("./cinema");
1899 module.exports.nucleotide = require("./nucleotide");
1900 module.exports.helix = require("./helix");
1901 module.exports.lesk = require("./lesk");
1902 module.exports.mae = require("./mae");
1903 module.exports.purine = require("./purine");
1904 module.exports.strand = require("./strand");
1905 module.exports.turn = require("./turn");
1907 },{"./buried":30,"./cinema":31,"./clustal":32,"./clustal2":33,"./helix":34,"./hydrophobicity":35,"./lesk":37,"./mae":38,"./nucleotide":39,"./purine":40,"./selector":41,"./strand":42,"./taylor":43,"./turn":44,"./zappo":45}],37:[function(require,module,exports){
1938 },{}],38:[function(require,module,exports){
1969 },{}],39:[function(require,module,exports){
1978 },{}],40:[function(require,module,exports){
1989 },{}],41:[function(require,module,exports){
1990 var Buried = require("./buried");
1991 var Cinema = require("./cinema");
1992 var Clustal = require("./clustal");
1993 var Clustal2 = require("./clustal2");
1994 var Helix = require("./helix");
1995 var Hydro = require("./hydrophobicity");
1996 var Lesk = require("./lesk");
1997 var Mae = require("./mae");
1998 var Nucleotide = require("./nucleotide");
1999 var Purine = require("./purine");
2000 var Strand = require("./strand");
2001 var Taylor = require("./taylor");
2002 var Turn = require("./turn");
2003 var Zappo = require("./zappo");
2005 module.exports = Colors = {
2008 buried_index: Buried,
2013 helix_propensity: Helix,
2017 nucleotide: Nucleotide,
2019 purine_pyrimidine: Purine,
2021 strand_propensity: Strand,
2024 turn_propensity: Turn,
2027 getColor: function(scheme) {
2028 var color = Colors.mapping[scheme];
2029 if (color === undefined) {
2036 },{"./buried":30,"./cinema":31,"./clustal":32,"./clustal2":33,"./helix":34,"./hydrophobicity":35,"./lesk":37,"./mae":38,"./nucleotide":39,"./purine":40,"./strand":42,"./taylor":43,"./turn":44,"./zappo":45}],42:[function(require,module,exports){
2063 },{}],43:[function(require,module,exports){
2090 },{}],44:[function(require,module,exports){
2117 },{}],45:[function(require,module,exports){
2144 },{}],46:[function(require,module,exports){
2146 * JavaScript Canvas to Blob 2.0.5
2147 * https://github.com/blueimp/JavaScript-Canvas-to-Blob
2149 * Copyright 2012, Sebastian Tschan
2150 * https://blueimp.net
2152 * Licensed under the MIT license:
2153 * http://www.opensource.org/licenses/MIT
2155 * Based on stackoverflow user Stoive's code snippet:
2156 * http://stackoverflow.com/q/4998908
2158 var CanvasPrototype = window.HTMLCanvasElement &&
2159 window.HTMLCanvasElement.prototype,
2160 hasBlobConstructor = window.Blob && (function () {
2162 return Boolean(new Blob());
2167 hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array &&
2170 return new Blob([new Uint8Array(100)]).size === 100;
2175 BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
2176 window.MozBlobBuilder || window.MSBlobBuilder,
2177 dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob &&
2178 window.ArrayBuffer && window.Uint8Array && function (dataURI) {
2185 if (dataURI.split(',')[0].indexOf('base64') >= 0) {
2186 // Convert base64 to raw binary data held in a string:
2187 byteString = atob(dataURI.split(',')[1]);
2189 // Convert base64/URLEncoded data component to raw binary data:
2190 byteString = decodeURIComponent(dataURI.split(',')[1]);
2192 // Write the bytes of the string to an ArrayBuffer:
2193 arrayBuffer = new ArrayBuffer(byteString.length);
2194 intArray = new Uint8Array(arrayBuffer);
2195 for (i = 0; i < byteString.length; i += 1) {
2196 intArray[i] = byteString.charCodeAt(i);
2198 // Separate out the mime component:
2199 mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
2200 // Write the ArrayBuffer (or ArrayBufferView) to a blob:
2201 if (hasBlobConstructor) {
2203 [hasArrayBufferViewSupport ? intArray : arrayBuffer],
2207 bb = new BlobBuilder();
2208 bb.append(arrayBuffer);
2209 return bb.getBlob(mimeString);
2211 if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
2212 if (CanvasPrototype.mozGetAsFile) {
2213 CanvasPrototype.toBlob = function (callback, type, quality) {
2214 if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {
2215 callback(dataURLtoBlob(this.toDataURL(type, quality)));
2217 callback(this.mozGetAsFile('blob', type));
2220 } else if (CanvasPrototype.toDataURL && dataURLtoBlob) {
2221 CanvasPrototype.toBlob = function (callback, type, quality) {
2222 callback(dataURLtoBlob(this.toDataURL(type, quality)));
2227 module.exports = dataURLtoBlob;
2229 },{}],47:[function(require,module,exports){
2231 * A saveAs() FileSaver implementation.
2234 * By Eli Grey, http://eligrey.com
2236 * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
2240 /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
2242 /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
2245 // IE 10+ (native saveAs)
2246 || (typeof navigator !== "undefined" &&
2247 navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
2249 || (function(view) {
2251 // IE <10 is explicitly unsupported
2252 if (typeof navigator !== "undefined" &&
2253 /MSIE [1-9]\./.test(navigator.userAgent)) {
2258 // only get URL when necessary in case Blob.js hasn't overridden it yet
2259 , get_URL = function() {
2260 return view.URL || view.webkitURL || view;
2262 , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
2263 , can_use_save_link = !view.externalHost && "download" in save_link
2264 , click = function(node) {
2265 var event = doc.createEvent("MouseEvents");
2266 event.initMouseEvent(
2267 "click", true, false, view, 0, 0, 0, 0, 0
2268 , false, false, false, false, 0, null
2270 node.dispatchEvent(event);
2272 , webkit_req_fs = view.webkitRequestFileSystem
2273 , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
2274 , throw_outside = function(ex) {
2275 (view.setImmediate || view.setTimeout)(function() {
2279 , force_saveable_type = "application/octet-stream"
2281 , deletion_queue = []
2282 , process_deletion_queue = function() {
2283 var i = deletion_queue.length;
2285 var file = deletion_queue[i];
2286 if (typeof file === "string") { // file is an object URL
2287 get_URL().revokeObjectURL(file);
2288 } else { // file is a File
2292 deletion_queue.length = 0; // clear queue
2294 , dispatch = function(filesaver, event_types, event) {
2295 event_types = [].concat(event_types);
2296 var i = event_types.length;
2298 var listener = filesaver["on" + event_types[i]];
2299 if (typeof listener === "function") {
2301 listener.call(filesaver, event || filesaver);
2308 , FileSaver = function(blob, name) {
2309 // First try a.download, then web filesystem, then object URLs
2313 , blob_changed = false
2316 , get_object_url = function() {
2317 var object_url = get_URL().createObjectURL(blob);
2318 deletion_queue.push(object_url);
2321 , dispatch_all = function() {
2322 dispatch(filesaver, "writestart progress write writeend".split(" "));
2324 // on any filesys errors revert to saving with object URLs
2325 , fs_error = function() {
2326 // don't create more object URLs than needed
2327 if (blob_changed || !object_url) {
2328 object_url = get_object_url(blob);
2331 target_view.location.href = object_url;
2333 window.open(object_url, "_blank");
2335 filesaver.readyState = filesaver.DONE;
2338 , abortable = function(func) {
2340 if (filesaver.readyState !== filesaver.DONE) {
2341 return func.apply(this, arguments);
2345 , create_if_not_found = {create: true, exclusive: false}
2348 filesaver.readyState = filesaver.INIT;
2352 if (can_use_save_link) {
2353 object_url = get_object_url(blob);
2354 save_link.href = object_url;
2355 save_link.download = name;
2357 filesaver.readyState = filesaver.DONE;
2361 // Object and web filesystem URLs have a problem saving in Google Chrome when
2362 // viewed in a tab, so I force save with application/octet-stream
2363 // http://code.google.com/p/chromium/issues/detail?id=91158
2364 if (view.chrome && type && type !== force_saveable_type) {
2365 slice = blob.slice || blob.webkitSlice;
2366 blob = slice.call(blob, 0, blob.size, force_saveable_type);
2367 blob_changed = true;
2369 // Since I can't be sure that the guessed media type will trigger a download
2370 // in WebKit, I append .download to the filename.
2371 // https://bugs.webkit.org/show_bug.cgi?id=65440
2372 if (webkit_req_fs && name !== "download") {
2373 name += ".download";
2375 if (type === force_saveable_type || webkit_req_fs) {
2382 fs_min_size += blob.size;
2383 req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
2384 fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
2385 var save = function() {
2386 dir.getFile(name, create_if_not_found, abortable(function(file) {
2387 file.createWriter(abortable(function(writer) {
2388 writer.onwriteend = function(event) {
2389 target_view.location.href = file.toURL();
2390 deletion_queue.push(file);
2391 filesaver.readyState = filesaver.DONE;
2392 dispatch(filesaver, "writeend", event);
2394 writer.onerror = function() {
2395 var error = writer.error;
2396 if (error.code !== error.ABORT_ERR) {
2400 "writestart progress write abort".split(" ").forEach(function(event) {
2401 writer["on" + event] = filesaver["on" + event];
2404 filesaver.abort = function() {
2406 filesaver.readyState = filesaver.DONE;
2408 filesaver.readyState = filesaver.WRITING;
2412 dir.getFile(name, {create: false}, abortable(function(file) {
2413 // delete file if it already exists
2416 }), abortable(function(ex) {
2417 if (ex.code === ex.NOT_FOUND_ERR) {
2426 , FS_proto = FileSaver.prototype
2427 , saveAs = function(blob, name) {
2428 return new FileSaver(blob, name);
2431 FS_proto.abort = function() {
2432 var filesaver = this;
2433 filesaver.readyState = filesaver.DONE;
2434 dispatch(filesaver, "abort");
2436 FS_proto.readyState = FS_proto.INIT = 0;
2437 FS_proto.WRITING = 1;
2441 FS_proto.onwritestart =
2442 FS_proto.onprogress =
2446 FS_proto.onwriteend =
2449 view.addEventListener("unload", process_deletion_queue, false);
2450 saveAs.unload = function() {
2451 process_deletion_queue();
2452 view.removeEventListener("unload", process_deletion_queue, false);
2456 typeof self !== "undefined" && self
2457 || typeof window !== "undefined" && window
2460 // `self` is undefined in Firefox for Android content script context
2461 // while `this` is nsIContentFrameMessageManager
2462 // with an attribute `content` that corresponds to the window
2464 amdDefine = window.define;
2465 if( typeof amdDefine === "undefined" && (typeof window.almond !== "undefined"
2466 && "define" in window.almond )){
2467 amdDefine = window.almond.define;
2470 if (typeof module !== "undefined" && module !== null) {
2471 module.exports = saveAs;
2472 } else if ((typeof amdDefine !== "undefined" && amdDefine !== null) && (amdDefine.amd != null)) {
2473 amdDefine("saveAs",[], function() {
2478 },{}],48:[function(require,module,exports){
2479 module.exports = function (css, customDocument) {
2480 var doc = customDocument || document;
2481 if (doc.createStyleSheet) {
2482 var sheet = doc.createStyleSheet()
2483 sheet.cssText = css;
2484 return sheet.ownerNode;
2486 var head = doc.getElementsByTagName('head')[0],
2487 style = doc.createElement('style');
2489 style.type = 'text/css';
2491 if (style.styleSheet) {
2492 style.styleSheet.cssText = css;
2494 style.appendChild(doc.createTextNode(css));
2497 head.appendChild(style);
2502 module.exports.byUrl = function(url) {
2503 if (document.createStyleSheet) {
2504 return document.createStyleSheet(url).ownerNode;
2506 var head = document.getElementsByTagName('head')[0],
2507 link = document.createElement('link');
2509 link.rel = 'stylesheet';
2512 head.appendChild(link);
2517 },{}],49:[function(require,module,exports){
2522 Remove an element and provide a function that inserts it into its original position
2523 https://developers.google.com/speed/articles/javascript-dom
2524 @param element {Element} The element to be temporarily removed
2525 @return {Function} A function that inserts the element into its original position
2528 Utils.removeToInsertLater = function(element) {
2529 var nextSibling, parentNode;
2530 parentNode = element.parentNode;
2531 nextSibling = element.nextSibling;
2532 parentNode.removeChild(element);
2535 parentNode.insertBefore(element, nextSibling);
2537 parentNode.appendChild(element);
2544 fastest possible way to destroy all sub nodes (aka childs)
2545 http://jsperf.com/innerhtml-vs-removechild/15
2546 @param element {Element} The element for which all childs should be removed
2549 Utils.removeAllChilds = function(element) {
2552 while (element.firstChild) {
2554 element.removeChild(element.firstChild);
2558 module.exports = Utils;
2560 },{}],50:[function(require,module,exports){
2562 * jBone v1.0.19 - 2014-10-12 - Library for DOM manipulation
2564 * https://github.com/kupriyanenko/jbone
2566 * Copyright 2014 Alexey Kupriyanenko
2567 * Released under the MIT license.
2573 // cache previous versions
2577 // Quick match a standalone tag
2578 rquickSingleTag = /^<(\w+)\s*\/?>$/,
2580 // A simple way to check for HTML strings
2581 // Prioritize #id over <tag> to avoid XSS via location.hash
2582 rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
2584 // Alias for function
2589 // Alias for global variables
2592 isString = function(el) {
2593 return typeof el === "string";
2595 isObject = function(el) {
2596 return el instanceof Object;
2598 isFunction = function(el) {
2600 return el && getType.toString.call(el) === "[object Function]";
2602 isArray = function(el) {
2603 return Array.isArray(el);
2605 jBone = function(element, data) {
2606 return new fn.init(element, data);
2610 // set previous values and return the instance upon calling the no-conflict mode
2611 jBone.noConflict = function() {
2618 fn = jBone.fn = jBone.prototype = {
2619 init: function(element, data) {
2620 var elements, tag, wraper, fragment;
2625 if (isString(element)) {
2626 // Create single DOM element
2627 if (tag = rquickSingleTag.exec(element)) {
2628 this[0] = doc.createElement(tag[1]);
2631 if (isObject(data)) {
2637 // Create DOM collection
2638 if ((tag = rquickExpr.exec(element)) && tag[1]) {
2639 fragment = doc.createDocumentFragment();
2640 wraper = doc.createElement("div");
2641 wraper.innerHTML = element;
2642 while (wraper.lastChild) {
2643 fragment.appendChild(wraper.firstChild);
2645 elements = slice.call(fragment.childNodes);
2647 return jBone.merge(this, elements);
2649 // Find DOM elements with querySelectorAll
2650 if (jBone.isElement(data)) {
2651 return jBone(data).find(element);
2655 elements = doc.querySelectorAll(element);
2657 return jBone.merge(this, elements);
2663 if (element.nodeType) {
2670 if (isFunction(element)) {
2673 // Return jBone element as is
2674 if (element instanceof jBone) {
2678 // Return element wrapped by jBone
2679 return jBone.makeArray(element, this);
2684 reverse: [].reverse,
2689 indexOf: [].indexOf,
2690 forEach: [].forEach,
2691 unshift: [].unshift,
2699 reduceRight: [].reduceRight,
2703 fn.constructor = jBone;
2705 fn.init.prototype = fn;
2707 jBone.setId = function(el) {
2712 } else if (el.jid === undefined) {
2713 el.jid = jid = ++jBone._cache.jid;
2716 if (!jBone._cache.events[jid]) {
2717 jBone._cache.events[jid] = {};
2721 jBone.getData = function(el) {
2722 el = el instanceof jBone ? el[0] : el;
2724 var jid = el === win ? "window" : el.jid;
2728 events: jBone._cache.events[jid]
2732 jBone.isElement = function(el) {
2733 return el && el instanceof jBone || el instanceof HTMLElement || isString(el);
2741 function isArraylike(obj) {
2742 var length = obj.length,
2745 if (isFunction(type) || obj === win) {
2749 if (obj.nodeType === 1 && length) {
2753 return isArray(type) || length === 0 ||
2754 typeof length === "number" && length > 0 && (length - 1) in obj;
2757 jBone.merge = function(first, second) {
2758 var l = second.length,
2763 first[i++] = second[j++];
2771 jBone.contains = function(container, contained) {
2774 container.reverse().some(function(el) {
2775 if (el.contains(contained)) {
2783 jBone.extend = function(target) {
2786 splice.call(arguments, 1).forEach(function(object) {
2794 tg = target; //caching target for perf improvement
2796 for (; i < kl; i++) {
2797 tg[k[i]] = object[k[i]];
2804 jBone.makeArray = function(arr, results) {
2805 var ret = results || [];
2808 if (isArraylike(arr)) {
2809 jBone.merge(ret, isString(arr) ? [arr] : arr);
2818 function BoneEvent(e, data) {
2821 this.originalEvent = e;
2823 setter = function(key, e) {
2824 if (key === "preventDefault") {
2825 this[key] = function() {
2826 this.defaultPrevented = true;
2829 } else if (isFunction(e[key])) {
2830 this[key] = function() {
2839 if (e[key] || typeof e[key] === "function") {
2840 setter.call(this, key, e);
2844 jBone.extend(this, data);
2847 jBone.Event = function(event, data) {
2848 var namespace, eventType;
2850 if (event.type && !data) {
2855 namespace = event.split(".").splice(1).join(".");
2856 eventType = event.split(".")[0];
2858 event = doc.createEvent("Event");
2859 event.initEvent(eventType, true, true);
2861 return jBone.extend(event, {
2862 namespace: namespace,
2863 isDefaultPrevented: function() {
2864 return event.defaultPrevented;
2869 fn.on = function(event) {
2870 var args = arguments,
2871 length = this.length,
2873 callback, target, namespace, fn, events, eventType, expectedTarget, addListener;
2875 if (args.length === 2) {
2882 addListener = function(el) {
2884 events = jBone.getData(el).events;
2885 event.split(" ").forEach(function(event) {
2886 eventType = event.split(".")[0];
2887 namespace = event.split(".").splice(1).join(".");
2888 events[eventType] = events[eventType] || [];
2891 if (e.namespace && e.namespace !== namespace) {
2895 expectedTarget = null;
2897 callback.call(el, e);
2898 } else if (~jBone(el).find(target).indexOf(e.target) || (expectedTarget = jBone.contains(jBone(el).find(target), e.target))) {
2899 expectedTarget = expectedTarget || e.target;
2900 e = new BoneEvent(e, {
2901 currentTarget: expectedTarget
2904 callback.call(expectedTarget, e);
2908 events[eventType].push({
2909 namespace: namespace,
2914 el.addEventListener && el.addEventListener(eventType, fn, false);
2918 for (; i < length; i++) {
2919 addListener(this[i]);
2925 fn.one = function(event) {
2926 var args = arguments,
2928 length = this.length,
2929 callback, target, addListener;
2931 if (args.length === 2) {
2934 target = args[1], callback = args[2];
2937 addListener = function(el) {
2938 event.split(" ").forEach(function(event) {
2939 var fn = function(e) {
2940 jBone(el).off(event, fn);
2941 callback.call(el, e);
2945 jBone(el).on(event, fn);
2947 jBone(el).on(event, target, fn);
2952 for (; i < length; i++) {
2953 addListener(this[i]);
2959 fn.trigger = function(event) {
2962 length = this.length,
2969 if (isString(event)) {
2970 events = event.split(" ").map(function(event) {
2971 return jBone.Event(event);
2974 event = event instanceof Event ? event : jBone.Event(event);
2978 dispatchEvents = function(el) {
2979 events.forEach(function(event) {
2984 el.dispatchEvent && el.dispatchEvent(event);
2988 for (; i < length; i++) {
2989 dispatchEvents(this[i]);
2995 fn.off = function(event, fn) {
2997 length = this.length,
2998 removeListener = function(events, eventType, index, el, e) {
3002 if ((fn && e.originfn === fn) || !fn) {
3006 if (events[eventType][index].fn === callback) {
3007 el.removeEventListener(eventType, callback);
3009 // remove handler from cache
3010 jBone._cache.events[jBone.getData(el).jid][eventType].splice(index, 1);
3013 events, namespace, removeListeners, eventType;
3015 removeListeners = function(el) {
3016 var l, eventsByType, e;
3018 events = jBone.getData(el).events;
3024 // remove all events
3025 if (!event && events) {
3026 return keys(events).forEach(function(eventType) {
3027 eventsByType = events[eventType];
3028 l = eventsByType.length;
3031 removeListener(events, eventType, l, el, eventsByType[l]);
3036 event.split(" ").forEach(function(event) {
3037 eventType = event.split(".")[0];
3038 namespace = event.split(".").splice(1).join(".");
3040 // remove named events
3041 if (events[eventType]) {
3042 eventsByType = events[eventType];
3043 l = eventsByType.length;
3046 e = eventsByType[l];
3047 if (!namespace || (namespace && e.namespace === namespace)) {
3048 removeListener(events, eventType, l, el, e);
3052 // remove all namespaced events
3053 else if (namespace) {
3054 keys(events).forEach(function(eventType) {
3055 eventsByType = events[eventType];
3056 l = eventsByType.length;
3059 e = eventsByType[l];
3060 if (e.namespace.split(".")[0] === namespace.split(".")[0]) {
3061 removeListener(events, eventType, l, el, e);
3069 for (; i < length; i++) {
3070 removeListeners(this[i]);
3076 fn.find = function(selector) {
3079 length = this.length,
3080 finder = function(el) {
3081 if (isFunction(el.querySelectorAll)) {
3082 [].forEach.call(el.querySelectorAll(selector), function(found) {
3083 results.push(found);
3088 for (; i < length; i++) {
3092 return jBone(results);
3095 fn.get = function(index) {
3099 fn.eq = function(index) {
3100 return jBone(this[index]);
3103 fn.parent = function() {
3107 length = this.length;
3109 for (; i < length; i++) {
3110 if (!~results.indexOf(parent = this[i].parentElement) && parent) {
3111 results.push(parent);
3115 return jBone(results);
3118 fn.toArray = function() {
3119 return slice.call(this);
3122 fn.is = function() {
3123 var args = arguments;
3125 return this.some(function(el) {
3126 return el.tagName.toLowerCase() === args[0];
3130 fn.has = function() {
3131 var args = arguments;
3133 return this.some(function(el) {
3134 return el.querySelectorAll(args[0]).length;
3138 fn.attr = function(key, value) {
3139 var args = arguments,
3141 length = this.length,
3144 if (isString(key) && args.length === 1) {
3145 return this[0] && this[0].getAttribute(key);
3148 if (args.length === 2) {
3149 setter = function(el) {
3150 el.setAttribute(key, value);
3152 } else if (isObject(key)) {
3153 setter = function(el) {
3154 keys(key).forEach(function(name) {
3155 el.setAttribute(name, key[name]);
3160 for (; i < length; i++) {
3167 fn.removeAttr = function(key) {
3169 length = this.length;
3171 for (; i < length; i++) {
3172 this[i].removeAttribute(key);
3178 fn.val = function(value) {
3180 length = this.length;
3182 if (arguments.length === 0) {
3183 return this[0] && this[0].value;
3186 for (; i < length; i++) {
3187 this[i].value = value;
3193 fn.css = function(key, value) {
3194 var args = arguments,
3196 length = this.length,
3200 if (isString(key) && args.length === 1) {
3201 return this[0] && win.getComputedStyle(this[0])[key];
3205 if (args.length === 2) {
3206 setter = function(el) {
3207 el.style[key] = value;
3209 } else if (isObject(key)) {
3210 setter = function(el) {
3211 keys(key).forEach(function(name) {
3212 el.style[name] = key[name];
3217 for (; i < length; i++) {
3224 fn.data = function(key, value) {
3225 var args = arguments, data = {},
3227 length = this.length,
3229 setValue = function(el, key, value) {
3230 if (isObject(value)) {
3231 el.jdata = el.jdata || {};
3232 el.jdata[key] = value;
3234 el.dataset[key] = value;
3237 getValue = function(value) {
3238 if (value === "true") {
3240 } else if (value === "false") {
3248 if (args.length === 0) {
3249 this[0].jdata && (data = this[0].jdata);
3251 keys(this[0].dataset).forEach(function(key) {
3252 data[key] = getValue(this[0].dataset[key]);
3258 if (args.length === 1 && isString(key)) {
3259 return this[0] && getValue(this[0].dataset[key] || this[0].jdata && this[0].jdata[key]);
3263 if (args.length === 1 && isObject(key)) {
3264 setter = function(el) {
3265 keys(key).forEach(function(name) {
3266 setValue(el, name, key[name]);
3269 } else if (args.length === 2) {
3270 setter = function(el) {
3271 setValue(el, key, value);
3275 for (; i < length; i++) {
3282 fn.removeData = function(key) {
3284 length = this.length,
3287 for (; i < length; i++) {
3288 jdata = this[i].jdata;
3289 dataset = this[i].dataset;
3292 jdata && jdata[key] && delete jdata[key];
3293 delete dataset[key];
3295 for (key in jdata) {
3299 for (key in dataset) {
3300 delete dataset[key];
3308 fn.html = function(value) {
3309 var args = arguments,
3312 // add HTML into elements
3313 if (args.length === 1 && value !== undefined) {
3314 return this.empty().append(value);
3316 // get HTML from element
3317 else if (args.length === 0 && (el = this[0])) {
3318 return el.innerHTML;
3324 fn.append = function(appended) {
3326 length = this.length,
3329 // create jBone object and then append
3330 if (isString(appended) && rquickExpr.exec(appended)) {
3331 appended = jBone(appended);
3333 // create text node for inserting
3334 else if (!isObject(appended)) {
3335 appended = document.createTextNode(appended);
3338 appended = appended instanceof jBone ? appended : jBone(appended);
3340 setter = function(el, i) {
3341 appended.forEach(function(node) {
3343 el.appendChild(node.cloneNode());
3345 el.appendChild(node);
3350 for (; i < length; i++) {
3357 fn.appendTo = function(to) {
3358 jBone(to).append(this);
3363 fn.empty = function() {
3365 length = this.length,
3368 for (; i < length; i++) {
3371 while (el.lastChild) {
3372 el.removeChild(el.lastChild);
3379 fn.remove = function() {
3381 length = this.length,
3384 // remove all listners
3387 for (; i < length; i++) {
3390 // remove data and nodes
3392 el.parentNode && el.parentNode.removeChild(el);
3398 if (typeof module === "object" && module && typeof module.exports === "object") {
3399 // Expose jBone as module.exports in loaders that implement the Node
3400 // module pattern (including browserify). Do not create the global, since
3401 // the user will be storing it themselves locally, and globals are frowned
3402 // upon in the Node module world.
3403 module.exports = jBone;
3405 // Register as a AMD module
3406 else if (typeof define === "function" && define.amd) {
3411 win.jBone = win.$ = jBone;
3412 } else if (typeof win === "object" && typeof win.document === "object") {
3413 win.jBone = win.$ = jBone;
3418 },{}],51:[function(require,module,exports){
3421 module.exports = Mouse = {
3423 var mouseX, mouseY, rect, target;
3426 if (mouseX == null) {
3427 rect = target.getBoundingClientRect();
3428 target = e.target || e.srcElement;
3429 if (mouseX == null) {
3430 mouseX = e.clientX - rect.left;
3431 mouseY = e.clientY - rect.top;
3433 if (mouseX == null) {
3434 mouseX = e.pageX - target.offsetLeft;
3435 mouseY = e.pageY - target.offsetTop;
3437 if (mouseX == null) {
3438 console.log(e, "no mouse event defined. your browser sucks");
3442 return [mouseX, mouseY];
3448 if (mouseX == null) {
3452 if (mouseX == null) {
3456 if (mouseX == null) {
3460 return [mouseX, mouseY];
3462 wheelDelta: function(e) {
3464 delta = [e.deltaX, e.deltaY];
3465 if (delta[0] == null) {
3466 dir = Math.floor(e.detail / 3);
3467 delta = [0, e.mozMovementX * dir];
3473 },{}],52:[function(require,module,exports){
3474 var window = require("global/window")
3475 var once = require("once")
3476 var parseHeaders = require('parse-headers')
3479 "0": "Internal XMLHttpRequest Error",
3480 "4": "4xx Client Error",
3481 "5": "5xx Server Error"
3484 var XHR = window.XMLHttpRequest || noop
3485 var XDR = "withCredentials" in (new XHR()) ? XHR : window.XDomainRequest
3487 module.exports = createXHR
3489 function createXHR(options, callback) {
3490 if (typeof options === "string") {
3491 options = { uri: options }
3494 options = options || {}
3495 callback = once(callback)
3497 var xhr = options.xhr || null
3500 if (options.cors || options.useXDR) {
3507 var uri = xhr.url = options.uri || options.url
3508 var method = xhr.method = options.method || "GET"
3509 var body = options.body || options.data
3510 var headers = xhr.headers = options.headers || {}
3511 var sync = !!options.sync
3514 var load = options.response ? loadResponse : loadXhr
3516 if ("json" in options) {
3518 headers["Accept"] = "application/json"
3519 if (method !== "GET" && method !== "HEAD") {
3520 headers["Content-Type"] = "application/json"
3521 body = JSON.stringify(options.json)
3525 xhr.onreadystatechange = readystatechange
3528 // IE9 must have onprogress be set to a unique function.
3529 xhr.onprogress = function () {
3533 xhr.ontimeout = noop
3534 xhr.open(method, uri, !sync)
3535 //backward compatibility
3536 if (options.withCredentials || (options.cors && options.withCredentials !== false)) {
3537 xhr.withCredentials = true
3540 // Cannot set timeout with sync request
3542 xhr.timeout = "timeout" in options ? options.timeout : 5000
3545 if (xhr.setRequestHeader) {
3546 for(key in headers){
3547 if(headers.hasOwnProperty(key)){
3548 xhr.setRequestHeader(key, headers[key])
3551 } else if (options.headers) {
3552 throw new Error("Headers cannot be set on an XDomainRequest object")
3555 if ("responseType" in options) {
3556 xhr.responseType = options.responseType
3559 if ("beforeSend" in options &&
3560 typeof options.beforeSend === "function"
3562 options.beforeSend(xhr)
3569 function readystatechange() {
3570 if (xhr.readyState === 4) {
3575 function getBody() {
3576 // Chrome with requestType=blob throws errors arround when even testing access to responseText
3581 } else if (xhr.responseType === 'text' || !xhr.responseType) {
3582 body = xhr.responseText || xhr.responseXML
3587 body = JSON.parse(body)
3594 function getStatusCode() {
3595 return xhr.status === 1223 ? 204 : xhr.status
3598 // if we're getting a none-ok statusCode, build & return an error
3599 function errorFromStatusCode(status) {
3601 if (status === 0 || (status >= 400 && status < 600)) {
3602 var message = (typeof body === "string" ? body : false) ||
3603 messages[String(status).charAt(0)]
3604 error = new Error(message)
3605 error.statusCode = status
3611 // will load the data & process the response in a special response object
3612 function loadResponse() {
3613 var status = getStatusCode()
3614 var error = errorFromStatusCode(status)
3618 statusText: xhr.statusText,
3621 if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
3622 response.headers = parseHeaders(xhr.getAllResponseHeaders())
3624 response.headers = {}
3627 callback(error, response, response.body)
3630 // will load the data and add some response properties to the source xhr
3631 // and then respond with that
3632 function loadXhr() {
3633 var status = getStatusCode()
3634 var error = errorFromStatusCode(status)
3636 xhr.status = xhr.statusCode = status
3637 xhr.body = getBody()
3638 xhr.headers = parseHeaders(xhr.getAllResponseHeaders())
3640 callback(error, xhr, xhr.body)
3643 function error(evt) {
3651 },{"global/window":53,"once":54,"parse-headers":58}],53:[function(require,module,exports){
3653 if (typeof window !== "undefined") {
3654 module.exports = window;
3655 } else if (typeof global !== "undefined") {
3656 module.exports = global;
3657 } else if (typeof self !== "undefined"){
3658 module.exports = self;
3660 module.exports = {};
3663 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
3664 },{}],54:[function(require,module,exports){
3665 module.exports = once
3667 once.proto = once(function () {
3668 Object.defineProperty(Function.prototype, 'once', {
3669 value: function () {
3676 function once (fn) {
3678 return function () {
3681 return fn.apply(this, arguments)
3685 },{}],55:[function(require,module,exports){
3686 var isFunction = require('is-function')
3688 module.exports = forEach
3690 var toString = Object.prototype.toString
3691 var hasOwnProperty = Object.prototype.hasOwnProperty
3693 function forEach(list, iterator, context) {
3694 if (!isFunction(iterator)) {
3695 throw new TypeError('iterator must be a function')
3698 if (arguments.length < 3) {
3702 if (toString.call(list) === '[object Array]')
3703 forEachArray(list, iterator, context)
3704 else if (typeof list === 'string')
3705 forEachString(list, iterator, context)
3707 forEachObject(list, iterator, context)
3710 function forEachArray(array, iterator, context) {
3711 for (var i = 0, len = array.length; i < len; i++) {
3712 if (hasOwnProperty.call(array, i)) {
3713 iterator.call(context, array[i], i, array)
3718 function forEachString(string, iterator, context) {
3719 for (var i = 0, len = string.length; i < len; i++) {
3720 // no such thing as a sparse string.
3721 iterator.call(context, string.charAt(i), i, string)
3725 function forEachObject(object, iterator, context) {
3726 for (var k in object) {
3727 if (hasOwnProperty.call(object, k)) {
3728 iterator.call(context, object[k], k, object)
3733 },{"is-function":56}],56:[function(require,module,exports){
3734 module.exports = isFunction
3736 var toString = Object.prototype.toString
3738 function isFunction (fn) {
3739 var string = toString.call(fn)
3740 return string === '[object Function]' ||
3741 (typeof fn === 'function' && string !== '[object RegExp]') ||
3742 (typeof window !== 'undefined' &&
3744 (fn === window.setTimeout ||
3745 fn === window.alert ||
3746 fn === window.confirm ||
3747 fn === window.prompt))
3750 },{}],57:[function(require,module,exports){
3752 exports = module.exports = trim;
3755 return str.replace(/^\s*|\s*$/g, '');
3758 exports.left = function(str){
3759 return str.replace(/^\s*/, '');
3762 exports.right = function(str){
3763 return str.replace(/\s*$/, '');
3766 },{}],58:[function(require,module,exports){
3767 var trim = require('trim')
3768 , forEach = require('for-each')
3769 , isArray = function(arg) {
3770 return Object.prototype.toString.call(arg) === '[object Array]';
3773 module.exports = function (headers) {
3780 trim(headers).split('\n')
3782 var index = row.indexOf(':')
3783 , key = trim(row.slice(0, index)).toLowerCase()
3784 , value = trim(row.slice(index + 1))
3786 if (typeof(result[key]) === 'undefined') {
3788 } else if (isArray(result[key])) {
3789 result[key].push(value)
3791 result[key] = [ result[key], value ]
3798 },{"for-each":55,"trim":57}],59:[function(require,module,exports){
3799 // Underscore.js 1.7.0
3800 // http://underscorejs.org
3801 // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
3802 // Underscore may be freely distributed under the MIT license.
3809 // Establish the root object, `window` in the browser, or `exports` on the server.
3812 // Save the previous value of the `_` variable.
3813 var previousUnderscore = root._;
3815 // Save bytes in the minified (but not gzipped) version:
3816 var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
3818 // Create quick reference variables for speed access to core prototypes.
3820 push = ArrayProto.push,
3821 slice = ArrayProto.slice,
3822 concat = ArrayProto.concat,
3823 toString = ObjProto.toString,
3824 hasOwnProperty = ObjProto.hasOwnProperty;
3826 // All **ECMAScript 5** native function implementations that we hope to use
3827 // are declared here.
3829 nativeIsArray = Array.isArray,
3830 nativeKeys = Object.keys,
3831 nativeBind = FuncProto.bind;
3833 // Create a safe reference to the Underscore object for use below.
3834 var _ = function(obj) {
3835 if (obj instanceof _) return obj;
3836 if (!(this instanceof _)) return new _(obj);
3837 this._wrapped = obj;
3840 // Export the Underscore object for **Node.js**, with
3841 // backwards-compatibility for the old `require()` API. If we're in
3842 // the browser, add `_` as a global object.
3843 if (typeof exports !== 'undefined') {
3844 if (typeof module !== 'undefined' && module.exports) {
3845 exports = module.exports = _;
3853 _.VERSION = '1.7.0';
3855 // Internal function that returns an efficient (for current engines) version
3856 // of the passed-in callback, to be repeatedly applied in other Underscore
3858 var createCallback = function(func, context, argCount) {
3859 if (context === void 0) return func;
3860 switch (argCount == null ? 3 : argCount) {
3861 case 1: return function(value) {
3862 return func.call(context, value);
3864 case 2: return function(value, other) {
3865 return func.call(context, value, other);
3867 case 3: return function(value, index, collection) {
3868 return func.call(context, value, index, collection);
3870 case 4: return function(accumulator, value, index, collection) {
3871 return func.call(context, accumulator, value, index, collection);
3875 return func.apply(context, arguments);
3879 // A mostly-internal function to generate callbacks that can be applied
3880 // to each element in a collection, returning the desired result — either
3881 // identity, an arbitrary callback, a property matcher, or a property accessor.
3882 _.iteratee = function(value, context, argCount) {
3883 if (value == null) return _.identity;
3884 if (_.isFunction(value)) return createCallback(value, context, argCount);
3885 if (_.isObject(value)) return _.matches(value);
3886 return _.property(value);
3889 // Collection Functions
3890 // --------------------
3892 // The cornerstone, an `each` implementation, aka `forEach`.
3893 // Handles raw objects in addition to array-likes. Treats all
3894 // sparse array-likes as if they were dense.
3895 _.each = _.forEach = function(obj, iteratee, context) {
3896 if (obj == null) return obj;
3897 iteratee = createCallback(iteratee, context);
3898 var i, length = obj.length;
3899 if (length === +length) {
3900 for (i = 0; i < length; i++) {
3901 iteratee(obj[i], i, obj);
3904 var keys = _.keys(obj);
3905 for (i = 0, length = keys.length; i < length; i++) {
3906 iteratee(obj[keys[i]], keys[i], obj);
3912 // Return the results of applying the iteratee to each element.
3913 _.map = _.collect = function(obj, iteratee, context) {
3914 if (obj == null) return [];
3915 iteratee = _.iteratee(iteratee, context);
3916 var keys = obj.length !== +obj.length && _.keys(obj),
3917 length = (keys || obj).length,
3918 results = Array(length),
3920 for (var index = 0; index < length; index++) {
3921 currentKey = keys ? keys[index] : index;
3922 results[index] = iteratee(obj[currentKey], currentKey, obj);
3927 var reduceError = 'Reduce of empty array with no initial value';
3929 // **Reduce** builds up a single result from a list of values, aka `inject`,
3931 _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
3932 if (obj == null) obj = [];
3933 iteratee = createCallback(iteratee, context, 4);
3934 var keys = obj.length !== +obj.length && _.keys(obj),
3935 length = (keys || obj).length,
3936 index = 0, currentKey;
3937 if (arguments.length < 3) {
3938 if (!length) throw new TypeError(reduceError);
3939 memo = obj[keys ? keys[index++] : index++];
3941 for (; index < length; index++) {
3942 currentKey = keys ? keys[index] : index;
3943 memo = iteratee(memo, obj[currentKey], currentKey, obj);
3948 // The right-associative version of reduce, also known as `foldr`.
3949 _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
3950 if (obj == null) obj = [];
3951 iteratee = createCallback(iteratee, context, 4);
3952 var keys = obj.length !== + obj.length && _.keys(obj),
3953 index = (keys || obj).length,
3955 if (arguments.length < 3) {
3956 if (!index) throw new TypeError(reduceError);
3957 memo = obj[keys ? keys[--index] : --index];
3960 currentKey = keys ? keys[index] : index;
3961 memo = iteratee(memo, obj[currentKey], currentKey, obj);
3966 // Return the first value which passes a truth test. Aliased as `detect`.
3967 _.find = _.detect = function(obj, predicate, context) {
3969 predicate = _.iteratee(predicate, context);
3970 _.some(obj, function(value, index, list) {
3971 if (predicate(value, index, list)) {
3979 // Return all the elements that pass a truth test.
3980 // Aliased as `select`.
3981 _.filter = _.select = function(obj, predicate, context) {
3983 if (obj == null) return results;
3984 predicate = _.iteratee(predicate, context);
3985 _.each(obj, function(value, index, list) {
3986 if (predicate(value, index, list)) results.push(value);
3991 // Return all the elements for which a truth test fails.
3992 _.reject = function(obj, predicate, context) {
3993 return _.filter(obj, _.negate(_.iteratee(predicate)), context);
3996 // Determine whether all of the elements match a truth test.
3997 // Aliased as `all`.
3998 _.every = _.all = function(obj, predicate, context) {
3999 if (obj == null) return true;
4000 predicate = _.iteratee(predicate, context);
4001 var keys = obj.length !== +obj.length && _.keys(obj),
4002 length = (keys || obj).length,
4004 for (index = 0; index < length; index++) {
4005 currentKey = keys ? keys[index] : index;
4006 if (!predicate(obj[currentKey], currentKey, obj)) return false;
4011 // Determine if at least one element in the object matches a truth test.
4012 // Aliased as `any`.
4013 _.some = _.any = function(obj, predicate, context) {
4014 if (obj == null) return false;
4015 predicate = _.iteratee(predicate, context);
4016 var keys = obj.length !== +obj.length && _.keys(obj),
4017 length = (keys || obj).length,
4019 for (index = 0; index < length; index++) {
4020 currentKey = keys ? keys[index] : index;
4021 if (predicate(obj[currentKey], currentKey, obj)) return true;
4026 // Determine if the array or object contains a given value (using `===`).
4027 // Aliased as `include`.
4028 _.contains = _.include = function(obj, target) {
4029 if (obj == null) return false;
4030 if (obj.length !== +obj.length) obj = _.values(obj);
4031 return _.indexOf(obj, target) >= 0;
4034 // Invoke a method (with arguments) on every item in a collection.
4035 _.invoke = function(obj, method) {
4036 var args = slice.call(arguments, 2);
4037 var isFunc = _.isFunction(method);
4038 return _.map(obj, function(value) {
4039 return (isFunc ? method : value[method]).apply(value, args);
4043 // Convenience version of a common use case of `map`: fetching a property.
4044 _.pluck = function(obj, key) {
4045 return _.map(obj, _.property(key));
4048 // Convenience version of a common use case of `filter`: selecting only objects
4049 // containing specific `key:value` pairs.
4050 _.where = function(obj, attrs) {
4051 return _.filter(obj, _.matches(attrs));
4054 // Convenience version of a common use case of `find`: getting the first object
4055 // containing specific `key:value` pairs.
4056 _.findWhere = function(obj, attrs) {
4057 return _.find(obj, _.matches(attrs));
4060 // Return the maximum element (or element-based computation).
4061 _.max = function(obj, iteratee, context) {
4062 var result = -Infinity, lastComputed = -Infinity,
4064 if (iteratee == null && obj != null) {
4065 obj = obj.length === +obj.length ? obj : _.values(obj);
4066 for (var i = 0, length = obj.length; i < length; i++) {
4068 if (value > result) {
4073 iteratee = _.iteratee(iteratee, context);
4074 _.each(obj, function(value, index, list) {
4075 computed = iteratee(value, index, list);
4076 if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
4078 lastComputed = computed;
4085 // Return the minimum element (or element-based computation).
4086 _.min = function(obj, iteratee, context) {
4087 var result = Infinity, lastComputed = Infinity,
4089 if (iteratee == null && obj != null) {
4090 obj = obj.length === +obj.length ? obj : _.values(obj);
4091 for (var i = 0, length = obj.length; i < length; i++) {
4093 if (value < result) {
4098 iteratee = _.iteratee(iteratee, context);
4099 _.each(obj, function(value, index, list) {
4100 computed = iteratee(value, index, list);
4101 if (computed < lastComputed || computed === Infinity && result === Infinity) {
4103 lastComputed = computed;
4110 // Shuffle a collection, using the modern version of the
4111 // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
4112 _.shuffle = function(obj) {
4113 var set = obj && obj.length === +obj.length ? obj : _.values(obj);
4114 var length = set.length;
4115 var shuffled = Array(length);
4116 for (var index = 0, rand; index < length; index++) {
4117 rand = _.random(0, index);
4118 if (rand !== index) shuffled[index] = shuffled[rand];
4119 shuffled[rand] = set[index];
4124 // Sample **n** random values from a collection.
4125 // If **n** is not specified, returns a single random element.
4126 // The internal `guard` argument allows it to work with `map`.
4127 _.sample = function(obj, n, guard) {
4128 if (n == null || guard) {
4129 if (obj.length !== +obj.length) obj = _.values(obj);
4130 return obj[_.random(obj.length - 1)];
4132 return _.shuffle(obj).slice(0, Math.max(0, n));
4135 // Sort the object's values by a criterion produced by an iteratee.
4136 _.sortBy = function(obj, iteratee, context) {
4137 iteratee = _.iteratee(iteratee, context);
4138 return _.pluck(_.map(obj, function(value, index, list) {
4142 criteria: iteratee(value, index, list)
4144 }).sort(function(left, right) {
4145 var a = left.criteria;
4146 var b = right.criteria;
4148 if (a > b || a === void 0) return 1;
4149 if (a < b || b === void 0) return -1;
4151 return left.index - right.index;
4155 // An internal function used for aggregate "group by" operations.
4156 var group = function(behavior) {
4157 return function(obj, iteratee, context) {
4159 iteratee = _.iteratee(iteratee, context);
4160 _.each(obj, function(value, index) {
4161 var key = iteratee(value, index, obj);
4162 behavior(result, value, key);
4168 // Groups the object's values by a criterion. Pass either a string attribute
4169 // to group by, or a function that returns the criterion.
4170 _.groupBy = group(function(result, value, key) {
4171 if (_.has(result, key)) result[key].push(value); else result[key] = [value];
4174 // Indexes the object's values by a criterion, similar to `groupBy`, but for
4175 // when you know that your index values will be unique.
4176 _.indexBy = group(function(result, value, key) {
4177 result[key] = value;
4180 // Counts instances of an object that group by a certain criterion. Pass
4181 // either a string attribute to count by, or a function that returns the
4183 _.countBy = group(function(result, value, key) {
4184 if (_.has(result, key)) result[key]++; else result[key] = 1;
4187 // Use a comparator function to figure out the smallest index at which
4188 // an object should be inserted so as to maintain order. Uses binary search.
4189 _.sortedIndex = function(array, obj, iteratee, context) {
4190 iteratee = _.iteratee(iteratee, context, 1);
4191 var value = iteratee(obj);
4192 var low = 0, high = array.length;
4193 while (low < high) {
4194 var mid = low + high >>> 1;
4195 if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
4200 // Safely create a real, live array from anything iterable.
4201 _.toArray = function(obj) {
4202 if (!obj) return [];
4203 if (_.isArray(obj)) return slice.call(obj);
4204 if (obj.length === +obj.length) return _.map(obj, _.identity);
4205 return _.values(obj);
4208 // Return the number of elements in an object.
4209 _.size = function(obj) {
4210 if (obj == null) return 0;
4211 return obj.length === +obj.length ? obj.length : _.keys(obj).length;
4214 // Split a collection into two arrays: one whose elements all satisfy the given
4215 // predicate, and one whose elements all do not satisfy the predicate.
4216 _.partition = function(obj, predicate, context) {
4217 predicate = _.iteratee(predicate, context);
4218 var pass = [], fail = [];
4219 _.each(obj, function(value, key, obj) {
4220 (predicate(value, key, obj) ? pass : fail).push(value);
4222 return [pass, fail];
4228 // Get the first element of an array. Passing **n** will return the first N
4229 // values in the array. Aliased as `head` and `take`. The **guard** check
4230 // allows it to work with `_.map`.
4231 _.first = _.head = _.take = function(array, n, guard) {
4232 if (array == null) return void 0;
4233 if (n == null || guard) return array[0];
4234 if (n < 0) return [];
4235 return slice.call(array, 0, n);
4238 // Returns everything but the last entry of the array. Especially useful on
4239 // the arguments object. Passing **n** will return all the values in
4240 // the array, excluding the last N. The **guard** check allows it to work with
4242 _.initial = function(array, n, guard) {
4243 return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
4246 // Get the last element of an array. Passing **n** will return the last N
4247 // values in the array. The **guard** check allows it to work with `_.map`.
4248 _.last = function(array, n, guard) {
4249 if (array == null) return void 0;
4250 if (n == null || guard) return array[array.length - 1];
4251 return slice.call(array, Math.max(array.length - n, 0));
4254 // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
4255 // Especially useful on the arguments object. Passing an **n** will return
4256 // the rest N values in the array. The **guard**
4257 // check allows it to work with `_.map`.
4258 _.rest = _.tail = _.drop = function(array, n, guard) {
4259 return slice.call(array, n == null || guard ? 1 : n);
4262 // Trim out all falsy values from an array.
4263 _.compact = function(array) {
4264 return _.filter(array, _.identity);
4267 // Internal implementation of a recursive `flatten` function.
4268 var flatten = function(input, shallow, strict, output) {
4269 if (shallow && _.every(input, _.isArray)) {
4270 return concat.apply(output, input);
4272 for (var i = 0, length = input.length; i < length; i++) {
4273 var value = input[i];
4274 if (!_.isArray(value) && !_.isArguments(value)) {
4275 if (!strict) output.push(value);
4276 } else if (shallow) {
4277 push.apply(output, value);
4279 flatten(value, shallow, strict, output);
4285 // Flatten out an array, either recursively (by default), or just one level.
4286 _.flatten = function(array, shallow) {
4287 return flatten(array, shallow, false, []);
4290 // Return a version of the array that does not contain the specified value(s).
4291 _.without = function(array) {
4292 return _.difference(array, slice.call(arguments, 1));
4295 // Produce a duplicate-free version of the array. If the array has already
4296 // been sorted, you have the option of using a faster algorithm.
4297 // Aliased as `unique`.
4298 _.uniq = _.unique = function(array, isSorted, iteratee, context) {
4299 if (array == null) return [];
4300 if (!_.isBoolean(isSorted)) {
4302 iteratee = isSorted;
4305 if (iteratee != null) iteratee = _.iteratee(iteratee, context);
4308 for (var i = 0, length = array.length; i < length; i++) {
4309 var value = array[i];
4311 if (!i || seen !== value) result.push(value);
4313 } else if (iteratee) {
4314 var computed = iteratee(value, i, array);
4315 if (_.indexOf(seen, computed) < 0) {
4316 seen.push(computed);
4319 } else if (_.indexOf(result, value) < 0) {
4326 // Produce an array that contains the union: each distinct element from all of
4327 // the passed-in arrays.
4328 _.union = function() {
4329 return _.uniq(flatten(arguments, true, true, []));
4332 // Produce an array that contains every item shared between all the
4333 // passed-in arrays.
4334 _.intersection = function(array) {
4335 if (array == null) return [];
4337 var argsLength = arguments.length;
4338 for (var i = 0, length = array.length; i < length; i++) {
4339 var item = array[i];
4340 if (_.contains(result, item)) continue;
4341 for (var j = 1; j < argsLength; j++) {
4342 if (!_.contains(arguments[j], item)) break;
4344 if (j === argsLength) result.push(item);
4349 // Take the difference between one array and a number of other arrays.
4350 // Only the elements present in just the first array will remain.
4351 _.difference = function(array) {
4352 var rest = flatten(slice.call(arguments, 1), true, true, []);
4353 return _.filter(array, function(value){
4354 return !_.contains(rest, value);
4358 // Zip together multiple lists into a single array -- elements that share
4359 // an index go together.
4360 _.zip = function(array) {
4361 if (array == null) return [];
4362 var length = _.max(arguments, 'length').length;
4363 var results = Array(length);
4364 for (var i = 0; i < length; i++) {
4365 results[i] = _.pluck(arguments, i);
4370 // Converts lists into objects. Pass either a single array of `[key, value]`
4371 // pairs, or two parallel arrays of the same length -- one of keys, and one of
4372 // the corresponding values.
4373 _.object = function(list, values) {
4374 if (list == null) return {};
4376 for (var i = 0, length = list.length; i < length; i++) {
4378 result[list[i]] = values[i];
4380 result[list[i][0]] = list[i][1];
4386 // Return the position of the first occurrence of an item in an array,
4387 // or -1 if the item is not included in the array.
4388 // If the array is large and already in sort order, pass `true`
4389 // for **isSorted** to use binary search.
4390 _.indexOf = function(array, item, isSorted) {
4391 if (array == null) return -1;
4392 var i = 0, length = array.length;
4394 if (typeof isSorted == 'number') {
4395 i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
4397 i = _.sortedIndex(array, item);
4398 return array[i] === item ? i : -1;
4401 for (; i < length; i++) if (array[i] === item) return i;
4405 _.lastIndexOf = function(array, item, from) {
4406 if (array == null) return -1;
4407 var idx = array.length;
4408 if (typeof from == 'number') {
4409 idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
4411 while (--idx >= 0) if (array[idx] === item) return idx;
4415 // Generate an integer Array containing an arithmetic progression. A port of
4416 // the native Python `range()` function. See
4417 // [the Python documentation](http://docs.python.org/library/functions.html#range).
4418 _.range = function(start, stop, step) {
4419 if (arguments.length <= 1) {
4425 var length = Math.max(Math.ceil((stop - start) / step), 0);
4426 var range = Array(length);
4428 for (var idx = 0; idx < length; idx++, start += step) {
4435 // Function (ahem) Functions
4436 // ------------------
4438 // Reusable constructor function for prototype setting.
4439 var Ctor = function(){};
4441 // Create a function bound to a given object (assigning `this`, and arguments,
4442 // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
4444 _.bind = function(func, context) {
4446 if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
4447 if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
4448 args = slice.call(arguments, 2);
4449 bound = function() {
4450 if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
4451 Ctor.prototype = func.prototype;
4452 var self = new Ctor;
4453 Ctor.prototype = null;
4454 var result = func.apply(self, args.concat(slice.call(arguments)));
4455 if (_.isObject(result)) return result;
4461 // Partially apply a function by creating a version that has had some of its
4462 // arguments pre-filled, without changing its dynamic `this` context. _ acts
4463 // as a placeholder, allowing any combination of arguments to be pre-filled.
4464 _.partial = function(func) {
4465 var boundArgs = slice.call(arguments, 1);
4468 var args = boundArgs.slice();
4469 for (var i = 0, length = args.length; i < length; i++) {
4470 if (args[i] === _) args[i] = arguments[position++];
4472 while (position < arguments.length) args.push(arguments[position++]);
4473 return func.apply(this, args);
4477 // Bind a number of an object's methods to that object. Remaining arguments
4478 // are the method names to be bound. Useful for ensuring that all callbacks
4479 // defined on an object belong to it.
4480 _.bindAll = function(obj) {
4481 var i, length = arguments.length, key;
4482 if (length <= 1) throw new Error('bindAll must be passed function names');
4483 for (i = 1; i < length; i++) {
4485 obj[key] = _.bind(obj[key], obj);
4490 // Memoize an expensive function by storing its results.
4491 _.memoize = function(func, hasher) {
4492 var memoize = function(key) {
4493 var cache = memoize.cache;
4494 var address = hasher ? hasher.apply(this, arguments) : key;
4495 if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
4496 return cache[address];
4502 // Delays a function for the given number of milliseconds, and then calls
4503 // it with the arguments supplied.
4504 _.delay = function(func, wait) {
4505 var args = slice.call(arguments, 2);
4506 return setTimeout(function(){
4507 return func.apply(null, args);
4511 // Defers a function, scheduling it to run after the current call stack has
4513 _.defer = function(func) {
4514 return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
4517 // Returns a function, that, when invoked, will only be triggered at most once
4518 // during a given window of time. Normally, the throttled function will run
4519 // as much as it can, without ever going more than once per `wait` duration;
4520 // but if you'd like to disable the execution on the leading edge, pass
4521 // `{leading: false}`. To disable execution on the trailing edge, ditto.
4522 _.throttle = function(func, wait, options) {
4523 var context, args, result;
4526 if (!options) options = {};
4527 var later = function() {
4528 previous = options.leading === false ? 0 : _.now();
4530 result = func.apply(context, args);
4531 if (!timeout) context = args = null;
4535 if (!previous && options.leading === false) previous = now;
4536 var remaining = wait - (now - previous);
4539 if (remaining <= 0 || remaining > wait) {
4540 clearTimeout(timeout);
4543 result = func.apply(context, args);
4544 if (!timeout) context = args = null;
4545 } else if (!timeout && options.trailing !== false) {
4546 timeout = setTimeout(later, remaining);
4552 // Returns a function, that, as long as it continues to be invoked, will not
4553 // be triggered. The function will be called after it stops being called for
4554 // N milliseconds. If `immediate` is passed, trigger the function on the
4555 // leading edge, instead of the trailing.
4556 _.debounce = function(func, wait, immediate) {
4557 var timeout, args, context, timestamp, result;
4559 var later = function() {
4560 var last = _.now() - timestamp;
4562 if (last < wait && last > 0) {
4563 timeout = setTimeout(later, wait - last);
4567 result = func.apply(context, args);
4568 if (!timeout) context = args = null;
4576 timestamp = _.now();
4577 var callNow = immediate && !timeout;
4578 if (!timeout) timeout = setTimeout(later, wait);
4580 result = func.apply(context, args);
4581 context = args = null;
4588 // Returns the first function passed as an argument to the second,
4589 // allowing you to adjust arguments, run code before and after, and
4590 // conditionally execute the original function.
4591 _.wrap = function(func, wrapper) {
4592 return _.partial(wrapper, func);
4595 // Returns a negated version of the passed-in predicate.
4596 _.negate = function(predicate) {
4598 return !predicate.apply(this, arguments);
4602 // Returns a function that is the composition of a list of functions, each
4603 // consuming the return value of the function that follows.
4604 _.compose = function() {
4605 var args = arguments;
4606 var start = args.length - 1;
4609 var result = args[start].apply(this, arguments);
4610 while (i--) result = args[i].call(this, result);
4615 // Returns a function that will only be executed after being called N times.
4616 _.after = function(times, func) {
4619 return func.apply(this, arguments);
4624 // Returns a function that will only be executed before being called N times.
4625 _.before = function(times, func) {
4629 memo = func.apply(this, arguments);
4637 // Returns a function that will be executed at most one time, no matter how
4638 // often you call it. Useful for lazy initialization.
4639 _.once = _.partial(_.before, 2);
4644 // Retrieve the names of an object's properties.
4645 // Delegates to **ECMAScript 5**'s native `Object.keys`
4646 _.keys = function(obj) {
4647 if (!_.isObject(obj)) return [];
4648 if (nativeKeys) return nativeKeys(obj);
4650 for (var key in obj) if (_.has(obj, key)) keys.push(key);
4654 // Retrieve the values of an object's properties.
4655 _.values = function(obj) {
4656 var keys = _.keys(obj);
4657 var length = keys.length;
4658 var values = Array(length);
4659 for (var i = 0; i < length; i++) {
4660 values[i] = obj[keys[i]];
4665 // Convert an object into a list of `[key, value]` pairs.
4666 _.pairs = function(obj) {
4667 var keys = _.keys(obj);
4668 var length = keys.length;
4669 var pairs = Array(length);
4670 for (var i = 0; i < length; i++) {
4671 pairs[i] = [keys[i], obj[keys[i]]];
4676 // Invert the keys and values of an object. The values must be serializable.
4677 _.invert = function(obj) {
4679 var keys = _.keys(obj);
4680 for (var i = 0, length = keys.length; i < length; i++) {
4681 result[obj[keys[i]]] = keys[i];
4686 // Return a sorted list of the function names available on the object.
4687 // Aliased as `methods`
4688 _.functions = _.methods = function(obj) {
4690 for (var key in obj) {
4691 if (_.isFunction(obj[key])) names.push(key);
4693 return names.sort();
4696 // Extend a given object with all the properties in passed-in object(s).
4697 _.extend = function(obj) {
4698 if (!_.isObject(obj)) return obj;
4700 for (var i = 1, length = arguments.length; i < length; i++) {
4701 source = arguments[i];
4702 for (prop in source) {
4703 if (hasOwnProperty.call(source, prop)) {
4704 obj[prop] = source[prop];
4711 // Return a copy of the object only containing the whitelisted properties.
4712 _.pick = function(obj, iteratee, context) {
4713 var result = {}, key;
4714 if (obj == null) return result;
4715 if (_.isFunction(iteratee)) {
4716 iteratee = createCallback(iteratee, context);
4718 var value = obj[key];
4719 if (iteratee(value, key, obj)) result[key] = value;
4722 var keys = concat.apply([], slice.call(arguments, 1));
4723 obj = new Object(obj);
4724 for (var i = 0, length = keys.length; i < length; i++) {
4726 if (key in obj) result[key] = obj[key];
4732 // Return a copy of the object without the blacklisted properties.
4733 _.omit = function(obj, iteratee, context) {
4734 if (_.isFunction(iteratee)) {
4735 iteratee = _.negate(iteratee);
4737 var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
4738 iteratee = function(value, key) {
4739 return !_.contains(keys, key);
4742 return _.pick(obj, iteratee, context);
4745 // Fill in a given object with default properties.
4746 _.defaults = function(obj) {
4747 if (!_.isObject(obj)) return obj;
4748 for (var i = 1, length = arguments.length; i < length; i++) {
4749 var source = arguments[i];
4750 for (var prop in source) {
4751 if (obj[prop] === void 0) obj[prop] = source[prop];
4757 // Create a (shallow-cloned) duplicate of an object.
4758 _.clone = function(obj) {
4759 if (!_.isObject(obj)) return obj;
4760 return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
4763 // Invokes interceptor with the obj, and then returns obj.
4764 // The primary purpose of this method is to "tap into" a method chain, in
4765 // order to perform operations on intermediate results within the chain.
4766 _.tap = function(obj, interceptor) {
4771 // Internal recursive comparison function for `isEqual`.
4772 var eq = function(a, b, aStack, bStack) {
4773 // Identical objects are equal. `0 === -0`, but they aren't identical.
4774 // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
4775 if (a === b) return a !== 0 || 1 / a === 1 / b;
4776 // A strict comparison is necessary because `null == undefined`.
4777 if (a == null || b == null) return a === b;
4778 // Unwrap any wrapped objects.
4779 if (a instanceof _) a = a._wrapped;
4780 if (b instanceof _) b = b._wrapped;
4781 // Compare `[[Class]]` names.
4782 var className = toString.call(a);
4783 if (className !== toString.call(b)) return false;
4784 switch (className) {
4785 // Strings, numbers, regular expressions, dates, and booleans are compared by value.
4786 case '[object RegExp]':
4787 // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
4788 case '[object String]':
4789 // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
4790 // equivalent to `new String("5")`.
4791 return '' + a === '' + b;
4792 case '[object Number]':
4793 // `NaN`s are equivalent, but non-reflexive.
4794 // Object(NaN) is equivalent to NaN
4795 if (+a !== +a) return +b !== +b;
4796 // An `egal` comparison is performed for other numeric values.
4797 return +a === 0 ? 1 / +a === 1 / b : +a === +b;
4798 case '[object Date]':
4799 case '[object Boolean]':
4800 // Coerce dates and booleans to numeric primitive values. Dates are compared by their
4801 // millisecond representations. Note that invalid dates with millisecond representations
4802 // of `NaN` are not equivalent.
4805 if (typeof a != 'object' || typeof b != 'object') return false;
4806 // Assume equality for cyclic structures. The algorithm for detecting cyclic
4807 // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
4808 var length = aStack.length;
4810 // Linear search. Performance is inversely proportional to the number of
4811 // unique nested structures.
4812 if (aStack[length] === a) return bStack[length] === b;
4814 // Objects with different constructors are not equivalent, but `Object`s
4815 // from different frames are.
4816 var aCtor = a.constructor, bCtor = b.constructor;
4819 // Handle Object.create(x) cases
4820 'constructor' in a && 'constructor' in b &&
4821 !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
4822 _.isFunction(bCtor) && bCtor instanceof bCtor)
4826 // Add the first object to the stack of traversed objects.
4830 // Recursively compare objects and arrays.
4831 if (className === '[object Array]') {
4832 // Compare array lengths to determine if a deep comparison is necessary.
4834 result = size === b.length;
4836 // Deep compare the contents, ignoring non-numeric properties.
4838 if (!(result = eq(a[size], b[size], aStack, bStack))) break;
4842 // Deep compare objects.
4843 var keys = _.keys(a), key;
4845 // Ensure that both objects contain the same number of properties before comparing deep equality.
4846 result = _.keys(b).length === size;
4849 // Deep compare each member
4851 if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
4855 // Remove the first object from the stack of traversed objects.
4861 // Perform a deep comparison to check if two objects are equal.
4862 _.isEqual = function(a, b) {
4863 return eq(a, b, [], []);
4866 // Is a given array, string, or object empty?
4867 // An "empty" object has no enumerable own-properties.
4868 _.isEmpty = function(obj) {
4869 if (obj == null) return true;
4870 if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
4871 for (var key in obj) if (_.has(obj, key)) return false;
4875 // Is a given value a DOM element?
4876 _.isElement = function(obj) {
4877 return !!(obj && obj.nodeType === 1);
4880 // Is a given value an array?
4881 // Delegates to ECMA5's native Array.isArray
4882 _.isArray = nativeIsArray || function(obj) {
4883 return toString.call(obj) === '[object Array]';
4886 // Is a given variable an object?
4887 _.isObject = function(obj) {
4888 var type = typeof obj;
4889 return type === 'function' || type === 'object' && !!obj;
4892 // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
4893 _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
4894 _['is' + name] = function(obj) {
4895 return toString.call(obj) === '[object ' + name + ']';
4899 // Define a fallback version of the method in browsers (ahem, IE), where
4900 // there isn't any inspectable "Arguments" type.
4901 if (!_.isArguments(arguments)) {
4902 _.isArguments = function(obj) {
4903 return _.has(obj, 'callee');
4907 // Optimize `isFunction` if appropriate. Work around an IE 11 bug.
4908 if (typeof /./ !== 'function') {
4909 _.isFunction = function(obj) {
4910 return typeof obj == 'function' || false;
4914 // Is a given object a finite number?
4915 _.isFinite = function(obj) {
4916 return isFinite(obj) && !isNaN(parseFloat(obj));
4919 // Is the given value `NaN`? (NaN is the only number which does not equal itself).
4920 _.isNaN = function(obj) {
4921 return _.isNumber(obj) && obj !== +obj;
4924 // Is a given value a boolean?
4925 _.isBoolean = function(obj) {
4926 return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
4929 // Is a given value equal to null?
4930 _.isNull = function(obj) {
4931 return obj === null;
4934 // Is a given variable undefined?
4935 _.isUndefined = function(obj) {
4936 return obj === void 0;
4939 // Shortcut function for checking if an object has a given property directly
4940 // on itself (in other words, not on a prototype).
4941 _.has = function(obj, key) {
4942 return obj != null && hasOwnProperty.call(obj, key);
4945 // Utility Functions
4946 // -----------------
4948 // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
4949 // previous owner. Returns a reference to the Underscore object.
4950 _.noConflict = function() {
4951 root._ = previousUnderscore;
4955 // Keep the identity function around for default iteratees.
4956 _.identity = function(value) {
4960 _.constant = function(value) {
4966 _.noop = function(){};
4968 _.property = function(key) {
4969 return function(obj) {
4974 // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
4975 _.matches = function(attrs) {
4976 var pairs = _.pairs(attrs), length = pairs.length;
4977 return function(obj) {
4978 if (obj == null) return !length;
4979 obj = new Object(obj);
4980 for (var i = 0; i < length; i++) {
4981 var pair = pairs[i], key = pair[0];
4982 if (pair[1] !== obj[key] || !(key in obj)) return false;
4988 // Run a function **n** times.
4989 _.times = function(n, iteratee, context) {
4990 var accum = Array(Math.max(0, n));
4991 iteratee = createCallback(iteratee, context, 1);
4992 for (var i = 0; i < n; i++) accum[i] = iteratee(i);
4996 // Return a random integer between min and max (inclusive).
4997 _.random = function(min, max) {
5002 return min + Math.floor(Math.random() * (max - min + 1));
5005 // A (possibly faster) way to get the current timestamp as an integer.
5006 _.now = Date.now || function() {
5007 return new Date().getTime();
5010 // List of HTML entities for escaping.
5019 var unescapeMap = _.invert(escapeMap);
5021 // Functions for escaping and unescaping strings to/from HTML interpolation.
5022 var createEscaper = function(map) {
5023 var escaper = function(match) {
5026 // Regexes for identifying a key that needs to be escaped
5027 var source = '(?:' + _.keys(map).join('|') + ')';
5028 var testRegexp = RegExp(source);
5029 var replaceRegexp = RegExp(source, 'g');
5030 return function(string) {
5031 string = string == null ? '' : '' + string;
5032 return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
5035 _.escape = createEscaper(escapeMap);
5036 _.unescape = createEscaper(unescapeMap);
5038 // If the value of the named `property` is a function then invoke it with the
5039 // `object` as context; otherwise, return it.
5040 _.result = function(object, property) {
5041 if (object == null) return void 0;
5042 var value = object[property];
5043 return _.isFunction(value) ? object[property]() : value;
5046 // Generate a unique integer id (unique within the entire client session).
5047 // Useful for temporary DOM ids.
5049 _.uniqueId = function(prefix) {
5050 var id = ++idCounter + '';
5051 return prefix ? prefix + id : id;
5054 // By default, Underscore uses ERB-style template delimiters, change the
5055 // following template settings to use alternative delimiters.
5056 _.templateSettings = {
5057 evaluate : /<%([\s\S]+?)%>/g,
5058 interpolate : /<%=([\s\S]+?)%>/g,
5059 escape : /<%-([\s\S]+?)%>/g
5062 // When customizing `templateSettings`, if you don't want to define an
5063 // interpolation, evaluation or escaping regex, we need one that is
5064 // guaranteed not to match.
5065 var noMatch = /(.)^/;
5067 // Certain characters need to be escaped so that they can be put into a
5078 var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
5080 var escapeChar = function(match) {
5081 return '\\' + escapes[match];
5084 // JavaScript micro-templating, similar to John Resig's implementation.
5085 // Underscore templating handles arbitrary delimiters, preserves whitespace,
5086 // and correctly escapes quotes within interpolated code.
5087 // NB: `oldSettings` only exists for backwards compatibility.
5088 _.template = function(text, settings, oldSettings) {
5089 if (!settings && oldSettings) settings = oldSettings;
5090 settings = _.defaults({}, settings, _.templateSettings);
5092 // Combine delimiters into one regular expression via alternation.
5093 var matcher = RegExp([
5094 (settings.escape || noMatch).source,
5095 (settings.interpolate || noMatch).source,
5096 (settings.evaluate || noMatch).source
5097 ].join('|') + '|$', 'g');
5099 // Compile the template source, escaping string literals appropriately.
5101 var source = "__p+='";
5102 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
5103 source += text.slice(index, offset).replace(escaper, escapeChar);
5104 index = offset + match.length;
5107 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
5108 } else if (interpolate) {
5109 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
5110 } else if (evaluate) {
5111 source += "';\n" + evaluate + "\n__p+='";
5114 // Adobe VMs need the match returned to produce the correct offest.
5119 // If a variable is not specified, place data values in local scope.
5120 if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
5122 source = "var __t,__p='',__j=Array.prototype.join," +
5123 "print=function(){__p+=__j.call(arguments,'');};\n" +
5124 source + 'return __p;\n';
5127 var render = new Function(settings.variable || 'obj', '_', source);
5133 var template = function(data) {
5134 return render.call(this, data, _);
5137 // Provide the compiled source as a convenience for precompilation.
5138 var argument = settings.variable || 'obj';
5139 template.source = 'function(' + argument + '){\n' + source + '}';
5144 // Add a "chain" function. Start chaining a wrapped Underscore object.
5145 _.chain = function(obj) {
5146 var instance = _(obj);
5147 instance._chain = true;
5153 // If Underscore is called as a function, it returns a wrapped object that
5154 // can be used OO-style. This wrapper holds altered versions of all the
5155 // underscore functions. Wrapped objects may be chained.
5157 // Helper function to continue chaining intermediate results.
5158 var result = function(obj) {
5159 return this._chain ? _(obj).chain() : obj;
5162 // Add your own custom functions to the Underscore object.
5163 _.mixin = function(obj) {
5164 _.each(_.functions(obj), function(name) {
5165 var func = _[name] = obj[name];
5166 _.prototype[name] = function() {
5167 var args = [this._wrapped];
5168 push.apply(args, arguments);
5169 return result.call(this, func.apply(_, args));
5174 // Add all of the Underscore functions to the wrapper object.
5177 // Add all mutator Array functions to the wrapper.
5178 _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
5179 var method = ArrayProto[name];
5180 _.prototype[name] = function() {
5181 var obj = this._wrapped;
5182 method.apply(obj, arguments);
5183 if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
5184 return result.call(this, obj);
5188 // Add all accessor Array functions to the wrapper.
5189 _.each(['concat', 'join', 'slice'], function(name) {
5190 var method = ArrayProto[name];
5191 _.prototype[name] = function() {
5192 return result.call(this, method.apply(this._wrapped, arguments));
5196 // Extracts the result from a wrapped and chained object.
5197 _.prototype.value = function() {
5198 return this._wrapped;
5201 // AMD registration happens at the end for compatibility with AMD loaders
5202 // that may not enforce next-turn semantics on modules. Even though general
5203 // practice for AMD registration is to be anonymous, underscore registers
5204 // as a named module because, like jQuery, it is a base library that is
5205 // popular enough to be bundled in a third party lib, but not be part of
5206 // an AMD load request. Those cases could generate an error when an
5207 // anonymous define() is called outside of a loader request.
5208 if (typeof define === 'function' && define.amd) {
5209 define('underscore', [], function() {
5215 },{}],60:[function(require,module,exports){
5218 _ = require("underscore");
5220 module.exports = function(seqs) {
5222 seqs = seqs.map(function(el) {
5223 return el.get("seq");
5225 occs = new Array(seqs.length);
5226 _.each(seqs, function(el, i) {
5227 return _.each(el, function(char, pos) {
5228 if (occs[pos] == null) {
5231 if (occs[pos][char] == null) {
5232 occs[pos][char] = 0;
5234 return occs[pos][char]++;
5237 return _.reduce(occs, function(memo, occ) {
5240 return memo += _.max(keys, function(key) {
5248 },{"underscore":59}],61:[function(require,module,exports){
5251 module.exports = identitiyCalc = function(seqs, consensus) {
5252 if (consensus === void 0) {
5253 console.warn("bug on consenus calc");
5256 return seqs.each(function(seqObj) {
5257 var i, matches, seq, total, _i, _ref;
5258 seq = seqObj.get("seq");
5261 for (i = _i = 0, _ref = seq.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
5262 if (seq[i] !== "-" && consensus[i] !== "-") {
5264 if (seq[i] === consensus[i]) {
5269 return seqObj.set("identity", matches / total);
5275 },{}],62:[function(require,module,exports){
5276 module.exports.consensus = require("./ConsensusCalc");
5280 },{"./ConsensusCalc":60}],63:[function(require,module,exports){
5281 var Colorator, Model;
5283 Model = require("backbone-thin").Model;
5285 module.exports = Colorator = Model.extend({
5288 colorBackground: true,
5289 showLowerCase: true,
5296 },{"backbone-thin":5}],64:[function(require,module,exports){
5297 var Columns, Model, consenus, _;
5299 Model = require("backbone-thin").Model;
5301 consenus = require("../algo/ConsensusCalc");
5303 _ = require("underscore");
5305 module.exports = Columns = Model.extend({
5309 initialize: function() {
5310 if (this.get("hidden") == null) {
5311 return this.set("hidden", []);
5314 calcHiddenColumns: function(n) {
5315 var hidden, i, newX, _i, _len;
5316 hidden = this.get("hidden");
5318 for (_i = 0, _len = hidden.length; _i < _len; _i++) {
5326 _calcConservationPre: function(seqs) {
5327 var cons, matches, nMax, total;
5328 console.log(seqs.length);
5329 if (seqs.length > 1000) {
5332 cons = consenus(seqs);
5333 seqs = seqs.map(function(el) {
5334 return el.get("seq");
5336 nMax = (_.max(seqs, function(el) {
5339 total = new Array(nMax);
5340 matches = new Array(nMax);
5341 _.each(seqs, function(el, i) {
5342 return _.each(el, function(char, pos) {
5343 total[pos] = total[pos] + 1 || 1;
5344 if (cons[pos] === char) {
5345 return matches[pos] = matches[pos] + 1 || 1;
5349 return [matches, total, nMax];
5351 calcConservation: function(seqs) {
5352 if (this.attributes.scaling === "exp") {
5353 return this.calcConservationExp(seqs);
5354 } else if (this.attributes.scaling === "log") {
5355 return this.calcConservationLog(seqs);
5356 } else if (this.attributes.scaling === "lin") {
5357 return this.calcConservationLin(seqs);
5360 calcConservationLin: function(seqs) {
5361 var i, matches, nMax, total, _i, _ref, _ref1;
5362 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5363 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5364 matches[i] = matches[i] / total[i];
5366 this.set("conserv", matches);
5369 calcConservationLog: function(seqs) {
5370 var i, matches, nMax, total, _i, _ref, _ref1;
5371 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5372 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5373 matches[i] = Math.log(matches[i] + 1) / Math.log(total[i] + 1);
5375 this.set("conserv", matches);
5378 calcConservationExp: function(seqs) {
5379 var i, matches, nMax, total, _i, _ref, _ref1;
5380 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5381 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5382 matches[i] = Math.exp(matches[i] + 1) / Math.exp(total[i] + 1);
5384 this.set("conserv", matches);
5391 },{"../algo/ConsensusCalc":60,"backbone-thin":5,"underscore":59}],65:[function(require,module,exports){
5394 Model = require("backbone-thin").Model;
5396 module.exports = Config = Model.extend({
5398 registerMouseHover: false,
5399 registerMouseClicks: true,
5400 importProxy: "https://cors-anywhere.herokuapp.com/",
5407 },{"backbone-thin":5}],66:[function(require,module,exports){
5408 var Consenus, Model, consenusCalc;
5410 Model = require("backbone-thin").Model;
5412 consenusCalc = require("../algo/ConsensusCalc");
5414 module.exports = Consenus = Model.extend({
5418 getConsensus: function(seqs) {
5420 if (seqs.length > 1000) {
5423 cons = consenusCalc(seqs);
5424 this.set("consenus", cons);
5431 },{"../algo/ConsensusCalc":60,"backbone-thin":5}],67:[function(require,module,exports){
5432 var ColumnSelection, Model, PosSelection, RowSelection, Selection, _;
5434 _ = require("underscore");
5436 Model = require("backbone-thin").Model;
5438 Selection = Model.extend({
5444 RowSelection = Selection.extend({
5445 defaults: _.extend({}, Selection.prototype.defaults, {
5449 inRow: function(seqId) {
5450 return seqId === this.get("seqId");
5452 inColumn: function(rowPos) {
5455 getLength: function() {
5460 ColumnSelection = Selection.extend({
5461 defaults: _.extend({}, Selection.prototype.defaults, {
5469 inColumn: function(rowPos) {
5470 return xStart <= rowPos && rowPos <= xEnd;
5472 getLength: function() {
5473 return xEnd - xStart;
5477 PosSelection = RowSelection.extend(_.extend({}, _.pick(ColumnSelection, "inColumn"), _.pick(ColumnSelection, "getLength"), {
5478 defaults: _.extend({}, ColumnSelection.prototype.defaults, RowSelection.prototype.defaults, {
5483 module.exports.sel = Selection;
5485 module.exports.possel = PosSelection;
5487 module.exports.rowsel = RowSelection;
5489 module.exports.columnsel = ColumnSelection;
5493 },{"backbone-thin":5,"underscore":59}],68:[function(require,module,exports){
5494 var Collection, SelectionManager, sel, _;
5496 sel = require("./Selection");
5498 _ = require("underscore");
5500 Collection = require("backbone-thin").Collection;
5502 module.exports = SelectionManager = Collection.extend({
5504 initialize: function(data, opts) {
5506 this.listenTo(this.g, "residue:click", function(e) {
5507 return this._handleE(e.evt, new sel.possel({
5513 this.listenTo(this.g, "row:click", function(e) {
5514 return this._handleE(e.evt, new sel.rowsel({
5520 return this.listenTo(this.g, "column:click", function(e) {
5521 return this._handleE(e.evt, new sel.columnsel({
5523 xEnd: e.rowPos + e.stepSize - 1
5527 getSelForRow: function(seqId) {
5528 return this.filter(function(el) {
5529 return el.inRow(seqId);
5532 getSelForColumns: function(rowPos) {
5533 return this.filter(function(el) {
5534 return el.inColumn(rowPos);
5537 getBlocksForRow: function(seqId, maxLen) {
5538 var blocks, seli, selis, _i, _j, _k, _len, _ref, _ref1, _results, _results1;
5539 selis = this.filter(function(el) {
5540 return el.inRow(seqId);
5543 for (_i = 0, _len = selis.length; _i < _len; _i++) {
5545 if (seli.attributes.type === "row") {
5546 blocks = (function() {
5548 for (var _j = 0; 0 <= maxLen ? _j <= maxLen : _j >= maxLen; 0 <= maxLen ? _j++ : _j--){ _results.push(_j); }
5553 blocks = blocks.concat((function() {
5555 for (var _k = _ref = seli.attributes.xStart, _ref1 = seli.attributes.xEnd; _ref <= _ref1 ? _k <= _ref1 : _k >= _ref1; _ref <= _ref1 ? _k++ : _k--){ _results1.push(_k); }
5562 getAllColumnBlocks: function(conf) {
5563 var blocks, filtered, maxLen, seli, withPos, _i, _j, _len, _ref, _ref1, _results;
5564 maxLen = conf.maxLen;
5565 withPos = conf.withPos;
5568 filtered = this.filter(function(el) {
5569 return el.get('xStart') != null;
5572 filtered = this.filter(function(el) {
5573 return el.get('type') === "column";
5576 for (_i = 0, _len = filtered.length; _i < _len; _i++) {
5577 seli = filtered[_i];
5578 blocks = blocks.concat((function() {
5580 for (var _j = _ref = seli.attributes.xStart, _ref1 = seli.attributes.xEnd; _ref <= _ref1 ? _j <= _ref1 : _j >= _ref1; _ref <= _ref1 ? _j++ : _j--){ _results.push(_j); }
5584 blocks = _.uniq(blocks);
5587 invertRow: function(rows) {
5588 var el, inverted, s, selRows, _i, _len;
5589 selRows = this.where({
5592 selRows = _.map(selRows, function(el) {
5593 return el.attributes.seqId;
5595 inverted = _.filter(rows, function(el) {
5596 if (selRows.indexOf(el) >= 0) {
5602 for (_i = 0, _len = inverted.length; _i < _len; _i++) {
5604 s.push(new sel.rowsel({
5609 return this.reset(s);
5611 invertCol: function(columns) {
5612 var el, inverted, s, selColumns, xEnd, xStart, _i, _len;
5613 selColumns = this.where({
5616 selColumns = _.reduce(selColumns, function(memo, el) {
5617 var _i, _ref, _ref1, _results;
5618 return memo.concat((function() {
5620 for (var _i = _ref = el.attributes.xStart, _ref1 = el.attributes.xEnd; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; _ref <= _ref1 ? _i++ : _i--){ _results.push(_i); }
5624 inverted = _.filter(columns, function(el) {
5625 if (selColumns.indexOf(el) >= 0) {
5630 if (inverted.length === 0) {
5634 console.log(inverted);
5635 xStart = xEnd = inverted[0];
5636 for (_i = 0, _len = inverted.length; _i < _len; _i++) {
5638 if (xEnd + 1 === el) {
5641 s.push(new sel.columnsel({
5648 if (xStart !== xEnd) {
5649 s.push(new sel.columnsel({
5651 xEnd: inverted[inverted.length - 1]
5654 return this.reset(s);
5656 _handleE: function(e, selection) {
5657 if (e.ctrlKey || e.metaKey) {
5658 return this.add(selection);
5660 return this.reset([selection]);
5663 _reduceColumns: function() {
5664 return this.each(function(el, index, arr) {
5665 var cols, left, lefts, right, rights, xEnd, xStart, _i, _j, _len, _len1;
5666 cols = _.filter(arr, function(el) {
5667 return el.get('type') === 'column';
5669 xStart = el.get('xStart');
5670 xEnd = el.get('xEnd');
5671 lefts = _.filter(cols, function(el) {
5672 return el.get('xEnd') === (xStart - 1);
5674 for (_i = 0, _len = lefts.length; _i < _len; _i++) {
5676 left.set('xEnd', xStart);
5678 rights = _.filter(cols, function(el) {
5679 return el.get('xStart') === (xEnd + 1);
5681 for (_j = 0, _len1 = rights.length; _j < _len1; _j++) {
5683 right.set('xStart', xEnd);
5685 if (lefts.length > 0 || rights.length > 0) {
5686 console.log("removed el");
5687 return el.collection.remove(el);
5695 },{"./Selection":67,"backbone-thin":5,"underscore":59}],69:[function(require,module,exports){
5696 var Model, Visibility;
5698 Model = require("backbone-thin").Model;
5700 module.exports = Visibility = Model.extend({
5710 },{"backbone-thin":5}],70:[function(require,module,exports){
5711 var Model, Visibility;
5713 Model = require("backbone-thin").Model;
5715 module.exports = Visibility = Model.extend({
5725 labelPartition: false,
5726 labelCheckbox: false
5732 },{"backbone-thin":5}],71:[function(require,module,exports){
5735 Model = require("backbone-thin").Model;
5737 module.exports = Zoomer = Model.extend({
5738 constructor: function(attributes, options) {
5739 Model.apply(this, arguments);
5744 alignmentWidth: "auto",
5745 alignmentHeight: 195,
5752 labelFontsize: "13px",
5753 labelLineHeight: "13px",
5754 markerFontsize: "10px",
5757 residueFont: "13px mono",
5758 canvasEventScale: 1,
5761 menuFontsize: "20px",
5762 menuItemFontsize: "18px",
5763 menuItemLineHeight: "18px",
5764 menuMarginLeft: "5px",
5765 menuPadding: "3px 5px 3px 5px",
5766 _alignmentScrollLeft: 0,
5767 _alignmentScrollTop: 0
5769 getAlignmentWidth: function(n) {
5770 if (this.get("alignmentWidth") === "auto") {
5771 return this.get("columnWidth") * n;
5773 return this.get("alignmentWidth");
5776 setLeftOffset: function(n) {
5778 val = (n - 1) * this.get('columnWidth');
5779 val = Math.max(0, val);
5780 return this.set("_alignmentScrollLeft", val);
5782 setTopOffset: function(n) {
5784 val = (n - 1) * this.get('rowHeight');
5785 val = Math.max(0, val);
5786 return this.set("_alignmentScrollTop", val);
5788 getLabelWidth: function() {
5791 if (this.g.vis.get("labels")) {
5792 paddingLeft += this.get("labelWidth");
5794 if (this.g.vis.get("metacell")) {
5795 paddingLeft += this.get("metaWidth");
5799 _adjustWidth: function(el, model) {
5800 var calcWidth, maxWidth, parentWidth, val;
5801 if ((el.parentNode != null) && el.parentNode.offsetWidth !== 0) {
5802 parentWidth = el.parentNode.offsetWidth;
5804 parentWidth = document.body.clientWidth - 35;
5806 maxWidth = parentWidth - this.getLabelWidth();
5807 calcWidth = this.getAlignmentWidth(model.getMaxLength() - this.g.columns.get('hidden').length);
5808 val = Math.min(maxWidth, calcWidth);
5809 val = Math.floor(val / this.get("columnWidth")) * this.get("columnWidth");
5810 return this.set("alignmentWidth", val);
5812 _checkScrolling: function(scrollObj, opts) {
5813 var xScroll, yScroll;
5814 xScroll = scrollObj[0];
5815 yScroll = scrollObj[1];
5816 this.set("_alignmentScrollLeft", xScroll, opts);
5817 return this.set("_alignmentScrollTop", yScroll, opts);
5823 },{"backbone-thin":5}],72:[function(require,module,exports){
5824 module.exports.msa = require("./msa");
5826 module.exports.model = require("./model");
5828 module.exports.algo = require("./algo");
5830 module.exports.menu = require("./menu");
5832 module.exports.utils = require("./utils");
5834 module.exports.selection = require("./g/selection/Selection");
5836 module.exports.view = require("backbone-viewj");
5838 module.exports.boneView = require("backbone-childs");
5840 module.exports._ = require('underscore');
5842 module.exports.$ = require('jbone');
5844 module.exports.version = "0.1.0";
5848 },{"./algo":62,"./g/selection/Selection":67,"./menu":74,"./model":89,"./msa":90,"./utils":92,"backbone-childs":3,"backbone-viewj":10,"jbone":50,"underscore":59}],73:[function(require,module,exports){
5849 var ColorMenu, ExportMenu, ExtraMenu, FilterMenu, HelpMenu, ImportMenu, MenuView, OrderingMenu, SelectionMenu, VisMenu, boneView;
5851 boneView = require("backbone-childs");
5853 ImportMenu = require("./views/ImportMenu");
5855 FilterMenu = require("./views/FilterMenu");
5857 SelectionMenu = require("./views/SelectionMenu");
5859 VisMenu = require("./views/VisMenu");
5861 ColorMenu = require("./views/ColorMenu");
5863 OrderingMenu = require("./views/OrderingMenu");
5865 ExtraMenu = require("./views/ExtraMenu");
5867 ExportMenu = require("./views/ExportMenu");
5869 HelpMenu = require("./views/HelpMenu");
5871 module.exports = MenuView = boneView.extend({
5872 initialize: function(data) {
5873 this.msa = data.msa;
5874 this.addView("10_import", new ImportMenu({
5875 model: this.msa.seqs,
5878 this.addView("20_filter", new FilterMenu({
5879 model: this.msa.seqs,
5882 this.addView("30_selection", new SelectionMenu({
5883 model: this.msa.seqs,
5886 this.addView("40_vis", new VisMenu({
5887 model: this.msa.seqs,
5890 this.addView("50_color", new ColorMenu({
5891 model: this.msa.seqs,
5894 this.addView("60_ordering", new OrderingMenu({
5895 model: this.msa.seqs,
5898 this.addView("70_extra", new ExtraMenu({
5899 model: this.msa.seqs,
5902 this.addView("80_export", new ExportMenu({
5903 model: this.msa.seqs,
5907 return this.addView("90_help", new HelpMenu({
5911 render: function() {
5912 this.renderSubviews();
5913 this.el.setAttribute("class", "biojs_msa_menubar");
5914 return this.el.appendChild(document.createElement("p"));
5920 },{"./views/ColorMenu":76,"./views/ExportMenu":77,"./views/ExtraMenu":78,"./views/FilterMenu":79,"./views/HelpMenu":80,"./views/ImportMenu":81,"./views/OrderingMenu":82,"./views/SelectionMenu":83,"./views/VisMenu":84,"backbone-childs":3}],74:[function(require,module,exports){
5921 module.exports.defaultmenu = require("./defaultmenu");
5923 module.exports.menubuilder = require("./menubuilder");
5927 },{"./defaultmenu":73,"./menubuilder":75}],75:[function(require,module,exports){
5928 var BMath, MenuBuilder, jbone, view;
5930 BMath = require("../utils/bmath");
5932 jbone = require("jbone");
5934 view = require("backbone-viewj");
5936 module.exports = MenuBuilder = view.extend({
5937 setName: function(name) {
5939 return this._nodes = [];
5941 addNode: function(label, callback, data) {
5946 if (this._nodes == null) {
5949 return this._nodes.push({
5955 buildDOM: function() {
5956 return this._buildM({
5961 _buildM: function(data) {
5962 var displayedButton, frag, key, li, menu, menuUl, name, node, nodes, style, _i, _len, _ref;
5965 menu = document.createElement("div");
5966 menu.className = "dropdown dropdown-tip";
5967 menu.id = "adrop-" + BMath.uniqueId();
5968 menu.style.display = "none";
5969 menuUl = document.createElement("ul");
5970 menuUl.className = "dropdown-menu";
5971 for (_i = 0, _len = nodes.length; _i < _len; _i++) {
5973 li = document.createElement("li");
5974 li.textContent = node.label;
5978 li.style[key] = style;
5980 li.addEventListener("click", node.callback);
5981 if (this.g != null) {
5982 li.style.lineHeight = this.g.zoomer.get("menuItemLineHeight");
5984 menuUl.appendChild(li);
5986 menu.appendChild(menuUl);
5987 frag = document.createDocumentFragment();
5988 displayedButton = document.createElement("a");
5989 displayedButton.textContent = name;
5990 displayedButton.className = "biojs_msa_menubar_alink";
5991 if (this.g != null) {
5992 menuUl.style.fontSize = this.g.zoomer.get("menuItemFontsize");
5993 displayedButton.style.fontSize = this.g.zoomer.get("menuFontsize");
5994 displayedButton.style.marginLeft = this.g.zoomer.get("menuMarginLeft");
5995 displayedButton.style.padding = this.g.zoomer.get("menuPadding");
5997 jbone(displayedButton).on("click", (function(_this) {
5998 return function(e) {
5999 _this._showMenu(e, menu, displayedButton);
6000 return window.setTimeout(function() {
6001 return jbone(document.body).one("click", function(e) {
6002 console.log("next click");
6003 return menu.style.display = "none";
6008 frag.appendChild(menu);
6009 frag.appendChild(displayedButton);
6012 _showMenu: function(e, menu, target) {
6014 menu.style.display = "block";
6015 menu.style.position = "absolute";
6016 rect = target.getBoundingClientRect();
6017 menu.style.left = rect.left + "px";
6018 return menu.style.top = (rect.top + target.offsetHeight) + "px";
6024 },{"../utils/bmath":91,"backbone-viewj":10,"jbone":50}],76:[function(require,module,exports){
6025 var ColorMenu, MenuBuilder, dom, _;
6027 MenuBuilder = require("../menubuilder");
6029 _ = require("underscore");
6031 dom = require("dom-helper");
6033 module.exports = ColorMenu = MenuBuilder.extend({
6034 initialize: function(data) {
6036 this.el.style.display = "inline-block";
6037 return this.listenTo(this.g.colorscheme, "change", function() {
6038 return this.render();
6041 render: function() {
6042 var colorschemes, menuColor, scheme, text, _i, _len;
6043 menuColor = this.setName("Color scheme");
6044 colorschemes = this.getColorschemes();
6045 for (_i = 0, _len = colorschemes.length; _i < _len; _i++) {
6046 scheme = colorschemes[_i];
6047 this.addScheme(menuColor, scheme);
6049 text = "Background";
6050 if (this.g.colorscheme.get("colorBackground")) {
6051 text = "Hide " + text;
6053 text = "Show " + text;
6055 this.addNode(text, (function(_this) {
6057 return _this.g.colorscheme.set("colorBackground", !_this.g.colorscheme.get("colorBackground"));
6060 this.grey(menuColor);
6061 dom.removeAllChilds(this.el);
6062 this.el.appendChild(this.buildDOM());
6065 addScheme: function(menuColor, scheme) {
6068 current = this.g.colorscheme.get("scheme");
6069 if (current === scheme.id) {
6070 style.backgroundColor = "#77ED80";
6072 return this.addNode(scheme.name, (function(_this) {
6074 return _this.g.colorscheme.set("scheme", scheme.id);
6080 getColorschemes: function() {
6092 name: "Hydrophobicity",
6149 grey: function(menuColor) {
6150 this.addNode("Grey", (function(_this) {
6152 _this.g.colorscheme.set("showLowerCase", false);
6153 return _this.model.each(function(seq) {
6155 residues = seq.get("seq");
6157 _.each(residues, function(el, index) {
6158 if (el === el.toLowerCase()) {
6159 return grey.push(index);
6162 return seq.set("grey", grey);
6166 this.addNode("Grey by threshold", (function(_this) {
6168 var conserv, grey, i, maxLen, threshold, _i, _ref;
6169 threshold = prompt("Enter threshold (in percent)", 20);
6170 threshold = threshold / 100;
6171 maxLen = _this.model.getMaxLength();
6172 conserv = _this.g.columns.get("conserv");
6174 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6175 console.log(conserv[i]);
6176 if (conserv[i] < threshold) {
6180 return _this.model.each(function(seq) {
6181 return seq.set("grey", grey);
6185 this.addNode("Grey selection", (function(_this) {
6188 maxLen = _this.model.getMaxLength();
6189 return _this.model.each(function(seq) {
6191 blocks = _this.g.selcol.getBlocksForRow(seq.get("id"), maxLen);
6192 return seq.set("grey", blocks);
6196 return this.addNode("Reset grey", (function(_this) {
6198 _this.g.colorscheme.set("showLowerCase", true);
6199 return _this.model.each(function(seq) {
6200 return seq.set("grey", []);
6209 },{"../menubuilder":75,"dom-helper":49,"underscore":59}],77:[function(require,module,exports){
6210 var ExportMenu, FastaExporter, MenuBuilder, blobURL, saveAs, _;
6212 MenuBuilder = require("../menubuilder");
6214 saveAs = require("browser-saveas");
6216 FastaExporter = require("biojs-io-fasta").writer;
6218 _ = require("underscore");
6220 blobURL = require("blueimp_canvastoblob");
6222 module.exports = ExportMenu = MenuBuilder.extend({
6223 initialize: function(data) {
6225 this.msa = data.msa;
6226 return this.el.style.display = "inline-block";
6228 render: function() {
6229 this.setName("Export");
6230 this.addNode("Export sequences", (function(_this) {
6233 text = FastaExporter["export"](_this.model.toJSON());
6234 blob = new Blob([text], {
6237 return saveAs(blob, "all.fasta");
6240 this.addNode("Export selection", (function(_this) {
6242 var blob, i, selection, text, _i, _ref;
6243 selection = _this.g.selcol.pluck("seqId");
6244 if (selection != null) {
6245 selection = _this.model.filter(function(el) {
6246 return _.contains(selection, el.get("id"));
6248 for (i = _i = 0, _ref = selection.length - 1; _i <= _ref; i = _i += 1) {
6249 selection[i] = selection[i].toJSON();
6252 selection = _this.model.toJSON();
6253 console.log("no selection found");
6255 text = FastaExporter["export"](selection);
6256 blob = new Blob([text], {
6259 return saveAs(blob, "selection.fasta");
6262 this.addNode("Export image", (function(_this) {
6265 canvas = _this.msa.getView('stage').getView('body').getView('seqblock').el;
6266 if (canvas != null) {
6267 url = canvas.toDataURL('image/png');
6268 return saveAs(blobURL(url), "biojs-msa.png", "image/png");
6272 this.el.appendChild(this.buildDOM());
6279 },{"../menubuilder":75,"biojs-io-fasta":undefined,"blueimp_canvastoblob":46,"browser-saveas":47,"underscore":59}],78:[function(require,module,exports){
6280 var ExtraMenu, MenuBuilder, Seq, consenus;
6282 MenuBuilder = require("../menubuilder");
6284 consenus = require("../../algo/ConsensusCalc");
6286 Seq = require("../../model/Sequence");
6288 module.exports = ExtraMenu = MenuBuilder.extend({
6289 initialize: function(data) {
6291 return this.el.style.display = "inline-block";
6293 render: function() {
6294 this.setName("Extras");
6295 this.addNode("Add consensus seq", (function(_this) {
6298 con = consenus(_this.model);
6305 _this.model.add(seq);
6306 _this.model.comparator = function(seq) {
6307 return seq.get("id");
6309 return _this.model.sort();
6312 this.addNode("Increase font size", (function(_this) {
6314 _this.g.zoomer.set("columnWidth", _this.g.zoomer.get("columnWidth") + 2);
6315 _this.g.zoomer.set("labelWidth", _this.g.zoomer.get("columnWidth") + 5);
6316 _this.g.zoomer.set("rowHeight", _this.g.zoomer.get("rowHeight") + 2);
6317 return _this.g.zoomer.set("labelFontSize", _this.g.zoomer.get("labelFontSize") + 2);
6320 this.addNode("Decrease font size", (function(_this) {
6322 _this.g.zoomer.set("columnWidth", _this.g.zoomer.get("columnWidth") - 2);
6323 _this.g.zoomer.set("rowHeight", _this.g.zoomer.get("rowHeight") - 2);
6324 _this.g.zoomer.set("labelFontSize", _this.g.zoomer.get("labelFontSize") - 2);
6325 if (_this.g.zoomer.get("columnWidth") < 8) {
6326 return _this.g.zoomer.set("textVisible", false);
6330 this.addNode("Bar chart exp scaling", (function(_this) {
6332 return _this.g.columns.set("scaling", "exp");
6335 this.addNode("Bar chart linear scaling", (function(_this) {
6337 return _this.g.columns.set("scaling", "lin");
6340 this.addNode("Bar chart log scaling", (function(_this) {
6342 return _this.g.columns.set("scaling", "log");
6345 this.addNode("Minimized width", (function(_this) {
6347 return _this.g.zoomer.set("alignmentWidth", 600);
6350 this.addNode("Minimized height", (function(_this) {
6352 return _this.g.zoomer.set("alignmentHeight", 120);
6355 this.addNode("Jump to a column", (function(_this) {
6358 offset = prompt("Column", "20");
6359 if (offset < 0 || offset > _this.model.getMaxLength() || isNaN(offset)) {
6360 alert("invalid column");
6363 return _this.g.zoomer.setLeftOffset(offset);
6366 this.el.appendChild(this.buildDOM());
6373 },{"../../algo/ConsensusCalc":60,"../../model/Sequence":88,"../menubuilder":75}],79:[function(require,module,exports){
6374 var FilterMenu, MenuBuilder, _;
6376 MenuBuilder = require("../menubuilder");
6378 _ = require("underscore");
6380 module.exports = FilterMenu = MenuBuilder.extend({
6381 initialize: function(data) {
6383 return this.el.style.display = "inline-block";
6385 render: function() {
6386 this.setName("Filter");
6387 this.addNode("Hide columns by threshold", (function(_this) {
6388 return function(e) {
6389 var conserv, hidden, i, maxLen, threshold, _i, _ref;
6390 threshold = prompt("Enter threshold (in percent)", 20);
6391 threshold = threshold / 100;
6392 maxLen = _this.model.getMaxLength();
6394 conserv = _this.g.columns.get("conserv");
6395 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6396 if (conserv[i] < threshold) {
6400 return _this.g.columns.set("hidden", hidden);
6403 this.addNode("Hide columns by selection", (function(_this) {
6405 var hidden, hiddenOld;
6406 hiddenOld = _this.g.columns.get("hidden");
6407 hidden = hiddenOld.concat(_this.g.selcol.getAllColumnBlocks({
6408 maxLen: _this.model.getMaxLength(),
6411 _this.g.selcol.reset([]);
6412 return _this.g.columns.set("hidden", hidden);
6415 this.addNode("Hide columns by gaps", (function(_this) {
6417 var gapContent, gaps, hidden, i, maxLen, threshold, total, _i, _ref;
6418 threshold = prompt("Enter threshold (in percent)", 20);
6419 threshold = threshold / 100;
6420 maxLen = _this.model.getMaxLength();
6422 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6425 _this.model.each(function(el) {
6426 if (el.get('seq')[i] === "-") {
6431 gapContent = gaps / total;
6432 if (gapContent > threshold) {
6436 return _this.g.columns.set("hidden", hidden);
6439 this.addNode("Hide seqs by identity", (function(_this) {
6442 threshold = prompt("Enter threshold (in percent)", 20);
6443 threshold = threshold / 100;
6444 return _this.model.each(function(el) {
6445 if (el.get('identity') < threshold) {
6446 return el.set('hidden', true);
6451 this.addNode("Hide seqs by selection", (function(_this) {
6454 hidden = _this.g.selcol.where({
6457 ids = _.map(hidden, function(el) {
6458 return el.get('seqId');
6460 _this.g.selcol.reset([]);
6461 return _this.model.each(function(el) {
6462 if (ids.indexOf(el.get('id')) >= 0) {
6463 return el.set('hidden', true);
6468 this.addNode("Hide seqs by gaps", (function(_this) {
6471 threshold = prompt("Enter threshold (in percent)", 40);
6472 return _this.model.each(function(el, i) {
6474 seq = el.get('seq');
6475 gaps = _.reduce(seq, (function(memo, c) {
6482 if (gaps > threshold) {
6483 return el.set('hidden', true);
6488 this.addNode("Reset", (function(_this) {
6490 _this.g.columns.set("hidden", []);
6491 return _this.model.each(function(el) {
6492 if (el.get('hidden')) {
6493 return el.set('hidden', false);
6498 this.el.appendChild(this.buildDOM());
6505 },{"../menubuilder":75,"underscore":59}],80:[function(require,module,exports){
6506 var HelpMenu, MenuBuilder;
6508 MenuBuilder = require("../menubuilder");
6510 module.exports = HelpMenu = MenuBuilder.extend({
6511 initialize: function(data) {
6512 return this.g = data.g;
6514 render: function() {
6515 this.setName("Help");
6516 this.addNode("About the project", (function(_this) {
6518 return window.open("https://github.com/greenify/biojs-vis-msa");
6521 this.addNode("Report issues", (function(_this) {
6523 return window.open("https://github.com/greenify/biojs-vis-msa/issues");
6526 this.addNode("User manual", (function(_this) {
6528 return window.open("https://github.com/greenify/biojs-vis-msa/wiki");
6531 this.el.style.display = "inline-block";
6532 this.el.appendChild(this.buildDOM());
6539 },{"../menubuilder":75}],81:[function(require,module,exports){
6540 var Clustal, FastaReader, ImportMenu, MenuBuilder, corsURL;
6542 Clustal = require("biojs-io-clustal");
6544 FastaReader = require("biojs-io-fasta").parse;
6546 MenuBuilder = require("../menubuilder");
6548 corsURL = require("../../utils/proxy").corsURL;
6550 module.exports = ImportMenu = MenuBuilder.extend({
6551 initialize: function(data) {
6553 return this.el.style.display = "inline-block";
6555 render: function() {
6556 this.setName("Import");
6557 this.addNode("FASTA", (function(_this) {
6558 return function(e) {
6560 url = prompt("URL", "/test/dummy/samples/p53.clustalo.fasta");
6561 url = corsURL(url, _this.g);
6562 return FastaReader.read(url, function(seqs) {
6564 zoomer = _this.g.zoomer.toJSON();
6565 zoomer.labelWidth = 200;
6566 zoomer.boxRectHeight = 2;
6567 zoomer.boxRectWidth = 2;
6568 _this.model.reset([]);
6569 _this.g.zoomer.set(zoomer);
6570 _this.model.reset(seqs);
6571 return _this.g.columns.calcConservation(_this.model);
6575 this.addNode("CLUSTAL", (function(_this) {
6578 url = prompt("URL", "/test/dummy/samples/p53.clustalo.clustal");
6579 url = corsURL(url, _this.g);
6580 return Clustal.read(url, function(seqs) {
6582 zoomer = _this.g.zoomer.toJSON();
6583 zoomer.labelWidth = 200;
6584 zoomer.boxRectHeight = 2;
6585 zoomer.boxRectWidth = 2;
6586 _this.model.reset([]);
6587 _this.g.zoomer.set(zoomer);
6588 _this.model.reset(seqs);
6589 return _this.g.columns.calcConservation(_this.model);
6593 this.addNode("add your own Parser", (function(_this) {
6595 return window.open("https://github.com/biojs/biojs2");
6598 this.el.appendChild(this.buildDOM());
6605 },{"../../utils/proxy":93,"../menubuilder":75,"biojs-io-clustal":undefined,"biojs-io-fasta":undefined}],82:[function(require,module,exports){
6606 var MenuBuilder, OrderingMenu, dom, _;
6608 MenuBuilder = require("../menubuilder");
6610 dom = require("dom-helper");
6612 _ = require('underscore');
6614 module.exports = OrderingMenu = MenuBuilder.extend({
6615 initialize: function(data) {
6618 return this.el.style.display = "inline-block";
6620 setOrder: function(order) {
6622 return this.render();
6624 render: function() {
6625 var comps, el, m, _i, _len;
6626 this.setName("Ordering");
6627 comps = this.getComparators();
6628 for (_i = 0, _len = comps.length; _i < _len; _i++) {
6632 el = this.buildDOM();
6633 dom.removeAllChilds(this.el);
6634 this.el.appendChild(el);
6637 _addNode: function(m) {
6641 if (text === this.order) {
6642 style.backgroundColor = "#77ED80";
6644 return this.addNode(text, (function(_this) {
6646 if (m.precode != null) {
6649 _this.model.comparator = m.comparator;
6651 return _this.setOrder(m.text);
6657 getComparators: function() {
6666 comparator: function(a, b) {
6667 return -a.get("id").localeCompare(b.get("id"));
6676 comparator: function(a, b) {
6677 return -a.get("name").localeCompare(b.get("name"));
6686 comparator: function(a, b) {
6687 return -a.get("seq").localeCompare(b.get("seq"));
6692 comparator: "identity"
6695 text: "Identity Desc",
6696 comparator: function(seq) {
6697 return -seq.get("identity");
6701 text: "Partition codes",
6702 comparator: "partition",
6703 precode: (function(_this) {
6705 _this.g.vis.set('labelPartition', true);
6706 return _this.model.each(function(el) {
6707 return el.set('partition', _.random(1, 3));
6718 },{"../menubuilder":75,"dom-helper":49,"underscore":59}],83:[function(require,module,exports){
6719 var MenuBuilder, SelectionMenu, sel;
6721 sel = require("../../g/selection/Selection");
6723 MenuBuilder = require("../menubuilder");
6725 module.exports = SelectionMenu = MenuBuilder.extend({
6726 initialize: function(data) {
6728 return this.el.style.display = "inline-block";
6730 render: function() {
6731 this.setName("Selection");
6732 this.addNode("Find Motif (supports RegEx)", (function(_this) {
6734 var leftestIndex, newSeli, origIndex, search, selcol;
6735 search = prompt("your search", "D");
6736 search = new RegExp(search, "gi");
6737 selcol = _this.g.selcol;
6739 leftestIndex = origIndex = 100042;
6740 _this.model.each(function(seq) {
6741 var args, index, match, strSeq, _results;
6742 strSeq = seq.get("seq");
6744 while (match = search.exec(strSeq)) {
6745 index = match.index;
6748 xEnd: index + match[0].length - 1,
6749 seqId: seq.get("id")
6751 newSeli.push(new sel.possel(args));
6752 _results.push(leftestIndex = Math.min(index, leftestIndex));
6756 if (newSeli.length === 0) {
6757 alert("no selection found");
6759 selcol.reset(newSeli);
6760 if (leftestIndex === origIndex) {
6763 return _this.g.zoomer.setLeftOffset(leftestIndex);
6766 this.addNode("Invert columns", (function(_this) {
6768 var _i, _ref, _results;
6769 return _this.g.selcol.invertCol((function() {
6771 for (var _i = 0, _ref = _this.model.getMaxLength(); 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
6776 this.addNode("Invert rows", (function(_this) {
6778 return _this.g.selcol.invertRow(_this.model.pluck("id"));
6781 this.addNode("Reset", (function(_this) {
6783 return _this.g.selcol.reset();
6786 this.el.appendChild(this.buildDOM());
6793 },{"../../g/selection/Selection":67,"../menubuilder":75}],84:[function(require,module,exports){
6794 var ImportMenu, MenuBuilder, dom;
6796 MenuBuilder = require("../menubuilder");
6798 dom = require("dom-helper");
6800 module.exports = ImportMenu = MenuBuilder.extend({
6801 initialize: function(data) {
6803 this.el.style.display = "inline-block";
6804 return this.listenTo(this.g.vis, "change", this.render);
6806 render: function() {
6807 var visEl, visElements, _i, _len;
6808 this.setName("Vis. elements");
6809 visElements = this.getVisElements();
6810 for (_i = 0, _len = visElements.length; _i < _len; _i++) {
6811 visEl = visElements[_i];
6812 this._addVisEl(visEl);
6814 this.addNode("Reset", (function(_this) {
6816 _this.g.vis.set("labels", true);
6817 _this.g.vis.set("sequences", true);
6818 _this.g.vis.set("metacell", true);
6819 _this.g.vis.set("conserv", true);
6820 _this.g.vis.set("labelId", true);
6821 _this.g.vis.set("labelName", true);
6822 return _this.g.vis.set("labelCheckbox", false);
6825 this.addNode("Toggle mouseover events", (function(_this) {
6827 return _this.g.config.set("registerMouseHover", !_this.g.config.get("registerMouseHover"));
6830 dom.removeAllChilds(this.el);
6831 this.el.appendChild(this.buildDOM());
6834 _addVisEl: function(visEl) {
6837 if (this.g.vis.get(visEl.id)) {
6839 style.color = "red";
6842 style.color = "green";
6844 return this.addNode(pre + visEl.name, (function(_this) {
6846 return _this.g.vis.set(visEl.id, !_this.g.vis.get(visEl.id));
6852 getVisElements: function() {
6872 name: "Overviewbox",
6888 name: "LabelCheckbox",
6897 },{"../menubuilder":75,"dom-helper":49}],85:[function(require,module,exports){
6900 Feature = require("./Feature");
6902 Model = require("backbone-thin").Model;
6904 module.exports = Feature = Model.extend({
6914 borderColor: "black",
6918 validate: function() {
6919 if (isNaN(this.attributes.xStart || isNaN(this.attributes.xEnd))) {
6920 return "features need integer start and end.";
6923 contains: function(index) {
6924 return this.attributes.xStart <= index && index <= this.attributes.xEnd;
6930 },{"./Feature":85,"backbone-thin":5}],86:[function(require,module,exports){
6931 var Collection, Feature, FeatureCol, _;
6933 Feature = require("./Feature");
6935 Collection = require("backbone-thin").Collection;
6937 _ = require("underscore");
6939 module.exports = FeatureCol = Collection.extend({
6941 constructor: function() {
6942 this.startOnCache = [];
6943 this.on("all", function() {
6944 return this.startOnCache = [];
6946 return Collection.apply(this, arguments);
6948 startOn: function(index) {
6949 if (this.startOnCache[index] == null) {
6950 this.startOnCache[index] = this.where({
6954 return this.startOnCache[index];
6956 contains: function(index) {
6957 return this.reduce(function(el, memo) {
6958 return memo || el.contains(index);
6961 getMinRows: function() {
6963 len = this.max(function(el) {
6964 return el.get("xEnd");
6966 rows = (function() {
6969 for (x = _i = 1; 1 <= len ? _i <= len : _i >= len; x = 1 <= len ? ++_i : --_i) {
6974 this.each(function(el) {
6975 var _i, _ref, _ref1, _results;
6977 for (x = _i = _ref = el.get("xStart"), _ref1 = feature.get("xEnd"); _i <= _ref1; x = _i += 1) {
6978 _results.push(rows[x]++);
6988 },{"./Feature":85,"backbone-thin":5,"underscore":59}],87:[function(require,module,exports){
6989 var Collection, SeqManager, Sequence;
6991 Sequence = require("./Sequence");
6993 Collection = require("backbone-thin").Collection;
6995 module.exports = SeqManager = Collection.extend({
6997 constructor: function() {
6998 Collection.apply(this, arguments);
6999 this.on("all", function() {
7000 return this.lengthCache = null;
7002 this.lengthCache = null;
7005 getMaxLength: function() {
7006 if (this.models.length === 0) {
7009 if (this.lengthCache === null) {
7010 this.lengthCache = this.max(function(seq) {
7011 return seq.get("seq").length;
7012 }).get("seq").length;
7014 return this.lengthCache;
7016 prev: function(model, endless) {
7018 index = this.indexOf(model) - 1;
7019 if (index < 0 && endless) {
7020 index = this.length - 1;
7022 return this.at(index);
7024 next: function(model, endless) {
7026 index = this.indexOf(model) + 1;
7027 if (index === this.length && endless) {
7030 return this.at(index);
7032 calcHiddenSeqs: function(n) {
7035 for (i = _i = 0; 0 <= nNew ? _i <= nNew : _i >= nNew; i = 0 <= nNew ? ++_i : --_i) {
7036 if (this.at(i).get("hidden")) {
7046 },{"./Sequence":88,"backbone-thin":5}],88:[function(require,module,exports){
7047 var FeatureCol, Model, Sequence;
7049 Model = require("backbone-thin").Model;
7051 FeatureCol = require("./FeatureCol");
7053 module.exports = Sequence = Model.extend({
7059 initialize: function() {
7060 this.set("grey", []);
7061 return this.set("features", new FeatureCol());
7067 },{"./FeatureCol":86,"backbone-thin":5}],89:[function(require,module,exports){
7068 module.exports.seq = require("./Sequence");
7070 module.exports.seqcol = require("./SeqCollection");
7072 module.exports.feature = require("./Feature");
7074 module.exports.featurecol = require("./FeatureCol");
7078 },{"./Feature":85,"./FeatureCol":86,"./SeqCollection":87,"./Sequence":88}],90:[function(require,module,exports){
7079 var Colorator, Columns, Config, Consensus, Eventhandler, SelCol, SeqCollection, Stage, VisOrdering, Visibility, Zoomer, boneView;
7081 SeqCollection = require("./model/SeqCollection");
7083 Colorator = require("./g/colorator");
7085 Consensus = require("./g/consensus");
7087 Columns = require("./g/columns");
7089 Config = require("./g/config");
7091 SelCol = require("./g/selection/SelectionCol");
7093 Visibility = require("./g/visibility");
7095 VisOrdering = require("./g/visOrdering");
7097 Zoomer = require("./g/zoomer");
7099 boneView = require("backbone-childs");
7101 Eventhandler = require("biojs-events");
7103 Stage = require("./views/Stage");
7105 module.exports = boneView.extend({
7106 initialize: function(data) {
7108 if (data.columns == null) {
7111 if (data.conf == null) {
7114 if (data.vis == null) {
7117 if (data.zoomer == null) {
7118 if (!((_ref = data.visorder) != null ? _ref : data.zoomer = {})) {
7122 this.g = Eventhandler.mixin({});
7123 if (data.seqs === void 0 || data.seqs.length === 0) {
7124 console.log("warning. empty seqs.");
7126 this.seqs = new SeqCollection(data.seqs);
7127 this.g.config = new Config(data.conf);
7128 this.g.consensus = new Consensus();
7129 this.g.columns = new Columns(data.columns);
7130 this.g.colorscheme = new Colorator();
7131 this.g.selcol = new SelCol([], {
7134 this.g.vis = new Visibility(data.vis);
7135 this.g.visorder = new VisOrdering(data.visorder);
7136 this.g.zoomer = new Zoomer(data.zoomer, {
7139 this.addView("stage", new Stage({
7143 this.el.setAttribute("class", "biojs_msa_div");
7144 if (this.g.config.get("eventBus") === true) {
7145 return this.startEventBus();
7148 startEventBus: function() {
7149 var busObjs, key, _i, _len, _results;
7150 busObjs = ["config", "consensus", "columns", "colorscheme", "selcol", "vis", "visorder", "zoomer"];
7152 for (_i = 0, _len = busObjs.length; _i < _len; _i++) {
7154 _results.push(this._proxyToG(key));
7158 _proxyToG: function(key) {
7159 return this.listenTo(this.g[key], "all", function(name, prev, now) {
7160 if (name === "change") {
7163 return this.g.trigger(key + ":" + name, now);
7166 render: function() {
7167 this.renderSubviews();
7168 this.g.vis.set("loaded", true);
7175 },{"./g/colorator":63,"./g/columns":64,"./g/config":65,"./g/consensus":66,"./g/selection/SelectionCol":68,"./g/visOrdering":69,"./g/visibility":70,"./g/zoomer":71,"./model/SeqCollection":87,"./views/Stage":100,"backbone-childs":3,"biojs-events":14}],91:[function(require,module,exports){
7178 module.exports = BMath = (function() {
7181 BMath.randomInt = function(lower, upper) {
7183 if (upper == null) {
7184 _ref = [0, lower], lower = _ref[0], upper = _ref[1];
7186 if (lower > upper) {
7187 _ref1 = [upper, lower], lower = _ref1[0], upper = _ref1[1];
7189 return Math.floor(Math.random() * (upper - lower + 1) + lower);
7192 BMath.uniqueId = function(length) {
7194 if (length == null) {
7198 while (id.length < length) {
7199 id += Math.random().toString(36).substr(2);
7201 return id.substr(0, length);
7204 BMath.getRandomInt = function(min, max) {
7205 return Math.floor(Math.random() * (max - min + 1)) + min;
7214 },{}],92:[function(require,module,exports){
7215 module.exports.bmath = require("./bmath");
7217 module.exports.proxy = require("./proxy");
7219 module.exports.seqgen = require("./seqgen");
7223 },{"./bmath":91,"./proxy":93,"./seqgen":94}],93:[function(require,module,exports){
7226 module.exports = proxy = {
7227 corsURL: (function(_this) {
7228 return function(url, g) {
7230 if (document.URL.indexOf('localhost') >= 0 && url[0] === "/") {
7233 url = url.replace("www\.", "");
7234 url = url.replace("http://", "");
7235 url = _this.g.config.get('importProxy') + url;
7243 },{}],94:[function(require,module,exports){
7244 var BMath, Sequence, seqgen;
7246 Sequence = require("biojs-model").seq;
7248 BMath = require("./bmath");
7250 seqgen = module.exports = {
7251 _generateSequence: function(len) {
7252 var i, possible, text, _i, _ref;
7254 possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
7255 for (i = _i = 0, _ref = len - 1; _i <= _ref; i = _i += 1) {
7256 text += possible.charAt(Math.floor(Math.random() * possible.length));
7260 getDummySequences: function(len, seqLen) {
7264 len = BMath.getRandomInt(3, 5);
7266 if (seqLen == null) {
7267 seqLen = BMath.getRandomInt(50, 200);
7269 for (i = _i = 1; _i <= len; i = _i += 1) {
7270 seqs.push(new Sequence(seqgen._generateSequence(seqLen), "seq" + i, "r" + i));
7278 },{"./bmath":91,"biojs-model":27}],95:[function(require,module,exports){
7279 var Base, Line, Polygon, Rect, setAttr, svgns;
7281 svgns = "http://www.w3.org/2000/svg";
7283 setAttr = function(obj, opts) {
7285 for (name in opts) {
7287 obj.setAttributeNS(null, name, value);
7292 Base = function(opts) {
7294 svg = document.createElementNS(svgns, 'svg');
7295 svg.setAttribute("width", opts.width);
7296 svg.setAttribute("height", opts.height);
7300 Rect = function(opts) {
7302 rect = document.createElementNS(svgns, 'rect');
7303 return setAttr(rect, opts);
7306 Line = function(opts) {
7308 line = document.createElementNS(svgns, 'line');
7309 return setAttr(line, opts);
7312 Polygon = function(opts) {
7314 line = document.createElementNS(svgns, 'polygon');
7315 return setAttr(line, opts);
7318 module.exports.rect = Rect;
7320 module.exports.line = Line;
7322 module.exports.polygon = Polygon;
7324 module.exports.base = Base;
7328 },{}],96:[function(require,module,exports){
7329 var LabelBlock, SeqBlock, boneView;
7331 boneView = require("backbone-childs");
7333 SeqBlock = require("./CanvasSeqBlock");
7335 LabelBlock = require("./labels/LabelBlock");
7337 module.exports = boneView.extend({
7338 initialize: function(data) {
7339 var labelblock, seqblock;
7342 labelblock = new LabelBlock({
7346 labelblock.ordering = -1;
7347 this.addView("labelblock", labelblock);
7349 if (this.g.vis.get("sequences")) {
7350 seqblock = new SeqBlock({
7354 seqblock.ordering = 0;
7355 this.addView("seqblock", seqblock);
7357 this.listenTo(this.g.zoomer, "change:alignmentHeight", this.adjustHeight);
7358 return this.listenTo(this.g.columns, "change:hidden", this.adjustHeight);
7360 render: function() {
7361 this.renderSubviews();
7362 this.el.className = "biojs_msa_albody";
7363 this.el.style.whiteSpace = "nowrap";
7364 this.adjustHeight();
7367 adjustHeight: function() {
7368 if (this.g.zoomer.get("alignmentHeight") === "auto") {
7369 this.el.style.height = (this.g.zoomer.get("rowHeight") * this.model.length) + 5;
7371 this.el.style.height = this.g.zoomer.get("alignmentHeight");
7373 return this.el.style.width = this.getWidth() + 15;
7375 getWidth: function() {
7378 if (this.g.vis.get("labels")) {
7379 width += this.g.zoomer.get("labelWidth");
7381 if (this.g.vis.get("metacell")) {
7382 width += this.g.zoomer.get("metaWidth");
7384 if (this.g.vis.get("sequences")) {
7385 width += this.g.zoomer.get("alignmentWidth");
7393 },{"./CanvasSeqBlock":98,"./labels/LabelBlock":104,"backbone-childs":3}],97:[function(require,module,exports){
7394 var CanvasCharCache, Events;
7396 Events = require("biojs-events");
7398 module.exports = CanvasCharCache = (function() {
7399 function CanvasCharCache(g) {
7402 this.cacheHeight = 0;
7403 this.cacheWidth = 0;
7406 CanvasCharCache.prototype.getFontTile = function(letter, width, height) {
7407 if (width !== this.cacheWidth || height !== this.cacheHeight) {
7408 this.cacheHeight = height;
7409 this.cacheWidth = width;
7412 if (this.cache[letter] === void 0) {
7413 this.createTile(letter, width, height);
7415 return this.cache[letter];
7418 CanvasCharCache.prototype.createTile = function(letter, width, height) {
7420 canvas = this.cache[letter] = document.createElement("canvas");
7421 canvas.width = width;
7422 canvas.height = height;
7423 this.ctx = canvas.getContext('2d');
7424 this.ctx.font = this.g.zoomer.get("residueFont");
7425 this.ctx.textBaseline = 'middle';
7426 this.ctx.textAlign = "center";
7427 return this.ctx.fillText(letter, width / 2, height / 2, width);
7430 return CanvasCharCache;
7436 },{"biojs-events":14}],98:[function(require,module,exports){
7437 var CharCache, boneView, colorSelector, jbone, mouse, _;
7439 boneView = require("backbone-childs");
7441 mouse = require("mouse-pos");
7443 colorSelector = require("biojs-util-colorschemes").selector;
7445 _ = require("underscore");
7447 jbone = require("jbone");
7449 CharCache = require("./CanvasCharCache");
7451 module.exports = boneView.extend({
7453 initialize: function(data) {
7455 this.listenTo(this.g.zoomer, "change:_alignmentScrollLeft change:_alignmentScrollTop", function(model, value, options) {
7456 if (((options != null ? options.origin : void 0) == null) || options.origin !== "canvasseq") {
7457 return this.render();
7460 this.listenTo(this.g.columns, "change:hidden", this.render);
7461 this.listenTo(this.g.zoomer, "change:alignmentWidth", this.render);
7462 this.listenTo(this.g.colorscheme, "change", this.render);
7463 this.listenTo(this.g.selcol, "reset add", this.render);
7464 this.el.style.display = "inline-block";
7465 this.el.style.overflowX = "hidden";
7466 this.el.style.overflowY = "hidden";
7467 this.el.className = "biojs_msa_seqblock";
7468 this.ctx = this.el.getContext('2d');
7469 this.cache = new CharCache(this.g);
7470 this.throttleTime = 0;
7471 this.throttleCounts = 0;
7472 if (document.documentElement.style.webkitAppearance != null) {
7473 this.throttledDraw = function() {
7475 start = +new Date();
7477 this.throttleTime += +new Date() - start;
7478 this.throttleCounts++;
7479 if (this.throttleCounts > 15) {
7480 tTime = Math.ceil(this.throttleTime / this.throttleCounts);
7481 console.log("avgDrawTime/WebKit", tTime);
7482 return this.throttledDraw = this.draw;
7486 this.throttledDraw = _.throttle(this.throttledDraw, 30);
7488 return this.manageEvents();
7490 throttledDraw: function() {
7492 start = +new Date();
7494 this.throttleTime += +new Date() - start;
7495 this.throttleCounts++;
7496 if (this.throttleCounts > 15) {
7497 tTime = Math.ceil(this.throttleTime / this.throttleCounts);
7498 console.log("avgDrawTime", tTime);
7500 tTime = Math.max(20, tTime);
7501 return this.throttledDraw = _.throttle(this.draw, tTime);
7504 manageEvents: function() {
7507 events.mousedown = "_onmousedown";
7508 events.touchstart = "_ontouchstart";
7509 if (this.g.config.get("registerMouseClicks")) {
7510 events.dblclick = "_onclick";
7512 if (this.g.config.get("registerMouseHover")) {
7513 events.mousein = "_onmousein";
7514 events.mouseout = "_onmouseout";
7516 events.mousewheel = "_onmousewheel";
7517 events.DOMMouseScroll = "_onmousewheel";
7518 this.delegateEvents(events);
7519 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
7520 this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
7521 return this.dragStart = [];
7525 this.el.width = this.el.width;
7526 rectHeight = this.g.zoomer.get("rowHeight");
7527 this.ctx.globalAlpha = this.g.colorscheme.get("opacity");
7528 this.drawSeqs(function(data) {
7529 return this.drawSeq(data, this._drawRect);
7531 this.ctx.globalAlpha = 1;
7532 this.drawSeqs(function(data) {
7533 return this.drawSeq(data, this._drawLetter);
7535 return this.drawSeqs(this.drawSeqExtended);
7537 drawSeqs: function(callback) {
7538 var hidden, i, rectHeight, start, y, _i, _ref, _results;
7539 rectHeight = this.g.zoomer.get("rowHeight");
7540 hidden = this.g.columns.get("hidden");
7541 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollTop') / rectHeight)));
7542 y = -Math.abs(-this.g.zoomer.get('_alignmentScrollTop') % rectHeight);
7544 for (i = _i = start, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
7545 if (this.model.at(i).get('hidden')) {
7548 callback.call(this, {
7549 model: this.model.at(i),
7554 if (y > this.el.height) {
7557 _results.push(void 0);
7562 drawSeq: function(data, callback) {
7563 var c, elWidth, j, rectHeight, rectWidth, res, seq, start, x, y, _i, _ref, _results;
7564 seq = data.model.get("seq");
7566 rectWidth = this.g.zoomer.get("columnWidth");
7567 rectHeight = this.g.zoomer.get("rowHeight");
7568 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollLeft') / rectWidth)));
7569 x = -Math.abs(-this.g.zoomer.get('_alignmentScrollLeft') % rectWidth);
7571 rectWidth: rectWidth,
7572 rectHeight: rectHeight,
7575 elWidth = this.el.width;
7577 for (j = _i = start, _ref = seq.length - 1; _i <= _ref; j = _i += 1) {
7579 c = c.toUpperCase();
7582 if (data.hidden.indexOf(j) < 0) {
7583 callback(this, res);
7591 _results.push(void 0);
7596 _drawRect: function(that, data) {
7598 color = that.color[data.c];
7599 if (color != null) {
7600 that.ctx.fillStyle = color;
7601 return that.ctx.fillRect(data.x, data.y, data.rectWidth, data.rectHeight);
7604 _drawLetter: function(that, data) {
7605 return that.ctx.drawImage(that.cache.getFontTile(data.c, data.rectWidth, data.rectHeight), data.x, data.y, data.rectWidth, data.rectHeight);
7607 drawSeqExtended: function(data) {
7608 var f, features, j, mNextSel, mPrevSel, rectHeight, rectWidth, selection, seq, start, starts, x, xZero, yZero, _i, _j, _len, _ref, _ref1;
7609 seq = data.model.get("seq");
7610 rectWidth = this.g.zoomer.get("columnWidth");
7611 rectHeight = this.g.zoomer.get("rowHeight");
7612 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollLeft') / rectWidth)));
7613 x = -Math.abs(-this.g.zoomer.get('_alignmentScrollLeft') % rectWidth);
7614 xZero = x - start * rectWidth;
7615 selection = this._getSelection(data.model);
7616 _ref = this._getPrevNextSelection(data.model), mPrevSel = _ref[0], mNextSel = _ref[1];
7617 features = data.model.get("features");
7619 for (j = _i = start, _ref1 = seq.length - 1; _i <= _ref1; j = _i += 1) {
7620 starts = features.startOn(j);
7621 if (data.hidden.indexOf(j) >= 0) {
7624 if (starts.length > 0) {
7625 for (_j = 0, _len = starts.length; _j < _len; _j++) {
7627 this.appendFeature({
7635 if (x > this.el.width) {
7639 return this._appendSelection({
7646 render: function() {
7647 this.el.setAttribute('height', this.g.zoomer.get("alignmentHeight"));
7648 this.el.setAttribute('width', this.g.zoomer.get("alignmentWidth"));
7649 this.g.zoomer._adjustWidth(this.el, this.model);
7650 this.g.zoomer._checkScrolling(this._checkScrolling([this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')]), {
7653 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
7654 this.throttledDraw();
7657 _onmousemove: function(e, reversed) {
7658 var dragEnd, i, relDist, relEnd, scaleFactor, scrollCorrected, _i, _j, _k;
7659 if (this.dragStart.length === 0) {
7662 dragEnd = mouse.abs(e);
7663 relEnd = [dragEnd[0] - this.dragStart[0], dragEnd[1] - this.dragStart[1]];
7664 scaleFactor = this.g.zoomer.get("canvasEventScale");
7668 for (i = _i = 0; _i <= 1; i = _i += 1) {
7669 relEnd[i] = relEnd[i] * scaleFactor;
7671 relDist = [this.dragStartScroll[0] - relEnd[0], this.dragStartScroll[1] - relEnd[1]];
7672 for (i = _j = 0; _j <= 1; i = _j += 1) {
7673 relDist[i] = Math.round(relDist[i]);
7675 scrollCorrected = this._checkScrolling(relDist);
7676 this.g.zoomer._checkScrolling(scrollCorrected, {
7679 for (i = _k = 0; _k <= 1; i = _k += 1) {
7680 if (scrollCorrected[i] !== relDist[i]) {
7681 if (scrollCorrected[i] === 0) {
7682 this.dragStart[i] = dragEnd[i];
7683 this.dragStartScroll[i] = 0;
7685 this.dragStart[i] = dragEnd[i] - scrollCorrected[i];
7689 this.throttledDraw();
7690 if (e.preventDefault != null) {
7692 return e.stopPropagation();
7695 _ontouchmove: function(e) {
7696 this._onmousemove(e.changedTouches[0], true);
7698 return e.stopPropagation();
7700 _onmousedown: function(e) {
7701 this.dragStart = mouse.abs(e);
7702 this.dragStartScroll = [this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')];
7703 jbone(document.body).on('mousemove.overmove', (function(_this) {
7704 return function(e) {
7705 return _this._onmousemove(e);
7708 jbone(document.body).on('mouseup.overup', (function(_this) {
7710 return _this._cleanup();
7713 return e.preventDefault();
7715 _ontouchstart: function(e) {
7716 this.dragStart = mouse.abs(e.changedTouches[0]);
7717 this.dragStartScroll = [this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')];
7718 jbone(document.body).on('touchmove.overtmove', (function(_this) {
7719 return function(e) {
7720 return _this._ontouchmove(e);
7723 return jbone(document.body).on('touchend.overtend touchleave.overtleave touchcancel.overtcanel', (function(_this) {
7724 return function(e) {
7725 return _this._touchCleanup(e);
7729 _onmousewinout: function(e) {
7730 if (e.toElement === document.body.parentNode) {
7731 return this._cleanup();
7734 _cleanup: function() {
7735 this.dragStart = [];
7736 jbone(document.body).off('.overmove');
7737 jbone(document.body).off('.overup');
7738 return jbone(document.body).off('.overout');
7740 _touchCleanup: function(e) {
7741 if (e.changedTouches.length > 0) {
7742 this._onmousemove(e.changedTouches[0], true);
7744 this.dragStart = [];
7745 jbone(document.body).off('.overtmove');
7746 jbone(document.body).off('.overtend');
7747 jbone(document.body).off('.overtleave');
7748 return jbone(document.body).off('.overtcancel');
7750 _onmousewheel: function(e) {
7752 delta = mouse.wheelDelta(e);
7753 this.g.zoomer.set('_alignmentScrollLeft', this.g.zoomer.get('_alignmentScrollLeft') + delta[0]);
7754 this.g.zoomer.set('_alignmentScrollTop', this.g.zoomer.get('_alignmentScrollTop') + delta[1]);
7755 return e.preventDefault();
7757 _onclick: function(e) {
7758 this.g.trigger("residue:click", this._getClickPos(e));
7759 return this.throttledDraw();
7761 _onmousein: function(e) {
7762 this.g.trigger("residue:click", this._getClickPos(e));
7763 return this.throttledDraw();
7765 _onmouseout: function(e) {
7766 this.g.trigger("residue:click", this._getClickPos(e));
7767 return this.throttledDraw();
7769 _getClickPos: function(e) {
7770 var coords, seqId, x, y;
7771 coords = mouse.rel(e);
7772 coords[0] += this.g.zoomer.get("_alignmentScrollLeft");
7773 coords[1] += this.g.zoomer.get("_alignmentScrollTop");
7774 x = Math.floor(coords[0] / this.g.zoomer.get("columnWidth"));
7775 y = Math.floor(coords[1] / this.g.zoomer.get("rowHeight"));
7776 x += this.g.columns.calcHiddenColumns(x);
7777 y += this.model.calcHiddenSeqs(y);
7780 seqId = this.model.at(y).get("id");
7787 _checkScrolling: function(scrollObj) {
7789 max = [this.model.getMaxLength() * this.g.zoomer.get("columnWidth") - this.g.zoomer.get('alignmentWidth'), this.model.length * this.g.zoomer.get("rowHeight") - this.g.zoomer.get('alignmentHeight')];
7790 for (i = _i = 0; _i <= 1; i = _i += 1) {
7791 if (scrollObj[i] > max[i]) {
7792 scrollObj[i] = max[i];
7794 if (scrollObj[i] < 0) {
7800 _getSelection: function(model) {
7801 var maxLen, n, rows, sel, selection, sels, _i, _j, _k, _len, _ref, _ref1, _ref2;
7802 maxLen = model.get("seq").length;
7804 sels = this.g.selcol.getSelForRow(model.get("id"));
7805 rows = _.find(sels, function(el) {
7806 return el.get("type") === "row";
7809 for (n = _i = 0, _ref = maxLen - 1; _i <= _ref; n = _i += 1) {
7812 } else if (sels.length > 0) {
7813 for (_j = 0, _len = sels.length; _j < _len; _j++) {
7815 for (n = _k = _ref1 = sel.get("xStart"), _ref2 = sel.get("xEnd"); _k <= _ref2; n = _k += 1) {
7822 appendFeature: function(data) {
7823 var beforeStyle, beforeWidth, boxHeight, boxWidth, f, width;
7825 boxWidth = this.g.zoomer.get("columnWidth");
7826 boxHeight = this.g.zoomer.get("rowHeight");
7827 width = (f.get("xEnd") - f.get("xStart")) * boxWidth;
7828 beforeWidth = this.ctx.lineWidth;
7829 this.ctx.lineWidth = 3;
7830 beforeStyle = this.ctx.strokeStyle;
7831 this.ctx.strokeStyle = f.get("fillColor");
7832 this.ctx.strokeRect(data.xZero, data.yZero, width, boxHeight);
7833 this.ctx.strokeStyle = beforeStyle;
7834 return this.ctx.lineWidth = beforeWidth;
7836 _appendSelection: function(data) {
7837 var boxHeight, boxWidth, hiddenOffset, k, mNextSel, mPrevSel, n, selection, seq, _i, _ref, _ref1, _results;
7838 seq = data.model.get("seq");
7839 selection = this._getSelection(data.model);
7840 _ref = this._getPrevNextSelection(data.model), mPrevSel = _ref[0], mNextSel = _ref[1];
7841 boxWidth = this.g.zoomer.get("columnWidth");
7842 boxHeight = this.g.zoomer.get("rowHeight");
7843 if (selection.length === 0) {
7848 for (n = _i = 0, _ref1 = seq.length - 1; _i <= _ref1; n = _i += 1) {
7849 if (data.hidden.indexOf(n) >= 0) {
7850 _results.push(hiddenOffset++);
7852 k = n - hiddenOffset;
7853 if (selection.indexOf(n) >= 0 && (k === 0 || selection.indexOf(n - 1) < 0)) {
7854 _results.push(this._renderSelection({
7857 selection: selection,
7865 _results.push(void 0);
7871 _renderSelection: function(data) {
7872 var beforeStyle, beforeWidth, boxHeight, boxWidth, hidden, i, k, mNextSel, mPrevSel, n, selection, selectionLength, totalWidth, xPart, xPos, xZero, yZero, _i, _j, _ref, _ref1;
7877 selection = data.selection;
7878 mPrevSel = data.mPrevSel;
7879 mNextSel = data.mNextSel;
7880 selectionLength = 0;
7881 for (i = _i = n, _ref = data.model.get("seq").length - 1; _i <= _ref; i = _i += 1) {
7882 if (selection.indexOf(i) >= 0) {
7888 boxWidth = this.g.zoomer.get("columnWidth");
7889 boxHeight = this.g.zoomer.get("rowHeight");
7890 totalWidth = (boxWidth * selectionLength) + 1;
7891 hidden = this.g.columns.get('hidden');
7892 this.ctx.beginPath();
7893 beforeWidth = this.ctx.lineWidth;
7894 this.ctx.lineWidth = 3;
7895 beforeStyle = this.ctx.strokeStyle;
7896 this.ctx.strokeStyle = "#FF0000";
7897 xZero += k * boxWidth;
7899 for (i = _j = 0, _ref1 = selectionLength - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
7901 if (hidden.indexOf(xPos) >= 0) {
7904 if (!((mPrevSel != null) && mPrevSel.indexOf(xPos) >= 0)) {
7905 this.ctx.moveTo(xZero + xPart, yZero);
7906 this.ctx.lineTo(xPart + boxWidth + xZero, yZero);
7908 if (!((mNextSel != null) && mNextSel.indexOf(xPos) >= 0)) {
7909 this.ctx.moveTo(xPart + xZero, boxHeight + yZero);
7910 this.ctx.lineTo(xPart + boxWidth + xZero, boxHeight + yZero);
7914 this.ctx.moveTo(xZero, yZero);
7915 this.ctx.lineTo(xZero, boxHeight + yZero);
7916 this.ctx.moveTo(xZero + totalWidth, yZero);
7917 this.ctx.lineTo(xZero + totalWidth, boxHeight + yZero);
7919 this.ctx.strokeStyle = beforeStyle;
7920 return this.ctx.lineWidth = beforeWidth;
7922 _getPrevNextSelection: function(model) {
7923 var mNextSel, mPrevSel, modelNext, modelPrev;
7924 modelPrev = model.collection.prev(model);
7925 modelNext = model.collection.next(model);
7926 if (modelPrev != null) {
7927 mPrevSel = this._getSelection(modelPrev);
7929 if (modelNext != null) {
7930 mNextSel = this._getSelection(modelNext);
7932 return [mPrevSel, mNextSel];
7938 },{"./CanvasCharCache":97,"backbone-childs":3,"biojs-util-colorschemes":29,"jbone":50,"mouse-pos":51,"underscore":59}],99:[function(require,module,exports){
7939 var OverviewBox, colorSelector, jbone, mouse, selection, view, _;
7941 view = require("backbone-viewj");
7943 mouse = require("mouse-pos");
7945 selection = require("../g/selection/Selection");
7947 colorSelector = require("biojs-util-colorschemes").selector;
7949 jbone = require("jbone");
7951 _ = require("underscore");
7953 module.exports = OverviewBox = view.extend({
7954 className: "biojs_msa_overviewbox",
7956 initialize: function(data) {
7958 this.listenTo(this.g.zoomer, "change:boxRectWidth change:boxRectHeight", this.render);
7959 this.listenTo(this.g.selcol, "add reset change", this.render);
7960 this.listenTo(this.g.columns, "change:hidden", this.render);
7961 this.listenTo(this.g.colorscheme, "change:showLowerCase", this.render);
7962 this.listenTo(this.model, "change", _.debounce(this.render, 5));
7963 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
7964 this.listenTo(this.g.colorscheme, "change:scheme", function() {
7965 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
7966 return this.render();
7968 return this.dragStart = [];
7972 mousedown: "_onmousedown"
7974 render: function() {
7975 var c, color, hidden, i, j, rectHeight, rectWidth, seq, showLowerCase, x, y, _i, _j, _ref, _ref1;
7976 this._createCanvas();
7977 this.el.textContent = "overview";
7978 this.ctx.fillStyle = "#999999";
7979 this.ctx.fillRect(0, 0, this.el.width, this.el.height);
7980 rectWidth = this.g.zoomer.get("boxRectWidth");
7981 rectHeight = this.g.zoomer.get("boxRectHeight");
7982 hidden = this.g.columns.get("hidden");
7983 showLowerCase = this.g.colorscheme.get("showLowerCase");
7985 for (i = _i = 0, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
7986 seq = this.model.at(i).get("seq");
7989 if (this.model.at(i).get("hidden")) {
7990 console.log(this.model.at(i).get("hidden"));
7991 this.ctx.fillStyle = "grey";
7992 this.ctx.fillRect(0, y, seq.length * rectWidth, rectHeight);
7995 for (j = _j = 0, _ref1 = seq.length - 1; _j <= _ref1; j = _j += 1) {
7997 if (showLowerCase) {
7998 c = c.toUpperCase();
8000 color = this.color[c];
8001 if (hidden.indexOf(j) >= 0) {
8004 if (color != null) {
8005 this.ctx.fillStyle = color;
8006 this.ctx.fillRect(x, y, rectWidth, rectHeight);
8011 return this._drawSelection();
8013 _drawSelection: function() {
8014 var i, maxHeight, pos, rectHeight, rectWidth, sel, seq, _i, _ref;
8015 if (this.dragStart.length > 0 && !this.prolongSelection) {
8018 rectWidth = this.g.zoomer.get("boxRectWidth");
8019 rectHeight = this.g.zoomer.get("boxRectHeight");
8020 maxHeight = rectHeight * this.model.length;
8021 this.ctx.fillStyle = "#ffff00";
8022 this.ctx.globalAlpha = 0.9;
8023 for (i = _i = 0, _ref = this.g.selcol.length - 1; _i <= _ref; i = _i += 1) {
8024 sel = this.g.selcol.at(i);
8025 if (sel.get('type') === 'column') {
8026 this.ctx.fillRect(rectWidth * sel.get('xStart'), 0, rectWidth * (sel.get('xEnd') - sel.get('xStart') + 1), maxHeight);
8027 } else if (sel.get('type') === 'row') {
8028 seq = (this.model.filter(function(el) {
8029 return el.get('id') === sel.get('seqId');
8031 pos = this.model.indexOf(seq);
8032 this.ctx.fillRect(0, rectHeight * pos, rectWidth * seq.get('seq').length, rectHeight);
8033 } else if (sel.get('type') === 'pos') {
8034 seq = (this.model.filter(function(el) {
8035 return el.get('id') === sel.get('seqId');
8037 pos = this.model.indexOf(seq);
8038 this.ctx.fillRect(rectWidth * sel.get('xStart'), rectHeight * pos, rectWidth * (sel.get('xEnd') - sel.get('xStart') + 1), rectHeight);
8041 return this.ctx.globalAlpha = 1;
8043 _onclick: function(evt) {
8044 return this.g.trigger("meta:click", {
8045 seqId: this.model.get("id", {
8050 _onmousemove: function(e) {
8052 if (this.dragStart.length === 0) {
8056 this.ctx.fillStyle = "#ffff00";
8057 this.ctx.globalAlpha = 0.9;
8058 rect = this._calcSelection(mouse.abs(e));
8059 this.ctx.fillRect(rect[0][0], rect[1][0], rect[0][1] - rect[0][0], rect[1][1] - rect[1][0]);
8061 return e.stopPropagation();
8063 _onmousedown: function(e) {
8064 this.dragStart = mouse.abs(e);
8065 this.dragStartRel = mouse.rel(e);
8066 if (e.ctrlKey || e.metaKey) {
8067 this.prolongSelection = true;
8069 this.prolongSelection = false;
8071 jbone(document.body).on('mousemove.overmove', (function(_this) {
8072 return function(e) {
8073 return _this._onmousemove(e);
8076 jbone(document.body).on('mouseup.overup', (function(_this) {
8077 return function(e) {
8078 return _this._onmouseup(e);
8081 return this.dragStart;
8083 _calcSelection: function(dragMove) {
8084 var dragRel, i, rect, _i, _j;
8085 dragRel = [dragMove[0] - this.dragStart[0], dragMove[1] - this.dragStart[1]];
8086 for (i = _i = 0; _i <= 1; i = _i += 1) {
8087 dragRel[i] = this.dragStartRel[i] + dragRel[i];
8089 rect = [[this.dragStartRel[0], dragRel[0]], [this.dragStartRel[1], dragRel[1]]];
8090 for (i = _j = 0; _j <= 1; i = _j += 1) {
8091 if (rect[i][1] < rect[i][0]) {
8092 rect[i] = [rect[i][1], rect[i][0]];
8094 rect[i][0] = Math.max(rect[i][0], 0);
8098 _endSelection: function(dragEnd) {
8099 var args, i, j, rect, selis, _i, _j, _k, _ref, _ref1;
8100 jbone(document.body).off('.overmove');
8101 jbone(document.body).off('.overup');
8102 if (this.dragStart.length === 0) {
8105 rect = this._calcSelection(dragEnd);
8106 for (i = _i = 0; _i <= 1; i = ++_i) {
8107 rect[0][i] = Math.floor(rect[0][i] / this.g.zoomer.get("boxRectWidth"));
8109 for (i = _j = 0; _j <= 1; i = ++_j) {
8110 rect[1][i] = Math.floor(rect[1][i] / this.g.zoomer.get("boxRectHeight"));
8112 rect[0][1] = Math.min(this.model.getMaxLength() - 1, rect[0][1]);
8113 rect[1][1] = Math.min(this.model.length - 1, rect[1][1]);
8115 for (j = _k = _ref = rect[1][0], _ref1 = rect[1][1]; _k <= _ref1; j = _k += 1) {
8117 seqId: this.model.at(j).get('id'),
8121 selis.push(new selection.possel(args));
8123 this.dragStart = [];
8124 if (this.prolongSelection) {
8125 this.g.selcol.add(selis);
8127 this.g.selcol.reset(selis);
8129 this.g.zoomer.setLeftOffset(rect[0][0]);
8130 return this.g.zoomer.setTopOffset(rect[1][0]);
8132 _onmouseup: function(e) {
8133 return this._endSelection(mouse.abs(e));
8135 _onmouseout: function(e) {
8136 return this._endSelection(mouse.abs(e));
8138 _createCanvas: function() {
8139 var rectHeight, rectWidth;
8140 rectWidth = this.g.zoomer.get("boxRectWidth");
8141 rectHeight = this.g.zoomer.get("boxRectHeight");
8142 this.el.height = this.model.length * rectHeight;
8143 this.el.width = this.model.getMaxLength() * rectWidth;
8144 this.ctx = this.el.getContext("2d");
8145 this.el.style.overflow = "scroll";
8146 return this.el.style.cursor = "crosshair";
8152 },{"../g/selection/Selection":67,"backbone-viewj":10,"biojs-util-colorschemes":29,"jbone":50,"mouse-pos":51,"underscore":59}],100:[function(require,module,exports){
8153 var AlignmentBody, HeaderBlock, OverviewBox, boneView, identityCalc, _;
8155 boneView = require("backbone-childs");
8157 AlignmentBody = require("./AlignmentBody");
8159 HeaderBlock = require("./header/HeaderBlock");
8161 OverviewBox = require("./OverviewBox");
8163 identityCalc = require("../algo/identityCalc");
8165 _ = require('underscore');
8167 module.exports = boneView.extend({
8168 initialize: function(data) {
8171 this.listenTo(this.model, "reset", function() {
8172 this.isNotDirty = false;
8173 return this.rerender();
8175 this.listenTo(this.model, "change:hidden", _.debounce(this.rerender, 10));
8176 this.listenTo(this.model, "sort", this.rerender);
8177 this.listenTo(this.model, "add", function() {
8178 return console.log("seq add");
8180 this.listenTo(this.g.vis, "change:sequences", this.rerender);
8181 this.listenTo(this.g.vis, "change:overviewbox", this.rerender);
8182 return this.listenTo(this.g.visorder, "change", this.rerender);
8185 var body, consensus, headerblock, overviewbox;
8187 if (!this.isNotDirty) {
8188 consensus = this.g.consensus.getConsensus(this.model);
8189 identityCalc(this.model, consensus);
8190 this.isNotDirty = true;
8192 if (this.g.vis.get("overviewbox")) {
8193 overviewbox = new OverviewBox({
8197 overviewbox.ordering = this.g.visorder.get('overviewBox');
8198 this.addView("overviewbox", overviewbox);
8201 headerblock = new HeaderBlock({
8205 headerblock.ordering = this.g.visorder.get('headerBox');
8206 this.addView("headerblock", headerblock);
8208 body = new AlignmentBody({
8212 body.ordering = this.g.visorder.get('alignmentBody');
8213 return this.addView("body", body);
8215 render: function() {
8216 this.renderSubviews();
8217 this.el.className = "biojs_msa_stage";
8220 rerender: function() {
8222 return this.render();
8228 },{"../algo/identityCalc":61,"./AlignmentBody":96,"./OverviewBox":99,"./header/HeaderBlock":102,"backbone-childs":3,"underscore":59}],101:[function(require,module,exports){
8229 var ConservationView, dom, svg, view;
8231 view = require("backbone-viewj");
8233 dom = require("dom-helper");
8235 svg = require("../../utils/svg");
8237 ConservationView = view.extend({
8238 className: "biojs_msa_conserv",
8239 initialize: function(data) {
8241 this.listenTo(this.g.zoomer, "change:stepSize change:labelWidth change:columnWidth", this.render);
8242 this.listenTo(this.g.vis, "change:labels change:metacell", this.render);
8243 this.listenTo(this.g.columns, "change:scaling", this.render);
8244 this.listenTo(this.model, "reset", this.render);
8245 return this.manageEvents();
8247 render: function() {
8248 var avgHeight, cellWidth, height, hidden, i, maxHeight, n, nMax, rect, s, stepSize, width, x, _i, _ref;
8249 this.g.columns.calcConservation(this.model);
8250 dom.removeAllChilds(this.el);
8251 nMax = this.model.getMaxLength();
8252 cellWidth = this.g.zoomer.get("columnWidth");
8254 width = cellWidth * (nMax - this.g.columns.get('hidden').length);
8255 console.log(this.g.columns.get('hidden'));
8260 s.style.display = "inline-block";
8261 s.style.cursor = "pointer";
8262 stepSize = this.g.zoomer.get("stepSize");
8263 hidden = this.g.columns.get("hidden");
8267 if (hidden.indexOf(n) >= 0) {
8271 width = cellWidth * stepSize;
8273 for (i = _i = 0, _ref = stepSize - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
8274 avgHeight += this.g.columns.get("conserv")[n];
8276 height = maxHeight * (avgHeight / stepSize);
8279 y: maxHeight - height,
8280 width: width - cellWidth / 4,
8282 style: "stroke:red;stroke-width:1;"
8285 s.appendChild(rect);
8289 this.el.appendChild(s);
8292 _onclick: function(evt) {
8293 var i, rowPos, stepSize, _i, _ref, _results;
8294 rowPos = evt.target.rowPos;
8295 stepSize = this.g.zoomer.get("stepSize");
8297 for (i = _i = 0, _ref = stepSize - 1; _i <= _ref; i = _i += 1) {
8298 _results.push(this.g.trigger("bar:click", {
8305 manageEvents: function() {
8308 if (this.g.config.get("registerMouseClicks")) {
8309 events.click = "_onclick";
8311 if (this.g.config.get("registerMouseHover")) {
8312 events.mousein = "_onmousein";
8313 events.mouseout = "_onmouseout";
8315 this.delegateEvents(events);
8316 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8317 return this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8319 _onmousein: function(evt) {
8321 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8322 return this.g.trigger("bar:mousein", {
8327 _onmouseout: function(evt) {
8329 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8330 return this.g.trigger("bar:mouseout", {
8337 module.exports = ConservationView;
8341 },{"../../utils/svg":95,"backbone-viewj":10,"dom-helper":49}],102:[function(require,module,exports){
8342 var ConservationView, MarkerView, boneView, identityCalc, _;
8344 MarkerView = require("./MarkerView");
8346 ConservationView = require("./ConservationView");
8348 identityCalc = require("../../algo/identityCalc");
8350 boneView = require("backbone-childs");
8352 _ = require('underscore');
8354 module.exports = boneView.extend({
8355 initialize: function(data) {
8357 this.blockEvents = false;
8358 this.listenTo(this.g.vis, "change:markers change:conserv", function() {
8360 return this.render();
8362 this.listenTo(this.g.vis, "change", this._setSpacer);
8363 this.listenTo(this.g.zoomer, "change:alignmentWidth", function() {
8364 return this._adjustWidth();
8366 this.listenTo(this.g.zoomer, "change:_alignmentScrollLeft", this._adjustScrollingLeft);
8367 this.listenTo(this.g.columns, "change:hidden", function() {
8369 return this.render();
8372 this._onscroll = this._sendScrollEvent;
8373 return this.g.vis.once('change:loaded', this._adjustScrollingLeft, this);
8376 "scroll": "_onscroll"
8379 var consensus, conserv, marker;
8381 if (!this.isNotDirty) {
8382 consensus = this.g.consensus.getConsensus(this.model);
8383 identityCalc(this.model, consensus);
8384 this.isNotDirty = true;
8386 if (this.g.vis.get("conserv")) {
8387 conserv = new ConservationView({
8391 conserv.ordering = -20;
8392 this.addView("conserv", conserv);
8394 if (this.g.vis.get("markers")) {
8395 marker = new MarkerView({
8399 marker.ordering = -10;
8400 return this.addView("marker", marker);
8403 render: function() {
8404 this.renderSubviews();
8406 this.el.className = "biojs_msa_header";
8407 this.el.style.overflowX = "auto";
8408 this._adjustWidth();
8409 this._adjustScrollingLeft();
8412 _sendScrollEvent: function() {
8413 if (!this.blockEvents) {
8414 this.g.zoomer.set("_alignmentScrollLeft", this.el.scrollLeft, {
8418 return this.blockEvents = false;
8420 _adjustScrollingLeft: function(model, value, options) {
8422 if (((options != null ? options.origin : void 0) == null) || options.origin !== "header") {
8423 scrollLeft = this.g.zoomer.get("_alignmentScrollLeft");
8424 this.blockEvents = true;
8425 return this.el.scrollLeft = scrollLeft;
8428 _setSpacer: function() {
8429 return this.el.style.marginLeft = this._getLabelWidth() + "px";
8431 _getLabelWidth: function() {
8434 if (this.g.vis.get("labels")) {
8435 paddingLeft += this.g.zoomer.get("labelWidth");
8437 if (this.g.vis.get("metacell")) {
8438 paddingLeft += this.g.zoomer.get("metaWidth");
8442 _adjustWidth: function() {
8443 return this.el.style.width = this.g.zoomer.get("alignmentWidth") + "px";
8449 },{"../../algo/identityCalc":61,"./ConservationView":101,"./MarkerView":103,"backbone-childs":3,"underscore":59}],103:[function(require,module,exports){
8450 var HeaderView, dom, jbone, svg, view;
8452 view = require("backbone-viewj");
8454 dom = require("dom-helper");
8456 svg = require("../../utils/svg");
8458 jbone = require("jbone");
8460 HeaderView = view.extend({
8461 className: "biojs_msa_marker",
8462 initialize: function(data) {
8464 this.listenTo(this.g.zoomer, "change:stepSize change:labelWidth change:columnWidth change:markerStepSize change:markerFontsize", this.render);
8465 this.listenTo(this.g.vis, "change:labels change:metacell", this.render);
8466 return this.manageEvents();
8468 render: function() {
8469 var cellWidth, container, hidden, n, nMax, span, stepSize;
8470 dom.removeAllChilds(this.el);
8471 this.el.style.fontSize = this.g.zoomer.get("markerFontsize");
8472 container = document.createElement("span");
8474 cellWidth = this.g.zoomer.get("columnWidth");
8475 nMax = this.model.getMaxLength();
8476 stepSize = this.g.zoomer.get("stepSize");
8477 hidden = this.g.columns.get("hidden");
8479 if (hidden.indexOf(n) >= 0) {
8480 this.markerHidden(span, n, stepSize);
8484 span = document.createElement("span");
8485 span.style.width = (cellWidth * stepSize) + "px";
8486 span.style.display = "inline-block";
8487 if ((n + 1) % this.g.zoomer.get('markerStepSize') === 0) {
8488 span.textContent = n + 1;
8490 span.textContent = ".";
8494 container.appendChild(span);
8496 this.el.appendChild(container);
8499 markerHidden: function(span, n, stepSize) {
8500 var hidden, index, j, length, min, nMax, prevHidden, s, triangle, _i, _j;
8501 hidden = this.g.columns.get("hidden").slice(0);
8502 min = Math.max(0, n - stepSize);
8504 for (j = _i = min; _i <= n; j = _i += 1) {
8505 prevHidden &= hidden.indexOf(j) >= 0;
8510 nMax = this.model.getMaxLength();
8513 for (n = _j = n; _j <= nMax; n = _j += 1) {
8514 if (!(index >= 0)) {
8515 index = hidden.indexOf(n);
8517 if (hidden.indexOf(n) >= 0) {
8527 s.style.position = "relative";
8528 triangle = svg.polygon({
8529 points: "0,0 5,5 10,0",
8530 style: "fill:lime;stroke:purple;stroke-width:1"
8532 jbone(triangle).on("click", (function(_this) {
8533 return function(evt) {
8534 hidden.splice(index, length);
8535 return _this.g.columns.set("hidden", hidden);
8538 s.appendChild(triangle);
8539 span.appendChild(s);
8542 manageEvents: function() {
8545 if (this.g.config.get("registerMouseClicks")) {
8546 events.click = "_onclick";
8548 if (this.g.config.get("registerMouseHover")) {
8549 events.mousein = "_onmousein";
8550 events.mouseout = "_onmouseout";
8552 this.delegateEvents(events);
8553 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8554 return this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8556 _onclick: function(evt) {
8557 var rowPos, stepSize;
8558 rowPos = evt.target.rowPos;
8559 stepSize = this.g.zoomer.get("stepSize");
8560 return this.g.trigger("column:click", {
8566 _onmousein: function(evt) {
8567 var rowPos, stepSize;
8568 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8569 stepSize = this.g.zoomer.get("stepSize");
8570 return this.g.trigger("column:mousein", {
8576 _onmouseout: function(evt) {
8577 var rowPos, stepSize;
8578 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8579 stepSize = this.g.zoomer.get("stepSize");
8580 return this.g.trigger("column:mouseout", {
8588 module.exports = HeaderView;
8592 },{"../../utils/svg":95,"backbone-viewj":10,"dom-helper":49,"jbone":50}],104:[function(require,module,exports){
8593 var LabelRowView, boneView;
8595 LabelRowView = require("./LabelRowView");
8597 boneView = require("backbone-childs");
8599 module.exports = boneView.extend({
8600 initialize: function(data) {
8603 this.listenTo(this.g.zoomer, "change:_alignmentScrollTop", this._adjustScrollingTop);
8604 return this.g.vis.once('change:loaded', this._adjustScrollingTop, this);
8607 var i, view, _i, _ref, _results;
8610 for (i = _i = 0, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
8611 if (this.model.at(i).get('hidden')) {
8614 view = new LabelRowView({
8615 model: this.model.at(i),
8619 _results.push(this.addView("row_" + i, view));
8624 "scroll": "_sendScrollEvent"
8626 _sendScrollEvent: function() {
8627 return this.g.zoomer.set("_alignmentScrollTop", this.el.scrollTop, {
8631 _adjustScrollingTop: function() {
8632 return this.el.scrollTop = this.g.zoomer.get("_alignmentScrollTop");
8634 render: function() {
8635 this.renderSubviews();
8636 this.el.className = "biojs_msa_labelblock";
8637 this.el.style.display = "inline-block";
8638 this.el.style.verticalAlign = "top";
8639 this.el.style.height = this.g.zoomer.get("alignmentHeight") + "px";
8640 this.el.style.overflowY = "auto";
8641 this.el.style.overflowX = "hidden";
8642 this.el.style.fontSize = "" + (this.g.zoomer.get("labelFontsize"));
8643 this.el.style.lineHeight = "" + (this.g.zoomer.get("labelLineHeight"));
8650 },{"./LabelRowView":105,"backbone-childs":3}],105:[function(require,module,exports){
8651 var LabelView, MetaView, boneView;
8653 boneView = require("backbone-childs");
8655 LabelView = require("./LabelView");
8657 MetaView = require("./MetaView");
8659 module.exports = boneView.extend({
8660 initialize: function(data) {
8663 this.listenTo(this.g.vis, "change:labels", this.drawR);
8664 return this.listenTo(this.g.vis, "change:metacell", this.drawR);
8668 if (this.g.vis.get("labels")) {
8669 this.addView("labels", new LabelView({
8674 if (this.g.vis.get("metacell")) {
8675 return this.addView("metacell", new MetaView({
8683 return this.render();
8685 render: function() {
8686 this.renderSubviews();
8687 this.el.setAttribute("class", "biojs_msa_labelrow");
8688 this.el.style.height = this.g.zoomer.get("rowHeight");
8695 },{"./LabelView":106,"./MetaView":107,"backbone-childs":3}],106:[function(require,module,exports){
8696 var LabelView, dom, view;
8698 view = require("backbone-viewj");
8700 dom = require("dom-helper");
8702 LabelView = view.extend({
8703 initialize: function(data) {
8704 this.seq = data.seq;
8706 return this.manageEvents();
8708 manageEvents: function() {
8711 if (this.g.config.get("registerMouseClicks")) {
8712 events.click = "_onclick";
8714 if (this.g.config.get("registerMouseHover")) {
8715 events.mousein = "_onmousein";
8716 events.mouseout = "_onmouseout";
8718 this.delegateEvents(events);
8719 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8720 this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8721 this.listenTo(this.g.vis, "change:labelName", this.render);
8722 this.listenTo(this.g.vis, "change:labelId", this.render);
8723 this.listenTo(this.g.vis, "change:labelPartition", this.render);
8724 return this.listenTo(this.g.vis, "change:labelCheckbox", this.render);
8726 render: function() {
8727 var checkBox, id, name, part;
8728 dom.removeAllChilds(this.el);
8729 this.el.style.width = "" + (this.g.zoomer.get("labelWidth")) + "px";
8730 this.el.style.height = "" + (this.g.zoomer.get("rowHeight")) + "px";
8731 this.el.setAttribute("class", "biojs_msa_labels");
8732 if (this.g.vis.get("labelCheckbox")) {
8733 checkBox = document.createElement("input");
8734 checkBox.setAttribute("type", "checkbox");
8735 checkBox.value = this.model.get('id');
8736 checkBox.name = "seq";
8737 this.el.appendChild(checkBox);
8739 if (this.g.vis.get("labelId")) {
8740 id = document.createElement("span");
8741 id.textContent = this.model.get("id");
8742 id.style.width = this.g.zoomer.get("labelIdLength");
8743 id.style.display = "inline-block";
8744 this.el.appendChild(id);
8746 if (this.g.vis.get("labelPartition")) {
8747 part = document.createElement("span");
8748 part.style.width = 15;
8749 part.textContent = this.model.get("partition");
8750 part.style.display = "inline-block";
8751 this.el.appendChild(id);
8752 this.el.appendChild(part);
8754 if (this.g.vis.get("labelName")) {
8755 name = document.createElement("span");
8756 name.textContent = this.model.get("name");
8757 this.el.appendChild(name);
8759 this.el.style.overflow = scroll;
8762 _onclick: function(evt) {
8764 seqId = this.model.get("id");
8765 return this.g.trigger("row:click", {
8770 _onmousein: function(evt) {
8772 seqId = this.model.get("id");
8773 return this.g.trigger("row:mouseout", {
8778 _onmouseout: function(evt) {
8780 seqId = this.model.get("id");
8781 return this.g.trigger("row:mouseout", {
8788 module.exports = LabelView;
8792 },{"backbone-viewj":10,"dom-helper":49}],107:[function(require,module,exports){
8793 var MenuBuilder, MetaView, dom, view, _;
8795 view = require("backbone-viewj");
8797 MenuBuilder = require("../../menu/menubuilder");
8799 _ = require('underscore');
8801 dom = require("dom-helper");
8803 module.exports = MetaView = view.extend({
8804 className: "biojs_msa_metaview",
8805 initialize: function(data) {
8806 return this.g = data.g;
8810 mousein: "_onmousein",
8811 mouseout: "_onmouseout"
8813 render: function() {
8814 var gapSpan, gaps, ident, identSpan, menu, seq, width;
8815 dom.removeAllChilds(this.el);
8816 this.el.style.display = "inline-block";
8817 width = this.g.zoomer.get("metaWidth");
8818 this.el.style.width = width - 5;
8819 this.el.style.paddingRight = 5;
8820 seq = this.model.get('seq');
8821 gaps = _.reduce(seq, (function(memo, c) {
8827 gaps = (gaps / seq.length).toFixed(1);
8828 gapSpan = document.createElement('span');
8829 gapSpan.textContent = gaps;
8830 gapSpan.style.display = "inline-block";
8831 gapSpan.style.width = 35;
8832 this.el.appendChild(gapSpan);
8833 ident = this.model.get('identity');
8834 identSpan = document.createElement('span');
8835 identSpan.textContent = ident.toFixed(2);
8836 identSpan.style.display = "inline-block";
8837 identSpan.style.width = 40;
8838 this.el.appendChild(identSpan);
8839 menu = new MenuBuilder("↗");
8840 menu.addNode("Uniprot", (function(_this) {
8841 return function(e) {
8842 return window.open("http://beta.uniprot.org/uniprot/Q7T2N8");
8845 this.el.appendChild(menu.buildDOM());
8847 this.el.style.height = "" + (this.g.zoomer.get("rowHeight")) + "px";
8848 return this.el.style.cursor = "pointer";
8850 _onclick: function(evt) {
8851 return this.g.trigger("meta:click", {
8852 seqId: this.model.get("id", {
8857 _onmousein: function(evt) {
8858 return this.g.trigger("meta:mousein", {
8859 seqId: this.model.get("id", {
8864 _onmouseout: function(evt) {
8865 return this.g.trigger("meta:mouseout", {
8866 seqId: this.model.get("id", {
8875 },{"../../menu/menubuilder":75,"backbone-viewj":10,"dom-helper":49,"underscore":59}],"biojs-io-clustal":[function(require,module,exports){
8876 // Generated by CoffeeScript 1.8.0
8877 var Clustal, GenericReader, Seq, Str,
8878 __hasProp = {}.hasOwnProperty,
8879 __extends = 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; };
8881 Str = require("./strings");
8883 GenericReader = require("./generic_reader");
8885 Seq = require("./seq");
8887 module.exports = Clustal = (function(_super) {
8888 __extends(Clustal, _super);
8890 function Clustal() {
8891 return Clustal.__super__.constructor.apply(this, arguments);
8894 Clustal.parse = function(text) {
8895 var blockstate, k, label, line, lines, match, regex, seqCounter, seqs, sequence;
8897 if (Object.prototype.toString.call(text) === '[object Array]') {
8900 lines = text.split("\n");
8902 if (lines[0].slice(0, 6) === !"CLUSTAL") {
8903 throw new Error("Invalid CLUSTAL Header");
8908 while (k < lines.length) {
8911 if ((line == null) || line.length === 0) {
8915 if (line.trim().length === 0) {
8919 if (Str.contains(line, "*")) {
8922 if (blockstate === 1) {
8926 regex = /^(?:\s*)(\S+)(?:\s+)(\S+)(?:\s*)(\d*)(?:\s*|$)/g;
8927 match = regex.exec(line);
8928 if (match != null) {
8930 sequence = match[2];
8931 if (seqCounter >= seqs.length) {
8932 seqs.push(new Seq(sequence, label, seqCounter));
8934 seqs[seqCounter].seq += sequence;
8949 },{"./generic_reader":17,"./seq":18,"./strings":19}],"biojs-io-fasta":[function(require,module,exports){
8950 // Generated by CoffeeScript 1.8.0
8951 module.exports.parse = require("./parser");
8953 module.exports.writer = require("./writer");
8955 },{"./parser":21,"./writer":24}],"biojs-vis-msa":[function(require,module,exports){
8956 if (typeof biojs === 'undefined') {
8959 if (typeof biojs.vis === 'undefined') {
8962 // use two namespaces
8963 window.msa = biojs.vis.msa = module.exports = require('./index');
8965 // TODO: how should this be bundled
8967 if (typeof biojs.io === 'undefined') {
8970 // just bundle the two parsers
8971 window.biojs.io.fasta = require("biojs-io-fasta");
8972 window.biojs.io.clustal = require("biojs-io-clustal");
8973 window.biojs.xhr = require("nets");
8975 // simulate standalone flag
8976 window.biojsVisMsa = window.msa;
8978 require('./build/msa.css');
8980 },{"./build/msa.css":1,"./index":2,"biojs-io-clustal":undefined,"biojs-io-fasta":undefined,"nets":undefined}],"nets":[function(require,module,exports){
8981 var req = require('request')
8983 module.exports = Nets
8985 function Nets(uri, opts, cb) {
8988 },{"request":52}]},{},["biojs-vis-msa"])
8989 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9idWlsZC9tc2EuY3NzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2EvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtY2hpbGRzL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2JhY2tib25lLXRoaW4vY29sbGVjdGlvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iYWNrYm9uZS10aGluL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2JhY2tib25lLXRoaW4vbW9kZWwuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtdGhpbi9ub2RlX21vZHVsZXMvYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUvYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtdGhpbi9ub2RlX21vZHVsZXMvYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtdGhpbi9ub2RlX21vZHVsZXMvYmFja2JvbmUtZXh0ZW5kLXN0YW5kYWxvbmUvYmFja2JvbmUtZXh0ZW5kLXN0YW5kYWxvbmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtdmlld2ovaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtZXZlbnRzL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWNsdXN0YWwvbGliL2dlbmVyaWNfcmVhZGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWNsdXN0YWwvbGliL3NlcS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy1pby1jbHVzdGFsL2xpYi9zdHJpbmdzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWZhc3RhL2xpYi9wYXJzZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtaW8tZmFzdGEvbGliL3V0aWxzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWZhc3RhL2xpYi93cml0ZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtaW8tZmFzdGEvbm9kZV9tb2R1bGVzL2Jpb2pzLW1vZGVsL3NyYy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy1pby1mYXN0YS9ub2RlX21vZHVsZXMvYmlvanMtbW9kZWwvc3JjL3NlcS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9zcmMvYnVyaWVkLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy9jaW5lbWEuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL2NsdXN0YWwuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL2NsdXN0YWwyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy9oZWxpeC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9zcmMvaHlkcm9waG9iaWNpdHkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy9sZXNrLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy9tYWUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL251Y2xlb3RpZGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL3B1cmluZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9zcmMvc2VsZWN0b3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL3N0cmFuZC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9zcmMvdGF5bG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy90dXJuLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy96YXBwby5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9ibHVlaW1wX2NhbnZhc3RvYmxvYi9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9icm93c2VyLXNhdmVhcy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9jc3NpZnkvYnJvd3Nlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9kb20taGVscGVyL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2pib25lL2Rpc3QvamJvbmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvbW91c2UtcG9zL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL25ldHMvbm9kZV9tb2R1bGVzL3hoci9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9uZXRzL25vZGVfbW9kdWxlcy94aHIvbm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvbmV0cy9ub2RlX21vZHVsZXMveGhyL25vZGVfbW9kdWxlcy9vbmNlL29uY2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvbmV0cy9ub2RlX21vZHVsZXMveGhyL25vZGVfbW9kdWxlcy9wYXJzZS1oZWFkZXJzL25vZGVfbW9kdWxlcy9mb3ItZWFjaC9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9uZXRzL25vZGVfbW9kdWxlcy94aHIvbm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvbm9kZV9tb2R1bGVzL2Zvci1lYWNoL25vZGVfbW9kdWxlcy9pcy1mdW5jdGlvbi9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9uZXRzL25vZGVfbW9kdWxlcy94aHIvbm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvbm9kZV9tb2R1bGVzL3RyaW0vaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvbmV0cy9ub2RlX21vZHVsZXMveGhyL25vZGVfbW9kdWxlcy9wYXJzZS1oZWFkZXJzL3BhcnNlLWhlYWRlcnMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvdW5kZXJzY29yZS91bmRlcnNjb3JlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2FsZ28vQ29uc2Vuc3VzQ2FsYy5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvYWxnby9pZGVudGl0eUNhbGMuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2FsZ28vaW5kZXguY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2cvY29sb3JhdG9yLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9nL2NvbHVtbnMuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2cvY29uZmlnLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9nL2NvbnNlbnN1cy5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvZy9zZWxlY3Rpb24vU2VsZWN0aW9uLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9nL3NlbGVjdGlvbi9TZWxlY3Rpb25Db2wuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2cvdmlzT3JkZXJpbmcuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2cvdmlzaWJpbGl0eS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvZy96b29tZXIuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2luZGV4LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L2RlZmF1bHRtZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L2luZGV4LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L21lbnVidWlsZGVyLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL0NvbG9yTWVudS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbWVudS92aWV3cy9FeHBvcnRNZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL0V4dHJhTWVudS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbWVudS92aWV3cy9GaWx0ZXJNZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL0hlbHBNZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL0ltcG9ydE1lbnUuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL21lbnUvdmlld3MvT3JkZXJpbmdNZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL1NlbGVjdGlvbk1lbnUuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL21lbnUvdmlld3MvVmlzTWVudS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbW9kZWwvRmVhdHVyZS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbW9kZWwvRmVhdHVyZUNvbC5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbW9kZWwvU2VxQ29sbGVjdGlvbi5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbW9kZWwvU2VxdWVuY2UuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL21vZGVsL2luZGV4LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tc2EuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3V0aWxzL2JtYXRoLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy91dGlscy9pbmRleC5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdXRpbHMvcHJveHkuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3V0aWxzL3NlcWdlbi5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdXRpbHMvc3ZnLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9BbGlnbm1lbnRCb2R5LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9DYW52YXNDaGFyQ2FjaGUuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3ZpZXdzL0NhbnZhc1NlcUJsb2NrLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9PdmVydmlld0JveC5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdmlld3MvU3RhZ2UuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3ZpZXdzL2hlYWRlci9Db25zZXJ2YXRpb25WaWV3LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9oZWFkZXIvSGVhZGVyQmxvY2suY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3ZpZXdzL2hlYWRlci9NYXJrZXJWaWV3LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9sYWJlbHMvTGFiZWxCbG9jay5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdmlld3MvbGFiZWxzL0xhYmVsUm93Vmlldy5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdmlld3MvbGFiZWxzL0xhYmVsVmlldy5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdmlld3MvbGFiZWxzL01ldGFWaWV3LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy1pby1jbHVzdGFsL2xpYi9jbHVzdGFsLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWZhc3RhL2xpYi9pbmRleC5qcyIsIi4vYnJvd3NlciIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9uZXRzL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7O0FDQUE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclJBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUMvS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDTkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3gxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2NENBLElBQUEsQ0FBQTs7QUFBQSxDQUFBLEdBQUksT0FBQSxDQUFRLFlBQVIsQ0FBSixDQUFBOztBQUFBLE1BSU0sQ0FBQyxPQUFQLEdBQWlCLFNBQUMsSUFBRCxHQUFBO0FBRWYsTUFBQSxJQUFBO0FBQUEs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Q0FyRFo7QUFBQSxFQXdEQSxXQUFBLEVBQWEsU0FBQyxHQUFELEdBQUE7V0FDWCxJQUFDLENBQUEsQ0FBQyxDQUFDLE9BQUgsQ0FBVyxlQUFYLEVBQTRCO0FBQUEsTUFBQyxLQUFBLEVBQU8sSUFBQyxDQUFBLEtBQUssQ0FBQyxHQUFQLENBQVcsSUFBWCxFQUFpQjtBQUFBLFFBQUEsR0FBQSxFQUFJLEdBQUo7T0FBakIsQ0FBUjtLQUE1QixFQURXO0VBQUEsQ0F4RGI7Q0FGMEIsQ0FMNUIsQ0FBQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsInZhciBjc3MgPSBcIi5iaW9qc19tc2Ffc3RhZ2Uge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsgfVxcblxcbi5iaW9qc19tc2FfbGFiZWxzIHtcXG4gIGNvbG9yOiBibGFjaztcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9XFxuXFxuLmJpb2pzX21zYV9zZXFibG9jayB7XFxuICBjdXJzb3I6IG1vdmU7IH1cXG5cXG4uYmlvanNfbXNhX2xheWVyIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfVxcblxcbi5iaW9qc19tc2FfbGFiZWxibG9jazo6LXdlYmtpdC1zY3JvbGxiYXIsIC5iaW9qc19tc2FfaGVhZGVyOjotd2Via2l0LXNjcm9sbGJhciB7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICB3aWR0aDogN3B4O1xcbiAgaGVpZ2h0OiA3cHg7IH1cXG5cXG4uYmlvanNfbXNhX2xhYmVsYmxvY2s6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLCAuYmlvanNfbXNhX2hlYWRlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xcbiAgYm94LXNoYWRvdzogMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7IH1cXG5cXG4uYmlvanNfbXNhX21hcmtlciB7XFxuICBjb2xvcjogZ3JleTtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBjdXJzb3I6IHBvaW50ZXI7IH1cXG5cXG4uYmlvanNfbXNhX21hcmtlciBzcGFuIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjsgfVxcblxcbi5iaW9qc19tc2FfbWVudWJhciAuYmlvanNfbXNhX21lbnViYXJfYWxpbmsge1xcbiAgYmFja2dyb3VuZDogIzM0OThkYjtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzM0OThkYiwgIzI5ODBiOSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICMzNDk4ZGIsICMyOTgwYjkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICMzNDk4ZGIsICMyOTgwYjkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgIzM0OThkYiwgIzI5ODBiOSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMzQ5OGRiLCAjMjk4MGI5KTtcXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMjg7XFxuICAtbW96LWJvcmRlci1yYWRpdXM6IDI4O1xcbiAgYm9yZGVyLXJhZGl1czogMjhweDtcXG4gIGZvbnQtZmFtaWx5OiBBcmlhbDtcXG4gIGNvbG9yOiAjZmZmZmZmO1xcbiAgcGFkZGluZzogM3B4IDEwcHggM3B4IDEwcHg7XFxuICBtYXJnaW4tbGVmdDogMTBweDtcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfVxcblxcbi5iaW9qc19tc2FfbWVudWJhciAuYmlvanNfbXNhX21lbnViYXJfYWxpbms6aG92ZXIge1xcbiAgY3Vyc29yOiBwb2ludGVyOyB9XFxuXFxuLyoganF1ZXJ5IGRyb3Bkb3duIENTUyAqL1xcbi5kcm9wZG93biB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB6LWluZGV4OiA5OTk5OTk5O1xcbiAgZGlzcGxheTogbm9uZTsgfVxcblxcbi5kcm9wZG93biAuZHJvcGRvd24tbWVudSxcXG4uZHJvcGRvd24gLmRyb3Bkb3duLXBhbmVsIHtcXG4gIG1pbi13aWR0aDogMTYwcHg7XFxuICBtYXgtd2lkdGg6IDM2MHB4O1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG4gIGJhY2tncm91bmQ6ICNGRkY7XFxuICBib3JkZXI6IHNvbGlkIDFweCAjREREO1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxuICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gIHBhZGRpbmc6IDRweCAwO1xcbiAgbWFyZ2luOiAwOyB9XFxuXFxuLmRyb3Bkb3duIC5kcm9wZG93bi1wYW5lbCB7XFxuICBwYWRkaW5nOiAxMHB4OyB9XFxuXFxuLmRyb3Bkb3duLmRyb3Bkb3duLXNjcm9sbCAuZHJvcGRvd24tbWVudSxcXG4uZHJvcGRvd24uZHJvcGRvd24tc2Nyb2xsIC5kcm9wZG93bi1wYW5lbCB7XFxuICBtYXgtaGVpZ2h0OiAzNThweDtcXG4gIG92ZXJmbG93OiBhdXRvOyB9XFxuXFxuLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IExJIHtcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxuICBwYWRkaW5nOiAwIDA7XFxuICBtYXJnaW46IDA7XFxuICBsaW5lLWhlaWdodDogMThweDsgfVxcblxcbi5kcm9wZG93biAuZHJvcGRvd24tbWVudSBMSSxcXG4uZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUgTEFCRUwge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBjb2xvcjogIzU1NTtcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gIGxpbmUtaGVpZ2h0OiAxOHB4O1xcbiAgcGFkZGluZzogM3B4IDE1cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XFxuXFxuLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IExJOmhvdmVyLFxcbi5kcm9wZG93biAuZHJvcGRvd24tbWVudSBMQUJFTDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDhDO1xcbiAgY29sb3I6ICNGRkY7XFxuICBjdXJzb3I6IHBvaW50ZXI7IH1cXG5cXG4uZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWRpdmlkZXIge1xcbiAgZm9udC1zaXplOiAxcHg7XFxuICBib3JkZXItdG9wOiBzb2xpZCAxcHggI0U1RTVFNTtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDVweCAwOyB9XFxuXCI7IChyZXF1aXJlKFwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Nzc2lmeVwiKSkoY3NzKTsgbW9kdWxlLmV4cG9ydHMgPSBjc3M7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9zcmMvaW5kZXhcIik7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoJ3VuZGVyc2NvcmUnKTtcbnZhciB2aWV3VHlwZSA9IHJlcXVpcmUoXCJiYWNrYm9uZS12aWV3alwiKTtcbnZhciBwbHVnaW5hdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBsdWdpbmF0b3IgPSB2aWV3VHlwZS5leHRlbmQoe1xuICByZW5kZXJTdWJ2aWV3czogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9sZEVsID0gdGhpcy5lbDtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuc2V0RWxlbWVudChlbCk7XG4gICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgaWYgKG9sZEVsLnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgb2xkRWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5lbCwgb2xkRWwpO1xuICAgIH1cbiAgICB2YXIgdmlld3MgPSB0aGlzLl92aWV3cygpO1xuICAgIHZhciB2aWV3c1NvcnRlZCA9IF8uc29ydEJ5KHZpZXdzLCBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIGVsLm9yZGVyaW5nO1xuICAgIH0pO1xuICAgIHZhciB2aWV3LCBub2RlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgIHZpZXdzU29ydGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2aWV3ID0gdmlld3NTb3J0ZWRbaV07XG4gICAgICB2aWV3LnJlbmRlcigpO1xuICAgICAgbm9kZSA9IHZpZXcuZWw7XG4gICAgICBpZiAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsLmFwcGVuZENoaWxkKGZyYWcpO1xuICAgIHJldHVybiBlbDtcbiAgfSxcbiAgYWRkVmlldzogZnVuY3Rpb24oa2V5LCB2aWV3KSB7XG4gICAgdmFyIHZpZXdzID0gdGhpcy5fdmlld3MoKTtcbiAgICBpZiAodmlldyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkludmFsaWQgcGx1Z2luLiBcIjtcbiAgICB9XG4gICAgaWYgKHZpZXcub3JkZXJpbmcgPT0gbnVsbCkge1xuICAgICAgdmlldy5vcmRlcmluZyA9IGtleTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdzW2tleV0gPSB2aWV3O1xuICB9LFxuICByZW1vdmVWaWV3czogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsLCBrZXk7XG4gICAgdmFyIHZpZXdzID0gdGhpcy5fdmlld3MoKTtcbiAgICBmb3IgKGtleSBpbiB2aWV3cykge1xuICAgICAgZWwgPSB2aWV3c1trZXldO1xuICAgICAgZWwudW5kZWxlZ2F0ZUV2ZW50cygpO1xuICAgICAgZWwudW5iaW5kKCk7XG4gICAgICBpZiAoZWwucmVtb3ZlVmlld3MgIT0gbnVsbCkge1xuICAgICAgICBlbC5yZW1vdmVWaWV3cygpO1xuICAgICAgfVxuICAgICAgZWwucmVtb3ZlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZXdzID0ge307XG4gIH0sXG4gIHJlbW92ZVZpZXc6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciB2aWV3cyA9IHRoaXMuX3ZpZXdzKCk7XG4gICAgdmlld3Nba2V5XS5yZW1vdmUoKTtcbiAgICByZXR1cm4gZGVsZXRlIHZpZXdzW2tleV07XG4gIH0sXG4gIGdldFZpZXc6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciB2aWV3cyA9IHRoaXMuX3ZpZXdzKCk7XG4gICAgcmV0dXJuIHZpZXdzW2tleV07XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVWaWV3cygpO1xuICAgIHJldHVybiB2aWV3VHlwZS5wcm90b3R5cGUucmVtb3ZlLmFwcGx5KHRoaXMpO1xuICB9LFxuICBfdmlld3M6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnZpZXdzID09IG51bGwpIHtcbiAgICAgIHRoaXMudmlld3MgPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlld3M7XG4gIH1cbn0pO1xuIiwiLy8gICAgIEJhY2tib25lLmpzIDEuMS4yXG5cbi8vICAgICAoYykgMjAxMC0yMDE0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4vLyAgICAgQmFja2JvbmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vLyAgICAgRm9yIGFsbCBkZXRhaWxzIGFuZCBkb2N1bWVudGF0aW9uOlxuLy8gICAgIGh0dHA6Ly9iYWNrYm9uZWpzLm9yZ1xuXG52YXIgRXZlbnRzID0gcmVxdWlyZShcImJhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lXCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCJiYWNrYm9uZS1leHRlbmQtc3RhbmRhbG9uZVwiKTtcbnZhciBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XG52YXIgTW9kZWwgPSByZXF1aXJlKFwiLi9tb2RlbFwiKTtcblxuLy8gQ3JlYXRlIGxvY2FsIHJlZmVyZW5jZXMgdG8gYXJyYXkgbWV0aG9kcyB3ZSdsbCB3YW50IHRvIHVzZSBsYXRlci5cbnZhciBhcnJheSA9IFtdO1xudmFyIHNsaWNlID0gYXJyYXkuc2xpY2U7XG5cbi8vIEJhY2tib25lLkNvbGxlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSWYgbW9kZWxzIHRlbmQgdG8gcmVwcmVzZW50IGEgc2luZ2xlIHJvdyBvZiBkYXRhLCBhIEJhY2tib25lIENvbGxlY3Rpb24gaXNcbi8vIG1vcmUgYW5hbG9nb3VzIHRvIGEgdGFibGUgZnVsbCBvZiBkYXRhIC4uLiBvciBhIHNtYWxsIHNsaWNlIG9yIHBhZ2Ugb2YgdGhhdFxuLy8gdGFibGUsIG9yIGEgY29sbGVjdGlvbiBvZiByb3dzIHRoYXQgYmVsb25nIHRvZ2V0aGVyIGZvciBhIHBhcnRpY3VsYXIgcmVhc29uXG4vLyAtLSBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoaXMgcGFydGljdWxhciBmb2xkZXIsIGFsbCBvZiB0aGUgZG9jdW1lbnRzXG4vLyBiZWxvbmdpbmcgdG8gdGhpcyBwYXJ0aWN1bGFyIGF1dGhvciwgYW5kIHNvIG9uLiBDb2xsZWN0aW9ucyBtYWludGFpblxuLy8gaW5kZXhlcyBvZiB0aGVpciBtb2RlbHMsIGJvdGggaW4gb3JkZXIsIGFuZCBmb3IgbG9va3VwIGJ5IGBpZGAuXG5cbi8vIENyZWF0ZSBhIG5ldyAqKkNvbGxlY3Rpb24qKiwgcGVyaGFwcyB0byBjb250YWluIGEgc3BlY2lmaWMgdHlwZSBvZiBgbW9kZWxgLlxuLy8gSWYgYSBgY29tcGFyYXRvcmAgaXMgc3BlY2lmaWVkLCB0aGUgQ29sbGVjdGlvbiB3aWxsIG1haW50YWluXG4vLyBpdHMgbW9kZWxzIGluIHNvcnQgb3JkZXIsIGFzIHRoZXkncmUgYWRkZWQgYW5kIHJlbW92ZWQuXG52YXIgQ29sbGVjdGlvbiA9IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICBpZiAob3B0aW9ucy5tb2RlbCkgdGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG4gIGlmIChvcHRpb25zLmNvbXBhcmF0b3IgIT09IHZvaWQgMCkgdGhpcy5jb21wYXJhdG9yID0gb3B0aW9ucy5jb21wYXJhdG9yO1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgaWYgKG1vZGVscykgdGhpcy5yZXNldChtb2RlbHMsIF8uZXh0ZW5kKHtzaWxlbnQ6IHRydWV9LCBvcHRpb25zKSk7XG59O1xuXG4vLyBEZWZhdWx0IG9wdGlvbnMgZm9yIGBDb2xsZWN0aW9uI3NldGAuXG52YXIgc2V0T3B0aW9ucyA9IHthZGQ6IHRydWUsIHJlbW92ZTogdHJ1ZSwgbWVyZ2U6IHRydWV9O1xudmFyIGFkZE9wdGlvbnMgPSB7YWRkOiB0cnVlLCByZW1vdmU6IGZhbHNlfTtcblxuLy8gRGVmaW5lIHRoZSBDb2xsZWN0aW9uJ3MgaW5oZXJpdGFibGUgbWV0aG9kcy5cbl8uZXh0ZW5kKENvbGxlY3Rpb24ucHJvdG90eXBlLCBFdmVudHMsIHtcblxuICAvLyBUaGUgZGVmYXVsdCBtb2RlbCBmb3IgYSBjb2xsZWN0aW9uIGlzIGp1c3QgYSAqKkJhY2tib25lLk1vZGVsKiouXG4gIC8vIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gbW9zdCBjYXNlcy5cbiAgbW9kZWw6IE1vZGVsLFxuXG4gIC8vIEluaXRpYWxpemUgaXMgYW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdC4gT3ZlcnJpZGUgaXQgd2l0aCB5b3VyIG93blxuICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LFxuXG4gICAgLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBDb2xsZWN0aW9uIGlzIGFuIGFycmF5IG9mIHRoZVxuICAgIC8vIG1vZGVscycgYXR0cmlidXRlcy5cbiAgdG9KU09OOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG1vZGVsKXsgcmV0dXJuIG1vZGVsLnRvSlNPTihvcHRpb25zKTsgfSk7XG4gIH0sXG5cbiAgICAvLyBQcm94eSBgQmFja2JvbmUuc3luY2AgYnkgZGVmYXVsdC5cbiAgc3luYzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEJhY2tib25lLnN5bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSxcblxuICAgIC8vIEFkZCBhIG1vZGVsLCBvciBsaXN0IG9mIG1vZGVscyB0byB0aGUgc2V0LlxuICBhZGQ6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldChtb2RlbHMsIF8uZXh0ZW5kKHttZXJnZTogZmFsc2V9LCBvcHRpb25zLCBhZGRPcHRpb25zKSk7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgYSBtb2RlbCwgb3IgYSBsaXN0IG9mIG1vZGVscyBmcm9tIHRoZSBzZXQuXG4gIHJlbW92ZTogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG4gICAgdmFyIHNpbmd1bGFyID0gIV8uaXNBcnJheShtb2RlbHMpO1xuICAgIG1vZGVscyA9IHNpbmd1bGFyID8gW21vZGVsc10gOiBfLmNsb25lKG1vZGVscyk7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gbW9kZWxzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbW9kZWwgPSBtb2RlbHNbaV0gPSB0aGlzLmdldChtb2RlbHNbaV0pO1xuICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgICBpZiAoaWQgIT0gbnVsbCkgZGVsZXRlIHRoaXMuX2J5SWRbaWRdO1xuICAgICAgZGVsZXRlIHRoaXMuX2J5SWRbbW9kZWwuY2lkXTtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihtb2RlbCk7XG4gICAgICB0aGlzLm1vZGVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5sZW5ndGgtLTtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgb3B0aW9ucy5pbmRleCA9IGluZGV4O1xuICAgICAgICBtb2RlbC50cmlnZ2VyKCdyZW1vdmUnLCBtb2RlbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZW1vdmVSZWZlcmVuY2UobW9kZWwsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ3VsYXIgPyBtb2RlbHNbMF0gOiBtb2RlbHM7XG4gIH0sXG5cbiAgICAvLyBVcGRhdGUgYSBjb2xsZWN0aW9uIGJ5IGBzZXRgLWluZyBhIG5ldyBsaXN0IG9mIG1vZGVscywgYWRkaW5nIG5ldyBvbmVzLFxuICAgIC8vIHJlbW92aW5nIG1vZGVscyB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudCwgYW5kIG1lcmdpbmcgbW9kZWxzIHRoYXRcbiAgICAvLyBhbHJlYWR5IGV4aXN0IGluIHRoZSBjb2xsZWN0aW9uLCBhcyBuZWNlc3NhcnkuIFNpbWlsYXIgdG8gKipNb2RlbCNzZXQqKixcbiAgICAvLyB0aGUgY29yZSBvcGVyYXRpb24gZm9yIHVwZGF0aW5nIHRoZSBkYXRhIGNvbnRhaW5lZCBieSB0aGUgY29sbGVjdGlvbi5cbiAgc2V0OiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gXy5kZWZhdWx0cyh7fSwgb3B0aW9ucywgc2V0T3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMucGFyc2UpIG1vZGVscyA9IHRoaXMucGFyc2UobW9kZWxzLCBvcHRpb25zKTtcbiAgICB2YXIgc2luZ3VsYXIgPSAhXy5pc0FycmF5KG1vZGVscyk7XG4gICAgbW9kZWxzID0gc2luZ3VsYXIgPyAobW9kZWxzID8gW21vZGVsc10gOiBbXSkgOiBtb2RlbHMuc2xpY2UoKTtcbiAgICB2YXIgaWQsIG1vZGVsLCBhdHRycywgZXhpc3RpbmcsIHNvcnQ7XG4gICAgdmFyIGF0ID0gb3B0aW9ucy5hdDtcbiAgICB2YXIgc29ydGFibGUgPSB0aGlzLmNvbXBhcmF0b3IgJiYgKGF0ID09IG51bGwpICYmIG9wdGlvbnMuc29ydCAhPT0gZmFsc2U7XG4gICAgdmFyIHNvcnRBdHRyID0gXy5pc1N0cmluZyh0aGlzLmNvbXBhcmF0b3IpID8gdGhpcy5jb21wYXJhdG9yIDogbnVsbDtcbiAgICB2YXIgdG9BZGQgPSBbXSwgdG9SZW1vdmUgPSBbXSwgbW9kZWxNYXAgPSB7fTtcbiAgICB2YXIgYWRkID0gb3B0aW9ucy5hZGQsIG1lcmdlID0gb3B0aW9ucy5tZXJnZSwgcmVtb3ZlID0gb3B0aW9ucy5yZW1vdmU7XG4gICAgdmFyIG9yZGVyID0gIXNvcnRhYmxlICYmIGFkZCAmJiByZW1vdmUgPyBbXSA6IGZhbHNlO1xuXG4gICAgLy8gVHVybiBiYXJlIG9iamVjdHMgaW50byBtb2RlbCByZWZlcmVuY2VzLCBhbmQgcHJldmVudCBpbnZhbGlkIG1vZGVsc1xuICAgIC8vIGZyb20gYmVpbmcgYWRkZWQuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IG1vZGVscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgYXR0cnMgPSBtb2RlbHNbaV07XG5cbiAgICAgIC8vIElmIGEgZHVwbGljYXRlIGlzIGZvdW5kLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgYWRkZWQgYW5kXG4gICAgICAvLyBvcHRpb25hbGx5IG1lcmdlIGl0IGludG8gdGhlIGV4aXN0aW5nIG1vZGVsLlxuICAgICAgaWYgKGV4aXN0aW5nID0gdGhpcy5nZXQoYXR0cnMpKSB7XG4gICAgICAgIGlmIChyZW1vdmUpIG1vZGVsTWFwW2V4aXN0aW5nLmNpZF0gPSB0cnVlO1xuICAgICAgICBpZiAobWVyZ2UgJiYgYXR0cnMgIT09IGV4aXN0aW5nKSB7XG4gICAgICAgICAgYXR0cnMgPSB0aGlzLl9pc01vZGVsKGF0dHJzKSA/IGF0dHJzLmF0dHJpYnV0ZXMgOiBhdHRycztcbiAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkgYXR0cnMgPSBleGlzdGluZy5wYXJzZShhdHRycywgb3B0aW9ucyk7XG4gICAgICAgICAgZXhpc3Rpbmcuc2V0KGF0dHJzLCBvcHRpb25zKTtcbiAgICAgICAgICBpZiAoc29ydGFibGUgJiYgIXNvcnQgJiYgZXhpc3RpbmcuaGFzQ2hhbmdlZChzb3J0QXR0cikpIHNvcnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG1vZGVsc1tpXSA9IGV4aXN0aW5nO1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBuZXcsIHZhbGlkIG1vZGVsLCBwdXNoIGl0IHRvIHRoZSBgdG9BZGRgIGxpc3QuXG4gICAgICB9IGVsc2UgaWYgKGFkZCkge1xuICAgICAgICBtb2RlbCA9IG1vZGVsc1tpXSA9IHRoaXMuX3ByZXBhcmVNb2RlbChhdHRycywgb3B0aW9ucyk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICB0b0FkZC5wdXNoKG1vZGVsKTtcbiAgICAgICAgdGhpcy5fYWRkUmVmZXJlbmNlKG1vZGVsLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgLy8gRG8gbm90IGFkZCBtdWx0aXBsZSBtb2RlbHMgd2l0aCB0aGUgc2FtZSBgaWRgLlxuICAgICAgbW9kZWwgPSBleGlzdGluZyB8fCBtb2RlbDtcbiAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgICBpZiAob3JkZXIgJiYgKG1vZGVsLmlzTmV3KCkgfHwgIW1vZGVsTWFwW2lkXSkpIG9yZGVyLnB1c2gobW9kZWwpO1xuICAgICAgbW9kZWxNYXBbaWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbm9uZXhpc3RlbnQgbW9kZWxzIGlmIGFwcHJvcHJpYXRlLlxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghbW9kZWxNYXBbKG1vZGVsID0gdGhpcy5tb2RlbHNbaV0pLmNpZF0pIHRvUmVtb3ZlLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgICAgaWYgKHRvUmVtb3ZlLmxlbmd0aCkgdGhpcy5yZW1vdmUodG9SZW1vdmUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIFNlZSBpZiBzb3J0aW5nIGlzIG5lZWRlZCwgdXBkYXRlIGBsZW5ndGhgIGFuZCBzcGxpY2UgaW4gbmV3IG1vZGVscy5cbiAgICBpZiAodG9BZGQubGVuZ3RoIHx8IChvcmRlciAmJiBvcmRlci5sZW5ndGgpKSB7XG4gICAgICBpZiAoc29ydGFibGUpIHNvcnQgPSB0cnVlO1xuICAgICAgdGhpcy5sZW5ndGggKz0gdG9BZGQubGVuZ3RoO1xuICAgICAgaWYgKGF0ICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRvQWRkLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbHMuc3BsaWNlKGF0ICsgaSwgMCwgdG9BZGRbaV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JkZXIpIHRoaXMubW9kZWxzLmxlbmd0aCA9IDA7XG4gICAgICAgIHZhciBvcmRlcmVkTW9kZWxzID0gb3JkZXIgfHwgdG9BZGQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBvcmRlcmVkTW9kZWxzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbHMucHVzaChvcmRlcmVkTW9kZWxzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNpbGVudGx5IHNvcnQgdGhlIGNvbGxlY3Rpb24gaWYgYXBwcm9wcmlhdGUuXG4gICAgaWYgKHNvcnQpIHRoaXMuc29ydCh7c2lsZW50OiB0cnVlfSk7XG5cbiAgICAvLyBVbmxlc3Mgc2lsZW5jZWQsIGl0J3MgdGltZSB0byBmaXJlIGFsbCBhcHByb3ByaWF0ZSBhZGQvc29ydCBldmVudHMuXG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgdmFyIGFkZE9wdHMgPSBhdCAhPSBudWxsID8gXy5jbG9uZShvcHRpb25zKSA6IG9wdGlvbnM7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdG9BZGQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGF0ICE9IG51bGwpIGFkZE9wdHMuaW5kZXggPSBhdCArIGk7XG4gICAgICAgIChtb2RlbCA9IHRvQWRkW2ldKS50cmlnZ2VyKCdhZGQnLCBtb2RlbCwgdGhpcywgYWRkT3B0cyk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydCB8fCAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSkgdGhpcy50cmlnZ2VyKCdzb3J0JywgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBhZGRlZCAob3IgbWVyZ2VkKSBtb2RlbCAob3IgbW9kZWxzKS5cbiAgICByZXR1cm4gc2luZ3VsYXIgPyBtb2RlbHNbMF0gOiBtb2RlbHM7XG4gIH0sXG5cbiAgICAvLyBXaGVuIHlvdSBoYXZlIG1vcmUgaXRlbXMgdGhhbiB5b3Ugd2FudCB0byBhZGQgb3IgcmVtb3ZlIGluZGl2aWR1YWxseSxcbiAgICAvLyB5b3UgY2FuIHJlc2V0IHRoZSBlbnRpcmUgc2V0IHdpdGggYSBuZXcgbGlzdCBvZiBtb2RlbHMsIHdpdGhvdXQgZmlyaW5nXG4gICAgLy8gYW55IGdyYW51bGFyIGBhZGRgIG9yIGByZW1vdmVgIGV2ZW50cy4gRmlyZXMgYHJlc2V0YCB3aGVuIGZpbmlzaGVkLlxuICAgIC8vIFVzZWZ1bCBmb3IgYnVsayBvcGVyYXRpb25zIGFuZCBvcHRpbWl6YXRpb25zLlxuICByZXNldDogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy5tb2RlbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX3JlbW92ZVJlZmVyZW5jZSh0aGlzLm1vZGVsc1tpXSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIG9wdGlvbnMucHJldmlvdXNNb2RlbHMgPSB0aGlzLm1vZGVscztcbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIG1vZGVscyA9IHRoaXMuYWRkKG1vZGVscywgXy5leHRlbmQoe3NpbGVudDogdHJ1ZX0sIG9wdGlvbnMpKTtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLnRyaWdnZXIoJ3Jlc2V0JywgdGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfSxcblxuICAgIC8vIEFkZCBhIG1vZGVsIHRvIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gIHB1c2g6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKG1vZGVsLCBfLmV4dGVuZCh7YXQ6IHRoaXMubGVuZ3RofSwgb3B0aW9ucykpO1xuICB9LFxuXG4gICAgLy8gUmVtb3ZlIGEgbW9kZWwgZnJvbSB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLlxuICBwb3A6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLmF0KHRoaXMubGVuZ3RoIC0gMSk7XG4gICAgdGhpcy5yZW1vdmUobW9kZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfSxcblxuICAgIC8vIEFkZCBhIG1vZGVsIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24uXG4gIHVuc2hpZnQ6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKG1vZGVsLCBfLmV4dGVuZCh7YXQ6IDB9LCBvcHRpb25zKSk7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgYSBtb2RlbCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24uXG4gIHNoaWZ0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIG1vZGVsID0gdGhpcy5hdCgwKTtcbiAgICB0aGlzLnJlbW92ZShtb2RlbCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9LFxuXG4gICAgLy8gU2xpY2Ugb3V0IGEgc3ViLWFycmF5IG9mIG1vZGVscyBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICBzbGljZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNsaWNlLmFwcGx5KHRoaXMubW9kZWxzLCBhcmd1bWVudHMpO1xuICB9LFxuXG4gICAgLy8gR2V0IGEgbW9kZWwgZnJvbSB0aGUgc2V0IGJ5IGlkLlxuICBnZXQ6IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDtcbiAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQodGhpcy5faXNNb2RlbChvYmopID8gb2JqLmF0dHJpYnV0ZXMgOiBvYmopO1xuICAgIHJldHVybiB0aGlzLl9ieUlkW29ial0gfHwgdGhpcy5fYnlJZFtpZF0gfHwgdGhpcy5fYnlJZFtvYmouY2lkXTtcbiAgfSxcblxuICAgIC8vIEdldCB0aGUgbW9kZWwgYXQgdGhlIGdpdmVuIGluZGV4LlxuICBhdDogZnVuY3Rpb24oaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPCAwKSBpbmRleCArPSB0aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHNbaW5kZXhdO1xuICB9LFxuXG4gICAgLy8gUmV0dXJuIG1vZGVscyB3aXRoIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIFVzZWZ1bCBmb3Igc2ltcGxlIGNhc2VzIG9mXG4gICAgLy8gYGZpbHRlcmAuXG4gIHdoZXJlOiBmdW5jdGlvbihhdHRycywgZmlyc3QpIHtcbiAgICBpZiAoXy5pc0VtcHR5KGF0dHJzKSkgcmV0dXJuIGZpcnN0ID8gdm9pZCAwIDogW107XG4gICAgcmV0dXJuIHRoaXNbZmlyc3QgPyAnZmluZCcgOiAnZmlsdGVyJ10oZnVuY3Rpb24obW9kZWwpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoYXR0cnNba2V5XSAhPT0gbW9kZWwuZ2V0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9LFxuXG4gICAgLy8gUmV0dXJuIHRoZSBmaXJzdCBtb2RlbCB3aXRoIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIFVzZWZ1bCBmb3Igc2ltcGxlIGNhc2VzXG4gICAgLy8gb2YgYGZpbmRgLlxuICBmaW5kV2hlcmU6IGZ1bmN0aW9uKGF0dHJzKSB7XG4gICAgcmV0dXJuIHRoaXMud2hlcmUoYXR0cnMsIHRydWUpO1xuICB9LFxuXG4gICAgLy8gRm9yY2UgdGhlIGNvbGxlY3Rpb24gdG8gcmUtc29ydCBpdHNlbGYuIFlvdSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyB1bmRlclxuICAgIC8vIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBhcyB0aGUgc2V0IHdpbGwgbWFpbnRhaW4gc29ydCBvcmRlciBhcyBlYWNoIGl0ZW1cbiAgICAvLyBpcyBhZGRlZC5cbiAgc29ydDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghdGhpcy5jb21wYXJhdG9yKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzb3J0IGEgc2V0IHdpdGhvdXQgYSBjb21wYXJhdG9yJyk7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgIC8vIFJ1biBzb3J0IGJhc2VkIG9uIHR5cGUgb2YgYGNvbXBhcmF0b3JgLlxuICAgIGlmIChfLmlzU3RyaW5nKHRoaXMuY29tcGFyYXRvcikgfHwgdGhpcy5jb21wYXJhdG9yLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRCeSh0aGlzLmNvbXBhcmF0b3IsIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGVscy5zb3J0KF8uYmluZCh0aGlzLmNvbXBhcmF0b3IsIHRoaXMpKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLnRyaWdnZXIoJ3NvcnQnLCB0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAgIC8vIFBsdWNrIGFuIGF0dHJpYnV0ZSBmcm9tIGVhY2ggbW9kZWwgaW4gdGhlIGNvbGxlY3Rpb24uXG4gIHBsdWNrOiBmdW5jdGlvbihhdHRyKSB7XG4gICAgcmV0dXJuIF8uaW52b2tlKHRoaXMubW9kZWxzLCAnZ2V0JywgYXR0cik7XG4gIH0sXG5cbiAgICAvLyBGZXRjaCB0aGUgZGVmYXVsdCBzZXQgb2YgbW9kZWxzIGZvciB0aGlzIGNvbGxlY3Rpb24sIHJlc2V0dGluZyB0aGVcbiAgICAvLyBjb2xsZWN0aW9uIHdoZW4gdGhleSBhcnJpdmUuIElmIGByZXNldDogdHJ1ZWAgaXMgcGFzc2VkLCB0aGUgcmVzcG9uc2VcbiAgICAvLyBkYXRhIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdGhlIGByZXNldGAgbWV0aG9kIGluc3RlYWQgb2YgYHNldGAuXG4gIGZldGNoOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBfLmNsb25lKG9wdGlvbnMpIDoge307XG4gICAgaWYgKG9wdGlvbnMucGFyc2UgPT09IHZvaWQgMCkgb3B0aW9ucy5wYXJzZSA9IHRydWU7XG4gICAgdmFyIHN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSB0aGlzO1xuICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgIHZhciBtZXRob2QgPSBvcHRpb25zLnJlc2V0ID8gJ3Jlc2V0JyA6ICdzZXQnO1xuICAgICAgY29sbGVjdGlvblttZXRob2RdKHJlc3AsIG9wdGlvbnMpO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MoY29sbGVjdGlvbiwgcmVzcCwgb3B0aW9ucyk7XG4gICAgICBjb2xsZWN0aW9uLnRyaWdnZXIoJ3N5bmMnLCBjb2xsZWN0aW9uLCByZXNwLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHdyYXBFcnJvcih0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5zeW5jKCdyZWFkJywgdGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBtb2RlbCBpbiB0aGlzIGNvbGxlY3Rpb24uIEFkZCB0aGUgbW9kZWwgdG8gdGhlXG4gICAgLy8gY29sbGVjdGlvbiBpbW1lZGlhdGVseSwgdW5sZXNzIGB3YWl0OiB0cnVlYCBpcyBwYXNzZWQsIGluIHdoaWNoIGNhc2Ugd2VcbiAgICAvLyB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGFncmVlLlxuICBjcmVhdGU6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBfLmNsb25lKG9wdGlvbnMpIDoge307XG4gICAgaWYgKCEobW9kZWwgPSB0aGlzLl9wcmVwYXJlTW9kZWwobW9kZWwsIG9wdGlvbnMpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghb3B0aW9ucy53YWl0KSB0aGlzLmFkZChtb2RlbCwgb3B0aW9ucyk7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSB0aGlzO1xuICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzO1xuICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKG1vZGVsLCByZXNwKSB7XG4gICAgICBpZiAob3B0aW9ucy53YWl0KSBjb2xsZWN0aW9uLmFkZChtb2RlbCwgb3B0aW9ucyk7XG4gICAgICBpZiAoc3VjY2Vzcykgc3VjY2Vzcyhtb2RlbCwgcmVzcCwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBtb2RlbC5zYXZlKG51bGwsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfSxcblxuICAgIC8vICoqcGFyc2UqKiBjb252ZXJ0cyBhIHJlc3BvbnNlIGludG8gYSBsaXN0IG9mIG1vZGVscyB0byBiZSBhZGRlZCB0byB0aGVcbiAgICAvLyBjb2xsZWN0aW9uLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IHRvIHBhc3MgaXQgdGhyb3VnaC5cbiAgcGFyc2U6IGZ1bmN0aW9uKHJlc3AsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gcmVzcDtcbiAgfSxcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb2xsZWN0aW9uIHdpdGggYW4gaWRlbnRpY2FsIGxpc3Qgb2YgbW9kZWxzIGFzIHRoaXMgb25lLlxuICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubW9kZWxzLCB7XG4gICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgIGNvbXBhcmF0b3I6IHRoaXMuY29tcGFyYXRvclxuICAgIH0pO1xuICB9LFxuXG4gICAgLy8gRGVmaW5lIGhvdyB0byB1bmlxdWVseSBpZGVudGlmeSBtb2RlbHMgaW4gdGhlIGNvbGxlY3Rpb24uXG4gIG1vZGVsSWQ6IGZ1bmN0aW9uIChhdHRycykge1xuICAgIHJldHVybiBhdHRyc1t0aGlzLm1vZGVsLnByb3RvdHlwZS5pZEF0dHJpYnV0ZSB8fCAnaWQnXTtcbiAgfSxcblxuICAgIC8vIFByaXZhdGUgbWV0aG9kIHRvIHJlc2V0IGFsbCBpbnRlcm5hbCBzdGF0ZS4gQ2FsbGVkIHdoZW4gdGhlIGNvbGxlY3Rpb25cbiAgICAvLyBpcyBmaXJzdCBpbml0aWFsaXplZCBvciByZXNldC5cbiAgX3Jlc2V0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5tb2RlbHMgPSBbXTtcbiAgICB0aGlzLl9ieUlkICA9IHt9O1xuICB9LFxuXG4gICAgLy8gUHJlcGFyZSBhIGhhc2ggb2YgYXR0cmlidXRlcyAob3Igb3RoZXIgbW9kZWwpIHRvIGJlIGFkZGVkIHRvIHRoaXNcbiAgICAvLyBjb2xsZWN0aW9uLlxuICBfcHJlcGFyZU1vZGVsOiBmdW5jdGlvbihhdHRycywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc01vZGVsKGF0dHJzKSkge1xuICAgICAgaWYgKCFhdHRycy5jb2xsZWN0aW9uKSBhdHRycy5jb2xsZWN0aW9uID0gdGhpcztcbiAgICAgIHJldHVybiBhdHRycztcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBfLmNsb25lKG9wdGlvbnMpIDoge307XG4gICAgb3B0aW9ucy5jb2xsZWN0aW9uID0gdGhpcztcbiAgICB2YXIgbW9kZWwgPSBuZXcgdGhpcy5tb2RlbChhdHRycywgb3B0aW9ucyk7XG4gICAgaWYgKCFtb2RlbC52YWxpZGF0aW9uRXJyb3IpIHJldHVybiBtb2RlbDtcbiAgICB0aGlzLnRyaWdnZXIoJ2ludmFsaWQnLCB0aGlzLCBtb2RlbC52YWxpZGF0aW9uRXJyb3IsIG9wdGlvbnMpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAgIC8vIE1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBvYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBtb2RlbCBmb3JcbiAgICAvLyB0aGUgcHVycG9zZXMgb2YgYWRkaW5nIHRvIHRoZSBjb2xsZWN0aW9uLlxuICBfaXNNb2RlbDogZnVuY3Rpb24gKG1vZGVsKSB7XG4gICAgcmV0dXJuIG1vZGVsIGluc3RhbmNlb2YgTW9kZWw7XG4gIH0sXG5cbiAgICAvLyBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIGEgbW9kZWwncyB0aWVzIHRvIGEgY29sbGVjdGlvbi5cbiAgX2FkZFJlZmVyZW5jZTogZnVuY3Rpb24obW9kZWwsIG9wdGlvbnMpIHtcbiAgICB0aGlzLl9ieUlkW21vZGVsLmNpZF0gPSBtb2RlbDtcbiAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgaWYgKGlkICE9IG51bGwpIHRoaXMuX2J5SWRbaWRdID0gbW9kZWw7XG4gICAgbW9kZWwub24oJ2FsbCcsIHRoaXMuX29uTW9kZWxFdmVudCwgdGhpcyk7XG4gIH0sXG5cbiAgICAvLyBJbnRlcm5hbCBtZXRob2QgdG8gc2V2ZXIgYSBtb2RlbCdzIHRpZXMgdG8gYSBjb2xsZWN0aW9uLlxuICBfcmVtb3ZlUmVmZXJlbmNlOiBmdW5jdGlvbihtb2RlbCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzID09PSBtb2RlbC5jb2xsZWN0aW9uKSBkZWxldGUgbW9kZWwuY29sbGVjdGlvbjtcbiAgICBtb2RlbC5vZmYoJ2FsbCcsIHRoaXMuX29uTW9kZWxFdmVudCwgdGhpcyk7XG4gIH0sXG5cbiAgICAvLyBJbnRlcm5hbCBtZXRob2QgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBtb2RlbCBpbiB0aGUgc2V0IGZpcmVzIGFuIGV2ZW50LlxuICAgIC8vIFNldHMgbmVlZCB0byB1cGRhdGUgdGhlaXIgaW5kZXhlcyB3aGVuIG1vZGVscyBjaGFuZ2UgaWRzLiBBbGwgb3RoZXJcbiAgICAvLyBldmVudHMgc2ltcGx5IHByb3h5IHRocm91Z2guIFwiYWRkXCIgYW5kIFwicmVtb3ZlXCIgZXZlbnRzIHRoYXQgb3JpZ2luYXRlXG4gICAgLy8gaW4gb3RoZXIgY29sbGVjdGlvbnMgYXJlIGlnbm9yZWQuXG4gIF9vbk1vZGVsRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlbCwgY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICAgIGlmICgoZXZlbnQgPT09ICdhZGQnIHx8IGV2ZW50ID09PSAncmVtb3ZlJykgJiYgY29sbGVjdGlvbiAhPT0gdGhpcykgcmV0dXJuO1xuICAgIGlmIChldmVudCA9PT0gJ2Rlc3Ryb3knKSB0aGlzLnJlbW92ZShtb2RlbCwgb3B0aW9ucyk7XG4gICAgaWYgKGV2ZW50ID09PSAnY2hhbmdlJykge1xuICAgICAgdmFyIHByZXZJZCA9IHRoaXMubW9kZWxJZChtb2RlbC5wcmV2aW91c0F0dHJpYnV0ZXMoKSk7XG4gICAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgICBpZiAocHJldklkICE9PSBpZCkge1xuICAgICAgICBpZiAocHJldklkICE9IG51bGwpIGRlbGV0ZSB0aGlzLl9ieUlkW3ByZXZJZF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB0aGlzLl9ieUlkW2lkXSA9IG1vZGVsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRyaWdnZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG59KTtcblxuLy8gVW5kZXJzY29yZSBtZXRob2RzIHRoYXQgd2Ugd2FudCB0byBpbXBsZW1lbnQgb24gdGhlIENvbGxlY3Rpb24uXG4vLyA5MCUgb2YgdGhlIGNvcmUgdXNlZnVsbmVzcyBvZiBCYWNrYm9uZSBDb2xsZWN0aW9ucyBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZFxuLy8gcmlnaHQgaGVyZTpcbnZhciBtZXRob2RzID0gWydmb3JFYWNoJywgJ2VhY2gnLCAnbWFwJywgJ2NvbGxlY3QnLCAncmVkdWNlJywgJ2ZvbGRsJyxcbiAgICAnaW5qZWN0JywgJ3JlZHVjZVJpZ2h0JywgJ2ZvbGRyJywgJ2ZpbmQnLCAnZGV0ZWN0JywgJ2ZpbHRlcicsICdzZWxlY3QnLFxuICAgICdyZWplY3QnLCAnZXZlcnknLCAnYWxsJywgJ3NvbWUnLCAnYW55JywgJ2luY2x1ZGUnLCAnY29udGFpbnMnLCAnaW52b2tlJyxcbiAgICAnbWF4JywgJ21pbicsICd0b0FycmF5JywgJ3NpemUnLCAnZmlyc3QnLCAnaGVhZCcsICd0YWtlJywgJ2luaXRpYWwnLCAncmVzdCcsXG4gICAgJ3RhaWwnLCAnZHJvcCcsICdsYXN0JywgJ3dpdGhvdXQnLCAnZGlmZmVyZW5jZScsICdpbmRleE9mJywgJ3NodWZmbGUnLFxuICAgICdsYXN0SW5kZXhPZicsICdpc0VtcHR5JywgJ2NoYWluJywgJ3NhbXBsZScsICdwYXJ0aXRpb24nXTtcblxuLy8gTWl4IGluIGVhY2ggVW5kZXJzY29yZSBtZXRob2QgYXMgYSBwcm94eSB0byBgQ29sbGVjdGlvbiNtb2RlbHNgLlxuXy5lYWNoKG1ldGhvZHMsIGZ1bmN0aW9uKG1ldGhvZCkge1xuICBpZiAoIV9bbWV0aG9kXSkgcmV0dXJuO1xuICBDb2xsZWN0aW9uLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMubW9kZWxzKTtcbiAgICByZXR1cm4gX1ttZXRob2RdLmFwcGx5KF8sIGFyZ3MpO1xuICB9O1xufSk7XG5cbi8vIFVuZGVyc2NvcmUgbWV0aG9kcyB0aGF0IHRha2UgYSBwcm9wZXJ0eSBuYW1lIGFzIGFuIGFyZ3VtZW50LlxudmFyIGF0dHJpYnV0ZU1ldGhvZHMgPSBbJ2dyb3VwQnknLCAnY291bnRCeScsICdzb3J0QnknLCAnaW5kZXhCeSddO1xuXG4vLyBVc2UgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIHByb3BlcnRpZXMuXG5fLmVhY2goYXR0cmlidXRlTWV0aG9kcywgZnVuY3Rpb24obWV0aG9kKSB7XG4gIGlmICghX1ttZXRob2RdKSByZXR1cm47XG4gIENvbGxlY3Rpb24ucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih2YWx1ZSwgY29udGV4dCkge1xuICAgIHZhciBpdGVyYXRvciA9IF8uaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZSA6IGZ1bmN0aW9uKG1vZGVsKSB7XG4gICAgICByZXR1cm4gbW9kZWwuZ2V0KHZhbHVlKTtcbiAgICB9O1xuICAgIHJldHVybiBfW21ldGhvZF0odGhpcy5tb2RlbHMsIGl0ZXJhdG9yLCBjb250ZXh0KTtcbiAgfTtcbn0pO1xuXG4vLyBzZXR1cCBpbmhlcml0YW5jZVxuQ29sbGVjdGlvbi5leHRlbmQgPSBleHRlbmQ7XG5tb2R1bGUuZXhwb3J0cyA9IENvbGxlY3Rpb247XG4iLCJtb2R1bGUuZXhwb3J0cy5Nb2RlbCA9IHJlcXVpcmUoXCIuL21vZGVsXCIpO1xubW9kdWxlLmV4cG9ydHMuQ29sbGVjdGlvbiA9IHJlcXVpcmUoXCIuL2NvbGxlY3Rpb25cIik7XG5tb2R1bGUuZXhwb3J0cy5FdmVudHMgPSByZXF1aXJlKFwiYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmVcIik7XG5tb2R1bGUuZXhwb3J0cy5leHRlbmQgPSByZXF1aXJlKFwiYmFja2JvbmUtZXh0ZW5kLXN0YW5kYWxvbmVcIik7XG4iLCIvLyAgICAgQmFja2JvbmUuanMgMS4xLjJcblxuLy8gICAgIChjKSAyMDEwLTIwMTQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbi8vICAgICBCYWNrYm9uZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8vICAgICBGb3IgYWxsIGRldGFpbHMgYW5kIGRvY3VtZW50YXRpb246XG4vLyAgICAgaHR0cDovL2JhY2tib25lanMub3JnXG5cbnZhciBFdmVudHMgPSByZXF1aXJlKFwiYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmVcIik7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcImJhY2tib25lLWV4dGVuZC1zdGFuZGFsb25lXCIpO1xudmFyIF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcblxuLy8gQmFja2JvbmUuTW9kZWxcbi8vIC0tLS0tLS0tLS0tLS0tXG5cbi8vIEJhY2tib25lICoqTW9kZWxzKiogYXJlIHRoZSBiYXNpYyBkYXRhIG9iamVjdCBpbiB0aGUgZnJhbWV3b3JrIC0tXG4vLyBmcmVxdWVudGx5IHJlcHJlc2VudGluZyBhIHJvdyBpbiBhIHRhYmxlIGluIGEgZGF0YWJhc2Ugb24geW91ciBzZXJ2ZXIuXG4vLyBBIGRpc2NyZXRlIGNodW5rIG9mIGRhdGEgYW5kIGEgYnVuY2ggb2YgdXNlZnVsLCByZWxhdGVkIG1ldGhvZHMgZm9yXG4vLyBwZXJmb3JtaW5nIGNvbXB1dGF0aW9ucyBhbmQgdHJhbnNmb3JtYXRpb25zIG9uIHRoYXQgZGF0YS5cblxuLy8gQ3JlYXRlIGEgbmV3IG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzLiBBIGNsaWVudCBpZCAoYGNpZGApXG4vLyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBhbmQgYXNzaWduZWQgZm9yIHlvdS5cbnZhciBNb2RlbCA9IGZ1bmN0aW9uKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgdmFyIGF0dHJzID0gYXR0cmlidXRlcyB8fCB7fTtcbiAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgdGhpcy5jaWQgPSBfLnVuaXF1ZUlkKCdjJyk7XG4gIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICBpZiAob3B0aW9ucy5jb2xsZWN0aW9uKSB0aGlzLmNvbGxlY3Rpb24gPSBvcHRpb25zLmNvbGxlY3Rpb247XG4gIGlmIChvcHRpb25zLnBhcnNlKSBhdHRycyA9IHRoaXMucGFyc2UoYXR0cnMsIG9wdGlvbnMpIHx8IHt9O1xuICBhdHRycyA9IF8uZGVmYXVsdHMoe30sIGF0dHJzLCBfLnJlc3VsdCh0aGlzLCAnZGVmYXVsdHMnKSk7XG4gIHRoaXMuc2V0KGF0dHJzLCBvcHRpb25zKTtcbiAgdGhpcy5jaGFuZ2VkID0ge307XG4gIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuLy8gQXR0YWNoIGFsbCBpbmhlcml0YWJsZSBtZXRob2RzIHRvIHRoZSBNb2RlbCBwcm90b3R5cGUuXG5fLmV4dGVuZChNb2RlbC5wcm90b3R5cGUsIEV2ZW50cywge1xuXG4gIC8vIEEgaGFzaCBvZiBhdHRyaWJ1dGVzIHdob3NlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHZhbHVlIGRpZmZlci5cbiAgY2hhbmdlZDogbnVsbCxcblxuICAvLyBUaGUgdmFsdWUgcmV0dXJuZWQgZHVyaW5nIHRoZSBsYXN0IGZhaWxlZCB2YWxpZGF0aW9uLlxuICB2YWxpZGF0aW9uRXJyb3I6IG51bGwsXG5cbiAgICAvLyBUaGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgSlNPTiBgaWRgIGF0dHJpYnV0ZSBpcyBgXCJpZFwiYC4gTW9uZ29EQiBhbmRcbiAgICAvLyBDb3VjaERCIHVzZXJzIG1heSB3YW50IHRvIHNldCB0aGlzIHRvIGBcIl9pZFwiYC5cbiAgaWRBdHRyaWJ1dGU6ICdpZCcsXG5cbiAgICAvLyBJbml0aWFsaXplIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIGJ5IGRlZmF1bHQuIE92ZXJyaWRlIGl0IHdpdGggeW91ciBvd25cbiAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LFxuXG4gICAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgbW9kZWwncyBgYXR0cmlidXRlc2Agb2JqZWN0LlxuICB0b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gXy5jbG9uZSh0aGlzLmF0dHJpYnV0ZXMpO1xuICB9LFxuXG4gICAgLy8gUHJveHkgYEJhY2tib25lLnN5bmNgIGJ5IGRlZmF1bHQgLS0gYnV0IG92ZXJyaWRlIHRoaXMgaWYgeW91IG5lZWRcbiAgICAvLyBjdXN0b20gc3luY2luZyBzZW1hbnRpY3MgZm9yICp0aGlzKiBwYXJ0aWN1bGFyIG1vZGVsLlxuICBzeW5jOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gQmFja2JvbmUuc3luYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9LFxuXG4gICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gIGdldDogZnVuY3Rpb24oYXR0cikge1xuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbYXR0cl07XG4gIH0sXG5cbiAgICAvLyBHZXQgdGhlIEhUTUwtZXNjYXBlZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gIGVzY2FwZTogZnVuY3Rpb24oYXR0cikge1xuICAgIHJldHVybiBfLmVzY2FwZSh0aGlzLmdldChhdHRyKSk7XG4gIH0sXG5cbiAgICAvLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXR0cmlidXRlIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCBpcyBub3QgbnVsbFxuICAgIC8vIG9yIHVuZGVmaW5lZC5cbiAgaGFzOiBmdW5jdGlvbihhdHRyKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGF0dHIpICE9IG51bGw7XG4gIH0sXG5cbiAgICAvLyBTZXQgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMgb24gdGhlIG9iamVjdCwgZmlyaW5nIGBcImNoYW5nZVwiYC4gVGhpcyBpc1xuICAgIC8vIHRoZSBjb3JlIHByaW1pdGl2ZSBvcGVyYXRpb24gb2YgYSBtb2RlbCwgdXBkYXRpbmcgdGhlIGRhdGEgYW5kIG5vdGlmeWluZ1xuICAgIC8vIGFueW9uZSB3aG8gbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgY2hhbmdlIGluIHN0YXRlLiBUaGUgaGVhcnQgb2YgdGhlIGJlYXN0LlxuICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsLCBvcHRpb25zKSB7XG4gICAgdmFyIGF0dHIsIGF0dHJzLCB1bnNldCwgY2hhbmdlcywgc2lsZW50LCBjaGFuZ2luZywgcHJldiwgY3VycmVudDtcbiAgICBpZiAoa2V5ID09IG51bGwpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gSGFuZGxlIGJvdGggYFwia2V5XCIsIHZhbHVlYCBhbmQgYHtrZXk6IHZhbHVlfWAgLXN0eWxlIGFyZ3VtZW50cy5cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGF0dHJzID0ga2V5O1xuICAgICAgb3B0aW9ucyA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgKGF0dHJzID0ge30pW2tleV0gPSB2YWw7XG4gICAgfVxuXG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgIC8vIFJ1biB2YWxpZGF0aW9uLlxuICAgIGlmICghdGhpcy5fdmFsaWRhdGUoYXR0cnMsIG9wdGlvbnMpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBFeHRyYWN0IGF0dHJpYnV0ZXMgYW5kIG9wdGlvbnMuXG4gICAgdW5zZXQgICAgICAgICAgID0gb3B0aW9ucy51bnNldDtcbiAgICBzaWxlbnQgICAgICAgICAgPSBvcHRpb25zLnNpbGVudDtcbiAgICBjaGFuZ2VzICAgICAgICAgPSBbXTtcbiAgICBjaGFuZ2luZyAgICAgICAgPSB0aGlzLl9jaGFuZ2luZztcbiAgICB0aGlzLl9jaGFuZ2luZyAgPSB0cnVlO1xuXG4gICAgaWYgKCFjaGFuZ2luZykge1xuICAgICAgdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzID0gXy5jbG9uZSh0aGlzLmF0dHJpYnV0ZXMpO1xuICAgICAgdGhpcy5jaGFuZ2VkID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSB0aGlzLmF0dHJpYnV0ZXMsIHByZXYgPSB0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXM7XG5cbiAgICAvLyBDaGVjayBmb3IgY2hhbmdlcyBvZiBgaWRgLlxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlIGluIGF0dHJzKSB0aGlzLmlkID0gYXR0cnNbdGhpcy5pZEF0dHJpYnV0ZV07XG5cbiAgICAvLyBGb3IgZWFjaCBgc2V0YCBhdHRyaWJ1dGUsIHVwZGF0ZSBvciBkZWxldGUgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgZm9yIChhdHRyIGluIGF0dHJzKSB7XG4gICAgICB2YWwgPSBhdHRyc1thdHRyXTtcbiAgICAgIGlmICghXy5pc0VxdWFsKGN1cnJlbnRbYXR0cl0sIHZhbCkpIGNoYW5nZXMucHVzaChhdHRyKTtcbiAgICAgIGlmICghXy5pc0VxdWFsKHByZXZbYXR0cl0sIHZhbCkpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkW2F0dHJdID0gdmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2hhbmdlZFthdHRyXTtcbiAgICAgIH1cbiAgICAgIHVuc2V0ID8gZGVsZXRlIGN1cnJlbnRbYXR0cl0gOiBjdXJyZW50W2F0dHJdID0gdmFsO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgYWxsIHJlbGV2YW50IGF0dHJpYnV0ZSBjaGFuZ2VzLlxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBpZiAoY2hhbmdlcy5sZW5ndGgpIHRoaXMuX3BlbmRpbmcgPSBvcHRpb25zO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGNoYW5nZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2U6JyArIGNoYW5nZXNbaV0sIHRoaXMsIGN1cnJlbnRbY2hhbmdlc1tpXV0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFlvdSBtaWdodCBiZSB3b25kZXJpbmcgd2h5IHRoZXJlJ3MgYSBgd2hpbGVgIGxvb3AgaGVyZS4gQ2hhbmdlcyBjYW5cbiAgICAvLyBiZSByZWN1cnNpdmVseSBuZXN0ZWQgd2l0aGluIGBcImNoYW5nZVwiYCBldmVudHMuXG4gICAgaWYgKGNoYW5naW5nKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgd2hpbGUgKHRoaXMuX3BlbmRpbmcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMuX3BlbmRpbmc7XG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2NoYW5naW5nID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgYW4gYXR0cmlidXRlIGZyb20gdGhlIG1vZGVsLCBmaXJpbmcgYFwiY2hhbmdlXCJgLiBgdW5zZXRgIGlzIGEgbm9vcFxuICAgIC8vIGlmIHRoZSBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdC5cbiAgdW5zZXQ6IGZ1bmN0aW9uKGF0dHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgdm9pZCAwLCBfLmV4dGVuZCh7fSwgb3B0aW9ucywge3Vuc2V0OiB0cnVlfSkpO1xuICB9LFxuXG4gICAgLy8gQ2xlYXIgYWxsIGF0dHJpYnV0ZXMgb24gdGhlIG1vZGVsLCBmaXJpbmcgYFwiY2hhbmdlXCJgLlxuICBjbGVhcjogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBhdHRycyA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmF0dHJpYnV0ZXMpIGF0dHJzW2tleV0gPSB2b2lkIDA7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHJzLCBfLmV4dGVuZCh7fSwgb3B0aW9ucywge3Vuc2V0OiB0cnVlfSkpO1xuICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBgXCJjaGFuZ2VcImAgZXZlbnQuXG4gICAgLy8gSWYgeW91IHNwZWNpZnkgYW4gYXR0cmlidXRlIG5hbWUsIGRldGVybWluZSBpZiB0aGF0IGF0dHJpYnV0ZSBoYXMgY2hhbmdlZC5cbiAgaGFzQ2hhbmdlZDogZnVuY3Rpb24oYXR0cikge1xuICAgIGlmIChhdHRyID09IG51bGwpIHJldHVybiAhXy5pc0VtcHR5KHRoaXMuY2hhbmdlZCk7XG4gICAgcmV0dXJuIF8uaGFzKHRoaXMuY2hhbmdlZCwgYXR0cik7XG4gIH0sXG5cbiAgICAvLyBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBjaGFuZ2VkLCBvclxuICAgIC8vIGZhbHNlIGlmIHRoZXJlIGFyZSBubyBjaGFuZ2VkIGF0dHJpYnV0ZXMuIFVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgd2hhdFxuICAgIC8vIHBhcnRzIG9mIGEgdmlldyBuZWVkIHRvIGJlIHVwZGF0ZWQgYW5kL29yIHdoYXQgYXR0cmlidXRlcyBuZWVkIHRvIGJlXG4gICAgLy8gcGVyc2lzdGVkIHRvIHRoZSBzZXJ2ZXIuIFVuc2V0IGF0dHJpYnV0ZXMgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICAgIC8vIFlvdSBjYW4gYWxzbyBwYXNzIGFuIGF0dHJpYnV0ZXMgb2JqZWN0IHRvIGRpZmYgYWdhaW5zdCB0aGUgbW9kZWwsXG4gICAgLy8gZGV0ZXJtaW5pbmcgaWYgdGhlcmUgKndvdWxkIGJlKiBhIGNoYW5nZS5cbiAgY2hhbmdlZEF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGRpZmYpIHtcbiAgICBpZiAoIWRpZmYpIHJldHVybiB0aGlzLmhhc0NoYW5nZWQoKSA/IF8uY2xvbmUodGhpcy5jaGFuZ2VkKSA6IGZhbHNlO1xuICAgIHZhciB2YWwsIGNoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgb2xkID0gdGhpcy5fY2hhbmdpbmcgPyB0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMgOiB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgZm9yICh2YXIgYXR0ciBpbiBkaWZmKSB7XG4gICAgICBpZiAoXy5pc0VxdWFsKG9sZFthdHRyXSwgKHZhbCA9IGRpZmZbYXR0cl0pKSkgY29udGludWU7XG4gICAgICAoY2hhbmdlZCB8fCAoY2hhbmdlZCA9IHt9KSlbYXR0cl0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9LFxuXG4gICAgLy8gR2V0IHRoZSBwcmV2aW91cyB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUsIHJlY29yZGVkIGF0IHRoZSB0aW1lIHRoZSBsYXN0XG4gICAgLy8gYFwiY2hhbmdlXCJgIGV2ZW50IHdhcyBmaXJlZC5cbiAgcHJldmlvdXM6IGZ1bmN0aW9uKGF0dHIpIHtcbiAgICBpZiAoYXR0ciA9PSBudWxsIHx8ICF0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXNbYXR0cl07XG4gIH0sXG5cbiAgICAvLyBHZXQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtb2RlbCBhdCB0aGUgdGltZSBvZiB0aGUgcHJldmlvdXNcbiAgICAvLyBgXCJjaGFuZ2VcImAgZXZlbnQuXG4gIHByZXZpb3VzQXR0cmlidXRlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF8uY2xvbmUodGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzKTtcbiAgfSxcblxuICAgIC8vIEZldGNoIHRoZSBtb2RlbCBmcm9tIHRoZSBzZXJ2ZXIuIElmIHRoZSBzZXJ2ZXIncyByZXByZXNlbnRhdGlvbiBvZiB0aGVcbiAgICAvLyBtb2RlbCBkaWZmZXJzIGZyb20gaXRzIGN1cnJlbnQgYXR0cmlidXRlcywgdGhleSB3aWxsIGJlIG92ZXJyaWRkZW4sXG4gICAgLy8gdHJpZ2dlcmluZyBhIGBcImNoYW5nZVwiYCBldmVudC5cbiAgZmV0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IF8uY2xvbmUob3B0aW9ucykgOiB7fTtcbiAgICBpZiAob3B0aW9ucy5wYXJzZSA9PT0gdm9pZCAwKSBvcHRpb25zLnBhcnNlID0gdHJ1ZTtcbiAgICB2YXIgbW9kZWwgPSB0aGlzO1xuICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzO1xuICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgIGlmICghbW9kZWwuc2V0KG1vZGVsLnBhcnNlKHJlc3AsIG9wdGlvbnMpLCBvcHRpb25zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MobW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgICAgbW9kZWwudHJpZ2dlcignc3luYycsIG1vZGVsLCByZXNwLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHdyYXBFcnJvcih0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5zeW5jKCdyZWFkJywgdGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgICAvLyBTZXQgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMsIGFuZCBzeW5jIHRoZSBtb2RlbCB0byB0aGUgc2VydmVyLlxuICAgIC8vIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBhbiBhdHRyaWJ1dGVzIGhhc2ggdGhhdCBkaWZmZXJzLCB0aGUgbW9kZWwnc1xuICAgIC8vIHN0YXRlIHdpbGwgYmUgYHNldGAgYWdhaW4uXG4gIHNhdmU6IGZ1bmN0aW9uKGtleSwgdmFsLCBvcHRpb25zKSB7XG4gICAgdmFyIGF0dHJzLCBtZXRob2QsIHhociwgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuICAgIC8vIEhhbmRsZSBib3RoIGBcImtleVwiLCB2YWx1ZWAgYW5kIGB7a2V5OiB2YWx1ZX1gIC1zdHlsZSBhcmd1bWVudHMuXG4gICAgaWYgKGtleSA9PSBudWxsIHx8IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICBhdHRycyA9IGtleTtcbiAgICAgIG9wdGlvbnMgPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIChhdHRycyA9IHt9KVtrZXldID0gdmFsO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBfLmV4dGVuZCh7dmFsaWRhdGU6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIC8vIElmIHdlJ3JlIG5vdCB3YWl0aW5nIGFuZCBhdHRyaWJ1dGVzIGV4aXN0LCBzYXZlIGFjdHMgYXNcbiAgICAvLyBgc2V0KGF0dHIpLnNhdmUobnVsbCwgb3B0cylgIHdpdGggdmFsaWRhdGlvbi4gT3RoZXJ3aXNlLCBjaGVjayBpZlxuICAgIC8vIHRoZSBtb2RlbCB3aWxsIGJlIHZhbGlkIHdoZW4gdGhlIGF0dHJpYnV0ZXMsIGlmIGFueSwgYXJlIHNldC5cbiAgICBpZiAoYXR0cnMgJiYgIW9wdGlvbnMud2FpdCkge1xuICAgICAgaWYgKCF0aGlzLnNldChhdHRycywgb3B0aW9ucykpIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLl92YWxpZGF0ZShhdHRycywgb3B0aW9ucykpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGVtcG9yYXJ5IGF0dHJpYnV0ZXMgaWYgYHt3YWl0OiB0cnVlfWAuXG4gICAgaWYgKGF0dHJzICYmIG9wdGlvbnMud2FpdCkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gXy5leHRlbmQoe30sIGF0dHJpYnV0ZXMsIGF0dHJzKTtcbiAgICB9XG5cbiAgICAvLyBBZnRlciBhIHN1Y2Nlc3NmdWwgc2VydmVyLXNpZGUgc2F2ZSwgdGhlIGNsaWVudCBpcyAob3B0aW9uYWxseSlcbiAgICAvLyB1cGRhdGVkIHdpdGggdGhlIHNlcnZlci1zaWRlIHN0YXRlLlxuICAgIGlmIChvcHRpb25zLnBhcnNlID09PSB2b2lkIDApIG9wdGlvbnMucGFyc2UgPSB0cnVlO1xuICAgIHZhciBtb2RlbCA9IHRoaXM7XG4gICAgdmFyIHN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7XG4gICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24ocmVzcCkge1xuICAgICAgLy8gRW5zdXJlIGF0dHJpYnV0ZXMgYXJlIHJlc3RvcmVkIGR1cmluZyBzeW5jaHJvbm91cyBzYXZlcy5cbiAgICAgIG1vZGVsLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgdmFyIHNlcnZlckF0dHJzID0gbW9kZWwucGFyc2UocmVzcCwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy53YWl0KSBzZXJ2ZXJBdHRycyA9IF8uZXh0ZW5kKGF0dHJzIHx8IHt9LCBzZXJ2ZXJBdHRycyk7XG4gICAgICBpZiAoXy5pc09iamVjdChzZXJ2ZXJBdHRycykgJiYgIW1vZGVsLnNldChzZXJ2ZXJBdHRycywgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MobW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgICAgbW9kZWwudHJpZ2dlcignc3luYycsIG1vZGVsLCByZXNwLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHdyYXBFcnJvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIG1ldGhvZCA9IHRoaXMuaXNOZXcoKSA/ICdjcmVhdGUnIDogKG9wdGlvbnMucGF0Y2ggPyAncGF0Y2gnIDogJ3VwZGF0ZScpO1xuICAgIGlmIChtZXRob2QgPT09ICdwYXRjaCcgJiYgIW9wdGlvbnMuYXR0cnMpIG9wdGlvbnMuYXR0cnMgPSBhdHRycztcbiAgICB4aHIgPSB0aGlzLnN5bmMobWV0aG9kLCB0aGlzLCBvcHRpb25zKTtcblxuICAgIC8vIFJlc3RvcmUgYXR0cmlidXRlcy5cbiAgICBpZiAoYXR0cnMgJiYgb3B0aW9ucy53YWl0KSB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gICAgcmV0dXJuIHhocjtcbiAgfSxcblxuICAgIC8vIERlc3Ryb3kgdGhpcyBtb2RlbCBvbiB0aGUgc2VydmVyIGlmIGl0IHdhcyBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICAvLyBPcHRpbWlzdGljYWxseSByZW1vdmVzIHRoZSBtb2RlbCBmcm9tIGl0cyBjb2xsZWN0aW9uLCBpZiBpdCBoYXMgb25lLlxuICAgIC8vIElmIGB3YWl0OiB0cnVlYCBpcyBwYXNzZWQsIHdhaXRzIGZvciB0aGUgc2VydmVyIHRvIHJlc3BvbmQgYmVmb3JlIHJlbW92YWwuXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IF8uY2xvbmUob3B0aW9ucykgOiB7fTtcbiAgICB2YXIgbW9kZWwgPSB0aGlzO1xuICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzO1xuXG4gICAgdmFyIGRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICAgIG1vZGVsLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgIG1vZGVsLnRyaWdnZXIoJ2Rlc3Ryb3knLCBtb2RlbCwgbW9kZWwuY29sbGVjdGlvbiwgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgIGlmIChvcHRpb25zLndhaXQgfHwgbW9kZWwuaXNOZXcoKSkgZGVzdHJveSgpO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MobW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgICAgaWYgKCFtb2RlbC5pc05ldygpKSBtb2RlbC50cmlnZ2VyKCdzeW5jJywgbW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5pc05ldygpKSB7XG4gICAgICBvcHRpb25zLnN1Y2Nlc3MoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgd3JhcEVycm9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgdmFyIHhociA9IHRoaXMuc3luYygnZGVsZXRlJywgdGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLndhaXQpIGRlc3Ryb3koKTtcbiAgICByZXR1cm4geGhyO1xuICB9LFxuXG4gICAgLy8gRGVmYXVsdCBVUkwgZm9yIHRoZSBtb2RlbCdzIHJlcHJlc2VudGF0aW9uIG9uIHRoZSBzZXJ2ZXIgLS0gaWYgeW91J3JlXG4gICAgLy8gdXNpbmcgQmFja2JvbmUncyByZXN0ZnVsIG1ldGhvZHMsIG92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIHRoZSBlbmRwb2ludFxuICAgIC8vIHRoYXQgd2lsbCBiZSBjYWxsZWQuXG4gIHVybDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGJhc2UgPVxuICAgICAgXy5yZXN1bHQodGhpcywgJ3VybFJvb3QnKSB8fFxuICAgICAgXy5yZXN1bHQodGhpcy5jb2xsZWN0aW9uLCAndXJsJykgfHxcbiAgICAgIHVybEVycm9yKCk7XG4gICAgaWYgKHRoaXMuaXNOZXcoKSkgcmV0dXJuIGJhc2U7XG4gICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvKFteXFwvXSkkLywgJyQxLycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuaWQpO1xuICB9LFxuXG4gICAgLy8gKipwYXJzZSoqIGNvbnZlcnRzIGEgcmVzcG9uc2UgaW50byB0aGUgaGFzaCBvZiBhdHRyaWJ1dGVzIHRvIGJlIGBzZXRgIG9uXG4gICAgLy8gdGhlIG1vZGVsLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IHRvIHBhc3MgdGhlIHJlc3BvbnNlIGFsb25nLlxuICBwYXJzZTogZnVuY3Rpb24ocmVzcCwgb3B0aW9ucykge1xuICAgIHJldHVybiByZXNwO1xuICB9LFxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG1vZGVsIHdpdGggaWRlbnRpY2FsIGF0dHJpYnV0ZXMgdG8gdGhpcyBvbmUuXG4gIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hdHRyaWJ1dGVzKTtcbiAgfSxcblxuICAgIC8vIEEgbW9kZWwgaXMgbmV3IGlmIGl0IGhhcyBuZXZlciBiZWVuIHNhdmVkIHRvIHRoZSBzZXJ2ZXIsIGFuZCBsYWNrcyBhbiBpZC5cbiAgaXNOZXc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhdGhpcy5oYXModGhpcy5pZEF0dHJpYnV0ZSk7XG4gIH0sXG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbW9kZWwgaXMgY3VycmVudGx5IGluIGEgdmFsaWQgc3RhdGUuXG4gIGlzVmFsaWQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGUoe30sIF8uZXh0ZW5kKG9wdGlvbnMgfHwge30sIHsgdmFsaWRhdGU6IHRydWUgfSkpO1xuICB9LFxuXG4gICAgLy8gUnVuIHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbmV4dCBjb21wbGV0ZSBzZXQgb2YgbW9kZWwgYXR0cmlidXRlcyxcbiAgICAvLyByZXR1cm5pbmcgYHRydWVgIGlmIGFsbCBpcyB3ZWxsLiBPdGhlcndpc2UsIGZpcmUgYW4gYFwiaW52YWxpZFwiYCBldmVudC5cbiAgX3ZhbGlkYXRlOiBmdW5jdGlvbihhdHRycywgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy52YWxpZGF0ZSB8fCAhdGhpcy52YWxpZGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgYXR0cnMgPSBfLmV4dGVuZCh7fSwgdGhpcy5hdHRyaWJ1dGVzLCBhdHRycyk7XG4gICAgdmFyIGVycm9yID0gdGhpcy52YWxpZGF0aW9uRXJyb3IgPSB0aGlzLnZhbGlkYXRlKGF0dHJzLCBvcHRpb25zKSB8fCBudWxsO1xuICAgIGlmICghZXJyb3IpIHJldHVybiB0cnVlO1xuICAgIHRoaXMudHJpZ2dlcignaW52YWxpZCcsIHRoaXMsIGVycm9yLCBfLmV4dGVuZChvcHRpb25zLCB7dmFsaWRhdGlvbkVycm9yOiBlcnJvcn0pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxufSk7XG5cbi8vIFVuZGVyc2NvcmUgbWV0aG9kcyB0aGF0IHdlIHdhbnQgdG8gaW1wbGVtZW50IG9uIHRoZSBNb2RlbC5cbnZhciBtb2RlbE1ldGhvZHMgPSBbJ2tleXMnLCAndmFsdWVzJywgJ3BhaXJzJywgJ2ludmVydCcsICdwaWNrJywgJ29taXQnLCAnY2hhaW4nLCAnaXNFbXB0eSddO1xuXG4vLyBNaXggaW4gZWFjaCBVbmRlcnNjb3JlIG1ldGhvZCBhcyBhIHByb3h5IHRvIGBNb2RlbCNhdHRyaWJ1dGVzYC5cbl8uZWFjaChtb2RlbE1ldGhvZHMsIGZ1bmN0aW9uKG1ldGhvZCkge1xuICBpZiAoIV9bbWV0aG9kXSkgcmV0dXJuO1xuICBNb2RlbC5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzLmF0dHJpYnV0ZXMpO1xuICAgIHJldHVybiBfW21ldGhvZF0uYXBwbHkoXywgYXJncyk7XG4gIH07XG59KTtcblxuLy8gc2V0dXAgaW5oZXJpdGFuY2Vcbk1vZGVsLmV4dGVuZCA9IGV4dGVuZDtcbm1vZHVsZS5leHBvcnRzID0gTW9kZWw7XG4iLCIvKipcbiAqIFN0YW5kYWxvbmUgZXh0cmFjdGlvbiBvZiBCYWNrYm9uZS5FdmVudHMsIG5vIGV4dGVybmFsIGRlcGVuZGVuY3kgcmVxdWlyZWQuXG4gKiBEZWdyYWRlcyBuaWNlbHkgd2hlbiBCYWNrb25lL3VuZGVyc2NvcmUgYXJlIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50XG4gKiBnbG9iYWwgY29udGV4dC5cbiAqXG4gKiBOb3RlIHRoYXQgZG9jcyBzdWdnZXN0IHRvIHVzZSB1bmRlcnNjb3JlJ3MgYF8uZXh0ZW5kKClgIG1ldGhvZCB0byBhZGQgRXZlbnRzXG4gKiBzdXBwb3J0IHRvIHNvbWUgZ2l2ZW4gb2JqZWN0LiBBIGBtaXhpbigpYCBtZXRob2QgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIEV2ZW50c1xuICogcHJvdG90eXBlIHRvIGF2b2lkIHVzaW5nIHVuZGVyc2NvcmUgZm9yIHRoYXQgc29sZSBwdXJwb3NlOlxuICpcbiAqICAgICB2YXIgbXlFdmVudEVtaXR0ZXIgPSBCYWNrYm9uZUV2ZW50cy5taXhpbih7fSk7XG4gKlxuICogT3IgZm9yIGEgZnVuY3Rpb24gY29uc3RydWN0b3I6XG4gKlxuICogICAgIGZ1bmN0aW9uIE15Q29uc3RydWN0b3IoKXt9XG4gKiAgICAgTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZm9vID0gZnVuY3Rpb24oKXt9XG4gKiAgICAgQmFja2JvbmVFdmVudHMubWl4aW4oTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICpcbiAqIChjKSAyMDA5LTIwMTMgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIEluYy5cbiAqIChjKSAyMDEzIE5pY29sYXMgUGVycmlhdWx0XG4gKi9cbi8qIGdsb2JhbCBleHBvcnRzOnRydWUsIGRlZmluZSwgbW9kdWxlICovXG4oZnVuY3Rpb24oKSB7XG4gIHZhciByb290ID0gdGhpcyxcbiAgICAgIGJyZWFrZXIgPSB7fSxcbiAgICAgIG5hdGl2ZUZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCxcbiAgICAgIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxuICAgICAgaWRDb3VudGVyID0gMDtcblxuICAvLyBSZXR1cm5zIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBtYXRjaGluZyB0aGUgbWluaW1hbCBBUEkgc3Vic2V0IHJlcXVpcmVkXG4gIC8vIGJ5IEJhY2tib25lLkV2ZW50c1xuICBmdW5jdGlvbiBtaW5pc2NvcmUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXlzKCkgY2FsbGVkIG9uIGEgbm9uLW9iamVjdFwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5LCBrZXlzID0gW107XG4gICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAga2V5c1trZXlzLmxlbmd0aF0gPSBrZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgfSxcblxuICAgICAgdW5pcXVlSWQ6IGZ1bmN0aW9uKHByZWZpeCkge1xuICAgICAgICB2YXIgaWQgPSArK2lkQ291bnRlciArICcnO1xuICAgICAgICByZXR1cm4gcHJlZml4ID8gcHJlZml4ICsgaWQgOiBpZDtcbiAgICAgIH0sXG5cbiAgICAgIGhhczogZnVuY3Rpb24ob2JqLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xuICAgICAgfSxcblxuICAgICAgZWFjaDogZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKG5hdGl2ZUZvckVhY2ggJiYgb2JqLmZvckVhY2ggPT09IG5hdGl2ZUZvckVhY2gpIHtcbiAgICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCA9PT0gK29iai5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gYnJlYWtlcikgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaikgPT09IGJyZWFrZXIpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIG9uY2U6IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgICAgdmFyIHJhbiA9IGZhbHNlLCBtZW1vO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKHJhbikgcmV0dXJuIG1lbW87XG4gICAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgICBtZW1vID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIGZ1bmMgPSBudWxsO1xuICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICB2YXIgXyA9IG1pbmlzY29yZSgpLCBFdmVudHM7XG5cbiAgLy8gQmFja2JvbmUuRXZlbnRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEEgbW9kdWxlIHRoYXQgY2FuIGJlIG1peGVkIGluIHRvICphbnkgb2JqZWN0KiBpbiBvcmRlciB0byBwcm92aWRlIGl0IHdpdGhcbiAgLy8gY3VzdG9tIGV2ZW50cy4gWW91IG1heSBiaW5kIHdpdGggYG9uYCBvciByZW1vdmUgd2l0aCBgb2ZmYCBjYWxsYmFja1xuICAvLyBmdW5jdGlvbnMgdG8gYW4gZXZlbnQ7IGB0cmlnZ2VyYC1pbmcgYW4gZXZlbnQgZmlyZXMgYWxsIGNhbGxiYWNrcyBpblxuICAvLyBzdWNjZXNzaW9uLlxuICAvL1xuICAvLyAgICAgdmFyIG9iamVjdCA9IHt9O1xuICAvLyAgICAgXy5leHRlbmQob2JqZWN0LCBCYWNrYm9uZS5FdmVudHMpO1xuICAvLyAgICAgb2JqZWN0Lm9uKCdleHBhbmQnLCBmdW5jdGlvbigpeyBhbGVydCgnZXhwYW5kZWQnKTsgfSk7XG4gIC8vICAgICBvYmplY3QudHJpZ2dlcignZXhwYW5kJyk7XG4gIC8vXG4gIEV2ZW50cyA9IHtcblxuICAgIC8vIEJpbmQgYW4gZXZlbnQgdG8gYSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBQYXNzaW5nIGBcImFsbFwiYCB3aWxsIGJpbmRcbiAgICAvLyB0aGUgY2FsbGJhY2sgdG8gYWxsIGV2ZW50cyBmaXJlZC5cbiAgICBvbjogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgIGlmICghZXZlbnRzQXBpKHRoaXMsICdvbicsIG5hbWUsIFtjYWxsYmFjaywgY29udGV4dF0pIHx8ICFjYWxsYmFjaykgcmV0dXJuIHRoaXM7XG4gICAgICB0aGlzLl9ldmVudHMgfHwgKHRoaXMuX2V2ZW50cyA9IHt9KTtcbiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHNbbmFtZV0gfHwgKHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdKTtcbiAgICAgIGV2ZW50cy5wdXNoKHtjYWxsYmFjazogY2FsbGJhY2ssIGNvbnRleHQ6IGNvbnRleHQsIGN0eDogY29udGV4dCB8fCB0aGlzfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gQmluZCBhbiBldmVudCB0byBvbmx5IGJlIHRyaWdnZXJlZCBhIHNpbmdsZSB0aW1lLiBBZnRlciB0aGUgZmlyc3QgdGltZVxuICAgIC8vIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLCBpdCB3aWxsIGJlIHJlbW92ZWQuXG4gICAgb25jZTogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgIGlmICghZXZlbnRzQXBpKHRoaXMsICdvbmNlJywgbmFtZSwgW2NhbGxiYWNrLCBjb250ZXh0XSkgfHwgIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBvbmNlID0gXy5vbmNlKGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9mZihuYW1lLCBvbmNlKTtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgICAgb25jZS5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIHJldHVybiB0aGlzLm9uKG5hbWUsIG9uY2UsIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgb25lIG9yIG1hbnkgY2FsbGJhY2tzLiBJZiBgY29udGV4dGAgaXMgbnVsbCwgcmVtb3ZlcyBhbGxcbiAgICAvLyBjYWxsYmFja3Mgd2l0aCB0aGF0IGZ1bmN0aW9uLiBJZiBgY2FsbGJhY2tgIGlzIG51bGwsIHJlbW92ZXMgYWxsXG4gICAgLy8gY2FsbGJhY2tzIGZvciB0aGUgZXZlbnQuIElmIGBuYW1lYCBpcyBudWxsLCByZW1vdmVzIGFsbCBib3VuZFxuICAgIC8vIGNhbGxiYWNrcyBmb3IgYWxsIGV2ZW50cy5cbiAgICBvZmY6IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICB2YXIgcmV0YWluLCBldiwgZXZlbnRzLCBuYW1lcywgaSwgbCwgaiwgaztcbiAgICAgIGlmICghdGhpcy5fZXZlbnRzIHx8ICFldmVudHNBcGkodGhpcywgJ29mZicsIG5hbWUsIFtjYWxsYmFjaywgY29udGV4dF0pKSByZXR1cm4gdGhpcztcbiAgICAgIGlmICghbmFtZSAmJiAhY2FsbGJhY2sgJiYgIWNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBuYW1lcyA9IG5hbWUgPyBbbmFtZV0gOiBfLmtleXModGhpcy5fZXZlbnRzKTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBuYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgICBpZiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzW25hbWVdKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzW25hbWVdID0gcmV0YWluID0gW107XG4gICAgICAgICAgaWYgKGNhbGxiYWNrIHx8IGNvbnRleHQpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDAsIGsgPSBldmVudHMubGVuZ3RoOyBqIDwgazsgaisrKSB7XG4gICAgICAgICAgICAgIGV2ID0gZXZlbnRzW2pdO1xuICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9PSBldi5jYWxsYmFjayAmJiBjYWxsYmFjayAhPT0gZXYuY2FsbGJhY2suX2NhbGxiYWNrKSB8fFxuICAgICAgICAgICAgICAgICAgKGNvbnRleHQgJiYgY29udGV4dCAhPT0gZXYuY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICByZXRhaW4ucHVzaChldik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFyZXRhaW4ubGVuZ3RoKSBkZWxldGUgdGhpcy5fZXZlbnRzW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIG9uZSBvciBtYW55IGV2ZW50cywgZmlyaW5nIGFsbCBib3VuZCBjYWxsYmFja3MuIENhbGxiYWNrcyBhcmVcbiAgICAvLyBwYXNzZWQgdGhlIHNhbWUgYXJndW1lbnRzIGFzIGB0cmlnZ2VyYCBpcywgYXBhcnQgZnJvbSB0aGUgZXZlbnQgbmFtZVxuICAgIC8vICh1bmxlc3MgeW91J3JlIGxpc3RlbmluZyBvbiBgXCJhbGxcImAsIHdoaWNoIHdpbGwgY2F1c2UgeW91ciBjYWxsYmFjayB0b1xuICAgIC8vIHJlY2VpdmUgdGhlIHRydWUgbmFtZSBvZiB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50KS5cbiAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICBpZiAoIXRoaXMuX2V2ZW50cykgcmV0dXJuIHRoaXM7XG4gICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgIGlmICghZXZlbnRzQXBpKHRoaXMsICd0cmlnZ2VyJywgbmFtZSwgYXJncykpIHJldHVybiB0aGlzO1xuICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50c1tuYW1lXTtcbiAgICAgIHZhciBhbGxFdmVudHMgPSB0aGlzLl9ldmVudHMuYWxsO1xuICAgICAgaWYgKGV2ZW50cykgdHJpZ2dlckV2ZW50cyhldmVudHMsIGFyZ3MpO1xuICAgICAgaWYgKGFsbEV2ZW50cykgdHJpZ2dlckV2ZW50cyhhbGxFdmVudHMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gVGVsbCB0aGlzIG9iamVjdCB0byBzdG9wIGxpc3RlbmluZyB0byBlaXRoZXIgc3BlY2lmaWMgZXZlbnRzIC4uLiBvclxuICAgIC8vIHRvIGV2ZXJ5IG9iamVjdCBpdCdzIGN1cnJlbnRseSBsaXN0ZW5pbmcgdG8uXG4gICAgc3RvcExpc3RlbmluZzogZnVuY3Rpb24ob2JqLCBuYW1lLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcbiAgICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm4gdGhpcztcbiAgICAgIHZhciBkZWxldGVMaXN0ZW5lciA9ICFuYW1lICYmICFjYWxsYmFjaztcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIGNhbGxiYWNrID0gdGhpcztcbiAgICAgIGlmIChvYmopIChsaXN0ZW5lcnMgPSB7fSlbb2JqLl9saXN0ZW5lcklkXSA9IG9iajtcbiAgICAgIGZvciAodmFyIGlkIGluIGxpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcnNbaWRdLm9mZihuYW1lLCBjYWxsYmFjaywgdGhpcyk7XG4gICAgICAgIGlmIChkZWxldGVMaXN0ZW5lcikgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tpZF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgfTtcblxuICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBzcGxpdCBldmVudCBzdHJpbmdzLlxuICB2YXIgZXZlbnRTcGxpdHRlciA9IC9cXHMrLztcblxuICAvLyBJbXBsZW1lbnQgZmFuY3kgZmVhdHVyZXMgb2YgdGhlIEV2ZW50cyBBUEkgc3VjaCBhcyBtdWx0aXBsZSBldmVudFxuICAvLyBuYW1lcyBgXCJjaGFuZ2UgYmx1clwiYCBhbmQgalF1ZXJ5LXN0eWxlIGV2ZW50IG1hcHMgYHtjaGFuZ2U6IGFjdGlvbn1gXG4gIC8vIGluIHRlcm1zIG9mIHRoZSBleGlzdGluZyBBUEkuXG4gIHZhciBldmVudHNBcGkgPSBmdW5jdGlvbihvYmosIGFjdGlvbiwgbmFtZSwgcmVzdCkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBIYW5kbGUgZXZlbnQgbWFwcy5cbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gbmFtZSkge1xuICAgICAgICBvYmpbYWN0aW9uXS5hcHBseShvYmosIFtrZXksIG5hbWVba2V5XV0uY29uY2F0KHJlc3QpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BhY2Ugc2VwYXJhdGVkIGV2ZW50IG5hbWVzLlxuICAgIGlmIChldmVudFNwbGl0dGVyLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IG5hbWUuc3BsaXQoZXZlbnRTcGxpdHRlcik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBvYmpbYWN0aW9uXS5hcHBseShvYmosIFtuYW1lc1tpXV0uY29uY2F0KHJlc3QpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBBIGRpZmZpY3VsdC10by1iZWxpZXZlLCBidXQgb3B0aW1pemVkIGludGVybmFsIGRpc3BhdGNoIGZ1bmN0aW9uIGZvclxuICAvLyB0cmlnZ2VyaW5nIGV2ZW50cy4gVHJpZXMgdG8ga2VlcCB0aGUgdXN1YWwgY2FzZXMgc3BlZWR5IChtb3N0IGludGVybmFsXG4gIC8vIEJhY2tib25lIGV2ZW50cyBoYXZlIDMgYXJndW1lbnRzKS5cbiAgdmFyIHRyaWdnZXJFdmVudHMgPSBmdW5jdGlvbihldmVudHMsIGFyZ3MpIHtcbiAgICB2YXIgZXYsIGkgPSAtMSwgbCA9IGV2ZW50cy5sZW5ndGgsIGExID0gYXJnc1swXSwgYTIgPSBhcmdzWzFdLCBhMyA9IGFyZ3NbMl07XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCk7IHJldHVybjtcbiAgICAgIGNhc2UgMTogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suY2FsbChldi5jdHgsIGExKTsgcmV0dXJuO1xuICAgICAgY2FzZSAyOiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCwgYTEsIGEyKTsgcmV0dXJuO1xuICAgICAgY2FzZSAzOiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCwgYTEsIGEyLCBhMyk7IHJldHVybjtcbiAgICAgIGRlZmF1bHQ6IHdoaWxlICgrK2kgPCBsKSAoZXYgPSBldmVudHNbaV0pLmNhbGxiYWNrLmFwcGx5KGV2LmN0eCwgYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBsaXN0ZW5NZXRob2RzID0ge2xpc3RlblRvOiAnb24nLCBsaXN0ZW5Ub09uY2U6ICdvbmNlJ307XG5cbiAgLy8gSW52ZXJzaW9uLW9mLWNvbnRyb2wgdmVyc2lvbnMgb2YgYG9uYCBhbmQgYG9uY2VgLiBUZWxsICp0aGlzKiBvYmplY3QgdG9cbiAgLy8gbGlzdGVuIHRvIGFuIGV2ZW50IGluIGFub3RoZXIgb2JqZWN0IC4uLiBrZWVwaW5nIHRyYWNrIG9mIHdoYXQgaXQnc1xuICAvLyBsaXN0ZW5pbmcgdG8uXG4gIF8uZWFjaChsaXN0ZW5NZXRob2RzLCBmdW5jdGlvbihpbXBsZW1lbnRhdGlvbiwgbWV0aG9kKSB7XG4gICAgRXZlbnRzW21ldGhvZF0gPSBmdW5jdGlvbihvYmosIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzIHx8ICh0aGlzLl9saXN0ZW5lcnMgPSB7fSk7XG4gICAgICB2YXIgaWQgPSBvYmouX2xpc3RlbmVySWQgfHwgKG9iai5fbGlzdGVuZXJJZCA9IF8udW5pcXVlSWQoJ2wnKSk7XG4gICAgICBsaXN0ZW5lcnNbaWRdID0gb2JqO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JykgY2FsbGJhY2sgPSB0aGlzO1xuICAgICAgb2JqW2ltcGxlbWVudGF0aW9uXShuYW1lLCBjYWxsYmFjaywgdGhpcyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9KTtcblxuICAvLyBBbGlhc2VzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgRXZlbnRzLmJpbmQgICA9IEV2ZW50cy5vbjtcbiAgRXZlbnRzLnVuYmluZCA9IEV2ZW50cy5vZmY7XG5cbiAgLy8gTWl4aW4gdXRpbGl0eVxuICBFdmVudHMubWl4aW4gPSBmdW5jdGlvbihwcm90bykge1xuICAgIHZhciBleHBvcnRzID0gWydvbicsICdvbmNlJywgJ29mZicsICd0cmlnZ2VyJywgJ3N0b3BMaXN0ZW5pbmcnLCAnbGlzdGVuVG8nLFxuICAgICAgICAgICAgICAgICAgICdsaXN0ZW5Ub09uY2UnLCAnYmluZCcsICd1bmJpbmQnXTtcbiAgICBfLmVhY2goZXhwb3J0cywgZnVuY3Rpb24obmFtZSkge1xuICAgICAgcHJvdG9bbmFtZV0gPSB0aGlzW25hbWVdO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBwcm90bztcbiAgfTtcblxuICAvLyBFeHBvcnQgRXZlbnRzIGFzIEJhY2tib25lRXZlbnRzIGRlcGVuZGluZyBvbiBjdXJyZW50IGNvbnRleHRcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBFdmVudHM7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBFdmVudHM7XG4gICAgfVxuICAgIGV4cG9ydHMuQmFja2JvbmVFdmVudHMgPSBFdmVudHM7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5CYWNrYm9uZUV2ZW50cyA9IEV2ZW50cztcbiAgfVxufSkodGhpcyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUnKTtcbiIsIihmdW5jdGlvbiAoZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZGVmaW5pdGlvbik7XG4gIH1cbiAgZWxzZSB7XG4gICAgd2luZG93LkJhY2tib25lRXh0ZW5kID0gZGVmaW5pdGlvbigpO1xuICB9XG59KShmdW5jdGlvbiAoKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICBcbiAgLy8gbWluaS11bmRlcnNjb3JlXG4gIHZhciBfID0ge1xuICAgIGhhczogZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbiAgICB9LFxuICBcbiAgICBleHRlbmQ6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgZm9yICh2YXIgaT0xOyBpPGFyZ3VtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIG9ialtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9O1xuXG4gIC8vLyBGb2xsb3dpbmcgY29kZSBpcyBwYXN0ZWQgZnJvbSBCYWNrYm9uZS5qcyAvLy9cblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29ycmVjdGx5IHNldCB1cCB0aGUgcHJvdG90eXBlIGNoYWluLCBmb3Igc3ViY2xhc3Nlcy5cbiAgLy8gU2ltaWxhciB0byBgZ29vZy5pbmhlcml0c2AsIGJ1dCB1c2VzIGEgaGFzaCBvZiBwcm90b3R5cGUgcHJvcGVydGllcyBhbmRcbiAgLy8gY2xhc3MgcHJvcGVydGllcyB0byBiZSBleHRlbmRlZC5cbiAgdmFyIGV4dGVuZCA9IGZ1bmN0aW9uKHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXM7XG4gICAgdmFyIGNoaWxkO1xuXG4gICAgLy8gVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgbmV3IHN1YmNsYXNzIGlzIGVpdGhlciBkZWZpbmVkIGJ5IHlvdVxuICAgIC8vICh0aGUgXCJjb25zdHJ1Y3RvclwiIHByb3BlcnR5IGluIHlvdXIgYGV4dGVuZGAgZGVmaW5pdGlvbiksIG9yIGRlZmF1bHRlZFxuICAgIC8vIGJ5IHVzIHRvIHNpbXBseSBjYWxsIHRoZSBwYXJlbnQncyBjb25zdHJ1Y3Rvci5cbiAgICBpZiAocHJvdG9Qcm9wcyAmJiBfLmhhcyhwcm90b1Byb3BzLCAnY29uc3RydWN0b3InKSkge1xuICAgICAgY2hpbGQgPSBwcm90b1Byb3BzLmNvbnN0cnVjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZCA9IGZ1bmN0aW9uKCl7IHJldHVybiBwYXJlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc3RhdGljIHByb3BlcnRpZXMgdG8gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBpZiBzdXBwbGllZC5cbiAgICBfLmV4dGVuZChjaGlsZCwgcGFyZW50LCBzdGF0aWNQcm9wcyk7XG5cbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBpbmhlcml0IGZyb20gYHBhcmVudGAsIHdpdGhvdXQgY2FsbGluZ1xuICAgIC8vIGBwYXJlbnRgJ3MgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gICAgdmFyIFN1cnJvZ2F0ZSA9IGZ1bmN0aW9uKCl7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfTtcbiAgICBTdXJyb2dhdGUucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgU3Vycm9nYXRlKCk7XG5cbiAgICAvLyBBZGQgcHJvdG90eXBlIHByb3BlcnRpZXMgKGluc3RhbmNlIHByb3BlcnRpZXMpIHRvIHRoZSBzdWJjbGFzcyxcbiAgICAvLyBpZiBzdXBwbGllZC5cbiAgICBpZiAocHJvdG9Qcm9wcykgXy5leHRlbmQoY2hpbGQucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcblxuICAgIC8vIFNldCBhIGNvbnZlbmllbmNlIHByb3BlcnR5IGluIGNhc2UgdGhlIHBhcmVudCdzIHByb3RvdHlwZSBpcyBuZWVkZWRcbiAgICAvLyBsYXRlci5cbiAgICBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlO1xuXG4gICAgcmV0dXJuIGNoaWxkO1xuICB9O1xuXG4gIC8vIEV4cG9zZSB0aGUgZXh0ZW5kIGZ1bmN0aW9uXG4gIHJldHVybiBleHRlbmQ7XG59KTtcbiIsIi8vIHRoaXMgaXMgdGhlIGV4dHJhY3RlZCB2aWV3IG1vZGVsIGZyb20gYmFja2JvbmVcbi8vIG5vdGUgdGhhdCB3ZSBpbmplY3QgamJvbmUgYXMganF1ZXJ5IHJlcGxhY21lbnRcbi8vIChhbmQgdW5kZXJzY29yZSBkaXJlY3RseSlcbi8vXG4vLyBWaWV3cyBhcmUgYWxtb3N0IG1vcmUgY29udmVudGlvbiB0aGFuIHRoZXkgYXJlIGFjdHVhbCBjb2RlLlxuLy8gIE1WQyBwYXR0ZXJuXG4vLyBCYWNrYm9uZS5WaWV3XG4vLyAtLS0tLS0tLS0tLS0tXG5cbnZhciBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XG52YXIgRXZlbnRzID0gcmVxdWlyZShcImJhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lXCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCJiYWNrYm9uZS1leHRlbmQtc3RhbmRhbG9uZVwiKTtcbnZhciAkID0gcmVxdWlyZSgnamJvbmUnKTtcblxuLy8gQmFja2JvbmUgVmlld3MgYXJlIGFsbW9zdCBtb3JlIGNvbnZlbnRpb24gdGhhbiB0aGV5IGFyZSBhY3R1YWwgY29kZS4gQSBWaWV3XG4vLyBpcyBzaW1wbHkgYSBKYXZhU2NyaXB0IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBsb2dpY2FsIGNodW5rIG9mIFVJIGluIHRoZVxuLy8gRE9NLiBUaGlzIG1pZ2h0IGJlIGEgc2luZ2xlIGl0ZW0sIGFuIGVudGlyZSBsaXN0LCBhIHNpZGViYXIgb3IgcGFuZWwsIG9yXG4vLyBldmVuIHRoZSBzdXJyb3VuZGluZyBmcmFtZSB3aGljaCB3cmFwcyB5b3VyIHdob2xlIGFwcC4gRGVmaW5pbmcgYSBjaHVuayBvZlxuLy8gVUkgYXMgYSAqKlZpZXcqKiBhbGxvd3MgeW91IHRvIGRlZmluZSB5b3VyIERPTSBldmVudHMgZGVjbGFyYXRpdmVseSwgd2l0aG91dFxuLy8gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHJlbmRlciBvcmRlciAuLi4gYW5kIG1ha2VzIGl0IGVhc3kgZm9yIHRoZSB2aWV3IHRvXG4vLyByZWFjdCB0byBzcGVjaWZpYyBjaGFuZ2VzIGluIHRoZSBzdGF0ZSBvZiB5b3VyIG1vZGVscy5cblxuLy8gQ3JlYXRpbmcgYSBCYWNrYm9uZS5WaWV3IGNyZWF0ZXMgaXRzIGluaXRpYWwgZWxlbWVudCBvdXRzaWRlIG9mIHRoZSBET00sXG4vLyBpZiBhbiBleGlzdGluZyBlbGVtZW50IGlzIG5vdCBwcm92aWRlZC4uLlxudmFyIFZpZXcgPSAgZnVuY3Rpb24ob3B0aW9ucykge1xuICB0aGlzLmNpZCA9IF8udW5pcXVlSWQoJ3ZpZXcnKTtcbiAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgXy5leHRlbmQodGhpcywgXy5waWNrKG9wdGlvbnMsIHZpZXdPcHRpb25zKSk7XG4gIHRoaXMuX2Vuc3VyZUVsZW1lbnQoKTtcbiAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG4vLyBDYWNoZWQgcmVnZXggdG8gc3BsaXQga2V5cyBmb3IgYGRlbGVnYXRlYC5cbnZhciBkZWxlZ2F0ZUV2ZW50U3BsaXR0ZXIgPSAvXihcXFMrKVxccyooLiopJC87XG5cbi8vIExpc3Qgb2YgdmlldyBvcHRpb25zIHRvIGJlIG1lcmdlZCBhcyBwcm9wZXJ0aWVzLlxudmFyIHZpZXdPcHRpb25zID0gWydtb2RlbCcsICdjb2xsZWN0aW9uJywgJ2VsJywgJ2lkJywgJ2F0dHJpYnV0ZXMnLCAnY2xhc3NOYW1lJywgJ3RhZ05hbWUnLCAnZXZlbnRzJ107XG5cbi8vIFNldCB1cCBhbGwgaW5oZXJpdGFibGUgKipCYWNrYm9uZS5WaWV3KiogcHJvcGVydGllcyBhbmQgbWV0aG9kcy5cbl8uZXh0ZW5kKFZpZXcucHJvdG90eXBlLCBFdmVudHMsIHtcblxuICAvLyBUaGUgZGVmYXVsdCBgdGFnTmFtZWAgb2YgYSBWaWV3J3MgZWxlbWVudCBpcyBgXCJkaXZcImAuXG4gIHRhZ05hbWU6ICdkaXYnLFxuXG4gIC8vIGpRdWVyeSBkZWxlZ2F0ZSBmb3IgZWxlbWVudCBsb29rdXAsIHNjb3BlZCB0byBET00gZWxlbWVudHMgd2l0aGluIHRoZVxuICAvLyBjdXJyZW50IHZpZXcuIFRoaXMgc2hvdWxkIGJlIHByZWZlcnJlZCB0byBnbG9iYWwgbG9va3VwcyB3aGVyZSBwb3NzaWJsZS5cbiAgJDogZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy4kZWwuZmluZChzZWxlY3Rvcik7XG4gIH0sXG5cbiAgICAvLyBJbml0aWFsaXplIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIGJ5IGRlZmF1bHQuIE92ZXJyaWRlIGl0IHdpdGggeW91ciBvd25cbiAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LFxuXG4gICAgLy8gKipyZW5kZXIqKiBpcyB0aGUgY29yZSBmdW5jdGlvbiB0aGF0IHlvdXIgdmlldyBzaG91bGQgb3ZlcnJpZGUsIGluIG9yZGVyXG4gICAgLy8gdG8gcG9wdWxhdGUgaXRzIGVsZW1lbnQgKGB0aGlzLmVsYCksIHdpdGggdGhlIGFwcHJvcHJpYXRlIEhUTUwuIFRoZVxuICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yICoqcmVuZGVyKiogdG8gYWx3YXlzIHJldHVybiBgdGhpc2AuXG4gIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgdGhpcyB2aWV3IGJ5IHRha2luZyB0aGUgZWxlbWVudCBvdXQgb2YgdGhlIERPTSwgYW5kIHJlbW92aW5nIGFueVxuICAgIC8vIGFwcGxpY2FibGUgQmFja2JvbmUuRXZlbnRzIGxpc3RlbmVycy5cbiAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9yZW1vdmVFbGVtZW50KCk7XG4gICAgdGhpcy5zdG9wTGlzdGVuaW5nKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgdGhpcyB2aWV3J3MgZWxlbWVudCBmcm9tIHRoZSBkb2N1bWVudCBhbmQgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAgIC8vIGF0dGFjaGVkIHRvIGl0LiBFeHBvc2VkIGZvciBzdWJjbGFzc2VzIHVzaW5nIGFuIGFsdGVybmF0aXZlIERPTVxuICAgIC8vIG1hbmlwdWxhdGlvbiBBUEkuXG4gIF9yZW1vdmVFbGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiRlbC5yZW1vdmUoKTtcbiAgfSxcblxuICAgIC8vIENoYW5nZSB0aGUgdmlldydzIGVsZW1lbnQgKGB0aGlzLmVsYCBwcm9wZXJ0eSkgYW5kIHJlLWRlbGVnYXRlIHRoZVxuICAgIC8vIHZpZXcncyBldmVudHMgb24gdGhlIG5ldyBlbGVtZW50LlxuICBzZXRFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgdGhpcy51bmRlbGVnYXRlRXZlbnRzKCk7XG4gICAgdGhpcy5fc2V0RWxlbWVudChlbGVtZW50KTtcbiAgICB0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBDcmVhdGVzIHRoZSBgdGhpcy5lbGAgYW5kIGB0aGlzLiRlbGAgcmVmZXJlbmNlcyBmb3IgdGhpcyB2aWV3IHVzaW5nIHRoZVxuICAgIC8vIGdpdmVuIGBlbGAuIGBlbGAgY2FuIGJlIGEgQ1NTIHNlbGVjdG9yIG9yIGFuIEhUTUwgc3RyaW5nLCBhIGpRdWVyeVxuICAgIC8vIGNvbnRleHQgb3IgYW4gZWxlbWVudC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byB1dGlsaXplIGFuXG4gICAgLy8gYWx0ZXJuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiBBUEkgYW5kIGFyZSBvbmx5IHJlcXVpcmVkIHRvIHNldCB0aGVcbiAgICAvLyBgdGhpcy5lbGAgcHJvcGVydHkuXG4gIF9zZXRFbGVtZW50OiBmdW5jdGlvbihlbCkge1xuICAgIHRoaXMuJGVsID0gZWwgaW5zdGFuY2VvZiAkID8gZWwgOiAkKGVsKTtcbiAgICB0aGlzLmVsID0gdGhpcy4kZWxbMF07XG4gIH0sXG5cbiAgICAvLyBTZXQgY2FsbGJhY2tzLCB3aGVyZSBgdGhpcy5ldmVudHNgIGlzIGEgaGFzaCBvZlxuICAgIC8vXG4gICAgLy8gKntcImV2ZW50IHNlbGVjdG9yXCI6IFwiY2FsbGJhY2tcIn0qXG4gICAgLy9cbiAgICAvLyAgICAge1xuICAgIC8vICAgICAgICdtb3VzZWRvd24gLnRpdGxlJzogICdlZGl0JyxcbiAgICAvLyAgICAgICAnY2xpY2sgLmJ1dHRvbic6ICAgICAnc2F2ZScsXG4gICAgLy8gICAgICAgJ2NsaWNrIC5vcGVuJzogICAgICAgZnVuY3Rpb24oZSkgeyAuLi4gfVxuICAgIC8vICAgICB9XG4gICAgLy9cbiAgICAvLyBwYWlycy4gQ2FsbGJhY2tzIHdpbGwgYmUgYm91bmQgdG8gdGhlIHZpZXcsIHdpdGggYHRoaXNgIHNldCBwcm9wZXJseS5cbiAgICAvLyBVc2VzIGV2ZW50IGRlbGVnYXRpb24gZm9yIGVmZmljaWVuY3kuXG4gICAgLy8gT21pdHRpbmcgdGhlIHNlbGVjdG9yIGJpbmRzIHRoZSBldmVudCB0byBgdGhpcy5lbGAuXG4gIGRlbGVnYXRlRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHtcbiAgICBpZiAoIShldmVudHMgfHwgKGV2ZW50cyA9IF8ucmVzdWx0KHRoaXMsICdldmVudHMnKSkpKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnVuZGVsZWdhdGVFdmVudHMoKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRzKSB7XG4gICAgICB2YXIgbWV0aG9kID0gZXZlbnRzW2tleV07XG4gICAgICBpZiAoIV8uaXNGdW5jdGlvbihtZXRob2QpKSBtZXRob2QgPSB0aGlzW2V2ZW50c1trZXldXTtcbiAgICAgIGlmICghbWV0aG9kKSBjb250aW51ZTtcbiAgICAgIHZhciBtYXRjaCA9IGtleS5tYXRjaChkZWxlZ2F0ZUV2ZW50U3BsaXR0ZXIpO1xuICAgICAgdGhpcy5kZWxlZ2F0ZShtYXRjaFsxXSwgbWF0Y2hbMl0sIF8uYmluZChtZXRob2QsIHRoaXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBBZGQgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHZpZXcncyBlbGVtZW50IChvciBhIGNoaWxkIGVsZW1lbnRcbiAgICAvLyB1c2luZyBgc2VsZWN0b3JgKS4gVGhpcyBvbmx5IHdvcmtzIGZvciBkZWxlZ2F0ZS1hYmxlIGV2ZW50czogbm90IGBmb2N1c2AsXG4gICAgLy8gYGJsdXJgLCBhbmQgbm90IGBjaGFuZ2VgLCBgc3VibWl0YCwgYW5kIGByZXNldGAgaW4gSW50ZXJuZXQgRXhwbG9yZXIuXG4gIGRlbGVnYXRlOiBmdW5jdGlvbihldmVudE5hbWUsIHNlbGVjdG9yLCBsaXN0ZW5lcikge1xuICAgIHRoaXMuJGVsLm9uKGV2ZW50TmFtZSArICcuZGVsZWdhdGVFdmVudHMnICsgdGhpcy5jaWQsIHNlbGVjdG9yLCBsaXN0ZW5lcik7XG4gIH0sXG5cbiAgICAvLyBDbGVhcnMgYWxsIGNhbGxiYWNrcyBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSB2aWV3IGJ5IGBkZWxlZ2F0ZUV2ZW50c2AuXG4gICAgLy8gWW91IHVzdWFsbHkgZG9uJ3QgbmVlZCB0byB1c2UgdGhpcywgYnV0IG1heSB3aXNoIHRvIGlmIHlvdSBoYXZlIG11bHRpcGxlXG4gICAgLy8gQmFja2JvbmUgdmlld3MgYXR0YWNoZWQgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQuXG4gIHVuZGVsZWdhdGVFdmVudHM6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLiRlbCkgdGhpcy4kZWwub2ZmKCcuZGVsZWdhdGVFdmVudHMnICsgdGhpcy5jaWQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gICAgLy8gQSBmaW5lci1ncmFpbmVkIGB1bmRlbGVnYXRlRXZlbnRzYCBmb3IgcmVtb3ZpbmcgYSBzaW5nbGUgZGVsZWdhdGVkIGV2ZW50LlxuICAgIC8vIGBzZWxlY3RvcmAgYW5kIGBsaXN0ZW5lcmAgYXJlIGJvdGggb3B0aW9uYWwuXG4gIHVuZGVsZWdhdGU6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgc2VsZWN0b3IsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy4kZWwub2ZmKGV2ZW50TmFtZSArICcuZGVsZWdhdGVFdmVudHMnICsgdGhpcy5jaWQsIHNlbGVjdG9yLCBsaXN0ZW5lcik7XG4gIH0sXG5cbiAgICAvLyBQcm9kdWNlcyBhIERPTSBlbGVtZW50IHRvIGJlIGFzc2lnbmVkIHRvIHlvdXIgdmlldy4gRXhwb3NlZCBmb3JcbiAgICAvLyBzdWJjbGFzc2VzIHVzaW5nIGFuIGFsdGVybmF0aXZlIERPTSBtYW5pcHVsYXRpb24gQVBJLlxuICBfY3JlYXRlRWxlbWVudDogZnVuY3Rpb24odGFnTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICB9LFxuXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIFZpZXcgaGFzIGEgRE9NIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAgLy8gSWYgYHRoaXMuZWxgIGlzIGEgc3RyaW5nLCBwYXNzIGl0IHRocm91Z2ggYCQoKWAsIHRha2UgdGhlIGZpcnN0XG4gICAgLy8gbWF0Y2hpbmcgZWxlbWVudCwgYW5kIHJlLWFzc2lnbiBpdCB0byBgZWxgLiBPdGhlcndpc2UsIGNyZWF0ZVxuICAgIC8vIGFuIGVsZW1lbnQgZnJvbSB0aGUgYGlkYCwgYGNsYXNzTmFtZWAgYW5kIGB0YWdOYW1lYCBwcm9wZXJ0aWVzLlxuICBfZW5zdXJlRWxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmVsKSB7XG4gICAgICB2YXIgYXR0cnMgPSBfLmV4dGVuZCh7fSwgXy5yZXN1bHQodGhpcywgJ2F0dHJpYnV0ZXMnKSk7XG4gICAgICBpZiAodGhpcy5pZCkgYXR0cnMuaWQgPSBfLnJlc3VsdCh0aGlzLCAnaWQnKTtcbiAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSkgYXR0cnNbJ2NsYXNzJ10gPSBfLnJlc3VsdCh0aGlzLCAnY2xhc3NOYW1lJyk7XG4gICAgICB0aGlzLnNldEVsZW1lbnQodGhpcy5fY3JlYXRlRWxlbWVudChfLnJlc3VsdCh0aGlzLCAndGFnTmFtZScpKSk7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVzKGF0dHJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFbGVtZW50KF8ucmVzdWx0KHRoaXMsICdlbCcpKTtcbiAgICB9XG4gIH0sXG5cbiAgICAvLyBTZXQgYXR0cmlidXRlcyBmcm9tIGEgaGFzaCBvbiB0aGlzIHZpZXcncyBlbGVtZW50LiAgRXhwb3NlZCBmb3JcbiAgICAvLyBzdWJjbGFzc2VzIHVzaW5nIGFuIGFsdGVybmF0aXZlIERPTSBtYW5pcHVsYXRpb24gQVBJLlxuICBfc2V0QXR0cmlidXRlczogZnVuY3Rpb24oYXR0cmlidXRlcykge1xuICAgIHRoaXMuJGVsLmF0dHIoYXR0cmlidXRlcyk7XG4gIH1cblxufSk7XG5cbi8vIHNldHVwIGluaGVyaXRhbmNlXG5WaWV3LmV4dGVuZCA9IGV4dGVuZDtcbm1vZHVsZS5leHBvcnRzID0gVmlldztcbiIsInZhciBldmVudHMgPSByZXF1aXJlKFwiYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmVcIik7XG5cbmV2ZW50cy5vbkFsbCA9IGZ1bmN0aW9uKGNhbGxiYWNrLGNvbnRleHQpe1xuICB0aGlzLm9uKFwiYWxsXCIsIGNhbGxiYWNrLGNvbnRleHQpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIE1peGluIHV0aWxpdHlcbmV2ZW50cy5vbGRNaXhpbiA9IGV2ZW50cy5taXhpbjtcbmV2ZW50cy5taXhpbiA9IGZ1bmN0aW9uKHByb3RvKSB7XG4gIGV2ZW50cy5vbGRNaXhpbihwcm90byk7XG4gIC8vIGFkZCBjdXN0b20gb25BbGxcbiAgdmFyIGV4cG9ydHMgPSBbJ29uQWxsJ107XG4gIGZvcih2YXIgaT0wOyBpIDwgZXhwb3J0cy5sZW5ndGg7aSsrKXtcbiAgICB2YXIgbmFtZSA9IGV4cG9ydHNbaV07XG4gICAgcHJvdG9bbmFtZV0gPSB0aGlzW25hbWVdO1xuICB9XG4gIHJldHVybiBwcm90bztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXZlbnRzO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjguMFxudmFyIEdlbmVyaWNSZWFkZXIsIHhocjtcblxueGhyID0gcmVxdWlyZSgnbmV0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdlbmVyaWNSZWFkZXIgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIEdlbmVyaWNSZWFkZXIoKSB7fVxuXG4gIEdlbmVyaWNSZWFkZXIucmVhZCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgb25yZXQ7XG4gICAgb25yZXQgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihlcnIsIHJlc3BvbnNlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fb25SZXRyaWV2YWwodGV4dCwgY2FsbGJhY2spO1xuICAgICAgfTtcbiAgICB9KSh0aGlzKTtcbiAgICByZXR1cm4geGhyKHVybCwgb25yZXQpO1xuICB9O1xuXG4gIEdlbmVyaWNSZWFkZXIuX29uUmV0cmlldmFsID0gZnVuY3Rpb24odGV4dCwgY2FsbGJhY2spIHtcbiAgICB2YXIgclRleHQ7XG4gICAgclRleHQgPSB0aGlzLnBhcnNlKHRleHQpO1xuICAgIHJldHVybiBjYWxsYmFjayhyVGV4dCk7XG4gIH07XG5cbiAgcmV0dXJuIEdlbmVyaWNSZWFkZXI7XG5cbn0pKCk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuOC4wXG52YXIgU2VxO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlcSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gU2VxKHNlcSwgbmFtZSwgaWQpIHtcbiAgICB2YXIgbWV0YTtcbiAgICB0aGlzLnNlcSA9IHNlcTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICBtZXRhID0ge307XG4gIH1cblxuICByZXR1cm4gU2VxO1xuXG59KSgpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjguMFxudmFyIHN0cmluZ3M7XG5cbnN0cmluZ3MgPSB7XG4gIGNvbnRhaW5zOiBmdW5jdGlvbih0ZXh0LCBzZWFyY2gpIHtcbiAgICByZXR1cm4gJycuaW5kZXhPZi5jYWxsKHRleHQsIHNlYXJjaCwgMCkgIT09IC0xO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ3M7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuOC4wXG52YXIgRmFzdGEsIEdlbmVyaWNSZWFkZXIsIFNlcSwgU3RyLFxuICBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcbiAgX19leHRlbmRzID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH07XG5cblN0ciA9IHJlcXVpcmUoXCIuL3N0cmluZ3NcIik7XG5cbkdlbmVyaWNSZWFkZXIgPSByZXF1aXJlKFwiLi9nZW5lcmljX3JlYWRlclwiKTtcblxuU2VxID0gcmVxdWlyZShcImJpb2pzLW1vZGVsXCIpLnNlcTtcblxubW9kdWxlLmV4cG9ydHMgPSBGYXN0YSA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgX19leHRlbmRzKEZhc3RhLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEZhc3RhKCkge1xuICAgIHJldHVybiBGYXN0YS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIEZhc3RhLnBhcnNlID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBjdXJyZW50U2VxLCBkYXRhYmFzZSwgZGF0YWJhc2VJRCwgaWRlbnRpZmllcnMsIGssIGxhYmVsLCBsaW5lLCBzZXFzLCBfaSwgX2xlbjtcbiAgICBzZXFzID0gW107XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0ZXh0KSAhPT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgdGV4dCA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgfVxuICAgIGZvciAoX2kgPSAwLCBfbGVuID0gdGV4dC5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgbGluZSA9IHRleHRbX2ldO1xuICAgICAgaWYgKGxpbmVbMF0gPT09IFwiPlwiIHx8IGxpbmVbMF0gPT09IFwiO1wiKSB7XG4gICAgICAgIGxhYmVsID0gbGluZS5zbGljZSgxKTtcbiAgICAgICAgY3VycmVudFNlcSA9IG5ldyBTZXEoXCJcIiwgbGFiZWwsIHNlcXMubGVuZ3RoKTtcbiAgICAgICAgc2Vxcy5wdXNoKGN1cnJlbnRTZXEpO1xuICAgICAgICBpZiAoU3RyLmNvbnRhaW5zKFwifFwiLCBsaW5lKSkge1xuICAgICAgICAgIGlkZW50aWZpZXJzID0gbGFiZWwuc3BsaXQoXCJ8XCIpO1xuICAgICAgICAgIGsgPSAxO1xuICAgICAgICAgIHdoaWxlIChrIDwgaWRlbnRpZmllcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhYmFzZSA9IGlkZW50aWZpZXJzW2tdO1xuICAgICAgICAgICAgZGF0YWJhc2VJRCA9IGlkZW50aWZpZXJzW2sgKyAxXTtcbiAgICAgICAgICAgIGN1cnJlbnRTZXEubWV0YVtkYXRhYmFzZV0gPSBkYXRhYmFzZUlEO1xuICAgICAgICAgICAgayArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50U2VxLm5hbWUgPSBpZGVudGlmaWVyc1tpZGVudGlmaWVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFNlcS5zZXEgKz0gbGluZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcXM7XG4gIH07XG5cbiAgcmV0dXJuIEZhc3RhO1xuXG59KShHZW5lcmljUmVhZGVyKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjBcbnZhciBVdGlscztcblxuVXRpbHMgPSB7fTtcblxuVXRpbHMuc3BsaXROQ2hhcnMgPSBmdW5jdGlvbih0eHQsIG51bSkge1xuICB2YXIgaSwgcmVzdWx0LCBfaSwgX3JlZjtcbiAgcmVzdWx0ID0gW107XG4gIGZvciAoaSA9IF9pID0gMCwgX3JlZiA9IHR4dC5sZW5ndGggLSAxOyBudW0gPiAwID8gX2kgPD0gX3JlZiA6IF9pID49IF9yZWY7IGkgPSBfaSArPSBudW0pIHtcbiAgICByZXN1bHQucHVzaCh0eHQuc3Vic3RyKGksIG51bSkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFV0aWxzO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjguMFxudmFyIEZhc3RhRXhwb3J0ZXIsIFV0aWxzO1xuXG5VdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhc3RhRXhwb3J0ZXIgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIEZhc3RhRXhwb3J0ZXIoKSB7fVxuXG4gIEZhc3RhRXhwb3J0ZXJbXCJleHBvcnRcIl0gPSBmdW5jdGlvbihzZXFzLCBhY2Nlc3MpIHtcbiAgICB2YXIgc2VxLCB0ZXh0LCBfaSwgX2xlbjtcbiAgICB0ZXh0ID0gXCJcIjtcbiAgICBmb3IgKF9pID0gMCwgX2xlbiA9IHNlcXMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIHNlcSA9IHNlcXNbX2ldO1xuICAgICAgaWYgKGFjY2VzcyAhPSBudWxsKSB7XG4gICAgICAgIHNlcSA9IGFjY2VzcyhzZXEpO1xuICAgICAgfVxuICAgICAgdGV4dCArPSBcIj5cIiArIHNlcS5uYW1lICsgXCJcXG5cIjtcbiAgICAgIHRleHQgKz0gKFV0aWxzLnNwbGl0TkNoYXJzKHNlcS5zZXEsIDgwKSkuam9pbihcIlxcblwiKTtcbiAgICAgIHRleHQgKz0gXCJcXG5cIjtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIEZhc3RhRXhwb3J0ZXI7XG5cbn0pKCk7XG4iLCJtb2R1bGUuZXhwb3J0cy5zZXEgPSByZXF1aXJlKFwiLi9zZXFcIik7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHNlcSwgbmFtZSwgaWQpIHtcbiAgICB0aGlzLnNlcSA9IHNlcTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLm1ldGEgPSB7fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3JjL2luZGV4LmpzJylcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBBOiBcIiMwMGEzNWNcIixcbiAgUjogXCIjMDBmYzAzXCIsXG4gIE46IFwiIzAwZWIxNFwiLFxuICBEOiBcIiMwMGViMTRcIixcbiAgQzogXCIjMDAwMGZmXCIsXG4gIFE6IFwiIzAwZjEwZVwiLFxuICBFOiBcIiMwMGYxMGVcIixcbiAgRzogXCIjMDA5ZDYyXCIsXG4gIEg6IFwiIzAwZDUyYVwiLFxuICBJOiBcIiMwMDU0YWJcIixcbiAgTDogXCIjMDA3Yjg0XCIsXG4gIEs6IFwiIzAwZmYwMFwiLFxuICBNOiBcIiMwMDk3NjhcIixcbiAgRjogXCIjMDA4Nzc4XCIsXG4gIFA6IFwiIzAwZTAxZlwiLFxuICBTOiBcIiMwMGQ1MmFcIixcbiAgVDogXCIjMDBkYjI0XCIsXG4gIFc6IFwiIzAwYTg1N1wiLFxuICBZOiBcIiMwMGU2MTlcIixcbiAgVjogXCIjMDA1ZmEwXCIsXG4gIEI6IFwiIzAwZWIxNFwiLFxuICBYOiBcIiMwMGI2NDlcIixcbiAgWjogXCIjMDBmMTBlXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIjQkJCQkJCXCIsXG4gIEI6IFwiZ3JleVwiLFxuICBDOiBcInllbGxvd1wiLFxuICBEOiBcInJlZFwiLFxuICBFOiBcInJlZFwiLFxuICBGOiBcIm1hZ2VudGFcIixcbiAgRzogXCJicm93blwiLFxuICBIOiBcIiMwMEZGRkZcIixcbiAgSTogXCIjQkJCQkJCXCIsXG4gIEo6IFwiI2ZmZlwiLFxuICBLOiBcIiMwMEZGRkZcIixcbiAgTDogXCIjQkJCQkJCXCIsXG4gIE06IFwiI0JCQkJCQlwiLFxuICBOOiBcImdyZWVuXCIsXG4gIE86IFwiI2ZmZlwiLFxuICBQOiBcImJyb3duXCIsXG4gIFE6IFwiZ3JlZW5cIixcbiAgUjogXCIjMDBGRkZGXCIsXG4gIFM6IFwiZ3JlZW5cIixcbiAgVDogXCJncmVlblwiLFxuICBVOiBcIiNmZmZcIixcbiAgVjogXCIjQkJCQkJCXCIsXG4gIFc6IFwibWFnZW50YVwiLFxuICBYOiBcImdyZXlcIixcbiAgWTogXCJtYWdlbnRhXCIsXG4gIFo6IFwiZ3JleVwiLFxuICBHYXA6IFwiZ3JleVwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwib3JhbmdlXCIsXG4gIEI6IFwiI2ZmZlwiLFxuICBDOiBcImdyZWVuXCIsXG4gIEQ6IFwicmVkXCIsXG4gIEU6IFwicmVkXCIsXG4gIEY6IFwiYmx1ZVwiLFxuICBHOiBcIm9yYW5nZVwiLFxuICBIOiBcInJlZFwiLFxuICBJOiBcImdyZWVuXCIsXG4gIEo6IFwiI2ZmZlwiLFxuICBLOiBcInJlZFwiLFxuICBMOiBcImdyZWVuXCIsXG4gIE06IFwiZ3JlZW5cIixcbiAgTjogXCIjZmZmXCIsXG4gIE86IFwiI2ZmZlwiLFxuICBQOiBcIm9yYW5nZVwiLFxuICBROiBcIiNmZmZcIixcbiAgUjogXCJyZWRcIixcbiAgUzogXCJvcmFuZ2VcIixcbiAgVDogXCJvcmFuZ2VcIixcbiAgVTogXCIjZmZmXCIsXG4gIFY6IFwiZ3JlZW5cIixcbiAgVzogXCJibHVlXCIsXG4gIFg6IFwiI2ZmZlwiLFxuICBZOiBcImJsdWVcIixcbiAgWjogXCIjZmZmXCIsXG4gIEdhcDogXCIjZmZmXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIjODBhMGYwXCIsXG4gIFI6IFwiI2YwMTUwNVwiLFxuICBOOiBcIiMwMGZmMDBcIixcbiAgRDogXCIjYzA0OGMwXCIsXG4gIEM6IFwiI2YwODA4MFwiLFxuICBROiBcIiMwMGZmMDBcIixcbiAgRTogXCIjYzA0OGMwXCIsXG4gIEc6IFwiI2YwOTA0OFwiLFxuICBIOiBcIiMxNWE0YTRcIixcbiAgSTogXCIjODBhMGYwXCIsXG4gIEw6IFwiIzgwYTBmMFwiLFxuICBLOiBcIiNmMDE1MDVcIixcbiAgTTogXCIjODBhMGYwXCIsXG4gIEY6IFwiIzgwYTBmMFwiLFxuICBQOiBcIiNmZmZmMDBcIixcbiAgUzogXCIjMDBmZjAwXCIsXG4gIFQ6IFwiIzAwZmYwMFwiLFxuICBXOiBcIiM4MGEwZjBcIixcbiAgWTogXCIjMTVhNGE0XCIsXG4gIFY6IFwiIzgwYTBmMFwiLFxuICBCOiBcIiNmZmZcIixcbiAgWDogXCIjZmZmXCIsXG4gIFo6IFwiI2ZmZlwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiI2U3MThlN1wiLFxuICBSOiBcIiM2ZjkwNmZcIixcbiAgTjogXCIjMWJlNDFiXCIsXG4gIEQ6IFwiIzc3ODg3N1wiLFxuICBDOiBcIiMyM2RjMjNcIixcbiAgUTogXCIjOTI2ZDkyXCIsXG4gIEU6IFwiI2ZmMDBmZlwiLFxuICBHOiBcIiMwMGZmMDBcIixcbiAgSDogXCIjNzU4YTc1XCIsXG4gIEk6IFwiIzhhNzU4YVwiLFxuICBMOiBcIiNhZTUxYWVcIixcbiAgSzogXCIjYTA1ZmEwXCIsXG4gIE06IFwiI2VmMTBlZlwiLFxuICBGOiBcIiM5ODY3OThcIixcbiAgUDogXCIjMDBmZjAwXCIsXG4gIFM6IFwiIzM2YzkzNlwiLFxuICBUOiBcIiM0N2I4NDdcIixcbiAgVzogXCIjOGE3NThhXCIsXG4gIFk6IFwiIzIxZGUyMVwiLFxuICBWOiBcIiM4NTdhODVcIixcbiAgQjogXCIjNDliNjQ5XCIsXG4gIFg6IFwiIzc1OGE3NVwiLFxuICBaOiBcIiNjOTM2YzlcIlxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBBOiBcIiNhZDAwNTJcIixcbiAgQjogXCIjMGMwMGYzXCIsXG4gIEM6IFwiI2MyMDAzZFwiLFxuICBEOiBcIiMwYzAwZjNcIixcbiAgRTogXCIjMGMwMGYzXCIsXG4gIEY6IFwiI2NiMDAzNFwiLFxuICBHOiBcIiM2YTAwOTVcIixcbiAgSDogXCIjMTUwMGVhXCIsXG4gIEk6IFwiI2ZmMDAwMFwiLFxuICBKOiBcIiNmZmZcIixcbiAgSzogXCIjMDAwMGZmXCIsXG4gIEw6IFwiI2VhMDAxNVwiLFxuICBNOiBcIiNiMDAwNGZcIixcbiAgTjogXCIjMGMwMGYzXCIsXG4gIE86IFwiI2ZmZlwiLFxuICBQOiBcIiM0NjAwYjlcIixcbiAgUTogXCIjMGMwMGYzXCIsXG4gIFI6IFwiIzAwMDBmZlwiLFxuICBTOiBcIiM1ZTAwYTFcIixcbiAgVDogXCIjNjEwMDllXCIsXG4gIFU6IFwiI2ZmZlwiLFxuICBWOiBcIiNmNjAwMDlcIixcbiAgVzogXCIjNWIwMGE0XCIsXG4gIFg6IFwiIzY4MDA5N1wiLFxuICBZOiBcIiM0ZjAwYjBcIixcbiAgWjogXCIjMGMwMGYzXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cy5zZWxlY3RvciA9IHJlcXVpcmUoXCIuL3NlbGVjdG9yXCIpO1xuXG4vLyBiYXNpY3Ncbm1vZHVsZS5leHBvcnRzLnRheWxvciA9IHJlcXVpcmUoXCIuL3RheWxvclwiKTtcbm1vZHVsZS5leHBvcnRzLnphcHBvPSByZXF1aXJlKFwiLi96YXBwb1wiKTtcbm1vZHVsZS5leHBvcnRzLmh5ZHJvPSByZXF1aXJlKFwiLi9oeWRyb3Bob2JpY2l0eVwiKTtcblxubW9kdWxlLmV4cG9ydHMuY2x1c3RhbCA9IHJlcXVpcmUoXCIuL2NsdXN0YWxcIik7XG5tb2R1bGUuZXhwb3J0cy5jbHVzdGFsMiA9IHJlcXVpcmUoXCIuL2NsdXN0YWwyXCIpO1xuXG5tb2R1bGUuZXhwb3J0cy5jdXJpZWQgPSByZXF1aXJlKFwiLi9idXJpZWRcIik7XG5tb2R1bGUuZXhwb3J0cy5jaW5lbWEgPSByZXF1aXJlKFwiLi9jaW5lbWFcIik7XG5tb2R1bGUuZXhwb3J0cy5udWNsZW90aWRlICA9IHJlcXVpcmUoXCIuL251Y2xlb3RpZGVcIik7XG5tb2R1bGUuZXhwb3J0cy5oZWxpeCAgPSByZXF1aXJlKFwiLi9oZWxpeFwiKTtcbm1vZHVsZS5leHBvcnRzLmxlc2sgID0gcmVxdWlyZShcIi4vbGVza1wiKTtcbm1vZHVsZS5leHBvcnRzLm1hZSA9IHJlcXVpcmUoXCIuL21hZVwiKTtcbm1vZHVsZS5leHBvcnRzLnB1cmluZSA9IHJlcXVpcmUoXCIuL3B1cmluZVwiKTtcbm1vZHVsZS5leHBvcnRzLnN0cmFuZCA9IHJlcXVpcmUoXCIuL3N0cmFuZFwiKTtcbm1vZHVsZS5leHBvcnRzLnR1cm4gPSByZXF1aXJlKFwiLi90dXJuXCIpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiIG9yYW5nZVwiLFxuICBCOiBcIiAjZmZmXCIsXG4gIEM6IFwiIGdyZWVuXCIsXG4gIEQ6IFwiIHJlZFwiLFxuICBFOiBcIiByZWRcIixcbiAgRjogXCIgZ3JlZW5cIixcbiAgRzogXCIgb3JhbmdlXCIsXG4gIEg6IFwiIG1hZ2VudGFcIixcbiAgSTogXCIgZ3JlZW5cIixcbiAgSjogXCIgI2ZmZlwiLFxuICBLOiBcIiByZWRcIixcbiAgTDogXCIgZ3JlZW5cIixcbiAgTTogXCIgZ3JlZW5cIixcbiAgTjogXCIgbWFnZW50YVwiLFxuICBPOiBcIiAjZmZmXCIsXG4gIFA6IFwiIGdyZWVuXCIsXG4gIFE6IFwiIG1hZ2VudGFcIixcbiAgUjogXCIgcmVkXCIsXG4gIFM6IFwiIG9yYW5nZVwiLFxuICBUOiBcIiBvcmFuZ2VcIixcbiAgVTogXCIgI2ZmZlwiLFxuICBWOiBcIiBncmVlblwiLFxuICBXOiBcIiBncmVlblwiLFxuICBYOiBcIiAjZmZmXCIsXG4gIFk6IFwiIGdyZWVuXCIsXG4gIFo6IFwiICNmZmZcIixcbiAgR2FwOiBcIiAjZmZmXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIgIzc3ZGQ4OFwiLFxuICBCOiBcIiAjZmZmXCIsXG4gIEM6IFwiICM5OWVlNjZcIixcbiAgRDogXCIgIzU1YmIzM1wiLFxuICBFOiBcIiAjNTViYjMzXCIsXG4gIEY6IFwiICM5OTk5ZmZcIixcbiAgRzogXCIgIzc3ZGQ4OFwiLFxuICBIOiBcIiAjNTU1NWZmXCIsXG4gIEk6IFwiICM2NmJiZmZcIixcbiAgSjogXCIgI2ZmZlwiLFxuICBLOiBcIiAjZmZjYzc3XCIsXG4gIEw6IFwiICM2NmJiZmZcIixcbiAgTTogXCIgIzY2YmJmZlwiLFxuICBOOiBcIiAjNTViYjMzXCIsXG4gIE86IFwiICNmZmZcIixcbiAgUDogXCIgI2VlYWFhYVwiLFxuICBROiBcIiAjNTViYjMzXCIsXG4gIFI6IFwiICNmZmNjNzdcIixcbiAgUzogXCIgI2ZmNDQ1NVwiLFxuICBUOiBcIiAjZmY0NDU1XCIsXG4gIFU6IFwiICNmZmZcIixcbiAgVjogXCIgIzY2YmJmZlwiLFxuICBXOiBcIiAjOTk5OWZmXCIsXG4gIFg6IFwiICNmZmZcIixcbiAgWTogXCIgIzk5OTlmZlwiLFxuICBaOiBcIiAjZmZmXCIsXG4gIEdhcDogXCIgI2ZmZlwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiICM2NEY3M0ZcIixcbiAgQzogXCIgI0ZGQjM0MFwiLFxuICBHOiBcIiAjRUI0MTNDXCIsXG4gIFQ6IFwiICMzQzg4RUVcIixcbiAgVTogXCIgIzNDODhFRVwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiICNGRjgzRkFcIixcbiAgQzogXCIgIzQwRTBEMFwiLFxuICBHOiBcIiAjRkY4M0ZBXCIsXG4gIFI6IFwiICNGRjgzRkFcIixcbiAgVDogXCIgIzQwRTBEMFwiLFxuICBVOiBcIiAjNDBFMEQwXCIsXG4gIFk6IFwiICM0MEUwRDBcIlxufTtcbiIsInZhciBCdXJpZWQgPSByZXF1aXJlKFwiLi9idXJpZWRcIik7XG52YXIgQ2luZW1hID0gcmVxdWlyZShcIi4vY2luZW1hXCIpO1xudmFyIENsdXN0YWwgPSByZXF1aXJlKFwiLi9jbHVzdGFsXCIpO1xudmFyIENsdXN0YWwyID0gcmVxdWlyZShcIi4vY2x1c3RhbDJcIik7XG52YXIgSGVsaXggPSByZXF1aXJlKFwiLi9oZWxpeFwiKTtcbnZhciBIeWRybyA9IHJlcXVpcmUoXCIuL2h5ZHJvcGhvYmljaXR5XCIpO1xudmFyIExlc2sgPSByZXF1aXJlKFwiLi9sZXNrXCIpO1xudmFyIE1hZSA9IHJlcXVpcmUoXCIuL21hZVwiKTtcbnZhciBOdWNsZW90aWRlID0gcmVxdWlyZShcIi4vbnVjbGVvdGlkZVwiKTtcbnZhciBQdXJpbmUgPSByZXF1aXJlKFwiLi9wdXJpbmVcIik7XG52YXIgU3RyYW5kID0gcmVxdWlyZShcIi4vc3RyYW5kXCIpO1xudmFyIFRheWxvciA9IHJlcXVpcmUoXCIuL3RheWxvclwiKTtcbnZhciBUdXJuID0gcmVxdWlyZShcIi4vdHVyblwiKTtcbnZhciBaYXBwbyA9IHJlcXVpcmUoXCIuL3phcHBvXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9ycyA9IHtcbiAgbWFwcGluZzoge1xuICAgIGJ1cmllZDogQnVyaWVkLFxuICAgIGJ1cmllZF9pbmRleDogQnVyaWVkLFxuICAgIGNpbmVtYTogQ2luZW1hLFxuICAgIGNsdXN0YWwyOiBDbHVzdGFsMixcbiAgICBjbHVzdGFsOiBDbHVzdGFsLFxuICAgIGhlbGl4OiBIZWxpeCxcbiAgICBoZWxpeF9wcm9wZW5zaXR5OiBIZWxpeCxcbiAgICBoeWRybzogSHlkcm8sXG4gICAgbGVzazogTGVzayxcbiAgICBtYWU6IE1hZSxcbiAgICBudWNsZW90aWRlOiBOdWNsZW90aWRlLFxuICAgIHB1cmluZTogUHVyaW5lLFxuICAgIHB1cmluZV9weXJpbWlkaW5lOiBQdXJpbmUsXG4gICAgc3RyYW5kOiBTdHJhbmQsXG4gICAgc3RyYW5kX3Byb3BlbnNpdHk6IFN0cmFuZCxcbiAgICB0YXlsb3I6IFRheWxvcixcbiAgICB0dXJuOiBUdXJuLFxuICAgIHR1cm5fcHJvcGVuc2l0eTogVHVybixcbiAgICB6YXBwbzogWmFwcG8sXG4gIH0sXG4gIGdldENvbG9yOiBmdW5jdGlvbihzY2hlbWUpIHtcbiAgICB2YXIgY29sb3IgPSBDb2xvcnMubWFwcGluZ1tzY2hlbWVdO1xuICAgIGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb2xvciA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIjNTg1OGE3XCIsXG4gIFI6IFwiIzZiNmI5NFwiLFxuICBOOiBcIiM2NDY0OWJcIixcbiAgRDogXCIjMjEyMWRlXCIsXG4gIEM6IFwiIzlkOWQ2MlwiLFxuICBROiBcIiM4YzhjNzNcIixcbiAgRTogXCIjMDAwMGZmXCIsXG4gIEc6IFwiIzQ5NDliNlwiLFxuICBIOiBcIiM2MDYwOWZcIixcbiAgSTogXCIjZWNlYzEzXCIsXG4gIEw6IFwiI2IyYjI0ZFwiLFxuICBLOiBcIiM0NzQ3YjhcIixcbiAgTTogXCIjODI4MjdkXCIsXG4gIEY6IFwiI2MyYzIzZFwiLFxuICBQOiBcIiMyMzIzZGNcIixcbiAgUzogXCIjNDk0OWI2XCIsXG4gIFQ6IFwiIzlkOWQ2MlwiLFxuICBXOiBcIiNjMGMwM2ZcIixcbiAgWTogXCIjZDNkMzJjXCIsXG4gIFY6IFwiI2ZmZmYwMFwiLFxuICBCOiBcIiM0MzQzYmNcIixcbiAgWDogXCIjNzk3OTg2XCIsXG4gIFo6IFwiIzQ3NDdiOFwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiI2NjZmYwMFwiLFxuICBSOiBcIiMwMDAwZmZcIixcbiAgTjogXCIjY2MwMGZmXCIsXG4gIEQ6IFwiI2ZmMDAwMFwiLFxuICBDOiBcIiNmZmZmMDBcIixcbiAgUTogXCIjZmYwMGNjXCIsXG4gIEU6IFwiI2ZmMDA2NlwiLFxuICBHOiBcIiNmZjk5MDBcIixcbiAgSDogXCIjMDA2NmZmXCIsXG4gIEk6IFwiIzY2ZmYwMFwiLFxuICBMOiBcIiMzM2ZmMDBcIixcbiAgSzogXCIjNjYwMGZmXCIsXG4gIE06IFwiIzAwZmYwMFwiLFxuICBGOiBcIiMwMGZmNjZcIixcbiAgUDogXCIjZmZjYzAwXCIsXG4gIFM6IFwiI2ZmMzMwMFwiLFxuICBUOiBcIiNmZjY2MDBcIixcbiAgVzogXCIjMDBjY2ZmXCIsXG4gIFk6IFwiIzAwZmZjY1wiLFxuICBWOiBcIiM5OWZmMDBcIixcbiAgQjogXCIjZmZmXCIsXG4gIFg6IFwiI2ZmZlwiLFxuICBaOiBcIiNmZmZcIlxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBBOiBcIiMyY2QzZDNcIixcbiAgUjogXCIjNzA4ZjhmXCIsXG4gIE46IFwiI2ZmMDAwMFwiLFxuICBEOiBcIiNlODE3MTdcIixcbiAgQzogXCIjYTg1NzU3XCIsXG4gIFE6IFwiIzNmYzBjMFwiLFxuICBFOiBcIiM3Nzg4ODhcIixcbiAgRzogXCIjZmYwMDAwXCIsXG4gIEg6IFwiIzcwOGY4ZlwiLFxuICBJOiBcIiMwMGZmZmZcIixcbiAgTDogXCIjMWNlM2UzXCIsXG4gIEs6IFwiIzdlODE4MVwiLFxuICBNOiBcIiMxZWUxZTFcIixcbiAgRjogXCIjMWVlMWUxXCIsXG4gIFA6IFwiI2Y2MDkwOVwiLFxuICBTOiBcIiNlMTFlMWVcIixcbiAgVDogXCIjNzM4YzhjXCIsXG4gIFc6IFwiIzczOGM4Y1wiLFxuICBZOiBcIiM5ZDYyNjJcIixcbiAgVjogXCIjMDdmOGY4XCIsXG4gIEI6IFwiI2YzMGMwY1wiLFxuICBYOiBcIiM3YzgzODNcIixcbiAgWjogXCIjNWJhNGE0XCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIjZmZhZmFmXCIsXG4gIFI6IFwiIzY0NjRmZlwiLFxuICBOOiBcIiMwMGZmMDBcIixcbiAgRDogXCIjZmYwMDAwXCIsXG4gIEM6IFwiI2ZmZmYwMFwiLFxuICBROiBcIiMwMGZmMDBcIixcbiAgRTogXCIjZmYwMDAwXCIsXG4gIEc6IFwiI2ZmMDBmZlwiLFxuICBIOiBcIiM2NDY0ZmZcIixcbiAgSTogXCIjZmZhZmFmXCIsXG4gIEw6IFwiI2ZmYWZhZlwiLFxuICBLOiBcIiM2NDY0ZmZcIixcbiAgTTogXCIjZmZhZmFmXCIsXG4gIEY6IFwiI2ZmYzgwMFwiLFxuICBQOiBcIiNmZjAwZmZcIixcbiAgUzogXCIjMDBmZjAwXCIsXG4gIFQ6IFwiIzAwZmYwMFwiLFxuICBXOiBcIiNmZmM4MDBcIixcbiAgWTogXCIjZmZjODAwXCIsXG4gIFY6IFwiI2ZmYWZhZlwiLFxuICBCOiBcIiNmZmZcIixcbiAgWDogXCIjZmZmXCIsXG4gIFo6IFwiI2ZmZlwiXG59O1xuIiwiLypcbiAqIEphdmFTY3JpcHQgQ2FudmFzIHRvIEJsb2IgMi4wLjVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtQ2FudmFzLXRvLUJsb2JcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb24gc3RhY2tvdmVyZmxvdyB1c2VyIFN0b2l2ZSdzIGNvZGUgc25pcHBldDpcbiAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzQ5OTg5MDhcbiAqL1xudmFyIENhbnZhc1Byb3RvdHlwZSA9IHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCAmJlxud2luZG93LkhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZSxcbiAgaGFzQmxvYkNvbnN0cnVjdG9yID0gd2luZG93LkJsb2IgJiYgKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4obmV3IEJsb2IoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSgpKSxcbiAgaGFzQXJyYXlCdWZmZXJWaWV3U3VwcG9ydCA9IGhhc0Jsb2JDb25zdHJ1Y3RvciAmJiB3aW5kb3cuVWludDhBcnJheSAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IEJsb2IoW25ldyBVaW50OEFycmF5KDEwMCldKS5zaXplID09PSAxMDA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSgpKSxcbiAgQmxvYkJ1aWxkZXIgPSB3aW5kb3cuQmxvYkJ1aWxkZXIgfHwgd2luZG93LldlYktpdEJsb2JCdWlsZGVyIHx8XG4gIHdpbmRvdy5Nb3pCbG9iQnVpbGRlciB8fCB3aW5kb3cuTVNCbG9iQnVpbGRlcixcbiAgZGF0YVVSTHRvQmxvYiA9IChoYXNCbG9iQ29uc3RydWN0b3IgfHwgQmxvYkJ1aWxkZXIpICYmIHdpbmRvdy5hdG9iICYmXG4gIHdpbmRvdy5BcnJheUJ1ZmZlciAmJiB3aW5kb3cuVWludDhBcnJheSAmJiBmdW5jdGlvbiAoZGF0YVVSSSkge1xuICAgIHZhciBieXRlU3RyaW5nLFxuICAgIGFycmF5QnVmZmVyLFxuICAgIGludEFycmF5LFxuICAgICAgaSxcbiAgICAgIG1pbWVTdHJpbmcsXG4gICAgICAgIGJiO1xuICAgIGlmIChkYXRhVVJJLnNwbGl0KCcsJylbMF0uaW5kZXhPZignYmFzZTY0JykgPj0gMCkge1xuICAgICAgLy8gQ29udmVydCBiYXNlNjQgdG8gcmF3IGJpbmFyeSBkYXRhIGhlbGQgaW4gYSBzdHJpbmc6XG4gICAgICBieXRlU3RyaW5nID0gYXRvYihkYXRhVVJJLnNwbGl0KCcsJylbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb252ZXJ0IGJhc2U2NC9VUkxFbmNvZGVkIGRhdGEgY29tcG9uZW50IHRvIHJhdyBiaW5hcnkgZGF0YTpcbiAgICAgIGJ5dGVTdHJpbmcgPSBkZWNvZGVVUklDb21wb25lbnQoZGF0YVVSSS5zcGxpdCgnLCcpWzFdKTtcbiAgICB9XG4gICAgLy8gV3JpdGUgdGhlIGJ5dGVzIG9mIHRoZSBzdHJpbmcgdG8gYW4gQXJyYXlCdWZmZXI6XG4gICAgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICAgIGludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpbnRBcnJheVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgLy8gU2VwYXJhdGUgb3V0IHRoZSBtaW1lIGNvbXBvbmVudDpcbiAgICBtaW1lU3RyaW5nID0gZGF0YVVSSS5zcGxpdCgnLCcpWzBdLnNwbGl0KCc6JylbMV0uc3BsaXQoJzsnKVswXTtcbiAgICAvLyBXcml0ZSB0aGUgQXJyYXlCdWZmZXIgKG9yIEFycmF5QnVmZmVyVmlldykgdG8gYSBibG9iOlxuICAgIGlmIChoYXNCbG9iQ29uc3RydWN0b3IpIHtcbiAgICAgIHJldHVybiBuZXcgQmxvYihcbiAgICAgICAgICBbaGFzQXJyYXlCdWZmZXJWaWV3U3VwcG9ydCA/IGludEFycmF5IDogYXJyYXlCdWZmZXJdLFxuICAgICAgICAgIHt0eXBlOiBtaW1lU3RyaW5nfVxuICAgICAgICAgICk7XG4gICAgfVxuICAgIGJiID0gbmV3IEJsb2JCdWlsZGVyKCk7XG4gICAgYmIuYXBwZW5kKGFycmF5QnVmZmVyKTtcbiAgICByZXR1cm4gYmIuZ2V0QmxvYihtaW1lU3RyaW5nKTtcbiAgfTtcbmlmICh3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQgJiYgIUNhbnZhc1Byb3RvdHlwZS50b0Jsb2IpIHtcbiAgaWYgKENhbnZhc1Byb3RvdHlwZS5tb3pHZXRBc0ZpbGUpIHtcbiAgICBDYW52YXNQcm90b3R5cGUudG9CbG9iID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0eXBlLCBxdWFsaXR5KSB7XG4gICAgICBpZiAocXVhbGl0eSAmJiBDYW52YXNQcm90b3R5cGUudG9EYXRhVVJMICYmIGRhdGFVUkx0b0Jsb2IpIHtcbiAgICAgICAgY2FsbGJhY2soZGF0YVVSTHRvQmxvYih0aGlzLnRvRGF0YVVSTCh0eXBlLCBxdWFsaXR5KSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5tb3pHZXRBc0ZpbGUoJ2Jsb2InLCB0eXBlKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIGlmIChDYW52YXNQcm90b3R5cGUudG9EYXRhVVJMICYmIGRhdGFVUkx0b0Jsb2IpIHtcbiAgICBDYW52YXNQcm90b3R5cGUudG9CbG9iID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0eXBlLCBxdWFsaXR5KSB7XG4gICAgICBjYWxsYmFjayhkYXRhVVJMdG9CbG9iKHRoaXMudG9EYXRhVVJMKHR5cGUsIHF1YWxpdHkpKSk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRhdGFVUkx0b0Jsb2I7XG4iLCIvKiBGaWxlU2F2ZXIuanNcbiAqICBBIHNhdmVBcygpIEZpbGVTYXZlciBpbXBsZW1lbnRhdGlvbi5cbiAqICAyMDE0LTA1LTI3XG4gKlxuICogIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cbiAqICBMaWNlbnNlOiBYMTEvTUlUXG4gKiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWRcbiAqL1xuXG4vKmdsb2JhbCBzZWxmICovXG4vKmpzbGludCBiaXR3aXNlOiB0cnVlLCBpbmRlbnQ6IDQsIGxheGJyZWFrOiB0cnVlLCBsYXhjb21tYTogdHJ1ZSwgc21hcnR0YWJzOiB0cnVlLCBwbHVzcGx1czogdHJ1ZSAqL1xuXG4vKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvRmlsZVNhdmVyLmpzL2Jsb2IvbWFzdGVyL0ZpbGVTYXZlci5qcyAqL1xuXG52YXIgc2F2ZUFzID0gc2F2ZUFzXG4gIC8vIElFIDEwKyAobmF0aXZlIHNhdmVBcylcbiAgfHwgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iICYmIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iLmJpbmQobmF2aWdhdG9yKSlcbiAgLy8gRXZlcnlvbmUgZWxzZVxuICB8fCAoZnVuY3Rpb24odmlldykge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0Ly8gSUUgPDEwIGlzIGV4cGxpY2l0bHkgdW5zdXBwb3J0ZWRcblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0ICAgIC9NU0lFIFsxLTldXFwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhclxuXHRcdCAgZG9jID0gdmlldy5kb2N1bWVudFxuXHRcdCAgLy8gb25seSBnZXQgVVJMIHdoZW4gbmVjZXNzYXJ5IGluIGNhc2UgQmxvYi5qcyBoYXNuJ3Qgb3ZlcnJpZGRlbiBpdCB5ZXRcblx0XHQsIGdldF9VUkwgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB2aWV3LlVSTCB8fCB2aWV3LndlYmtpdFVSTCB8fCB2aWV3O1xuXHRcdH1cblx0XHQsIHNhdmVfbGluayA9IGRvYy5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsIFwiYVwiKVxuXHRcdCwgY2FuX3VzZV9zYXZlX2xpbmsgPSAhdmlldy5leHRlcm5hbEhvc3QgJiYgXCJkb3dubG9hZFwiIGluIHNhdmVfbGlua1xuXHRcdCwgY2xpY2sgPSBmdW5jdGlvbihub2RlKSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBkb2MuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtcblx0XHRcdGV2ZW50LmluaXRNb3VzZUV2ZW50KFxuXHRcdFx0XHRcImNsaWNrXCIsIHRydWUsIGZhbHNlLCB2aWV3LCAwLCAwLCAwLCAwLCAwXG5cdFx0XHRcdCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGxcblx0XHRcdCk7XG5cdFx0XHRub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHRcdH1cblx0XHQsIHdlYmtpdF9yZXFfZnMgPSB2aWV3LndlYmtpdFJlcXVlc3RGaWxlU3lzdGVtXG5cdFx0LCByZXFfZnMgPSB2aWV3LnJlcXVlc3RGaWxlU3lzdGVtIHx8IHdlYmtpdF9yZXFfZnMgfHwgdmlldy5tb3pSZXF1ZXN0RmlsZVN5c3RlbVxuXHRcdCwgdGhyb3dfb3V0c2lkZSA9IGZ1bmN0aW9uKGV4KSB7XG5cdFx0XHQodmlldy5zZXRJbW1lZGlhdGUgfHwgdmlldy5zZXRUaW1lb3V0KShmdW5jdGlvbigpIHtcblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0XHR9LCAwKTtcblx0XHR9XG5cdFx0LCBmb3JjZV9zYXZlYWJsZV90eXBlID0gXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuXHRcdCwgZnNfbWluX3NpemUgPSAwXG5cdFx0LCBkZWxldGlvbl9xdWV1ZSA9IFtdXG5cdFx0LCBwcm9jZXNzX2RlbGV0aW9uX3F1ZXVlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IGRlbGV0aW9uX3F1ZXVlLmxlbmd0aDtcblx0XHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdFx0dmFyIGZpbGUgPSBkZWxldGlvbl9xdWV1ZVtpXTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmaWxlID09PSBcInN0cmluZ1wiKSB7IC8vIGZpbGUgaXMgYW4gb2JqZWN0IFVSTFxuXHRcdFx0XHRcdGdldF9VUkwoKS5yZXZva2VPYmplY3RVUkwoZmlsZSk7XG5cdFx0XHRcdH0gZWxzZSB7IC8vIGZpbGUgaXMgYSBGaWxlXG5cdFx0XHRcdFx0ZmlsZS5yZW1vdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGVsZXRpb25fcXVldWUubGVuZ3RoID0gMDsgLy8gY2xlYXIgcXVldWVcblx0XHR9XG5cdFx0LCBkaXNwYXRjaCA9IGZ1bmN0aW9uKGZpbGVzYXZlciwgZXZlbnRfdHlwZXMsIGV2ZW50KSB7XG5cdFx0XHRldmVudF90eXBlcyA9IFtdLmNvbmNhdChldmVudF90eXBlcyk7XG5cdFx0XHR2YXIgaSA9IGV2ZW50X3R5cGVzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdFx0dmFyIGxpc3RlbmVyID0gZmlsZXNhdmVyW1wib25cIiArIGV2ZW50X3R5cGVzW2ldXTtcblx0XHRcdFx0aWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGxpc3RlbmVyLmNhbGwoZmlsZXNhdmVyLCBldmVudCB8fCBmaWxlc2F2ZXIpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGV4KSB7XG5cdFx0XHRcdFx0XHR0aHJvd19vdXRzaWRlKGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0LCBGaWxlU2F2ZXIgPSBmdW5jdGlvbihibG9iLCBuYW1lKSB7XG5cdFx0XHQvLyBGaXJzdCB0cnkgYS5kb3dubG9hZCwgdGhlbiB3ZWIgZmlsZXN5c3RlbSwgdGhlbiBvYmplY3QgVVJMc1xuXHRcdFx0dmFyXG5cdFx0XHRcdCAgZmlsZXNhdmVyID0gdGhpc1xuXHRcdFx0XHQsIHR5cGUgPSBibG9iLnR5cGVcblx0XHRcdFx0LCBibG9iX2NoYW5nZWQgPSBmYWxzZVxuXHRcdFx0XHQsIG9iamVjdF91cmxcblx0XHRcdFx0LCB0YXJnZXRfdmlld1xuXHRcdFx0XHQsIGdldF9vYmplY3RfdXJsID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIG9iamVjdF91cmwgPSBnZXRfVVJMKCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXHRcdFx0XHRcdGRlbGV0aW9uX3F1ZXVlLnB1c2gob2JqZWN0X3VybCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9iamVjdF91cmw7XG5cdFx0XHRcdH1cblx0XHRcdFx0LCBkaXNwYXRjaF9hbGwgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkaXNwYXRjaChmaWxlc2F2ZXIsIFwid3JpdGVzdGFydCBwcm9ncmVzcyB3cml0ZSB3cml0ZWVuZFwiLnNwbGl0KFwiIFwiKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gb24gYW55IGZpbGVzeXMgZXJyb3JzIHJldmVydCB0byBzYXZpbmcgd2l0aCBvYmplY3QgVVJMc1xuXHRcdFx0XHQsIGZzX2Vycm9yID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Ly8gZG9uJ3QgY3JlYXRlIG1vcmUgb2JqZWN0IFVSTHMgdGhhbiBuZWVkZWRcblx0XHRcdFx0XHRpZiAoYmxvYl9jaGFuZ2VkIHx8ICFvYmplY3RfdXJsKSB7XG5cdFx0XHRcdFx0XHRvYmplY3RfdXJsID0gZ2V0X29iamVjdF91cmwoYmxvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0YXJnZXRfdmlldykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0X3ZpZXcubG9jYXRpb24uaHJlZiA9IG9iamVjdF91cmw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHdpbmRvdy5vcGVuKG9iamVjdF91cmwsIFwiX2JsYW5rXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FO1xuXHRcdFx0XHRcdGRpc3BhdGNoX2FsbCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCwgYWJvcnRhYmxlID0gZnVuY3Rpb24oZnVuYykge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmIChmaWxlc2F2ZXIucmVhZHlTdGF0ZSAhPT0gZmlsZXNhdmVyLkRPTkUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdCwgY3JlYXRlX2lmX25vdF9mb3VuZCA9IHtjcmVhdGU6IHRydWUsIGV4Y2x1c2l2ZTogZmFsc2V9XG5cdFx0XHRcdCwgc2xpY2Vcblx0XHRcdDtcblx0XHRcdGZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLklOSVQ7XG5cdFx0XHRpZiAoIW5hbWUpIHtcblx0XHRcdFx0bmFtZSA9IFwiZG93bmxvYWRcIjtcblx0XHRcdH1cblx0XHRcdGlmIChjYW5fdXNlX3NhdmVfbGluaykge1xuXHRcdFx0XHRvYmplY3RfdXJsID0gZ2V0X29iamVjdF91cmwoYmxvYik7XG5cdFx0XHRcdHNhdmVfbGluay5ocmVmID0gb2JqZWN0X3VybDtcblx0XHRcdFx0c2F2ZV9saW5rLmRvd25sb2FkID0gbmFtZTtcblx0XHRcdFx0Y2xpY2soc2F2ZV9saW5rKTtcblx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0ZGlzcGF0Y2hfYWxsKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIE9iamVjdCBhbmQgd2ViIGZpbGVzeXN0ZW0gVVJMcyBoYXZlIGEgcHJvYmxlbSBzYXZpbmcgaW4gR29vZ2xlIENocm9tZSB3aGVuXG5cdFx0XHQvLyB2aWV3ZWQgaW4gYSB0YWIsIHNvIEkgZm9yY2Ugc2F2ZSB3aXRoIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVxuXHRcdFx0Ly8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTExNThcblx0XHRcdGlmICh2aWV3LmNocm9tZSAmJiB0eXBlICYmIHR5cGUgIT09IGZvcmNlX3NhdmVhYmxlX3R5cGUpIHtcblx0XHRcdFx0c2xpY2UgPSBibG9iLnNsaWNlIHx8IGJsb2Iud2Via2l0U2xpY2U7XG5cdFx0XHRcdGJsb2IgPSBzbGljZS5jYWxsKGJsb2IsIDAsIGJsb2Iuc2l6ZSwgZm9yY2Vfc2F2ZWFibGVfdHlwZSk7XG5cdFx0XHRcdGJsb2JfY2hhbmdlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBTaW5jZSBJIGNhbid0IGJlIHN1cmUgdGhhdCB0aGUgZ3Vlc3NlZCBtZWRpYSB0eXBlIHdpbGwgdHJpZ2dlciBhIGRvd25sb2FkXG5cdFx0XHQvLyBpbiBXZWJLaXQsIEkgYXBwZW5kIC5kb3dubG9hZCB0byB0aGUgZmlsZW5hbWUuXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NDBcblx0XHRcdGlmICh3ZWJraXRfcmVxX2ZzICYmIG5hbWUgIT09IFwiZG93bmxvYWRcIikge1xuXHRcdFx0XHRuYW1lICs9IFwiLmRvd25sb2FkXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZSA9PT0gZm9yY2Vfc2F2ZWFibGVfdHlwZSB8fCB3ZWJraXRfcmVxX2ZzKSB7XG5cdFx0XHRcdHRhcmdldF92aWV3ID0gdmlldztcblx0XHRcdH1cblx0XHRcdGlmICghcmVxX2ZzKSB7XG5cdFx0XHRcdGZzX2Vycm9yKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGZzX21pbl9zaXplICs9IGJsb2Iuc2l6ZTtcblx0XHRcdHJlcV9mcyh2aWV3LlRFTVBPUkFSWSwgZnNfbWluX3NpemUsIGFib3J0YWJsZShmdW5jdGlvbihmcykge1xuXHRcdFx0XHRmcy5yb290LmdldERpcmVjdG9yeShcInNhdmVkXCIsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGFib3J0YWJsZShmdW5jdGlvbihkaXIpIHtcblx0XHRcdFx0XHR2YXIgc2F2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0ZGlyLmdldEZpbGUobmFtZSwgY3JlYXRlX2lmX25vdF9mb3VuZCwgYWJvcnRhYmxlKGZ1bmN0aW9uKGZpbGUpIHtcblx0XHRcdFx0XHRcdFx0ZmlsZS5jcmVhdGVXcml0ZXIoYWJvcnRhYmxlKGZ1bmN0aW9uKHdyaXRlcikge1xuXHRcdFx0XHRcdFx0XHRcdHdyaXRlci5vbndyaXRlZW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRhcmdldF92aWV3LmxvY2F0aW9uLmhyZWYgPSBmaWxlLnRvVVJMKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZWxldGlvbl9xdWV1ZS5wdXNoKGZpbGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRcdFx0XHRcdGRpc3BhdGNoKGZpbGVzYXZlciwgXCJ3cml0ZWVuZFwiLCBldmVudCk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR3cml0ZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGVycm9yID0gd3JpdGVyLmVycm9yO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVycm9yLmNvZGUgIT09IGVycm9yLkFCT1JUX0VSUikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmc19lcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XCJ3cml0ZXN0YXJ0IHByb2dyZXNzIHdyaXRlIGFib3J0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdyaXRlcltcIm9uXCIgKyBldmVudF0gPSBmaWxlc2F2ZXJbXCJvblwiICsgZXZlbnRdO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdHdyaXRlci53cml0ZShibG9iKTtcblx0XHRcdFx0XHRcdFx0XHRmaWxlc2F2ZXIuYWJvcnQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdyaXRlci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLldSSVRJTkc7XG5cdFx0XHRcdFx0XHRcdH0pLCBmc19lcnJvcik7XG5cdFx0XHRcdFx0XHR9KSwgZnNfZXJyb3IpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0ZGlyLmdldEZpbGUobmFtZSwge2NyZWF0ZTogZmFsc2V9LCBhYm9ydGFibGUoZnVuY3Rpb24oZmlsZSkge1xuXHRcdFx0XHRcdFx0Ly8gZGVsZXRlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHNcblx0XHRcdFx0XHRcdGZpbGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRzYXZlKCk7XG5cdFx0XHRcdFx0fSksIGFib3J0YWJsZShmdW5jdGlvbihleCkge1xuXHRcdFx0XHRcdFx0aWYgKGV4LmNvZGUgPT09IGV4Lk5PVF9GT1VORF9FUlIpIHtcblx0XHRcdFx0XHRcdFx0c2F2ZSgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZnNfZXJyb3IoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH0pLCBmc19lcnJvcik7XG5cdFx0XHR9KSwgZnNfZXJyb3IpO1xuXHRcdH1cblx0XHQsIEZTX3Byb3RvID0gRmlsZVNhdmVyLnByb3RvdHlwZVxuXHRcdCwgc2F2ZUFzID0gZnVuY3Rpb24oYmxvYiwgbmFtZSkge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWxlU2F2ZXIoYmxvYiwgbmFtZSk7XG5cdFx0fVxuXHQ7XG5cdEZTX3Byb3RvLmFib3J0ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZpbGVzYXZlciA9IHRoaXM7XG5cdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRkaXNwYXRjaChmaWxlc2F2ZXIsIFwiYWJvcnRcIik7XG5cdH07XG5cdEZTX3Byb3RvLnJlYWR5U3RhdGUgPSBGU19wcm90by5JTklUID0gMDtcblx0RlNfcHJvdG8uV1JJVElORyA9IDE7XG5cdEZTX3Byb3RvLkRPTkUgPSAyO1xuXG5cdEZTX3Byb3RvLmVycm9yID1cblx0RlNfcHJvdG8ub253cml0ZXN0YXJ0ID1cblx0RlNfcHJvdG8ub25wcm9ncmVzcyA9XG5cdEZTX3Byb3RvLm9ud3JpdGUgPVxuXHRGU19wcm90by5vbmFib3J0ID1cblx0RlNfcHJvdG8ub25lcnJvciA9XG5cdEZTX3Byb3RvLm9ud3JpdGVlbmQgPVxuXHRcdG51bGw7XG5cblx0dmlldy5hZGRFdmVudExpc3RlbmVyKFwidW5sb2FkXCIsIHByb2Nlc3NfZGVsZXRpb25fcXVldWUsIGZhbHNlKTtcblx0c2F2ZUFzLnVubG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRcdHByb2Nlc3NfZGVsZXRpb25fcXVldWUoKTtcblx0XHR2aWV3LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIiwgcHJvY2Vzc19kZWxldGlvbl9xdWV1ZSwgZmFsc2UpO1xuXHR9O1xuXHRyZXR1cm4gc2F2ZUFzO1xufShcblx0ICAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZlxuXHR8fCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvd1xuXHR8fCB0aGlzLmNvbnRlbnRcbikpO1xuLy8gYHNlbGZgIGlzIHVuZGVmaW5lZCBpbiBGaXJlZm94IGZvciBBbmRyb2lkIGNvbnRlbnQgc2NyaXB0IGNvbnRleHRcbi8vIHdoaWxlIGB0aGlzYCBpcyBuc0lDb250ZW50RnJhbWVNZXNzYWdlTWFuYWdlclxuLy8gd2l0aCBhbiBhdHRyaWJ1dGUgYGNvbnRlbnRgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHdpbmRvd1xuXG5hbWREZWZpbmUgPSB3aW5kb3cuZGVmaW5lO1xuaWYoIHR5cGVvZiBhbWREZWZpbmUgPT09IFwidW5kZWZpbmVkXCIgJiYgKHR5cGVvZiB3aW5kb3cuYWxtb25kICE9PSBcInVuZGVmaW5lZFwiIFxuICAgICYmIFwiZGVmaW5lXCIgaW4gd2luZG93LmFsbW9uZCApKXtcbiAgYW1kRGVmaW5lID0gd2luZG93LmFsbW9uZC5kZWZpbmU7XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZSAhPT0gbnVsbCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn0gZWxzZSBpZiAoKHR5cGVvZiBhbWREZWZpbmUgIT09IFwidW5kZWZpbmVkXCIgJiYgYW1kRGVmaW5lICE9PSBudWxsKSAmJiAoYW1kRGVmaW5lLmFtZCAhPSBudWxsKSkge1xuICBhbWREZWZpbmUoXCJzYXZlQXNcIixbXSwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNhdmVBcztcbiAgfSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3MsIGN1c3RvbURvY3VtZW50KSB7XG4gIHZhciBkb2MgPSBjdXN0b21Eb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgaWYgKGRvYy5jcmVhdGVTdHlsZVNoZWV0KSB7XG4gICAgdmFyIHNoZWV0ID0gZG9jLmNyZWF0ZVN0eWxlU2hlZXQoKVxuICAgIHNoZWV0LmNzc1RleHQgPSBjc3M7XG4gICAgcmV0dXJuIHNoZWV0Lm93bmVyTm9kZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLFxuICAgICAgICBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXG4gICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG5cbiAgICBpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuICAgICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gICAgfVxuXG4gICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5ieVVybCA9IGZ1bmN0aW9uKHVybCkge1xuICBpZiAoZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KHVybCkub3duZXJOb2RlO1xuICB9IGVsc2Uge1xuICAgIHZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSxcbiAgICAgICAgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcblxuICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgIGxpbmsuaHJlZiA9IHVybDtcblxuICAgIGhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgcmV0dXJuIGxpbms7XG4gIH1cbn07XG4iLCJ2YXIgVXRpbHMgPSB7fTtcblxuXG4vKlxuUmVtb3ZlIGFuIGVsZW1lbnQgYW5kIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IGluc2VydHMgaXQgaW50byBpdHMgb3JpZ2luYWwgcG9zaXRpb25cbmh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL2FydGljbGVzL2phdmFzY3JpcHQtZG9tXG5AcGFyYW0gZWxlbWVudCB7RWxlbWVudH0gVGhlIGVsZW1lbnQgdG8gYmUgdGVtcG9yYXJpbHkgcmVtb3ZlZFxuQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCBpbnNlcnRzIHRoZSBlbGVtZW50IGludG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uXG4gKi9cblxuVXRpbHMucmVtb3ZlVG9JbnNlcnRMYXRlciA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgdmFyIG5leHRTaWJsaW5nLCBwYXJlbnROb2RlO1xuICBwYXJlbnROb2RlID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG4gIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9XG4gIH07XG59O1xuXG5cbi8qXG5mYXN0ZXN0IHBvc3NpYmxlIHdheSB0byBkZXN0cm95IGFsbCBzdWIgbm9kZXMgKGFrYSBjaGlsZHMpXG5odHRwOi8vanNwZXJmLmNvbS9pbm5lcmh0bWwtdnMtcmVtb3ZlY2hpbGQvMTVcbkBwYXJhbSBlbGVtZW50IHtFbGVtZW50fSBUaGUgZWxlbWVudCBmb3Igd2hpY2ggYWxsIGNoaWxkcyBzaG91bGQgYmUgcmVtb3ZlZFxuICovXG5cblV0aWxzLnJlbW92ZUFsbENoaWxkcyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgdmFyIGNvdW50O1xuICBjb3VudCA9IDA7XG4gIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBjb3VudCsrO1xuICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBVdGlscztcbiIsIi8qIVxuICogakJvbmUgdjEuMC4xOSAtIDIwMTQtMTAtMTIgLSBMaWJyYXJ5IGZvciBET00gbWFuaXB1bGF0aW9uXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2t1cHJpeWFuZW5rby9qYm9uZVxuICpcbiAqIENvcHlyaWdodCAyMDE0IEFsZXhleSBLdXByaXlhbmVua29cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4oZnVuY3Rpb24gKHdpbikge1xuXG52YXJcbi8vIGNhY2hlIHByZXZpb3VzIHZlcnNpb25zXG5fJCA9IHdpbi4kLFxuX2pCb25lID0gd2luLmpCb25lLFxuXG4vLyBRdWljayBtYXRjaCBhIHN0YW5kYWxvbmUgdGFnXG5ycXVpY2tTaW5nbGVUYWcgPSAvXjwoXFx3KylcXHMqXFwvPz4kLyxcblxuLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncbi8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoXG5ycXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcXHdcXFddKz4pW14+XSokfCMoW1xcd1xcLV0qKSQpLyxcblxuLy8gQWxpYXMgZm9yIGZ1bmN0aW9uXG5zbGljZSA9IFtdLnNsaWNlLFxuc3BsaWNlID0gW10uc3BsaWNlLFxua2V5cyA9IE9iamVjdC5rZXlzLFxuXG4vLyBBbGlhcyBmb3IgZ2xvYmFsIHZhcmlhYmxlc1xuZG9jID0gZG9jdW1lbnQsXG5cbmlzU3RyaW5nID0gZnVuY3Rpb24oZWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVsID09PSBcInN0cmluZ1wiO1xufSxcbmlzT2JqZWN0ID0gZnVuY3Rpb24oZWwpIHtcbiAgICByZXR1cm4gZWwgaW5zdGFuY2VvZiBPYmplY3Q7XG59LFxuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIGdldFR5cGUgPSB7fTtcbiAgICByZXR1cm4gZWwgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGVsKSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiO1xufSxcbmlzQXJyYXkgPSBmdW5jdGlvbihlbCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGVsKTtcbn0sXG5qQm9uZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IGZuLmluaXQoZWxlbWVudCwgZGF0YSk7XG59LFxuZm47XG5cbi8vIHNldCBwcmV2aW91cyB2YWx1ZXMgYW5kIHJldHVybiB0aGUgaW5zdGFuY2UgdXBvbiBjYWxsaW5nIHRoZSBuby1jb25mbGljdCBtb2RlXG5qQm9uZS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgd2luLiQgPSBfJDtcbiAgICB3aW4uakJvbmUgPSBfakJvbmU7XG5cbiAgICByZXR1cm4gakJvbmU7XG59O1xuXG5mbiA9IGpCb25lLmZuID0gakJvbmUucHJvdG90eXBlID0ge1xuICAgIGluaXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIGRhdGEpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzLCB0YWcsIHdyYXBlciwgZnJhZ21lbnQ7XG5cbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdHJpbmcoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBzaW5nbGUgRE9NIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWcgPSBycXVpY2tTaW5nbGVUYWcuZXhlYyhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXNbMF0gPSBkb2MuY3JlYXRlRWxlbWVudCh0YWdbMV0pO1xuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHIoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDcmVhdGUgRE9NIGNvbGxlY3Rpb25cbiAgICAgICAgICAgIGlmICgodGFnID0gcnF1aWNrRXhwci5leGVjKGVsZW1lbnQpKSAmJiB0YWdbMV0pIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICAgICAgd3JhcGVyID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgd3JhcGVyLmlubmVySFRNTCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHdyYXBlci5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQod3JhcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbGVtZW50cyA9IHNsaWNlLmNhbGwoZnJhZ21lbnQuY2hpbGROb2Rlcyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gakJvbmUubWVyZ2UodGhpcywgZWxlbWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmluZCBET00gZWxlbWVudHMgd2l0aCBxdWVyeVNlbGVjdG9yQWxsXG4gICAgICAgICAgICBpZiAoakJvbmUuaXNFbGVtZW50KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpCb25lKGRhdGEpLmZpbmQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMgPSBkb2MucXVlcnlTZWxlY3RvckFsbChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBqQm9uZS5tZXJnZSh0aGlzLCBlbGVtZW50cyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV3JhcCBET01FbGVtZW50XG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlKSB7XG4gICAgICAgICAgICB0aGlzWzBdID0gZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUnVuIGZ1bmN0aW9uXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiBqQm9uZSBlbGVtZW50IGFzIGlzXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgakJvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIGVsZW1lbnQgd3JhcHBlZCBieSBqQm9uZVxuICAgICAgICByZXR1cm4gakJvbmUubWFrZUFycmF5KGVsZW1lbnQsIHRoaXMpO1xuICAgIH0sXG5cbiAgICBwb3A6IFtdLnBvcCxcbiAgICBwdXNoOiBbXS5wdXNoLFxuICAgIHJldmVyc2U6IFtdLnJldmVyc2UsXG4gICAgc2hpZnQ6IFtdLnNoaWZ0LFxuICAgIHNvcnQ6IFtdLnNvcnQsXG4gICAgc3BsaWNlOiBbXS5zcGxpY2UsXG4gICAgc2xpY2U6IFtdLnNsaWNlLFxuICAgIGluZGV4T2Y6IFtdLmluZGV4T2YsXG4gICAgZm9yRWFjaDogW10uZm9yRWFjaCxcbiAgICB1bnNoaWZ0OiBbXS51bnNoaWZ0LFxuICAgIGNvbmNhdDogW10uY29uY2F0LFxuICAgIGpvaW46IFtdLmpvaW4sXG4gICAgZXZlcnk6IFtdLmV2ZXJ5LFxuICAgIHNvbWU6IFtdLnNvbWUsXG4gICAgZmlsdGVyOiBbXS5maWx0ZXIsXG4gICAgbWFwOiBbXS5tYXAsXG4gICAgcmVkdWNlOiBbXS5yZWR1Y2UsXG4gICAgcmVkdWNlUmlnaHQ6IFtdLnJlZHVjZVJpZ2h0LFxuICAgIGxlbmd0aDogMFxufTtcblxuZm4uY29uc3RydWN0b3IgPSBqQm9uZTtcblxuZm4uaW5pdC5wcm90b3R5cGUgPSBmbjtcblxuakJvbmUuc2V0SWQgPSBmdW5jdGlvbihlbCkge1xuICAgIHZhciBqaWQgPSBlbC5qaWQ7XG5cbiAgICBpZiAoZWwgPT09IHdpbikge1xuICAgICAgICBqaWQgPSBcIndpbmRvd1wiO1xuICAgIH0gZWxzZSBpZiAoZWwuamlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZWwuamlkID0gamlkID0gKytqQm9uZS5fY2FjaGUuamlkO1xuICAgIH1cblxuICAgIGlmICghakJvbmUuX2NhY2hlLmV2ZW50c1tqaWRdKSB7XG4gICAgICAgIGpCb25lLl9jYWNoZS5ldmVudHNbamlkXSA9IHt9O1xuICAgIH1cbn07XG5cbmpCb25lLmdldERhdGEgPSBmdW5jdGlvbihlbCkge1xuICAgIGVsID0gZWwgaW5zdGFuY2VvZiBqQm9uZSA/IGVsWzBdIDogZWw7XG5cbiAgICB2YXIgamlkID0gZWwgPT09IHdpbiA/IFwid2luZG93XCIgOiBlbC5qaWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBqaWQ6IGppZCxcbiAgICAgICAgZXZlbnRzOiBqQm9uZS5fY2FjaGUuZXZlbnRzW2ppZF1cbiAgICB9O1xufTtcblxuakJvbmUuaXNFbGVtZW50ID0gZnVuY3Rpb24oZWwpIHtcbiAgICByZXR1cm4gZWwgJiYgZWwgaW5zdGFuY2VvZiBqQm9uZSB8fCBlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IGlzU3RyaW5nKGVsKTtcbn07XG5cbmpCb25lLl9jYWNoZSA9IHtcbiAgICBldmVudHM6IHt9LFxuICAgIGppZDogMFxufTtcblxuZnVuY3Rpb24gaXNBcnJheWxpa2Uob2JqKSB7XG4gICAgdmFyIGxlbmd0aCA9IG9iai5sZW5ndGgsXG4gICAgICAgIHR5cGUgPSB0eXBlb2Ygb2JqO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24odHlwZSkgfHwgb2JqID09PSB3aW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChvYmoubm9kZVR5cGUgPT09IDEgJiYgbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpc0FycmF5KHR5cGUpIHx8IGxlbmd0aCA9PT0gMCB8fFxuICAgICAgICB0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgKGxlbmd0aCAtIDEpIGluIG9iajtcbn1cblxuakJvbmUubWVyZ2UgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7XG4gICAgdmFyIGwgPSBzZWNvbmQubGVuZ3RoLFxuICAgICAgICBpID0gZmlyc3QubGVuZ3RoLFxuICAgICAgICBqID0gMDtcblxuICAgIHdoaWxlIChqIDwgbCkge1xuICAgICAgICBmaXJzdFtpKytdID0gc2Vjb25kW2orK107XG4gICAgfVxuXG4gICAgZmlyc3QubGVuZ3RoID0gaTtcblxuICAgIHJldHVybiBmaXJzdDtcbn07XG5cbmpCb25lLmNvbnRhaW5zID0gZnVuY3Rpb24oY29udGFpbmVyLCBjb250YWluZWQpIHtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgY29udGFpbmVyLnJldmVyc2UoKS5zb21lKGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgIGlmIChlbC5jb250YWlucyhjb250YWluZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID0gZWw7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5qQm9uZS5leHRlbmQgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICB2YXIgaywga2wsIGksIHRnO1xuXG4gICAgc3BsaWNlLmNhbGwoYXJndW1lbnRzLCAxKS5mb3JFYWNoKGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgayA9IGtleXMob2JqZWN0KTtcbiAgICAgICAga2wgPSBrLmxlbmd0aDtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIHRnID0gdGFyZ2V0OyAvL2NhY2hpbmcgdGFyZ2V0IGZvciBwZXJmIGltcHJvdmVtZW50XG5cbiAgICAgICAgZm9yICg7IGkgPCBrbDsgaSsrKSB7XG4gICAgICAgICAgICB0Z1trW2ldXSA9IG9iamVjdFtrW2ldXTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG5cbmpCb25lLm1ha2VBcnJheSA9IGZ1bmN0aW9uKGFyciwgcmVzdWx0cykge1xuICAgIHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xuXG4gICAgaWYgKGFyciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNBcnJheWxpa2UoYXJyKSkge1xuICAgICAgICAgICAgakJvbmUubWVyZ2UocmV0LCBpc1N0cmluZyhhcnIpID8gW2Fycl0gOiBhcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0LnB1c2goYXJyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBCb25lRXZlbnQoZSwgZGF0YSkge1xuICAgIHZhciBrZXksIHNldHRlcjtcblxuICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IGU7XG5cbiAgICBzZXR0ZXIgPSBmdW5jdGlvbihrZXksIGUpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJwcmV2ZW50RGVmYXVsdFwiKSB7XG4gICAgICAgICAgICB0aGlzW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBlW2tleV0oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihlW2tleV0pKSB7XG4gICAgICAgICAgICB0aGlzW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZVtrZXldKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpc1trZXldID0gZVtrZXldO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoa2V5IGluIGUpIHtcbiAgICAgICAgaWYgKGVba2V5XSB8fCB0eXBlb2YgZVtrZXldID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHNldHRlci5jYWxsKHRoaXMsIGtleSwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBqQm9uZS5leHRlbmQodGhpcywgZGF0YSk7XG59XG5cbmpCb25lLkV2ZW50ID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcbiAgICB2YXIgbmFtZXNwYWNlLCBldmVudFR5cGU7XG5cbiAgICBpZiAoZXZlbnQudHlwZSAmJiAhZGF0YSkge1xuICAgICAgICBkYXRhID0gZXZlbnQ7XG4gICAgICAgIGV2ZW50ID0gZXZlbnQudHlwZTtcbiAgICB9XG5cbiAgICBuYW1lc3BhY2UgPSBldmVudC5zcGxpdChcIi5cIikuc3BsaWNlKDEpLmpvaW4oXCIuXCIpO1xuICAgIGV2ZW50VHlwZSA9IGV2ZW50LnNwbGl0KFwiLlwiKVswXTtcblxuICAgIGV2ZW50ID0gZG9jLmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEV2ZW50KGV2ZW50VHlwZSwgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gakJvbmUuZXh0ZW5kKGV2ZW50LCB7XG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICBpc0RlZmF1bHRQcmV2ZW50ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgICAgIH1cbiAgICB9LCBkYXRhKTtcbn07XG5cbmZuLm9uID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBjYWxsYmFjaywgdGFyZ2V0LCBuYW1lc3BhY2UsIGZuLCBldmVudHMsIGV2ZW50VHlwZSwgZXhwZWN0ZWRUYXJnZXQsIGFkZExpc3RlbmVyO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBhcmdzWzFdO1xuICAgICAgICBjYWxsYmFjayA9IGFyZ3NbMl07XG4gICAgfVxuXG4gICAgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICBqQm9uZS5zZXRJZChlbCk7XG4gICAgICAgIGV2ZW50cyA9IGpCb25lLmdldERhdGEoZWwpLmV2ZW50cztcbiAgICAgICAgZXZlbnQuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50LnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IGV2ZW50LnNwbGl0KFwiLlwiKS5zcGxpY2UoMSkuam9pbihcIi5cIik7XG4gICAgICAgICAgICBldmVudHNbZXZlbnRUeXBlXSA9IGV2ZW50c1tldmVudFR5cGVdIHx8IFtdO1xuXG4gICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5uYW1lc3BhY2UgJiYgZS5uYW1lc3BhY2UgIT09IG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoZWwsIGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAofmpCb25lKGVsKS5maW5kKHRhcmdldCkuaW5kZXhPZihlLnRhcmdldCkgfHwgKGV4cGVjdGVkVGFyZ2V0ID0gakJvbmUuY29udGFpbnMoakJvbmUoZWwpLmZpbmQodGFyZ2V0KSwgZS50YXJnZXQpKSkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFRhcmdldCA9IGV4cGVjdGVkVGFyZ2V0IHx8IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBlID0gbmV3IEJvbmVFdmVudChlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBleHBlY3RlZFRhcmdldFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGV4cGVjdGVkVGFyZ2V0LCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBldmVudHNbZXZlbnRUeXBlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBmbjogZm4sXG4gICAgICAgICAgICAgICAgb3JpZ2luZm46IGNhbGxiYWNrXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lciAmJiBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4sIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWRkTGlzdGVuZXIodGhpc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5vbmUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGNhbGxiYWNrLCB0YXJnZXQsIGFkZExpc3RlbmVyO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBhcmdzWzFdLCBjYWxsYmFjayA9IGFyZ3NbMl07XG4gICAgfVxuXG4gICAgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICBldmVudC5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGpCb25lKGVsKS5vZmYoZXZlbnQsIGZuKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGVsLCBlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgakJvbmUoZWwpLm9uKGV2ZW50LCBmbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGpCb25lKGVsKS5vbihldmVudCwgdGFyZ2V0LCBmbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZExpc3RlbmVyKHRoaXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4udHJpZ2dlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGV2ZW50cyA9IFtdLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGRpc3BhdGNoRXZlbnRzO1xuXG4gICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50cyA9IGV2ZW50LnNwbGl0KFwiIFwiKS5tYXAoZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBqQm9uZS5FdmVudChldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50ID0gZXZlbnQgaW5zdGFuY2VvZiBFdmVudCA/IGV2ZW50IDogakJvbmUuRXZlbnQoZXZlbnQpO1xuICAgICAgICBldmVudHMgPSBbZXZlbnRdO1xuICAgIH1cblxuICAgIGRpc3BhdGNoRXZlbnRzID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudCAmJiBlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGlzcGF0Y2hFdmVudHModGhpc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5vZmYgPSBmdW5jdGlvbihldmVudCwgZm4pIHtcbiAgICB2YXIgaSA9IDAsXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICByZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50cywgZXZlbnRUeXBlLCBpbmRleCwgZWwsIGUpIHtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjaztcblxuICAgICAgICAgICAgLy8gZ2V0IGNhbGxiYWNrXG4gICAgICAgICAgICBpZiAoKGZuICYmIGUub3JpZ2luZm4gPT09IGZuKSB8fCAhZm4pIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGUuZm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChldmVudHNbZXZlbnRUeXBlXVtpbmRleF0uZm4gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrKTtcblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBoYW5kbGVyIGZyb20gY2FjaGVcbiAgICAgICAgICAgICAgICBqQm9uZS5fY2FjaGUuZXZlbnRzW2pCb25lLmdldERhdGEoZWwpLmppZF1bZXZlbnRUeXBlXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBldmVudHMsIG5hbWVzcGFjZSwgcmVtb3ZlTGlzdGVuZXJzLCBldmVudFR5cGU7XG5cbiAgICByZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICB2YXIgbCwgZXZlbnRzQnlUeXBlLCBlO1xuXG4gICAgICAgIGV2ZW50cyA9IGpCb25lLmdldERhdGEoZWwpLmV2ZW50cztcblxuICAgICAgICBpZiAoIWV2ZW50cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBldmVudHNcbiAgICAgICAgaWYgKCFldmVudCAmJiBldmVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlzKGV2ZW50cykuZm9yRWFjaChmdW5jdGlvbihldmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBldmVudHNCeVR5cGUgPSBldmVudHNbZXZlbnRUeXBlXTtcbiAgICAgICAgICAgICAgICBsID0gZXZlbnRzQnlUeXBlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHdoaWxlKGwtLSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihldmVudHMsIGV2ZW50VHlwZSwgbCwgZWwsIGV2ZW50c0J5VHlwZVtsXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnRUeXBlID0gZXZlbnQuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICAgICAgbmFtZXNwYWNlID0gZXZlbnQuc3BsaXQoXCIuXCIpLnNwbGljZSgxKS5qb2luKFwiLlwiKTtcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIG5hbWVkIGV2ZW50c1xuICAgICAgICAgICAgaWYgKGV2ZW50c1tldmVudFR5cGVdKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRzQnlUeXBlID0gZXZlbnRzW2V2ZW50VHlwZV07XG4gICAgICAgICAgICAgICAgbCA9IGV2ZW50c0J5VHlwZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB3aGlsZShsLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IGV2ZW50c0J5VHlwZVtsXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2UgfHwgKG5hbWVzcGFjZSAmJiBlLm5hbWVzcGFjZSA9PT0gbmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBldmVudFR5cGUsIGwsIGVsLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgbmFtZXNwYWNlZCBldmVudHNcbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgIGtleXMoZXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudHNCeVR5cGUgPSBldmVudHNbZXZlbnRUeXBlXTtcbiAgICAgICAgICAgICAgICAgICAgbCA9IGV2ZW50c0J5VHlwZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUobC0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gZXZlbnRzQnlUeXBlW2xdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubmFtZXNwYWNlLnNwbGl0KFwiLlwiKVswXSA9PT0gbmFtZXNwYWNlLnNwbGl0KFwiLlwiKVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50cywgZXZlbnRUeXBlLCBsLCBlbCwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKHRoaXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4uZmluZCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBmaW5kZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZWwucXVlcnlTZWxlY3RvckFsbCkpIHtcbiAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvciksIGZ1bmN0aW9uKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChmb3VuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZpbmRlcih0aGlzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gakJvbmUocmVzdWx0cyk7XG59O1xuXG5mbi5nZXQgPSBmdW5jdGlvbihpbmRleCkge1xuICAgIHJldHVybiB0aGlzW2luZGV4XTtcbn07XG5cbmZuLmVxID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICByZXR1cm4gakJvbmUodGhpc1tpbmRleF0pO1xufTtcblxuZm4ucGFyZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghfnJlc3VsdHMuaW5kZXhPZihwYXJlbnQgPSB0aGlzW2ldLnBhcmVudEVsZW1lbnQpICYmIHBhcmVudCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gakJvbmUocmVzdWx0cyk7XG59O1xuXG5mbi50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNsaWNlLmNhbGwodGhpcyk7XG59O1xuXG5mbi5pcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbihlbCkge1xuICAgICAgICByZXR1cm4gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBhcmdzWzBdO1xuICAgIH0pO1xufTtcblxuZm4uaGFzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICByZXR1cm4gdGhpcy5zb21lKGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGFyZ3NbMF0pLmxlbmd0aDtcbiAgICB9KTtcbn07XG5cbmZuLmF0dHIgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aCxcbiAgICAgICAgc2V0dGVyO1xuXG4gICAgaWYgKGlzU3RyaW5nKGtleSkgJiYgYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbMF0gJiYgdGhpc1swXS5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICAgIGtleXMoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUobmFtZSwga2V5W25hbWVdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2V0dGVyKHRoaXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4ucmVtb3ZlQXR0ciA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXNbaV0ucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi52YWwgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpc1swXSAmJiB0aGlzWzBdLnZhbHVlO1xuICAgIH1cblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpc1tpXS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4uY3NzID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIHNldHRlcjtcblxuICAgIC8vIEdldCBhdHRyaWJ1dGVcbiAgICBpZiAoaXNTdHJpbmcoa2V5KSAmJiBhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGhpc1swXSAmJiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzWzBdKVtrZXldO1xuICAgIH1cblxuICAgIC8vIFNldCBhdHRyaWJ1dGVzXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNldHRlciA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICBlbC5zdHlsZVtrZXldID0gdmFsdWU7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICAgIHNldHRlciA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICBrZXlzKGtleSkuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICAgICAgZWwuc3R5bGVbbmFtZV0gPSBrZXlbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNldHRlcih0aGlzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbmZuLmRhdGEgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsIGRhdGEgPSB7fSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBzZXR0ZXIsXG4gICAgICAgIHNldFZhbHVlID0gZnVuY3Rpb24oZWwsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBlbC5qZGF0YSA9IGVsLmpkYXRhIHx8IHt9O1xuICAgICAgICAgICAgICAgIGVsLmpkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWwuZGF0YXNldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgLy8gR2V0IGFsbCBkYXRhXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXNbMF0uamRhdGEgJiYgKGRhdGEgPSB0aGlzWzBdLmpkYXRhKTtcblxuICAgICAgICBrZXlzKHRoaXNbMF0uZGF0YXNldCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIGRhdGFba2V5XSA9IGdldFZhbHVlKHRoaXNbMF0uZGF0YXNldFtrZXldKTtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIC8vIEdldCBkYXRhIGJ5IG5hbWVcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNTdHJpbmcoa2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpc1swXSAmJiBnZXRWYWx1ZSh0aGlzWzBdLmRhdGFzZXRba2V5XSB8fCB0aGlzWzBdLmpkYXRhICYmIHRoaXNbMF0uamRhdGFba2V5XSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRhdGFcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICBzZXR0ZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAga2V5cyhrZXkpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgICAgIHNldFZhbHVlKGVsLCBuYW1lLCBrZXlbbmFtZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBzZXR0ZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgc2V0VmFsdWUoZWwsIGtleSwgdmFsdWUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2V0dGVyKHRoaXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4ucmVtb3ZlRGF0YSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGpkYXRhLCBkYXRhc2V0O1xuXG4gICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBqZGF0YSA9IHRoaXNbaV0uamRhdGE7XG4gICAgICAgIGRhdGFzZXQgPSB0aGlzW2ldLmRhdGFzZXQ7XG5cbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgamRhdGEgJiYgamRhdGFba2V5XSAmJiBkZWxldGUgamRhdGFba2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhc2V0W2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBqZGF0YSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBqZGF0YVtrZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGtleSBpbiBkYXRhc2V0KSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFzZXRba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4uaHRtbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGVsO1xuXG4gICAgLy8gYWRkIEhUTUwgaW50byBlbGVtZW50c1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKHZhbHVlKTtcbiAgICB9XG4gICAgLy8gZ2V0IEhUTUwgZnJvbSBlbGVtZW50XG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDAgJiYgKGVsID0gdGhpc1swXSkpIHtcbiAgICAgICAgcmV0dXJuIGVsLmlubmVySFRNTDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbmZuLmFwcGVuZCA9IGZ1bmN0aW9uKGFwcGVuZGVkKSB7XG4gICAgdmFyIGkgPSAwLFxuICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aCxcbiAgICAgICAgc2V0dGVyO1xuXG4gICAgLy8gY3JlYXRlIGpCb25lIG9iamVjdCBhbmQgdGhlbiBhcHBlbmRcbiAgICBpZiAoaXNTdHJpbmcoYXBwZW5kZWQpICYmIHJxdWlja0V4cHIuZXhlYyhhcHBlbmRlZCkpIHtcbiAgICAgICAgYXBwZW5kZWQgPSBqQm9uZShhcHBlbmRlZCk7XG4gICAgfVxuICAgIC8vIGNyZWF0ZSB0ZXh0IG5vZGUgZm9yIGluc2VydGluZ1xuICAgIGVsc2UgaWYgKCFpc09iamVjdChhcHBlbmRlZCkpIHtcbiAgICAgICAgYXBwZW5kZWQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhcHBlbmRlZCk7XG4gICAgfVxuXG4gICAgYXBwZW5kZWQgPSBhcHBlbmRlZCBpbnN0YW5jZW9mIGpCb25lID8gYXBwZW5kZWQgOiBqQm9uZShhcHBlbmRlZCk7XG5cbiAgICBzZXR0ZXIgPSBmdW5jdGlvbihlbCwgaSkge1xuICAgICAgICBhcHBlbmRlZC5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQobm9kZS5jbG9uZU5vZGUoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBzZXR0ZXIodGhpc1tpXSwgaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5hcHBlbmRUbyA9IGZ1bmN0aW9uKHRvKSB7XG4gICAgakJvbmUodG8pLmFwcGVuZCh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4uZW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaSA9IDAsXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBlbDtcblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWwgPSB0aGlzW2ldO1xuXG4gICAgICAgIHdoaWxlIChlbC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmxhc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbmZuLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGVsO1xuXG4gICAgLy8gcmVtb3ZlIGFsbCBsaXN0bmVyc1xuICAgIHRoaXMub2ZmKCk7XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsID0gdGhpc1tpXTtcblxuICAgICAgICAvLyByZW1vdmUgZGF0YSBhbmQgbm9kZXNcbiAgICAgICAgZGVsZXRlIGVsLmpkYXRhO1xuICAgICAgICBlbC5wYXJlbnROb2RlICYmIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgbW9kdWxlICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIC8vIEV4cG9zZSBqQm9uZSBhcyBtb2R1bGUuZXhwb3J0cyBpbiBsb2FkZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBOb2RlXG4gICAgLy8gbW9kdWxlIHBhdHRlcm4gKGluY2x1ZGluZyBicm93c2VyaWZ5KS4gRG8gbm90IGNyZWF0ZSB0aGUgZ2xvYmFsLCBzaW5jZVxuICAgIC8vIHRoZSB1c2VyIHdpbGwgYmUgc3RvcmluZyBpdCB0aGVtc2VsdmVzIGxvY2FsbHksIGFuZCBnbG9iYWxzIGFyZSBmcm93bmVkXG4gICAgLy8gdXBvbiBpbiB0aGUgTm9kZSBtb2R1bGUgd29ybGQuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBqQm9uZTtcbn1cbi8vIFJlZ2lzdGVyIGFzIGEgQU1EIG1vZHVsZVxuZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBqQm9uZTtcbiAgICB9KTtcblxuICAgIHdpbi5qQm9uZSA9IHdpbi4kID0gakJvbmU7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW4gPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHdpbi5kb2N1bWVudCA9PT0gXCJvYmplY3RcIikge1xuICAgIHdpbi5qQm9uZSA9IHdpbi4kID0gakJvbmU7XG59XG5cbn0od2luZG93KSk7XG4iLCJ2YXIgTW91c2U7XG5cbm1vZHVsZS5leHBvcnRzID0gTW91c2UgPSB7XG4gIHJlbDogZnVuY3Rpb24oZSkge1xuICAgIHZhciBtb3VzZVgsIG1vdXNlWSwgcmVjdCwgdGFyZ2V0O1xuICAgIG1vdXNlWCA9IGUub2Zmc2V0WDtcbiAgICBtb3VzZVkgPSBlLm9mZnNldFk7XG4gICAgaWYgKG1vdXNlWCA9PSBudWxsKSB7XG4gICAgICByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50O1xuICAgICAgaWYgKG1vdXNlWCA9PSBudWxsKSB7XG4gICAgICAgIG1vdXNlWCA9IGUuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICAgICAgbW91c2VZID0gZS5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgICB9XG4gICAgICBpZiAobW91c2VYID09IG51bGwpIHtcbiAgICAgICAgbW91c2VYID0gZS5wYWdlWCAtIHRhcmdldC5vZmZzZXRMZWZ0O1xuICAgICAgICBtb3VzZVkgPSBlLnBhZ2VZIC0gdGFyZ2V0Lm9mZnNldFRvcDtcbiAgICAgIH1cbiAgICAgIGlmIChtb3VzZVggPT0gbnVsbCkge1xuICAgICAgICBjb25zb2xlLmxvZyhlLCBcIm5vIG1vdXNlIGV2ZW50IGRlZmluZWQuIHlvdXIgYnJvd3NlciBzdWNrc1wiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW21vdXNlWCwgbW91c2VZXTtcbiAgfSxcbiAgYWJzOiBmdW5jdGlvbihlKSB7XG4gICAgdmFyIG1vdXNlWCwgbW91c2VZO1xuICAgIG1vdXNlWCA9IGUucGFnZVg7XG4gICAgbW91c2VZID0gZS5wYWdlWTtcbiAgICBpZiAobW91c2VYID09IG51bGwpIHtcbiAgICAgIG1vdXNlWCA9IGUubGF5ZXJYO1xuICAgICAgbW91c2VZID0gZS5sYXllclk7XG4gICAgfVxuICAgIGlmIChtb3VzZVggPT0gbnVsbCkge1xuICAgICAgbW91c2VYID0gZS5jbGllbnRYO1xuICAgICAgbW91c2VZID0gZS5jbGllbnRZO1xuICAgIH1cbiAgICBpZiAobW91c2VYID09IG51bGwpIHtcbiAgICAgIG1vdXNlWCA9IGUueDtcbiAgICAgIG1vdXNlWSA9IGUueTtcbiAgICB9XG4gICAgcmV0dXJuIFttb3VzZVgsIG1vdXNlWV07XG4gIH0sXG4gIHdoZWVsRGVsdGE6IGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZGVsdGEsIGRpcjtcbiAgICBkZWx0YSA9IFtlLmRlbHRhWCwgZS5kZWx0YVldO1xuICAgIGlmIChkZWx0YVswXSA9PSBudWxsKSB7XG4gICAgICBkaXIgPSBNYXRoLmZsb29yKGUuZGV0YWlsIC8gMyk7XG4gICAgICBkZWx0YSA9IFswLCBlLm1vek1vdmVtZW50WCAqIGRpcl07XG4gICAgfVxuICAgIHJldHVybiBkZWx0YTtcbiAgfVxufTtcbiIsInZhciB3aW5kb3cgPSByZXF1aXJlKFwiZ2xvYmFsL3dpbmRvd1wiKVxudmFyIG9uY2UgPSByZXF1aXJlKFwib25jZVwiKVxudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJ3BhcnNlLWhlYWRlcnMnKVxuXG52YXIgbWVzc2FnZXMgPSB7XG4gICAgXCIwXCI6IFwiSW50ZXJuYWwgWE1MSHR0cFJlcXVlc3QgRXJyb3JcIixcbiAgICBcIjRcIjogXCI0eHggQ2xpZW50IEVycm9yXCIsXG4gICAgXCI1XCI6IFwiNXh4IFNlcnZlciBFcnJvclwiXG59XG5cbnZhciBYSFIgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgfHwgbm9vcFxudmFyIFhEUiA9IFwid2l0aENyZWRlbnRpYWxzXCIgaW4gKG5ldyBYSFIoKSkgPyBYSFIgOiB3aW5kb3cuWERvbWFpblJlcXVlc3RcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVYSFJcblxuZnVuY3Rpb24gY3JlYXRlWEhSKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IHVyaTogb3B0aW9ucyB9XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spXG5cbiAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgfHwgbnVsbFxuXG4gICAgaWYgKCF4aHIpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29ycyB8fCBvcHRpb25zLnVzZVhEUikge1xuICAgICAgICAgICAgeGhyID0gbmV3IFhEUigpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgeGhyID0gbmV3IFhIUigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdXJpID0geGhyLnVybCA9IG9wdGlvbnMudXJpIHx8IG9wdGlvbnMudXJsXG4gICAgdmFyIG1ldGhvZCA9IHhoci5tZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCBcIkdFVFwiXG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHkgfHwgb3B0aW9ucy5kYXRhXG4gICAgdmFyIGhlYWRlcnMgPSB4aHIuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fVxuICAgIHZhciBzeW5jID0gISFvcHRpb25zLnN5bmNcbiAgICB2YXIgaXNKc29uID0gZmFsc2VcbiAgICB2YXIga2V5XG4gICAgdmFyIGxvYWQgPSBvcHRpb25zLnJlc3BvbnNlID8gbG9hZFJlc3BvbnNlIDogbG9hZFhoclxuXG4gICAgaWYgKFwianNvblwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaXNKc29uID0gdHJ1ZVxuICAgICAgICBoZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmpzb24pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gcmVhZHlzdGF0ZWNoYW5nZVxuICAgIHhoci5vbmxvYWQgPSBsb2FkXG4gICAgeGhyLm9uZXJyb3IgPSBlcnJvclxuICAgIC8vIElFOSBtdXN0IGhhdmUgb25wcm9ncmVzcyBiZSBzZXQgdG8gYSB1bmlxdWUgZnVuY3Rpb24uXG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElFIG11c3QgZGllXG4gICAgfVxuICAgIC8vIGhhdGUgSUVcbiAgICB4aHIub250aW1lb3V0ID0gbm9vcFxuICAgIHhoci5vcGVuKG1ldGhvZCwgdXJpLCAhc3luYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGlmIChvcHRpb25zLndpdGhDcmVkZW50aWFscyB8fCAob3B0aW9ucy5jb3JzICYmIG9wdGlvbnMud2l0aENyZWRlbnRpYWxzICE9PSBmYWxzZSkpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBDYW5ub3Qgc2V0IHRpbWVvdXQgd2l0aCBzeW5jIHJlcXVlc3RcbiAgICBpZiAoIXN5bmMpIHtcbiAgICAgICAgeGhyLnRpbWVvdXQgPSBcInRpbWVvdXRcIiBpbiBvcHRpb25zID8gb3B0aW9ucy50aW1lb3V0IDogNTAwMFxuICAgIH1cblxuICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikge1xuICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpe1xuICAgICAgICAgICAgaWYoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhlYWRlcnMgY2Fubm90IGJlIHNldCBvbiBhbiBYRG9tYWluUmVxdWVzdCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBpZiAoXCJyZXNwb25zZVR5cGVcIiBpbiBvcHRpb25zKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZVxuICAgIH1cbiAgICBcbiAgICBpZiAoXCJiZWZvcmVTZW5kXCIgaW4gb3B0aW9ucyAmJiBcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIG9wdGlvbnMuYmVmb3JlU2VuZCh4aHIpXG4gICAgfVxuXG4gICAgeGhyLnNlbmQoYm9keSlcblxuICAgIHJldHVybiB4aHJcblxuICAgIGZ1bmN0aW9uIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgbG9hZCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRCb2R5KCkge1xuICAgICAgICAvLyBDaHJvbWUgd2l0aCByZXF1ZXN0VHlwZT1ibG9iIHRocm93cyBlcnJvcnMgYXJyb3VuZCB3aGVuIGV2ZW4gdGVzdGluZyBhY2Nlc3MgdG8gcmVzcG9uc2VUZXh0XG4gICAgICAgIHZhciBib2R5ID0gbnVsbFxuXG4gICAgICAgIGlmICh4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2VcbiAgICAgICAgfSBlbHNlIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgIXhoci5yZXNwb25zZVR5cGUpIHtcbiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2VUZXh0IHx8IHhoci5yZXNwb25zZVhNTFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSnNvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBib2R5XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgZ2V0dGluZyBhIG5vbmUtb2sgc3RhdHVzQ29kZSwgYnVpbGQgJiByZXR1cm4gYW4gZXJyb3JcbiAgICBmdW5jdGlvbiBlcnJvckZyb21TdGF0dXNDb2RlKHN0YXR1cykge1xuICAgICAgICB2YXIgZXJyb3IgPSBudWxsXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDAgfHwgKHN0YXR1cyA+PSA0MDAgJiYgc3RhdHVzIDwgNjAwKSkge1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSAodHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCIgPyBib2R5IDogZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgbWVzc2FnZXNbU3RyaW5nKHN0YXR1cykuY2hhckF0KDApXVxuICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSlcbiAgICAgICAgICAgIGVycm9yLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvclxuICAgIH1cblxuICAgIC8vIHdpbGwgbG9hZCB0aGUgZGF0YSAmIHByb2Nlc3MgdGhlIHJlc3BvbnNlIGluIGEgc3BlY2lhbCByZXNwb25zZSBvYmplY3RcbiAgICBmdW5jdGlvbiBsb2FkUmVzcG9uc2UoKSB7XG4gICAgICAgIHZhciBzdGF0dXMgPSBnZXRTdGF0dXNDb2RlKClcbiAgICAgICAgdmFyIGVycm9yID0gZXJyb3JGcm9tU3RhdHVzQ29kZShzdGF0dXMpXG4gICAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGdldEJvZHkoKSxcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgcmF3OiB4aHJcbiAgICAgICAgfVxuICAgICAgICBpZih4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKXsgLy9yZW1lbWJlciB4aHIgY2FuIGluIGZhY3QgYmUgWERSIGZvciBDT1JTIGluIElFXG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3BvbnNlLCByZXNwb25zZS5ib2R5KVxuICAgIH1cblxuICAgIC8vIHdpbGwgbG9hZCB0aGUgZGF0YSBhbmQgYWRkIHNvbWUgcmVzcG9uc2UgcHJvcGVydGllcyB0byB0aGUgc291cmNlIHhoclxuICAgIC8vIGFuZCB0aGVuIHJlc3BvbmQgd2l0aCB0aGF0XG4gICAgZnVuY3Rpb24gbG9hZFhocigpIHtcbiAgICAgICAgdmFyIHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoKVxuICAgICAgICB2YXIgZXJyb3IgPSBlcnJvckZyb21TdGF0dXNDb2RlKHN0YXR1cylcblxuICAgICAgICB4aHIuc3RhdHVzID0geGhyLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgICAgICAgeGhyLmJvZHkgPSBnZXRCb2R5KClcbiAgICAgICAgeGhyLmhlYWRlcnMgPSBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuXG4gICAgICAgIGNhbGxiYWNrKGVycm9yLCB4aHIsIHhoci5ib2R5KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVycm9yKGV2dCkge1xuICAgICAgICBjYWxsYmFjayhldnQsIHhocilcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKXtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHNlbGY7XG59IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0ge307XG59XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KSIsIm1vZHVsZS5leHBvcnRzID0gb25jZVxuXG5vbmNlLnByb3RvID0gb25jZShmdW5jdGlvbiAoKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlJywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZSh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG59KVxuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSByZXR1cm5cbiAgICBjYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxufVxuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCdpcy1mdW5jdGlvbicpXG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaFxuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbmZ1bmN0aW9uIGZvckVhY2gobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oaXRlcmF0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzXG4gICAgfVxuICAgIFxuICAgIGlmICh0b1N0cmluZy5jYWxsKGxpc3QpID09PSAnW29iamVjdCBBcnJheV0nKVxuICAgICAgICBmb3JFYWNoQXJyYXkobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG4gICAgZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKVxuICAgICAgICBmb3JFYWNoU3RyaW5nKGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxuICAgIGVsc2VcbiAgICAgICAgZm9yRWFjaE9iamVjdChsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbn1cblxuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgaSkpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgYXJyYXlbaV0sIGksIGFycmF5KVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHN0cmluZywgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vIG5vIHN1Y2ggdGhpbmcgYXMgYSBzcGFyc2Ugc3RyaW5nLlxuICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZylcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hPYmplY3Qob2JqZWN0LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgaykpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqZWN0W2tdLCBrLCBvYmplY3QpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb25cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmbikge1xuICB2YXIgc3RyaW5nID0gdG9TdHJpbmcuY2FsbChmbilcbiAgcmV0dXJuIHN0cmluZyA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fFxuICAgICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgc3RyaW5nICE9PSAnW29iamVjdCBSZWdFeHBdJykgfHxcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgLy8gSUU4IGFuZCBiZWxvd1xuICAgICAoZm4gPT09IHdpbmRvdy5zZXRUaW1lb3V0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmFsZXJ0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmNvbmZpcm0gfHxcbiAgICAgIGZuID09PSB3aW5kb3cucHJvbXB0KSlcbn07XG4iLCJcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRyaW07XG5cbmZ1bmN0aW9uIHRyaW0oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKnxcXHMqJC9nLCAnJyk7XG59XG5cbmV4cG9ydHMubGVmdCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJyk7XG59O1xuXG5leHBvcnRzLnJpZ2h0ID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbn07XG4iLCJ2YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKVxuICAsIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpXG4gICwgaXNBcnJheSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpXG4gICAgcmV0dXJuIHt9XG5cbiAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgZm9yRWFjaChcbiAgICAgIHRyaW0oaGVhZGVycykuc3BsaXQoJ1xcbicpXG4gICAgLCBmdW5jdGlvbiAocm93KSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJvdy5pbmRleE9mKCc6JylcbiAgICAgICAgICAsIGtleSA9IHRyaW0ocm93LnNsaWNlKDAsIGluZGV4KSkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICwgdmFsdWUgPSB0cmltKHJvdy5zbGljZShpbmRleCArIDEpKVxuXG4gICAgICAgIGlmICh0eXBlb2YocmVzdWx0W2tleV0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBbIHJlc3VsdFtrZXldLCB2YWx1ZSBdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgKVxuXG4gIHJldHVybiByZXN1bHRcbn0iLCIvLyAgICAgVW5kZXJzY29yZS5qcyAxLjcuMFxuLy8gICAgIGh0dHA6Ly91bmRlcnNjb3JlanMub3JnXG4vLyAgICAgKGMpIDIwMDktMjAxNCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuLy8gICAgIFVuZGVyc2NvcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblxuICAvLyBCYXNlbGluZSBzZXR1cFxuICAvLyAtLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEVzdGFibGlzaCB0aGUgcm9vdCBvYmplY3QsIGB3aW5kb3dgIGluIHRoZSBicm93c2VyLCBvciBgZXhwb3J0c2Agb24gdGhlIHNlcnZlci5cbiAgdmFyIHJvb3QgPSB0aGlzO1xuXG4gIC8vIFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBgX2AgdmFyaWFibGUuXG4gIHZhciBwcmV2aW91c1VuZGVyc2NvcmUgPSByb290Ll87XG5cbiAgLy8gU2F2ZSBieXRlcyBpbiB0aGUgbWluaWZpZWQgKGJ1dCBub3QgZ3ppcHBlZCkgdmVyc2lvbjpcbiAgdmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsIE9ialByb3RvID0gT2JqZWN0LnByb3RvdHlwZSwgRnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4gIC8vIENyZWF0ZSBxdWljayByZWZlcmVuY2UgdmFyaWFibGVzIGZvciBzcGVlZCBhY2Nlc3MgdG8gY29yZSBwcm90b3R5cGVzLlxuICB2YXJcbiAgICBwdXNoICAgICAgICAgICAgID0gQXJyYXlQcm90by5wdXNoLFxuICAgIHNsaWNlICAgICAgICAgICAgPSBBcnJheVByb3RvLnNsaWNlLFxuICAgIGNvbmNhdCAgICAgICAgICAgPSBBcnJheVByb3RvLmNvbmNhdCxcbiAgICB0b1N0cmluZyAgICAgICAgID0gT2JqUHJvdG8udG9TdHJpbmcsXG4gICAgaGFzT3duUHJvcGVydHkgICA9IE9ialByb3RvLmhhc093blByb3BlcnR5O1xuXG4gIC8vIEFsbCAqKkVDTUFTY3JpcHQgNSoqIG5hdGl2ZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3ZSBob3BlIHRvIHVzZVxuICAvLyBhcmUgZGVjbGFyZWQgaGVyZS5cbiAgdmFyXG4gICAgbmF0aXZlSXNBcnJheSAgICAgID0gQXJyYXkuaXNBcnJheSxcbiAgICBuYXRpdmVLZXlzICAgICAgICAgPSBPYmplY3Qua2V5cyxcbiAgICBuYXRpdmVCaW5kICAgICAgICAgPSBGdW5jUHJvdG8uYmluZDtcblxuICAvLyBDcmVhdGUgYSBzYWZlIHJlZmVyZW5jZSB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QgZm9yIHVzZSBiZWxvdy5cbiAgdmFyIF8gPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgXykgcmV0dXJuIG9iajtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgXykpIHJldHVybiBuZXcgXyhvYmopO1xuICAgIHRoaXMuX3dyYXBwZWQgPSBvYmo7XG4gIH07XG5cbiAgLy8gRXhwb3J0IHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgKipOb2RlLmpzKiosIHdpdGhcbiAgLy8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZm9yIHRoZSBvbGQgYHJlcXVpcmUoKWAgQVBJLiBJZiB3ZSdyZSBpblxuICAvLyB0aGUgYnJvd3NlciwgYWRkIGBfYCBhcyBhIGdsb2JhbCBvYmplY3QuXG4gIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF87XG4gICAgfVxuICAgIGV4cG9ydHMuXyA9IF87XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fID0gXztcbiAgfVxuXG4gIC8vIEN1cnJlbnQgdmVyc2lvbi5cbiAgXy5WRVJTSU9OID0gJzEuNy4wJztcblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZWZmaWNpZW50IChmb3IgY3VycmVudCBlbmdpbmVzKSB2ZXJzaW9uXG4gIC8vIG9mIHRoZSBwYXNzZWQtaW4gY2FsbGJhY2ssIHRvIGJlIHJlcGVhdGVkbHkgYXBwbGllZCBpbiBvdGhlciBVbmRlcnNjb3JlXG4gIC8vIGZ1bmN0aW9ucy5cbiAgdmFyIGNyZWF0ZUNhbGxiYWNrID0gZnVuY3Rpb24oZnVuYywgY29udGV4dCwgYXJnQ291bnQpIHtcbiAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSByZXR1cm4gZnVuYztcbiAgICBzd2l0Y2ggKGFyZ0NvdW50ID09IG51bGwgPyAzIDogYXJnQ291bnQpIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgIH07XG4gICAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gQSBtb3N0bHktaW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIGFwcGxpZWRcbiAgLy8gdG8gZWFjaCBlbGVtZW50IGluIGEgY29sbGVjdGlvbiwgcmV0dXJuaW5nIHRoZSBkZXNpcmVkIHJlc3VsdCDigJQgZWl0aGVyXG4gIC8vIGlkZW50aXR5LCBhbiBhcmJpdHJhcnkgY2FsbGJhY2ssIGEgcHJvcGVydHkgbWF0Y2hlciwgb3IgYSBwcm9wZXJ0eSBhY2Nlc3Nvci5cbiAgXy5pdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0LCBhcmdDb3VudCkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gXy5pZGVudGl0eTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuIGNyZWF0ZUNhbGxiYWNrKHZhbHVlLCBjb250ZXh0LCBhcmdDb3VudCk7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpKSByZXR1cm4gXy5tYXRjaGVzKHZhbHVlKTtcbiAgICByZXR1cm4gXy5wcm9wZXJ0eSh2YWx1ZSk7XG4gIH07XG5cbiAgLy8gQ29sbGVjdGlvbiBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBUaGUgY29ybmVyc3RvbmUsIGFuIGBlYWNoYCBpbXBsZW1lbnRhdGlvbiwgYWthIGBmb3JFYWNoYC5cbiAgLy8gSGFuZGxlcyByYXcgb2JqZWN0cyBpbiBhZGRpdGlvbiB0byBhcnJheS1saWtlcy4gVHJlYXRzIGFsbFxuICAvLyBzcGFyc2UgYXJyYXktbGlrZXMgYXMgaWYgdGhleSB3ZXJlIGRlbnNlLlxuICBfLmVhY2ggPSBfLmZvckVhY2ggPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gb2JqO1xuICAgIGl0ZXJhdGVlID0gY3JlYXRlQ2FsbGJhY2soaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBpLCBsZW5ndGggPSBvYmoubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09ICtsZW5ndGgpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRlZShvYmpbaV0sIGksIG9iaik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdGVlKG9ialtrZXlzW2ldXSwga2V5c1tpXSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudC5cbiAgXy5tYXAgPSBfLmNvbGxlY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gW107XG4gICAgaXRlcmF0ZWUgPSBfLml0ZXJhdGVlKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9IG9iai5sZW5ndGggIT09ICtvYmoubGVuZ3RoICYmIF8ua2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSAoa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0cyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGN1cnJlbnRLZXk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgcmVzdWx0c1tpbmRleF0gPSBpdGVyYXRlZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIHZhciByZWR1Y2VFcnJvciA9ICdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJztcblxuICAvLyAqKlJlZHVjZSoqIGJ1aWxkcyB1cCBhIHNpbmdsZSByZXN1bHQgZnJvbSBhIGxpc3Qgb2YgdmFsdWVzLCBha2EgYGluamVjdGAsXG4gIC8vIG9yIGBmb2xkbGAuXG4gIF8ucmVkdWNlID0gXy5mb2xkbCA9IF8uaW5qZWN0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgY29udGV4dCkge1xuICAgIGlmIChvYmogPT0gbnVsbCkgb2JqID0gW107XG4gICAgaXRlcmF0ZWUgPSBjcmVhdGVDYWxsYmFjayhpdGVyYXRlZSwgY29udGV4dCwgNCk7XG4gICAgdmFyIGtleXMgPSBvYmoubGVuZ3RoICE9PSArb2JqLmxlbmd0aCAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMCwgY3VycmVudEtleTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIGlmICghbGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKHJlZHVjZUVycm9yKTtcbiAgICAgIG1lbW8gPSBvYmpba2V5cyA/IGtleXNbaW5kZXgrK10gOiBpbmRleCsrXTtcbiAgICB9XG4gICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBtZW1vID0gaXRlcmF0ZWUobWVtbywgb2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gbWVtbztcbiAgfTtcblxuICAvLyBUaGUgcmlnaHQtYXNzb2NpYXRpdmUgdmVyc2lvbiBvZiByZWR1Y2UsIGFsc28ga25vd24gYXMgYGZvbGRyYC5cbiAgXy5yZWR1Y2VSaWdodCA9IF8uZm9sZHIgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBtZW1vLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSBvYmogPSBbXTtcbiAgICBpdGVyYXRlZSA9IGNyZWF0ZUNhbGxiYWNrKGl0ZXJhdGVlLCBjb250ZXh0LCA0KTtcbiAgICB2YXIga2V5cyA9IG9iai5sZW5ndGggIT09ICsgb2JqLmxlbmd0aCAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgaW5kZXggPSAoa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgY3VycmVudEtleTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIGlmICghaW5kZXgpIHRocm93IG5ldyBUeXBlRXJyb3IocmVkdWNlRXJyb3IpO1xuICAgICAgbWVtbyA9IG9ialtrZXlzID8ga2V5c1stLWluZGV4XSA6IC0taW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgbWVtbyA9IGl0ZXJhdGVlKG1lbW8sIG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW87XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBmaXJzdCB2YWx1ZSB3aGljaCBwYXNzZXMgYSB0cnV0aCB0ZXN0LiBBbGlhc2VkIGFzIGBkZXRlY3RgLlxuICBfLmZpbmQgPSBfLmRldGVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBwcmVkaWNhdGUgPSBfLml0ZXJhdGVlKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgXy5zb21lKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgbGlzdCkpIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBwYXNzIGEgdHJ1dGggdGVzdC5cbiAgLy8gQWxpYXNlZCBhcyBgc2VsZWN0YC5cbiAgXy5maWx0ZXIgPSBfLnNlbGVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiByZXN1bHRzO1xuICAgIHByZWRpY2F0ZSA9IF8uaXRlcmF0ZWUocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBsaXN0KSkgcmVzdWx0cy5wdXNoKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBmb3Igd2hpY2ggYSB0cnV0aCB0ZXN0IGZhaWxzLlxuICBfLnJlamVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG9iaiwgXy5uZWdhdGUoXy5pdGVyYXRlZShwcmVkaWNhdGUpKSwgY29udGV4dCk7XG4gIH07XG5cbiAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYWxsIG9mIHRoZSBlbGVtZW50cyBtYXRjaCBhIHRydXRoIHRlc3QuXG4gIC8vIEFsaWFzZWQgYXMgYGFsbGAuXG4gIF8uZXZlcnkgPSBfLmFsbCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBwcmVkaWNhdGUgPSBfLml0ZXJhdGVlKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSBvYmoubGVuZ3RoICE9PSArb2JqLmxlbmd0aCAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIGluZGV4LCBjdXJyZW50S2V5O1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgaWYgKCFwcmVkaWNhdGUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIERldGVybWluZSBpZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB0aGUgb2JqZWN0IG1hdGNoZXMgYSB0cnV0aCB0ZXN0LlxuICAvLyBBbGlhc2VkIGFzIGBhbnlgLlxuICBfLnNvbWUgPSBfLmFueSA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcHJlZGljYXRlID0gXy5pdGVyYXRlZShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gb2JqLmxlbmd0aCAhPT0gK29iai5sZW5ndGggJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoLFxuICAgICAgICBpbmRleCwgY3VycmVudEtleTtcbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGN1cnJlbnRLZXkgPSBrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgIGlmIChwcmVkaWNhdGUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8vIERldGVybWluZSBpZiB0aGUgYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5zIGEgZ2l2ZW4gdmFsdWUgKHVzaW5nIGA9PT1gKS5cbiAgLy8gQWxpYXNlZCBhcyBgaW5jbHVkZWAuXG4gIF8uY29udGFpbnMgPSBfLmluY2x1ZGUgPSBmdW5jdGlvbihvYmosIHRhcmdldCkge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChvYmoubGVuZ3RoICE9PSArb2JqLmxlbmd0aCkgb2JqID0gXy52YWx1ZXMob2JqKTtcbiAgICByZXR1cm4gXy5pbmRleE9mKG9iaiwgdGFyZ2V0KSA+PSAwO1xuICB9O1xuXG4gIC8vIEludm9rZSBhIG1ldGhvZCAod2l0aCBhcmd1bWVudHMpIG9uIGV2ZXJ5IGl0ZW0gaW4gYSBjb2xsZWN0aW9uLlxuICBfLmludm9rZSA9IGZ1bmN0aW9uKG9iaiwgbWV0aG9kKSB7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgdmFyIGlzRnVuYyA9IF8uaXNGdW5jdGlvbihtZXRob2QpO1xuICAgIHJldHVybiBfLm1hcChvYmosIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gKGlzRnVuYyA/IG1ldGhvZCA6IHZhbHVlW21ldGhvZF0pLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBtYXBgOiBmZXRjaGluZyBhIHByb3BlcnR5LlxuICBfLnBsdWNrID0gZnVuY3Rpb24ob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gXy5tYXAob2JqLCBfLnByb3BlcnR5KGtleSkpO1xuICB9O1xuXG4gIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgYGZpbHRlcmA6IHNlbGVjdGluZyBvbmx5IG9iamVjdHNcbiAgLy8gY29udGFpbmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy53aGVyZSA9IGZ1bmN0aW9uKG9iaiwgYXR0cnMpIHtcbiAgICByZXR1cm4gXy5maWx0ZXIob2JqLCBfLm1hdGNoZXMoYXR0cnMpKTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBmaW5kYDogZ2V0dGluZyB0aGUgZmlyc3Qgb2JqZWN0XG4gIC8vIGNvbnRhaW5pbmcgc3BlY2lmaWMgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8uZmluZFdoZXJlID0gZnVuY3Rpb24ob2JqLCBhdHRycykge1xuICAgIHJldHVybiBfLmZpbmQob2JqLCBfLm1hdGNoZXMoYXR0cnMpKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIG1heGltdW0gZWxlbWVudCAob3IgZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuXG4gIF8ubWF4ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSAtSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IC1JbmZpbml0eSxcbiAgICAgICAgdmFsdWUsIGNvbXB1dGVkO1xuICAgIGlmIChpdGVyYXRlZSA9PSBudWxsICYmIG9iaiAhPSBudWxsKSB7XG4gICAgICBvYmogPSBvYmoubGVuZ3RoID09PSArb2JqLmxlbmd0aCA/IG9iaiA6IF8udmFsdWVzKG9iaik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gb2JqLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gb2JqW2ldO1xuICAgICAgICBpZiAodmFsdWUgPiByZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRlZSA9IF8uaXRlcmF0ZWUoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBsaXN0KTtcbiAgICAgICAgaWYgKGNvbXB1dGVkID4gbGFzdENvbXB1dGVkIHx8IGNvbXB1dGVkID09PSAtSW5maW5pdHkgJiYgcmVzdWx0ID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1pbiA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IEluZmluaXR5LFxuICAgICAgICB2YWx1ZSwgY29tcHV0ZWQ7XG4gICAgaWYgKGl0ZXJhdGVlID09IG51bGwgJiYgb2JqICE9IG51bGwpIHtcbiAgICAgIG9iaiA9IG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoID8gb2JqIDogXy52YWx1ZXMob2JqKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSBvYmpbaV07XG4gICAgICAgIGlmICh2YWx1ZSA8IHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0gXy5pdGVyYXRlZShpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSwgaW5kZXgsIGxpc3QpO1xuICAgICAgICBpZiAoY29tcHV0ZWQgPCBsYXN0Q29tcHV0ZWQgfHwgY29tcHV0ZWQgPT09IEluZmluaXR5ICYmIHJlc3VsdCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gU2h1ZmZsZSBhIGNvbGxlY3Rpb24sIHVzaW5nIHRoZSBtb2Rlcm4gdmVyc2lvbiBvZiB0aGVcbiAgLy8gW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlcuKAk1lhdGVzX3NodWZmbGUpLlxuICBfLnNodWZmbGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgc2V0ID0gb2JqICYmIG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoID8gb2JqIDogXy52YWx1ZXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0gc2V0Lmxlbmd0aDtcbiAgICB2YXIgc2h1ZmZsZWQgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgcmFuZDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHJhbmQgPSBfLnJhbmRvbSgwLCBpbmRleCk7XG4gICAgICBpZiAocmFuZCAhPT0gaW5kZXgpIHNodWZmbGVkW2luZGV4XSA9IHNodWZmbGVkW3JhbmRdO1xuICAgICAgc2h1ZmZsZWRbcmFuZF0gPSBzZXRbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gc2h1ZmZsZWQ7XG4gIH07XG5cbiAgLy8gU2FtcGxlICoqbioqIHJhbmRvbSB2YWx1ZXMgZnJvbSBhIGNvbGxlY3Rpb24uXG4gIC8vIElmICoqbioqIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgYSBzaW5nbGUgcmFuZG9tIGVsZW1lbnQuXG4gIC8vIFRoZSBpbnRlcm5hbCBgZ3VhcmRgIGFyZ3VtZW50IGFsbG93cyBpdCB0byB3b3JrIHdpdGggYG1hcGAuXG4gIF8uc2FtcGxlID0gZnVuY3Rpb24ob2JqLCBuLCBndWFyZCkge1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHtcbiAgICAgIGlmIChvYmoubGVuZ3RoICE9PSArb2JqLmxlbmd0aCkgb2JqID0gXy52YWx1ZXMob2JqKTtcbiAgICAgIHJldHVybiBvYmpbXy5yYW5kb20ob2JqLmxlbmd0aCAtIDEpXTtcbiAgICB9XG4gICAgcmV0dXJuIF8uc2h1ZmZsZShvYmopLnNsaWNlKDAsIE1hdGgubWF4KDAsIG4pKTtcbiAgfTtcblxuICAvLyBTb3J0IHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24gcHJvZHVjZWQgYnkgYW4gaXRlcmF0ZWUuXG4gIF8uc29ydEJ5ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gXy5pdGVyYXRlZShpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIF8ucGx1Y2soXy5tYXAob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICBjcml0ZXJpYTogaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBsaXN0KVxuICAgICAgfTtcbiAgICB9KS5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWE7XG4gICAgICB2YXIgYiA9IHJpZ2h0LmNyaXRlcmlhO1xuICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgaWYgKGEgPiBiIHx8IGEgPT09IHZvaWQgMCkgcmV0dXJuIDE7XG4gICAgICAgIGlmIChhIDwgYiB8fCBiID09PSB2b2lkIDApIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZWZ0LmluZGV4IC0gcmlnaHQuaW5kZXg7XG4gICAgfSksICd2YWx1ZScpO1xuICB9O1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgZm9yIGFnZ3JlZ2F0ZSBcImdyb3VwIGJ5XCIgb3BlcmF0aW9ucy5cbiAgdmFyIGdyb3VwID0gZnVuY3Rpb24oYmVoYXZpb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBfLml0ZXJhdGVlKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIga2V5ID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBvYmopO1xuICAgICAgICBiZWhhdmlvcihyZXN1bHQsIHZhbHVlLCBrZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gR3JvdXBzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24uIFBhc3MgZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0ZVxuICAvLyB0byBncm91cCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNyaXRlcmlvbi5cbiAgXy5ncm91cEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgaWYgKF8uaGFzKHJlc3VsdCwga2V5KSkgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7IGVsc2UgcmVzdWx0W2tleV0gPSBbdmFsdWVdO1xuICB9KTtcblxuICAvLyBJbmRleGVzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24sIHNpbWlsYXIgdG8gYGdyb3VwQnlgLCBidXQgZm9yXG4gIC8vIHdoZW4geW91IGtub3cgdGhhdCB5b3VyIGluZGV4IHZhbHVlcyB3aWxsIGJlIHVuaXF1ZS5cbiAgXy5pbmRleEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgLy8gQ291bnRzIGluc3RhbmNlcyBvZiBhbiBvYmplY3QgdGhhdCBncm91cCBieSBhIGNlcnRhaW4gY3JpdGVyaW9uLiBQYXNzXG4gIC8vIGVpdGhlciBhIHN0cmluZyBhdHRyaWJ1dGUgdG8gY291bnQgYnksIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZVxuICAvLyBjcml0ZXJpb24uXG4gIF8uY291bnRCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIGlmIChfLmhhcyhyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldKys7IGVsc2UgcmVzdWx0W2tleV0gPSAxO1xuICB9KTtcblxuICAvLyBVc2UgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoXG4gIC8vIGFuIG9iamVjdCBzaG91bGQgYmUgaW5zZXJ0ZWQgc28gYXMgdG8gbWFpbnRhaW4gb3JkZXIuIFVzZXMgYmluYXJ5IHNlYXJjaC5cbiAgXy5zb3J0ZWRJbmRleCA9IGZ1bmN0aW9uKGFycmF5LCBvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBfLml0ZXJhdGVlKGl0ZXJhdGVlLCBjb250ZXh0LCAxKTtcbiAgICB2YXIgdmFsdWUgPSBpdGVyYXRlZShvYmopO1xuICAgIHZhciBsb3cgPSAwLCBoaWdoID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICB2YXIgbWlkID0gbG93ICsgaGlnaCA+Pj4gMTtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVttaWRdKSA8IHZhbHVlKSBsb3cgPSBtaWQgKyAxOyBlbHNlIGhpZ2ggPSBtaWQ7XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG4gIH07XG5cbiAgLy8gU2FmZWx5IGNyZWF0ZSBhIHJlYWwsIGxpdmUgYXJyYXkgZnJvbSBhbnl0aGluZyBpdGVyYWJsZS5cbiAgXy50b0FycmF5ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFvYmopIHJldHVybiBbXTtcbiAgICBpZiAoXy5pc0FycmF5KG9iaikpIHJldHVybiBzbGljZS5jYWxsKG9iaik7XG4gICAgaWYgKG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoKSByZXR1cm4gXy5tYXAob2JqLCBfLmlkZW50aXR5KTtcbiAgICByZXR1cm4gXy52YWx1ZXMob2JqKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBvYmplY3QuXG4gIF8uc2l6ZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoID8gb2JqLmxlbmd0aCA6IF8ua2V5cyhvYmopLmxlbmd0aDtcbiAgfTtcblxuICAvLyBTcGxpdCBhIGNvbGxlY3Rpb24gaW50byB0d28gYXJyYXlzOiBvbmUgd2hvc2UgZWxlbWVudHMgYWxsIHNhdGlzZnkgdGhlIGdpdmVuXG4gIC8vIHByZWRpY2F0ZSwgYW5kIG9uZSB3aG9zZSBlbGVtZW50cyBhbGwgZG8gbm90IHNhdGlzZnkgdGhlIHByZWRpY2F0ZS5cbiAgXy5wYXJ0aXRpb24gPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IF8uaXRlcmF0ZWUocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIgcGFzcyA9IFtdLCBmYWlsID0gW107XG4gICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqKSB7XG4gICAgICAocHJlZGljYXRlKHZhbHVlLCBrZXksIG9iaikgPyBwYXNzIDogZmFpbCkucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtwYXNzLCBmYWlsXTtcbiAgfTtcblxuICAvLyBBcnJheSBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gR2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBOXG4gIC8vIHZhbHVlcyBpbiB0aGUgYXJyYXkuIEFsaWFzZWQgYXMgYGhlYWRgIGFuZCBgdGFrZWAuIFRoZSAqKmd1YXJkKiogY2hlY2tcbiAgLy8gYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBgXy5tYXBgLlxuICBfLmZpcnN0ID0gXy5oZWFkID0gXy50YWtlID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5WzBdO1xuICAgIGlmIChuIDwgMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCAwLCBuKTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGVudHJ5IG9mIHRoZSBhcnJheS4gRXNwZWNpYWxseSB1c2VmdWwgb25cbiAgLy8gdGhlIGFyZ3VtZW50cyBvYmplY3QuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gYWxsIHRoZSB2YWx1ZXMgaW5cbiAgLy8gdGhlIGFycmF5LCBleGNsdWRpbmcgdGhlIGxhc3QgTi4gVGhlICoqZ3VhcmQqKiBjaGVjayBhbGxvd3MgaXQgdG8gd29yayB3aXRoXG4gIC8vIGBfLm1hcGAuXG4gIF8uaW5pdGlhbCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCAwLCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSAobiA9PSBudWxsIHx8IGd1YXJkID8gMSA6IG4pKSk7XG4gIH07XG5cbiAgLy8gR2V0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gdGhlIGxhc3QgTlxuICAvLyB2YWx1ZXMgaW4gdGhlIGFycmF5LiBUaGUgKipndWFyZCoqIGNoZWNrIGFsbG93cyBpdCB0byB3b3JrIHdpdGggYF8ubWFwYC5cbiAgXy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCBNYXRoLm1heChhcnJheS5sZW5ndGggLSBuLCAwKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzIGB0YWlsYCBhbmQgYGRyb3BgLlxuICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyBhbiAqKm4qKiB3aWxsIHJldHVyblxuICAvLyB0aGUgcmVzdCBOIHZhbHVlcyBpbiB0aGUgYXJyYXkuIFRoZSAqKmd1YXJkKipcbiAgLy8gY2hlY2sgYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBgXy5tYXBgLlxuICBfLnJlc3QgPSBfLnRhaWwgPSBfLmRyb3AgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICByZXR1cm4gc2xpY2UuY2FsbChhcnJheSwgbiA9PSBudWxsIHx8IGd1YXJkID8gMSA6IG4pO1xuICB9O1xuXG4gIC8vIFRyaW0gb3V0IGFsbCBmYWxzeSB2YWx1ZXMgZnJvbSBhbiBhcnJheS5cbiAgXy5jb21wYWN0ID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICByZXR1cm4gXy5maWx0ZXIoYXJyYXksIF8uaWRlbnRpdHkpO1xuICB9O1xuXG4gIC8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGEgcmVjdXJzaXZlIGBmbGF0dGVuYCBmdW5jdGlvbi5cbiAgdmFyIGZsYXR0ZW4gPSBmdW5jdGlvbihpbnB1dCwgc2hhbGxvdywgc3RyaWN0LCBvdXRwdXQpIHtcbiAgICBpZiAoc2hhbGxvdyAmJiBfLmV2ZXJ5KGlucHV0LCBfLmlzQXJyYXkpKSB7XG4gICAgICByZXR1cm4gY29uY2F0LmFwcGx5KG91dHB1dCwgaW5wdXQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gaW5wdXQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGlucHV0W2ldO1xuICAgICAgaWYgKCFfLmlzQXJyYXkodmFsdWUpICYmICFfLmlzQXJndW1lbnRzKHZhbHVlKSkge1xuICAgICAgICBpZiAoIXN0cmljdCkgb3V0cHV0LnB1c2godmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzaGFsbG93KSB7XG4gICAgICAgIHB1c2guYXBwbHkob3V0cHV0LCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmbGF0dGVuKHZhbHVlLCBzaGFsbG93LCBzdHJpY3QsIG91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgLy8gRmxhdHRlbiBvdXQgYW4gYXJyYXksIGVpdGhlciByZWN1cnNpdmVseSAoYnkgZGVmYXVsdCksIG9yIGp1c3Qgb25lIGxldmVsLlxuICBfLmZsYXR0ZW4gPSBmdW5jdGlvbihhcnJheSwgc2hhbGxvdykge1xuICAgIHJldHVybiBmbGF0dGVuKGFycmF5LCBzaGFsbG93LCBmYWxzZSwgW10pO1xuICB9O1xuXG4gIC8vIFJldHVybiBhIHZlcnNpb24gb2YgdGhlIGFycmF5IHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIHZhbHVlKHMpLlxuICBfLndpdGhvdXQgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXJyYXksIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gIH07XG5cbiAgLy8gUHJvZHVjZSBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgdGhlIGFycmF5LiBJZiB0aGUgYXJyYXkgaGFzIGFscmVhZHlcbiAgLy8gYmVlbiBzb3J0ZWQsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgdXNpbmcgYSBmYXN0ZXIgYWxnb3JpdGhtLlxuICAvLyBBbGlhc2VkIGFzIGB1bmlxdWVgLlxuICBfLnVuaXEgPSBfLnVuaXF1ZSA9IGZ1bmN0aW9uKGFycmF5LCBpc1NvcnRlZCwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgIGlmICghXy5pc0Jvb2xlYW4oaXNTb3J0ZWQpKSB7XG4gICAgICBjb250ZXh0ID0gaXRlcmF0ZWU7XG4gICAgICBpdGVyYXRlZSA9IGlzU29ydGVkO1xuICAgICAgaXNTb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGl0ZXJhdGVlICE9IG51bGwpIGl0ZXJhdGVlID0gXy5pdGVyYXRlZShpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBzZWVuID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpXTtcbiAgICAgIGlmIChpc1NvcnRlZCkge1xuICAgICAgICBpZiAoIWkgfHwgc2VlbiAhPT0gdmFsdWUpIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgc2VlbiA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChpdGVyYXRlZSkge1xuICAgICAgICB2YXIgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSwgaSwgYXJyYXkpO1xuICAgICAgICBpZiAoXy5pbmRleE9mKHNlZW4sIGNvbXB1dGVkKSA8IDApIHtcbiAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfLmluZGV4T2YocmVzdWx0LCB2YWx1ZSkgPCAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHVuaW9uOiBlYWNoIGRpc3RpbmN0IGVsZW1lbnQgZnJvbSBhbGwgb2ZcbiAgLy8gdGhlIHBhc3NlZC1pbiBhcnJheXMuXG4gIF8udW5pb24gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXy51bmlxKGZsYXR0ZW4oYXJndW1lbnRzLCB0cnVlLCB0cnVlLCBbXSkpO1xuICB9O1xuXG4gIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyBldmVyeSBpdGVtIHNoYXJlZCBiZXR3ZWVuIGFsbCB0aGVcbiAgLy8gcGFzc2VkLWluIGFycmF5cy5cbiAgXy5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbihhcnJheSkge1xuICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gW107XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gYXJyYXlbaV07XG4gICAgICBpZiAoXy5jb250YWlucyhyZXN1bHQsIGl0ZW0pKSBjb250aW51ZTtcbiAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgYXJnc0xlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghXy5jb250YWlucyhhcmd1bWVudHNbal0sIGl0ZW0pKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChqID09PSBhcmdzTGVuZ3RoKSByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBUYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb25lIGFycmF5IGFuZCBhIG51bWJlciBvZiBvdGhlciBhcnJheXMuXG4gIC8vIE9ubHkgdGhlIGVsZW1lbnRzIHByZXNlbnQgaW4ganVzdCB0aGUgZmlyc3QgYXJyYXkgd2lsbCByZW1haW4uXG4gIF8uZGlmZmVyZW5jZSA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIHJlc3QgPSBmbGF0dGVuKHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgdHJ1ZSwgdHJ1ZSwgW10pO1xuICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgZnVuY3Rpb24odmFsdWUpe1xuICAgICAgcmV0dXJuICFfLmNvbnRhaW5zKHJlc3QsIHZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBaaXAgdG9nZXRoZXIgbXVsdGlwbGUgbGlzdHMgaW50byBhIHNpbmdsZSBhcnJheSAtLSBlbGVtZW50cyB0aGF0IHNoYXJlXG4gIC8vIGFuIGluZGV4IGdvIHRvZ2V0aGVyLlxuICBfLnppcCA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiBbXTtcbiAgICB2YXIgbGVuZ3RoID0gXy5tYXgoYXJndW1lbnRzLCAnbGVuZ3RoJykubGVuZ3RoO1xuICAgIHZhciByZXN1bHRzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRzW2ldID0gXy5wbHVjayhhcmd1bWVudHMsIGkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBDb252ZXJ0cyBsaXN0cyBpbnRvIG9iamVjdHMuIFBhc3MgZWl0aGVyIGEgc2luZ2xlIGFycmF5IG9mIGBba2V5LCB2YWx1ZV1gXG4gIC8vIHBhaXJzLCBvciB0d28gcGFyYWxsZWwgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCAtLSBvbmUgb2Yga2V5cywgYW5kIG9uZSBvZlxuICAvLyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gIF8ub2JqZWN0ID0gZnVuY3Rpb24obGlzdCwgdmFsdWVzKSB7XG4gICAgaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gbGlzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICByZXN1bHRbbGlzdFtpXV0gPSB2YWx1ZXNbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbbGlzdFtpXVswXV0gPSBsaXN0W2ldWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW4gaXRlbSBpbiBhbiBhcnJheSxcbiAgLy8gb3IgLTEgaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS5cbiAgLy8gSWYgdGhlIGFycmF5IGlzIGxhcmdlIGFuZCBhbHJlYWR5IGluIHNvcnQgb3JkZXIsIHBhc3MgYHRydWVgXG4gIC8vIGZvciAqKmlzU29ydGVkKiogdG8gdXNlIGJpbmFyeSBzZWFyY2guXG4gIF8uaW5kZXhPZiA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBpc1NvcnRlZCkge1xuICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gLTE7XG4gICAgdmFyIGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGlzU29ydGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGlzU29ydGVkID09ICdudW1iZXInKSB7XG4gICAgICAgIGkgPSBpc1NvcnRlZCA8IDAgPyBNYXRoLm1heCgwLCBsZW5ndGggKyBpc1NvcnRlZCkgOiBpc1NvcnRlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkgPSBfLnNvcnRlZEluZGV4KGFycmF5LCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIGFycmF5W2ldID09PSBpdGVtID8gaSA6IC0xO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pIHJldHVybiBpO1xuICAgIHJldHVybiAtMTtcbiAgfTtcblxuICBfLmxhc3RJbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGZyb20pIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCkgcmV0dXJuIC0xO1xuICAgIHZhciBpZHggPSBhcnJheS5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09ICdudW1iZXInKSB7XG4gICAgICBpZHggPSBmcm9tIDwgMCA/IGlkeCArIGZyb20gKyAxIDogTWF0aC5taW4oaWR4LCBmcm9tICsgMSk7XG4gICAgfVxuICAgIHdoaWxlICgtLWlkeCA+PSAwKSBpZiAoYXJyYXlbaWR4XSA9PT0gaXRlbSkgcmV0dXJuIGlkeDtcbiAgICByZXR1cm4gLTE7XG4gIH07XG5cbiAgLy8gR2VuZXJhdGUgYW4gaW50ZWdlciBBcnJheSBjb250YWluaW5nIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uIEEgcG9ydCBvZlxuICAvLyB0aGUgbmF0aXZlIFB5dGhvbiBgcmFuZ2UoKWAgZnVuY3Rpb24uIFNlZVxuICAvLyBbdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uXShodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvZnVuY3Rpb25zLmh0bWwjcmFuZ2UpLlxuICBfLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICBzdG9wID0gc3RhcnQgfHwgMDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgfHwgMTtcblxuICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSwgMCk7XG4gICAgdmFyIHJhbmdlID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyssIHN0YXJ0ICs9IHN0ZXApIHtcbiAgICAgIHJhbmdlW2lkeF0gPSBzdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2U7XG4gIH07XG5cbiAgLy8gRnVuY3Rpb24gKGFoZW0pIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBSZXVzYWJsZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgcHJvdG90eXBlIHNldHRpbmcuXG4gIHZhciBDdG9yID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0IChhc3NpZ25pbmcgYHRoaXNgLCBhbmQgYXJndW1lbnRzLFxuICAvLyBvcHRpb25hbGx5KS4gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYEZ1bmN0aW9uLmJpbmRgIGlmXG4gIC8vIGF2YWlsYWJsZS5cbiAgXy5iaW5kID0gZnVuY3Rpb24oZnVuYywgY29udGV4dCkge1xuICAgIHZhciBhcmdzLCBib3VuZDtcbiAgICBpZiAobmF0aXZlQmluZCAmJiBmdW5jLmJpbmQgPT09IG5hdGl2ZUJpbmQpIHJldHVybiBuYXRpdmVCaW5kLmFwcGx5KGZ1bmMsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gICAgaWYgKCFfLmlzRnVuY3Rpb24oZnVuYykpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbicpO1xuICAgIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgYm91bmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkpIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgICAgQ3Rvci5wcm90b3R5cGUgPSBmdW5jLnByb3RvdHlwZTtcbiAgICAgIHZhciBzZWxmID0gbmV3IEN0b3I7XG4gICAgICBDdG9yLnByb3RvdHlwZSA9IG51bGw7XG4gICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseShzZWxmLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICAgIGlmIChfLmlzT2JqZWN0KHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIHJldHVybiBib3VuZDtcbiAgfTtcblxuICAvLyBQYXJ0aWFsbHkgYXBwbHkgYSBmdW5jdGlvbiBieSBjcmVhdGluZyBhIHZlcnNpb24gdGhhdCBoYXMgaGFkIHNvbWUgb2YgaXRzXG4gIC8vIGFyZ3VtZW50cyBwcmUtZmlsbGVkLCB3aXRob3V0IGNoYW5naW5nIGl0cyBkeW5hbWljIGB0aGlzYCBjb250ZXh0LiBfIGFjdHNcbiAgLy8gYXMgYSBwbGFjZWhvbGRlciwgYWxsb3dpbmcgYW55IGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cyB0byBiZSBwcmUtZmlsbGVkLlxuICBfLnBhcnRpYWwgPSBmdW5jdGlvbihmdW5jKSB7XG4gICAgdmFyIGJvdW5kQXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgICAgdmFyIGFyZ3MgPSBib3VuZEFyZ3Muc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcmdzW2ldID09PSBfKSBhcmdzW2ldID0gYXJndW1lbnRzW3Bvc2l0aW9uKytdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYXJndW1lbnRzLmxlbmd0aCkgYXJncy5wdXNoKGFyZ3VtZW50c1twb3NpdGlvbisrXSk7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEJpbmQgYSBudW1iZXIgb2YgYW4gb2JqZWN0J3MgbWV0aG9kcyB0byB0aGF0IG9iamVjdC4gUmVtYWluaW5nIGFyZ3VtZW50c1xuICAvLyBhcmUgdGhlIG1ldGhvZCBuYW1lcyB0byBiZSBib3VuZC4gVXNlZnVsIGZvciBlbnN1cmluZyB0aGF0IGFsbCBjYWxsYmFja3NcbiAgLy8gZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LlxuICBfLmJpbmRBbGwgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgaSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwga2V5O1xuICAgIGlmIChsZW5ndGggPD0gMSkgdGhyb3cgbmV3IEVycm9yKCdiaW5kQWxsIG11c3QgYmUgcGFzc2VkIGZ1bmN0aW9uIG5hbWVzJyk7XG4gICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBhcmd1bWVudHNbaV07XG4gICAgICBvYmpba2V5XSA9IF8uYmluZChvYmpba2V5XSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBNZW1vaXplIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiBieSBzdG9yaW5nIGl0cyByZXN1bHRzLlxuICBfLm1lbW9pemUgPSBmdW5jdGlvbihmdW5jLCBoYXNoZXIpIHtcbiAgICB2YXIgbWVtb2l6ZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIGNhY2hlID0gbWVtb2l6ZS5jYWNoZTtcbiAgICAgIHZhciBhZGRyZXNzID0gaGFzaGVyID8gaGFzaGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrZXk7XG4gICAgICBpZiAoIV8uaGFzKGNhY2hlLCBhZGRyZXNzKSkgY2FjaGVbYWRkcmVzc10gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gY2FjaGVbYWRkcmVzc107XG4gICAgfTtcbiAgICBtZW1vaXplLmNhY2hlID0ge307XG4gICAgcmV0dXJuIG1lbW9pemU7XG4gIH07XG5cbiAgLy8gRGVsYXlzIGEgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCBhbmQgdGhlbiBjYWxsc1xuICAvLyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQuXG4gIF8uZGVsYXkgPSBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0sIHdhaXQpO1xuICB9O1xuXG4gIC8vIERlZmVycyBhIGZ1bmN0aW9uLCBzY2hlZHVsaW5nIGl0IHRvIHJ1biBhZnRlciB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhc1xuICAvLyBjbGVhcmVkLlxuICBfLmRlZmVyID0gZnVuY3Rpb24oZnVuYykge1xuICAgIHJldHVybiBfLmRlbGF5LmFwcGx5KF8sIFtmdW5jLCAxXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LCB3aGVuIGludm9rZWQsIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYXQgbW9zdCBvbmNlXG4gIC8vIGR1cmluZyBhIGdpdmVuIHdpbmRvdyBvZiB0aW1lLiBOb3JtYWxseSwgdGhlIHRocm90dGxlZCBmdW5jdGlvbiB3aWxsIHJ1blxuICAvLyBhcyBtdWNoIGFzIGl0IGNhbiwgd2l0aG91dCBldmVyIGdvaW5nIG1vcmUgdGhhbiBvbmNlIHBlciBgd2FpdGAgZHVyYXRpb247XG4gIC8vIGJ1dCBpZiB5b3UnZCBsaWtlIHRvIGRpc2FibGUgdGhlIGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlLCBwYXNzXG4gIC8vIGB7bGVhZGluZzogZmFsc2V9YC4gVG8gZGlzYWJsZSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2UsIGRpdHRvLlxuICBfLnRocm90dGxlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgdmFyIHRpbWVvdXQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogXy5ub3coKTtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vdyA9IF8ubm93KCk7XG4gICAgICBpZiAoIXByZXZpb3VzICYmIG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UpIHByZXZpb3VzID0gbm93O1xuICAgICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8IHJlbWFpbmluZyA+IHdhaXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gIC8vIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAgLy8gTiBtaWxsaXNlY29uZHMuIElmIGBpbW1lZGlhdGVgIGlzIHBhc3NlZCwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gb24gdGhlXG4gIC8vIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gIF8uZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgdGltZW91dCwgYXJncywgY29udGV4dCwgdGltZXN0YW1wLCByZXN1bHQ7XG5cbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsYXN0ID0gXy5ub3coKSAtIHRpbWVzdGFtcDtcblxuICAgICAgaWYgKGxhc3QgPCB3YWl0ICYmIGxhc3QgPiAwKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0IC0gbGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHRpbWVzdGFtcCA9IF8ubm93KCk7XG4gICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgIGlmICghdGltZW91dCkgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgaWYgKGNhbGxOb3cpIHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgZmlyc3QgZnVuY3Rpb24gcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZWNvbmQsXG4gIC8vIGFsbG93aW5nIHlvdSB0byBhZGp1c3QgYXJndW1lbnRzLCBydW4gY29kZSBiZWZvcmUgYW5kIGFmdGVyLCBhbmRcbiAgLy8gY29uZGl0aW9uYWxseSBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi5cbiAgXy53cmFwID0gZnVuY3Rpb24oZnVuYywgd3JhcHBlcikge1xuICAgIHJldHVybiBfLnBhcnRpYWwod3JhcHBlciwgZnVuYyk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIG5lZ2F0ZWQgdmVyc2lvbiBvZiB0aGUgcGFzc2VkLWluIHByZWRpY2F0ZS5cbiAgXy5uZWdhdGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIGEgbGlzdCBvZiBmdW5jdGlvbnMsIGVhY2hcbiAgLy8gY29uc3VtaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy5cbiAgXy5jb21wb3NlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHN0YXJ0ID0gYXJncy5sZW5ndGggLSAxO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpID0gc3RhcnQ7XG4gICAgICB2YXIgcmVzdWx0ID0gYXJnc1tzdGFydF0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHdoaWxlIChpLS0pIHJlc3VsdCA9IGFyZ3NbaV0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgb25seSBiZSBleGVjdXRlZCBhZnRlciBiZWluZyBjYWxsZWQgTiB0aW1lcy5cbiAgXy5hZnRlciA9IGZ1bmN0aW9uKHRpbWVzLCBmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPCAxKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgYmVmb3JlIGJlaW5nIGNhbGxlZCBOIHRpbWVzLlxuICBfLmJlZm9yZSA9IGZ1bmN0aW9uKHRpbWVzLCBmdW5jKSB7XG4gICAgdmFyIG1lbW87XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPiAwKSB7XG4gICAgICAgIG1lbW8gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmdW5jID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhdCBtb3N0IG9uZSB0aW1lLCBubyBtYXR0ZXIgaG93XG4gIC8vIG9mdGVuIHlvdSBjYWxsIGl0LiBVc2VmdWwgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24uXG4gIF8ub25jZSA9IF8ucGFydGlhbChfLmJlZm9yZSwgMik7XG5cbiAgLy8gT2JqZWN0IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUmV0cmlldmUgdGhlIG5hbWVzIG9mIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuXG4gIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBPYmplY3Qua2V5c2BcbiAgXy5rZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBbXTtcbiAgICBpZiAobmF0aXZlS2V5cykgcmV0dXJuIG5hdGl2ZUtleXMob2JqKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChfLmhhcyhvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICAgIHJldHVybiBrZXlzO1xuICB9O1xuXG4gIC8vIFJldHJpZXZlIHRoZSB2YWx1ZXMgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcy5cbiAgXy52YWx1ZXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgdmFsdWVzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXNbaV0gPSBvYmpba2V5c1tpXV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH07XG5cbiAgLy8gQ29udmVydCBhbiBvYmplY3QgaW50byBhIGxpc3Qgb2YgYFtrZXksIHZhbHVlXWAgcGFpcnMuXG4gIF8ucGFpcnMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgcGFpcnMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhaXJzW2ldID0gW2tleXNbaV0sIG9ialtrZXlzW2ldXV07XG4gICAgfVxuICAgIHJldHVybiBwYWlycztcbiAgfTtcblxuICAvLyBJbnZlcnQgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiBhbiBvYmplY3QuIFRoZSB2YWx1ZXMgbXVzdCBiZSBzZXJpYWxpemFibGUuXG4gIF8uaW52ZXJ0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtvYmpba2V5c1tpXV1dID0ga2V5c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSBzb3J0ZWQgbGlzdCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgYXZhaWxhYmxlIG9uIHRoZSBvYmplY3QuXG4gIC8vIEFsaWFzZWQgYXMgYG1ldGhvZHNgXG4gIF8uZnVuY3Rpb25zID0gXy5tZXRob2RzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKF8uaXNGdW5jdGlvbihvYmpba2V5XSkpIG5hbWVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzLnNvcnQoKTtcbiAgfTtcblxuICAvLyBFeHRlbmQgYSBnaXZlbiBvYmplY3Qgd2l0aCBhbGwgdGhlIHByb3BlcnRpZXMgaW4gcGFzc2VkLWluIG9iamVjdChzKS5cbiAgXy5leHRlbmQgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgICB2YXIgc291cmNlLCBwcm9wO1xuICAgIGZvciAodmFyIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAocHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBwcm9wKSkge1xuICAgICAgICAgICAgb2JqW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgb2JqZWN0IG9ubHkgY29udGFpbmluZyB0aGUgd2hpdGVsaXN0ZWQgcHJvcGVydGllcy5cbiAgXy5waWNrID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSB7fSwga2V5O1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaXRlcmF0ZWUgPSBjcmVhdGVDYWxsYmFjayhpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmIChpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmopKSByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga2V5cyA9IGNvbmNhdC5hcHBseShbXSwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICAgIG9iaiA9IG5ldyBPYmplY3Qob2JqKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmIChrZXkgaW4gb2JqKSByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB0aGUgYmxhY2tsaXN0ZWQgcHJvcGVydGllcy5cbiAgXy5vbWl0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGlmIChfLmlzRnVuY3Rpb24oaXRlcmF0ZWUpKSB7XG4gICAgICBpdGVyYXRlZSA9IF8ubmVnYXRlKGl0ZXJhdGVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGtleXMgPSBfLm1hcChjb25jYXQuYXBwbHkoW10sIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSksIFN0cmluZyk7XG4gICAgICBpdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuICFfLmNvbnRhaW5zKGtleXMsIGtleSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gXy5waWNrKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpO1xuICB9O1xuXG4gIC8vIEZpbGwgaW4gYSBnaXZlbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIF8uZGVmYXVsdHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgICBmb3IgKHZhciBpID0gMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKG9ialtwcm9wXSA9PT0gdm9pZCAwKSBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGEgKHNoYWxsb3ctY2xvbmVkKSBkdXBsaWNhdGUgb2YgYW4gb2JqZWN0LlxuICBfLmNsb25lID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gICAgcmV0dXJuIF8uaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfLmV4dGVuZCh7fSwgb2JqKTtcbiAgfTtcblxuICAvLyBJbnZva2VzIGludGVyY2VwdG9yIHdpdGggdGhlIG9iaiwgYW5kIHRoZW4gcmV0dXJucyBvYmouXG4gIC8vIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluLCBpblxuICAvLyBvcmRlciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2l0aGluIHRoZSBjaGFpbi5cbiAgXy50YXAgPSBmdW5jdGlvbihvYmosIGludGVyY2VwdG9yKSB7XG4gICAgaW50ZXJjZXB0b3Iob2JqKTtcbiAgICByZXR1cm4gb2JqO1xuICB9O1xuXG4gIC8vIEludGVybmFsIHJlY3Vyc2l2ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBgaXNFcXVhbGAuXG4gIHZhciBlcSA9IGZ1bmN0aW9uKGEsIGIsIGFTdGFjaywgYlN0YWNrKSB7XG4gICAgLy8gSWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsLiBgMCA9PT0gLTBgLCBidXQgdGhleSBhcmVuJ3QgaWRlbnRpY2FsLlxuICAgIC8vIFNlZSB0aGUgW0hhcm1vbnkgYGVnYWxgIHByb3Bvc2FsXShodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OmVnYWwpLlxuICAgIGlmIChhID09PSBiKSByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gICAgLy8gQSBzdHJpY3QgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBgbnVsbCA9PSB1bmRlZmluZWRgLlxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcbiAgICAvLyBVbndyYXAgYW55IHdyYXBwZWQgb2JqZWN0cy5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIF8pIGEgPSBhLl93cmFwcGVkO1xuICAgIGlmIChiIGluc3RhbmNlb2YgXykgYiA9IGIuX3dyYXBwZWQ7XG4gICAgLy8gQ29tcGFyZSBgW1tDbGFzc11dYCBuYW1lcy5cbiAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChhKTtcbiAgICBpZiAoY2xhc3NOYW1lICE9PSB0b1N0cmluZy5jYWxsKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgIC8vIFN0cmluZ3MsIG51bWJlcnMsIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGRhdGVzLCBhbmQgYm9vbGVhbnMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlLlxuICAgICAgY2FzZSAnW29iamVjdCBSZWdFeHBdJzpcbiAgICAgIC8vIFJlZ0V4cHMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBmb3IgY29tcGFyaXNvbiAoTm90ZTogJycgKyAvYS9pID09PSAnL2EvaScpXG4gICAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgICAvLyBQcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCB3cmFwcGVycyBhcmUgZXF1aXZhbGVudDsgdGh1cywgYFwiNVwiYCBpc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGBuZXcgU3RyaW5nKFwiNVwiKWAuXG4gICAgICAgIHJldHVybiAnJyArIGEgPT09ICcnICsgYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuXG4gICAgICAgIC8vIE9iamVjdChOYU4pIGlzIGVxdWl2YWxlbnQgdG8gTmFOXG4gICAgICAgIGlmICgrYSAhPT0gK2EpIHJldHVybiArYiAhPT0gK2I7XG4gICAgICAgIC8vIEFuIGBlZ2FsYCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBmb3Igb3RoZXIgbnVtZXJpYyB2YWx1ZXMuXG4gICAgICAgIHJldHVybiArYSA9PT0gMCA/IDEgLyArYSA9PT0gMSAvIGIgOiArYSA9PT0gK2I7XG4gICAgICBjYXNlICdbb2JqZWN0IERhdGVdJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgICAvLyBDb2VyY2UgZGF0ZXMgYW5kIGJvb2xlYW5zIHRvIG51bWVyaWMgcHJpbWl0aXZlIHZhbHVlcy4gRGF0ZXMgYXJlIGNvbXBhcmVkIGJ5IHRoZWlyXG4gICAgICAgIC8vIG1pbGxpc2Vjb25kIHJlcHJlc2VudGF0aW9ucy4gTm90ZSB0aGF0IGludmFsaWQgZGF0ZXMgd2l0aCBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnNcbiAgICAgICAgLy8gb2YgYE5hTmAgYXJlIG5vdCBlcXVpdmFsZW50LlxuICAgICAgICByZXR1cm4gK2EgPT09ICtiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgIT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICAvLyBBc3N1bWUgZXF1YWxpdHkgZm9yIGN5Y2xpYyBzdHJ1Y3R1cmVzLiBUaGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljXG4gICAgLy8gc3RydWN0dXJlcyBpcyBhZGFwdGVkIGZyb20gRVMgNS4xIHNlY3Rpb24gMTUuMTIuMywgYWJzdHJhY3Qgb3BlcmF0aW9uIGBKT2AuXG4gICAgdmFyIGxlbmd0aCA9IGFTdGFjay5sZW5ndGg7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2ZcbiAgICAgIC8vIHVuaXF1ZSBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICAgIGlmIChhU3RhY2tbbGVuZ3RoXSA9PT0gYSkgcmV0dXJuIGJTdGFja1tsZW5ndGhdID09PSBiO1xuICAgIH1cbiAgICAvLyBPYmplY3RzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWl2YWxlbnQsIGJ1dCBgT2JqZWN0YHNcbiAgICAvLyBmcm9tIGRpZmZlcmVudCBmcmFtZXMgYXJlLlxuICAgIHZhciBhQ3RvciA9IGEuY29uc3RydWN0b3IsIGJDdG9yID0gYi5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoXG4gICAgICBhQ3RvciAhPT0gYkN0b3IgJiZcbiAgICAgIC8vIEhhbmRsZSBPYmplY3QuY3JlYXRlKHgpIGNhc2VzXG4gICAgICAnY29uc3RydWN0b3InIGluIGEgJiYgJ2NvbnN0cnVjdG9yJyBpbiBiICYmXG4gICAgICAhKF8uaXNGdW5jdGlvbihhQ3RvcikgJiYgYUN0b3IgaW5zdGFuY2VvZiBhQ3RvciAmJlxuICAgICAgICBfLmlzRnVuY3Rpb24oYkN0b3IpICYmIGJDdG9yIGluc3RhbmNlb2YgYkN0b3IpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICBhU3RhY2sucHVzaChhKTtcbiAgICBiU3RhY2sucHVzaChiKTtcbiAgICB2YXIgc2l6ZSwgcmVzdWx0O1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICAgIGlmIChjbGFzc05hbWUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgIC8vIENvbXBhcmUgYXJyYXkgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5LlxuICAgICAgc2l6ZSA9IGEubGVuZ3RoO1xuICAgICAgcmVzdWx0ID0gc2l6ZSA9PT0gYi5sZW5ndGg7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIC8vIERlZXAgY29tcGFyZSB0aGUgY29udGVudHMsIGlnbm9yaW5nIG5vbi1udW1lcmljIHByb3BlcnRpZXMuXG4gICAgICAgIHdoaWxlIChzaXplLS0pIHtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgPSBlcShhW3NpemVdLCBiW3NpemVdLCBhU3RhY2ssIGJTdGFjaykpKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy5cbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKGEpLCBrZXk7XG4gICAgICBzaXplID0ga2V5cy5sZW5ndGg7XG4gICAgICAvLyBFbnN1cmUgdGhhdCBib3RoIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgcHJvcGVydGllcyBiZWZvcmUgY29tcGFyaW5nIGRlZXAgZXF1YWxpdHkuXG4gICAgICByZXN1bHQgPSBfLmtleXMoYikubGVuZ3RoID09PSBzaXplO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB3aGlsZSAoc2l6ZS0tKSB7XG4gICAgICAgICAgLy8gRGVlcCBjb21wYXJlIGVhY2ggbWVtYmVyXG4gICAgICAgICAga2V5ID0ga2V5c1tzaXplXTtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgPSBfLmhhcyhiLCBrZXkpICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaykpKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICBhU3RhY2sucG9wKCk7XG4gICAgYlN0YWNrLnBvcCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUGVyZm9ybSBhIGRlZXAgY29tcGFyaXNvbiB0byBjaGVjayBpZiB0d28gb2JqZWN0cyBhcmUgZXF1YWwuXG4gIF8uaXNFcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gZXEoYSwgYiwgW10sIFtdKTtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIGFycmF5LCBzdHJpbmcsIG9yIG9iamVjdCBlbXB0eT9cbiAgLy8gQW4gXCJlbXB0eVwiIG9iamVjdCBoYXMgbm8gZW51bWVyYWJsZSBvd24tcHJvcGVydGllcy5cbiAgXy5pc0VtcHR5ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoXy5pc0FycmF5KG9iaikgfHwgXy5pc1N0cmluZyhvYmopIHx8IF8uaXNBcmd1bWVudHMob2JqKSkgcmV0dXJuIG9iai5sZW5ndGggPT09IDA7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikgaWYgKF8uaGFzKG9iaiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYSBET00gZWxlbWVudD9cbiAgXy5pc0VsZW1lbnQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gISEob2JqICYmIG9iai5ub2RlVHlwZSA9PT0gMSk7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhbiBhcnJheT9cbiAgLy8gRGVsZWdhdGVzIHRvIEVDTUE1J3MgbmF0aXZlIEFycmF5LmlzQXJyYXlcbiAgXy5pc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgYW4gb2JqZWN0P1xuICBfLmlzT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgIHJldHVybiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09ICdvYmplY3QnICYmICEhb2JqO1xuICB9O1xuXG4gIC8vIEFkZCBzb21lIGlzVHlwZSBtZXRob2RzOiBpc0FyZ3VtZW50cywgaXNGdW5jdGlvbiwgaXNTdHJpbmcsIGlzTnVtYmVyLCBpc0RhdGUsIGlzUmVnRXhwLlxuICBfLmVhY2goWydBcmd1bWVudHMnLCAnRnVuY3Rpb24nLCAnU3RyaW5nJywgJ051bWJlcicsICdEYXRlJywgJ1JlZ0V4cCddLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgX1snaXMnICsgbmFtZV0gPSBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0ICcgKyBuYW1lICsgJ10nO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIERlZmluZSBhIGZhbGxiYWNrIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBpbiBicm93c2VycyAoYWhlbSwgSUUpLCB3aGVyZVxuICAvLyB0aGVyZSBpc24ndCBhbnkgaW5zcGVjdGFibGUgXCJBcmd1bWVudHNcIiB0eXBlLlxuICBpZiAoIV8uaXNBcmd1bWVudHMoYXJndW1lbnRzKSkge1xuICAgIF8uaXNBcmd1bWVudHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBfLmhhcyhvYmosICdjYWxsZWUnKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gT3B0aW1pemUgYGlzRnVuY3Rpb25gIGlmIGFwcHJvcHJpYXRlLiBXb3JrIGFyb3VuZCBhbiBJRSAxMSBidWcuXG4gIGlmICh0eXBlb2YgLy4vICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgXy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PSAnZnVuY3Rpb24nIHx8IGZhbHNlO1xuICAgIH07XG4gIH1cblxuICAvLyBJcyBhIGdpdmVuIG9iamVjdCBhIGZpbml0ZSBudW1iZXI/XG4gIF8uaXNGaW5pdGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gaXNGaW5pdGUob2JqKSAmJiAhaXNOYU4ocGFyc2VGbG9hdChvYmopKTtcbiAgfTtcblxuICAvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYE5hTmA/IChOYU4gaXMgdGhlIG9ubHkgbnVtYmVyIHdoaWNoIGRvZXMgbm90IGVxdWFsIGl0c2VsZikuXG4gIF8uaXNOYU4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gXy5pc051bWJlcihvYmopICYmIG9iaiAhPT0gK29iajtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgYm9vbGVhbj9cbiAgXy5pc0Jvb2xlYW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCb29sZWFuXSc7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBlcXVhbCB0byBudWxsP1xuICBfLmlzTnVsbCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IG51bGw7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YXJpYWJsZSB1bmRlZmluZWQ/XG4gIF8uaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB2b2lkIDA7XG4gIH07XG5cbiAgLy8gU2hvcnRjdXQgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eSBkaXJlY3RseVxuICAvLyBvbiBpdHNlbGYgKGluIG90aGVyIHdvcmRzLCBub3Qgb24gYSBwcm90b3R5cGUpLlxuICBfLmhhcyA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xuICB9O1xuXG4gIC8vIFV0aWxpdHkgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUnVuIFVuZGVyc2NvcmUuanMgaW4gKm5vQ29uZmxpY3QqIG1vZGUsIHJldHVybmluZyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0c1xuICAvLyBwcmV2aW91cyBvd25lci4gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8ubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIHJvb3QuXyA9IHByZXZpb3VzVW5kZXJzY29yZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBLZWVwIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBhcm91bmQgZm9yIGRlZmF1bHQgaXRlcmF0ZWVzLlxuICBfLmlkZW50aXR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgXy5jb25zdGFudCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgXy5ub29wID0gZnVuY3Rpb24oKXt9O1xuXG4gIF8ucHJvcGVydHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqW2tleV07XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgcHJlZGljYXRlIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBzZXQgb2YgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8ubWF0Y2hlcyA9IGZ1bmN0aW9uKGF0dHJzKSB7XG4gICAgdmFyIHBhaXJzID0gXy5wYWlycyhhdHRycyksIGxlbmd0aCA9IHBhaXJzLmxlbmd0aDtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiAhbGVuZ3RoO1xuICAgICAgb2JqID0gbmV3IE9iamVjdChvYmopO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2ldLCBrZXkgPSBwYWlyWzBdO1xuICAgICAgICBpZiAocGFpclsxXSAhPT0gb2JqW2tleV0gfHwgIShrZXkgaW4gb2JqKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSdW4gYSBmdW5jdGlvbiAqKm4qKiB0aW1lcy5cbiAgXy50aW1lcyA9IGZ1bmN0aW9uKG4sIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIGFjY3VtID0gQXJyYXkoTWF0aC5tYXgoMCwgbikpO1xuICAgIGl0ZXJhdGVlID0gY3JlYXRlQ2FsbGJhY2soaXRlcmF0ZWUsIGNvbnRleHQsIDEpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSBhY2N1bVtpXSA9IGl0ZXJhdGVlKGkpO1xuICAgIHJldHVybiBhY2N1bTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIG1pbiBhbmQgbWF4IChpbmNsdXNpdmUpLlxuICBfLnJhbmRvbSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgaWYgKG1heCA9PSBudWxsKSB7XG4gICAgICBtYXggPSBtaW47XG4gICAgICBtaW4gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gbWluICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTtcbiAgfTtcblxuICAvLyBBIChwb3NzaWJseSBmYXN0ZXIpIHdheSB0byBnZXQgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGFzIGFuIGludGVnZXIuXG4gIF8ubm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9O1xuXG4gICAvLyBMaXN0IG9mIEhUTUwgZW50aXRpZXMgZm9yIGVzY2FwaW5nLlxuICB2YXIgZXNjYXBlTWFwID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjeDI3OycsXG4gICAgJ2AnOiAnJiN4NjA7J1xuICB9O1xuICB2YXIgdW5lc2NhcGVNYXAgPSBfLmludmVydChlc2NhcGVNYXApO1xuXG4gIC8vIEZ1bmN0aW9ucyBmb3IgZXNjYXBpbmcgYW5kIHVuZXNjYXBpbmcgc3RyaW5ncyB0by9mcm9tIEhUTUwgaW50ZXJwb2xhdGlvbi5cbiAgdmFyIGNyZWF0ZUVzY2FwZXIgPSBmdW5jdGlvbihtYXApIHtcbiAgICB2YXIgZXNjYXBlciA9IGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWFwW21hdGNoXTtcbiAgICB9O1xuICAgIC8vIFJlZ2V4ZXMgZm9yIGlkZW50aWZ5aW5nIGEga2V5IHRoYXQgbmVlZHMgdG8gYmUgZXNjYXBlZFxuICAgIHZhciBzb3VyY2UgPSAnKD86JyArIF8ua2V5cyhtYXApLmpvaW4oJ3wnKSArICcpJztcbiAgICB2YXIgdGVzdFJlZ2V4cCA9IFJlZ0V4cChzb3VyY2UpO1xuICAgIHZhciByZXBsYWNlUmVnZXhwID0gUmVnRXhwKHNvdXJjZSwgJ2cnKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSBzdHJpbmcgPT0gbnVsbCA/ICcnIDogJycgKyBzdHJpbmc7XG4gICAgICByZXR1cm4gdGVzdFJlZ2V4cC50ZXN0KHN0cmluZykgPyBzdHJpbmcucmVwbGFjZShyZXBsYWNlUmVnZXhwLCBlc2NhcGVyKSA6IHN0cmluZztcbiAgICB9O1xuICB9O1xuICBfLmVzY2FwZSA9IGNyZWF0ZUVzY2FwZXIoZXNjYXBlTWFwKTtcbiAgXy51bmVzY2FwZSA9IGNyZWF0ZUVzY2FwZXIodW5lc2NhcGVNYXApO1xuXG4gIC8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgYHByb3BlcnR5YCBpcyBhIGZ1bmN0aW9uIHRoZW4gaW52b2tlIGl0IHdpdGggdGhlXG4gIC8vIGBvYmplY3RgIGFzIGNvbnRleHQ7IG90aGVyd2lzZSwgcmV0dXJuIGl0LlxuICBfLnJlc3VsdCA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgdmFyIHZhbHVlID0gb2JqZWN0W3Byb3BlcnR5XTtcbiAgICByZXR1cm4gXy5pc0Z1bmN0aW9uKHZhbHVlKSA/IG9iamVjdFtwcm9wZXJ0eV0oKSA6IHZhbHVlO1xuICB9O1xuXG4gIC8vIEdlbmVyYXRlIGEgdW5pcXVlIGludGVnZXIgaWQgKHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSBjbGllbnQgc2Vzc2lvbikuXG4gIC8vIFVzZWZ1bCBmb3IgdGVtcG9yYXJ5IERPTSBpZHMuXG4gIHZhciBpZENvdW50ZXIgPSAwO1xuICBfLnVuaXF1ZUlkID0gZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGlkID0gKytpZENvdW50ZXIgKyAnJztcbiAgICByZXR1cm4gcHJlZml4ID8gcHJlZml4ICsgaWQgOiBpZDtcbiAgfTtcblxuICAvLyBCeSBkZWZhdWx0LCBVbmRlcnNjb3JlIHVzZXMgRVJCLXN0eWxlIHRlbXBsYXRlIGRlbGltaXRlcnMsIGNoYW5nZSB0aGVcbiAgLy8gZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICBfLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG4gICAgZXZhbHVhdGUgICAgOiAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgIGludGVycG9sYXRlIDogLzwlPShbXFxzXFxTXSs/KSU+L2csXG4gICAgZXNjYXBlICAgICAgOiAvPCUtKFtcXHNcXFNdKz8pJT4vZ1xuICB9O1xuXG4gIC8vIFdoZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW5cbiAgLy8gaW50ZXJwb2xhdGlvbiwgZXZhbHVhdGlvbiBvciBlc2NhcGluZyByZWdleCwgd2UgbmVlZCBvbmUgdGhhdCBpc1xuICAvLyBndWFyYW50ZWVkIG5vdCB0byBtYXRjaC5cbiAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87XG5cbiAgLy8gQ2VydGFpbiBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHB1dCBpbnRvIGFcbiAgLy8gc3RyaW5nIGxpdGVyYWwuXG4gIHZhciBlc2NhcGVzID0ge1xuICAgIFwiJ1wiOiAgICAgIFwiJ1wiLFxuICAgICdcXFxcJzogICAgICdcXFxcJyxcbiAgICAnXFxyJzogICAgICdyJyxcbiAgICAnXFxuJzogICAgICduJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgdmFyIGVzY2FwZXIgPSAvXFxcXHwnfFxccnxcXG58XFx1MjAyOHxcXHUyMDI5L2c7XG5cbiAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiAnXFxcXCcgKyBlc2NhcGVzW21hdGNoXTtcbiAgfTtcblxuICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLlxuICAvLyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzIHdoaXRlc3BhY2UsXG4gIC8vIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLlxuICAvLyBOQjogYG9sZFNldHRpbmdzYCBvbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gIF8udGVtcGxhdGUgPSBmdW5jdGlvbih0ZXh0LCBzZXR0aW5ncywgb2xkU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNldHRpbmdzICYmIG9sZFNldHRpbmdzKSBzZXR0aW5ncyA9IG9sZFNldHRpbmdzO1xuICAgIHNldHRpbmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0aW5ncyk7XG5cbiAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi5cbiAgICB2YXIgbWF0Y2hlciA9IFJlZ0V4cChbXG4gICAgICAoc2V0dGluZ3MuZXNjYXBlIHx8IG5vTWF0Y2gpLnNvdXJjZSxcbiAgICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsXG4gICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlXG4gICAgXS5qb2luKCd8JykgKyAnfCQnLCAnZycpO1xuXG4gICAgLy8gQ29tcGlsZSB0aGUgdGVtcGxhdGUgc291cmNlLCBlc2NhcGluZyBzdHJpbmcgbGl0ZXJhbHMgYXBwcm9wcmlhdGVseS5cbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBzb3VyY2UgPSBcIl9fcCs9J1wiO1xuICAgIHRleHQucmVwbGFjZShtYXRjaGVyLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlLCBpbnRlcnBvbGF0ZSwgZXZhbHVhdGUsIG9mZnNldCkge1xuICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShlc2NhcGVyLCBlc2NhcGVDaGFyKTtcbiAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICBpZiAoZXNjYXBlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIicrXFxuKChfX3Q9KFwiICsgZXNjYXBlICsgXCIpKT09bnVsbD8nJzpfLmVzY2FwZShfX3QpKStcXG4nXCI7XG4gICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIicrXFxuKChfX3Q9KFwiICsgaW50ZXJwb2xhdGUgKyBcIikpPT1udWxsPycnOl9fdCkrXFxuJ1wiO1xuICAgICAgfSBlbHNlIGlmIChldmFsdWF0ZSkge1xuICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGUgKyBcIlxcbl9fcCs9J1wiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZG9iZSBWTXMgbmVlZCB0aGUgbWF0Y2ggcmV0dXJuZWQgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvZmZlc3QuXG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG4gICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgIC8vIElmIGEgdmFyaWFibGUgaXMgbm90IHNwZWNpZmllZCwgcGxhY2UgZGF0YSB2YWx1ZXMgaW4gbG9jYWwgc2NvcGUuXG4gICAgaWYgKCFzZXR0aW5ncy52YXJpYWJsZSkgc291cmNlID0gJ3dpdGgob2JqfHx7fSl7XFxuJyArIHNvdXJjZSArICd9XFxuJztcblxuICAgIHNvdXJjZSA9IFwidmFyIF9fdCxfX3A9JycsX19qPUFycmF5LnByb3RvdHlwZS5qb2luLFwiICtcbiAgICAgIFwicHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9fai5jYWxsKGFyZ3VtZW50cywnJyk7fTtcXG5cIiArXG4gICAgICBzb3VyY2UgKyAncmV0dXJuIF9fcDtcXG4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZW5kZXIgPSBuZXcgRnVuY3Rpb24oc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaicsICdfJywgc291cmNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgcmV0dXJuIHJlbmRlci5jYWxsKHRoaXMsIGRhdGEsIF8pO1xuICAgIH07XG5cbiAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBzb3VyY2UgYXMgYSBjb252ZW5pZW5jZSBmb3IgcHJlY29tcGlsYXRpb24uXG4gICAgdmFyIGFyZ3VtZW50ID0gc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaic7XG4gICAgdGVtcGxhdGUuc291cmNlID0gJ2Z1bmN0aW9uKCcgKyBhcmd1bWVudCArICcpe1xcbicgKyBzb3VyY2UgKyAnfSc7XG5cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH07XG5cbiAgLy8gQWRkIGEgXCJjaGFpblwiIGZ1bmN0aW9uLiBTdGFydCBjaGFpbmluZyBhIHdyYXBwZWQgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8uY2hhaW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfKG9iaik7XG4gICAgaW5zdGFuY2UuX2NoYWluID0gdHJ1ZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG5cbiAgLy8gT09QXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAvLyBJZiBVbmRlcnNjb3JlIGlzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgd3JhcHBlZCBvYmplY3QgdGhhdFxuICAvLyBjYW4gYmUgdXNlZCBPTy1zdHlsZS4gVGhpcyB3cmFwcGVyIGhvbGRzIGFsdGVyZWQgdmVyc2lvbnMgb2YgYWxsIHRoZVxuICAvLyB1bmRlcnNjb3JlIGZ1bmN0aW9ucy4gV3JhcHBlZCBvYmplY3RzIG1heSBiZSBjaGFpbmVkLlxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb250aW51ZSBjaGFpbmluZyBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiB0aGlzLl9jaGFpbiA/IF8ob2JqKS5jaGFpbigpIDogb2JqO1xuICB9O1xuXG4gIC8vIEFkZCB5b3VyIG93biBjdXN0b20gZnVuY3Rpb25zIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdC5cbiAgXy5taXhpbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIF8uZWFjaChfLmZ1bmN0aW9ucyhvYmopLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IF9bbmFtZV0gPSBvYmpbbmFtZV07XG4gICAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IFt0aGlzLl93cmFwcGVkXTtcbiAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgZnVuYy5hcHBseShfLCBhcmdzKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEFkZCBhbGwgb2YgdGhlIFVuZGVyc2NvcmUgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyIG9iamVjdC5cbiAgXy5taXhpbihfKTtcblxuICAvLyBBZGQgYWxsIG11dGF0b3IgQXJyYXkgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyLlxuICBfLmVhY2goWydwb3AnLCAncHVzaCcsICdyZXZlcnNlJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvW25hbWVdO1xuICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb2JqID0gdGhpcy5fd3JhcHBlZDtcbiAgICAgIG1ldGhvZC5hcHBseShvYmosIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoKG5hbWUgPT09ICdzaGlmdCcgfHwgbmFtZSA9PT0gJ3NwbGljZScpICYmIG9iai5sZW5ndGggPT09IDApIGRlbGV0ZSBvYmpbMF07XG4gICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgb2JqKTtcbiAgICB9O1xuICB9KTtcblxuICAvLyBBZGQgYWxsIGFjY2Vzc29yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgXy5lYWNoKFsnY29uY2F0JywgJ2pvaW4nLCAnc2xpY2UnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvW25hbWVdO1xuICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgbWV0aG9kLmFwcGx5KHRoaXMuX3dyYXBwZWQsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIEV4dHJhY3RzIHRoZSByZXN1bHQgZnJvbSBhIHdyYXBwZWQgYW5kIGNoYWluZWQgb2JqZWN0LlxuICBfLnByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl93cmFwcGVkO1xuICB9O1xuXG4gIC8vIEFNRCByZWdpc3RyYXRpb24gaGFwcGVucyBhdCB0aGUgZW5kIGZvciBjb21wYXRpYmlsaXR5IHdpdGggQU1EIGxvYWRlcnNcbiAgLy8gdGhhdCBtYXkgbm90IGVuZm9yY2UgbmV4dC10dXJuIHNlbWFudGljcyBvbiBtb2R1bGVzLiBFdmVuIHRob3VnaCBnZW5lcmFsXG4gIC8vIHByYWN0aWNlIGZvciBBTUQgcmVnaXN0cmF0aW9uIGlzIHRvIGJlIGFub255bW91cywgdW5kZXJzY29yZSByZWdpc3RlcnNcbiAgLy8gYXMgYSBuYW1lZCBtb2R1bGUgYmVjYXVzZSwgbGlrZSBqUXVlcnksIGl0IGlzIGEgYmFzZSBsaWJyYXJ5IHRoYXQgaXNcbiAgLy8gcG9wdWxhciBlbm91Z2ggdG8gYmUgYnVuZGxlZCBpbiBhIHRoaXJkIHBhcnR5IGxpYiwgYnV0IG5vdCBiZSBwYXJ0IG9mXG4gIC8vIGFuIEFNRCBsb2FkIHJlcXVlc3QuIFRob3NlIGNhc2VzIGNvdWxkIGdlbmVyYXRlIGFuIGVycm9yIHdoZW4gYW5cbiAgLy8gYW5vbnltb3VzIGRlZmluZSgpIGlzIGNhbGxlZCBvdXRzaWRlIG9mIGEgbG9hZGVyIHJlcXVlc3QuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoJ3VuZGVyc2NvcmUnLCBbXSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsIl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5cbiMgY2FsY3VsYXRlIHRoZSBjb25zZW5zdXMgc2VxXG4jIFRPRE86IHZlcnkgbmFpdmUgd2F5XG5tb2R1bGUuZXhwb3J0cyA9IChzZXFzKSAtPlxuXG4gIHNlcXMgPSBzZXFzLm1hcCAoZWwpIC0+IGVsLmdldCBcInNlcVwiXG4gIG9jY3MgPSBuZXcgQXJyYXkgc2Vxcy5sZW5ndGhcblxuICAjIGNvdW50IHRoZSBvY2N1cmVuY2VzIG9mIHRoZSBjaGFycyBvZiBhIHBvc2l0aW9uXG4gIF8uZWFjaCBzZXFzLCAoZWwsaSkgLT5cbiAgICBfLmVhY2ggZWwsIChjaGFyLCBwb3MpIC0+XG4gICAgICBvY2NzW3Bvc10gPSB7fSB1bmxlc3Mgb2Njc1twb3NdP1xuICAgICAgb2Njc1twb3NdW2NoYXJdID0gMCB1bmxlc3Mgb2Njc1twb3NdW2NoYXJdP1xuICAgICAgb2Njc1twb3NdW2NoYXJdKytcblxuICAjIG5vdyBwaWNrIHRoZSBjaGFyIHdpdGggbW9zdCBvY2N1cmVuY2VzXG4gIF8ucmVkdWNlIG9jY3MsIChtZW1vLG9jYykgLT5cbiAgICBrZXlzID0gXy5rZXlzIG9jY1xuICAgIG1lbW8gKz0gIF8ubWF4IGtleXMsIChrZXkpIC0+IG9jY1trZXldXG4gICwgXCJcIlxuIiwiIyBmb3IgZWFjaCBzZXF1ZW5jZVxuIyAqIGNvdW50cyB0aGUgbWF0Y2hlcyB3aXRoIHRoZSBjb25zZW5zdXMgc2VxXG4jICogZXhjbHVkaW5nIGdhcHNcbiMgKiBpZGVudGl0eSA9IG1hdGNoZWRDaGFycyAvIHRvdGFsQ2hhcnMgKGV4Y2x1ZGluZyBnYXBzKVxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0aXlDYWxjID0gKHNlcXMsIGNvbnNlbnN1cykgLT5cbiAgIyBkbyBub3RoaW5nIG9uIGludmFsaWQgY29uc2Vuc3VzXG4gIGlmIGNvbnNlbnN1cyBpcyB1bmRlZmluZWRcbiAgICBjb25zb2xlLndhcm4gXCJidWcgb24gY29uc2VudXMgY2FsY1wiXG4gICAgcmV0dXJuXG4gIHNlcXMuZWFjaCAoc2VxT2JqKSAtPlxuICAgIHNlcSA9IHNlcU9iai5nZXQgXCJzZXFcIlxuICAgIG1hdGNoZXMgPSAwXG4gICAgdG90YWwgPSAwXG4gICAgZm9yIGkgaW4gWzAuLnNlcS5sZW5ndGggLSAxXVxuICAgICAgaWYgc2VxW2ldIGlzbnQgXCItXCIgYW5kIGNvbnNlbnN1c1tpXSBpc250IFwiLVwiXG4gICAgICAgIHRvdGFsKytcbiAgICAgICAgbWF0Y2hlcysrIGlmIHNlcVtpXSBpcyBjb25zZW5zdXNbaV1cbiAgICBzZXFPYmouc2V0IFwiaWRlbnRpdHlcIiwgbWF0Y2hlcyAvIHRvdGFsXG4iLCJtb2R1bGUuZXhwb3J0cy5jb25zZW5zdXMgPSByZXF1aXJlIFwiLi9Db25zZW5zdXNDYWxjXCJcbiIsIk1vZGVsID0gcmVxdWlyZShcImJhY2tib25lLXRoaW5cIikuTW9kZWxcblxuIyB0aGlzIGlzIGFuIGV4YW1wbGUgb2YgaG93IG9uZSBjb3VsZCBjb2xvciB0aGUgTVNBXG4jIGZlZWwgZnJlZSB0byBjcmVhdGUgeW91ciBvd24gY29sb3Igc2NoZW1lIGluIHRoZSAvY3NzL3NjaGVtZXMgZm9sZGVyXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yYXRvciA9IE1vZGVsLmV4dGVuZFxuXG4gIGRlZmF1bHRzOlxuICAgIHNjaGVtZTogXCJ0YXlsb3JcIiAjIG5hbWUgb2YgeW91ciBjb2xvciBzY2hlbWUgKGNzcyBzdWZmaXgpXG4gICAgY29sb3JCYWNrZ3JvdW5kOiB0cnVlICMgb3RoZXJ3aXNlIG9ubHkgdGhlIHRleHQgd2lsbCBiZSBjb2xvcmVkXG4gICAgc2hvd0xvd2VyQ2FzZTogdHJ1ZSAjIHVzZWQgdG8gaGlkZSBhbmQgc2hvdyBsb3dlcmNhc2UgY2hhcnMgaW4gdGhlIG92ZXJ2aWV3Ym94XG4gICAgb3BhY2l0eTogMC42ICMgb3BhY2l0eSBmb3IgdGhlIHJlc2lkdWVzXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5jb25zZW51cyA9IHJlcXVpcmUgXCIuLi9hbGdvL0NvbnNlbnN1c0NhbGNcIlxuXyA9IHJlcXVpcmUgXCJ1bmRlcnNjb3JlXCJcblxuIyBtb2RlbCBmb3IgY29sdW1uIHByb3BlcnRpZXMgKGxpa2UgdGhlaXIgaGlkZGVuIHN0YXRlKVxubW9kdWxlLmV4cG9ydHMgPSBDb2x1bW5zID0gTW9kZWwuZXh0ZW5kXG5cbiAgZGVmYXVsdHM6XG4gICAgc2NhbGluZzogXCJsaW5cIiAjIG9mIHRoZSBjb25zZXJ2YXRpb24gY2hhcnQgZS5nLiBcImxpblwiLCBcImV4cFwiLCBcImxvZ1wiXG5cbiAgaW5pdGlhbGl6ZTogLT5cbiAgICAjIGhpZGRlbiBjb2x1bW5zXG4gICAgQC5zZXQgXCJoaWRkZW5cIiwgW10gdW5sZXNzIEAuZ2V0KFwiaGlkZGVuXCIpP1xuXG4gICMgYXNzdW1lcyBoaWRkZW4gY29sdW1ucyBhcmUgc29ydGVkXG4gICMgQHJldHVybnMgbiBbaW50XSBudW1iZXIgb2YgaGlkZGVuIGNvbHVtbnMgdW50aWwgblxuICBjYWxjSGlkZGVuQ29sdW1uczogKG4pIC0+XG4gICAgaGlkZGVuID0gQGdldCBcImhpZGRlblwiXG4gICAgbmV3WCA9IG5cbiAgICBmb3IgaSBpbiBoaWRkZW5cbiAgICAgIGlmIGkgPD0gbmV3WFxuICAgICAgICBuZXdYKytcbiAgICBuZXdYIC0gblxuXG4gICMgY2FsY3MgY29uc2VydmF0aW9uXG4gIF9jYWxjQ29uc2VydmF0aW9uUHJlOiAoc2VxcykgLT5cblxuICAgICMgZW1lcmdlbmN5IGN1dG9mZlxuICAgIGNvbnNvbGUubG9nIHNlcXMubGVuZ3RoXG4gICAgaWYgc2Vxcy5sZW5ndGggPiAxMDAwXG4gICAgICByZXR1cm5cblxuICAgICMgY2FsYyBjb25zZW5zdXNcbiAgICBjb25zID0gY29uc2VudXMoc2VxcylcbiAgICBzZXFzID0gc2Vxcy5tYXAgKGVsKSAtPiBlbC5nZXQgXCJzZXFcIlxuICAgIG5NYXggPSAoXy5tYXggc2VxcywgKGVsKSAtPiBlbC5sZW5ndGgpLmxlbmd0aFxuXG4gICAgdG90YWwgPSBuZXcgQXJyYXkgbk1heFxuICAgIG1hdGNoZXMgPSBuZXcgQXJyYXkgbk1heFxuICAgICMgY2FsYyBkZXJpdmF0aW9uIGZyb20gY29uc2VudXNcbiAgICBfLmVhY2ggc2VxcywgKGVsLGkpIC0+XG4gICAgICBfLmVhY2ggZWwsIChjaGFyLCBwb3MpIC0+XG4gICAgICAgICNpZiBjb25zW3Bvc10gaXNudCBcIi1cIiBhbmQgbWF0Y2hlc1twb3NdIGlzbnQgZ2FwXG4gICAgICAgIHRvdGFsW3Bvc10gPSB0b3RhbFtwb3NdICsgMSB8fCAxXG4gICAgICAgIG1hdGNoZXNbcG9zXSA9IG1hdGNoZXNbcG9zXSArIDEgfHwgMSBpZiBjb25zW3Bvc10gaXMgY2hhclxuICAgIFttYXRjaGVzLCB0b3RhbCwgbk1heF1cblxuICBjYWxjQ29uc2VydmF0aW9uOiAoc2VxcykgLT5cbiAgICBpZiBAYXR0cmlidXRlcy5zY2FsaW5nIGlzIFwiZXhwXCJcbiAgICAgIHJldHVybiBAY2FsY0NvbnNlcnZhdGlvbkV4cCBzZXFzXG4gICAgZWxzZSBpZiBAYXR0cmlidXRlcy5zY2FsaW5nIGlzIFwibG9nXCJcbiAgICAgIHJldHVybiBAY2FsY0NvbnNlcnZhdGlvbkxvZyBzZXFzXG4gICAgZWxzZSBpZiBAYXR0cmlidXRlcy5zY2FsaW5nIGlzIFwibGluXCJcbiAgICAgIHJldHVybiBAY2FsY0NvbnNlcnZhdGlvbkxpbiBzZXFzXG5cbiAgIyAocGVyY2VudGFnZSBvZiBjaGFycyBvZiB0aGUgY29uc2VudXMgc2VxKVxuICBjYWxjQ29uc2VydmF0aW9uTGluOiAoc2VxcykgLT5cbiAgICBbbWF0Y2hlcyx0b3RhbCwgbk1heF0gPSBAX2NhbGNDb25zZXJ2YXRpb25QcmUgc2Vxc1xuICAgIGZvciBpIGluIFswIC4uIG5NYXggLSAxXVxuICAgICAgbWF0Y2hlc1tpXSA9IG1hdGNoZXNbaV0gLyB0b3RhbFtpXVxuICAgIEAuc2V0IFwiY29uc2VydlwiLCBtYXRjaGVzXG4gICAgbWF0Y2hlc1xuXG4gICMgKHBlcmNlbnRhZ2Ugb2YgY2hhcnMgb2YgdGhlIGNvbnNlbnVzIHNlcSlcbiAgY2FsY0NvbnNlcnZhdGlvbkxvZzogKHNlcXMpIC0+XG4gICAgW21hdGNoZXMsdG90YWwsIG5NYXhdID0gQF9jYWxjQ29uc2VydmF0aW9uUHJlIHNlcXNcbiAgICBmb3IgaSBpbiBbMCAuLiBuTWF4IC0gMV1cbiAgICAgIG1hdGNoZXNbaV0gPSBNYXRoLmxvZyhtYXRjaGVzW2ldICsgMSkgLyBNYXRoLmxvZyh0b3RhbFtpXSArIDEpXG4gICAgQC5zZXQgXCJjb25zZXJ2XCIsIG1hdGNoZXNcbiAgICBtYXRjaGVzXG5cbiAgY2FsY0NvbnNlcnZhdGlvbkV4cDogKHNlcXMpIC0+XG4gICAgW21hdGNoZXMsdG90YWwsIG5NYXhdID0gQF9jYWxjQ29uc2VydmF0aW9uUHJlIHNlcXNcbiAgICBmb3IgaSBpbiBbMCAuLiBuTWF4IC0gMV1cbiAgICAgIG1hdGNoZXNbaV0gPSBNYXRoLmV4cChtYXRjaGVzW2ldICsgMSkgLyBNYXRoLmV4cCh0b3RhbFtpXSArIDEpXG4gICAgQC5zZXQgXCJjb25zZXJ2XCIsIG1hdGNoZXNcbiAgICBtYXRjaGVzXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5cbiMgc2ltcGxlIHVzZXIgY29uZmlnXG5tb2R1bGUuZXhwb3J0cyA9IENvbmZpZyA9IE1vZGVsLmV4dGVuZFxuXG4gIGRlZmF1bHRzOlxuICAgIHJlZ2lzdGVyTW91c2VIb3ZlcjogZmFsc2UsXG4gICAgcmVnaXN0ZXJNb3VzZUNsaWNrczogdHJ1ZSxcbiAgICBpbXBvcnRQcm94eTogXCJodHRwczovL2NvcnMtYW55d2hlcmUuaGVyb2t1YXBwLmNvbS9cIlxuICAgIGV2ZW50QnVzOiB0cnVlXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5jb25zZW51c0NhbGMgPSByZXF1aXJlIFwiLi4vYWxnby9Db25zZW5zdXNDYWxjXCJcblxuIyBzaW1wbHkgc2F2ZSB0aGUgY29uc2VudXMgc2VxdWVuY2VzIGdsb2JhbGx5XG5tb2R1bGUuZXhwb3J0cyA9IENvbnNlbnVzID0gTW9kZWwuZXh0ZW5kXG5cbiAgZGVmYXVsdHM6XG4gICAgY29uc2VudXMgOiBcIlwiXG5cbiAgZ2V0Q29uc2Vuc3VzOiAoc2VxcykgLT5cbiAgICAjIGVtZXJnZW5jeSBjdXRvZmZcbiAgICBpZiBzZXFzLmxlbmd0aCA+IDEwMDBcbiAgICAgIHJldHVyblxuXG4gICAgY29ucyA9IGNvbnNlbnVzQ2FsYyhzZXFzKVxuICAgIEAuc2V0IFwiY29uc2VudXNcIiwgY29uc1xuICAgIGNvbnNcbiIsIl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5Nb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5cbiMgaG9sZHMgdGhlIGN1cnJlbnQgdXNlciBzZWxlY3Rpb25cblNlbGVjdGlvbiA9IE1vZGVsLmV4dGVuZFxuICBkZWZhdWx0czpcbiAgICB0eXBlOiBcInN1cGVyXCJcblxuUm93U2VsZWN0aW9uID0gU2VsZWN0aW9uLmV4dGVuZFxuICBkZWZhdWx0czogXy5leHRlbmQge30sIFNlbGVjdGlvbjo6LmRlZmF1bHRzLFxuICAgIHR5cGU6IFwicm93XCJcbiAgICBzZXFJZDogXCJcIlxuXG4gIGluUm93OiAoc2VxSWQpIC0+XG4gICAgc2VxSWQgaXMgQC5nZXQgXCJzZXFJZFwiXG5cbiAgaW5Db2x1bW46IChyb3dQb3MpIC0+XG4gICAgdHJ1ZVxuXG4gIGdldExlbmd0aDogLT5cbiAgICAxXG5cbkNvbHVtblNlbGVjdGlvbiA9IFNlbGVjdGlvbi5leHRlbmRcbiAgZGVmYXVsdHM6IF8uZXh0ZW5kIHt9LCBTZWxlY3Rpb246Oi5kZWZhdWx0cyxcbiAgICB0eXBlOiBcImNvbHVtblwiXG4gICAgeFN0YXJ0OiAtMVxuICAgIHhFbmQ6IC0xXG5cbiAgaW5Sb3c6ICgpIC0+XG4gICAgdHJ1ZVxuXG4gIGluQ29sdW1uOiAocm93UG9zKSAtPlxuICAgIHhTdGFydCA8PSByb3dQb3MgJiYgcm93UG9zIDw9IHhFbmRcblxuICBnZXRMZW5ndGg6IC0+XG4gICAgeEVuZCAtIHhTdGFydFxuXG4jIHBvcyBpcyBhIG1peGluIG9mIGNvbHVtbiBhbmQgcm93XG4jIHN0YXJ0IHdpdGggUm93IGFuZCBvbmx5IG92ZXJ3cml0ZSBcImluQ29sdW1uXCIgZnJvbSBDb2x1bW5cblBvc1NlbGVjdGlvbiA9IFJvd1NlbGVjdGlvbi5leHRlbmQgXy5leHRlbmQge30sXy5waWNrKENvbHVtblNlbGVjdGlvbixcImluQ29sdW1uXCIpLFxuICBfLnBpY2soQ29sdW1uU2VsZWN0aW9uLFwiZ2V0TGVuZ3RoXCIpXG5cbiAgIyBtZXJnZSBib3RoIGRlZmF1bHRzXG4gIGRlZmF1bHRzOiBfLmV4dGVuZCB7fSwgQ29sdW1uU2VsZWN0aW9uOjouZGVmYXVsdHMsIFJvd1NlbGVjdGlvbjo6LmRlZmF1bHRzLFxuICAgIHR5cGU6IFwicG9zXCJcblxubW9kdWxlLmV4cG9ydHMuc2VsID0gU2VsZWN0aW9uXG5tb2R1bGUuZXhwb3J0cy5wb3NzZWwgPSBQb3NTZWxlY3Rpb25cbm1vZHVsZS5leHBvcnRzLnJvd3NlbCA9IFJvd1NlbGVjdGlvblxubW9kdWxlLmV4cG9ydHMuY29sdW1uc2VsID0gQ29sdW1uU2VsZWN0aW9uXG4iLCJzZWwgPSByZXF1aXJlIFwiLi9TZWxlY3Rpb25cIlxuXyA9IHJlcXVpcmUgXCJ1bmRlcnNjb3JlXCJcbkNvbGxlY3Rpb24gPSByZXF1aXJlKFwiYmFja2JvbmUtdGhpblwiKS5Db2xsZWN0aW9uXG5cbiMgaG9sZHMgdGhlIGN1cnJlbnQgdXNlciBzZWxlY3Rpb25cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0aW9uTWFuYWdlciA9IENvbGxlY3Rpb24uZXh0ZW5kXG5cbiAgbW9kZWw6IHNlbC5zZWxcblxuICBpbml0aWFsaXplOiAoZGF0YSwgb3B0cykgLT5cbiAgICBAZyA9IG9wdHMuZ1xuXG4gICAgQGxpc3RlblRvIEBnLCBcInJlc2lkdWU6Y2xpY2tcIiwgKGUpIC0+XG4gICAgICBAX2hhbmRsZUUgZS5ldnQsIG5ldyBzZWwucG9zc2VsXG4gICAgICAgIHhTdGFydDogZS5yb3dQb3NcbiAgICAgICAgeEVuZDogZS5yb3dQb3NcbiAgICAgICAgc2VxSWQ6IGUuc2VxSWRcblxuICAgIEBsaXN0ZW5UbyBAZywgXCJyb3c6Y2xpY2tcIiwgKGUpIC0+XG4gICAgICBAX2hhbmRsZUUgZS5ldnQsIG5ldyBzZWwucm93c2VsXG4gICAgICAgIHhTdGFydDogZS5yb3dQb3NcbiAgICAgICAgeEVuZDogZS5yb3dQb3NcbiAgICAgICAgc2VxSWQ6IGUuc2VxSWRcblxuICAgIEBsaXN0ZW5UbyBAZywgXCJjb2x1bW46Y2xpY2tcIiwgKGUpIC0+XG4gICAgICBAX2hhbmRsZUUgZS5ldnQsIG5ldyBzZWwuY29sdW1uc2VsXG4gICAgICAgIHhTdGFydDogZS5yb3dQb3NcbiAgICAgICAgeEVuZDogZS5yb3dQb3MgKyBlLnN0ZXBTaXplIC0gMVxuXG4gICAgI0BsaXN0ZW5UbyBALCBcImFkZCByZXNldFwiLCAoZSkgLT5cbiAgICAgICNAX3JlZHVjZUNvbHVtbnMoKVxuXG4gIGdldFNlbEZvclJvdzogKHNlcUlkKSAtPlxuICAgIEBmaWx0ZXIgKGVsKSAtPiBlbC5pblJvdyBzZXFJZFxuXG4gIGdldFNlbEZvckNvbHVtbnM6IChyb3dQb3MpIC0+XG4gICAgQGZpbHRlciAoZWwpIC0+IGVsLmluQ29sdW1uIHJvd1Bvc1xuXG4gICMgQHJldHVybnMgYXJyYXkgb2YgYWxsIHNlbGVjdGVkIHJlc2lkdWVzIGZvciBhIHJvd1xuICBnZXRCbG9ja3NGb3JSb3c6IChzZXFJZCwgbWF4TGVuKSAtPlxuICAgIHNlbGlzID0gQGZpbHRlciAoZWwpIC0+IGVsLmluUm93IHNlcUlkXG4gICAgYmxvY2tzID0gW11cbiAgICBmb3Igc2VsaSBpbiBzZWxpc1xuICAgICAgaWYgc2VsaS5hdHRyaWJ1dGVzLnR5cGUgaXMgXCJyb3dcIlxuICAgICAgICBibG9ja3MgPSBbMC4ubWF4TGVuXVxuICAgICAgICBicmVha1xuICAgICAgZWxzZVxuICAgICAgICBibG9ja3MgPSBibG9ja3MuY29uY2F0IFtzZWxpLmF0dHJpYnV0ZXMueFN0YXJ0IC4uIHNlbGkuYXR0cmlidXRlcy54RW5kXVxuICAgIGJsb2Nrc1xuXG4gICMgQHJldHVybnMgYXJyYXkgd2l0aCBhbGwgY29sdW1ucyBiZWluZyBzZWxlY3RlZFxuICAjIGV4YW1wbGU6IDAtNC4uLiAxMi0xNCBzZWxlY3RlZCAtPiBbMCwxLDIsMyw0LDEyLDEzLDE0XVxuICBnZXRBbGxDb2x1bW5CbG9ja3M6IChjb25mKSAtPlxuICAgIG1heExlbiA9IGNvbmYubWF4TGVuXG4gICAgd2l0aFBvcyA9IGNvbmYud2l0aFBvc1xuICAgIGJsb2NrcyA9IFtdXG4gICAgaWYgY29uZi53aXRoUG9zXG4gICAgICBmaWx0ZXJlZCA9IChAZmlsdGVyIChlbCkgLT4gZWwuZ2V0KCd4U3RhcnQnKT8gKVxuICAgIGVsc2VcbiAgICAgIGZpbHRlcmVkID0gKEBmaWx0ZXIgKGVsKSAtPiBlbC5nZXQoJ3R5cGUnKSBpcyBcImNvbHVtblwiKVxuICAgIGZvciBzZWxpIGluIGZpbHRlcmVkXG4gICAgICBibG9ja3MgPSBibG9ja3MuY29uY2F0IFtzZWxpLmF0dHJpYnV0ZXMueFN0YXJ0Li5zZWxpLmF0dHJpYnV0ZXMueEVuZF1cbiAgICBibG9ja3MgPSBfLnVuaXEgYmxvY2tzXG4gICAgcmV0dXJuIGJsb2Nrc1xuXG4gICMgaW52ZXJ0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gZm9yIGNvbHVtbnNcbiAgIyBAcGFyYW0gcm93cyBbQXJyYXldIGFsbCBhdmFpbGFibGUgc2VxSWRcbiAgaW52ZXJ0Um93OiAocm93cykgLT5cbiAgICBzZWxSb3dzID0gQHdoZXJlKHR5cGU6XCJyb3dcIilcbiAgICBzZWxSb3dzID0gXy5tYXAgc2VsUm93cywgKGVsKSAtPiBlbC5hdHRyaWJ1dGVzLnNlcUlkXG4gICAgaW52ZXJ0ZWQgPSBfLmZpbHRlciByb3dzLCAoZWwpIC0+XG4gICAgICByZXR1cm4gZmFsc2UgaWYgc2VsUm93cy5pbmRleE9mKGVsKSA+PSAwICMgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICB0cnVlXG4gICAgIyBtYXNzIGluc2VydFxuICAgIHMgPSBbXVxuICAgIGZvciBlbCBpbiBpbnZlcnRlZFxuICAgICAgcy5wdXNoIG5ldyBzZWwucm93c2VsKHNlcUlkOmVsKVxuICAgIGNvbnNvbGUubG9nIHNcbiAgICBAcmVzZXQgc1xuXG4gICMgaW52ZXJ0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gZm9yIHJvd3NcbiAgIyBAcGFyYW0gcm93cyBbQXJyYXldIGFsbCBhdmFpbGFibGUgcm93cyAoMC4ubWF4Lmxlbmd0aClcbiAgaW52ZXJ0Q29sOiAoY29sdW1ucykgLT5cbiAgICBzZWxDb2x1bW5zID0gQHdoZXJlKHR5cGU6XCJjb2x1bW5cIilcbiAgICBzZWxDb2x1bW5zID0gXy5yZWR1Y2Ugc2VsQ29sdW1ucywgKG1lbW8sZWwpIC0+XG4gICAgICBtZW1vLmNvbmNhdCBbZWwuYXR0cmlidXRlcy54U3RhcnQgLi4gZWwuYXR0cmlidXRlcy54RW5kXVxuICAgICwgW11cbiAgICBpbnZlcnRlZCA9IF8uZmlsdGVyIGNvbHVtbnMsIChlbCkgLT5cbiAgICAgIGlmIHNlbENvbHVtbnMuaW5kZXhPZihlbCkgPj0gMFxuICAgICAgICAjIGV4aXN0aW5nIHNlbGVjdGlvblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIHRydWVcbiAgICAjIG1hc3MgaW5zZXJ0XG4gICAgcmV0dXJuIGlmIGludmVydGVkLmxlbmd0aCA9PSAwXG4gICAgcyA9IFtdXG4gICAgY29uc29sZS5sb2cgaW52ZXJ0ZWRcbiAgICB4U3RhcnQgPSB4RW5kID0gaW52ZXJ0ZWRbMF1cbiAgICBmb3IgZWwgaW4gaW52ZXJ0ZWRcbiAgICAgIGlmIHhFbmQgKyAxIGlzIGVsXG4gICAgICAgICMgY29udGlndW91c1xuICAgICAgICB4RW5kID0gZWxcbiAgICAgIGVsc2VcbiAgICAgICAgIyBnYXAgYmV0d2VlblxuICAgICAgICBzLnB1c2ggbmV3IHNlbC5jb2x1bW5zZWwoeFN0YXJ0OnhTdGFydCwgeEVuZDogeEVuZClcbiAgICAgICAgeFN0YXJ0ID0geEVuZCA9IGVsXG4gICAgIyBjaGVjayBmb3IgbGFzdCBnYXBcbiAgICBzLnB1c2ggbmV3IHNlbC5jb2x1bW5zZWwoeFN0YXJ0OnhTdGFydCwgeEVuZDogaW52ZXJ0ZWRbaW52ZXJ0ZWQubGVuZ3RoIC0gMV0pIGlmIHhTdGFydCBpc250IHhFbmRcbiAgICBAcmVzZXQgc1xuXG4gICMgbWV0aG9kIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHN0YXJ0IGEgbmV3IHNlbGVjdGlvblxuICAjIG9yIGFwcGVuZCB0byB0aGUgb2xkIG9uZSAoZGVwZW5kaW5nIHdoZXRoZXIgQ1RSTCB3YXMgcHJlc3NlZClcbiAgX2hhbmRsZUU6IChlLCBzZWxlY3Rpb24pIC0+XG4gICAgaWYgZS5jdHJsS2V5IG9yIGUubWV0YUtleVxuICAgICAgQGFkZCBzZWxlY3Rpb25cbiAgICBlbHNlXG4gICAgICBAcmVzZXQgW3NlbGVjdGlvbl1cblxuICAjIGV4cGVyaW1lbnRhbCByZWR1Y2UgbWV0aG9kIGZvciBjb2x1bW5zXG4gIF9yZWR1Y2VDb2x1bW5zOiAtPlxuICAgIEBlYWNoIChlbCwgaW5kZXgsIGFycikgLT5cbiAgICAgIGNvbHMgPSBfLmZpbHRlciBhcnIsIChlbCkgLT4gZWwuZ2V0KCd0eXBlJykgaXMgJ2NvbHVtbidcbiAgICAgIHhTdGFydCA9IGVsLmdldCgneFN0YXJ0JylcbiAgICAgIHhFbmQgPSBlbC5nZXQoJ3hFbmQnKVxuXG4gICAgICBsZWZ0cyA9IF8uZmlsdGVyIGNvbHMsIChlbCkgLT4gZWwuZ2V0KCd4RW5kJykgaXMgKHhTdGFydCAtIDEpXG4gICAgICBmb3IgbGVmdCBpbiBsZWZ0c1xuICAgICAgICBsZWZ0LnNldCAneEVuZCcsIHhTdGFydFxuXG4gICAgICByaWdodHMgPSBfLmZpbHRlciBjb2xzLCAoZWwpIC0+IGVsLmdldCgneFN0YXJ0JykgaXMgKHhFbmQgKyAxKVxuICAgICAgZm9yIHJpZ2h0IGluIHJpZ2h0c1xuICAgICAgICByaWdodC5zZXQgJ3hTdGFydCcsIHhFbmRcblxuICAgICAgaWYgbGVmdHMubGVuZ3RoID4gMCBvciByaWdodHMubGVuZ3RoID4gMFxuICAgICAgICBjb25zb2xlLmxvZyBcInJlbW92ZWQgZWxcIlxuICAgICAgICBlbC5jb2xsZWN0aW9uLnJlbW92ZSBlbFxuIiwiTW9kZWwgPSByZXF1aXJlKFwiYmFja2JvbmUtdGhpblwiKS5Nb2RlbFxuXG4jIHZpc2libGUgYXJlYXNcbm1vZHVsZS5leHBvcnRzID0gVmlzaWJpbGl0eSA9IE1vZGVsLmV4dGVuZFxuXG4gIGRlZmF1bHRzOlxuXG4gICAgIyBmb3IgdGhlIFN0YWdlXG4gICAgb3ZlcnZpZXdCb3g6IDMwXG4gICAgaGVhZGVyQm94OiAtMVxuICAgIGFsaWdubWVudEJvZHk6IDBcbiIsIk1vZGVsID0gcmVxdWlyZShcImJhY2tib25lLXRoaW5cIikuTW9kZWxcblxuIyB2aXNpYmxlIGFyZWFzXG5tb2R1bGUuZXhwb3J0cyA9IFZpc2liaWxpdHkgPSBNb2RlbC5leHRlbmRcblxuICBkZWZhdWx0czpcbiAgICBzZXF1ZW5jZXM6IHRydWVcbiAgICBtYXJrZXJzOiB0cnVlXG4gICAgbWV0YWNlbGw6IGZhbHNlXG4gICAgY29uc2VydjogdHJ1ZVxuICAgIG92ZXJ2aWV3Ym94OiBmYWxzZVxuXG4gICAgIyBhYm91dCB0aGUgbGFiZWxzXG4gICAgbGFiZWxzOiB0cnVlXG4gICAgbGFiZWxOYW1lOiB0cnVlXG4gICAgbGFiZWxJZDogdHJ1ZVxuICAgIGxhYmVsUGFydGl0aW9uOiBmYWxzZVxuICAgIGxhYmVsQ2hlY2tib3g6IGZhbHNlXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG4jIHBpeGVsIHByb3BlcnRpZXMgZm9yIHNvbWUgY29tcG9uZW50c1xubW9kdWxlLmV4cG9ydHMgPSBab29tZXIgPSBNb2RlbC5leHRlbmRcblxuICBjb25zdHJ1Y3RvcjogKGF0dHJpYnV0ZXMsb3B0aW9ucykgLT5cbiAgICBNb2RlbC5hcHBseSBALCBhcmd1bWVudHNcbiAgICBAZyA9IG9wdGlvbnMuZ1xuICAgIEBcblxuICBkZWZhdWx0czpcblxuICAgICMgZ2VuZXJhbFxuICAgIGFsaWdubWVudFdpZHRoOiBcImF1dG9cIlxuICAgIGFsaWdubWVudEhlaWdodDogMTk1XG4gICAgY29sdW1uV2lkdGg6IDE1XG4gICAgcm93SGVpZ2h0OiAxNVxuXG4gICAgIyBsYWJlbHNcbiAgICBsYWJlbFdpZHRoOiAxMDBcbiAgICBtZXRhV2lkdGg6IDEwMFxuICAgIHRleHRWaXNpYmxlOiB0cnVlXG4gICAgbGFiZWxJZExlbmd0aDogMzBcbiAgICBsYWJlbEZvbnRzaXplOiBcIjEzcHhcIlxuICAgIGxhYmVsTGluZUhlaWdodDogXCIxM3B4XCJcblxuICAgICMgbWFya2VyXG4gICAgbWFya2VyRm9udHNpemU6IFwiMTBweFwiXG4gICAgc3RlcFNpemU6IDFcbiAgICBtYXJrZXJTdGVwU2l6ZTogMlxuXG4gICAgIyBjYW52YXNcbiAgICByZXNpZHVlRm9udDogXCIxM3B4IG1vbm9cIlxuICAgIGNhbnZhc0V2ZW50U2NhbGU6IDFcblxuICAgIGJveFJlY3RIZWlnaHQ6IDVcbiAgICBib3hSZWN0V2lkdGg6IDVcblxuICAgICMgbWVudVxuICAgIG1lbnVGb250c2l6ZTogXCIyMHB4XCJcbiAgICBtZW51SXRlbUZvbnRzaXplOiBcIjE4cHhcIlxuICAgIG1lbnVJdGVtTGluZUhlaWdodDogXCIxOHB4XCJcbiAgICBtZW51TWFyZ2luTGVmdDogXCI1cHhcIlxuICAgIG1lbnVQYWRkaW5nOiBcIjNweCA1cHggM3B4IDVweFwiXG5cbiAgICAjIGludGVybmFsIHByb3BzXG4gICAgX2FsaWdubWVudFNjcm9sbExlZnQ6IDBcbiAgICBfYWxpZ25tZW50U2Nyb2xsVG9wOiAwXG5cbiAgIyBAcGFyYW0gbiBbaW50XSBtYXhMZW5ndGggb2YgYWxsIHNlcXNcbiAgZ2V0QWxpZ25tZW50V2lkdGg6IChuKSAtPlxuICAgIGlmIEBnZXQoXCJhbGlnbm1lbnRXaWR0aFwiKSBpcyBcImF1dG9cIlxuICAgICAgQGdldChcImNvbHVtbldpZHRoXCIpICogblxuICAgIGVsc2VcbiAgICAgIEBnZXQgXCJhbGlnbm1lbnRXaWR0aFwiXG5cbiAgIyBAcGFyYW0gbiBbaW50XSBudW1iZXIgb2YgcmVzaWR1ZXMgdG8gc2Nyb2xsIHRvIHRoZSByaWdodFxuICBzZXRMZWZ0T2Zmc2V0OiAobikgLT5cbiAgICB2YWwgPSAobiAtIDEpICogQGdldCgnY29sdW1uV2lkdGgnKVxuICAgIHZhbCA9IE1hdGgubWF4IDAsIHZhbFxuICAgIEBzZXQgXCJfYWxpZ25tZW50U2Nyb2xsTGVmdFwiLCB2YWxcblxuICAjIEBwYXJhbSBuIFtpbnRdIHJvdyB0aGF0IHNob3VsZCBiZSBvbiB0b3BcbiAgc2V0VG9wT2Zmc2V0OiAobikgLT5cbiAgICB2YWwgPSAobiAtIDEpICogQGdldCgncm93SGVpZ2h0JylcbiAgICB2YWwgPSBNYXRoLm1heCAwLCB2YWxcbiAgICBAc2V0IFwiX2FsaWdubWVudFNjcm9sbFRvcFwiLHZhbFxuXG4gICMgbGVuZ3RoIG9mIGFsbCBlbGVtZW50cyBsZWZ0IHRvIHRoZSBtYWluIHNlcXVlbmNlIGJvZHk6IGxhYmVscywgbWV0YWNlbGwsIC4uXG4gIGdldExhYmVsV2lkdGg6IC0+XG4gICAgIHBhZGRpbmdMZWZ0ID0gMFxuICAgICBwYWRkaW5nTGVmdCArPSBAZ2V0IFwibGFiZWxXaWR0aFwiIGlmIEBnLnZpcy5nZXQgXCJsYWJlbHNcIlxuICAgICBwYWRkaW5nTGVmdCArPSBAZ2V0IFwibWV0YVdpZHRoXCIgaWYgQGcudmlzLmdldCBcIm1ldGFjZWxsXCJcbiAgICAgcmV0dXJuIHBhZGRpbmdMZWZ0XG5cbiAgX2FkanVzdFdpZHRoOiAoZWwsIG1vZGVsKSAtPlxuICAgIGlmIGVsLnBhcmVudE5vZGU/IGFuZCBlbC5wYXJlbnROb2RlLm9mZnNldFdpZHRoIGlzbnQgMFxuICAgICAgcGFyZW50V2lkdGggPSBlbC5wYXJlbnROb2RlLm9mZnNldFdpZHRoXG4gICAgZWxzZVxuICAgICAgcGFyZW50V2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIC0gMzVcblxuICAgICMgVE9ETzogZGlydHkgaGFja1xuICAgIG1heFdpZHRoID0gcGFyZW50V2lkdGggLSBAZ2V0TGFiZWxXaWR0aCgpXG4gICAgY2FsY1dpZHRoID0gQGdldEFsaWdubWVudFdpZHRoKCBtb2RlbC5nZXRNYXhMZW5ndGgoKSAtIEBnLmNvbHVtbnMuZ2V0KCdoaWRkZW4nKS5sZW5ndGgpXG4gICAgdmFsID0gTWF0aC5taW4obWF4V2lkdGgsY2FsY1dpZHRoKVxuICAgICMgcm91bmQgdG8gYSB2YWxpZCBBQSBib3hcbiAgICB2YWwgPSBNYXRoLmZsb29yKCB2YWwgLyBAZ2V0KFwiY29sdW1uV2lkdGhcIikpICogQGdldChcImNvbHVtbldpZHRoXCIpXG4gICAgQHNldCBcImFsaWdubWVudFdpZHRoXCIsIHZhbFxuICAgICNlbC5zdHlsZS53aWR0aCA9IE1hdGgubWluIGNhbGNXaWR0aCwgbWF4V2lkdGhcblxuICAjIHVwZGF0ZXMgYm90aCBzY3JvbGwgcHJvcGVydGllcyAoaWYgbmVlZGVkKVxuICBfY2hlY2tTY3JvbGxpbmc6IChzY3JvbGxPYmosIG9wdHMpIC0+XG4gICAgeFNjcm9sbCA9IHNjcm9sbE9ialswXVxuICAgIHlTY3JvbGwgPSBzY3JvbGxPYmpbMV1cblxuICAgIEBzZXQgXCJfYWxpZ25tZW50U2Nyb2xsTGVmdFwiLCB4U2Nyb2xsLCBvcHRzXG4gICAgQHNldCBcIl9hbGlnbm1lbnRTY3JvbGxUb3BcIiwgeVNjcm9sbCwgb3B0c1xuIiwibW9kdWxlLmV4cG9ydHMubXNhID0gcmVxdWlyZShcIi4vbXNhXCIpXG5cbiMgbW9kZWxzXG5tb2R1bGUuZXhwb3J0cy5tb2RlbCA9IHJlcXVpcmUoXCIuL21vZGVsXCIpXG5cbiMgZXh0cmEgcGx1Z2lucywgZXh0ZW5zaW9uc1xubW9kdWxlLmV4cG9ydHMuYWxnbyA9IHJlcXVpcmUoXCIuL2FsZ29cIilcbm1vZHVsZS5leHBvcnRzLm1lbnUgPSByZXF1aXJlKFwiLi9tZW51XCIpXG5tb2R1bGUuZXhwb3J0cy51dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpXG5cbiMgcHJvYmFibHkgbmVlZGVkIG1vcmUgb2Z0ZW5cbm1vZHVsZS5leHBvcnRzLnNlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL2cvc2VsZWN0aW9uL1NlbGVjdGlvblwiKVxubW9kdWxlLmV4cG9ydHMudmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS12aWV3alwiKVxubW9kdWxlLmV4cG9ydHMuYm9uZVZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtY2hpbGRzXCIpXG5cbiMgY29udmVuaWVuY2Vcbm1vZHVsZS5leHBvcnRzLl8gPSByZXF1aXJlICd1bmRlcnNjb3JlJ1xubW9kdWxlLmV4cG9ydHMuJCA9IHJlcXVpcmUgJ2pib25lJ1xuXG5tb2R1bGUuZXhwb3J0cy52ZXJzaW9uID0gXCIwLjEuMFwiXG4iLCJib25lVmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS1jaGlsZHNcIilcblxuIyBtZW51IHZpZXdzXG5JbXBvcnRNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvSW1wb3J0TWVudVwiXG5GaWx0ZXJNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvRmlsdGVyTWVudVwiXG5TZWxlY3Rpb25NZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvU2VsZWN0aW9uTWVudVwiXG5WaXNNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvVmlzTWVudVwiXG5Db2xvck1lbnUgPSByZXF1aXJlIFwiLi92aWV3cy9Db2xvck1lbnVcIlxuT3JkZXJpbmdNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvT3JkZXJpbmdNZW51XCJcbkV4dHJhTWVudSA9IHJlcXVpcmUgXCIuL3ZpZXdzL0V4dHJhTWVudVwiXG5FeHBvcnRNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvRXhwb3J0TWVudVwiXG5IZWxwTWVudSA9IHJlcXVpcmUgXCIuL3ZpZXdzL0hlbHBNZW51XCJcblxuIyB0aGlzIHZlcnkgYmFzaWMgbWVudSBkZW1vbnN0cmF0ZXMgY2FsbHMgdG8gdGhlIE1TQSBjb21wb25lbnRcbm1vZHVsZS5leHBvcnRzID0gTWVudVZpZXcgPSBib25lVmlldy5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAbXNhID0gZGF0YS5tc2FcblxuICAgIEBhZGRWaWV3ICBcIjEwX2ltcG9ydFwiLCBuZXcgSW1wb3J0TWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjIwX2ZpbHRlclwiLCBuZXcgRmlsdGVyTWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjMwX3NlbGVjdGlvblwiLCBuZXcgU2VsZWN0aW9uTWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjQwX3Zpc1wiLCBuZXcgVmlzTWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjUwX2NvbG9yXCIsIG5ldyBDb2xvck1lbnUgbW9kZWw6IEBtc2Euc2VxcywgZzpAbXNhLmdcbiAgICBAYWRkVmlldyAgXCI2MF9vcmRlcmluZ1wiLCBuZXcgT3JkZXJpbmdNZW51IG1vZGVsOiBAbXNhLnNlcXMsIGc6QG1zYS5nXG4gICAgQGFkZFZpZXcgIFwiNzBfZXh0cmFcIiwgbmV3IEV4dHJhTWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjgwX2V4cG9ydFwiLCBuZXcgRXhwb3J0TWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZywgbXNhOkBtc2FcbiAgICBAYWRkVmlldyAgXCI5MF9oZWxwXCIsIG5ldyBIZWxwTWVudSAgZzpAbXNhLmdcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICAjIG90aGVyXG4gICAgQGVsLnNldEF0dHJpYnV0ZSBcImNsYXNzXCIsIFwiYmlvanNfbXNhX21lbnViYXJcIlxuICAgIEBlbC5hcHBlbmRDaGlsZCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKVxuIiwibW9kdWxlLmV4cG9ydHMuZGVmYXVsdG1lbnUgPSByZXF1aXJlKFwiLi9kZWZhdWx0bWVudVwiKVxubW9kdWxlLmV4cG9ydHMubWVudWJ1aWxkZXIgPSByZXF1aXJlKFwiLi9tZW51YnVpbGRlclwiKVxuIiwiQk1hdGggPSByZXF1aXJlIFwiLi4vdXRpbHMvYm1hdGhcIlxuamJvbmUgPSByZXF1aXJlIFwiamJvbmVcIlxudmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS12aWV3alwiKVxuXG4jamJvbmUuZm4uYWRkQ2xhc3MgPSAoY2xhc3NOYW1lKSAtPlxuIyAgZm9yIGkgaW4gWzAuLiBALmxlbmd0aCAtIDFdIGJ5IDFcbiMgICAgQFtpXS5jbGFzc0xpc3QuYWRkIGNsYXNzTmFtZVxuIyAgQFxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lbnVCdWlsZGVyID0gdmlldy5leHRlbmRcblxuICAgIHNldE5hbWU6IChAbmFtZSkgLT5cbiAgICAgIEBfbm9kZXMgPSAgW11cblxuICAgIGFkZE5vZGU6IChsYWJlbCwgY2FsbGJhY2ssIGRhdGEpIC0+XG4gICAgICBzdHlsZSA9IGRhdGEuc3R5bGUgaWYgZGF0YT9cbiAgICAgIEBfbm9kZXMgPSBbXSB1bmxlc3MgQF9ub2Rlcz9cbiAgICAgIEBfbm9kZXMucHVzaCB7bGFiZWw6IGxhYmVsLCBjYWxsYmFjazogY2FsbGJhY2ssIHN0eWxlOiBzdHlsZX1cblxuICAgIGJ1aWxkRE9NOiAtPlxuICAgICAgQF9idWlsZE1cbiAgICAgICAgbm9kZXM6IEBfbm9kZXNcbiAgICAgICAgbmFtZTogQG5hbWVcblxuICAgIF9idWlsZE06IChkYXRhKSAtPlxuICAgICAgbm9kZXMgPSBkYXRhLm5vZGVzXG4gICAgICBuYW1lID0gZGF0YS5uYW1lXG5cbiAgICAgIG1lbnUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwiZGl2XCJcbiAgICAgIG1lbnUuY2xhc3NOYW1lID0gXCJkcm9wZG93biBkcm9wZG93bi10aXBcIlxuICAgICAgbWVudS5pZCA9IFwiYWRyb3AtXCIgKyBCTWF0aC51bmlxdWVJZCgpXG4gICAgICBtZW51LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuXG4gICAgICBtZW51VWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwidWxcIlxuICAgICAgbWVudVVsLmNsYXNzTmFtZSA9IFwiZHJvcGRvd24tbWVudVwiXG5cbiAgICAgICMgZHJvcGRvd24gbWVudVxuICAgICAgZm9yIG5vZGUgaW4gbm9kZXNcbiAgICAgICAgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwibGlcIlxuXG4gICAgICAgIGxpLnRleHRDb250ZW50ID0gbm9kZS5sYWJlbFxuICAgICAgICBmb3Iga2V5LHN0eWxlIG9mIG5vZGUuc3R5bGVcbiAgICAgICAgICBsaS5zdHlsZVtrZXldID0gc3R5bGVcbiAgICAgICAgbGkuYWRkRXZlbnRMaXN0ZW5lciBcImNsaWNrXCIsIG5vZGUuY2FsbGJhY2tcbiAgICAgICAgaWYgQGc/XG4gICAgICAgICAgbGkuc3R5bGUubGluZUhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJtZW51SXRlbUxpbmVIZWlnaHRcIlxuXG4gICAgICAgIG1lbnVVbC5hcHBlbmRDaGlsZCBsaVxuXG4gICAgICBtZW51LmFwcGVuZENoaWxkIG1lbnVVbFxuXG4gICAgICBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAjIGRpcGxheSBpdFxuICAgICAgZGlzcGxheWVkQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBcImFcIlxuICAgICAgZGlzcGxheWVkQnV0dG9uLnRleHRDb250ZW50ID0gbmFtZVxuICAgICAgZGlzcGxheWVkQnV0dG9uLmNsYXNzTmFtZSA9IFwiYmlvanNfbXNhX21lbnViYXJfYWxpbmtcIlxuXG4gICAgICAjIHRpbnkgc3R5bGVcbiAgICAgIGlmIEBnP1xuICAgICAgICBtZW51VWwuc3R5bGUuZm9udFNpemUgPSBAZy56b29tZXIuZ2V0IFwibWVudUl0ZW1Gb250c2l6ZVwiXG4gICAgICAgIGRpc3BsYXllZEJ1dHRvbi5zdHlsZS5mb250U2l6ZSA9IEBnLnpvb21lci5nZXQgXCJtZW51Rm9udHNpemVcIlxuICAgICAgICBkaXNwbGF5ZWRCdXR0b24uc3R5bGUubWFyZ2luTGVmdCA9IEBnLnpvb21lci5nZXQgXCJtZW51TWFyZ2luTGVmdFwiXG4gICAgICAgIGRpc3BsYXllZEJ1dHRvbi5zdHlsZS5wYWRkaW5nID0gQGcuem9vbWVyLmdldCBcIm1lbnVQYWRkaW5nXCJcblxuICAgICAgamJvbmUoZGlzcGxheWVkQnV0dG9uKS5vbiBcImNsaWNrXCIsIChlKSA9PlxuICAgICAgICBAX3Nob3dNZW51IGUsbWVudSxkaXNwbGF5ZWRCdXR0b25cblxuICAgICAgICAjIHdhaXQgdW50aWwgZXZlbnQgaXMgYnViYmxlZCB0byB0aGUgdG9wXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0IC0+XG4gICAgICAgICAgamJvbmUoZG9jdW1lbnQuYm9keSkub25lIFwiY2xpY2tcIiwgKGUpIC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZyBcIm5leHQgY2xpY2tcIlxuICAgICAgICAgICAgbWVudS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICAgICAgLCA1XG5cblxuICAgICAgZnJhZy5hcHBlbmRDaGlsZCBtZW51XG4gICAgICBmcmFnLmFwcGVuZENoaWxkIGRpc3BsYXllZEJ1dHRvblxuICAgICAgcmV0dXJuICBmcmFnXG5cbiAgICBfc2hvd01lbnU6IChlLCBtZW51LCB0YXJnZXQpIC0+XG4gICAgICAjamJvbmUobWVudSkuYWRkQ2xhc3MgXCJkcm9wZG93bi1vcGVuXCJcbiAgICAgIG1lbnUuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIlxuICAgICAgbWVudS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIlxuXG4gICAgICByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBtZW51LnN0eWxlLmxlZnQgPSByZWN0LmxlZnQgKyBcInB4XCJcbiAgICAgIG1lbnUuc3R5bGUudG9wID0gKHJlY3QudG9wICsgdGFyZ2V0Lm9mZnNldEhlaWdodCkgKyBcInB4XCJcbiIsIk1lbnVCdWlsZGVyID0gcmVxdWlyZSBcIi4uL21lbnVidWlsZGVyXCJcbl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5kb20gPSByZXF1aXJlIFwiZG9tLWhlbHBlclwiXG5cbm1vZHVsZS5leHBvcnRzID0gQ29sb3JNZW51ID0gTWVudUJ1aWxkZXIuZXh0ZW5kXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAZWwuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICBAbGlzdGVuVG8gQGcuY29sb3JzY2hlbWUsIFwiY2hhbmdlXCIsIC0+XG4gICAgICBAcmVuZGVyKClcblxuICByZW5kZXI6IC0+XG4gICAgbWVudUNvbG9yID0gQHNldE5hbWUoXCJDb2xvciBzY2hlbWVcIilcblxuICAgIGNvbG9yc2NoZW1lcyA9IEBnZXRDb2xvcnNjaGVtZXMoKVxuICAgIGZvciBzY2hlbWUgaW4gY29sb3JzY2hlbWVzXG4gICAgICBAYWRkU2NoZW1lIG1lbnVDb2xvciwgc2NoZW1lXG5cbiAgICB0ZXh0ID0gXCJCYWNrZ3JvdW5kXCJcbiAgICBpZiBAZy5jb2xvcnNjaGVtZS5nZXQoXCJjb2xvckJhY2tncm91bmRcIilcbiAgICAgIHRleHQgPSBcIkhpZGUgXCIgKyB0ZXh0XG4gICAgZWxzZVxuICAgICAgdGV4dCA9IFwiU2hvdyBcIiArIHRleHRcblxuICAgIEBhZGROb2RlIHRleHQsID0+XG4gICAgICBAZy5jb2xvcnNjaGVtZS5zZXQgXCJjb2xvckJhY2tncm91bmRcIiwgIUBnLmNvbG9yc2NoZW1lLmdldChcImNvbG9yQmFja2dyb3VuZFwiKVxuXG4gICAgQGdyZXkgbWVudUNvbG9yXG5cbiAgICAjIFRPRE86IG1ha2UgbW9yZSBlZmZpY2llbnRcbiAgICBkb20ucmVtb3ZlQWxsQ2hpbGRzIEBlbFxuICAgIEBlbC5hcHBlbmRDaGlsZCBAYnVpbGRET00oKVxuICAgIEBcblxuICBhZGRTY2hlbWU6IChtZW51Q29sb3Isc2NoZW1lKSAtPlxuICAgIHN0eWxlID0ge31cbiAgICBjdXJyZW50ID0gQGcuY29sb3JzY2hlbWUuZ2V0KFwic2NoZW1lXCIpXG4gICAgaWYgY3VycmVudCBpcyBzY2hlbWUuaWRcbiAgICAgIHN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiIzc3RUQ4MFwiXG5cbiAgICBAYWRkTm9kZSBzY2hlbWUubmFtZSwgPT5cbiAgICAgIEBnLmNvbG9yc2NoZW1lLnNldCBcInNjaGVtZVwiLCBzY2hlbWUuaWRcbiAgICAsXG4gICAgICBzdHlsZTogc3R5bGVcblxuICBnZXRDb2xvcnNjaGVtZXM6IC0+XG4gICAgc2NoZW1lcyAgPSBbXVxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIlphcHBvXCIsIGlkOiBcInphcHBvXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJUYXlsb3JcIiwgaWQ6IFwidGF5bG9yXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJIeWRyb3Bob2JpY2l0eVwiLCBpZDogXCJoeWRyb1wiXG4gICAgc2NoZW1lcy5wdXNoIG5hbWU6IFwiTGVza1wiLCBpZDogXCJsZXNrXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJDaW5lbWFcIiwgaWQ6IFwiY2luZW1hXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJNQUVcIiwgaWQ6IFwibWFlXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJDbHVzdGFsXCIsIGlkOiBcImNsdXN0YWxcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIkNsdXN0YWwyXCIsIGlkOiBcImNsdXN0YWwyXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJUdXJuXCIsIGlkOiBcInR1cm5cIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIlN0cmFuZFwiLCBpZDogXCJzdHJhbmRcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIkJ1cmllZFwiLCBpZDogXCJidXJpZWRcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIkhlbGl4XCIsIGlkOiBcImhlbGl4XCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJOdWNsZW90aWRlXCIsIGlkOiBcIm51Y2xlb3RpZGVcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIlB1cmluZVwiLCBpZDogXCJwdXJpbmVcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIlBJRFwiLCBpZDogXCJwaWRcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIk5vIGNvbG9yXCIsIGlkOiBcImZvb1wiXG4gICAgc2NoZW1lc1xuXG4gIGdyZXk6IChtZW51Q29sb3IpIC0+XG4gICAgIyBncmV5cyBhbGwgbG93ZXJjYXNlIGxldHRlcnNcbiAgICBAYWRkTm9kZSBcIkdyZXlcIiwgPT5cbiAgICAgIEBnLmNvbG9yc2NoZW1lLnNldCBcInNob3dMb3dlckNhc2VcIiwgZmFsc2VcbiAgICAgIEBtb2RlbC5lYWNoIChzZXEpIC0+XG4gICAgICAgIHJlc2lkdWVzID0gc2VxLmdldCBcInNlcVwiXG4gICAgICAgIGdyZXkgPSBbXVxuICAgICAgICBfLmVhY2ggcmVzaWR1ZXMsIChlbCwgaW5kZXgpIC0+XG4gICAgICAgICAgaWYgZWwgaXMgZWwudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgZ3JleS5wdXNoIGluZGV4XG4gICAgICAgIHNlcS5zZXQgXCJncmV5XCIsIGdyZXlcblxuICAgIEBhZGROb2RlIFwiR3JleSBieSB0aHJlc2hvbGRcIiwgPT5cbiAgICAgIHRocmVzaG9sZCA9IHByb21wdCBcIkVudGVyIHRocmVzaG9sZCAoaW4gcGVyY2VudClcIiwgMjBcbiAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCAvIDEwMFxuICAgICAgbWF4TGVuID0gQG1vZGVsLmdldE1heExlbmd0aCgpXG4gICAgICBjb25zZXJ2ID0gQGcuY29sdW1ucy5nZXQoXCJjb25zZXJ2XCIpXG4gICAgICBncmV5ID0gW11cbiAgICAgIGZvciBpIGluIFswLi4gbWF4TGVuIC0gMV1cbiAgICAgICAgY29uc29sZS5sb2cgY29uc2VydltpXVxuICAgICAgICBpZiBjb25zZXJ2W2ldIDwgdGhyZXNob2xkXG4gICAgICAgICAgZ3JleS5wdXNoIGlcbiAgICAgIEBtb2RlbC5lYWNoIChzZXEpIC0+XG4gICAgICAgIHNlcS5zZXQgXCJncmV5XCIsIGdyZXlcblxuICAgIEBhZGROb2RlIFwiR3JleSBzZWxlY3Rpb25cIiwgPT5cbiAgICAgIG1heExlbiA9IEBtb2RlbC5nZXRNYXhMZW5ndGgoKVxuICAgICAgQG1vZGVsLmVhY2ggKHNlcSkgPT5cbiAgICAgICAgYmxvY2tzID0gQGcuc2VsY29sLmdldEJsb2Nrc0ZvclJvdyhzZXEuZ2V0KFwiaWRcIiksbWF4TGVuKVxuICAgICAgICBzZXEuc2V0IFwiZ3JleVwiLCBibG9ja3NcblxuICAgIEBhZGROb2RlIFwiUmVzZXQgZ3JleVwiLCA9PlxuICAgICAgQGcuY29sb3JzY2hlbWUuc2V0IFwic2hvd0xvd2VyQ2FzZVwiLCB0cnVlXG4gICAgICBAbW9kZWwuZWFjaCAoc2VxKSAtPlxuICAgICAgICBzZXEuc2V0IFwiZ3JleVwiLCBbXVxuIiwiTWVudUJ1aWxkZXIgPSByZXF1aXJlIFwiLi4vbWVudWJ1aWxkZXJcIlxuc2F2ZUFzID0gcmVxdWlyZSBcImJyb3dzZXItc2F2ZWFzXCJcbkZhc3RhRXhwb3J0ZXIgPSByZXF1aXJlKFwiYmlvanMtaW8tZmFzdGFcIikud3JpdGVyXG5fID0gcmVxdWlyZSBcInVuZGVyc2NvcmVcIlxuYmxvYlVSTCA9IHJlcXVpcmUgXCJibHVlaW1wX2NhbnZhc3RvYmxvYlwiXG5cbm1vZHVsZS5leHBvcnRzID0gRXhwb3J0TWVudSA9IE1lbnVCdWlsZGVyLmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQG1zYSA9IGRhdGEubXNhXG4gICAgQGVsLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG5cbiAgcmVuZGVyOiAtPlxuICAgIEBzZXROYW1lKFwiRXhwb3J0XCIpXG5cbiAgICBAYWRkTm9kZSBcIkV4cG9ydCBzZXF1ZW5jZXNcIiwgPT5cbiAgICAgICMgbGltaXQgYXQgYWJvdXQgMjU2a1xuICAgICAgdGV4dCA9IEZhc3RhRXhwb3J0ZXIuZXhwb3J0IEBtb2RlbC50b0pTT04oKVxuICAgICAgYmxvYiA9IG5ldyBCbG9iKFt0ZXh0XSwge3R5cGUgOiAndGV4dC9wbGFpbid9KVxuICAgICAgc2F2ZUFzIGJsb2IsIFwiYWxsLmZhc3RhXCJcblxuICAgIEBhZGROb2RlIFwiRXhwb3J0IHNlbGVjdGlvblwiLCA9PlxuICAgICAgc2VsZWN0aW9uID0gQGcuc2VsY29sLnBsdWNrIFwic2VxSWRcIlxuICAgICAgaWYgc2VsZWN0aW9uP1xuICAgICAgICAjIGZpbHRlciB0aG9zZSBzZXFpZHNcbiAgICAgICAgc2VsZWN0aW9uID0gQG1vZGVsLmZpbHRlciAoZWwpIC0+XG4gICAgICAgICAgXy5jb250YWlucyBzZWxlY3Rpb24sIGVsLmdldCBcImlkXCJcbiAgICAgICAgZm9yIGkgaW4gWzAuLiBzZWxlY3Rpb24ubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgICAgIHNlbGVjdGlvbltpXSA9IHNlbGVjdGlvbltpXS50b0pTT04oKVxuICAgICAgZWxzZVxuICAgICAgICBzZWxlY3Rpb24gPSBAbW9kZWwudG9KU09OKClcbiAgICAgICAgY29uc29sZS5sb2cgXCJubyBzZWxlY3Rpb24gZm91bmRcIlxuICAgICAgdGV4dCA9IEZhc3RhRXhwb3J0ZXIuZXhwb3J0IHNlbGVjdGlvblxuICAgICAgYmxvYiA9IG5ldyBCbG9iKFt0ZXh0XSwge3R5cGUgOiAndGV4dC9wbGFpbid9KVxuICAgICAgc2F2ZUFzIGJsb2IsIFwic2VsZWN0aW9uLmZhc3RhXCJcblxuICAgICMgVE9ETzogdXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtQ2FudmFzLXRvLUJsb2IvYmxvYi9tYXN0ZXIvanMvY2FudmFzLXRvLWJsb2IuanNcbiAgICBAYWRkTm9kZSBcIkV4cG9ydCBpbWFnZVwiLCA9PlxuICAgICAgIyBUT0RPOiB0aGlzIGlzIHZlcnkgdWdseVxuICAgICAgY2FudmFzID0gQG1zYS5nZXRWaWV3KCdzdGFnZScpLmdldFZpZXcoJ2JvZHknKS5nZXRWaWV3KCdzZXFibG9jaycpLmVsXG4gICAgICBpZiBjYW52YXM/XG4gICAgICAgIHVybCA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpXG4gICAgICAgIHNhdmVBcyBibG9iVVJMKHVybCksIFwiYmlvanMtbXNhLnBuZ1wiLCBcImltYWdlL3BuZ1wiXG5cbiAgICAgICMgYWRkIG9jdGV0LXN0cmVhbVxuICAgICAgI3VybCA9IHVybC5yZXBsYWNlKCAvLy8gIyBjcyBoZXJlZ2V4ZXNcbiAgICAgICMvXmRhdGFbOl1pbWFnZVxcLyhwbmd8anBnfGpwZWcpWztdL2lcbiAgICAgICMvLy8sIFwiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07XCIpXG5cbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG4iLCJNZW51QnVpbGRlciA9IHJlcXVpcmUgXCIuLi9tZW51YnVpbGRlclwiXG5jb25zZW51cyA9IHJlcXVpcmUgXCIuLi8uLi9hbGdvL0NvbnNlbnN1c0NhbGNcIlxuU2VxID0gcmVxdWlyZSBcIi4uLy4uL21vZGVsL1NlcXVlbmNlXCJcblxubW9kdWxlLmV4cG9ydHMgPSBFeHRyYU1lbnUgPSBNZW51QnVpbGRlci5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIkV4dHJhc1wiKVxuICAgIEBhZGROb2RlIFwiQWRkIGNvbnNlbnN1cyBzZXFcIiwgPT5cbiAgICAgIGNvbiA9IGNvbnNlbnVzKEBtb2RlbClcbiAgICAgIGNvbnNvbGUubG9nIGNvblxuICAgICAgc2VxID0gbmV3IFNlcVxuICAgICAgICBzZXE6IGNvblxuICAgICAgICBpZDogXCIwY1wiXG4gICAgICAgIG5hbWU6IFwiY29uc2VudXNcIlxuICAgICAgQG1vZGVsLmFkZCBzZXFcbiAgICAgIEBtb2RlbC5jb21wYXJhdG9yID0gKHNlcSkgLT5cbiAgICAgICAgc2VxLmdldCBcImlkXCJcbiAgICAgIEBtb2RlbC5zb3J0KClcbiAgICBAYWRkTm9kZSBcIkluY3JlYXNlIGZvbnQgc2l6ZVwiLCA9PlxuICAgICAgQGcuem9vbWVyLnNldCBcImNvbHVtbldpZHRoXCIsIEBnLnpvb21lci5nZXQoXCJjb2x1bW5XaWR0aFwiKSArIDJcbiAgICAgIEBnLnpvb21lci5zZXQgXCJsYWJlbFdpZHRoXCIsIEBnLnpvb21lci5nZXQoXCJjb2x1bW5XaWR0aFwiKSArIDVcbiAgICAgIEBnLnpvb21lci5zZXQgXCJyb3dIZWlnaHRcIiwgQGcuem9vbWVyLmdldChcInJvd0hlaWdodFwiKSArIDJcbiAgICAgIEBnLnpvb21lci5zZXQgXCJsYWJlbEZvbnRTaXplXCIsIEBnLnpvb21lci5nZXQoXCJsYWJlbEZvbnRTaXplXCIpICsgMlxuICAgIEBhZGROb2RlIFwiRGVjcmVhc2UgZm9udCBzaXplXCIsID0+XG4gICAgICBAZy56b29tZXIuc2V0IFwiY29sdW1uV2lkdGhcIiwgQGcuem9vbWVyLmdldChcImNvbHVtbldpZHRoXCIpIC0gMlxuICAgICAgQGcuem9vbWVyLnNldCBcInJvd0hlaWdodFwiLCBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpIC0gMlxuICAgICAgQGcuem9vbWVyLnNldCBcImxhYmVsRm9udFNpemVcIiwgQGcuem9vbWVyLmdldChcImxhYmVsRm9udFNpemVcIikgLSAyXG4gICAgICBpZiBAZy56b29tZXIuZ2V0KFwiY29sdW1uV2lkdGhcIikgPCA4XG4gICAgICAgIEBnLnpvb21lci5zZXQgXCJ0ZXh0VmlzaWJsZVwiLCBmYWxzZVxuXG4gICAgQGFkZE5vZGUgXCJCYXIgY2hhcnQgZXhwIHNjYWxpbmdcIiwgPT5cbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwic2NhbGluZ1wiLCBcImV4cFwiXG4gICAgQGFkZE5vZGUgXCJCYXIgY2hhcnQgbGluZWFyIHNjYWxpbmdcIiwgPT5cbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwic2NhbGluZ1wiLCBcImxpblwiXG4gICAgQGFkZE5vZGUgXCJCYXIgY2hhcnQgbG9nIHNjYWxpbmdcIiwgPT5cbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwic2NhbGluZ1wiLCBcImxvZ1wiXG5cbiAgICBAYWRkTm9kZSBcIk1pbmltaXplZCB3aWR0aFwiLCA9PlxuICAgICAgQGcuem9vbWVyLnNldCBcImFsaWdubWVudFdpZHRoXCIsIDYwMFxuICAgIEBhZGROb2RlIFwiTWluaW1pemVkIGhlaWdodFwiLCA9PlxuICAgICAgQGcuem9vbWVyLnNldCBcImFsaWdubWVudEhlaWdodFwiLCAxMjBcblxuICAgIEBhZGROb2RlIFwiSnVtcCB0byBhIGNvbHVtblwiLCA9PlxuICAgICAgb2Zmc2V0ID0gcHJvbXB0IFwiQ29sdW1uXCIsIFwiMjBcIlxuICAgICAgaWYgb2Zmc2V0IDwgMCBvciBvZmZzZXQgPiBAbW9kZWwuZ2V0TWF4TGVuZ3RoKCkgb3IgaXNOYU4ob2Zmc2V0KVxuICAgICAgICBhbGVydCBcImludmFsaWQgY29sdW1uXCJcbiAgICAgICAgcmV0dXJuXG4gICAgICBAZy56b29tZXIuc2V0TGVmdE9mZnNldChvZmZzZXQpXG5cbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG4iLCJNZW51QnVpbGRlciA9IHJlcXVpcmUgXCIuLi9tZW51YnVpbGRlclwiXG5fID0gcmVxdWlyZSBcInVuZGVyc2NvcmVcIlxuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbHRlck1lbnUgPSBNZW51QnVpbGRlci5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIkZpbHRlclwiKVxuICAgIEBhZGROb2RlIFwiSGlkZSBjb2x1bW5zIGJ5IHRocmVzaG9sZFwiLChlKSA9PlxuICAgICAgdGhyZXNob2xkID0gcHJvbXB0IFwiRW50ZXIgdGhyZXNob2xkIChpbiBwZXJjZW50KVwiLCAyMFxuICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkIC8gMTAwXG4gICAgICBtYXhMZW4gPSBAbW9kZWwuZ2V0TWF4TGVuZ3RoKClcbiAgICAgIGhpZGRlbiA9IFtdXG4gICAgICBjb25zZXJ2ID0gQGcuY29sdW1ucy5nZXQoXCJjb25zZXJ2XCIpXG4gICAgICBmb3IgaSBpbiBbMC4uIG1heExlbiAtIDFdXG4gICAgICAgIGlmIGNvbnNlcnZbaV0gPCB0aHJlc2hvbGRcbiAgICAgICAgICBoaWRkZW4ucHVzaCBpXG4gICAgICBAZy5jb2x1bW5zLnNldCBcImhpZGRlblwiLCBoaWRkZW5cblxuICAgIEBhZGROb2RlIFwiSGlkZSBjb2x1bW5zIGJ5IHNlbGVjdGlvblwiLCA9PlxuICAgICAgaGlkZGVuT2xkID0gQGcuY29sdW1ucy5nZXQgXCJoaWRkZW5cIlxuICAgICAgaGlkZGVuID0gaGlkZGVuT2xkLmNvbmNhdCBAZy5zZWxjb2wuZ2V0QWxsQ29sdW1uQmxvY2tzIG1heExlbjogQG1vZGVsLmdldE1heExlbmd0aCgpLCB3aXRoUG9zOiB0cnVlXG4gICAgICBAZy5zZWxjb2wucmVzZXQgW11cbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwiaGlkZGVuXCIsIGhpZGRlblxuXG4gICAgQGFkZE5vZGUgXCJIaWRlIGNvbHVtbnMgYnkgZ2Fwc1wiLCA9PlxuICAgICAgdGhyZXNob2xkID0gcHJvbXB0IFwiRW50ZXIgdGhyZXNob2xkIChpbiBwZXJjZW50KVwiLCAyMFxuICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkIC8gMTAwXG4gICAgICBtYXhMZW4gPSBAbW9kZWwuZ2V0TWF4TGVuZ3RoKClcbiAgICAgIGhpZGRlbiA9IFtdXG4gICAgICBmb3IgaSBpbiBbMC4uIG1heExlbiAtIDFdXG4gICAgICAgIGdhcHMgPSAwXG4gICAgICAgIHRvdGFsID0gMFxuICAgICAgICBAbW9kZWwuZWFjaCAoZWwpIC0+XG4gICAgICAgICAgZ2FwcysrIGlmIGVsLmdldCgnc2VxJylbaV0gaXMgXCItXCJcbiAgICAgICAgICB0b3RhbCsrXG4gICAgICAgIGdhcENvbnRlbnQgPSBnYXBzIC8gdG90YWxcbiAgICAgICAgaWYgZ2FwQ29udGVudCA+IHRocmVzaG9sZFxuICAgICAgICAgIGhpZGRlbi5wdXNoIGlcbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwiaGlkZGVuXCIsIGhpZGRlblxuXG4gICAgQGFkZE5vZGUgXCJIaWRlIHNlcXMgYnkgaWRlbnRpdHlcIiwgPT5cbiAgICAgIHRocmVzaG9sZCA9IHByb21wdCBcIkVudGVyIHRocmVzaG9sZCAoaW4gcGVyY2VudClcIiwgMjBcbiAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCAvIDEwMFxuICAgICAgQG1vZGVsLmVhY2ggKGVsKSAtPlxuICAgICAgICBpZiBlbC5nZXQoJ2lkZW50aXR5JykgPCB0aHJlc2hvbGRcbiAgICAgICAgICBlbC5zZXQoJ2hpZGRlbicsIHRydWUpXG5cbiAgICBAYWRkTm9kZSBcIkhpZGUgc2VxcyBieSBzZWxlY3Rpb25cIiwgPT5cbiAgICAgIGhpZGRlbiA9IEBnLnNlbGNvbC53aGVyZSB0eXBlOiBcInJvd1wiXG4gICAgICBpZHMgPSBfLm1hcCBoaWRkZW4sIChlbCkgLT4gZWwuZ2V0KCdzZXFJZCcpXG4gICAgICBAZy5zZWxjb2wucmVzZXQgW11cbiAgICAgIEBtb2RlbC5lYWNoIChlbCkgLT5cbiAgICAgICAgaWYgaWRzLmluZGV4T2YoZWwuZ2V0KCdpZCcpKSA+PSAwXG4gICAgICAgICAgZWwuc2V0KCdoaWRkZW4nLCB0cnVlKVxuXG4gICAgQGFkZE5vZGUgXCJIaWRlIHNlcXMgYnkgZ2Fwc1wiLCA9PlxuICAgICAgdGhyZXNob2xkID0gcHJvbXB0IFwiRW50ZXIgdGhyZXNob2xkIChpbiBwZXJjZW50KVwiLCA0MFxuICAgICAgQG1vZGVsLmVhY2ggKGVsLGkpIC0+XG4gICAgICAgIHNlcSA9IGVsLmdldCgnc2VxJylcbiAgICAgICAgZ2FwcyA9IF8ucmVkdWNlIHNlcSwgKChtZW1vLCBjKSAtPiBtZW1vKysgaWYgYyBpcyAnLSc7bWVtbyksMFxuICAgICAgICBjb25zb2xlLmxvZyBnYXBzXG4gICAgICAgIGlmIGdhcHMgPiAgdGhyZXNob2xkXG4gICAgICAgICAgZWwuc2V0KCdoaWRkZW4nLCB0cnVlKVxuXG4gICAgQGFkZE5vZGUgXCJSZXNldFwiLCA9PlxuICAgICAgQGcuY29sdW1ucy5zZXQgXCJoaWRkZW5cIiwgW11cbiAgICAgIEBtb2RlbC5lYWNoIChlbCkgLT5cbiAgICAgICAgaWYgZWwuZ2V0KCdoaWRkZW4nKVxuICAgICAgICAgIGVsLnNldCgnaGlkZGVuJywgZmFsc2UpXG5cbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG4iLCJNZW51QnVpbGRlciA9IHJlcXVpcmUgXCIuLi9tZW51YnVpbGRlclwiXG5cbm1vZHVsZS5leHBvcnRzID0gSGVscE1lbnUgPSBNZW51QnVpbGRlci5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIkhlbHBcIilcbiAgICBAYWRkTm9kZSBcIkFib3V0IHRoZSBwcm9qZWN0XCIsID0+XG4gICAgICB3aW5kb3cub3BlbiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbmlmeS9iaW9qcy12aXMtbXNhXCJcbiAgICBAYWRkTm9kZSBcIlJlcG9ydCBpc3N1ZXNcIiwgPT5cbiAgICAgIHdpbmRvdy5vcGVuIFwiaHR0cHM6Ly9naXRodWIuY29tL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2EvaXNzdWVzXCJcbiAgICBAYWRkTm9kZSBcIlVzZXIgbWFudWFsXCIsID0+XG4gICAgICB3aW5kb3cub3BlbiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3dpa2lcIlxuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuICAgIEBlbC5hcHBlbmRDaGlsZCBAYnVpbGRET00oKVxuICAgIEBcbiIsIkNsdXN0YWwgPSByZXF1aXJlIFwiYmlvanMtaW8tY2x1c3RhbFwiXG5GYXN0YVJlYWRlciA9IHJlcXVpcmUoXCJiaW9qcy1pby1mYXN0YVwiKS5wYXJzZVxuTWVudUJ1aWxkZXIgPSByZXF1aXJlIFwiLi4vbWVudWJ1aWxkZXJcIlxuY29yc1VSTCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9wcm94eVwiKS5jb3JzVVJMXG5cbm1vZHVsZS5leHBvcnRzID0gSW1wb3J0TWVudSA9IE1lbnVCdWlsZGVyLmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGVsLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG5cbiAgcmVuZGVyOiAtPlxuICAgIEBzZXROYW1lKFwiSW1wb3J0XCIpXG4gICAgQGFkZE5vZGUgXCJGQVNUQVwiLChlKSA9PlxuICAgICAgdXJsID0gcHJvbXB0IFwiVVJMXCIsIFwiL3Rlc3QvZHVtbXkvc2FtcGxlcy9wNTMuY2x1c3RhbG8uZmFzdGFcIlxuICAgICAgdXJsID0gY29yc1VSTCB1cmwsIEBnXG4gICAgICBGYXN0YVJlYWRlci5yZWFkIHVybCwgKHNlcXMpID0+XG4gICAgICAgICMgbWFzcyB1cGRhdGUgb24gem9vbWVyXG4gICAgICAgIHpvb21lciA9IEBnLnpvb21lci50b0pTT04oKVxuICAgICAgICAjem9vbWVyLnRleHRWaXNpYmxlID0gZmFsc2VcbiAgICAgICAgI3pvb21lci5jb2x1bW5XaWR0aCA9IDRcbiAgICAgICAgem9vbWVyLmxhYmVsV2lkdGggPSAyMDBcbiAgICAgICAgem9vbWVyLmJveFJlY3RIZWlnaHQgPSAyXG4gICAgICAgIHpvb21lci5ib3hSZWN0V2lkdGggPSAyXG4gICAgICAgIEBtb2RlbC5yZXNldCBbXVxuICAgICAgICBAZy56b29tZXIuc2V0IHpvb21lclxuICAgICAgICBAbW9kZWwucmVzZXQgc2Vxc1xuICAgICAgICBAZy5jb2x1bW5zLmNhbGNDb25zZXJ2YXRpb24gQG1vZGVsXG5cbiAgICBAYWRkTm9kZSBcIkNMVVNUQUxcIiwgPT5cbiAgICAgIHVybCA9IHByb21wdCBcIlVSTFwiLCBcIi90ZXN0L2R1bW15L3NhbXBsZXMvcDUzLmNsdXN0YWxvLmNsdXN0YWxcIlxuICAgICAgdXJsID0gY29yc1VSTCB1cmwsIEBnXG4gICAgICBDbHVzdGFsLnJlYWQgdXJsLCAoc2VxcykgPT5cbiAgICAgICAgem9vbWVyID0gQGcuem9vbWVyLnRvSlNPTigpXG4gICAgICAgICN6b29tZXIudGV4dFZpc2libGUgPSBmYWxzZVxuICAgICAgICAjem9vbWVyLmNvbHVtbldpZHRoID0gNFxuICAgICAgICB6b29tZXIubGFiZWxXaWR0aCA9IDIwMFxuICAgICAgICB6b29tZXIuYm94UmVjdEhlaWdodCA9IDJcbiAgICAgICAgem9vbWVyLmJveFJlY3RXaWR0aCA9IDJcbiAgICAgICAgQG1vZGVsLnJlc2V0IFtdXG4gICAgICAgIEBnLnpvb21lci5zZXQgem9vbWVyXG4gICAgICAgIEBtb2RlbC5yZXNldCBzZXFzXG4gICAgICAgIEBnLmNvbHVtbnMuY2FsY0NvbnNlcnZhdGlvbiBAbW9kZWxcblxuICAgIEBhZGROb2RlIFwiYWRkIHlvdXIgb3duIFBhcnNlclwiLCA9PlxuICAgICAgd2luZG93Lm9wZW4gXCJodHRwczovL2dpdGh1Yi5jb20vYmlvanMvYmlvanMyXCJcblxuICAgIEBlbC5hcHBlbmRDaGlsZCBAYnVpbGRET00oKVxuICAgIEBcbiIsIk1lbnVCdWlsZGVyID0gcmVxdWlyZSBcIi4uL21lbnVidWlsZGVyXCJcbmRvbSA9IHJlcXVpcmUgXCJkb20taGVscGVyXCJcbl8gPSByZXF1aXJlKCd1bmRlcnNjb3JlJylcblxubW9kdWxlLmV4cG9ydHMgPSBPcmRlcmluZ01lbnUgPSBNZW51QnVpbGRlci5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuICAgIEBvcmRlciA9IFwiSURcIlxuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuXG4gIHNldE9yZGVyOiAob3JkZXIpIC0+XG4gICAgQG9yZGVyID0gb3JkZXJcbiAgICBAcmVuZGVyKClcblxuICAjIFRPRE86IG1ha2UgbW9yZSBnZW5lcmljXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIk9yZGVyaW5nXCIpXG5cbiAgICBjb21wcyA9IEBnZXRDb21wYXJhdG9ycygpXG4gICAgZm9yIG0gaW4gY29tcHNcbiAgICAgIEBfYWRkTm9kZSBtXG5cbiAgICBlbCA9IEBidWlsZERPTSgpXG5cbiAgICAjIFRPRE86IG1ha2UgbW9yZSBlZmZpY2llbnRcbiAgICBkb20ucmVtb3ZlQWxsQ2hpbGRzIEBlbFxuICAgIEBlbC5hcHBlbmRDaGlsZCBlbFxuICAgIEBcblxuICBfYWRkTm9kZTogKG0pIC0+XG4gICAgdGV4dCA9IG0udGV4dFxuICAgIHN0eWxlID0ge31cbiAgICBpZiB0ZXh0IGlzIEBvcmRlclxuICAgICAgc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjNzdFRDgwXCJcbiAgICBAYWRkTm9kZSB0ZXh0LCA9PlxuICAgICAgbS5wcmVjb2RlKCkgaWYgbS5wcmVjb2RlP1xuICAgICAgQG1vZGVsLmNvbXBhcmF0b3IgPSBtLmNvbXBhcmF0b3JcbiAgICAgIEBtb2RlbC5zb3J0KClcbiAgICAgIEBzZXRPcmRlciBtLnRleHRcbiAgICAsXG4gICAgICBzdHlsZTogc3R5bGVcblxuICBnZXRDb21wYXJhdG9yczogLT5cbiAgICBtb2RlbHMgPSBbXVxuXG4gICAgbW9kZWxzLnB1c2ggdGV4dDogXCJJRFwiLCBjb21wYXJhdG9yOiBcImlkXCJcblxuICAgIG1vZGVscy5wdXNoIHRleHQ6IFwiSUQgRGVzY1wiLCBjb21wYXJhdG9yOiAoYSwgYikgLT5cbiAgICAgICAgLSBhLmdldChcImlkXCIpLmxvY2FsZUNvbXBhcmUoYi5nZXQoXCJpZFwiKSlcblxuICAgIG1vZGVscy5wdXNoIHRleHQ6IFwiTGFiZWxcIiwgY29tcGFyYXRvcjogXCJuYW1lXCJcblxuICAgIG1vZGVscy5wdXNoIHRleHQ6IFwiTGFiZWwgRGVzY1wiLCBjb21wYXJhdG9yOiAoYSwgYikgLT5cbiAgICAgICAgLSBhLmdldChcIm5hbWVcIikubG9jYWxlQ29tcGFyZShiLmdldChcIm5hbWVcIikpXG5cbiAgICBtb2RlbHMucHVzaCB0ZXh0OiBcIlNlcVwiLCBjb21wYXJhdG9yOiBcInNlcVwiXG5cbiAgICBtb2RlbHMucHVzaCB0ZXh0OiBcIlNlcSBEZXNjXCIsIGNvbXBhcmF0b3I6IChhLGIpIC0+XG4gICAgICAgIC0gYS5nZXQoXCJzZXFcIikubG9jYWxlQ29tcGFyZShiLmdldChcInNlcVwiKSlcblxuICAgIG1vZGVscy5wdXNoIHRleHQ6IFwiSWRlbnRpdHlcIiwgY29tcGFyYXRvcjogXCJpZGVudGl0eVwiXG5cbiAgICBtb2RlbHMucHVzaCB0ZXh0OiBcIklkZW50aXR5IERlc2NcIiwgY29tcGFyYXRvcjogKHNlcSkgLT5cbiAgICAgICAgLSBzZXEuZ2V0IFwiaWRlbnRpdHlcIlxuXG4gICAgbW9kZWxzLnB1c2ggdGV4dDogXCJQYXJ0aXRpb24gY29kZXNcIiwgY29tcGFyYXRvcjogXCJwYXJ0aXRpb25cIiwgcHJlY29kZTogPT5cbiAgICAgICMgc2V0IHBhcnRpdGlvbnMgcmFuZG9tXG4gICAgICBAZy52aXMuc2V0KCdsYWJlbFBhcnRpdGlvbicsIHRydWUpXG4gICAgICBAbW9kZWwuZWFjaCAoZWwpIC0+XG4gICAgICAgIGVsLnNldCgncGFydGl0aW9uJywgXy5yYW5kb20oMSwzKSlcblxuXG4gICAgcmV0dXJuIG1vZGVsc1xuIiwic2VsID0gcmVxdWlyZSBcIi4uLy4uL2cvc2VsZWN0aW9uL1NlbGVjdGlvblwiXG5cbk1lbnVCdWlsZGVyID0gcmVxdWlyZSBcIi4uL21lbnVidWlsZGVyXCJcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3Rpb25NZW51ID0gTWVudUJ1aWxkZXIuZXh0ZW5kXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAZWwuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcblxuICByZW5kZXI6IC0+XG4gICAgQHNldE5hbWUoXCJTZWxlY3Rpb25cIilcbiAgICBAYWRkTm9kZSBcIkZpbmQgTW90aWYgKHN1cHBvcnRzIFJlZ0V4KVwiLCA9PlxuICAgICAgc2VhcmNoID0gcHJvbXB0IFwieW91ciBzZWFyY2hcIiwgXCJEXCJcbiAgICAgICMgbWFya3MgYWxsIGhpdHNcbiAgICAgIHNlYXJjaCA9IG5ldyBSZWdFeHAgc2VhcmNoLCBcImdpXCJcbiAgICAgIHNlbGNvbCA9IEBnLnNlbGNvbFxuICAgICAgbmV3U2VsaSA9IFtdXG4gICAgICBsZWZ0ZXN0SW5kZXggPSBvcmlnSW5kZXggPSAxMDAwNDJcbiAgICAgIEBtb2RlbC5lYWNoIChzZXEpIC0+XG4gICAgICAgIHN0clNlcSA9IHNlcS5nZXQoXCJzZXFcIilcbiAgICAgICAgd2hpbGUgbWF0Y2ggPSBzZWFyY2guZXhlYyBzdHJTZXFcbiAgICAgICAgICBpbmRleCA9IG1hdGNoLmluZGV4XG4gICAgICAgICAgYXJncyA9IHt4U3RhcnQ6IGluZGV4LCB4RW5kOiBpbmRleCArIG1hdGNoWzBdLmxlbmd0aCAtIDEsIHNlcUlkOlxuICAgICAgICAgICAgc2VxLmdldChcImlkXCIpfVxuICAgICAgICAgIG5ld1NlbGkucHVzaCBuZXcgc2VsLnBvc3NlbChhcmdzKVxuICAgICAgICAgIGxlZnRlc3RJbmRleCA9IE1hdGgubWluIGluZGV4LCBsZWZ0ZXN0SW5kZXhcblxuICAgICAgaWYgbmV3U2VsaS5sZW5ndGggaXMgMFxuICAgICAgICBhbGVydCBcIm5vIHNlbGVjdGlvbiBmb3VuZFwiXG4gICAgICBzZWxjb2wucmVzZXQgbmV3U2VsaVxuXG4gICAgICAjIHNhZmV0eSBjaGVjayArIHVwZGF0ZSBvZmZzZXRcbiAgICAgIGxlZnRlc3RJbmRleCA9IDAgaWYgbGVmdGVzdEluZGV4IGlzIG9yaWdJbmRleFxuICAgICAgQGcuem9vbWVyLnNldExlZnRPZmZzZXQgbGVmdGVzdEluZGV4XG5cbiAgICBAYWRkTm9kZSBcIkludmVydCBjb2x1bW5zXCIsID0+XG4gICAgICBAZy5zZWxjb2wuaW52ZXJ0Q29sIFswLi5AbW9kZWwuZ2V0TWF4TGVuZ3RoKCldXG4gICAgQGFkZE5vZGUgXCJJbnZlcnQgcm93c1wiLCA9PlxuICAgICAgQGcuc2VsY29sLmludmVydFJvdyBAbW9kZWwucGx1Y2sgXCJpZFwiXG4gICAgQGFkZE5vZGUgXCJSZXNldFwiLCA9PlxuICAgICAgQGcuc2VsY29sLnJlc2V0KClcbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG4iLCJNZW51QnVpbGRlciA9IHJlcXVpcmUgXCIuLi9tZW51YnVpbGRlclwiXG5kb20gPSByZXF1aXJlIFwiZG9tLWhlbHBlclwiXG5cbm1vZHVsZS5leHBvcnRzID0gSW1wb3J0TWVudSA9IE1lbnVCdWlsZGVyLmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGVsLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG4gICAgQGxpc3RlblRvIEBnLnZpcywgXCJjaGFuZ2VcIiwgQHJlbmRlclxuXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIlZpcy4gZWxlbWVudHNcIilcblxuICAgIHZpc0VsZW1lbnRzID0gQGdldFZpc0VsZW1lbnRzKClcbiAgICBmb3IgdmlzRWwgaW4gdmlzRWxlbWVudHNcbiAgICAgIEBfYWRkVmlzRWwgdmlzRWxcblxuICAgICMgb3RoZXJcbiAgICBAYWRkTm9kZSBcIlJlc2V0XCIsID0+XG4gICAgICBAZy52aXMuc2V0IFwibGFiZWxzXCIsIHRydWVcbiAgICAgIEBnLnZpcy5zZXQgXCJzZXF1ZW5jZXNcIiwgdHJ1ZVxuICAgICAgQGcudmlzLnNldCBcIm1ldGFjZWxsXCIsIHRydWVcbiAgICAgIEBnLnZpcy5zZXQgXCJjb25zZXJ2XCIsIHRydWVcbiAgICAgIEBnLnZpcy5zZXQgXCJsYWJlbElkXCIsIHRydWVcbiAgICAgIEBnLnZpcy5zZXQgXCJsYWJlbE5hbWVcIiwgdHJ1ZVxuICAgICAgQGcudmlzLnNldCBcImxhYmVsQ2hlY2tib3hcIiwgZmFsc2VcblxuICAgIEBhZGROb2RlIFwiVG9nZ2xlIG1vdXNlb3ZlciBldmVudHNcIiwgPT5cbiAgICAgIEBnLmNvbmZpZy5zZXQgXCJyZWdpc3Rlck1vdXNlSG92ZXJcIiwgIUBnLmNvbmZpZy5nZXQgXCJyZWdpc3Rlck1vdXNlSG92ZXJcIlxuXG4gICAgIyBUT0RPOiBtYWtlIG1vcmUgZWZmaWNpZW50XG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG5cbiAgX2FkZFZpc0VsOiAodmlzRWwpIC0+XG4gICAgc3R5bGUgPSB7fVxuXG4gICAgaWYgQGcudmlzLmdldCB2aXNFbC5pZFxuICAgICAgcHJlID0gXCJIaWRlIFwiXG4gICAgICBzdHlsZS5jb2xvciA9IFwicmVkXCJcbiAgICBlbHNlXG4gICAgICBwcmUgPSBcIlNob3cgXCJcbiAgICAgIHN0eWxlLmNvbG9yID0gXCJncmVlblwiXG5cbiAgICBAYWRkTm9kZSAocHJlICsgdmlzRWwubmFtZSksID0+XG4gICAgICBAZy52aXMuc2V0IHZpc0VsLmlkLCAhIEBnLnZpcy5nZXQgdmlzRWwuaWRcbiAgICAsXG4gICAgICBzdHlsZTogc3R5bGVcblxuICBnZXRWaXNFbGVtZW50czogLT5cbiAgICB2aXMgPSBbXVxuICAgIHZpcy5wdXNoIG5hbWU6IFwiTWFya2Vyc1wiLCBpZDogXCJtYXJrZXJzXCJcbiAgICB2aXMucHVzaCBuYW1lOiBcIkxhYmVsc1wiLCBpZDogXCJsYWJlbHNcIlxuICAgIHZpcy5wdXNoIG5hbWU6IFwiU2VxdWVuY2VzXCIsIGlkOiBcInNlcXVlbmNlc1wiXG4gICAgdmlzLnB1c2ggbmFtZTogXCJNZXRhIGluZm9cIiwgaWQ6IFwibWV0YWNlbGxcIlxuICAgIHZpcy5wdXNoIG5hbWU6IFwiT3ZlcnZpZXdib3hcIiwgaWQ6IFwib3ZlcnZpZXdib3hcIlxuICAgIHZpcy5wdXNoIG5hbWU6IFwiY29uc2VydlwiLCBpZDogXCJjb25zZXJ2XCJcbiAgICB2aXMucHVzaCBuYW1lOiBcIkxhYmVsTmFtZVwiLCBpZDogXCJsYWJlbE5hbWVcIlxuICAgIHZpcy5wdXNoIG5hbWU6IFwiTGFiZWxJZFwiLCBpZDogXCJsYWJlbElkXCJcbiAgICB2aXMucHVzaCBuYW1lOiBcIkxhYmVsQ2hlY2tib3hcIiwgaWQ6IFwibGFiZWxDaGVja2JveFwiXG4gICAgcmV0dXJuIHZpc1xuIiwiRmVhdHVyZSA9IHJlcXVpcmUgXCIuL0ZlYXR1cmVcIlxuTW9kZWwgPSByZXF1aXJlKFwiYmFja2JvbmUtdGhpblwiKS5Nb2RlbFxuXG5tb2R1bGUuZXhwb3J0cyA9IEZlYXR1cmUgPSBNb2RlbC5leHRlbmRcblxuICBkZWZhdWx0czpcbiAgICB4U3RhcnQ6IC0xXG4gICAgeEVuZDogLTFcbiAgICBoZWlnaHQ6IC0xXG4gICAgdGV4dDogXCJcIlxuICAgIGZpbGxDb2xvcjogXCJyZWRcIlxuICAgIGZpbGxPcGFjaXR5OiAwLjVcbiAgICB0eXBlOiBcInJlY3RhbmdsZVwiXG4gICAgYm9yZGVyU2l6ZTogMVxuICAgIGJvcmRlckNvbG9yOiBcImJsYWNrXCJcbiAgICBib3JkZXJPcGFjaXR5OiAwLjVcbiAgICB2YWxpZGF0ZTogdHJ1ZVxuXG4gIHZhbGlkYXRlOiAtPlxuICAgIGlmIGlzTmFOIEBhdHRyaWJ1dGVzLnhTdGFydCBvciBpc05hTiBAYXR0cmlidXRlcy54RW5kXG4gICAgICBcImZlYXR1cmVzIG5lZWQgaW50ZWdlciBzdGFydCBhbmQgZW5kLlwiXG5cbiAgY29udGFpbnM6IChpbmRleCkgLT5cbiAgICByZXR1cm4gIEBhdHRyaWJ1dGVzLnhTdGFydCA8PSBpbmRleCAmJiBpbmRleCA8PSBAYXR0cmlidXRlcy54RW5kXG5cbiIsIkZlYXR1cmUgPSByZXF1aXJlIFwiLi9GZWF0dXJlXCJcbkNvbGxlY3Rpb24gPSByZXF1aXJlKFwiYmFja2JvbmUtdGhpblwiKS5Db2xsZWN0aW9uXG5fID0gcmVxdWlyZSBcInVuZGVyc2NvcmVcIlxuXG5tb2R1bGUuZXhwb3J0cyA9IEZlYXR1cmVDb2wgPSBDb2xsZWN0aW9uLmV4dGVuZFxuICBtb2RlbDogRmVhdHVyZVxuXG4gIGNvbnN0cnVjdG9yOiAtPlxuICAgIEBzdGFydE9uQ2FjaGUgPSBbXVxuICAgICMgaW52YWxpZGF0ZSBjYWNoZVxuICAgIEBvbiBcImFsbFwiLCAtPlxuICAgICAgQHN0YXJ0T25DYWNoZSA9IFtdXG4gICAgLCBAXG4gICAgQ29sbGVjdGlvbi5hcHBseSBALCBhcmd1bWVudHNcblxuICAjIHJldHVybnMgYWxsIGZlYXR1cmVzIHN0YXJ0aW5nIG9uIGluZGV4XG4gIHN0YXJ0T246IChpbmRleCkgLT5cbiAgICB1bmxlc3MgQHN0YXJ0T25DYWNoZVtpbmRleF0/XG4gICAgICBAc3RhcnRPbkNhY2hlW2luZGV4XSA9IEB3aGVyZSh7eFN0YXJ0OiBpbmRleH0pXG4gICAgcmV0dXJuIEBzdGFydE9uQ2FjaGVbaW5kZXhdXG5cbiAgY29udGFpbnM6IChpbmRleCkgLT5cbiAgICBAcmVkdWNlIChlbCxtZW1vKSAtPlxuICAgICAgbWVtbyB8fCBlbC5jb250YWlucyBpbmRleFxuICAgICwgZmFsc2VcblxuICAjIGdpdmVzIHRoZSBtaW5pbWFsIG5lZWRlZCBudW1iZXIgb2Ygcm93c1xuICAjIG5vdCBhIHZlcnkgZWZmaWNpZW50IGFsZ29yaXRobVxuICAjICh0aGVyZSBpcyBvbmUgaW4gTyhuKSApXG4gIGdldE1pblJvd3M6IC0+XG5cbiAgICBsZW4gPSBAbWF4IChlbCkgLT4gZWwuZ2V0IFwieEVuZFwiXG4gICAgcm93cyA9ICgwIGZvciB4IGluIFsxLi5sZW5dKVxuXG4gICAgQGVhY2ggKGVsKSAtPlxuICAgICAgZm9yIHggaW4gW2VsLmdldChcInhTdGFydFwiKS4uZmVhdHVyZS5nZXQoXCJ4RW5kXCIpXSBieSAxXG4gICAgICAgIHJvd3NbeF0rK1xuXG4gICAgXy5tYXggcm93c1xuIiwiU2VxdWVuY2UgPSByZXF1aXJlIFwiLi9TZXF1ZW5jZVwiXG5Db2xsZWN0aW9uID0gcmVxdWlyZShcImJhY2tib25lLXRoaW5cIikuQ29sbGVjdGlvblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlcU1hbmFnZXIgPSBDb2xsZWN0aW9uLmV4dGVuZFxuICBtb2RlbDogU2VxdWVuY2VcblxuICBjb25zdHJ1Y3RvcjogLT5cblxuICAgIENvbGxlY3Rpb24uYXBwbHkgQCwgYXJndW1lbnRzXG5cbiAgICAjIGludmFsaWRhdGUgY2FjaGVcbiAgICBAb24gXCJhbGxcIiwgLT5cbiAgICAgIEBsZW5ndGhDYWNoZSA9IG51bGxcbiAgICAsIEBcbiAgICBAbGVuZ3RoQ2FjaGUgPSBudWxsXG5cbiAgICBAXG5cbiAgIyBnaXZlcyB0aGUgbWF4IGxlbmd0aCBvZiBhbGwgc2VxdWVuY2VzXG4gICMgKGNhY2hlZClcbiAgZ2V0TWF4TGVuZ3RoOiAoKSAtPlxuICAgIHJldHVybiAwIGlmIEBtb2RlbHMubGVuZ3RoIGlzIDBcbiAgICBpZiBAbGVuZ3RoQ2FjaGUgaXMgbnVsbFxuICAgICAgQGxlbmd0aENhY2hlID0gQG1heCgoc2VxKSAtPiBzZXEuZ2V0KFwic2VxXCIpLmxlbmd0aCkuZ2V0KFwic2VxXCIpLmxlbmd0aFxuICAgIHJldHVybiBAbGVuZ3RoQ2FjaGVcblxuICAjIGdldHMgdGhlIHByZXZpb3VzIG1vZGVsXG4gICMgQHBhcmFtIGVuZGxlc3MgW2Jvb2xlYW5dIGZvciB0aGUgZmlyc3QgZWxlbWVudFxuICAjIHRydWU6IHJldHVybnMgdGhlIGxhc3QgZWxlbWVudCwgZmFsc2U6IHJldHVybnMgdW5kZWZpbmVkXG4gIHByZXY6IChtb2RlbCwgZW5kbGVzcykgLT5cbiAgICBpbmRleCA9IEBpbmRleE9mKG1vZGVsKSAtIDFcbiAgICBpbmRleCA9IEAubGVuZ3RoIC0gMSBpZiBpbmRleCA8IDAgYW5kIGVuZGxlc3NcbiAgICBAYXQoaW5kZXgpXG5cbiAgIyBnZXRzIHRoZSBuZXh0IG1vZGVsXG4gICMgQHBhcmFtIGVuZGxlc3MgW2Jvb2xlYW5dIGZvciB0aGUgbGFzdCBlbGVtZW50XG4gICMgdHJ1ZTogcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCwgZmFsc2U6IHJldHVybnMgdW5kZWZpbmVkXG4gIG5leHQ6IChtb2RlbCwgZW5kbGVzcykgLT5cbiAgICBpbmRleCA9IEBpbmRleE9mKG1vZGVsKSArIDFcbiAgICBpbmRleCA9IDAgaWYgaW5kZXggPT0gQC5sZW5ndGggYW5kIGVuZGxlc3NcbiAgICBAYXQoaW5kZXgpXG5cbiAgIyBAcmV0dXJucyBuIFtpbnRdIG51bWJlciBvZiBoaWRkZW4gY29sdW1ucyB1bnRpbCBuXG4gIGNhbGNIaWRkZW5TZXFzOiAobikgLT5cbiAgICBuTmV3ID0gblxuICAgIGZvciBpIGluIFswLi5uTmV3XVxuICAgICAgaWYgQGF0KGkpLmdldChcImhpZGRlblwiKVxuICAgICAgICBuTmV3KytcbiAgICBuTmV3IC0gblxuXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5GZWF0dXJlQ29sID0gcmVxdWlyZSBcIi4vRmVhdHVyZUNvbFwiXG5cbm1vZHVsZS5leHBvcnRzID0gU2VxdWVuY2UgPSBNb2RlbC5leHRlbmRcblxuICBkZWZhdWx0czpcbiAgICBuYW1lOiBcIlwiXG4gICAgaWQ6IFwiXCJcbiAgICBzZXE6IFwiXCJcblxuICBpbml0aWFsaXplOiAtPlxuICAgICMgcmVzaWR1ZXMgd2l0aG91dCBjb2xvclxuICAgIEAuc2V0IFwiZ3JleVwiLCBbXVxuICAgIEAuc2V0IFwiZmVhdHVyZXNcIiwgbmV3IEZlYXR1cmVDb2woKVxuIiwibW9kdWxlLmV4cG9ydHMuc2VxID0gcmVxdWlyZSBcIi4vU2VxdWVuY2VcIlxubW9kdWxlLmV4cG9ydHMuc2VxY29sID0gcmVxdWlyZSBcIi4vU2VxQ29sbGVjdGlvblwiXG5tb2R1bGUuZXhwb3J0cy5mZWF0dXJlID0gcmVxdWlyZSBcIi4vRmVhdHVyZVwiXG5tb2R1bGUuZXhwb3J0cy5mZWF0dXJlY29sID0gcmVxdWlyZSBcIi4vRmVhdHVyZUNvbFwiXG4iLCIjIG1vZGVsc1xuU2VxQ29sbGVjdGlvbiA9IHJlcXVpcmUgXCIuL21vZGVsL1NlcUNvbGxlY3Rpb25cIlxuXG4jIGdsb2JhbHNcbkNvbG9yYXRvciA9IHJlcXVpcmUgXCIuL2cvY29sb3JhdG9yXCJcbkNvbnNlbnN1cyA9IHJlcXVpcmUgXCIuL2cvY29uc2Vuc3VzXCJcbkNvbHVtbnMgPSByZXF1aXJlIFwiLi9nL2NvbHVtbnNcIlxuQ29uZmlnID0gcmVxdWlyZSBcIi4vZy9jb25maWdcIlxuU2VsQ29sID0gcmVxdWlyZSBcIi4vZy9zZWxlY3Rpb24vU2VsZWN0aW9uQ29sXCJcblZpc2liaWxpdHkgPSByZXF1aXJlIFwiLi9nL3Zpc2liaWxpdHlcIlxuVmlzT3JkZXJpbmcgPSByZXF1aXJlIFwiLi9nL3Zpc09yZGVyaW5nXCJcblpvb21lciA9IHJlcXVpcmUgXCIuL2cvem9vbWVyXCJcblxuIyBNViBmcm9tIGJhY2tib25lXG5ib25lVmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS1jaGlsZHNcIilcbkV2ZW50aGFuZGxlciA9IHJlcXVpcmUgXCJiaW9qcy1ldmVudHNcIlxuXG4jIE1TQSB2aWV3c1xuU3RhZ2UgPSByZXF1aXJlIFwiLi92aWV3cy9TdGFnZVwiXG5cbiMgb3B0cyBpcyBhIGRpY3Rpb25hcnkgY29uc2lzdGluZyBvZlxuIyBAcGFyYW0gZWwgW1N0cmluZ10gaWQgb3IgcmVmZXJlbmNlIHRvIGEgRE9NIGVsZW1lbnRcbiMgQHBhcmFtIHNlcXMgW1NlcUFycmF5XSBBcnJheSBvZiBzZXF1ZW5jZXMgZm9yIGluaXRsaXphdGlvblxuIyBAcGFyYW0gY29uZiBbRGljdF0gdXNlciBjb25maWdcbiMgQHBhcmFtIHZpcyBbRGljdF0gY29uZmlnIG9mIHZpc2libGUgdmlld3NcbiMgQHBhcmFtIHpvb21lciBbRGljdF0gZGlzcGxheSBzZXR0aW5ncyBsaWtlIGNvbHVtbldpZHRoXG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuXG4gICAgIyBjaGVjayBmb3IgZGVmYXVsdCBhcnJheXNcbiAgICBkYXRhLmNvbHVtbnMgPSB7fSB1bmxlc3MgZGF0YS5jb2x1bW5zP1xuICAgIGRhdGEuY29uZiA9IHt9IHVubGVzcyBkYXRhLmNvbmY/XG4gICAgZGF0YS52aXMgPSB7fSB1bmxlc3MgZGF0YS52aXM/XG4gICAgZGF0YS52aXNvcmRlciA9IHt9IHVubGVzcyBkYXRhLnZpc29yZGVyID9cbiAgICBkYXRhLnpvb21lciA9IHt9IHVubGVzcyBkYXRhLnpvb21lcj9cblxuICAgICMgZyBpcyBvdXIgZ2xvYmFsIE1lZGlhdG9yXG4gICAgQGcgPSBFdmVudGhhbmRsZXIubWl4aW4ge31cblxuICAgIGlmIGRhdGEuc2VxcyBpcyB1bmRlZmluZWQgb3IgZGF0YS5zZXFzLmxlbmd0aCBpcyAwXG4gICAgICBjb25zb2xlLmxvZyBcIndhcm5pbmcuIGVtcHR5IHNlcXMuXCJcblxuICAgICMgbG9hZCBzZXFzIGFuZCBhZGQgc3Vidmlld3NcbiAgICBAc2VxcyA9IG5ldyBTZXFDb2xsZWN0aW9uIGRhdGEuc2Vxc1xuXG4gICAgIyBwb3B1bGF0ZSBpdCBhbmQgaW5pdCB0aGUgZ2xvYmFsIG1vZGVsc1xuICAgIEBnLmNvbmZpZyA9IG5ldyBDb25maWcgZGF0YS5jb25mXG4gICAgQGcuY29uc2Vuc3VzID0gbmV3IENvbnNlbnN1cygpXG4gICAgQGcuY29sdW1ucyA9IG5ldyBDb2x1bW5zIGRhdGEuY29sdW1ucyAgIyBmb3IgYWN0aW9uIG9uIHRoZSBjb2x1bW5zIGxpa2UgaGlkaW5nXG4gICAgQGcuY29sb3JzY2hlbWUgPSBuZXcgQ29sb3JhdG9yKClcbiAgICBAZy5zZWxjb2wgPSBuZXcgU2VsQ29sIFtdLHtnOkBnfVxuICAgIEBnLnZpcyA9IG5ldyBWaXNpYmlsaXR5IGRhdGEudmlzXG4gICAgQGcudmlzb3JkZXIgPSBuZXcgVmlzT3JkZXJpbmcgZGF0YS52aXNvcmRlclxuICAgIEBnLnpvb21lciA9IG5ldyBab29tZXIgZGF0YS56b29tZXIse2c6QGd9XG5cbiAgICBAYWRkVmlldyBcInN0YWdlXCIsbmV3IFN0YWdlIHttb2RlbDogQHNlcXMsIGc6IEBnfVxuICAgIEBlbC5zZXRBdHRyaWJ1dGUgXCJjbGFzc1wiLCBcImJpb2pzX21zYV9kaXZcIlxuXG4gICAgaWYgQGcuY29uZmlnLmdldChcImV2ZW50QnVzXCIpIGlzIHRydWVcbiAgICAgIEBzdGFydEV2ZW50QnVzKClcblxuICBzdGFydEV2ZW50QnVzOiAtPlxuICAgIGJ1c09ianMgPSBbXCJjb25maWdcIiwgXCJjb25zZW5zdXNcIiwgXCJjb2x1bW5zXCIsIFwiY29sb3JzY2hlbWVcIiwgXCJzZWxjb2xcIlxuICAgICxcInZpc1wiLCBcInZpc29yZGVyXCIsIFwiem9vbWVyXCJdXG4gICAgZm9yIGtleSBpbiBidXNPYmpzXG4gICAgICBAX3Byb3h5VG9HIGtleVxuXG4gIF9wcm94eVRvRzogKGtleSkgLT5cbiAgICBAbGlzdGVuVG8gQGdba2V5XSwgXCJhbGxcIiwobmFtZSxwcmV2LG5vdykgLT5cbiAgICAgICMgc3VwcHJlc3MgZHVwbGljYXRlIGV2ZW50c1xuICAgICAgcmV0dXJuIGlmIG5hbWUgaXMgXCJjaGFuZ2VcIlxuICAgICAgIyBiYWNrYm9uZSB1c2VzIHRoZSBzZWNvbmQgYXJndW1lbnQgZm9yIHRoZSBuZXh0IHZhbHVlIC0+IHN3YXBcbiAgICAgIEBnLnRyaWdnZXIoa2V5ICsgXCI6XCIgKyBuYW1lLG5vdylcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICBAZy52aXMuc2V0IFwibG9hZGVkXCIsIHRydWVcbiAgICBAXG4iLCJtb2R1bGUuZXhwb3J0cyA9XG4gICMgbWF0aCB1dGlsaXRpZXNcbiAgY2xhc3MgQk1hdGhcbiAgICBAcmFuZG9tSW50OiAobG93ZXIsIHVwcGVyKSAtPlxuICAgICAgIyBDYWxsZWQgd2l0aCBvbmUgYXJndW1lbnRcbiAgICAgIFtsb3dlciwgdXBwZXJdID0gWzAsIGxvd2VyXSAgICAgdW5sZXNzIHVwcGVyP1xuICAgICAgIyBMb3dlciBtdXN0IGJlIGxlc3MgdGhlbiB1cHBlclxuICAgICAgW2xvd2VyLCB1cHBlcl0gPSBbdXBwZXIsIGxvd2VyXSBpZiBsb3dlciA+IHVwcGVyXG4gICAgICAjIExhc3Qgc3RhdGVtZW50IGlzIGEgcmV0dXJuIHZhbHVlXG4gICAgICBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAodXBwZXIgLSBsb3dlciArIDEpICsgbG93ZXIpXG5cbiAgICAjIEByZXR1cm4gW0ludGVnZXJdIHJhbmRvbSBpZFxuICAgIEB1bmlxdWVJZDogKGxlbmd0aCA9IDgpIC0+XG4gICAgICBpZCA9IFwiXCJcbiAgICAgIGlkICs9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyKSB3aGlsZSBpZC5sZW5ndGggPCBsZW5ndGhcbiAgICAgIGlkLnN1YnN0ciAwLCBsZW5ndGhcblxuICAgICMgUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIChpbmNsdXNpdmUpIGFuZCBtYXggKGluY2x1c2l2ZSlcbiAgICBAZ2V0UmFuZG9tSW50OiAobWluLCBtYXgpIC0+XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pblxuIiwibW9kdWxlLmV4cG9ydHMuYm1hdGggPSByZXF1aXJlKFwiLi9ibWF0aFwiKVxubW9kdWxlLmV4cG9ydHMucHJveHkgPSByZXF1aXJlKFwiLi9wcm94eVwiKVxubW9kdWxlLmV4cG9ydHMuc2VxZ2VuID0gcmVxdWlyZShcIi4vc2VxZ2VuXCIpXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHByb3h5ID1cblxuICAgIGNvcnNVUkw6ICh1cmwsIEBnKSA9PlxuICAgICAgIyBkbyBub3QgZmlsdGVyIG9uIGxvY2FsaG9zdFxuICAgICAgcmV0dXJuIHVybCBpZiBkb2N1bWVudC5VUkwuaW5kZXhPZignbG9jYWxob3N0JykgPj0gMCBhbmQgdXJsWzBdIGlzIFwiL1wiXG5cbiAgICAgICMgcmVtb3ZlIHd3dyArIGh0dHBcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlIFwid3d3XFwuXCIsIFwiXCJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlIFwiaHR0cDovL1wiLCBcIlwiXG5cbiAgICAgICMgcHJlcGVuZCBwcm94eVxuICAgICAgdXJsID0gQGcuY29uZmlnLmdldCgnaW1wb3J0UHJveHknKSArIHVybFxuICAgICAgdXJsXG4iLCJTZXF1ZW5jZSA9IHJlcXVpcmUoXCJiaW9qcy1tb2RlbFwiKS5zZXFcbkJNYXRoID0gcmVxdWlyZSBcIi4vYm1hdGhcIlxuXG5zZXFnZW4gPSBtb2R1bGUuZXhwb3J0cyA9XG4gIF9nZW5lcmF0ZVNlcXVlbmNlOiAobGVuKSAtPlxuICAgIHRleHQgPSBcIlwiXG4gICAgcG9zc2libGUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIlxuXG4gICAgZm9yIGkgaW4gWzAuLmxlbiAtIDFdIGJ5IDFcbiAgICAgIHRleHQgKz0gcG9zc2libGUuY2hhckF0IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHBvc3NpYmxlLmxlbmd0aClcbiAgICByZXR1cm4gdGV4dFxuXG4gICMgZ2VuZXJhdGVzIGEgZHVtbXkgc2VxdWVuY2VzXG4gICMgQHBhcmFtIGxlbiBbaW50XSBudW1iZXIgb2YgZ2VuZXJhdGVkIHNlcXVlbmNlc1xuICAjIEBwYXJhbSBzZXFMZW4gW2ludF0gbGVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzXG4gIGdldER1bW15U2VxdWVuY2VzOiAobGVuLCBzZXFMZW4pIC0+XG4gICAgc2VxcyA9IFtdXG4gICAgbGVuID0gQk1hdGguZ2V0UmFuZG9tSW50IDMsNSB1bmxlc3MgbGVuP1xuICAgIHNlcUxlbiA9IEJNYXRoLmdldFJhbmRvbUludCA1MCwyMDAgdW5sZXNzIHNlcUxlbj9cblxuICAgIGZvciBpIGluIFsxLi5sZW5dIGJ5IDFcbiAgICAgIHNlcXMucHVzaCBuZXcgU2VxdWVuY2Uoc2VxZ2VuLl9nZW5lcmF0ZVNlcXVlbmNlKHNlcUxlbiksIFwic2VxXCIgKyBpLFxuICAgICAgXCJyXCIgKyBpKVxuICAgIHJldHVybiBzZXFzXG4iLCIjIG1pbmkgc3ZnIGhlbHBlclxuXG5zdmducyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuXG5zZXRBdHRyID0gKG9iaixvcHRzKSAtPlxuICBmb3IgbmFtZSwgdmFsdWUgb2Ygb3B0c1xuICAgIG9iai5zZXRBdHRyaWJ1dGVOUyBudWxsLCBuYW1lLCB2YWx1ZVxuICBvYmpcblxuQmFzZSA9IChvcHRzKSAtPlxuICBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgc3ZnbnMsICdzdmcnXG4gIHN2Zy5zZXRBdHRyaWJ1dGUgXCJ3aWR0aFwiLCBvcHRzLndpZHRoXG4gIHN2Zy5zZXRBdHRyaWJ1dGUgXCJoZWlnaHRcIiwgb3B0cy5oZWlnaHRcbiAgc3ZnXG5cblJlY3QgPSAob3B0cykgLT5cbiAgcmVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyBzdmducywgJ3JlY3QnXG4gIHNldEF0dHIgcmVjdCxvcHRzXG5cbkxpbmUgPSAob3B0cykgLT5cbiAgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyBzdmducywgJ2xpbmUnXG4gIHNldEF0dHIgbGluZSxvcHRzXG5cblBvbHlnb24gPSAob3B0cykgLT5cbiAgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyBzdmducywgJ3BvbHlnb24nXG4gIHNldEF0dHIgbGluZSxvcHRzXG5cbm1vZHVsZS5leHBvcnRzLnJlY3QgPSBSZWN0XG5tb2R1bGUuZXhwb3J0cy5saW5lID0gTGluZVxubW9kdWxlLmV4cG9ydHMucG9seWdvbiA9IFBvbHlnb25cbm1vZHVsZS5leHBvcnRzLmJhc2UgPSBCYXNlXG4iLCJib25lVmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS1jaGlsZHNcIilcblNlcUJsb2NrID0gcmVxdWlyZSBcIi4vQ2FudmFzU2VxQmxvY2tcIlxuTGFiZWxCbG9jayA9IHJlcXVpcmUgXCIuL2xhYmVscy9MYWJlbEJsb2NrXCJcblxubW9kdWxlLmV4cG9ydHMgPSBib25lVmlldy5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuXG4gICAgaWYgdHJ1ZVxuICAgICAgbGFiZWxibG9jayA9IG5ldyBMYWJlbEJsb2NrIHttb2RlbDogQG1vZGVsLCBnOiBAZ31cbiAgICAgIGxhYmVsYmxvY2sub3JkZXJpbmcgPSAtMVxuICAgICAgQGFkZFZpZXcgXCJsYWJlbGJsb2NrXCIsbGFiZWxibG9ja1xuXG4gICAgaWYgQGcudmlzLmdldCBcInNlcXVlbmNlc1wiXG4gICAgICBzZXFibG9jayA9IG5ldyBTZXFCbG9jayB7bW9kZWw6IEBtb2RlbCwgZzogQGd9XG4gICAgICBzZXFibG9jay5vcmRlcmluZyA9IDBcbiAgICAgIEBhZGRWaWV3IFwic2VxYmxvY2tcIixzZXFibG9ja1xuXG4gICAgQGxpc3RlblRvIEBnLnpvb21lciwgXCJjaGFuZ2U6YWxpZ25tZW50SGVpZ2h0XCIsIEBhZGp1c3RIZWlnaHRcbiAgICBAbGlzdGVuVG8gQGcuY29sdW1ucywgXCJjaGFuZ2U6aGlkZGVuXCIsIEBhZGp1c3RIZWlnaHRcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICBAZWwuY2xhc3NOYW1lID0gXCJiaW9qc19tc2FfYWxib2R5XCJcbiAgICBAZWwuc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCJcbiAgICBAYWRqdXN0SGVpZ2h0KClcbiAgICBAXG5cbiAgYWRqdXN0SGVpZ2h0OiAtPlxuICAgIGlmIEBnLnpvb21lci5nZXQoXCJhbGlnbm1lbnRIZWlnaHRcIikgaXMgXCJhdXRvXCJcbiAgICAgICMgVE9ETzogZml4IHRoZSBtYWdpYyA1XG4gICAgICBAZWwuc3R5bGUuaGVpZ2h0ID0gKEBnLnpvb21lci5nZXQoXCJyb3dIZWlnaHRcIikgKiBAbW9kZWwubGVuZ3RoKSArIDVcbiAgICBlbHNlXG4gICAgICBAZWwuc3R5bGUuaGVpZ2h0ID0gQGcuem9vbWVyLmdldCBcImFsaWdubWVudEhlaWdodFwiXG5cbiAgICAjIFRPRE86IDE1IGlzIHRoZSB3aWR0aCBvZiB0aGUgc2Nyb2xsYmFyXG4gICAgQGVsLnN0eWxlLndpZHRoID0gQGdldFdpZHRoKCkgKyAxNVxuXG4gIGdldFdpZHRoOiAtPlxuICAgIHdpZHRoID0gMFxuICAgIGlmIEBnLnZpcy5nZXQgXCJsYWJlbHNcIlxuICAgICAgd2lkdGggKz0gQGcuem9vbWVyLmdldCBcImxhYmVsV2lkdGhcIlxuICAgIGlmIEBnLnZpcy5nZXQgXCJtZXRhY2VsbFwiXG4gICAgICB3aWR0aCArPSBAZy56b29tZXIuZ2V0IFwibWV0YVdpZHRoXCJcbiAgICBpZiBAZy52aXMuZ2V0IFwic2VxdWVuY2VzXCJcbiAgICAgIHdpZHRoICs9IEBnLnpvb21lci5nZXQgXCJhbGlnbm1lbnRXaWR0aFwiXG4gICAgd2lkdGhcbiIsIkV2ZW50cyA9IHJlcXVpcmUoXCJiaW9qcy1ldmVudHNcIilcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBDYW52YXNDaGFyQ2FjaGVcblxuICBjb25zdHJ1Y3RvcjogKEBnKSAtPlxuICAgIEBjYWNoZSA9IHt9XG4gICAgQGNhY2hlSGVpZ2h0ID0gMFxuICAgIEBjYWNoZVdpZHRoID0gMFxuXG4gICMgcmV0dXJucyBhIGNhY2hlZCBjYW52YXNcbiAgZ2V0Rm9udFRpbGU6IChsZXR0ZXIsIHdpZHRoLCBoZWlnaHQpIC0+XG4gICAgIyB2YWxpZGF0ZSBjYWNoZVxuICAgIGlmIHdpZHRoIGlzbnQgQGNhY2hlV2lkdGggb3IgaGVpZ2h0IGlzbnQgQGNhY2hlSGVpZ2h0XG4gICAgICBAY2FjaGVIZWlnaHQgPSBoZWlnaHRcbiAgICAgIEBjYWNoZVdpZHRoID0gd2lkdGhcbiAgICAgIEBjYWNoZSA9IHt9XG5cbiAgICBpZiBAY2FjaGVbbGV0dGVyXSBpcyB1bmRlZmluZWRcbiAgICAgIEBjcmVhdGVUaWxlIGxldHRlciwgd2lkdGgsIGhlaWdodFxuXG4gICAgcmV0dXJuIEBjYWNoZVtsZXR0ZXJdXG5cbiAgIyBjcmVhdGVzIGEgY2FudmFzIHdpdGggYSBzaW5nbGUgbGV0dGVyXG4gICMgKGZvciB0aGUgZmFzdCBmb250IGNhY2hlKVxuICBjcmVhdGVUaWxlOiAobGV0dGVyLCB3aWR0aCwgaGVpZ2h0KSAtPlxuXG4gICAgY2FudmFzID0gQGNhY2hlW2xldHRlcl0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwiY2FudmFzXCJcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aFxuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHRcbiAgICBAY3R4ID0gY2FudmFzLmdldENvbnRleHQgJzJkJ1xuICAgIEBjdHguZm9udCA9IEBnLnpvb21lci5nZXQgXCJyZXNpZHVlRm9udFwiXG4gICAgQGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJ1xuICAgIEBjdHgudGV4dEFsaWduID0gXCJjZW50ZXJcIlxuXG4gICAgQGN0eC5maWxsVGV4dCBsZXR0ZXIsd2lkdGggLyAyLGhlaWdodCAvIDIsd2lkdGhcbiIsImJvbmVWaWV3ID0gcmVxdWlyZShcImJhY2tib25lLWNoaWxkc1wiKVxubW91c2UgPSByZXF1aXJlIFwibW91c2UtcG9zXCJcbmNvbG9yU2VsZWN0b3IgPSByZXF1aXJlKFwiYmlvanMtdXRpbC1jb2xvcnNjaGVtZXNcIikuc2VsZWN0b3Jcbl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5qYm9uZSA9IHJlcXVpcmUgXCJqYm9uZVwiXG5DaGFyQ2FjaGUgPSByZXF1aXJlIFwiLi9DYW52YXNDaGFyQ2FjaGVcIlxuXG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIHRhZ05hbWU6IFwiY2FudmFzXCJcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuXG4gICAgQGxpc3RlblRvIEBnLnpvb21lciwgXCJjaGFuZ2U6X2FsaWdubWVudFNjcm9sbExlZnQgY2hhbmdlOl9hbGlnbm1lbnRTY3JvbGxUb3BcIiwgKG1vZGVsLHZhbHVlLCBvcHRpb25zKSAtPlxuICAgICAgaWYgKG5vdCBvcHRpb25zPy5vcmlnaW4/KSBvciBvcHRpb25zLm9yaWdpbiBpc250IFwiY2FudmFzc2VxXCJcbiAgICAgICAgQHJlbmRlcigpXG5cbiAgICBAbGlzdGVuVG8gQGcuY29sdW1ucyxcImNoYW5nZTpoaWRkZW5cIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy56b29tZXIsXCJjaGFuZ2U6YWxpZ25tZW50V2lkdGhcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy5jb2xvcnNjaGVtZSwgXCJjaGFuZ2VcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy5zZWxjb2wsIFwicmVzZXQgYWRkXCIsIEByZW5kZXJcblxuICAgICMgZWwgcHJvcHNcbiAgICBAZWwuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICBAZWwuc3R5bGUub3ZlcmZsb3dYID0gXCJoaWRkZW5cIlxuICAgIEBlbC5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiXG4gICAgQGVsLmNsYXNzTmFtZSA9IFwiYmlvanNfbXNhX3NlcWJsb2NrXCJcblxuICAgIEBjdHggPSBAZWwuZ2V0Q29udGV4dCAnMmQnXG4gICAgQGNhY2hlID0gbmV3IENoYXJDYWNoZSBAZ1xuXG4gICAgIyB0aHJvdHRsZSB0aGUgZXhwZW5zaXZlIGRyYXcgZnVuY3Rpb25cbiAgICBAdGhyb3R0bGVUaW1lID0gMFxuICAgIEB0aHJvdHRsZUNvdW50cyA9IDBcbiAgICBpZiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2Via2l0QXBwZWFyYW5jZT9cbiAgICAgICMgd2Via2l0IGJyb3dzZXIgLSBubyB0aHJvdHRsaW5nIG5lZWRlZFxuICAgICAgQHRocm90dGxlZERyYXcgPSAtPlxuICAgICAgICBzdGFydCA9ICtuZXcgRGF0ZSgpXG4gICAgICAgIEBkcmF3KClcbiAgICAgICAgQHRocm90dGxlVGltZSArPSArbmV3IERhdGUoKSAtIHN0YXJ0XG4gICAgICAgIEB0aHJvdHRsZUNvdW50cysrXG4gICAgICAgIGlmIEB0aHJvdHRsZUNvdW50cyA+IDE1XG4gICAgICAgICAgdFRpbWUgPSBNYXRoLmNlaWwoQHRocm90dGxlVGltZSAvIEB0aHJvdHRsZUNvdW50cylcbiAgICAgICAgICBjb25zb2xlLmxvZyBcImF2Z0RyYXdUaW1lL1dlYktpdFwiLCB0VGltZVxuICAgICAgICAgICMgcmVtb3ZlIHBlcmYgYW5hbHlzZXJcbiAgICAgICAgICBAdGhyb3R0bGVkRHJhdyA9IEBkcmF3XG4gICAgZWxzZVxuICAgICAgIyBzbG93IGJyb3dzZXJzIGxpa2UgR2Vja29cbiAgICAgIEB0aHJvdHRsZWREcmF3ID0gXy50aHJvdHRsZSBAdGhyb3R0bGVkRHJhdywgMzBcblxuICAgIEBtYW5hZ2VFdmVudHMoKVxuXG4gICMgbWVhc3VyZXMgdGhlIHRpbWUgb2YgYSByZWRyYXcgYW5kIHRodXMgc2V0IHRoZSB0aHJvdHRsZSBsaW1pdFxuICB0aHJvdHRsZWREcmF3OiAtPlxuICAgICMgK25ldyBpcyB0aGUgZmFzdGVzdDogaHR0cDovL2pzcGVyZi5jb20vbmV3LWRhdGUtdnMtZGF0ZS1ub3ctdnMtcGVyZm9ybWFuY2Utbm93LzZcbiAgICBzdGFydCA9ICtuZXcgRGF0ZSgpXG4gICAgQGRyYXcoKVxuICAgIEB0aHJvdHRsZVRpbWUgKz0gK25ldyBEYXRlKCkgLSBzdGFydFxuICAgIEB0aHJvdHRsZUNvdW50cysrXG5cbiAgICAjIHJlbW92ZSBpdHNlbGYgYWZ0ZXIgYW5hbHlzaXNcbiAgICBpZiBAdGhyb3R0bGVDb3VudHMgPiAxNVxuICAgICAgdFRpbWUgPSBNYXRoLmNlaWwoQHRocm90dGxlVGltZSAvIEB0aHJvdHRsZUNvdW50cylcbiAgICAgIGNvbnNvbGUubG9nIFwiYXZnRHJhd1RpbWVcIiwgdFRpbWVcbiAgICAgIHRUaW1lICo9ICAxLjIgIyBhZGQgc2FmZXR5IHRpbWVcbiAgICAgIHRUaW1lID0gTWF0aC5tYXggMjAsIHRUaW1lICMgbGltaXQgZm9yIHVsdHJhIGZhc3QgY29tcHV0ZXJzXG4gICAgICBAdGhyb3R0bGVkRHJhdyA9IF8udGhyb3R0bGUgQGRyYXcsIHRUaW1lXG5cbiAgbWFuYWdlRXZlbnRzOiAtPlxuICAgIGV2ZW50cyA9IHt9XG4gICAgZXZlbnRzLm1vdXNlZG93biA9IFwiX29ubW91c2Vkb3duXCJcbiAgICBldmVudHMudG91Y2hzdGFydCA9IFwiX29udG91Y2hzdGFydFwiXG5cbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUNsaWNrc1wiXG4gICAgICBldmVudHMuZGJsY2xpY2sgPSBcIl9vbmNsaWNrXCJcbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUhvdmVyXCJcbiAgICAgIGV2ZW50cy5tb3VzZWluID0gXCJfb25tb3VzZWluXCJcbiAgICAgIGV2ZW50cy5tb3VzZW91dCA9IFwiX29ubW91c2VvdXRcIlxuXG4gICAgZXZlbnRzLm1vdXNld2hlZWwgPSBcIl9vbm1vdXNld2hlZWxcIlxuICAgIGV2ZW50cy5ET01Nb3VzZVNjcm9sbCA9IFwiX29ubW91c2V3aGVlbFwiXG4gICAgQGRlbGVnYXRlRXZlbnRzIGV2ZW50c1xuXG4gICAgIyBsaXN0ZW4gZm9yIGNoYW5nZXNcbiAgICBAbGlzdGVuVG8gQGcuY29uZmlnLCBcImNoYW5nZTpyZWdpc3Rlck1vdXNlSG92ZXJcIiwgQG1hbmFnZUV2ZW50c1xuICAgIEBsaXN0ZW5UbyBAZy5jb25maWcsIFwiY2hhbmdlOnJlZ2lzdGVyTW91c2VDbGlja1wiLCBAbWFuYWdlRXZlbnRzXG4gICAgQGRyYWdTdGFydCA9IFtdXG5cbiAgZHJhdzogLT5cblxuICAgICMgZmFzdGVzdCB3YXkgdG8gY2xlYXIgdGhlIGNhbnZhc1xuICAgICMgaHR0cDovL2pzcGVyZi5jb20vY2FudmFzLWNsZWFyLXNwZWVkLzI1XG4gICAgQGVsLndpZHRoID0gQGVsLndpZHRoXG5cbiAgICByZWN0SGVpZ2h0ID0gQGcuem9vbWVyLmdldCBcInJvd0hlaWdodFwiXG5cbiAgICAjIHJlY3RzXG4gICAgQGN0eC5nbG9iYWxBbHBoYSA9IEBnLmNvbG9yc2NoZW1lLmdldCBcIm9wYWNpdHlcIlxuICAgIEBkcmF3U2VxcyAoZGF0YSkgLT4gQGRyYXdTZXEoZGF0YSwgQF9kcmF3UmVjdClcbiAgICBAY3R4Lmdsb2JhbEFscGhhID0gMVxuXG4gICAgIyBsZXR0ZXJzXG4gICAgQGRyYXdTZXFzIChkYXRhKSAtPiBAZHJhd1NlcShkYXRhLCBAX2RyYXdMZXR0ZXIpXG5cbiAgICAjIGZlYXR1cmVzLCBzZWxlY3Rpb25cbiAgICBAZHJhd1NlcXMgQGRyYXdTZXFFeHRlbmRlZFxuXG4gIGRyYXdTZXFzOiAoY2FsbGJhY2spIC0+XG4gICAgcmVjdEhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJyb3dIZWlnaHRcIlxuICAgIGhpZGRlbiA9IEBnLmNvbHVtbnMuZ2V0IFwiaGlkZGVuXCJcblxuICAgIHN0YXJ0ID0gTWF0aC5tYXggMCwgTWF0aC5hYnMoTWF0aC5jZWlsKCAtIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxUb3AnKSAvIHJlY3RIZWlnaHQpKVxuICAgIHkgPSAtIE1hdGguYWJzKCAtIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxUb3AnKSAlIHJlY3RIZWlnaHQpXG4gICAgZm9yIGkgaW4gW3N0YXJ0Li4gQG1vZGVsLmxlbmd0aCAtIDFdIGJ5IDFcbiAgICAgIGNvbnRpbnVlIGlmIEBtb2RlbC5hdChpKS5nZXQoJ2hpZGRlbicpXG4gICAgICBjYWxsYmFjay5jYWxsIEAsIHttb2RlbDogQG1vZGVsLmF0KGkpLCB5OiB5LCBoaWRkZW46IGhpZGRlbn1cbiAgICAgIHkgPSB5ICsgcmVjdEhlaWdodFxuICAgICAgIyBvdXQgb2Ygdmlld3BvcnQgLSBzdG9wXG4gICAgICBpZiB5ID4gQGVsLmhlaWdodFxuICAgICAgICBicmVha1xuXG4gICMgVE9ETzogdmVyeSBleHBlbnNpdmUgbWV0aG9kXG4gIGRyYXdTZXE6IChkYXRhLCBjYWxsYmFjaykgLT5cbiAgICBzZXEgPSBkYXRhLm1vZGVsLmdldCBcInNlcVwiXG4gICAgeSA9IGRhdGEueVxuICAgIHJlY3RXaWR0aCA9IEBnLnpvb21lci5nZXQgXCJjb2x1bW5XaWR0aFwiXG4gICAgcmVjdEhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJyb3dIZWlnaHRcIlxuXG4gICAgIyBza2lwIHVubmVlZGVkIGJsb2NrcyBhdCB0aGUgYmVnaW5uaW5nXG4gICAgc3RhcnQgPSBNYXRoLm1heCAwLCBNYXRoLmFicyhNYXRoLmNlaWwoIC0gQGcuem9vbWVyLmdldCgnX2FsaWdubWVudFNjcm9sbExlZnQnKSAvIHJlY3RXaWR0aCkpXG4gICAgeCA9IC0gTWF0aC5hYnMoIC0gQGcuem9vbWVyLmdldCgnX2FsaWdubWVudFNjcm9sbExlZnQnKSAlIHJlY3RXaWR0aClcblxuICAgIHJlcyA9IHtyZWN0V2lkdGg6IHJlY3RXaWR0aCwgcmVjdEhlaWdodDogcmVjdEhlaWdodCwgeTogeX1cbiAgICBlbFdpZHRoID0gQGVsLndpZHRoXG5cbiAgICBmb3IgaiBpbiBbc3RhcnQuLiBzZXEubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgYyA9IHNlcVtqXVxuICAgICAgYyA9IGMudG9VcHBlckNhc2UoKVxuXG4gICAgICAjIGNhbGwgdGhlIGN1c3RvbSBmdW5jdGlvblxuICAgICAgcmVzLnggPSB4XG4gICAgICByZXMuYyA9IGNcblxuICAgICAgIyBsb2NhbCBjYWxsIGlzIGZhc3RlciB0aGFuIGFwcGx5XG4gICAgICAjIGh0dHA6Ly9qc3BlcmYuY29tL2Z1bmN0aW9uLWNhbGxzLWRpcmVjdC12cy1hcHBseS12cy1jYWxsLXZzLWJpbmQvNlxuICAgICAgaWYgZGF0YS5oaWRkZW4uaW5kZXhPZihqKSA8IDBcbiAgICAgICAgY2FsbGJhY2sgQCxyZXNcbiAgICAgIGVsc2VcbiAgICAgICAgY29udGludWVcblxuICAgICAgIyBtb3ZlIHRvIHRoZSByaWdodFxuICAgICAgeCA9IHggKyByZWN0V2lkdGhcblxuICAgICAgIyBvdXQgb2Ygdmlld3BvcnQgLSBzdG9wXG4gICAgICBpZiB4ID4gZWxXaWR0aFxuICAgICAgICBicmVha1xuXG4gIF9kcmF3UmVjdDogKHRoYXQsIGRhdGEpIC0+XG4gICAgY29sb3IgPSB0aGF0LmNvbG9yW2RhdGEuY11cbiAgICBpZiBjb2xvcj9cbiAgICAgIHRoYXQuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICB0aGF0LmN0eC5maWxsUmVjdCBkYXRhLngsZGF0YS55LGRhdGEucmVjdFdpZHRoLGRhdGEucmVjdEhlaWdodFxuXG4gICMgUkVBTExZIGV4cGVuc2l2ZSBjYWxsIG9uIEZGXG4gICMgUGVyZm9ybWFuY2U6XG4gICMgY2hyb21lOiAyMDAwbXMgZHJhd0xldHRlciAtIDEwMDBtcyBkcmF3UmVjdFxuICAjIEZGOiAxNzAwbXMgZHJhd0xldHRlciAtIDMwMG1zIGRyYXdSZWN0XG4gIF9kcmF3TGV0dGVyOiAodGhhdCxkYXRhKSAtPlxuICAgIHRoYXQuY3R4LmRyYXdJbWFnZSB0aGF0LmNhY2hlLmdldEZvbnRUaWxlKGRhdGEuYywgZGF0YS5yZWN0V2lkdGgsXG4gICAgICBkYXRhLnJlY3RIZWlnaHQpLCBkYXRhLngsIGRhdGEueSxkYXRhLnJlY3RXaWR0aCxkYXRhLnJlY3RIZWlnaHRcblxuICBkcmF3U2VxRXh0ZW5kZWQ6IChkYXRhKSAtPlxuICAgIHNlcSA9IGRhdGEubW9kZWwuZ2V0IFwic2VxXCJcbiAgICByZWN0V2lkdGggPSBAZy56b29tZXIuZ2V0IFwiY29sdW1uV2lkdGhcIlxuICAgIHJlY3RIZWlnaHQgPSBAZy56b29tZXIuZ2V0IFwicm93SGVpZ2h0XCJcblxuICAgIHN0YXJ0ID0gTWF0aC5tYXggMCwgTWF0aC5hYnMoTWF0aC5jZWlsKCAtIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxMZWZ0JykgLyByZWN0V2lkdGgpKVxuICAgIHggPSAtIE1hdGguYWJzKCAtIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxMZWZ0JykgJSByZWN0V2lkdGgpXG4gICAgeFplcm8gPSB4IC0gc3RhcnQgKiByZWN0V2lkdGhcblxuICAgIHNlbGVjdGlvbiA9IEBfZ2V0U2VsZWN0aW9uIGRhdGEubW9kZWxcbiAgICBbbVByZXZTZWwsbU5leHRTZWxdID0gQF9nZXRQcmV2TmV4dFNlbGVjdGlvbiBkYXRhLm1vZGVsXG4gICAgZmVhdHVyZXMgPSBkYXRhLm1vZGVsLmdldCBcImZlYXR1cmVzXCJcblxuICAgIHlaZXJvID0gZGF0YS55XG5cbiAgICBmb3IgaiBpbiBbc3RhcnQuLiBzZXEubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgc3RhcnRzID0gZmVhdHVyZXMuc3RhcnRPbiBqXG5cbiAgICAgIGlmIGRhdGEuaGlkZGVuLmluZGV4T2YoaikgPj0gMFxuICAgICAgICBjb250aW51ZVxuXG4gICAgICBpZiBzdGFydHMubGVuZ3RoID4gMFxuICAgICAgICBmb3IgZiBpbiBzdGFydHNcbiAgICAgICAgICBAYXBwZW5kRmVhdHVyZSBmOiBmLHhaZXJvOiB4LCB5WmVybzogeVplcm9cblxuICAgICAgeCA9IHggKyByZWN0V2lkdGhcbiAgICAgICMgb3V0IG9mIHZpZXdwb3J0IC0gc3RvcFxuICAgICAgaWYgeCA+IEBlbC53aWR0aFxuICAgICAgICBicmVha1xuXG4gICAgQF9hcHBlbmRTZWxlY3Rpb24gbW9kZWw6IGRhdGEubW9kZWwsIHhaZXJvOiB4WmVybywgeVplcm86IHlaZXJvLCBoaWRkZW46XG4gICAgICBkYXRhLmhpZGRlblxuXG4gIHJlbmRlcjogLT5cblxuICAgIEBlbC5zZXRBdHRyaWJ1dGUgJ2hlaWdodCcsIEBnLnpvb21lci5nZXQgXCJhbGlnbm1lbnRIZWlnaHRcIlxuICAgIEBlbC5zZXRBdHRyaWJ1dGUgJ3dpZHRoJywgQGcuem9vbWVyLmdldCBcImFsaWdubWVudFdpZHRoXCJcblxuICAgIEBnLnpvb21lci5fYWRqdXN0V2lkdGggQGVsLCBAbW9kZWxcbiAgICBAZy56b29tZXIuX2NoZWNrU2Nyb2xsaW5nKCBAX2NoZWNrU2Nyb2xsaW5nKFtAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsTGVmdCcpLFxuICAgIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxUb3AnKV0gKSx7aGVhZGVyOiBcImNhbnZhc3NlcVwifSlcblxuICAgIEBjb2xvciA9IGNvbG9yU2VsZWN0b3IuZ2V0Q29sb3IgQGcuY29sb3JzY2hlbWUuZ2V0KFwic2NoZW1lXCIpXG5cbiAgICBAdGhyb3R0bGVkRHJhdygpXG4gICAgQFxuXG4gIF9vbm1vdXNlbW92ZTogKGUsIHJldmVyc2VkKSAtPlxuICAgIHJldHVybiBpZiBAZHJhZ1N0YXJ0Lmxlbmd0aCBpcyAwXG5cbiAgICBkcmFnRW5kID0gbW91c2UuYWJzIGVcbiAgICAjIHJlbGF0aXZlIHRvIGZpcnN0IGNsaWNrXG4gICAgcmVsRW5kID0gW2RyYWdFbmRbMF0gLSBAZHJhZ1N0YXJ0WzBdLCBkcmFnRW5kWzFdIC0gQGRyYWdTdGFydFsxXV1cbiAgICAjIHJlbGF0aXZlIHRvIGluaXRpYWwgc2Nyb2xsIHN0YXR1c1xuXG4gICAgIyBzY2FsZSBldmVudHNcbiAgICBzY2FsZUZhY3RvciA9IEBnLnpvb21lci5nZXQgXCJjYW52YXNFdmVudFNjYWxlXCJcbiAgICBpZiByZXZlcnNlZFxuICAgICAgc2NhbGVGYWN0b3IgPSAzXG4gICAgZm9yIGkgaW4gWzAuLjFdIGJ5IDFcbiAgICAgIHJlbEVuZFtpXSA9IHJlbEVuZFtpXSAqIHNjYWxlRmFjdG9yXG5cbiAgICAjIGNhbGN1bGF0ZSBuZXcgc2Nyb2xsaW5nIHZhbHNcbiAgICByZWxEaXN0ID0gW0BkcmFnU3RhcnRTY3JvbGxbMF0gLSByZWxFbmRbMF0sIEBkcmFnU3RhcnRTY3JvbGxbMV0gLSByZWxFbmRbMV1dXG5cbiAgICAjIHJvdW5kIHZhbHVlc1xuICAgIGZvciBpIGluIFswLi4xXSBieSAxXG4gICAgICByZWxEaXN0W2ldID0gTWF0aC5yb3VuZCByZWxEaXN0W2ldXG5cbiAgICAjIHVwZGF0ZSBzY3JvbGxiYXJcbiAgICBzY3JvbGxDb3JyZWN0ZWQgPSBAX2NoZWNrU2Nyb2xsaW5nKCByZWxEaXN0KVxuICAgIEBnLnpvb21lci5fY2hlY2tTY3JvbGxpbmcgc2Nyb2xsQ29ycmVjdGVkLCB7b3JpZ2luOiBcImNhbnZhc3NlcVwifVxuXG4gICAgIyByZXNldCBzdGFydCBpZiB1c2Ugc2Nyb2xscyBvdXQgb2YgYm91bmRzXG4gICAgZm9yIGkgaW4gWzAuLjFdIGJ5IDFcbiAgICAgIGlmIHNjcm9sbENvcnJlY3RlZFtpXSBpc250IHJlbERpc3RbaV1cbiAgICAgICAgaWYgc2Nyb2xsQ29ycmVjdGVkW2ldIGlzIDBcbiAgICAgICAgICAjIHJlc2V0IG9mIGxlZnQsIHRvcFxuICAgICAgICAgIEBkcmFnU3RhcnRbaV0gPSBkcmFnRW5kW2ldXG4gICAgICAgICAgQGRyYWdTdGFydFNjcm9sbFtpXSA9IDBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICMgcmVjYWxpYnJhdGUgb24gcmlnaHQsIGJvdHRvbVxuICAgICAgICAgIEBkcmFnU3RhcnRbaV0gPSBkcmFnRW5kW2ldIC0gc2Nyb2xsQ29ycmVjdGVkW2ldXG5cbiAgICBAdGhyb3R0bGVkRHJhdygpXG5cbiAgICAjIGFib3J0IHNlbGVjdGlvbiBldmVudHMgb2YgdGhlIGJyb3dzZXIgKG1vdXNlIG9ubHkpXG4gICAgaWYgZS5wcmV2ZW50RGVmYXVsdD9cbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICMgY29udmVydHMgdG91Y2hlcyBpbnRvIG9sZCBtb3VzZSBldmVudFxuICBfb250b3VjaG1vdmU6IChlKSAtPlxuICAgIEBfb25tb3VzZW1vdmUgZS5jaGFuZ2VkVG91Y2hlc1swXSwgdHJ1ZVxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAjIHN0YXJ0IHRoZSBkcmFnZ2luZyBtb2RlXG4gIF9vbm1vdXNlZG93bjogKGUpIC0+XG4gICAgQGRyYWdTdGFydCA9IG1vdXNlLmFicyBlXG4gICAgQGRyYWdTdGFydFNjcm9sbCA9IFtAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsTGVmdCcpLCBAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsVG9wJyldXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub24gJ21vdXNlbW92ZS5vdmVybW92ZScsIChlKSA9PiBAX29ubW91c2Vtb3ZlKGUpXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub24gJ21vdXNldXAub3ZlcnVwJywgPT4gQF9jbGVhbnVwKClcbiAgICAjamJvbmUoZG9jdW1lbnQuYm9keSkub24gJ21vdXNlb3V0Lm92ZXJvdXQnLCAoZSkgPT4gQF9vbm1vdXNld2lub3V0KGUpXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgIyBzdGFydHMgdGhlIHRvdWNoIG1vZGVcbiAgX29udG91Y2hzdGFydDogKGUpIC0+XG4gICAgQGRyYWdTdGFydCA9IG1vdXNlLmFicyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgQGRyYWdTdGFydFNjcm9sbCA9IFtAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsTGVmdCcpLCBAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsVG9wJyldXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub24gJ3RvdWNobW92ZS5vdmVydG1vdmUnLCAoZSkgPT4gQF9vbnRvdWNobW92ZShlKVxuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9uICd0b3VjaGVuZC5vdmVydGVuZCB0b3VjaGxlYXZlLm92ZXJ0bGVhdmVcbiAgICB0b3VjaGNhbmNlbC5vdmVydGNhbmVsJywgKGUpID0+IEBfdG91Y2hDbGVhbnVwKGUpXG5cbiAgIyBjaGVja3Mgd2hldGhlciBtb3VzZSBtb3ZlZCBvdXQgb2YgdGhlIHdpbmRvd1xuICAjIC0+IHRlcm1pbmF0ZSBkcmFnZ2luZ1xuICBfb25tb3VzZXdpbm91dDogKGUpIC0+XG4gICAgaWYgZS50b0VsZW1lbnQgaXMgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlXG4gICAgICBAX2NsZWFudXAoKVxuXG4gICMgdGVybWluYXRlcyBkcmFnZ2luZ1xuICBfY2xlYW51cDogLT5cbiAgICBAZHJhZ1N0YXJ0ID0gW11cbiAgICAjIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub2ZmKCcub3Zlcm1vdmUnKVxuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9mZignLm92ZXJ1cCcpXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub2ZmKCcub3Zlcm91dCcpXG5cbiAgIyB0ZXJtaW5hdGVzIHRvdWNoaW5nXG4gIF90b3VjaENsZWFudXA6IChlKSAtPlxuICAgIGlmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMFxuICAgICAgIyBtYXliZSB3ZSBjYW4gc2VuZCBhIGZpbmFsIGV2ZW50XG4gICAgICBAX29ubW91c2Vtb3ZlIGUuY2hhbmdlZFRvdWNoZXNbMF0sIHRydWVcblxuICAgIEBkcmFnU3RhcnQgPSBbXVxuICAgICMgcmVtb3ZlIGFsbCBsaXN0ZW5lcnNcbiAgICBqYm9uZShkb2N1bWVudC5ib2R5KS5vZmYoJy5vdmVydG1vdmUnKVxuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9mZignLm92ZXJ0ZW5kJylcbiAgICBqYm9uZShkb2N1bWVudC5ib2R5KS5vZmYoJy5vdmVydGxlYXZlJylcbiAgICBqYm9uZShkb2N1bWVudC5ib2R5KS5vZmYoJy5vdmVydGNhbmNlbCcpXG5cbiAgIyBtaWdodCBiZSBpbmNvbXBhdGlibGUgd2l0aCBzb21lIGJyb3dzZXJzXG4gIF9vbm1vdXNld2hlZWw6IChlKSAtPlxuICAgIGRlbHRhID0gbW91c2Uud2hlZWxEZWx0YSBlXG4gICAgQGcuem9vbWVyLnNldCAnX2FsaWdubWVudFNjcm9sbExlZnQnLCBAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsTGVmdCcpICsgZGVsdGFbMF1cbiAgICBAZy56b29tZXIuc2V0ICdfYWxpZ25tZW50U2Nyb2xsVG9wJywgQGcuem9vbWVyLmdldCgnX2FsaWdubWVudFNjcm9sbFRvcCcpICsgZGVsdGFbMV1cbiAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICBfb25jbGljazogKGUpIC0+XG4gICAgQGcudHJpZ2dlciBcInJlc2lkdWU6Y2xpY2tcIiwgQF9nZXRDbGlja1BvcyhlKVxuICAgIEB0aHJvdHRsZWREcmF3KClcblxuICBfb25tb3VzZWluOiAoZSkgLT5cbiAgICBAZy50cmlnZ2VyIFwicmVzaWR1ZTpjbGlja1wiLCBAX2dldENsaWNrUG9zKGUpXG4gICAgQHRocm90dGxlZERyYXcoKVxuXG4gIF9vbm1vdXNlb3V0OiAoZSkgLT5cbiAgICBAZy50cmlnZ2VyIFwicmVzaWR1ZTpjbGlja1wiLCBAX2dldENsaWNrUG9zKGUpXG4gICAgQHRocm90dGxlZERyYXcoKVxuXG4gIF9nZXRDbGlja1BvczogKGUpIC0+XG4gICAgY29vcmRzID0gbW91c2UucmVsIGVcbiAgICBjb29yZHNbMF0gKz0gQGcuem9vbWVyLmdldChcIl9hbGlnbm1lbnRTY3JvbGxMZWZ0XCIpXG4gICAgY29vcmRzWzFdICs9IEBnLnpvb21lci5nZXQoXCJfYWxpZ25tZW50U2Nyb2xsVG9wXCIpXG4gICAgeCA9IE1hdGguZmxvb3IoY29vcmRzWzBdIC8gQGcuem9vbWVyLmdldChcImNvbHVtbldpZHRoXCIpIClcbiAgICB5ID0gTWF0aC5mbG9vcihjb29yZHNbMV0gLyBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpKVxuXG4gICAgIyBhZGQgaGlkZGVuIGNvbHVtbnNcbiAgICB4ICs9IEBnLmNvbHVtbnMuY2FsY0hpZGRlbkNvbHVtbnMgeFxuICAgICMgYWRkIGhpZGRlbiBzZXFzXG4gICAgeSArPSBAbW9kZWwuY2FsY0hpZGRlblNlcXMgeVxuXG4gICAgeCA9IE1hdGgubWF4IDAseFxuICAgIHkgPSBNYXRoLm1heCAwLHlcbiAgICBzZXFJZCA9IEBtb2RlbC5hdCh5KS5nZXQgXCJpZFwiXG4gICAgcmV0dXJuIHtzZXFJZDpzZXFJZCwgcm93UG9zOiB4LCBldnQ6ZX1cblxuICAjIGNoZWNrcyB3aGV0aGVyIHRoZSBzY3JvbGxpbmcgY29vcmRpbmF0ZXMgYXJlIHZhbGlkXG4gICMgQHJldHVybnM6IFt4U2Nyb2xsLHlTY3JvbGxdIHZhbGlkIGNvb3JkaW5hdGVzXG4gIF9jaGVja1Njcm9sbGluZzogKHNjcm9sbE9iaikgLT5cblxuICAgICMgMDogbWF4TGVmdCwgMTogbWF4VG9wXG4gICAgbWF4ID0gW0Btb2RlbC5nZXRNYXhMZW5ndGgoKSAqIEBnLnpvb21lci5nZXQoXCJjb2x1bW5XaWR0aFwiKSAtIEBnLnpvb21lci5nZXQoJ2FsaWdubWVudFdpZHRoJyksXG4gICAgQG1vZGVsLmxlbmd0aCAgKiBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpIC0gQGcuem9vbWVyLmdldCgnYWxpZ25tZW50SGVpZ2h0JyldXG5cbiAgICBmb3IgaSBpbiBbMC4uMV0gYnkgMVxuICAgICAgaWYgc2Nyb2xsT2JqW2ldID4gbWF4W2ldXG4gICAgICAgIHNjcm9sbE9ialtpXSA9IG1heFtpXVxuXG4gICAgICBpZiBzY3JvbGxPYmpbaV0gPCAwXG4gICAgICAgIHNjcm9sbE9ialtpXSA9IDBcblxuICAgIHJldHVybiBzY3JvbGxPYmpcblxuICAjIFRPRE86IHNob3VsZCBJIGJlIG1vdmVkIHRvIHRoZSBzZWxlY3Rpb24gbWFuYWdlcj9cbiAgIyByZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZXNpZHVlc1xuICAjIGUuZy4gWzAsM10gPSBwb3MgMCBhbmQgMyBhcmUgc2VsZWN0ZWRcbiAgX2dldFNlbGVjdGlvbjogKG1vZGVsKSAtPlxuICAgIG1heExlbiA9IG1vZGVsLmdldChcInNlcVwiKS5sZW5ndGhcbiAgICBzZWxlY3Rpb24gPSBbXVxuICAgIHNlbHMgPSBAZy5zZWxjb2wuZ2V0U2VsRm9yUm93IG1vZGVsLmdldCBcImlkXCJcbiAgICByb3dzID0gXy5maW5kIHNlbHMsIChlbCkgLT4gZWwuZ2V0KFwidHlwZVwiKSBpcyBcInJvd1wiXG4gICAgaWYgcm93cz9cbiAgICAgICMgZnVsbCBtYXRjaFxuICAgICAgZm9yIG4gaW4gWzAuLm1heExlbiAtIDFdIGJ5IDFcbiAgICAgICAgc2VsZWN0aW9uLnB1c2ggblxuICAgIGVsc2UgaWYgc2Vscy5sZW5ndGggPiAwXG4gICAgICBmb3Igc2VsIGluIHNlbHNcbiAgICAgICAgZm9yIG4gaW4gW3NlbC5nZXQoXCJ4U3RhcnRcIikuLnNlbC5nZXQoXCJ4RW5kXCIpXSBieSAxXG4gICAgICAgICAgc2VsZWN0aW9uLnB1c2ggblxuXG4gICAgcmV0dXJuIHNlbGVjdGlvblxuXG4gICMgZHJhd3MgZmVhdHVyZXNcbiAgYXBwZW5kRmVhdHVyZTogKGRhdGEpIC0+XG4gICAgZiA9IGRhdGEuZlxuICAgICMgVE9ETzogdGhpcyBpcyBhIHZlcnkgbmFpdmUgd2F5XG4gICAgYm94V2lkdGggPSBAZy56b29tZXIuZ2V0KFwiY29sdW1uV2lkdGhcIilcbiAgICBib3hIZWlnaHQgPSBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpXG4gICAgd2lkdGggPSAoZi5nZXQoXCJ4RW5kXCIpIC0gZi5nZXQoXCJ4U3RhcnRcIikpICogYm94V2lkdGhcblxuICAgIGJlZm9yZVdpZHRoID0gQGN0eC5saW5lV2lkdGhcbiAgICBAY3R4LmxpbmVXaWR0aCA9IDNcbiAgICBiZWZvcmVTdHlsZSA9IEBjdHguc3Ryb2tlU3R5bGVcbiAgICBAY3R4LnN0cm9rZVN0eWxlID0gZi5nZXQgXCJmaWxsQ29sb3JcIlxuXG4gICAgQGN0eC5zdHJva2VSZWN0IGRhdGEueFplcm8sIGRhdGEueVplcm8sIHdpZHRoLGJveEhlaWdodFxuICAgIEBjdHguc3Ryb2tlU3R5bGUgPSBiZWZvcmVTdHlsZVxuICAgIEBjdHgubGluZVdpZHRoID0gYmVmb3JlV2lkdGhcblxuXG4gICMgbG9vcHMgb3ZlciBhbGwgc2VsZWN0aW9uIGFuZCBjYWxscyB0aGUgcmVuZGVyIG1ldGhvZFxuICBfYXBwZW5kU2VsZWN0aW9uOiAoZGF0YSkgLT5cbiAgICBzZXEgPSBkYXRhLm1vZGVsLmdldChcInNlcVwiKVxuICAgIHNlbGVjdGlvbiA9IEBfZ2V0U2VsZWN0aW9uIGRhdGEubW9kZWxcbiAgICAjIGdldCB0aGUgc3RhdHVzIG9mIHRoZSB1cHBlciBhbmQgbG93ZXIgcm93XG4gICAgW21QcmV2U2VsLG1OZXh0U2VsXSA9IEBfZ2V0UHJldk5leHRTZWxlY3Rpb24gZGF0YS5tb2RlbFxuXG4gICAgYm94V2lkdGggPSBAZy56b29tZXIuZ2V0KFwiY29sdW1uV2lkdGhcIilcbiAgICBib3hIZWlnaHQgPSBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpXG5cbiAgICAjIGF2b2lkIHVubmVjZXNzYXJ5IGxvb3BzXG4gICAgcmV0dXJuIGlmIHNlbGVjdGlvbi5sZW5ndGggaXMgMFxuXG4gICAgaGlkZGVuT2Zmc2V0ID0gMFxuICAgIGZvciBuIGluIFswLi5zZXEubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgaWYgZGF0YS5oaWRkZW4uaW5kZXhPZihuKSA+PSAwXG4gICAgICAgIGhpZGRlbk9mZnNldCsrXG4gICAgICBlbHNlXG4gICAgICAgIGsgPSBuIC0gaGlkZGVuT2Zmc2V0XG4gICAgICAgICMgb25seSBpZiBpdHMgYSBuZXcgc2VsZWN0aW9uXG4gICAgICAgIGlmIHNlbGVjdGlvbi5pbmRleE9mKG4pID49IDAgYW5kIChrIGlzIDAgb3Igc2VsZWN0aW9uLmluZGV4T2YobiAtIDEpIDwgMCApXG4gICAgICAgICAgQF9yZW5kZXJTZWxlY3Rpb24gbjpuLGs6ayxzZWxlY3Rpb246IHNlbGVjdGlvbixtUHJldlNlbDogbVByZXZTZWwsbU5leHRTZWw6bU5leHRTZWwsIHhaZXJvOiBkYXRhLnhaZXJvLCB5WmVybzogZGF0YS55WmVybywgbW9kZWw6IGRhdGEubW9kZWxcblxuICAjIGRyYXdzIGEgc2luZ2xlIHVzZXIgc2VsZWN0aW9uXG4gIF9yZW5kZXJTZWxlY3Rpb246IChkYXRhKSAtPlxuXG4gICAgeFplcm8gPSBkYXRhLnhaZXJvXG4gICAgeVplcm8gPSBkYXRhLnlaZXJvXG4gICAgbiA9IGRhdGEublxuICAgIGsgPSBkYXRhLmtcbiAgICBzZWxlY3Rpb24gPSBkYXRhLnNlbGVjdGlvblxuICAgICMgYW5kIGNoZWNrcyB0aGUgcHJldiBhbmQgbmV4dCByb3cgZm9yIHNlbGVjdGlvbiAgLT4gbm8gYm9yZGVycyBpbiBhIHNlbGVjdGlvblxuICAgIG1QcmV2U2VsPSBkYXRhLm1QcmV2U2VsXG4gICAgbU5leHRTZWwgPSBkYXRhLm1OZXh0U2VsXG5cbiAgICAjIGdldCB0aGUgbGVuZ3RoIG9mIHRoaXMgc2VsZWN0aW9uXG4gICAgc2VsZWN0aW9uTGVuZ3RoID0gMFxuICAgIGZvciBpIGluIFtuLi4gZGF0YS5tb2RlbC5nZXQoXCJzZXFcIikubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgaWYgc2VsZWN0aW9uLmluZGV4T2YoaSkgPj0gMFxuICAgICAgICBzZWxlY3Rpb25MZW5ndGgrK1xuICAgICAgZWxzZVxuICAgICAgICBicmVha1xuXG4gICAgIyBUT0RPOiB1Z2x5IVxuICAgIGJveFdpZHRoID0gQGcuem9vbWVyLmdldChcImNvbHVtbldpZHRoXCIpXG4gICAgYm94SGVpZ2h0ID0gQGcuem9vbWVyLmdldChcInJvd0hlaWdodFwiKVxuICAgIHRvdGFsV2lkdGggPSAoYm94V2lkdGggKiBzZWxlY3Rpb25MZW5ndGgpICsgMVxuXG4gICAgaGlkZGVuID0gQGcuY29sdW1ucy5nZXQoJ2hpZGRlbicpXG5cbiAgICBAY3R4LmJlZ2luUGF0aCgpXG4gICAgYmVmb3JlV2lkdGggPSBAY3R4LmxpbmVXaWR0aFxuICAgIEBjdHgubGluZVdpZHRoID0gM1xuICAgIGJlZm9yZVN0eWxlID0gQGN0eC5zdHJva2VTdHlsZVxuICAgIEBjdHguc3Ryb2tlU3R5bGUgPSBcIiNGRjAwMDBcIlxuXG4gICAgeFplcm8gKz0gayAqIGJveFdpZHRoXG5cbiAgICAjIHNwbGl0IHVwIHRoZSBzZWxlY3Rpb24gaW50byBzaW5nbGUgY2VsbHNcbiAgICB4UGFydCA9IDBcbiAgICBmb3IgaSBpbiBbMC4uIHNlbGVjdGlvbkxlbmd0aCAtIDFdXG4gICAgICB4UG9zID0gbiArIGlcbiAgICAgIGlmIGhpZGRlbi5pbmRleE9mKHhQb3MpID49IDBcbiAgICAgICAgY29udGludWVcbiAgICAgICMgdXBwZXIgbGluZVxuICAgICAgdW5sZXNzIG1QcmV2U2VsPyBhbmQgbVByZXZTZWwuaW5kZXhPZih4UG9zKSA+PSAwXG4gICAgICAgIEBjdHgubW92ZVRvIHhaZXJvICsgeFBhcnQsIHlaZXJvXG4gICAgICAgIEBjdHgubGluZVRvIHhQYXJ0ICsgYm94V2lkdGggKyB4WmVybywgeVplcm9cbiAgICAgICMgbG93ZXIgbGluZVxuICAgICAgdW5sZXNzIG1OZXh0U2VsPyBhbmQgbU5leHRTZWwuaW5kZXhPZih4UG9zKSA+PSAwXG4gICAgICAgIEBjdHgubW92ZVRvIHhQYXJ0ICsgeFplcm8sIGJveEhlaWdodCArIHlaZXJvXG4gICAgICAgIEBjdHgubGluZVRvIHhQYXJ0ICsgYm94V2lkdGggKyB4WmVybywgYm94SGVpZ2h0ICsgeVplcm9cblxuICAgICAgeFBhcnQgKz0gYm94V2lkdGhcblxuICAgICMgbGVmdFxuICAgIEBjdHgubW92ZVRvIHhaZXJvLHlaZXJvXG4gICAgQGN0eC5saW5lVG8geFplcm8sIGJveEhlaWdodCArIHlaZXJvXG5cbiAgICAjIHJpZ2h0XG4gICAgQGN0eC5tb3ZlVG8geFplcm8gKyB0b3RhbFdpZHRoLHlaZXJvXG4gICAgQGN0eC5saW5lVG8geFplcm8gKyB0b3RhbFdpZHRoLCBib3hIZWlnaHQgKyB5WmVyb1xuXG4gICAgQGN0eC5zdHJva2UoKVxuICAgIEBjdHguc3Ryb2tlU3R5bGUgPSBiZWZvcmVTdHlsZVxuICAgIEBjdHgubGluZVdpZHRoID0gYmVmb3JlV2lkdGhcblxuICAjIGxvb2tzIGF0IHRoZSBzZWxlY3Rpb24gb2YgdGhlIHByZXYgYW5kIG5leHQgZWxcbiAgIyBUT0RPOiB0aGlzIGlzIHZlcnkgbmFpdmUsIGFzIHRoZXJlIG1pZ2h0IGJlIGdhcHMgYWJvdmUgb3IgYmVsb3dcbiAgX2dldFByZXZOZXh0U2VsZWN0aW9uOiAobW9kZWwpIC0+XG5cbiAgICBtb2RlbFByZXYgPSBtb2RlbC5jb2xsZWN0aW9uLnByZXYgbW9kZWxcbiAgICBtb2RlbE5leHQgPSBtb2RlbC5jb2xsZWN0aW9uLm5leHQgbW9kZWxcbiAgICBtUHJldlNlbCA9IEBfZ2V0U2VsZWN0aW9uIG1vZGVsUHJldiBpZiBtb2RlbFByZXY/XG4gICAgbU5leHRTZWwgPSBAX2dldFNlbGVjdGlvbiBtb2RlbE5leHQgaWYgbW9kZWxOZXh0P1xuICAgIFttUHJldlNlbCxtTmV4dFNlbF1cbiIsInZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtdmlld2pcIilcbm1vdXNlID0gcmVxdWlyZSBcIm1vdXNlLXBvc1wiXG5zZWxlY3Rpb24gPSByZXF1aXJlIFwiLi4vZy9zZWxlY3Rpb24vU2VsZWN0aW9uXCJcbmNvbG9yU2VsZWN0b3IgPSByZXF1aXJlKFwiYmlvanMtdXRpbC1jb2xvcnNjaGVtZXNcIikuc2VsZWN0b3Jcbmpib25lID0gcmVxdWlyZSBcImpib25lXCJcbl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5cbm1vZHVsZS5leHBvcnRzID0gT3ZlcnZpZXdCb3ggPSB2aWV3LmV4dGVuZFxuXG4gIGNsYXNzTmFtZTogXCJiaW9qc19tc2Ffb3ZlcnZpZXdib3hcIlxuICB0YWdOYW1lOiBcImNhbnZhc1wiXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAbGlzdGVuVG8gQGcuem9vbWVyLFwiY2hhbmdlOmJveFJlY3RXaWR0aCBjaGFuZ2U6Ym94UmVjdEhlaWdodFwiLCBAcmVuZGVyXG4gICAgQGxpc3RlblRvIEBnLnNlbGNvbCwgXCJhZGQgcmVzZXQgY2hhbmdlXCIsIEByZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcuY29sdW1ucywgXCJjaGFuZ2U6aGlkZGVuXCIsIEByZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcuY29sb3JzY2hlbWUsIFwiY2hhbmdlOnNob3dMb3dlckNhc2VcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAbW9kZWwsIFwiY2hhbmdlXCIsIF8uZGVib3VuY2UgQHJlbmRlciwgNVxuXG4gICAgIyBjb2xvclxuICAgIEBjb2xvciA9IGNvbG9yU2VsZWN0b3IuZ2V0Q29sb3IgQGcuY29sb3JzY2hlbWUuZ2V0KFwic2NoZW1lXCIpXG4gICAgQGxpc3RlblRvIEBnLmNvbG9yc2NoZW1lLCBcImNoYW5nZTpzY2hlbWVcIiwgLT5cbiAgICAgIEBjb2xvciA9IGNvbG9yU2VsZWN0b3IuZ2V0Q29sb3IgQGcuY29sb3JzY2hlbWUuZ2V0KFwic2NoZW1lXCIpXG4gICAgICBAcmVuZGVyKClcbiAgICBAZHJhZ1N0YXJ0ID0gW11cblxuICBldmVudHM6XG4gICAgY2xpY2s6IFwiX29uY2xpY2tcIlxuICAgIG1vdXNlZG93bjogXCJfb25tb3VzZWRvd25cIlxuXG4gIHJlbmRlcjogLT5cbiAgICBAX2NyZWF0ZUNhbnZhcygpXG4gICAgQGVsLnRleHRDb250ZW50ID0gXCJvdmVydmlld1wiXG5cbiAgICAjIGJhY2tncm91bmQgYmcgZm9yIG5vbi1kcmF3ZWQgYXJlYVxuICAgIEBjdHguZmlsbFN0eWxlID0gXCIjOTk5OTk5XCJcbiAgICBAY3R4LmZpbGxSZWN0IDAsMCxAZWwud2lkdGgsQGVsLmhlaWdodFxuXG4gICAgcmVjdFdpZHRoID0gQGcuem9vbWVyLmdldCBcImJveFJlY3RXaWR0aFwiXG4gICAgcmVjdEhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJib3hSZWN0SGVpZ2h0XCJcbiAgICBoaWRkZW4gPSBAZy5jb2x1bW5zLmdldCBcImhpZGRlblwiXG4gICAgc2hvd0xvd2VyQ2FzZSA9IEBnLmNvbG9yc2NoZW1lLmdldCBcInNob3dMb3dlckNhc2VcIlxuXG4gICAgeSA9IC1yZWN0SGVpZ2h0XG4gICAgZm9yIGkgaW4gWzAuLiBAbW9kZWwubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgc2VxID0gQG1vZGVsLmF0KGkpLmdldCBcInNlcVwiXG4gICAgICB4ID0gMFxuICAgICAgeSA9IHkgKyByZWN0SGVpZ2h0XG5cblxuICAgICAgaWYgQG1vZGVsLmF0KGkpLmdldCBcImhpZGRlblwiXG4gICAgICAgICMgaGlkZGVuIHNlcVxuICAgICAgICBjb25zb2xlLmxvZyBAbW9kZWwuYXQoaSkuZ2V0IFwiaGlkZGVuXCJcbiAgICAgICAgQGN0eC5maWxsU3R5bGUgPSBcImdyZXlcIlxuICAgICAgICBAY3R4LmZpbGxSZWN0IDAseSxzZXEubGVuZ3RoICogcmVjdFdpZHRoLHJlY3RIZWlnaHRcbiAgICAgICAgY29udGludWVcblxuICAgICAgZm9yIGogaW4gWzAuLiBzZXEubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgICBjID0gc2VxW2pdXG4gICAgICAgICMgdG9kbzogb3B0aW9uYWwgdXBwZXJjYXNpbmdcbiAgICAgICAgYyA9IGMudG9VcHBlckNhc2UoKSBpZiBzaG93TG93ZXJDYXNlXG4gICAgICAgIGNvbG9yID0gQGNvbG9yW2NdXG5cbiAgICAgICAgaWYgaGlkZGVuLmluZGV4T2YoaikgPj0gMFxuICAgICAgICAgIGNvbG9yID0gXCJncmV5XCJcblxuICAgICAgICBpZiBjb2xvcj9cbiAgICAgICAgICBAY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICAgICAgQGN0eC5maWxsUmVjdCB4LHkscmVjdFdpZHRoLHJlY3RIZWlnaHRcblxuICAgICAgICB4ID0geCArIHJlY3RXaWR0aFxuXG4gICAgQF9kcmF3U2VsZWN0aW9uKClcblxuICBfZHJhd1NlbGVjdGlvbjogLT5cbiAgICAjIGhpZGUgZHVyaW5nIHNlbGVjdGlvblxuICAgIHJldHVybiBpZiBAZHJhZ1N0YXJ0Lmxlbmd0aCA+IDAgYW5kIG5vdCBAcHJvbG9uZ1NlbGVjdGlvblxuXG4gICAgcmVjdFdpZHRoID0gQGcuem9vbWVyLmdldCBcImJveFJlY3RXaWR0aFwiXG4gICAgcmVjdEhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJib3hSZWN0SGVpZ2h0XCJcbiAgICBtYXhIZWlnaHQgPSByZWN0SGVpZ2h0ICogQG1vZGVsLmxlbmd0aFxuICAgIEBjdHguZmlsbFN0eWxlID0gXCIjZmZmZjAwXCJcbiAgICBAY3R4Lmdsb2JhbEFscGhhID0gMC45XG4gICAgZm9yIGkgaW4gWzAuLiBAZy5zZWxjb2wubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgc2VsID0gQGcuc2VsY29sLmF0KGkpXG4gICAgICBpZiBzZWwuZ2V0KCd0eXBlJykgaXMgJ2NvbHVtbidcbiAgICAgICAgQGN0eC5maWxsUmVjdCByZWN0V2lkdGggKiBzZWwuZ2V0KCd4U3RhcnQnKSwwLHJlY3RXaWR0aCAqXG4gICAgICAgIChzZWwuZ2V0KCd4RW5kJykgLSBzZWwuZ2V0KCd4U3RhcnQnKSArIDEpLG1heEhlaWdodFxuICAgICAgZWxzZSBpZiBzZWwuZ2V0KCd0eXBlJykgaXMgJ3JvdydcbiAgICAgICAgc2VxID0gKEBtb2RlbC5maWx0ZXIgKGVsKSAtPiBlbC5nZXQoJ2lkJykgaXMgc2VsLmdldCgnc2VxSWQnKSlbMF1cbiAgICAgICAgcG9zID0gQG1vZGVsLmluZGV4T2Yoc2VxKVxuICAgICAgICBAY3R4LmZpbGxSZWN0IDAscmVjdEhlaWdodCAqIHBvcywgcmVjdFdpZHRoICogc2VxLmdldCgnc2VxJykubGVuZ3RoLCByZWN0SGVpZ2h0XG4gICAgICBlbHNlIGlmIHNlbC5nZXQoJ3R5cGUnKSBpcyAncG9zJ1xuICAgICAgICBzZXEgPSAoQG1vZGVsLmZpbHRlciAoZWwpIC0+IGVsLmdldCgnaWQnKSBpcyBzZWwuZ2V0KCdzZXFJZCcpKVswXVxuICAgICAgICBwb3MgPSBAbW9kZWwuaW5kZXhPZihzZXEpXG4gICAgICAgIEBjdHguZmlsbFJlY3QgcmVjdFdpZHRoICogc2VsLmdldCgneFN0YXJ0JykscmVjdEhlaWdodCAqIHBvcywgcmVjdFdpZHRoICogKHNlbC5nZXQoJ3hFbmQnKSAtIHNlbC5nZXQoJ3hTdGFydCcpICsgMSksIHJlY3RIZWlnaHRcblxuICAgIEBjdHguZ2xvYmFsQWxwaGEgPSAxXG5cbiAgX29uY2xpY2s6IChldnQpIC0+XG4gICAgQGcudHJpZ2dlciBcIm1ldGE6Y2xpY2tcIiwge3NlcUlkOiBAbW9kZWwuZ2V0IFwiaWRcIiwgZXZ0OmV2dH1cblxuICBfb25tb3VzZW1vdmU6IChlKSAtPlxuICAgICMgZHVwbGljYXRlIGV2ZW50c1xuICAgIHJldHVybiBpZiBAZHJhZ1N0YXJ0Lmxlbmd0aCBpcyAwXG5cbiAgICBAcmVuZGVyKClcbiAgICBAY3R4LmZpbGxTdHlsZSA9IFwiI2ZmZmYwMFwiXG4gICAgQGN0eC5nbG9iYWxBbHBoYSA9IDAuOVxuXG4gICAgcmVjdCA9IEBfY2FsY1NlbGVjdGlvbiggbW91c2UuYWJzIGUgKVxuICAgIEBjdHguZmlsbFJlY3QgcmVjdFswXVswXSxyZWN0WzFdWzBdLHJlY3RbMF1bMV0gLSByZWN0WzBdWzBdLCByZWN0WzFdWzFdIC0gcmVjdFsxXVswXVxuXG4gICAgIyBhYm9ydCBzZWxlY3Rpb24gZXZlbnRzIG9mIHRoZSBicm93c2VyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICMgc3RhcnQgdGhlIHNlbGVjdGlvbiBtb2RlXG4gIF9vbm1vdXNlZG93bjogKGUpIC0+XG4gICAgQGRyYWdTdGFydCA9IG1vdXNlLmFicyBlXG4gICAgQGRyYWdTdGFydFJlbCA9IG1vdXNlLnJlbCBlXG5cbiAgICBpZiBlLmN0cmxLZXkgb3IgZS5tZXRhS2V5XG4gICAgICBAcHJvbG9uZ1NlbGVjdGlvbiA9IHRydWVcbiAgICBlbHNlXG4gICAgICBAcHJvbG9uZ1NlbGVjdGlvbiA9IGZhbHNlXG4gICAgIyBlbmFibGUgZ2xvYmFsIGxpc3RlbmVyc1xuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9uICdtb3VzZW1vdmUub3Zlcm1vdmUnLCAoZSkgPT4gQF9vbm1vdXNlbW92ZShlKVxuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9uICdtb3VzZXVwLm92ZXJ1cCcsIChlKSA9PiBAX29ubW91c2V1cChlKVxuICAgIHJldHVybiBAZHJhZ1N0YXJ0XG5cbiAgIyBjYWxjdWxhdGVzIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICBfY2FsY1NlbGVjdGlvbjogKGRyYWdNb3ZlKSAtPlxuICAgICMgcmVsYXRpdmUgdG8gZmlyc3QgY2xpY2tcbiAgICBkcmFnUmVsID0gW2RyYWdNb3ZlWzBdIC0gQGRyYWdTdGFydFswXSwgZHJhZ01vdmVbMV0gLSBAZHJhZ1N0YXJ0WzFdXVxuXG4gICAgIyByZWxhdGl2ZSB0byB0YXJnZXRcbiAgICBmb3IgaSBpbiBbMC4uMV0gYnkgMVxuICAgICAgZHJhZ1JlbFtpXSA9IEBkcmFnU3RhcnRSZWxbaV0gKyBkcmFnUmVsW2ldXG5cbiAgICAjIDA6eCwgMTogeVxuICAgIHJlY3QgPSBbW0BkcmFnU3RhcnRSZWxbMF0sIGRyYWdSZWxbMF1dLCBbQGRyYWdTdGFydFJlbFsxXSwgZHJhZ1JlbFsxXV1dXG5cbiAgICAjIHN3YXAgdGhlIGNvb3JkaW5hdGVzIGlmIG5lZWRlZFxuICAgIGZvciBpIGluIFswLi4xXSBieSAxXG4gICAgICBpZiByZWN0W2ldWzFdIDwgcmVjdFtpXVswXVxuICAgICAgICByZWN0W2ldID0gW3JlY3RbaV1bMV0sIHJlY3RbaV1bMF1dXG5cbiAgICAgICMgbG93ZXIgbGltaXRcbiAgICAgIHJlY3RbaV1bMF0gPSBNYXRoLm1heCByZWN0W2ldWzBdLCAwXG5cbiAgICByZXR1cm4gcmVjdFxuXG4gIF9lbmRTZWxlY3Rpb246IChkcmFnRW5kKSAtPlxuICAgICMgcmVtb3ZlIGxpc3RlbmVyc1xuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9mZignLm92ZXJtb3ZlJylcbiAgICBqYm9uZShkb2N1bWVudC5ib2R5KS5vZmYoJy5vdmVydXAnKVxuXG4gICAgIyBkdXBsaWNhdGUgZXZlbnRzXG4gICAgcmV0dXJuIGlmIEBkcmFnU3RhcnQubGVuZ3RoIGlzIDBcblxuICAgIHJlY3QgPSBAX2NhbGNTZWxlY3Rpb24gZHJhZ0VuZFxuXG4gICAgIyB4XG4gICAgZm9yIGkgaW4gWzAuLjFdXG4gICAgICByZWN0WzBdW2ldID0gTWF0aC5mbG9vciggcmVjdFswXVtpXSAvIEBnLnpvb21lci5nZXQoXCJib3hSZWN0V2lkdGhcIikpXG5cbiAgICAjIHlcbiAgICBmb3IgaSBpbiBbMC4uMV1cbiAgICAgIHJlY3RbMV1baV0gPSBNYXRoLmZsb29yKCByZWN0WzFdW2ldIC8gQGcuem9vbWVyLmdldChcImJveFJlY3RIZWlnaHRcIikgKVxuXG4gICAgIyB1cHBlciBsaW1pdFxuICAgIHJlY3RbMF1bMV0gPSBNYXRoLm1pbihAbW9kZWwuZ2V0TWF4TGVuZ3RoKCkgLSAxLCByZWN0WzBdWzFdKVxuICAgIHJlY3RbMV1bMV0gPSBNYXRoLm1pbihAbW9kZWwubGVuZ3RoIC0gMSwgcmVjdFsxXVsxXSlcblxuICAgICMgc2VsZWN0XG4gICAgc2VsaXMgPSBbXVxuICAgIGZvciBqIGluIFtyZWN0WzFdWzBdLi5yZWN0WzFdWzFdXSBieSAxXG4gICAgICBhcmdzID0gc2VxSWQ6IEBtb2RlbC5hdChqKS5nZXQoJ2lkJyksIHhTdGFydDogcmVjdFswXVswXSwgeEVuZDogcmVjdFswXVsxXVxuICAgICAgc2VsaXMucHVzaCBuZXcgc2VsZWN0aW9uLnBvc3NlbCBhcmdzXG5cbiAgICAjIHJlc2V0XG4gICAgQGRyYWdTdGFydCA9IFtdXG4gICAgIyBsb29rIGZvciBjdHJsIGtleVxuICAgIGlmIEBwcm9sb25nU2VsZWN0aW9uXG4gICAgICBAZy5zZWxjb2wuYWRkIHNlbGlzXG4gICAgZWxzZVxuICAgICAgQGcuc2VsY29sLnJlc2V0IHNlbGlzXG5cbiAgICAjIHNhZmV0eSBjaGVjayArIHVwZGF0ZSBvZmZzZXRcbiAgICBAZy56b29tZXIuc2V0TGVmdE9mZnNldCByZWN0WzBdWzBdXG4gICAgQGcuem9vbWVyLnNldFRvcE9mZnNldCByZWN0WzFdWzBdXG5cbiAgIyBlbmRzIHRoZSBzZWxlY3Rpb24gbW9kZVxuICBfb25tb3VzZXVwOiAoZSkgLT5cbiAgICBAX2VuZFNlbGVjdGlvbiBtb3VzZS5hYnMgZVxuXG4gIF9vbm1vdXNlb3V0OiAoZSkgLT5cbiAgICBAX2VuZFNlbGVjdGlvbiBtb3VzZS5hYnMgZVxuXG4gIyBpbml0IHRoZSBjYW52YXNcbiAgX2NyZWF0ZUNhbnZhczogLT5cbiAgICByZWN0V2lkdGggPSBAZy56b29tZXIuZ2V0IFwiYm94UmVjdFdpZHRoXCJcbiAgICByZWN0SGVpZ2h0ID0gQGcuem9vbWVyLmdldCBcImJveFJlY3RIZWlnaHRcIlxuXG4gICAgQGVsLmhlaWdodCA9IEBtb2RlbC5sZW5ndGggKiByZWN0SGVpZ2h0XG4gICAgQGVsLndpZHRoID0gQG1vZGVsLmdldE1heExlbmd0aCgpICogcmVjdFdpZHRoXG4gICAgQGN0eCA9IEBlbC5nZXRDb250ZXh0IFwiMmRcIlxuICAgIEBlbC5zdHlsZS5vdmVyZmxvdyA9IFwic2Nyb2xsXCJcbiAgICBAZWwuc3R5bGUuY3Vyc29yID0gXCJjcm9zc2hhaXJcIlxuIiwiYm9uZVZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtY2hpbGRzXCIpXG5BbGlnbm1lbnRCb2R5ID0gcmVxdWlyZSBcIi4vQWxpZ25tZW50Qm9keVwiXG5IZWFkZXJCbG9jayA9IHJlcXVpcmUgXCIuL2hlYWRlci9IZWFkZXJCbG9ja1wiXG5PdmVydmlld0JveCA9IHJlcXVpcmUgXCIuL092ZXJ2aWV3Qm94XCJcbmlkZW50aXR5Q2FsYyA9IHJlcXVpcmUgXCIuLi9hbGdvL2lkZW50aXR5Q2FsY1wiXG5fID0gcmVxdWlyZSAndW5kZXJzY29yZSdcblxuIyBhIG5lYXQgY29sbGVjdGlvbiB2aWV3XG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG5cbiAgICBAZHJhdygpXG4gICAgQGxpc3RlblRvIEBtb2RlbCxcInJlc2V0XCIsIC0+XG4gICAgICBAaXNOb3REaXJ0eSA9IGZhbHNlXG4gICAgICBAcmVyZW5kZXIoKVxuXG4gICAgIyBkZWJvdW5jZSBhIGJ1bGsgb3BlcmF0aW9uXG4gICAgQGxpc3RlblRvIEBtb2RlbCxcImNoYW5nZTpoaWRkZW5cIiwgXy5kZWJvdW5jZSBAcmVyZW5kZXIsIDEwXG5cbiAgICBAbGlzdGVuVG8gQG1vZGVsLFwic29ydFwiLCBAcmVyZW5kZXJcbiAgICBAbGlzdGVuVG8gQG1vZGVsLFwiYWRkXCIsIC0+XG4gICAgICBjb25zb2xlLmxvZyBcInNlcSBhZGRcIlxuXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZTpzZXF1ZW5jZXNcIiwgQHJlcmVuZGVyXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZTpvdmVydmlld2JveFwiLCBAcmVyZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcudmlzb3JkZXIsXCJjaGFuZ2VcIiwgQHJlcmVuZGVyXG5cbiAgZHJhdzogLT5cbiAgICBAcmVtb3ZlVmlld3MoKVxuXG4gICAgdW5sZXNzIEBpc05vdERpcnR5XG4gICAgICAjIG9ubHkgZXhlY3V0ZWQgd2hlbiBuZXcgc2VxdWVuY2VzIGFyZSBhZGRlZCBvciBvbiBzdGFydFxuICAgICAgY29uc2Vuc3VzID0gQGcuY29uc2Vuc3VzLmdldENvbnNlbnN1cyBAbW9kZWxcbiAgICAgIGlkZW50aXR5Q2FsYyBAbW9kZWwsIGNvbnNlbnN1c1xuICAgICAgQGlzTm90RGlydHkgPSB0cnVlXG5cbiAgICBpZiBAZy52aXMuZ2V0IFwib3ZlcnZpZXdib3hcIlxuICAgICAgb3ZlcnZpZXdib3ggPSBuZXcgT3ZlcnZpZXdCb3gge21vZGVsOiBAbW9kZWwsIGc6IEBnfVxuICAgICAgb3ZlcnZpZXdib3gub3JkZXJpbmcgPSBAZy52aXNvcmRlci5nZXQgJ292ZXJ2aWV3Qm94J1xuICAgICAgQGFkZFZpZXcgXCJvdmVydmlld2JveFwiLG92ZXJ2aWV3Ym94XG5cbiAgICBpZiB0cnVlXG4gICAgICBoZWFkZXJibG9jayA9IG5ldyBIZWFkZXJCbG9jayB7bW9kZWw6IEBtb2RlbCwgZzogQGd9XG4gICAgICBoZWFkZXJibG9jay5vcmRlcmluZyA9IEBnLnZpc29yZGVyLmdldCAnaGVhZGVyQm94J1xuICAgICAgQGFkZFZpZXcgXCJoZWFkZXJibG9ja1wiLGhlYWRlcmJsb2NrXG5cbiAgICBib2R5ID0gbmV3IEFsaWdubWVudEJvZHkge21vZGVsOiBAbW9kZWwsIGc6IEBnfVxuICAgIGJvZHkub3JkZXJpbmcgPSBAZy52aXNvcmRlci5nZXQgJ2FsaWdubWVudEJvZHknXG4gICAgQGFkZFZpZXcgXCJib2R5XCIsYm9keVxuXG4gIHJlbmRlcjogLT5cbiAgICBAcmVuZGVyU3Vidmlld3MoKVxuICAgIEBlbC5jbGFzc05hbWUgPSBcImJpb2pzX21zYV9zdGFnZVwiXG4gICAgQFxuXG4gIHJlcmVuZGVyOiAtPlxuICAgIEBkcmF3KClcbiAgICBAcmVuZGVyKClcbiIsInZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtdmlld2pcIilcbmRvbSA9IHJlcXVpcmUoXCJkb20taGVscGVyXCIpXG5zdmcgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHMvc3ZnXCIpXG5cbkNvbnNlcnZhdGlvblZpZXcgPSB2aWV3LmV4dGVuZFxuXG4gIGNsYXNzTmFtZTogXCJiaW9qc19tc2FfY29uc2VydlwiXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAbGlzdGVuVG8gQGcuem9vbWVyLFwiY2hhbmdlOnN0ZXBTaXplIGNoYW5nZTpsYWJlbFdpZHRoIGNoYW5nZTpjb2x1bW5XaWR0aFwiLCBAcmVuZGVyXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZTpsYWJlbHMgY2hhbmdlOm1ldGFjZWxsXCIsIEByZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcuY29sdW1ucywgXCJjaGFuZ2U6c2NhbGluZ1wiLCBAcmVuZGVyXG4gICAgQGxpc3RlblRvIEBtb2RlbCwgXCJyZXNldFwiLEByZW5kZXJcbiAgICBAbWFuYWdlRXZlbnRzKClcblxuICByZW5kZXI6IC0+XG4gICAgQGcuY29sdW1ucy5jYWxjQ29uc2VydmF0aW9uIEBtb2RlbFxuXG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcblxuICAgIG5NYXggPSBAbW9kZWwuZ2V0TWF4TGVuZ3RoKClcbiAgICBjZWxsV2lkdGggPSBAZy56b29tZXIuZ2V0IFwiY29sdW1uV2lkdGhcIlxuICAgIG1heEhlaWdodCA9IDIwXG4gICAgd2lkdGggPSBjZWxsV2lkdGggKiAobk1heCAtIEBnLmNvbHVtbnMuZ2V0KCdoaWRkZW4nKS5sZW5ndGgpXG4gICAgY29uc29sZS5sb2cgQGcuY29sdW1ucy5nZXQoJ2hpZGRlbicpXG5cbiAgICBzID0gc3ZnLmJhc2UgaGVpZ2h0OiBtYXhIZWlnaHQsIHdpZHRoOiB3aWR0aFxuICAgIHMuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICBzLnN0eWxlLmN1cnNvciA9IFwicG9pbnRlclwiXG5cbiAgICBzdGVwU2l6ZSA9IEBnLnpvb21lci5nZXQgXCJzdGVwU2l6ZVwiXG4gICAgaGlkZGVuID0gQGcuY29sdW1ucy5nZXQgXCJoaWRkZW5cIlxuICAgIHggPSAwXG4gICAgbiA9IDBcbiAgICB3aGlsZSBuIDwgbk1heFxuICAgICAgaWYgaGlkZGVuLmluZGV4T2YobikgPj0gMFxuICAgICAgICBuICs9IHN0ZXBTaXplXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB3aWR0aCA9IGNlbGxXaWR0aCAqIHN0ZXBTaXplXG4gICAgICBhdmdIZWlnaHQgPSAwXG4gICAgICBmb3IgaSBpbiBbMCAuLiBzdGVwU2l6ZSAtIDFdXG4gICAgICAgIGF2Z0hlaWdodCArPSBAZy5jb2x1bW5zLmdldChcImNvbnNlcnZcIilbbl1cbiAgICAgIGhlaWdodCA9IG1heEhlaWdodCAqICAoYXZnSGVpZ2h0IC8gc3RlcFNpemUpXG5cbiAgICAgIHJlY3QgPSAgc3ZnLnJlY3QgeDp4LHk6IG1heEhlaWdodCAtIGhlaWdodCx3aWR0aDp3aWR0aCAtIGNlbGxXaWR0aCAvIDQsaGVpZ2h0OmhlaWdodCxzdHlsZTpcbiAgICAgICAgXCJzdHJva2U6cmVkO3N0cm9rZS13aWR0aDoxO1wiXG4gICAgICByZWN0LnJvd1BvcyA9IG5cbiAgICAgIHMuYXBwZW5kQ2hpbGQgcmVjdFxuICAgICAgeCArPSB3aWR0aFxuICAgICAgbiArPSBzdGVwU2l6ZVxuXG4gICAgQGVsLmFwcGVuZENoaWxkIHNcbiAgICBAXG5cbiAgI1RPRE86IG1ha2UgbW9yZSBnZW5lcmFsIHdpdGggSGVhZGVyVmlld1xuICBfb25jbGljazogKGV2dCkgLT5cbiAgICByb3dQb3MgPSBldnQudGFyZ2V0LnJvd1Bvc1xuICAgIHN0ZXBTaXplID0gQGcuem9vbWVyLmdldChcInN0ZXBTaXplXCIpXG4gICAgIyBzaW11bGF0ZSBoaWRkZW4gY29sdW1uc1xuICAgIGZvciBpIGluIFswLi5zdGVwU2l6ZSAtIDFdIGJ5IDFcbiAgICAgIEBnLnRyaWdnZXIgXCJiYXI6Y2xpY2tcIiwge3Jvd1Bvczogcm93UG9zICsgaSwgZXZ0OmV2dH1cblxuICBtYW5hZ2VFdmVudHM6IC0+XG4gICAgZXZlbnRzID0ge31cbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUNsaWNrc1wiXG4gICAgICBldmVudHMuY2xpY2sgPSBcIl9vbmNsaWNrXCJcbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUhvdmVyXCJcbiAgICAgIGV2ZW50cy5tb3VzZWluID0gXCJfb25tb3VzZWluXCJcbiAgICAgIGV2ZW50cy5tb3VzZW91dCA9IFwiX29ubW91c2VvdXRcIlxuICAgIEBkZWxlZ2F0ZUV2ZW50cyBldmVudHNcbiAgICBAbGlzdGVuVG8gQGcuY29uZmlnLCBcImNoYW5nZTpyZWdpc3Rlck1vdXNlSG92ZXJcIiwgQG1hbmFnZUV2ZW50c1xuICAgIEBsaXN0ZW5UbyBAZy5jb25maWcsIFwiY2hhbmdlOnJlZ2lzdGVyTW91c2VDbGlja1wiLCBAbWFuYWdlRXZlbnRzXG5cbiAgX29ubW91c2VpbjogKGV2dCkgLT5cbiAgICByb3dQb3MgPSBAZy56b29tZXIuZ2V0IFwic3RlcFNpemVcIiAqIGV2dC5yb3dQb3NcbiAgICBAZy50cmlnZ2VyIFwiYmFyOm1vdXNlaW5cIiwge3Jvd1Bvczogcm93UG9zLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlb3V0OiAoZXZ0KSAtPlxuICAgIHJvd1BvcyA9IEBnLnpvb21lci5nZXQgXCJzdGVwU2l6ZVwiICogZXZ0LnJvd1Bvc1xuICAgIEBnLnRyaWdnZXIgXCJiYXI6bW91c2VvdXRcIiwge3Jvd1Bvczogcm93UG9zLCBldnQ6ZXZ0fVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnNlcnZhdGlvblZpZXdcbiIsIk1hcmtlclZpZXcgPSByZXF1aXJlIFwiLi9NYXJrZXJWaWV3XCJcbkNvbnNlcnZhdGlvblZpZXcgPSByZXF1aXJlIFwiLi9Db25zZXJ2YXRpb25WaWV3XCJcbmlkZW50aXR5Q2FsYyA9IHJlcXVpcmUgXCIuLi8uLi9hbGdvL2lkZW50aXR5Q2FsY1wiXG5ib25lVmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS1jaGlsZHNcIilcbl8gPSByZXF1aXJlICd1bmRlcnNjb3JlJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGJsb2NrRXZlbnRzID0gZmFsc2VcblxuICAgIEBsaXN0ZW5UbyBAZy52aXMsXCJjaGFuZ2U6bWFya2VycyBjaGFuZ2U6Y29uc2VydlwiLCAtPlxuICAgICAgQGRyYXcoKVxuICAgICAgQHJlbmRlcigpXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZVwiLCBAX3NldFNwYWNlclxuICAgIEBsaXN0ZW5UbyBAZy56b29tZXIsXCJjaGFuZ2U6YWxpZ25tZW50V2lkdGhcIiwgLT5cbiAgICAgIEBfYWRqdXN0V2lkdGgoKVxuICAgIEBsaXN0ZW5UbyBAZy56b29tZXIsIFwiY2hhbmdlOl9hbGlnbm1lbnRTY3JvbGxMZWZ0XCIsIEBfYWRqdXN0U2Nyb2xsaW5nTGVmdFxuXG4gICAgIyBUT0RPOiBkdXBsaWNhdGUgcmVuZGVyaW5nXG4gICAgQGxpc3RlblRvIEBnLmNvbHVtbnMsIFwiY2hhbmdlOmhpZGRlblwiLCAtPlxuICAgICAgQGRyYXcoKVxuICAgICAgQHJlbmRlcigpXG5cbiAgICBAZHJhdygpXG4gICAgQF9vbnNjcm9sbCA9IEBfc2VuZFNjcm9sbEV2ZW50XG5cbiAgICBAZy52aXMub25jZSAnY2hhbmdlOmxvYWRlZCcsIEBfYWRqdXN0U2Nyb2xsaW5nTGVmdCwgQFxuXG4gIGV2ZW50czpcbiAgICBcInNjcm9sbFwiOiBcIl9vbnNjcm9sbFwiXG5cbiAgZHJhdzogLT5cbiAgICBAcmVtb3ZlVmlld3MoKVxuXG4gICAgdW5sZXNzIEBpc05vdERpcnR5XG4gICAgICAjIG9ubHkgZXhlY3V0ZWQgd2hlbiBuZXcgc2VxdWVuY2VzIGFyZSBhZGRlZCBvciBvbiBzdGFydFxuICAgICAgY29uc2Vuc3VzID0gQGcuY29uc2Vuc3VzLmdldENvbnNlbnN1cyBAbW9kZWxcbiAgICAgIGlkZW50aXR5Q2FsYyBAbW9kZWwsIGNvbnNlbnN1c1xuICAgICAgQGlzTm90RGlydHkgPSB0cnVlXG5cbiAgICBpZiBAZy52aXMuZ2V0IFwiY29uc2VydlwiXG4gICAgICBjb25zZXJ2ID0gbmV3IENvbnNlcnZhdGlvblZpZXcge21vZGVsOiBAbW9kZWwsIGc6IEBnfVxuICAgICAgY29uc2Vydi5vcmRlcmluZyA9IC0yMFxuICAgICAgQGFkZFZpZXcgXCJjb25zZXJ2XCIsY29uc2VydlxuXG4gICAgaWYgQGcudmlzLmdldCBcIm1hcmtlcnNcIlxuICAgICAgbWFya2VyID0gbmV3IE1hcmtlclZpZXcge21vZGVsOiBAbW9kZWwsIGc6IEBnfVxuICAgICAgbWFya2VyLm9yZGVyaW5nID0gLTEwXG4gICAgICBAYWRkVmlldyBcIm1hcmtlclwiLG1hcmtlclxuXG4gIHJlbmRlcjogLT5cbiAgICBAcmVuZGVyU3Vidmlld3MoKVxuXG4gICAgQF9zZXRTcGFjZXIoKVxuXG4gICAgQGVsLmNsYXNzTmFtZSA9IFwiYmlvanNfbXNhX2hlYWRlclwiXG4gICAgQGVsLnN0eWxlLm92ZXJmbG93WCA9IFwiYXV0b1wiXG4gICAgQF9hZGp1c3RXaWR0aCgpXG4gICAgQF9hZGp1c3RTY3JvbGxpbmdMZWZ0KClcbiAgICBAXG5cbiAgIyBzY3JvbGxMZWZ0IHRyaWdnZXJzIGEgcmVmbG93IG9mIHRoZSB3aG9sZSBhcmVhIChldmVuIG9ubHkgZ2V0KVxuICBfc2VuZFNjcm9sbEV2ZW50OiAtPlxuICAgIHVubGVzcyBAYmxvY2tFdmVudHNcbiAgICAgIEBnLnpvb21lci5zZXQgXCJfYWxpZ25tZW50U2Nyb2xsTGVmdFwiLCBAZWwuc2Nyb2xsTGVmdCwge29yaWdpbjogXCJoZWFkZXJcIn1cbiAgICBAYmxvY2tFdmVudHMgPSBmYWxzZVxuXG4gIF9hZGp1c3RTY3JvbGxpbmdMZWZ0OiAobW9kZWwsdmFsdWUsb3B0aW9ucykgLT5cbiAgICBpZiAobm90IG9wdGlvbnM/Lm9yaWdpbj8pIG9yIG9wdGlvbnMub3JpZ2luIGlzbnQgXCJoZWFkZXJcIlxuICAgICAgc2Nyb2xsTGVmdCA9IEBnLnpvb21lci5nZXQgXCJfYWxpZ25tZW50U2Nyb2xsTGVmdFwiXG4gICAgICBAYmxvY2tFdmVudHMgPSB0cnVlXG4gICAgICBAZWwuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnRcblxuICBfc2V0U3BhY2VyOiAtPlxuICAgICMgc3BhY2VyIC8gcGFkZGluZyBlbGVtZW50XG4gICAgQGVsLnN0eWxlLm1hcmdpbkxlZnQgPSBAX2dldExhYmVsV2lkdGgoKSArIFwicHhcIlxuXG4gIF9nZXRMYWJlbFdpZHRoOiAtPlxuICAgIHBhZGRpbmdMZWZ0ID0gMFxuICAgIHBhZGRpbmdMZWZ0ICs9IEBnLnpvb21lci5nZXQgXCJsYWJlbFdpZHRoXCIgaWYgQGcudmlzLmdldCBcImxhYmVsc1wiXG4gICAgcGFkZGluZ0xlZnQgKz0gQGcuem9vbWVyLmdldCBcIm1ldGFXaWR0aFwiIGlmIEBnLnZpcy5nZXQgXCJtZXRhY2VsbFwiXG4gICAgcmV0dXJuIHBhZGRpbmdMZWZ0XG5cbiAgX2FkanVzdFdpZHRoOiAtPlxuICAgIEBlbC5zdHlsZS53aWR0aCA9IEBnLnpvb21lci5nZXQoXCJhbGlnbm1lbnRXaWR0aFwiKSArIFwicHhcIlxuIiwidmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS12aWV3alwiKVxuZG9tID0gcmVxdWlyZShcImRvbS1oZWxwZXJcIilcbnN2ZyA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9zdmdcIilcbmpib25lID0gcmVxdWlyZSBcImpib25lXCJcblxuSGVhZGVyVmlldyA9IHZpZXcuZXh0ZW5kXG5cbiAgY2xhc3NOYW1lOiBcImJpb2pzX21zYV9tYXJrZXJcIlxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGxpc3RlblRvIEBnLnpvb21lcixcImNoYW5nZTpzdGVwU2l6ZSBjaGFuZ2U6bGFiZWxXaWR0aCBjaGFuZ2U6Y29sdW1uV2lkdGggY2hhbmdlOm1hcmtlclN0ZXBTaXplIGNoYW5nZTptYXJrZXJGb250c2l6ZVwiLCBAcmVuZGVyXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZTpsYWJlbHMgY2hhbmdlOm1ldGFjZWxsXCIsIEByZW5kZXJcbiAgICBAbWFuYWdlRXZlbnRzKClcblxuICByZW5kZXI6IC0+XG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcblxuICAgIEBlbC5zdHlsZS5mb250U2l6ZSA9IEBnLnpvb21lci5nZXQgXCJtYXJrZXJGb250c2l6ZVwiXG5cbiAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwic3BhblwiXG4gICAgbiA9IDBcbiAgICBjZWxsV2lkdGggPSBAZy56b29tZXIuZ2V0IFwiY29sdW1uV2lkdGhcIlxuXG4gICAgbk1heCA9IEBtb2RlbC5nZXRNYXhMZW5ndGgoKVxuICAgIHN0ZXBTaXplID0gQGcuem9vbWVyLmdldChcInN0ZXBTaXplXCIpXG4gICAgaGlkZGVuID0gQGcuY29sdW1ucy5nZXQgXCJoaWRkZW5cIlxuXG4gICAgd2hpbGUgbiA8IG5NYXhcbiAgICAgIGlmIGhpZGRlbi5pbmRleE9mKG4pID49IDBcbiAgICAgICAgQG1hcmtlckhpZGRlbihzcGFuLG4sIHN0ZXBTaXplKVxuICAgICAgICBuICs9IHN0ZXBTaXplXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBcInNwYW5cIlxuICAgICAgc3Bhbi5zdHlsZS53aWR0aCA9IChjZWxsV2lkdGggKiBzdGVwU2l6ZSkgKyBcInB4XCJcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICAgICMgVE9ETzogdGhpcyBkb2Vzbid0IHdvcmsgZm9yIGEgbGFyZ2VyIHN0ZXBTaXplXG4gICAgICBpZiAobiArIDEpICUgQGcuem9vbWVyLmdldCgnbWFya2VyU3RlcFNpemUnKSBpcyAwXG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSAobiArIDEpXG4gICAgICBlbHNlXG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBcIi5cIlxuICAgICAgc3Bhbi5yb3dQb3MgPSBuXG5cbiAgICAgIG4gKz0gc3RlcFNpemVcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCBzcGFuXG5cbiAgICBAZWwuYXBwZW5kQ2hpbGQgY29udGFpbmVyXG4gICAgQFxuXG4gIG1hcmtlckhpZGRlbjogKHNwYW4sbixzdGVwU2l6ZSkgLT5cbiAgICBoaWRkZW4gPSBAZy5jb2x1bW5zLmdldChcImhpZGRlblwiKS5zbGljZSAwXG5cbiAgICBtaW4gPSBNYXRoLm1heCAwLCBuIC0gc3RlcFNpemVcbiAgICBwcmV2SGlkZGVuID0gdHJ1ZVxuICAgIGZvciBqIGluICBbbWluIC4uIG5dIGJ5IDFcbiAgICAgIHByZXZIaWRkZW4gJj0gaGlkZGVuLmluZGV4T2YoaikgPj0gMFxuXG4gICAgIyBmaWx0ZXIgZHVwbGljYXRlc1xuICAgIHJldHVybiBpZiBwcmV2SGlkZGVuXG5cbiAgICBuTWF4ID0gQG1vZGVsLmdldE1heExlbmd0aCgpXG5cbiAgICBsZW5ndGggPSAwXG4gICAgaW5kZXggPSAtMVxuICAgICMgYWNjdW1sYXRlIG11bHRpcGxlIHJvd3NcbiAgICBmb3IgbiBpbiBbbi4ubk1heF0gYnkgMVxuICAgICAgaW5kZXggPSBoaWRkZW4uaW5kZXhPZihuKSB1bmxlc3MgaW5kZXggPj0gMCMgc2V0cyB0aGUgZmlyc3QgaW5kZXhcbiAgICAgIGlmIGhpZGRlbi5pbmRleE9mKG4pID49IDBcbiAgICAgICAgbGVuZ3RoKytcbiAgICAgIGVsc2VcbiAgICAgICAgYnJlYWtcblxuICAgIHMgPSBzdmcuYmFzZSBoZWlnaHQ6IDEwLCB3aWR0aDogMTBcbiAgICBzLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiXG4gICAgdHJpYW5nbGUgPSBzdmcucG9seWdvbiBwb2ludHM6IFwiMCwwIDUsNSAxMCwwXCIsIHN0eWxlOlxuICAgICAgXCJmaWxsOmxpbWU7c3Ryb2tlOnB1cnBsZTtzdHJva2Utd2lkdGg6MVwiXG4gICAgamJvbmUodHJpYW5nbGUpLm9uIFwiY2xpY2tcIiwgKGV2dCkgPT5cbiAgICAgIGhpZGRlbi5zcGxpY2UgaW5kZXgsIGxlbmd0aFxuICAgICAgQGcuY29sdW1ucy5zZXQgXCJoaWRkZW5cIiwgaGlkZGVuXG5cbiAgICBzLmFwcGVuZENoaWxkIHRyaWFuZ2xlXG4gICAgc3Bhbi5hcHBlbmRDaGlsZCBzXG4gICAgcmV0dXJuIHNcblxuICBtYW5hZ2VFdmVudHM6IC0+XG4gICAgZXZlbnRzID0ge31cbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUNsaWNrc1wiXG4gICAgICBldmVudHMuY2xpY2sgPSBcIl9vbmNsaWNrXCJcbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUhvdmVyXCJcbiAgICAgIGV2ZW50cy5tb3VzZWluID0gXCJfb25tb3VzZWluXCJcbiAgICAgIGV2ZW50cy5tb3VzZW91dCA9IFwiX29ubW91c2VvdXRcIlxuICAgIEBkZWxlZ2F0ZUV2ZW50cyBldmVudHNcbiAgICBAbGlzdGVuVG8gQGcuY29uZmlnLCBcImNoYW5nZTpyZWdpc3Rlck1vdXNlSG92ZXJcIiwgQG1hbmFnZUV2ZW50c1xuICAgIEBsaXN0ZW5UbyBAZy5jb25maWcsIFwiY2hhbmdlOnJlZ2lzdGVyTW91c2VDbGlja1wiLCBAbWFuYWdlRXZlbnRzXG5cbiAgX29uY2xpY2s6IChldnQpIC0+XG4gICAgcm93UG9zID0gZXZ0LnRhcmdldC5yb3dQb3NcbiAgICBzdGVwU2l6ZSA9IEBnLnpvb21lci5nZXQoXCJzdGVwU2l6ZVwiKVxuICAgIEBnLnRyaWdnZXIgXCJjb2x1bW46Y2xpY2tcIiwge3Jvd1Bvczogcm93UG9zLHN0ZXBTaXplOiBzdGVwU2l6ZSwgZXZ0OmV2dH1cblxuICBfb25tb3VzZWluOiAoZXZ0KSAtPlxuICAgIHJvd1BvcyA9IEBnLnpvb21lci5nZXQgXCJzdGVwU2l6ZVwiICogZXZ0LnJvd1Bvc1xuICAgIHN0ZXBTaXplID0gQGcuem9vbWVyLmdldChcInN0ZXBTaXplXCIpXG4gICAgQGcudHJpZ2dlciBcImNvbHVtbjptb3VzZWluXCIsIHtyb3dQb3M6IHJvd1BvcyxzdGVwU2l6ZTogc3RlcFNpemUsIGV2dDpldnR9XG5cbiAgX29ubW91c2VvdXQ6IChldnQpIC0+XG4gICAgcm93UG9zID0gQGcuem9vbWVyLmdldCBcInN0ZXBTaXplXCIgKiBldnQucm93UG9zXG4gICAgc3RlcFNpemUgPSBAZy56b29tZXIuZ2V0KFwic3RlcFNpemVcIilcbiAgICBAZy50cmlnZ2VyIFwiY29sdW1uOm1vdXNlb3V0XCIsIHtyb3dQb3M6IHJvd1BvcyxzdGVwU2l6ZTogc3RlcFNpemUsIGV2dDpldnR9XG5cbm1vZHVsZS5leHBvcnRzID0gSGVhZGVyVmlld1xuIiwiTGFiZWxSb3dWaWV3ID0gcmVxdWlyZSBcIi4vTGFiZWxSb3dWaWV3XCJcbmJvbmVWaWV3ID0gcmVxdWlyZShcImJhY2tib25lLWNoaWxkc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGRyYXcoKVxuICAgIEBsaXN0ZW5UbyBAZy56b29tZXIsIFwiY2hhbmdlOl9hbGlnbm1lbnRTY3JvbGxUb3BcIiwgQF9hZGp1c3RTY3JvbGxpbmdUb3BcbiAgICBAZy52aXMub25jZSAnY2hhbmdlOmxvYWRlZCcsIEBfYWRqdXN0U2Nyb2xsaW5nVG9wICwgQFxuXG4gIGRyYXc6IC0+XG4gICAgQHJlbW92ZVZpZXdzKClcbiAgICBmb3IgaSBpbiBbMC4uIEBtb2RlbC5sZW5ndGggLSAxXSBieSAxXG4gICAgICBjb250aW51ZSBpZiBAbW9kZWwuYXQoaSkuZ2V0KCdoaWRkZW4nKVxuICAgICAgdmlldyA9IG5ldyBMYWJlbFJvd1ZpZXcge21vZGVsOiBAbW9kZWwuYXQoaSksIGc6IEBnfVxuICAgICAgdmlldy5vcmRlcmluZyA9IGlcbiAgICAgIEBhZGRWaWV3IFwicm93XyN7aX1cIiwgdmlld1xuXG4gIGV2ZW50czpcbiAgICBcInNjcm9sbFwiOiBcIl9zZW5kU2Nyb2xsRXZlbnRcIlxuXG4gICMgYnJvYWRjYXN0IHRoZSBzY3JvbGxpbmcgZXZlbnQgKGJ5IHRoZSBzY3JvbGxiYXIpXG4gIF9zZW5kU2Nyb2xsRXZlbnQ6IC0+XG4gICAgQGcuem9vbWVyLnNldCBcIl9hbGlnbm1lbnRTY3JvbGxUb3BcIiwgQGVsLnNjcm9sbFRvcCwge29yaWdpbjogXCJsYWJlbFwifVxuXG4gICMgc2V0cyB0aGUgc2Nyb2xsaW5nIHByb3BlcnR5IChmcm9tIGFub3RoZXIgZXZlbnQgZS5nLiBkcmFnZ2luZylcbiAgX2FkanVzdFNjcm9sbGluZ1RvcDogLT5cbiAgICBAZWwuc2Nyb2xsVG9wID0gIEBnLnpvb21lci5nZXQgXCJfYWxpZ25tZW50U2Nyb2xsVG9wXCJcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICBAZWwuY2xhc3NOYW1lID0gXCJiaW9qc19tc2FfbGFiZWxibG9ja1wiXG4gICAgQGVsLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG4gICAgQGVsLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBcInRvcFwiXG4gICAgQGVsLnN0eWxlLmhlaWdodCA9ICBAZy56b29tZXIuZ2V0KFwiYWxpZ25tZW50SGVpZ2h0XCIpICsgXCJweFwiXG4gICAgQGVsLnN0eWxlLm92ZXJmbG93WSA9IFwiYXV0b1wiXG4gICAgQGVsLnN0eWxlLm92ZXJmbG93WCA9IFwiaGlkZGVuXCJcbiAgICBAZWwuc3R5bGUuZm9udFNpemUgPSBcIiN7QGcuem9vbWVyLmdldCBcImxhYmVsRm9udHNpemVcIn1cIlxuICAgIEBlbC5zdHlsZS5saW5lSGVpZ2h0ID0gXCIje0BnLnpvb21lci5nZXQgXCJsYWJlbExpbmVIZWlnaHRcIn1cIlxuICAgIEBcbiIsImJvbmVWaWV3ID0gcmVxdWlyZShcImJhY2tib25lLWNoaWxkc1wiKVxuTGFiZWxWaWV3ID0gcmVxdWlyZShcIi4vTGFiZWxWaWV3XCIpXG5NZXRhVmlldyA9IHJlcXVpcmUoXCIuL01ldGFWaWV3XCIpXG5cbm1vZHVsZS5leHBvcnRzID0gYm9uZVZpZXcuZXh0ZW5kXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAZHJhdygpXG5cbiAgICBAbGlzdGVuVG8gQGcudmlzLFwiY2hhbmdlOmxhYmVsc1wiLCBAZHJhd1JcbiAgICBAbGlzdGVuVG8gQGcudmlzLFwiY2hhbmdlOm1ldGFjZWxsXCIsIEBkcmF3UlxuXG4gIGRyYXc6IC0+XG4gICAgQHJlbW92ZVZpZXdzKClcbiAgICBpZiBAZy52aXMuZ2V0IFwibGFiZWxzXCJcbiAgICAgIEBhZGRWaWV3IFwibGFiZWxzXCIsIG5ldyBMYWJlbFZpZXcge21vZGVsOiBAbW9kZWwsIGc6QGd9XG4gICAgaWYgQGcudmlzLmdldCBcIm1ldGFjZWxsXCJcbiAgICAgIEBhZGRWaWV3IFwibWV0YWNlbGxcIiwgbmV3IE1ldGFWaWV3IHttb2RlbDogQG1vZGVsLCBnOkBnfVxuXG4gIGRyYXdSOiAtPlxuICAgIEBkcmF3KClcbiAgICBAcmVuZGVyKClcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICBAZWwuc2V0QXR0cmlidXRlIFwiY2xhc3NcIiwgXCJiaW9qc19tc2FfbGFiZWxyb3dcIlxuICAgIEBlbC5zdHlsZS5oZWlnaHQgPSBAZy56b29tZXIuZ2V0IFwicm93SGVpZ2h0XCJcbiAgICBAXG4iLCJ2aWV3ID0gcmVxdWlyZShcImJhY2tib25lLXZpZXdqXCIpXG5kb20gPSByZXF1aXJlIFwiZG9tLWhlbHBlclwiXG5cbkxhYmVsVmlldyA9IHZpZXcuZXh0ZW5kXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQHNlcSA9IGRhdGEuc2VxXG4gICAgQGcgPSBkYXRhLmdcblxuICAgIEBtYW5hZ2VFdmVudHMoKVxuXG4gIG1hbmFnZUV2ZW50czogLT5cbiAgICBldmVudHMgPSB7fVxuICAgIGlmIEBnLmNvbmZpZy5nZXQgXCJyZWdpc3Rlck1vdXNlQ2xpY2tzXCJcbiAgICAgIGV2ZW50cy5jbGljayA9IFwiX29uY2xpY2tcIlxuICAgIGlmIEBnLmNvbmZpZy5nZXQgXCJyZWdpc3Rlck1vdXNlSG92ZXJcIlxuICAgICAgZXZlbnRzLm1vdXNlaW4gPSBcIl9vbm1vdXNlaW5cIlxuICAgICAgZXZlbnRzLm1vdXNlb3V0ID0gXCJfb25tb3VzZW91dFwiXG4gICAgQGRlbGVnYXRlRXZlbnRzIGV2ZW50c1xuICAgIEBsaXN0ZW5UbyBAZy5jb25maWcsIFwiY2hhbmdlOnJlZ2lzdGVyTW91c2VIb3ZlclwiLCBAbWFuYWdlRXZlbnRzXG4gICAgQGxpc3RlblRvIEBnLmNvbmZpZywgXCJjaGFuZ2U6cmVnaXN0ZXJNb3VzZUNsaWNrXCIsIEBtYW5hZ2VFdmVudHNcbiAgICBAbGlzdGVuVG8gQGcudmlzLCBcImNoYW5nZTpsYWJlbE5hbWVcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy52aXMsIFwiY2hhbmdlOmxhYmVsSWRcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy52aXMsIFwiY2hhbmdlOmxhYmVsUGFydGl0aW9uXCIsIEByZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcudmlzLCBcImNoYW5nZTpsYWJlbENoZWNrYm94XCIsIEByZW5kZXJcblxuICByZW5kZXI6IC0+XG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcblxuICAgIEBlbC5zdHlsZS53aWR0aCA9IFwiI3tAZy56b29tZXIuZ2V0IFwibGFiZWxXaWR0aFwifXB4XCJcbiAgICBAZWwuc3R5bGUuaGVpZ2h0ID0gXCIje0BnLnpvb21lci5nZXQgXCJyb3dIZWlnaHRcIn1weFwiXG4gICAgQGVsLnNldEF0dHJpYnV0ZSBcImNsYXNzXCIsIFwiYmlvanNfbXNhX2xhYmVsc1wiXG5cbiAgICBpZiBALmcudmlzLmdldCBcImxhYmVsQ2hlY2tib3hcIlxuICAgICAgY2hlY2tCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwiaW5wdXRcIlxuICAgICAgY2hlY2tCb3guc2V0QXR0cmlidXRlIFwidHlwZVwiLCBcImNoZWNrYm94XCJcbiAgICAgIGNoZWNrQm94LnZhbHVlID0gQG1vZGVsLmdldCgnaWQnKVxuICAgICAgY2hlY2tCb3gubmFtZSA9IFwic2VxXCJcbiAgICAgIEBlbC5hcHBlbmRDaGlsZCBjaGVja0JveFxuXG4gICAgaWYgQC5nLnZpcy5nZXQgXCJsYWJlbElkXCJcbiAgICAgIGlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBcInNwYW5cIlxuICAgICAgaWQudGV4dENvbnRlbnQgPSBAbW9kZWwuZ2V0IFwiaWRcIlxuICAgICAgaWQuc3R5bGUud2lkdGggPSBAZy56b29tZXIuZ2V0IFwibGFiZWxJZExlbmd0aFwiXG4gICAgICBpZC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuICAgICAgQGVsLmFwcGVuZENoaWxkIGlkXG5cbiAgICBpZiBALmcudmlzLmdldCBcImxhYmVsUGFydGl0aW9uXCJcbiAgICAgIHBhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwic3BhblwiXG4gICAgICBwYXJ0LnN0eWxlLndpZHRoID0gMTVcbiAgICAgIHBhcnQudGV4dENvbnRlbnQgPSBAbW9kZWwuZ2V0KFwicGFydGl0aW9uXCIpXG4gICAgICBwYXJ0LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG4gICAgICBAZWwuYXBwZW5kQ2hpbGQgaWRcbiAgICAgIEBlbC5hcHBlbmRDaGlsZCBwYXJ0XG5cbiAgICBpZiBALmcudmlzLmdldCBcImxhYmVsTmFtZVwiXG4gICAgICBuYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBcInNwYW5cIlxuICAgICAgbmFtZS50ZXh0Q29udGVudCA9IEBtb2RlbC5nZXQoXCJuYW1lXCIpXG4gICAgICBAZWwuYXBwZW5kQ2hpbGQgbmFtZVxuXG5cbiAgICBAZWwuc3R5bGUub3ZlcmZsb3cgPSBzY3JvbGxcbiAgICBAXG5cbiAgX29uY2xpY2s6IChldnQpIC0+XG4gICAgc2VxSWQgPSBAbW9kZWwuZ2V0IFwiaWRcIlxuICAgIEBnLnRyaWdnZXIgXCJyb3c6Y2xpY2tcIiwge3NlcUlkOnNlcUlkLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlaW46IChldnQpIC0+XG4gICAgc2VxSWQgPSBAbW9kZWwuZ2V0IFwiaWRcIlxuICAgIEBnLnRyaWdnZXIgXCJyb3c6bW91c2VvdXRcIiwge3NlcUlkOnNlcUlkLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlb3V0OiAoZXZ0KSAtPlxuICAgIHNlcUlkID0gQG1vZGVsLmdldCBcImlkXCJcbiAgICBAZy50cmlnZ2VyIFwicm93Om1vdXNlb3V0XCIsIHtzZXFJZDpzZXFJZCwgZXZ0OmV2dH1cblxubW9kdWxlLmV4cG9ydHMgPSBMYWJlbFZpZXdcbiIsInZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtdmlld2pcIilcbk1lbnVCdWlsZGVyID0gcmVxdWlyZSBcIi4uLy4uL21lbnUvbWVudWJ1aWxkZXJcIlxuXyA9IHJlcXVpcmUgJ3VuZGVyc2NvcmUnXG5kb20gPSByZXF1aXJlIFwiZG9tLWhlbHBlclwiXG5cbm1vZHVsZS5leHBvcnRzID0gTWV0YVZpZXcgPSB2aWV3LmV4dGVuZFxuXG4gIGNsYXNzTmFtZTogXCJiaW9qc19tc2FfbWV0YXZpZXdcIlxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG5cbiAgZXZlbnRzOlxuICAgIGNsaWNrOiBcIl9vbmNsaWNrXCJcbiAgICBtb3VzZWluOiBcIl9vbm1vdXNlaW5cIlxuICAgIG1vdXNlb3V0OiBcIl9vbm1vdXNlb3V0XCJcblxuICByZW5kZXI6IC0+XG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcblxuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuXG4gICAgd2lkdGggPSBAZy56b29tZXIuZ2V0IFwibWV0YVdpZHRoXCJcbiAgICBAZWwuc3R5bGUud2lkdGggPSB3aWR0aCAtIDVcbiAgICBAZWwuc3R5bGUucGFkZGluZ1JpZ2h0ID0gNVxuXG4gICAgIyBhZGRzIGdhcHNcbiAgICBzZXEgPSBAbW9kZWwuZ2V0KCdzZXEnKVxuICAgIGdhcHMgPSBfLnJlZHVjZSBzZXEsICgobWVtbywgYykgLT4gbWVtbysrIGlmIGMgaXMgJy0nO21lbW8pLDBcbiAgICBnYXBzID0gKGdhcHMgLyBzZXEubGVuZ3RoKS50b0ZpeGVkKDEpXG5cbiAgICAjIGFwcGVuZCBnYXAgY291bnRcbiAgICBnYXBTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAnc3BhbidcbiAgICBnYXBTcGFuLnRleHRDb250ZW50ID0gZ2Fwc1xuICAgIGdhcFNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICBnYXBTcGFuLnN0eWxlLndpZHRoID0gMzVcbiAgICBAZWwuYXBwZW5kQ2hpbGQgZ2FwU3BhblxuXG4gICAgIyBpZGVudGl0eVxuICAgIGlkZW50ID0gQG1vZGVsLmdldCgnaWRlbnRpdHknKVxuICAgIGlkZW50U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJ3NwYW4nXG4gICAgaWRlbnRTcGFuLnRleHRDb250ZW50ID0gaWRlbnQudG9GaXhlZCgyKVxuICAgIGlkZW50U3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuICAgIGlkZW50U3Bhbi5zdHlsZS53aWR0aCA9IDQwXG4gICAgQGVsLmFwcGVuZENoaWxkIGlkZW50U3BhblxuXG4gICAgIyBUT0RPOiB0aGlzIG1lbnUgYnVpbGRlciBpcyBqdXN0IGFuIGV4YW1wbGUgaG93IG9uZSBjb3VsZCBjdXN0b21pemUgdGhpc1xuICAgICMgdmlld1xuICAgIG1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoXCLihpdcIilcbiAgICBtZW51LmFkZE5vZGUgXCJVbmlwcm90XCIsKGUpID0+XG4gICAgICB3aW5kb3cub3BlbiBcImh0dHA6Ly9iZXRhLnVuaXByb3Qub3JnL3VuaXByb3QvUTdUMk44XCJcbiAgICBAZWwuYXBwZW5kQ2hpbGQgbWVudS5idWlsZERPTSgpXG4gICAgQGVsLndpZHRoID0gMTBcblxuICAgIEBlbC5zdHlsZS5oZWlnaHQgPSBcIiN7QGcuem9vbWVyLmdldCBcInJvd0hlaWdodFwifXB4XCJcbiAgICBAZWwuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCJcblxuICBfb25jbGljazogKGV2dCkgLT5cbiAgICBAZy50cmlnZ2VyIFwibWV0YTpjbGlja1wiLCB7c2VxSWQ6IEBtb2RlbC5nZXQgXCJpZFwiLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlaW46IChldnQpIC0+XG4gICAgQGcudHJpZ2dlciBcIm1ldGE6bW91c2VpblwiLCB7c2VxSWQ6IEBtb2RlbC5nZXQgXCJpZFwiLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlb3V0OiAoZXZ0KSAtPlxuICAgIEBnLnRyaWdnZXIgXCJtZXRhOm1vdXNlb3V0XCIsIHtzZXFJZDogQG1vZGVsLmdldCBcImlkXCIsIGV2dDpldnR9XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuOC4wXG52YXIgQ2x1c3RhbCwgR2VuZXJpY1JlYWRlciwgU2VxLCBTdHIsXG4gIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICBfX2V4dGVuZHMgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKF9faGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfTtcblxuU3RyID0gcmVxdWlyZShcIi4vc3RyaW5nc1wiKTtcblxuR2VuZXJpY1JlYWRlciA9IHJlcXVpcmUoXCIuL2dlbmVyaWNfcmVhZGVyXCIpO1xuXG5TZXEgPSByZXF1aXJlKFwiLi9zZXFcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2x1c3RhbCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgX19leHRlbmRzKENsdXN0YWwsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gQ2x1c3RhbCgpIHtcbiAgICByZXR1cm4gQ2x1c3RhbC5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIENsdXN0YWwucGFyc2UgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIGJsb2Nrc3RhdGUsIGssIGxhYmVsLCBsaW5lLCBsaW5lcywgbWF0Y2gsIHJlZ2V4LCBzZXFDb3VudGVyLCBzZXFzLCBzZXF1ZW5jZTtcbiAgICBzZXFzID0gW107XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0ZXh0KSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgbGluZXMgPSB0ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgfVxuICAgIGlmIChsaW5lc1swXS5zbGljZSgwLCA2KSA9PT0gIVwiQ0xVU1RBTFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIENMVVNUQUwgSGVhZGVyXCIpO1xuICAgIH1cbiAgICBrID0gMDtcbiAgICBibG9ja3N0YXRlID0gMTtcbiAgICBzZXFDb3VudGVyID0gMDtcbiAgICB3aGlsZSAoayA8IGxpbmVzLmxlbmd0aCkge1xuICAgICAgaysrO1xuICAgICAgbGluZSA9IGxpbmVzW2tdO1xuICAgICAgaWYgKChsaW5lID09IG51bGwpIHx8IGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJsb2Nrc3RhdGUgPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYmxvY2tzdGF0ZSA9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFN0ci5jb250YWlucyhsaW5lLCBcIipcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmxvY2tzdGF0ZSA9PT0gMSkge1xuICAgICAgICAgIHNlcUNvdW50ZXIgPSAwO1xuICAgICAgICAgIGJsb2Nrc3RhdGUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJlZ2V4ID0gL14oPzpcXHMqKShcXFMrKSg/OlxccyspKFxcUyspKD86XFxzKikoXFxkKikoPzpcXHMqfCQpL2c7XG4gICAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHtcbiAgICAgICAgICBsYWJlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgIHNlcXVlbmNlID0gbWF0Y2hbMl07XG4gICAgICAgICAgaWYgKHNlcUNvdW50ZXIgPj0gc2Vxcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNlcXMucHVzaChuZXcgU2VxKHNlcXVlbmNlLCBsYWJlbCwgc2VxQ291bnRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXFzW3NlcUNvdW50ZXJdLnNlcSArPSBzZXF1ZW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VxQ291bnRlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXFzO1xuICB9O1xuXG4gIHJldHVybiBDbHVzdGFsO1xuXG59KShHZW5lcmljUmVhZGVyKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjBcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcmVxdWlyZShcIi4vcGFyc2VyXCIpO1xuXG5tb2R1bGUuZXhwb3J0cy53cml0ZXIgPSByZXF1aXJlKFwiLi93cml0ZXJcIik7XG4iLCJpZiAodHlwZW9mIGJpb2pzID09PSAndW5kZWZpbmVkJykge1xuICBiaW9qcyA9IHt9O1xufVxuaWYgKHR5cGVvZiBiaW9qcy52aXMgPT09ICd1bmRlZmluZWQnKSB7XG4gIGJpb2pzLnZpcyA9IHt9O1xufVxuLy8gdXNlIHR3byBuYW1lc3BhY2VzXG53aW5kb3cubXNhID0gYmlvanMudmlzLm1zYSA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9pbmRleCcpO1xuXG4vLyBUT0RPOiBob3cgc2hvdWxkIHRoaXMgYmUgYnVuZGxlZFxuXG5pZiAodHlwZW9mIGJpb2pzLmlvID09PSAndW5kZWZpbmVkJykge1xuICBiaW9qcy5pbyA9IHt9O1xufVxuLy8ganVzdCBidW5kbGUgdGhlIHR3byBwYXJzZXJzXG53aW5kb3cuYmlvanMuaW8uZmFzdGEgPSByZXF1aXJlKFwiYmlvanMtaW8tZmFzdGFcIik7XG53aW5kb3cuYmlvanMuaW8uY2x1c3RhbCA9IHJlcXVpcmUoXCJiaW9qcy1pby1jbHVzdGFsXCIpO1xud2luZG93LmJpb2pzLnhociA9IHJlcXVpcmUoXCJuZXRzXCIpO1xuXG4vLyBzaW11bGF0ZSBzdGFuZGFsb25lIGZsYWdcbndpbmRvdy5iaW9qc1Zpc01zYSA9IHdpbmRvdy5tc2E7XG5cbnJlcXVpcmUoJy4vYnVpbGQvbXNhLmNzcycpO1xuIiwidmFyIHJlcSA9IHJlcXVpcmUoJ3JlcXVlc3QnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IE5ldHNcblxuZnVuY3Rpb24gTmV0cyh1cmksIG9wdHMsIGNiKSB7XG4gIHJlcSh1cmksIG9wdHMsIGNiKVxufSJdfQ==
8993 // this is a way how you use a bundled file parser
8994 biojs.io.clustal.read("#", function(seqs){
8997 // set your custom properties
8998 // @see: https://github.com/greenify/biojs-vis-msa/tree/master/src/g
9000 var jalviewData = JSON.parse(document.getElementById("seqData").value);
9001 opts.seqs = jalviewData['seqs'];
9003 opts.el = document.getElementById("yourDiv");
9004 opts.vis = {conserv: false, overviewbox: false, labelId: false};
9005 opts.zoomer = {alignmentHeight: 225, labelWidth: 130,labelFontsize: "13px",labelIdLength: 20, menuFontsize: "12px",menuMarginLeft: "3px", menuPadding: "3px 4px 3px 4px", menuItemFontsize: "14px", menuItemLineHeight: "14px"};
9010 var m = new msa.msa(opts);
9012 m.g.colorscheme.set("scheme", jalviewData['globalColorScheme']);
9015 jalviewData.seqs.forEach( function (seq)
9017 m.seqs.at(x++).set("features", new msa.model.featurecol(seq.features));
9020 // the menu is independent to the MSA container
9022 menuOpts.el = document.getElementById('div');
9024 var defMenu = new msa.menu.defaultmenu(menuOpts);
9025 m.addView("menu", defMenu);
9027 // call render at the end to display the whole MSA
9029 toggleMenuVisibility();
9030 toggleMenuVisibility();