@seniorsistemas/angular-components 16.13.1 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/seniorsistemas-angular-components.umd.js +1733 -26
- package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
- package/bundles/seniorsistemas-angular-components.umd.min.js +2 -2
- package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
- package/components/gantt/components/gantt/arrow.d.ts +16 -0
- package/components/gantt/components/gantt/bar.d.ts +43 -0
- package/components/gantt/components/gantt/gantt-options.d.ts +2 -0
- package/components/gantt/components/gantt/gantt.d.ts +66 -0
- package/components/gantt/components/gantt/popup.d.ts +11 -0
- package/components/gantt/components/gantt/utils/date-utils.d.ts +13 -0
- package/components/gantt/components/gantt/utils/svg-utils.d.ts +11 -0
- package/components/gantt/components/side-table/side-table.component.d.ts +7 -0
- package/components/gantt/gantt.component.d.ts +21 -0
- package/components/gantt/gantt.module.d.ts +2 -0
- package/components/gantt/index.d.ts +3 -0
- package/components/gantt/models/index.d.ts +3 -0
- package/components/gantt/models/options.d.ts +21 -0
- package/components/gantt/models/task.d.ts +21 -0
- package/components/gantt/models/view-mode.d.ts +9 -0
- package/esm2015/components/gantt/components/gantt/arrow.js +82 -0
- package/esm2015/components/gantt/components/gantt/bar.js +236 -0
- package/esm2015/components/gantt/components/gantt/gantt-options.js +16 -0
- package/esm2015/components/gantt/components/gantt/gantt.js +767 -0
- package/esm2015/components/gantt/components/gantt/popup.js +68 -0
- package/esm2015/components/gantt/components/gantt/utils/date-utils.js +126 -0
- package/esm2015/components/gantt/components/gantt/utils/svg-utils.js +119 -0
- package/esm2015/components/gantt/components/side-table/side-table.component.js +26 -0
- package/esm2015/components/gantt/gantt.component.js +112 -0
- package/esm2015/components/gantt/gantt.module.js +19 -0
- package/esm2015/components/gantt/index.js +4 -0
- package/esm2015/components/gantt/models/index.js +2 -0
- package/esm2015/components/gantt/models/options.js +1 -0
- package/esm2015/components/gantt/models/task.js +1 -0
- package/esm2015/components/gantt/models/view-mode.js +11 -0
- package/esm2015/components/sidebar/sidebar.component.js +3 -3
- package/esm2015/public-api.js +2 -1
- package/esm2015/seniorsistemas-angular-components.js +25 -24
- package/esm5/components/gantt/components/gantt/arrow.js +81 -0
- package/esm5/components/gantt/components/gantt/bar.js +271 -0
- package/esm5/components/gantt/components/gantt/gantt-options.js +16 -0
- package/esm5/components/gantt/components/gantt/gantt.js +883 -0
- package/esm5/components/gantt/components/gantt/popup.js +59 -0
- package/esm5/components/gantt/components/gantt/utils/date-utils.js +134 -0
- package/esm5/components/gantt/components/gantt/utils/svg-utils.js +121 -0
- package/esm5/components/gantt/components/side-table/side-table.component.js +27 -0
- package/esm5/components/gantt/gantt.component.js +114 -0
- package/esm5/components/gantt/gantt.module.js +22 -0
- package/esm5/components/gantt/index.js +4 -0
- package/esm5/components/gantt/models/index.js +2 -0
- package/esm5/components/gantt/models/options.js +1 -0
- package/esm5/components/gantt/models/task.js +1 -0
- package/esm5/components/gantt/models/view-mode.js +11 -0
- package/esm5/components/sidebar/sidebar.component.js +3 -3
- package/esm5/public-api.js +2 -1
- package/esm5/seniorsistemas-angular-components.js +25 -24
- package/fesm2015/seniorsistemas-angular-components.js +1558 -4
- package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
- package/fesm5/seniorsistemas-angular-components.js +1708 -4
- package/fesm5/seniorsistemas-angular-components.js.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/seniorsistemas-angular-components.d.ts +24 -23
- package/seniorsistemas-angular-components.metadata.json +1 -1
|
@@ -0,0 +1,883 @@
|
|
|
1
|
+
import { __read, __spread, __values } from "tslib";
|
|
2
|
+
import { DateUtils } from "./utils/date-utils";
|
|
3
|
+
import { $, createSVG } from "./utils/svg-utils";
|
|
4
|
+
import { Bar } from "./bar";
|
|
5
|
+
import { Popup } from "./popup";
|
|
6
|
+
import { Arrow } from "./arrow";
|
|
7
|
+
import { defaultOptions } from "./gantt-options";
|
|
8
|
+
import { ViewMode } from "../../models/view-mode";
|
|
9
|
+
var Gantt = /** @class */ (function () {
|
|
10
|
+
function Gantt(wrapper, tasks, options) {
|
|
11
|
+
this.setup_wrapper(wrapper);
|
|
12
|
+
this.setup_options(options);
|
|
13
|
+
this.setup_tasks(tasks);
|
|
14
|
+
// initialize with default view mode
|
|
15
|
+
this.change_view_mode();
|
|
16
|
+
this.bind_events();
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(Gantt.prototype, "minDate", {
|
|
19
|
+
get: function () {
|
|
20
|
+
return this._minDate;
|
|
21
|
+
},
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(Gantt.prototype, "maxDate", {
|
|
26
|
+
get: function () {
|
|
27
|
+
return this._maxDate;
|
|
28
|
+
},
|
|
29
|
+
enumerable: true,
|
|
30
|
+
configurable: true
|
|
31
|
+
});
|
|
32
|
+
Gantt.prototype.setup_wrapper = function (element) {
|
|
33
|
+
var svg_element, wrapper_element;
|
|
34
|
+
// CSS Selector is passed
|
|
35
|
+
if (typeof element === "string") {
|
|
36
|
+
element = document.querySelector(element);
|
|
37
|
+
}
|
|
38
|
+
// get the SVGElement
|
|
39
|
+
if (element instanceof HTMLElement) {
|
|
40
|
+
wrapper_element = element;
|
|
41
|
+
svg_element = element.querySelector("svg");
|
|
42
|
+
}
|
|
43
|
+
else if (element instanceof SVGElement) {
|
|
44
|
+
svg_element = element;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
throw new TypeError("Frappé Gantt only supports usage of a string CSS selector, HTML DOM element or SVG DOM element for the \'element\' parameter");
|
|
48
|
+
}
|
|
49
|
+
// svg element
|
|
50
|
+
if (!svg_element) {
|
|
51
|
+
// create it
|
|
52
|
+
this.$svg = createSVG("svg", {
|
|
53
|
+
append_to: wrapper_element,
|
|
54
|
+
class: "gantt",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
this.$svg = svg_element;
|
|
59
|
+
this.$svg.classList.add("gantt");
|
|
60
|
+
}
|
|
61
|
+
// wrapper element
|
|
62
|
+
this.$container = document.createElement("div");
|
|
63
|
+
this.$container.classList.add("gantt-container");
|
|
64
|
+
var parent_element = this.$svg.parentElement;
|
|
65
|
+
parent_element.appendChild(this.$container);
|
|
66
|
+
this.$container.appendChild(this.$svg);
|
|
67
|
+
// popup wrapper
|
|
68
|
+
this.popup_wrapper = document.createElement("div");
|
|
69
|
+
this.popup_wrapper.classList.add("popup-wrapper");
|
|
70
|
+
this.$container.appendChild(this.popup_wrapper);
|
|
71
|
+
};
|
|
72
|
+
Gantt.prototype.setup_options = function (options) {
|
|
73
|
+
this.options = Object.assign({}, defaultOptions, options);
|
|
74
|
+
};
|
|
75
|
+
Gantt.prototype.setup_tasks = function (tasks) {
|
|
76
|
+
// prepare tasks
|
|
77
|
+
this.tasks = tasks.map(function (task, i) {
|
|
78
|
+
//standard colors if needed
|
|
79
|
+
task.color = task.color || '#7892A1';
|
|
80
|
+
// convert to Date objects
|
|
81
|
+
task._start = DateUtils.parse(task.start);
|
|
82
|
+
task._end = DateUtils.parse(task.end);
|
|
83
|
+
// make task invalid if duration too large
|
|
84
|
+
if (DateUtils.diff(task._end, task._start, "year") > 10) {
|
|
85
|
+
task.end = null;
|
|
86
|
+
}
|
|
87
|
+
// cache index
|
|
88
|
+
task._index = i;
|
|
89
|
+
if (typeof task._row_id === "number") {
|
|
90
|
+
task._index = task._row_id;
|
|
91
|
+
}
|
|
92
|
+
// invalid dates
|
|
93
|
+
if (!task.start && !task.end) {
|
|
94
|
+
var today = DateUtils.today();
|
|
95
|
+
task._start = today;
|
|
96
|
+
task._end = DateUtils.add(today, 2, "day");
|
|
97
|
+
}
|
|
98
|
+
if (!task.start && task.end) {
|
|
99
|
+
task._start = DateUtils.add(task._end, -2, 'day');
|
|
100
|
+
}
|
|
101
|
+
if (task.start && !task.end) {
|
|
102
|
+
task._end = DateUtils.add(task._start, 2, "day");
|
|
103
|
+
}
|
|
104
|
+
// if hours is not set, assume the last day is full day
|
|
105
|
+
// e.g: 2018-09-09 becomes 2018-09-09 23:59:59
|
|
106
|
+
var task_end_values = DateUtils.getDateValues(task._end);
|
|
107
|
+
if (task_end_values.slice(3).every(function (d) { return d === 0; })) {
|
|
108
|
+
task._end = DateUtils.add(task._end, 24, "hour");
|
|
109
|
+
}
|
|
110
|
+
// invalid flag
|
|
111
|
+
if (!task.start || !task.end) {
|
|
112
|
+
task.invalid = true;
|
|
113
|
+
}
|
|
114
|
+
// dependencies
|
|
115
|
+
if (typeof task.dependencies === "string" || !task.dependencies) {
|
|
116
|
+
var deps = [];
|
|
117
|
+
if (task.dependencies) {
|
|
118
|
+
deps = task.dependencies
|
|
119
|
+
.split(',')
|
|
120
|
+
.map(function (d) { return d.trim(); })
|
|
121
|
+
.filter(function (d) { return d; });
|
|
122
|
+
}
|
|
123
|
+
task.dependencies = deps;
|
|
124
|
+
}
|
|
125
|
+
// uids
|
|
126
|
+
if (!task.id) {
|
|
127
|
+
task.id = generate_id(task);
|
|
128
|
+
}
|
|
129
|
+
return task;
|
|
130
|
+
});
|
|
131
|
+
this.setup_dependencies();
|
|
132
|
+
};
|
|
133
|
+
Gantt.prototype.setup_dependencies = function () {
|
|
134
|
+
var e_1, _a, e_2, _b;
|
|
135
|
+
this.dependency_map = {};
|
|
136
|
+
try {
|
|
137
|
+
for (var _c = __values(this.tasks), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
138
|
+
var t = _d.value;
|
|
139
|
+
try {
|
|
140
|
+
for (var _e = (e_2 = void 0, __values(t.dependencies)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
141
|
+
var d = _f.value;
|
|
142
|
+
this.dependency_map[d] = this.dependency_map[d] || [];
|
|
143
|
+
this.dependency_map[d].push(t.id);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
147
|
+
finally {
|
|
148
|
+
try {
|
|
149
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
150
|
+
}
|
|
151
|
+
finally { if (e_2) throw e_2.error; }
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
156
|
+
finally {
|
|
157
|
+
try {
|
|
158
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
159
|
+
}
|
|
160
|
+
finally { if (e_1) throw e_1.error; }
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
Gantt.prototype.refresh = function (tasks) {
|
|
164
|
+
this.setup_tasks(tasks);
|
|
165
|
+
this.change_view_mode();
|
|
166
|
+
};
|
|
167
|
+
Gantt.prototype.change_view_mode = function (mode) {
|
|
168
|
+
if (mode === void 0) { mode = this.options.viewMode; }
|
|
169
|
+
this.update_view_scale(mode);
|
|
170
|
+
this.setup_dates();
|
|
171
|
+
this.render();
|
|
172
|
+
// fire viewmode_change event
|
|
173
|
+
this.trigger_event("onViewChange", [mode]);
|
|
174
|
+
};
|
|
175
|
+
Gantt.prototype.update_view_scale = function (view_mode) {
|
|
176
|
+
this.options.viewMode = view_mode;
|
|
177
|
+
// this.isHourView = false;
|
|
178
|
+
if (view_mode === ViewMode.Hour) {
|
|
179
|
+
this.options.step = 24 / 24;
|
|
180
|
+
this.options.columnWidth = 50;
|
|
181
|
+
// this.isHourView = true;
|
|
182
|
+
}
|
|
183
|
+
else if (view_mode === ViewMode.Day) {
|
|
184
|
+
this.options.step = 24;
|
|
185
|
+
this.options.columnWidth = 50;
|
|
186
|
+
}
|
|
187
|
+
else if (view_mode === ViewMode.HalfDay) {
|
|
188
|
+
this.options.step = 24 / 2;
|
|
189
|
+
this.options.columnWidth = 50;
|
|
190
|
+
}
|
|
191
|
+
else if (view_mode === ViewMode.QuarterDay) {
|
|
192
|
+
this.options.step = 24 / 4;
|
|
193
|
+
this.options.columnWidth = 50;
|
|
194
|
+
}
|
|
195
|
+
else if (view_mode === ViewMode.Week) {
|
|
196
|
+
this.options.step = 24 * 7;
|
|
197
|
+
this.options.columnWidth = 140;
|
|
198
|
+
}
|
|
199
|
+
else if (view_mode === ViewMode.Month) {
|
|
200
|
+
this.options.step = 24 * 30;
|
|
201
|
+
this.options.columnWidth = 120;
|
|
202
|
+
}
|
|
203
|
+
else if (view_mode === ViewMode.Year) {
|
|
204
|
+
this.options.step = 24 * 365;
|
|
205
|
+
this.options.columnWidth = 120;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
Gantt.prototype.setup_dates = function () {
|
|
209
|
+
this.setup_gantt_dates();
|
|
210
|
+
this.setup_date_values();
|
|
211
|
+
};
|
|
212
|
+
Gantt.prototype.setup_gantt_dates = function () {
|
|
213
|
+
var e_3, _a;
|
|
214
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
215
|
+
this._minDate = null;
|
|
216
|
+
this._maxDate = null;
|
|
217
|
+
try {
|
|
218
|
+
for (var _r = __values(this.tasks), _s = _r.next(); !_s.done; _s = _r.next()) {
|
|
219
|
+
var task = _s.value;
|
|
220
|
+
// set global start and end date
|
|
221
|
+
if (!this.minDate || task.start < this.minDate) {
|
|
222
|
+
this._minDate = task.start;
|
|
223
|
+
}
|
|
224
|
+
if (!this.maxDate || task.end > this.maxDate) {
|
|
225
|
+
this._maxDate = task.end;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
230
|
+
finally {
|
|
231
|
+
try {
|
|
232
|
+
if (_s && !_s.done && (_a = _r.return)) _a.call(_r);
|
|
233
|
+
}
|
|
234
|
+
finally { if (e_3) throw e_3.error; }
|
|
235
|
+
}
|
|
236
|
+
this._realMinDate = this.minDate;
|
|
237
|
+
this._realMaxDate = this.maxDate;
|
|
238
|
+
switch (this.options.viewMode) {
|
|
239
|
+
case ViewMode.Hour:
|
|
240
|
+
this._minDate = DateUtils.add(this.minDate, -((_b = this.options.marginBeforeStart) !== null && _b !== void 0 ? _b : 1), "hour");
|
|
241
|
+
this._maxDate = DateUtils.add(this.maxDate, (_c = this.options.marginAfterEnd) !== null && _c !== void 0 ? _c : 1, "hour");
|
|
242
|
+
break;
|
|
243
|
+
case ViewMode.QuarterDay:
|
|
244
|
+
this._minDate = DateUtils.add(this.minDate, -((_d = this.options.marginBeforeStart) !== null && _d !== void 0 ? _d : 12), "hour");
|
|
245
|
+
this._maxDate = DateUtils.add(this.maxDate, (_e = this.options.marginAfterEnd) !== null && _e !== void 0 ? _e : 12, "hour");
|
|
246
|
+
break;
|
|
247
|
+
case ViewMode.HalfDay:
|
|
248
|
+
this._minDate = DateUtils.add(this.minDate, -((_f = this.options.marginBeforeStart) !== null && _f !== void 0 ? _f : 1), "day");
|
|
249
|
+
this._maxDate = DateUtils.add(this.maxDate, (_g = this.options.marginAfterEnd) !== null && _g !== void 0 ? _g : 1, "day");
|
|
250
|
+
break;
|
|
251
|
+
case ViewMode.Day:
|
|
252
|
+
this._minDate = DateUtils.add(this.minDate, -((_h = this.options.marginBeforeStart) !== null && _h !== void 0 ? _h : 3), "day");
|
|
253
|
+
this._maxDate = DateUtils.add(this.maxDate, (_j = this.options.marginAfterEnd) !== null && _j !== void 0 ? _j : 3, "day");
|
|
254
|
+
break;
|
|
255
|
+
case ViewMode.Week:
|
|
256
|
+
this._minDate = DateUtils.add(this.minDate, -((_k = this.options.marginBeforeStart) !== null && _k !== void 0 ? _k : 1), "month");
|
|
257
|
+
this._maxDate = DateUtils.add(this.maxDate, (_l = this.options.marginAfterEnd) !== null && _l !== void 0 ? _l : 1, "month");
|
|
258
|
+
break;
|
|
259
|
+
case ViewMode.Month:
|
|
260
|
+
this._minDate = DateUtils.add(this.minDate, -((_m = this.options.marginBeforeStart) !== null && _m !== void 0 ? _m : 1), "year");
|
|
261
|
+
this._maxDate = DateUtils.add(this.maxDate, (_o = this.options.marginAfterEnd) !== null && _o !== void 0 ? _o : 1, "year");
|
|
262
|
+
break;
|
|
263
|
+
case ViewMode.Year:
|
|
264
|
+
this._minDate = DateUtils.add(this.minDate, -((_p = this.options.marginBeforeStart) !== null && _p !== void 0 ? _p : 2), "year");
|
|
265
|
+
this._maxDate = DateUtils.add(this.maxDate, (_q = this.options.marginAfterEnd) !== null && _q !== void 0 ? _q : 2, "year");
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
Gantt.prototype.setup_date_values = function () {
|
|
270
|
+
this.dates = [];
|
|
271
|
+
var cur_date = null;
|
|
272
|
+
while (cur_date === null || cur_date < this.maxDate) {
|
|
273
|
+
if (!cur_date) {
|
|
274
|
+
cur_date = DateUtils.clone(this.minDate);
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
if (this.view_is(ViewMode.Year)) {
|
|
278
|
+
cur_date = DateUtils.add(cur_date, 1, "year");
|
|
279
|
+
}
|
|
280
|
+
else if (this.view_is(ViewMode.Month)) {
|
|
281
|
+
cur_date = DateUtils.add(cur_date, 1, "month");
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
cur_date = DateUtils.add(cur_date, this.options.step, 'hour');
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
this.dates.push(cur_date);
|
|
288
|
+
}
|
|
289
|
+
console.log("cur_date", cur_date);
|
|
290
|
+
console.log("dates", this.dates);
|
|
291
|
+
};
|
|
292
|
+
Gantt.prototype.bind_events = function () {
|
|
293
|
+
this.bind_grid_click();
|
|
294
|
+
this.bind_bar_events();
|
|
295
|
+
};
|
|
296
|
+
Gantt.prototype.render = function () {
|
|
297
|
+
this.clear();
|
|
298
|
+
this.setup_layers();
|
|
299
|
+
this.make_grid();
|
|
300
|
+
this.make_dates();
|
|
301
|
+
this.make_bars();
|
|
302
|
+
this.make_arrows();
|
|
303
|
+
this.map_arrows_on_bars();
|
|
304
|
+
this.set_width();
|
|
305
|
+
this.set_scroll_position();
|
|
306
|
+
};
|
|
307
|
+
Gantt.prototype.setup_layers = function () {
|
|
308
|
+
var e_4, _a;
|
|
309
|
+
this.layers = {};
|
|
310
|
+
var layers = ["grid", "date", "arrow", "progress", "bar", "details"];
|
|
311
|
+
try {
|
|
312
|
+
// make group layers
|
|
313
|
+
for (var layers_1 = __values(layers), layers_1_1 = layers_1.next(); !layers_1_1.done; layers_1_1 = layers_1.next()) {
|
|
314
|
+
var layer = layers_1_1.value;
|
|
315
|
+
this.layers[layer] = createSVG('g', {
|
|
316
|
+
class: layer,
|
|
317
|
+
append_to: this.$svg,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
322
|
+
finally {
|
|
323
|
+
try {
|
|
324
|
+
if (layers_1_1 && !layers_1_1.done && (_a = layers_1.return)) _a.call(layers_1);
|
|
325
|
+
}
|
|
326
|
+
finally { if (e_4) throw e_4.error; }
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
Gantt.prototype.make_grid = function () {
|
|
330
|
+
this.make_grid_background();
|
|
331
|
+
this.make_grid_rows();
|
|
332
|
+
this.make_grid_header();
|
|
333
|
+
this.make_grid_highlights();
|
|
334
|
+
this.make_grid_ticks();
|
|
335
|
+
};
|
|
336
|
+
Gantt.prototype.make_grid_background = function () {
|
|
337
|
+
var grid_width = this.dates.length * this.options.columnWidth;
|
|
338
|
+
var distinct_rows = __spread(new Set(this.tasks.map(function (x) { return x._row_id; })));
|
|
339
|
+
var grid_height = this.options.headerHeight +
|
|
340
|
+
this.options.padding / 2 +
|
|
341
|
+
(this.options.barHeight + this.options.padding) *
|
|
342
|
+
distinct_rows.length;
|
|
343
|
+
createSVG("rect", {
|
|
344
|
+
x: 0,
|
|
345
|
+
y: 0,
|
|
346
|
+
width: grid_width,
|
|
347
|
+
height: grid_height,
|
|
348
|
+
class: "grid-background",
|
|
349
|
+
append_to: this.layers.grid,
|
|
350
|
+
});
|
|
351
|
+
$.attr(this.$svg, {
|
|
352
|
+
height: grid_height,
|
|
353
|
+
width: "100%",
|
|
354
|
+
}, null);
|
|
355
|
+
};
|
|
356
|
+
Gantt.prototype.make_grid_rows = function () {
|
|
357
|
+
var _this = this;
|
|
358
|
+
var rows_layer = createSVG("g", { append_to: this.layers.grid });
|
|
359
|
+
var lines_layer = createSVG("g", { append_to: this.layers.grid });
|
|
360
|
+
var row_width = this.dates.length * this.options.columnWidth;
|
|
361
|
+
var row_height = this.options.barHeight + this.options.padding;
|
|
362
|
+
//TODO: ajustar o posicionamento das linhas
|
|
363
|
+
var row_y = this.options.headerHeight + this.options.padding / 2;
|
|
364
|
+
this.tasks.forEach(function (_) {
|
|
365
|
+
createSVG("rect", {
|
|
366
|
+
x: 0,
|
|
367
|
+
y: row_y,
|
|
368
|
+
width: row_width,
|
|
369
|
+
height: row_height,
|
|
370
|
+
class: "grid-row",
|
|
371
|
+
append_to: rows_layer,
|
|
372
|
+
});
|
|
373
|
+
createSVG("line", {
|
|
374
|
+
x1: 0,
|
|
375
|
+
y1: row_y + row_height,
|
|
376
|
+
x2: row_width,
|
|
377
|
+
y2: row_y + row_height,
|
|
378
|
+
class: "row-line",
|
|
379
|
+
append_to: lines_layer,
|
|
380
|
+
});
|
|
381
|
+
row_y += _this.options.barHeight + _this.options.padding;
|
|
382
|
+
});
|
|
383
|
+
};
|
|
384
|
+
Gantt.prototype.make_grid_header = function () {
|
|
385
|
+
// const addIsHourView = this.isHourView ? 25 : 10
|
|
386
|
+
var header_width = this.dates.length * this.options.columnWidth;
|
|
387
|
+
var header_height = this.options.headerHeight + 10;
|
|
388
|
+
createSVG("rect", {
|
|
389
|
+
x: 0,
|
|
390
|
+
y: 0,
|
|
391
|
+
width: header_width,
|
|
392
|
+
height: header_height,
|
|
393
|
+
class: "grid-header",
|
|
394
|
+
append_to: this.layers.grid,
|
|
395
|
+
});
|
|
396
|
+
};
|
|
397
|
+
Gantt.prototype.make_grid_ticks = function () {
|
|
398
|
+
var e_5, _a;
|
|
399
|
+
var tick_x = 0;
|
|
400
|
+
var tick_y = this.options.headerHeight + this.options.padding / 2;
|
|
401
|
+
var tick_height = (this.options.barHeight + this.options.padding) *
|
|
402
|
+
this.tasks.length;
|
|
403
|
+
try {
|
|
404
|
+
for (var _b = __values(this.dates), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
405
|
+
var date = _c.value;
|
|
406
|
+
var tick_class = "tick";
|
|
407
|
+
// thick tick for monday
|
|
408
|
+
if (this.view_is(ViewMode.Day) && date.getDate() === 1) {
|
|
409
|
+
tick_class += " thick";
|
|
410
|
+
}
|
|
411
|
+
// thick tick for first week
|
|
412
|
+
if (this.view_is(ViewMode.Week) &&
|
|
413
|
+
date.getDate() >= 1 &&
|
|
414
|
+
date.getDate() < 8) {
|
|
415
|
+
tick_class += " thick";
|
|
416
|
+
}
|
|
417
|
+
// thick ticks for quarters
|
|
418
|
+
if (this.view_is(ViewMode.Month) && date.getMonth() % 3 === 0) {
|
|
419
|
+
tick_class += " thick";
|
|
420
|
+
}
|
|
421
|
+
createSVG("path", {
|
|
422
|
+
d: "M " + tick_x + " " + tick_y + " v " + tick_height,
|
|
423
|
+
class: tick_class,
|
|
424
|
+
append_to: this.layers.grid,
|
|
425
|
+
});
|
|
426
|
+
if (this.view_is(ViewMode.Month)) {
|
|
427
|
+
tick_x +=
|
|
428
|
+
(DateUtils.getDaysInMonth(date) *
|
|
429
|
+
this.options.columnWidth) /
|
|
430
|
+
30;
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
tick_x += this.options.columnWidth;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
438
|
+
finally {
|
|
439
|
+
try {
|
|
440
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
441
|
+
}
|
|
442
|
+
finally { if (e_5) throw e_5.error; }
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
Gantt.prototype.make_grid_highlights = function () {
|
|
446
|
+
var e_6, _a;
|
|
447
|
+
if (this.view_is(ViewMode.Day)) {
|
|
448
|
+
var width = this.options.columnWidth;
|
|
449
|
+
var height = (this.options.barHeight + this.options.padding) *
|
|
450
|
+
this.tasks.length +
|
|
451
|
+
this.options.headerHeight +
|
|
452
|
+
this.options.padding / 2;
|
|
453
|
+
var x = 0;
|
|
454
|
+
try {
|
|
455
|
+
for (var _b = __values(this.dates), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
456
|
+
var date = _c.value;
|
|
457
|
+
var y = (this.options.headerHeight + this.options.padding) / 2;
|
|
458
|
+
var isToday = date.toString() == DateUtils.today();
|
|
459
|
+
var isWeekend = (date.getDay() == 0 || date.getDay() == 6);
|
|
460
|
+
var className = void 0;
|
|
461
|
+
if (isToday) {
|
|
462
|
+
className = "today-highlight";
|
|
463
|
+
y = (this.options.headerHeight + this.options.padding) / 2;
|
|
464
|
+
}
|
|
465
|
+
else if (isWeekend) {
|
|
466
|
+
className = "weekend-highlight";
|
|
467
|
+
}
|
|
468
|
+
var rx = 3;
|
|
469
|
+
var ry = 3;
|
|
470
|
+
if (isToday || isWeekend) {
|
|
471
|
+
createSVG("rect", {
|
|
472
|
+
x: x,
|
|
473
|
+
y: y,
|
|
474
|
+
rx: rx,
|
|
475
|
+
ry: ry,
|
|
476
|
+
width: width,
|
|
477
|
+
height: height,
|
|
478
|
+
class: className,
|
|
479
|
+
append_to: this.layers.grid
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
x += this.options.columnWidth;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
486
|
+
finally {
|
|
487
|
+
try {
|
|
488
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
489
|
+
}
|
|
490
|
+
finally { if (e_6) throw e_6.error; }
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
Gantt.prototype.make_dates = function () {
|
|
495
|
+
var dates = this.get_dates_to_draw();
|
|
496
|
+
var isHourView = this.view_is([ViewMode.Hour, ViewMode.QuarterDay, ViewMode.HalfDay]);
|
|
497
|
+
var counter = 0;
|
|
498
|
+
for (var i = 0; i < dates.length; i++) {
|
|
499
|
+
var date = dates[i];
|
|
500
|
+
if (isHourView && date.date >= this._realMinDate && date.date <= this._realMaxDate) {
|
|
501
|
+
createSVG("text", {
|
|
502
|
+
x: date.lower_x,
|
|
503
|
+
y: date.lower_y,
|
|
504
|
+
innerHTML: "H" + counter++ * this.options.step,
|
|
505
|
+
class: "title-1",
|
|
506
|
+
append_to: this.layers.date,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
createSVG("text", {
|
|
510
|
+
x: date.lower_x,
|
|
511
|
+
y: date.lower_y + 20,
|
|
512
|
+
innerHTML: date.lower_text,
|
|
513
|
+
class: "title-2",
|
|
514
|
+
append_to: this.layers.date,
|
|
515
|
+
});
|
|
516
|
+
if (date.upper_text) {
|
|
517
|
+
var $upper_text = createSVG("text", {
|
|
518
|
+
x: date.upper_x,
|
|
519
|
+
y: date.upper_y,
|
|
520
|
+
innerHTML: date.upper_text,
|
|
521
|
+
class: "upper-text",
|
|
522
|
+
append_to: this.layers.date,
|
|
523
|
+
});
|
|
524
|
+
// remove out-of-bound dates
|
|
525
|
+
if ($upper_text.getBBox().x2 > this.layers.grid.getBBox().width) {
|
|
526
|
+
$upper_text.remove();
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
};
|
|
531
|
+
Gantt.prototype.get_dates_to_draw = function () {
|
|
532
|
+
var _this = this;
|
|
533
|
+
var last_date = null;
|
|
534
|
+
var dates = this.dates.map(function (date, i) {
|
|
535
|
+
var d = _this.get_date_info(date, last_date, i);
|
|
536
|
+
last_date = date;
|
|
537
|
+
return d;
|
|
538
|
+
});
|
|
539
|
+
return dates;
|
|
540
|
+
};
|
|
541
|
+
Gantt.prototype.get_date_info = function (date, last_date, i) {
|
|
542
|
+
if (!last_date) {
|
|
543
|
+
last_date = DateUtils.add(date, 1, "year");
|
|
544
|
+
}
|
|
545
|
+
var date_text = {
|
|
546
|
+
hourLower: DateUtils.format(date, "HH:mm", this.options.language),
|
|
547
|
+
quarterDayLower: DateUtils.format(date, "HH:mm", this.options.language),
|
|
548
|
+
halfDayLower: DateUtils.format(date, "HH:mm", this.options.language),
|
|
549
|
+
dayLower: date.getDate() !== last_date.getDate()
|
|
550
|
+
? DateUtils.format(date, "D", this.options.language)
|
|
551
|
+
: "",
|
|
552
|
+
weekLower: date.getMonth() !== last_date.getMonth()
|
|
553
|
+
? DateUtils.format(date, "D MMM", this.options.language)
|
|
554
|
+
: DateUtils.format(date, "D", this.options.language),
|
|
555
|
+
monthLower: DateUtils.format(date, "MMMM", this.options.language),
|
|
556
|
+
yearLower: DateUtils.format(date, "YYYY", this.options.language),
|
|
557
|
+
quarterDayUpper: date.getDate() !== last_date.getDate()
|
|
558
|
+
? DateUtils.format(date, "D MMM", this.options.language)
|
|
559
|
+
: "",
|
|
560
|
+
halfDayUpper: date.getDate() !== last_date.getDate()
|
|
561
|
+
? date.getMonth() !== last_date.getMonth()
|
|
562
|
+
? DateUtils.format(date, "D MMM", this.options.language)
|
|
563
|
+
: DateUtils.format(date, "D", this.options.language)
|
|
564
|
+
: "",
|
|
565
|
+
dayUpper: date.getMonth() !== last_date.getMonth()
|
|
566
|
+
? DateUtils.format(date, "MMMM", this.options.language)
|
|
567
|
+
: "",
|
|
568
|
+
weekUpper: date.getMonth() !== last_date.getMonth()
|
|
569
|
+
? DateUtils.format(date, "MMMM", this.options.language)
|
|
570
|
+
: "",
|
|
571
|
+
monthUpper: date.getFullYear() !== last_date.getFullYear()
|
|
572
|
+
? DateUtils.format(date, "YYYY", this.options.language)
|
|
573
|
+
: "",
|
|
574
|
+
yearUpper: date.getFullYear() !== last_date.getFullYear()
|
|
575
|
+
? DateUtils.format(date, "YYYY", this.options.language)
|
|
576
|
+
: "",
|
|
577
|
+
hour: date.getHours() !== last_date.getHours()
|
|
578
|
+
? DateUtils.format(date, "HH:mm", this.options.language)
|
|
579
|
+
: "",
|
|
580
|
+
};
|
|
581
|
+
// Descontando 20 para adcionar uma segunda linha de informação no cabeçalho
|
|
582
|
+
var base_pos = {
|
|
583
|
+
x: i * this.options.columnWidth,
|
|
584
|
+
lower_y: this.options.headerHeight - 20,
|
|
585
|
+
upper_y: this.options.headerHeight - 20 - 25,
|
|
586
|
+
};
|
|
587
|
+
var x_pos = {
|
|
588
|
+
hourLower: this.options.columnWidth / 2,
|
|
589
|
+
hourUpper: this.options.columnWidth * 24 / 2,
|
|
590
|
+
quarterDayLower: this.options.columnWidth / 2,
|
|
591
|
+
quarterDayUpper: this.options.columnWidth * 4 / 2,
|
|
592
|
+
halfDayLower: this.options.columnWidth / 2,
|
|
593
|
+
halfDayUpper: this.options.columnWidth * 2 / 2,
|
|
594
|
+
dayLower: this.options.columnWidth / 2,
|
|
595
|
+
dayUpper: (this.options.columnWidth * 30) / 2,
|
|
596
|
+
weekLower: 0,
|
|
597
|
+
weekUpper: (this.options.columnWidth * 4) / 2,
|
|
598
|
+
monthLower: this.options.columnWidth / 2,
|
|
599
|
+
monthUpper: (this.options.columnWidth * 12) / 2,
|
|
600
|
+
yearLower: this.options.columnWidth / 2,
|
|
601
|
+
yearUpper: (this.options.columnWidth * 30) / 2,
|
|
602
|
+
};
|
|
603
|
+
return {
|
|
604
|
+
upper_text: date_text[this.options.viewMode + "Upper"],
|
|
605
|
+
lower_text: date_text[this.options.viewMode + "Lower"],
|
|
606
|
+
upper_x: base_pos.x + x_pos[this.options.viewMode + "Upper"],
|
|
607
|
+
upper_y: base_pos.upper_y,
|
|
608
|
+
lower_x: base_pos.x + x_pos[this.options.viewMode + "Lower"],
|
|
609
|
+
lower_y: base_pos.lower_y,
|
|
610
|
+
date: date,
|
|
611
|
+
};
|
|
612
|
+
};
|
|
613
|
+
Gantt.prototype.make_bars = function () {
|
|
614
|
+
var _this = this;
|
|
615
|
+
this.bars = this.tasks.map(function (task) {
|
|
616
|
+
var bar = new Bar(_this, task);
|
|
617
|
+
_this.layers.bar.appendChild(bar.group);
|
|
618
|
+
return bar;
|
|
619
|
+
});
|
|
620
|
+
};
|
|
621
|
+
Gantt.prototype.make_arrows = function () {
|
|
622
|
+
var e_7, _a;
|
|
623
|
+
var _this = this;
|
|
624
|
+
this.arrows = [];
|
|
625
|
+
var _loop_1 = function (task) {
|
|
626
|
+
var arrows = [];
|
|
627
|
+
arrows = task.dependencies
|
|
628
|
+
.map(function (task_id) {
|
|
629
|
+
var dependency = _this.get_task(task_id);
|
|
630
|
+
if (!dependency)
|
|
631
|
+
return;
|
|
632
|
+
var arrow = new Arrow(_this, _this.bars[dependency._index], // from_task
|
|
633
|
+
_this.bars[task._index] // to_task
|
|
634
|
+
);
|
|
635
|
+
_this.layers.arrow.appendChild(arrow.element);
|
|
636
|
+
return arrow;
|
|
637
|
+
})
|
|
638
|
+
.filter(Boolean); // filter falsy values
|
|
639
|
+
this_1.arrows = this_1.arrows.concat(arrows);
|
|
640
|
+
};
|
|
641
|
+
var this_1 = this;
|
|
642
|
+
try {
|
|
643
|
+
for (var _b = __values(this.tasks), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
644
|
+
var task = _c.value;
|
|
645
|
+
_loop_1(task);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
649
|
+
finally {
|
|
650
|
+
try {
|
|
651
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
652
|
+
}
|
|
653
|
+
finally { if (e_7) throw e_7.error; }
|
|
654
|
+
}
|
|
655
|
+
};
|
|
656
|
+
Gantt.prototype.map_arrows_on_bars = function () {
|
|
657
|
+
var e_8, _a;
|
|
658
|
+
var _loop_2 = function (bar) {
|
|
659
|
+
bar.arrows = this_2.arrows.filter(function (arrow) {
|
|
660
|
+
return (arrow.fromTask.task.id === bar.task.id ||
|
|
661
|
+
arrow.toTask.task.id === bar.task.id);
|
|
662
|
+
});
|
|
663
|
+
};
|
|
664
|
+
var this_2 = this;
|
|
665
|
+
try {
|
|
666
|
+
for (var _b = __values(this.bars), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
667
|
+
var bar = _c.value;
|
|
668
|
+
_loop_2(bar);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
672
|
+
finally {
|
|
673
|
+
try {
|
|
674
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
675
|
+
}
|
|
676
|
+
finally { if (e_8) throw e_8.error; }
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
Gantt.prototype.set_width = function () {
|
|
680
|
+
var cur_width = this.$svg.getBoundingClientRect().width;
|
|
681
|
+
var actual_width = this.$svg
|
|
682
|
+
.querySelector(".grid .grid-row")
|
|
683
|
+
.getAttribute("width");
|
|
684
|
+
if (cur_width < actual_width) {
|
|
685
|
+
this.$svg.setAttribute("width", actual_width);
|
|
686
|
+
}
|
|
687
|
+
};
|
|
688
|
+
Gantt.prototype.set_scroll_position = function () {
|
|
689
|
+
var parent_element = this.$svg.parentElement;
|
|
690
|
+
if (!parent_element)
|
|
691
|
+
return;
|
|
692
|
+
var hours_before_first_task = DateUtils.diff(this.get_oldest_starting_date(), this.minDate, "hour");
|
|
693
|
+
var scroll_pos = (hours_before_first_task / this.options.step) *
|
|
694
|
+
this.options.columnWidth -
|
|
695
|
+
this.options.columnWidth;
|
|
696
|
+
parent_element.scrollLeft = scroll_pos;
|
|
697
|
+
};
|
|
698
|
+
Gantt.prototype.bind_grid_click = function () {
|
|
699
|
+
var _this = this;
|
|
700
|
+
$.on(this.$svg, this.options.popupTrigger, ".grid-row, .grid-header", function () {
|
|
701
|
+
_this.unselect_all();
|
|
702
|
+
_this.hide_popup();
|
|
703
|
+
});
|
|
704
|
+
};
|
|
705
|
+
Gantt.prototype.bind_bar_events = function () {
|
|
706
|
+
var _this = this;
|
|
707
|
+
var is_dragging = false;
|
|
708
|
+
var x_on_start = 0;
|
|
709
|
+
var is_resizing_left = false;
|
|
710
|
+
var is_resizing_right = false;
|
|
711
|
+
var parent_bar_id = null;
|
|
712
|
+
var bars = [];
|
|
713
|
+
this.bar_being_dragged = null;
|
|
714
|
+
function action_in_progress() {
|
|
715
|
+
return is_dragging || is_resizing_left || is_resizing_right;
|
|
716
|
+
}
|
|
717
|
+
$.on(this.$svg, "mousedown", ".bar-wrapper, .handle", function (e, element) {
|
|
718
|
+
var bar_wrapper = $.closest(".bar-wrapper", element);
|
|
719
|
+
if (element.classList.contains("left")) {
|
|
720
|
+
is_resizing_left = true;
|
|
721
|
+
}
|
|
722
|
+
else if (element.classList.contains("right")) {
|
|
723
|
+
is_resizing_right = true;
|
|
724
|
+
}
|
|
725
|
+
else if (element.classList.contains("bar-wrapper")) {
|
|
726
|
+
is_dragging = true;
|
|
727
|
+
}
|
|
728
|
+
bar_wrapper.classList.add("active");
|
|
729
|
+
x_on_start = e.offsetX;
|
|
730
|
+
parent_bar_id = bar_wrapper.getAttribute("data-id");
|
|
731
|
+
var ids = __spread([
|
|
732
|
+
parent_bar_id
|
|
733
|
+
], _this.get_all_dependent_tasks(parent_bar_id));
|
|
734
|
+
bars = ids.map(function (id) { return _this.get_bar(id); });
|
|
735
|
+
_this.bar_being_dragged = parent_bar_id;
|
|
736
|
+
bars.forEach(function (bar) {
|
|
737
|
+
var $bar = bar.element;
|
|
738
|
+
$bar.ox = $bar.getX();
|
|
739
|
+
$bar.oy = $bar.getY();
|
|
740
|
+
$bar.owidth = $bar.getWidth();
|
|
741
|
+
$bar.finaldx = 0;
|
|
742
|
+
});
|
|
743
|
+
});
|
|
744
|
+
$.on(this.$svg, "mousemove", function (e) {
|
|
745
|
+
if (!action_in_progress()) {
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
var dx = e.offsetX - x_on_start;
|
|
749
|
+
bars.forEach(function (bar) {
|
|
750
|
+
var $bar = bar.element;
|
|
751
|
+
$bar.finaldx = _this.get_snap_position(dx);
|
|
752
|
+
_this.hide_popup();
|
|
753
|
+
if (is_resizing_left) {
|
|
754
|
+
if (parent_bar_id === bar.task.id) {
|
|
755
|
+
bar.updateBarPosition({
|
|
756
|
+
x: $bar.ox + $bar.finaldx,
|
|
757
|
+
width: $bar.owidth - $bar.finaldx,
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
else {
|
|
761
|
+
bar.updateBarPosition({
|
|
762
|
+
x: $bar.ox + $bar.finaldx,
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
else if (is_resizing_right) {
|
|
767
|
+
if (parent_bar_id === bar.task.id) {
|
|
768
|
+
bar.updateBarPosition({
|
|
769
|
+
width: $bar.owidth + $bar.finaldx,
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
else if (is_dragging) {
|
|
774
|
+
bar.updateBarPosition({ x: $bar.ox + $bar.finaldx });
|
|
775
|
+
}
|
|
776
|
+
});
|
|
777
|
+
}, null);
|
|
778
|
+
document.addEventListener("mouseup", function (e) {
|
|
779
|
+
if (is_dragging || is_resizing_left || is_resizing_right) {
|
|
780
|
+
bars.forEach(function (bar) { return bar.group.classList.remove("active"); });
|
|
781
|
+
}
|
|
782
|
+
is_dragging = false;
|
|
783
|
+
is_resizing_left = false;
|
|
784
|
+
is_resizing_right = false;
|
|
785
|
+
});
|
|
786
|
+
$.on(this.$svg, "mouseup", function (e) {
|
|
787
|
+
_this.bar_being_dragged = null;
|
|
788
|
+
bars.forEach(function (bar) {
|
|
789
|
+
var $bar = bar.element;
|
|
790
|
+
if (!$bar.finaldx)
|
|
791
|
+
return;
|
|
792
|
+
bar.dateChanged();
|
|
793
|
+
bar.setActionCompleted();
|
|
794
|
+
});
|
|
795
|
+
}, null);
|
|
796
|
+
};
|
|
797
|
+
Gantt.prototype.get_all_dependent_tasks = function (task_id) {
|
|
798
|
+
var _this = this;
|
|
799
|
+
var out = [];
|
|
800
|
+
var to_process = [task_id];
|
|
801
|
+
while (to_process.length) {
|
|
802
|
+
var deps = to_process.reduce(function (acc, curr) {
|
|
803
|
+
acc = acc.concat(_this.dependency_map[curr]);
|
|
804
|
+
return acc;
|
|
805
|
+
}, []);
|
|
806
|
+
out = out.concat(deps);
|
|
807
|
+
to_process = deps.filter(function (d) { return !to_process.includes(d); });
|
|
808
|
+
}
|
|
809
|
+
return out.filter(Boolean);
|
|
810
|
+
};
|
|
811
|
+
Gantt.prototype.get_snap_position = function (dx) {
|
|
812
|
+
var odx = dx, rem, position;
|
|
813
|
+
if (this.view_is(ViewMode.Hour)) {
|
|
814
|
+
rem = dx % (this.options.columnWidth / 6);
|
|
815
|
+
position = odx - rem + (rem < this.options.columnWidth / 12 ? 0 : this.options.columnWidth / 6);
|
|
816
|
+
}
|
|
817
|
+
else if (this.view_is(ViewMode.Week)) {
|
|
818
|
+
rem = dx % (this.options.columnWidth / 7);
|
|
819
|
+
position = odx - rem + (rem < this.options.columnWidth / 14 ? 0 : this.options.columnWidth / 7);
|
|
820
|
+
}
|
|
821
|
+
else if (this.view_is(ViewMode.Month)) {
|
|
822
|
+
rem = dx % (this.options.columnWidth / 30);
|
|
823
|
+
position = odx - rem + (rem < this.options.columnWidth / 60 ? 0 : this.options.columnWidth / 30);
|
|
824
|
+
}
|
|
825
|
+
else {
|
|
826
|
+
rem = dx % this.options.columnWidth;
|
|
827
|
+
position = odx - rem + (rem < this.options.columnWidth / 2 ? 0 : this.options.columnWidth);
|
|
828
|
+
}
|
|
829
|
+
return position;
|
|
830
|
+
};
|
|
831
|
+
Gantt.prototype.unselect_all = function () {
|
|
832
|
+
__spread(this.$svg.querySelectorAll(".bar-wrapper")).forEach(function (el) {
|
|
833
|
+
el.classList.remove("active");
|
|
834
|
+
});
|
|
835
|
+
};
|
|
836
|
+
Gantt.prototype.view_is = function (modes) {
|
|
837
|
+
var _this = this;
|
|
838
|
+
if (Array.isArray(modes)) {
|
|
839
|
+
return modes.some(function (mode) { return _this.options.viewMode === mode; });
|
|
840
|
+
}
|
|
841
|
+
return this.options.viewMode === modes;
|
|
842
|
+
};
|
|
843
|
+
Gantt.prototype.get_task = function (id) {
|
|
844
|
+
return this.tasks.find(function (task) {
|
|
845
|
+
return task.id === id;
|
|
846
|
+
});
|
|
847
|
+
};
|
|
848
|
+
Gantt.prototype.get_bar = function (id) {
|
|
849
|
+
return this.bars.find(function (bar) {
|
|
850
|
+
return bar.task.id === id;
|
|
851
|
+
});
|
|
852
|
+
};
|
|
853
|
+
Gantt.prototype.show_popup = function (options) {
|
|
854
|
+
if (!this.popup) {
|
|
855
|
+
this.popup = new Popup(this.popup_wrapper, this.options.customPopupHtml);
|
|
856
|
+
}
|
|
857
|
+
this.popup.show(options);
|
|
858
|
+
};
|
|
859
|
+
Gantt.prototype.hide_popup = function () {
|
|
860
|
+
this.popup && this.popup.hide();
|
|
861
|
+
};
|
|
862
|
+
Gantt.prototype.trigger_event = function (event, args) {
|
|
863
|
+
if (this.options[event]) {
|
|
864
|
+
this.options[event].apply(null, args);
|
|
865
|
+
}
|
|
866
|
+
};
|
|
867
|
+
Gantt.prototype.get_oldest_starting_date = function () {
|
|
868
|
+
return this.tasks
|
|
869
|
+
.map(function (task) { return task._start; })
|
|
870
|
+
.reduce(function (prev_date, cur_date) {
|
|
871
|
+
return cur_date <= prev_date ? cur_date : prev_date;
|
|
872
|
+
});
|
|
873
|
+
};
|
|
874
|
+
Gantt.prototype.clear = function () {
|
|
875
|
+
this.$svg.innerHTML = '';
|
|
876
|
+
};
|
|
877
|
+
return Gantt;
|
|
878
|
+
}());
|
|
879
|
+
export { Gantt };
|
|
880
|
+
function generate_id(task) {
|
|
881
|
+
return task.name + "_" + Math.random().toString(36).slice(2, 12);
|
|
882
|
+
}
|
|
883
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2dhbnR0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzVCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR2xEO0lBNEJJLGVBQVksT0FBWSxFQUFFLEtBQWEsRUFBRSxPQUFpQjtRQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFmRCxzQkFBVywwQkFBTzthQUFsQjtZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQUVELHNCQUFXLDBCQUFPO2FBQWxCO1lBQ0ksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pCLENBQUM7OztPQUFBO0lBV08sNkJBQWEsR0FBckIsVUFBc0IsT0FBWTtRQUM5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RyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMzQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDcEc7YUFBTTtZQUNILEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7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SUFBUztJQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSBcIi4vdXRpbHMvZGF0ZS11dGlsc1wiO1xuaW1wb3J0IHsgJCwgY3JlYXRlU1ZHIH0gZnJvbSBcIi4vdXRpbHMvc3ZnLXV0aWxzXCI7XG5pbXBvcnQgeyBCYXIgfSBmcm9tIFwiLi9iYXJcIjtcbmltcG9ydCB7IFBvcHVwIH0gZnJvbSBcIi4vcG9wdXBcIjtcbmltcG9ydCB7IEFycm93IH0gZnJvbSBcIi4vYXJyb3dcIjtcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL29wdGlvbnNcIjtcbmltcG9ydCB7IGRlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vZ2FudHQtb3B0aW9uc1wiO1xuaW1wb3J0IHsgVmlld01vZGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3ZpZXctbW9kZVwiO1xuaW1wb3J0IHsgVGFzaywgRW5yaWNoZWRUYXNrIH0gZnJvbSBcIi4uLy4uL21vZGVsc1wiO1xuXG5leHBvcnQgY2xhc3MgR2FudHQge1xuICAgIHB1YmxpYyBvcHRpb25zOiBPcHRpb25zO1xuICAgIHB1YmxpYyB0YXNrczogRW5yaWNoZWRUYXNrW107XG4gICAgcHVibGljIGRlcGVuZGVuY3lfbWFwOiBhbnk7XG5cbiAgICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX21heERhdGU6IERhdGU7XG4gICAgcHJpdmF0ZSBfcmVhbE1pbkRhdGU6IERhdGU7XG4gICAgcHJpdmF0ZSBfcmVhbE1heERhdGU6IERhdGU7XG5cbiAgICBwdWJsaWMgZGF0ZXM6IGFueTtcbiAgICBwdWJsaWMgbGF5ZXJzOiBhbnk7XG4gICAgcHVibGljIGJhcnM6IEJhcltdO1xuICAgIHB1YmxpYyBhcnJvd3M6IEFycm93W107XG4gICAgcHVibGljIGJhcl9iZWluZ19kcmFnZ2VkOiBhbnk7XG4gICAgcHVibGljICRzdmc6IGFueTtcbiAgICBwdWJsaWMgJGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHVibGljIHBvcHVwX3dyYXBwZXI6IEhUTUxEaXZFbGVtZW50O1xuICAgIHB1YmxpYyBwb3B1cDogYW55O1xuXG4gICAgcHVibGljIGdldCBtaW5EYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1heERhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHdyYXBwZXI6IGFueSwgdGFza3M6IFRhc2tbXSwgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zZXR1cF93cmFwcGVyKHdyYXBwZXIpO1xuICAgICAgICB0aGlzLnNldHVwX29wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICAvLyBpbml0aWFsaXplIHdpdGggZGVmYXVsdCB2aWV3IG1vZGVcbiAgICAgICAgdGhpcy5jaGFuZ2Vfdmlld19tb2RlKCk7XG4gICAgICAgIHRoaXMuYmluZF9ldmVudHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX3dyYXBwZXIoZWxlbWVudDogYW55KSB7XG4gICAgICAgIGxldCBzdmdfZWxlbWVudCwgd3JhcHBlcl9lbGVtZW50O1xuXG4gICAgICAgIC8vIENTUyBTZWxlY3RvciBpcyBwYXNzZWRcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdldCB0aGUgU1ZHRWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICB3cmFwcGVyX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgc3ZnX2VsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdmdcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHN2Z19lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGcmFwcMOpIEdhbnR0IG9ubHkgc3VwcG9ydHMgdXNhZ2Ugb2YgYSBzdHJpbmcgQ1NTIHNlbGVjdG9yLCBIVE1MIERPTSBlbGVtZW50IG9yIFNWRyBET00gZWxlbWVudCBmb3IgdGhlIFxcJ2VsZW1lbnRcXCcgcGFyYW1ldGVyXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdmcgZWxlbWVudFxuICAgICAgICBpZiAoIXN2Z19lbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgaXRcbiAgICAgICAgICAgIHRoaXMuJHN2ZyA9IGNyZWF0ZVNWRyhcInN2Z1wiLCB7XG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB3cmFwcGVyX2VsZW1lbnQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiZ2FudHRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kc3ZnID0gc3ZnX2VsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLiRzdmcuY2xhc3NMaXN0LmFkZChcImdhbnR0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd3JhcHBlciBlbGVtZW50XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZ2FudHQtY29udGFpbmVyXCIpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudF9lbGVtZW50ID0gdGhpcy4kc3ZnLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIHBhcmVudF9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuJGNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRzdmcpO1xuXG4gICAgICAgIC8vIHBvcHVwIHdyYXBwZXJcbiAgICAgICAgdGhpcy5wb3B1cF93cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5wb3B1cF93cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cC13cmFwcGVyXCIpO1xuICAgICAgICB0aGlzLiRjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5wb3B1cF93cmFwcGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX29wdGlvbnMob3B0aW9uczogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0dXBfdGFza3ModGFza3M6IGFueSkge1xuICAgICAgICAvLyBwcmVwYXJlIHRhc2tzXG4gICAgICAgIHRoaXMudGFza3MgPSB0YXNrcy5tYXAoKHRhc2s6IGFueSwgaTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL3N0YW5kYXJkIGNvbG9ycyBpZiBuZWVkZWRcbiAgICAgICAgICAgIHRhc2suY29sb3IgPSB0YXNrLmNvbG9yIHx8ICcjNzg5MkExJztcblxuICAgICAgICAgICAgLy8gY29udmVydCB0byBEYXRlIG9iamVjdHNcbiAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gRGF0ZVV0aWxzLnBhcnNlKHRhc2suc3RhcnQpO1xuICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLnBhcnNlKHRhc2suZW5kKTtcblxuICAgICAgICAgICAgLy8gbWFrZSB0YXNrIGludmFsaWQgaWYgZHVyYXRpb24gdG9vIGxhcmdlXG4gICAgICAgICAgICBpZiAoRGF0ZVV0aWxzLmRpZmYodGFzay5fZW5kLCB0YXNrLl9zdGFydCwgXCJ5ZWFyXCIpID4gMTApIHtcbiAgICAgICAgICAgICAgICB0YXNrLmVuZCA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhY2hlIGluZGV4XG4gICAgICAgICAgICB0YXNrLl9pbmRleCA9IGk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFzay5fcm93X2lkID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgdGFzay5faW5kZXggPSB0YXNrLl9yb3dfaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGludmFsaWQgZGF0ZXNcbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCAmJiAhdGFzay5lbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2RheSA9IERhdGVVdGlscy50b2RheSgpO1xuICAgICAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gdG9kYXk7XG4gICAgICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLmFkZCh0b2RheSwgMiwgXCJkYXlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCAmJiB0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIHRhc2suX3N0YXJ0ID0gRGF0ZVV0aWxzLmFkZCh0YXNrLl9lbmQsIC0yLCAnZGF5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXNrLnN0YXJ0ICYmICF0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIHRhc2suX2VuZCA9IERhdGVVdGlscy5hZGQodGFzay5fc3RhcnQsIDIsIFwiZGF5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBob3VycyBpcyBub3Qgc2V0LCBhc3N1bWUgdGhlIGxhc3QgZGF5IGlzIGZ1bGwgZGF5XG4gICAgICAgICAgICAvLyBlLmc6IDIwMTgtMDktMDkgYmVjb21lcyAyMDE4LTA5LTA5IDIzOjU5OjU5XG4gICAgICAgICAgICBjb25zdCB0YXNrX2VuZF92YWx1ZXMgPSBEYXRlVXRpbHMuZ2V0RGF0ZVZhbHVlcyh0YXNrLl9lbmQpO1xuICAgICAgICAgICAgaWYgKHRhc2tfZW5kX3ZhbHVlcy5zbGljZSgzKS5ldmVyeSgoZCkgPT4gZCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMuYWRkKHRhc2suX2VuZCwgMjQsIFwiaG91clwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW52YWxpZCBmbGFnXG4gICAgICAgICAgICBpZiAoIXRhc2suc3RhcnQgfHwgIXRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRhc2suZGVwZW5kZW5jaWVzID09PSBcInN0cmluZ1wiIHx8ICF0YXNrLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgIGxldCBkZXBzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHRhc2suZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHMgPSB0YXNrLmRlcGVuZGVuY2llc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGQ6IGFueSkgPT4gZC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+IGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrLmRlcGVuZGVuY2llcyA9IGRlcHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVpZHNcbiAgICAgICAgICAgIGlmICghdGFzay5pZCkge1xuICAgICAgICAgICAgICAgIHRhc2suaWQgPSBnZW5lcmF0ZV9pZCh0YXNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2V0dXBfZGVwZW5kZW5jaWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9kZXBlbmRlbmNpZXMoKSB7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jeV9tYXAgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRhc2tzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIHQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcFtkXSA9IHRoaXMuZGVwZW5kZW5jeV9tYXBbZF0gfHwgW107XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcFtkXS5wdXNoKHQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2godGFza3M6IFRhc2tbXSkge1xuICAgICAgICB0aGlzLnNldHVwX3Rhc2tzKHRhc2tzKTtcbiAgICAgICAgdGhpcy5jaGFuZ2Vfdmlld19tb2RlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZV92aWV3X21vZGUobW9kZSA9IHRoaXMub3B0aW9ucy52aWV3TW9kZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZV92aWV3X3NjYWxlKG1vZGUpO1xuICAgICAgICB0aGlzLnNldHVwX2RhdGVzKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIC8vIGZpcmUgdmlld21vZGVfY2hhbmdlIGV2ZW50XG4gICAgICAgIHRoaXMudHJpZ2dlcl9ldmVudChcIm9uVmlld0NoYW5nZVwiLCBbbW9kZV0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlX3ZpZXdfc2NhbGUodmlld19tb2RlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnZpZXdNb2RlID0gdmlld19tb2RlO1xuICAgICAgICAvLyB0aGlzLmlzSG91clZpZXcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuSG91cikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDI0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgICAgICAvLyB0aGlzLmlzSG91clZpZXcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5IYWxmRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuUXVhcnRlckRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDQ7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLldlZWspIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiA3O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gMTQwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuTW9udGgpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzMDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDEyMDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlllYXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzNjU7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSAxMjA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RhdGVzKCkge1xuICAgICAgICB0aGlzLnNldHVwX2dhbnR0X2RhdGVzKCk7XG4gICAgICAgIHRoaXMuc2V0dXBfZGF0ZV92YWx1ZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2dhbnR0X2RhdGVzKCkge1xuICAgICAgICB0aGlzLl9taW5EYXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgdGFzayBvZiB0aGlzLnRhc2tzKSB7XG4gICAgICAgICAgICAvLyBzZXQgZ2xvYmFsIHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1pbkRhdGUgfHwgdGFzay5zdGFydCA8IHRoaXMubWluRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSB0YXNrLnN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1heERhdGUgfHwgdGFzay5lbmQgPiB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGFzay5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWFsTWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgdGhpcy5fcmVhbE1heERhdGUgPSB0aGlzLm1heERhdGU7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudmlld01vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSG91cjpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5RdWFydGVyRGF5OlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMTIpLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMTIsIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSGFsZkRheTpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuRGF5OlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMyksIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDMsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5XZWVrOlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMSksIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuTW9udGg6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuWWVhcjpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDIpLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMiwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9kYXRlX3ZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5kYXRlcyA9IFtdO1xuICAgICAgICBsZXQgY3VyX2RhdGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJfZGF0ZSA9PT0gbnVsbCB8fCBjdXJfZGF0ZSA8IHRoaXMubWF4RGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFjdXJfZGF0ZSkge1xuICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmNsb25lKHRoaXMubWluRGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuWWVhcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuYWRkKGN1cl9kYXRlLCAxLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmFkZChjdXJfZGF0ZSwgMSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2hvdXInXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXRlcy5wdXNoKGN1cl9kYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY3VyX2RhdGVcIiwgY3VyX2RhdGUpO1xuICAgICAgICBjb25zb2xlLmxvZyhcImRhdGVzXCIsIHRoaXMuZGF0ZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ldmVudHMoKSB7XG4gICAgICAgIHRoaXMuYmluZF9ncmlkX2NsaWNrKCk7XG4gICAgICAgIHRoaXMuYmluZF9iYXJfZXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZXR1cF9sYXllcnMoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2RhdGVzKCk7XG4gICAgICAgIHRoaXMubWFrZV9iYXJzKCk7XG4gICAgICAgIHRoaXMubWFrZV9hcnJvd3MoKTtcbiAgICAgICAgdGhpcy5tYXBfYXJyb3dzX29uX2JhcnMoKTtcbiAgICAgICAgdGhpcy5zZXRfd2lkdGgoKTtcbiAgICAgICAgdGhpcy5zZXRfc2Nyb2xsX3Bvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9sYXllcnMoKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzID0ge307XG4gICAgICAgIGNvbnN0IGxheWVycyA9IFtcImdyaWRcIiwgXCJkYXRlXCIsIFwiYXJyb3dcIiwgXCJwcm9ncmVzc1wiLCBcImJhclwiLCBcImRldGFpbHNcIl07XG4gICAgICAgIC8vIG1ha2UgZ3JvdXAgbGF5ZXJzXG4gICAgICAgIGZvciAobGV0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5sYXllcnNbbGF5ZXJdID0gY3JlYXRlU1ZHKCdnJywge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBsYXllcixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMuJHN2ZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWQoKSB7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX2JhY2tncm91bmQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfcm93cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF9oZWFkZXIoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfaGlnaGxpZ2h0cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF90aWNrcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX2JhY2tncm91bmQoKSB7XG4gICAgICAgIGNvbnN0IGdyaWRfd2lkdGggPSB0aGlzLmRhdGVzLmxlbmd0aCAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgZGlzdGluY3Rfcm93cyA9IFsuLi5uZXcgU2V0KHRoaXMudGFza3MubWFwKCh4OiBhbnkpID0+IHguX3Jvd19pZCkpXTtcbiAgICAgICAgY29uc3QgZ3JpZF9oZWlnaHQgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMiArXG4gICAgICAgICAgICAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICBkaXN0aW5jdF9yb3dzLmxlbmd0aDtcblxuICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgd2lkdGg6IGdyaWRfd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGdyaWRfaGVpZ2h0LFxuICAgICAgICAgICAgY2xhc3M6IFwiZ3JpZC1iYWNrZ3JvdW5kXCIsXG4gICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQuYXR0cih0aGlzLiRzdmcsIHtcbiAgICAgICAgICAgIGhlaWdodDogZ3JpZF9oZWlnaHQsXG4gICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIH0sIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX3Jvd3MoKSB7XG4gICAgICAgIGNvbnN0IHJvd3NfbGF5ZXIgPSBjcmVhdGVTVkcoXCJnXCIsIHsgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkIH0pO1xuICAgICAgICBjb25zdCBsaW5lc19sYXllciA9IGNyZWF0ZVNWRyhcImdcIiwgeyBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQgfSk7XG5cbiAgICAgICAgY29uc3Qgcm93X3dpZHRoID0gdGhpcy5kYXRlcy5sZW5ndGggKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgIGNvbnN0IHJvd19oZWlnaHQgPSB0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmc7XG4gICAgICAgIC8vVE9ETzogIGFqdXN0YXIgbyBwb3NpY2lvbmFtZW50byBkYXMgbGluaGFzXG4gICAgICAgIGxldCByb3dfeSA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZyAvIDI7XG5cbiAgICAgICAgdGhpcy50YXNrcy5mb3JFYWNoKF8gPT4ge1xuICAgICAgICAgICAgY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiByb3dfeSxcbiAgICAgICAgICAgICAgICB3aWR0aDogcm93X3dpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogcm93X2hlaWdodCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJncmlkLXJvd1wiLFxuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogcm93c19sYXllcixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjcmVhdGVTVkcoXCJsaW5lXCIsIHtcbiAgICAgICAgICAgICAgICB4MTogMCxcbiAgICAgICAgICAgICAgICB5MTogcm93X3kgKyByb3dfaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHgyOiByb3dfd2lkdGgsXG4gICAgICAgICAgICAgICAgeTI6IHJvd195ICsgcm93X2hlaWdodCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJyb3ctbGluZVwiLFxuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogbGluZXNfbGF5ZXIsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcm93X3kgKz0gdGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF9oZWFkZXIoKSB7XG4gICAgICAgIC8vIGNvbnN0IGFkZElzSG91clZpZXcgPSB0aGlzLmlzSG91clZpZXcgPyAyNSA6IDEwXG4gICAgICAgIGNvbnN0IGhlYWRlcl93aWR0aCA9IHRoaXMuZGF0ZXMubGVuZ3RoICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCBoZWFkZXJfaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIDEwO1xuICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgd2lkdGg6IGhlYWRlcl93aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVhZGVyX2hlaWdodCxcbiAgICAgICAgICAgIGNsYXNzOiBcImdyaWQtaGVhZGVyXCIsXG4gICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX3RpY2tzKCkge1xuICAgICAgICBsZXQgdGlja194ID0gMDtcbiAgICAgICAgbGV0IHRpY2tfeSA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZyAvIDI7XG4gICAgICAgIGxldCB0aWNrX2hlaWdodCA9XG4gICAgICAgICAgICAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICB0aGlzLnRhc2tzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBkYXRlIG9mIHRoaXMuZGF0ZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWNrX2NsYXNzID0gXCJ0aWNrXCI7XG4gICAgICAgICAgICAvLyB0aGljayB0aWNrIGZvciBtb25kYXlcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuRGF5KSAmJiBkYXRlLmdldERhdGUoKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIGZpcnN0IHdlZWtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdfaXMoVmlld01vZGUuV2VlaykgJiZcbiAgICAgICAgICAgICAgICBkYXRlLmdldERhdGUoKSA+PSAxICYmXG4gICAgICAgICAgICAgICAgZGF0ZS5nZXREYXRlKCkgPCA4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGljayB0aWNrcyBmb3IgcXVhcnRlcnNcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpICYmIGRhdGUuZ2V0TW9udGgoKSAlIDMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInBhdGhcIiwge1xuICAgICAgICAgICAgICAgIGQ6IGBNICR7dGlja194fSAke3RpY2tfeX0gdiAke3RpY2tfaGVpZ2h0fWAsXG4gICAgICAgICAgICAgICAgY2xhc3M6IHRpY2tfY2xhc3MsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICAgICAgdGlja194ICs9XG4gICAgICAgICAgICAgICAgICAgIChEYXRlVXRpbHMuZ2V0RGF5c0luTW9udGgoZGF0ZSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoKSAvXG4gICAgICAgICAgICAgICAgICAgIDMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWNrX3ggKz0gdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZV9ncmlkX2hpZ2hsaWdodHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuRGF5KSkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcblxuICAgICAgICAgICAgbGV0IHggPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBkYXRlIG9mIHRoaXMuZGF0ZXMpIHtcblxuICAgICAgICAgICAgICAgIGxldCB5ID0gKHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgLyAyO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzVG9kYXkgPSBkYXRlLnRvU3RyaW5nKCkgPT0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzV2Vla2VuZCA9IChkYXRlLmdldERheSgpID09IDAgfHwgZGF0ZS5nZXREYXkoKSA9PSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gXCJ0b2RheS1oaWdobGlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgeSA9ICh0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpIC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBcIndlZWtlbmQtaGlnaGxpZ2h0XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcnggPSAzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ5ID0gMztcblxuICAgICAgICAgICAgICAgIGlmIChpc1RvZGF5IHx8IGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcngsXG4gICAgICAgICAgICAgICAgICAgICAgICByeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4ICs9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9kYXRlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmdldF9kYXRlc190b19kcmF3KCk7XG4gICAgICAgIGNvbnN0IGlzSG91clZpZXcgPSB0aGlzLnZpZXdfaXMoW1ZpZXdNb2RlLkhvdXIsIFZpZXdNb2RlLlF1YXJ0ZXJEYXksIFZpZXdNb2RlLkhhbGZEYXldKTtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBkYXRlc1tpXTtcblxuICAgICAgICAgICAgaWYgKGlzSG91clZpZXcgJiYgZGF0ZS5kYXRlID49IHRoaXMuX3JlYWxNaW5EYXRlICYmIGRhdGUuZGF0ZSA8PSB0aGlzLl9yZWFsTWF4RGF0ZSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLmxvd2VyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUubG93ZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBgSCR7Y291bnRlcisrICogdGhpcy5vcHRpb25zLnN0ZXB9YCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFwidGl0bGUtMVwiLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmRhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgIHg6IGRhdGUubG93ZXJfeCxcbiAgICAgICAgICAgICAgICB5OiBkYXRlLmxvd2VyX3kgKyAyMCxcbiAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUubG93ZXJfdGV4dCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJ0aXRsZS0yXCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkYXRlLnVwcGVyX3RleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkdXBwZXJfdGV4dCA9IGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLnVwcGVyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUudXBwZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBkYXRlLnVwcGVyX3RleHQsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBcInVwcGVyLXRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG91dC1vZi1ib3VuZCBkYXRlc1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQuZ2V0QkJveCgpLngyID4gdGhpcy5sYXllcnMuZ3JpZC5nZXRCQm94KCkud2lkdGhcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfZGF0ZXNfdG9fZHJhdygpIHtcbiAgICAgICAgbGV0IGxhc3RfZGF0ZTogYW55ID0gbnVsbDtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmRhdGVzLm1hcCgoZGF0ZTogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmdldF9kYXRlX2luZm8oZGF0ZSwgbGFzdF9kYXRlLCBpKTtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkYXRlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9kYXRlX2luZm8oZGF0ZTogRGF0ZSwgbGFzdF9kYXRlOiBEYXRlLCBpOiBhbnkpIHtcbiAgICAgICAgaWYgKCFsYXN0X2RhdGUpIHtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IERhdGVVdGlscy5hZGQoZGF0ZSwgMSwgXCJ5ZWFyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGVfdGV4dCA9IHtcbiAgICAgICAgICAgIGhvdXJMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGRheUxvd2VyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgd2Vla0xvd2VyOiBkYXRlLmdldE1vbnRoKCkgIT09IGxhc3RfZGF0ZS5nZXRNb250aCgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRCBNTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgbW9udGhMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIk1NTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgeWVhckxvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiWVlZWVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICBxdWFydGVyRGF5VXBwZXI6IGRhdGUuZ2V0RGF0ZSgpICE9PSBsYXN0X2RhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRCBNTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgaGFsZkRheVVwcGVyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gZGF0ZS5nZXRNb250aCgpICE9PSBsYXN0X2RhdGUuZ2V0TW9udGgoKVxuICAgICAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgZGF5VXBwZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJNTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIHdlZWtVcHBlcjogZGF0ZS5nZXRNb250aCgpICE9PSBsYXN0X2RhdGUuZ2V0TW9udGgoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIk1NTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgbW9udGhVcHBlcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSBsYXN0X2RhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgeWVhclVwcGVyOiBkYXRlLmdldEZ1bGxZZWFyKCkgIT09IGxhc3RfZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiWVlZWVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICBob3VyOiBkYXRlLmdldEhvdXJzKCkgIT09IGxhc3RfZGF0ZS5nZXRIb3VycygpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiSEg6bW1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBEZXNjb250YW5kbyAyMCBwYXJhIGFkY2lvbmFyIHVtYSBzZWd1bmRhIGxpbmhhIGRlIGluZm9ybWHDp8OjbyBubyBjYWJlw6dhbGhvXG4gICAgICAgIGNvbnN0IGJhc2VfcG9zID0ge1xuICAgICAgICAgICAgeDogaSAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCxcbiAgICAgICAgICAgIGxvd2VyX3k6IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgLSAyMCxcbiAgICAgICAgICAgIHVwcGVyX3k6IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgLSAyMCAtIDI1LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHhfcG9zID0ge1xuICAgICAgICAgICAgaG91ckxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgaG91clVwcGVyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAyNCAvIDIsXG4gICAgICAgICAgICBxdWFydGVyRGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBxdWFydGVyRGF5VXBwZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDQgLyAyLFxuICAgICAgICAgICAgaGFsZkRheUxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgaGFsZkRheVVwcGVyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAyIC8gMixcbiAgICAgICAgICAgIGRheUxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgZGF5VXBwZXI6ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAzMCkgLyAyLFxuICAgICAgICAgICAgd2Vla0xvd2VyOiAwLFxuICAgICAgICAgICAgd2Vla1VwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCkgLyAyLFxuICAgICAgICAgICAgbW9udGhMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIG1vbnRoVXBwZXI6ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAxMikgLyAyLFxuICAgICAgICAgICAgeWVhckxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgeWVhclVwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMzApIC8gMixcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBwZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgbG93ZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeTogYmFzZV9wb3MudXBwZXJfeSxcbiAgICAgICAgICAgIGxvd2VyX3g6IGJhc2VfcG9zLnggKyB4X3Bvc1tgJHt0aGlzLm9wdGlvbnMudmlld01vZGV9TG93ZXJgXSxcbiAgICAgICAgICAgIGxvd2VyX3k6IGJhc2VfcG9zLmxvd2VyX3ksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9iYXJzKCkge1xuICAgICAgICB0aGlzLmJhcnMgPSB0aGlzLnRhc2tzLm1hcCgodGFzazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBuZXcgQmFyKHRoaXMsIHRhc2spO1xuICAgICAgICAgICAgdGhpcy5sYXllcnMuYmFyLmFwcGVuZENoaWxkKGJhci5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gYmFyO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfYXJyb3dzKCkge1xuICAgICAgICB0aGlzLmFycm93cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGxldCBhcnJvd3MgPSBbXTtcbiAgICAgICAgICAgIGFycm93cyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgLm1hcCgodGFza19pZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY3kgPSB0aGlzLmdldF90YXNrKHRhc2tfaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyb3cgPSBuZXcgQXJyb3coXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJzW2RlcGVuZGVuY3kuX2luZGV4XSwgLy8gZnJvbV90YXNrXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhcnNbdGFzay5faW5kZXhdIC8vIHRvX3Rhc2tcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMuYXJyb3cuYXBwZW5kQ2hpbGQoYXJyb3cuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJvdztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7IC8vIGZpbHRlciBmYWxzeSB2YWx1ZXNcbiAgICAgICAgICAgIHRoaXMuYXJyb3dzID0gdGhpcy5hcnJvd3MuY29uY2F0KGFycm93cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcF9hcnJvd3Nfb25fYmFycygpIHtcbiAgICAgICAgZm9yIChsZXQgYmFyIG9mIHRoaXMuYmFycykge1xuICAgICAgICAgICAgYmFyLmFycm93cyA9IHRoaXMuYXJyb3dzLmZpbHRlcigoYXJyb3c6IEFycm93KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cuZnJvbVRhc2sudGFzay5pZCA9PT0gYmFyLnRhc2suaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cudG9UYXNrLnRhc2suaWQgPT09IGJhci50YXNrLmlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRfd2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGN1cl93aWR0aCA9IHRoaXMuJHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgY29uc3QgYWN0dWFsX3dpZHRoID0gdGhpcy4kc3ZnXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvcihcIi5ncmlkIC5ncmlkLXJvd1wiKVxuICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShcIndpZHRoXCIpO1xuICAgICAgICBpZiAoY3VyX3dpZHRoIDwgYWN0dWFsX3dpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYWN0dWFsX3dpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0X3Njcm9sbF9wb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKCFwYXJlbnRfZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGhvdXJzX2JlZm9yZV9maXJzdF90YXNrID0gRGF0ZVV0aWxzLmRpZmYoXG4gICAgICAgICAgICB0aGlzLmdldF9vbGRlc3Rfc3RhcnRpbmdfZGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5taW5EYXRlLFxuICAgICAgICAgICAgXCJob3VyXCJcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzY3JvbGxfcG9zID1cbiAgICAgICAgICAgIChob3Vyc19iZWZvcmVfZmlyc3RfdGFzayAvIHRoaXMub3B0aW9ucy5zdGVwKSAqXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuXG4gICAgICAgIHBhcmVudF9lbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxfcG9zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ncmlkX2NsaWNrKCkge1xuICAgICAgICAkLm9uKFxuICAgICAgICAgICAgdGhpcy4kc3ZnLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvcHVwVHJpZ2dlcixcbiAgICAgICAgICAgIFwiLmdyaWQtcm93LCAuZ3JpZC1oZWFkZXJcIixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0X2FsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZV9wb3B1cCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9iYXJfZXZlbnRzKCkge1xuICAgICAgICBsZXQgaXNfZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHhfb25fc3RhcnQgPSAwO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfbGVmdCA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfcmlnaHQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhcmVudF9iYXJfaWQ6IGFueSA9IG51bGw7XG4gICAgICAgIGxldCBiYXJzOiBCYXJbXSA9IFtdO1xuICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gbnVsbDtcblxuICAgICAgICBmdW5jdGlvbiBhY3Rpb25faW5fcHJvZ3Jlc3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNfZHJhZ2dpbmcgfHwgaXNfcmVzaXppbmdfbGVmdCB8fCBpc19yZXNpemluZ19yaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNlZG93blwiLCBcIi5iYXItd3JhcHBlciwgLmhhbmRsZVwiLCAoZTogYW55LCBlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhcl93cmFwcGVyID0gJC5jbG9zZXN0KFwiLmJhci13cmFwcGVyXCIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJsZWZ0XCIpKSB7XG4gICAgICAgICAgICAgICAgaXNfcmVzaXppbmdfbGVmdCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmlnaHRcIikpIHtcbiAgICAgICAgICAgICAgICBpc19yZXNpemluZ19yaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYmFyLXdyYXBwZXJcIikpIHtcbiAgICAgICAgICAgICAgICBpc19kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJhcl93cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG5cbiAgICAgICAgICAgIHhfb25fc3RhcnQgPSBlLm9mZnNldFg7XG5cbiAgICAgICAgICAgIHBhcmVudF9iYXJfaWQgPSBiYXJfd3JhcHBlci5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gW1xuICAgICAgICAgICAgICAgIHBhcmVudF9iYXJfaWQsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRfYWxsX2RlcGVuZGVudF90YXNrcyhwYXJlbnRfYmFyX2lkKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBiYXJzID0gaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2V0X2JhcihpZCkpO1xuXG4gICAgICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gcGFyZW50X2Jhcl9pZDtcblxuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgJGJhci5veCA9ICRiYXIuZ2V0WCgpO1xuICAgICAgICAgICAgICAgICRiYXIub3kgPSAkYmFyLmdldFkoKTtcbiAgICAgICAgICAgICAgICAkYmFyLm93aWR0aCA9ICRiYXIuZ2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICAkYmFyLmZpbmFsZHggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNlbW92ZVwiLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWFjdGlvbl9pbl9wcm9ncmVzcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkeCA9IGUub2Zmc2V0WCAtIHhfb25fc3RhcnQ7XG5cbiAgICAgICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGJhciA9IGJhci5lbGVtZW50O1xuICAgICAgICAgICAgICAgICRiYXIuZmluYWxkeCA9IHRoaXMuZ2V0X3NuYXBfcG9zaXRpb24oZHgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZV9wb3B1cCgpO1xuICAgICAgICAgICAgICAgIGlmIChpc19yZXNpemluZ19sZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfYmFyX2lkID09PSBiYXIudGFzay5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAkYmFyLm94ICsgJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAkYmFyLm93aWR0aCAtICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAkYmFyLm94ICsgJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3Jlc2l6aW5nX3JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfYmFyX2lkID09PSBiYXIudGFzay5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJGJhci5vd2lkdGggKyAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFyLnVwZGF0ZUJhclBvc2l0aW9uKHsgeDogJGJhci5veCArICRiYXIuZmluYWxkeCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgbnVsbCk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzX2RyYWdnaW5nIHx8IGlzX3Jlc2l6aW5nX2xlZnQgfHwgaXNfcmVzaXppbmdfcmlnaHQpIHtcbiAgICAgICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4gYmFyLmdyb3VwLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpc19kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgaXNfcmVzaXppbmdfbGVmdCA9IGZhbHNlO1xuICAgICAgICAgICAgaXNfcmVzaXppbmdfcmlnaHQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJC5vbih0aGlzLiRzdmcsIFwibW91c2V1cFwiLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gbnVsbDtcbiAgICAgICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGJhciA9IGJhci5lbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghJGJhci5maW5hbGR4KSByZXR1cm47XG4gICAgICAgICAgICAgICAgYmFyLmRhdGVDaGFuZ2VkKCk7XG4gICAgICAgICAgICAgICAgYmFyLnNldEFjdGlvbkNvbXBsZXRlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X2FsbF9kZXBlbmRlbnRfdGFza3ModGFza19pZDogYW55KSB7XG4gICAgICAgIGxldCBvdXQ6IGFueVtdID0gW107XG4gICAgICAgIGxldCB0b19wcm9jZXNzID0gW3Rhc2tfaWRdO1xuICAgICAgICB3aGlsZSAodG9fcHJvY2Vzcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcHMgPSB0b19wcm9jZXNzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjID0gYWNjLmNvbmNhdCh0aGlzLmRlcGVuZGVuY3lfbWFwW2N1cnJdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICBvdXQgPSBvdXQuY29uY2F0KGRlcHMpO1xuICAgICAgICAgICAgdG9fcHJvY2VzcyA9IGRlcHMuZmlsdGVyKChkOiBhbnkpID0+ICF0b19wcm9jZXNzLmluY2x1ZGVzKGQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXQuZmlsdGVyKEJvb2xlYW4pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X3NuYXBfcG9zaXRpb24oZHg6IGFueSkge1xuICAgICAgICBsZXQgb2R4ID0gZHgsXG4gICAgICAgICAgICByZW0sXG4gICAgICAgICAgICBwb3NpdGlvbjtcblxuICAgICAgICBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLkhvdXIpKSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA2KTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDEyID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDYpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5XZWVrKSkge1xuICAgICAgICAgICAgcmVtID0gZHggJSAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNyk7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAxNCA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA3KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAzMCk7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA2MCA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAzMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHVuc2VsZWN0X2FsbCgpIHtcbiAgICAgICAgWy4uLnRoaXMuJHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLmJhci13cmFwcGVyXCIpXS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHZpZXdfaXMobW9kZXM6IFZpZXdNb2RlIHwgVmlld01vZGVbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBtb2Rlcy5zb21lKChtb2RlKSA9PiB0aGlzLm9wdGlvbnMudmlld01vZGUgPT09IG1vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy52aWV3TW9kZSA9PT0gbW9kZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfdGFzayhpZDogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tzLmZpbmQoKHRhc2s6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhc2suaWQgPT09IGlkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0X2JhcihpZDogYW55KTogQmFyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFycy5maW5kKChiYXI6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJhci50YXNrLmlkID09PSBpZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dfcG9wdXAob3B0aW9uczogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5wb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cCA9IG5ldyBQb3B1cChcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmN1c3RvbVBvcHVwSHRtbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcHVwLnNob3cob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlX3BvcHVwKCkge1xuICAgICAgICB0aGlzLnBvcHVwICYmIHRoaXMucG9wdXAuaGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyX2V2ZW50KGV2ZW50OiBzdHJpbmcsIGFyZ3M6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zW2V2ZW50XSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zW2V2ZW50XS5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X29sZGVzdF9zdGFydGluZ19kYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrc1xuICAgICAgICAgICAgLm1hcCgodGFzazogYW55KSA9PiB0YXNrLl9zdGFydClcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZfZGF0ZTogYW55LCBjdXJfZGF0ZTogYW55KSA9PlxuICAgICAgICAgICAgICAgIGN1cl9kYXRlIDw9IHByZXZfZGF0ZSA/IGN1cl9kYXRlIDogcHJldl9kYXRlXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuJHN2Zy5pbm5lckhUTUwgPSAnJztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlX2lkKHRhc2s6IGFueSkge1xuICAgIHJldHVybiB0YXNrLm5hbWUgKyBcIl9cIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEyKTtcbn1cbiJdfQ==
|