@decidables/accumulable-elements 0.1.2 → 0.2.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.
@@ -10,20 +10,20 @@
10
10
  * SPDX-License-Identifier: BSD-3-Clause
11
11
  */
12
12
  const t$1 = globalThis,
13
- e$2 = t$1.ShadowRoot && (void 0 === t$1.ShadyCSS || t$1.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
14
- s$2 = Symbol(),
13
+ e$2 = t$1.ShadowRoot && (undefined === t$1.ShadyCSS || t$1.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
14
+ s$1 = Symbol(),
15
15
  o$3 = new WeakMap();
16
16
  let n$2 = class n {
17
17
  constructor(t, e, o) {
18
- if (this._$cssResult$ = !0, o !== s$2) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
18
+ if (this._$cssResult$ = true, o !== s$1) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
19
19
  this.cssText = t, this.t = e;
20
20
  }
21
21
  get styleSheet() {
22
22
  let t = this.o;
23
23
  const s = this.t;
24
- if (e$2 && void 0 === t) {
25
- const e = void 0 !== s && 1 === s.length;
26
- e && (t = o$3.get(s)), void 0 === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && o$3.set(s, t));
24
+ if (e$2 && undefined === t) {
25
+ const e = undefined !== s && 1 === s.length;
26
+ e && (t = o$3.get(s)), undefined === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && o$3.set(s, t));
27
27
  }
28
28
  return t;
29
29
  }
@@ -31,20 +31,20 @@
31
31
  return this.cssText;
32
32
  }
33
33
  };
34
- const r$3 = t => new n$2("string" == typeof t ? t : t + "", void 0, s$2),
35
- i$2 = (t, ...e) => {
34
+ const r$3 = t => new n$2("string" == typeof t ? t : t + "", undefined, s$1),
35
+ i$3 = (t, ...e) => {
36
36
  const o = 1 === t.length ? t[0] : e.reduce((e, s, o) => e + (t => {
37
- if (!0 === t._$cssResult$) return t.cssText;
37
+ if (true === t._$cssResult$) return t.cssText;
38
38
  if ("number" == typeof t) return t;
39
39
  throw Error("Value passed to 'css' function must be a 'css' function result: " + t + ". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.");
40
40
  })(s) + t[o + 1], t[0]);
41
- return new n$2(o, t, s$2);
41
+ return new n$2(o, t, s$1);
42
42
  },
43
43
  S$1 = (s, o) => {
44
44
  if (e$2) s.adoptedStyleSheets = o.map(t => t instanceof CSSStyleSheet ? t : t.styleSheet);else for (const e of o) {
45
45
  const o = document.createElement("style"),
46
46
  n = t$1.litNonce;
47
- void 0 !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
47
+ undefined !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
48
48
  }
49
49
  },
50
50
  c$2 = e$2 ? t => t : t => t instanceof CSSStyleSheet ? (t => {
@@ -59,7 +59,7 @@
59
59
  * SPDX-License-Identifier: BSD-3-Clause
60
60
  */
61
61
  const {
62
- is: i$1,
62
+ is: i$2,
63
63
  defineProperty: e$1,
64
64
  getOwnPropertyDescriptor: r$2,
65
65
  getOwnPropertyNames: h$1,
@@ -103,12 +103,12 @@
103
103
  return i;
104
104
  }
105
105
  },
106
- f$1 = (t, s) => !i$1(t, s),
106
+ f$1 = (t, s) => !i$2(t, s),
107
107
  y$2 = {
108
- attribute: !0,
108
+ attribute: true,
109
109
  type: String,
110
110
  converter: u$1,
111
- reflect: !1,
111
+ reflect: false,
112
112
  hasChanged: f$1
113
113
  };
114
114
  Symbol.metadata ??= Symbol("metadata"), a$1.litPropertyMetadata ??= new WeakMap();
@@ -120,10 +120,10 @@
120
120
  return this.finalize(), this._$Eh && [...this._$Eh.keys()];
121
121
  }
122
122
  static createProperty(t, s = y$2) {
123
- if (s.state && (s.attribute = !1), this._$Ei(), this.elementProperties.set(t, s), !s.noAccessor) {
123
+ if (s.state && (s.attribute = false), this._$Ei(), this.elementProperties.set(t, s), !s.noAccessor) {
124
124
  const i = Symbol(),
125
125
  r = this.getPropertyDescriptor(t, i, s);
126
- void 0 !== r && e$1(this.prototype, t, r);
126
+ undefined !== r && e$1(this.prototype, t, r);
127
127
  }
128
128
  }
129
129
  static getPropertyDescriptor(t, s, i) {
@@ -146,8 +146,8 @@
146
146
  const r = e?.call(this);
147
147
  h.call(this, s), this.requestUpdate(t, r, i);
148
148
  },
149
- configurable: !0,
150
- enumerable: !0
149
+ configurable: true,
150
+ enumerable: true
151
151
  };
152
152
  }
153
153
  static getPropertyOptions(t) {
@@ -156,11 +156,11 @@
156
156
  static _$Ei() {
157
157
  if (this.hasOwnProperty(d$1("elementProperties"))) return;
158
158
  const t = n$1(this);
159
- t.finalize(), void 0 !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
159
+ t.finalize(), undefined !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
160
160
  }
161
161
  static finalize() {
162
162
  if (this.hasOwnProperty(d$1("finalized"))) return;
163
- if (this.finalized = !0, this._$Ei(), this.hasOwnProperty(d$1("properties"))) {
163
+ if (this.finalized = true, this._$Ei(), this.hasOwnProperty(d$1("properties"))) {
164
164
  const t = this.properties,
165
165
  s = [...h$1(t), ...o$2(t)];
166
166
  for (const i of s) this.createProperty(i, t[i]);
@@ -168,12 +168,12 @@
168
168
  const t = this[Symbol.metadata];
169
169
  if (null !== t) {
170
170
  const s = litPropertyMetadata.get(t);
171
- if (void 0 !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
171
+ if (undefined !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
172
172
  }
173
173
  this._$Eh = new Map();
174
174
  for (const [t, s] of this.elementProperties) {
175
175
  const i = this._$Eu(t, s);
176
- void 0 !== i && this._$Eh.set(i, t);
176
+ undefined !== i && this._$Eh.set(i, t);
177
177
  }
178
178
  this.elementStyles = this.finalizeStyles(this.styles);
179
179
  }
@@ -182,21 +182,21 @@
182
182
  if (Array.isArray(s)) {
183
183
  const e = new Set(s.flat(1 / 0).reverse());
184
184
  for (const s of e) i.unshift(c$2(s));
185
- } else void 0 !== s && i.push(c$2(s));
185
+ } else undefined !== s && i.push(c$2(s));
186
186
  return i;
187
187
  }
188
188
  static _$Eu(t, s) {
189
189
  const i = s.attribute;
190
- return !1 === i ? void 0 : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : void 0;
190
+ return false === i ? undefined : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : undefined;
191
191
  }
192
192
  constructor() {
193
- super(), this._$Ep = void 0, this.isUpdatePending = !1, this.hasUpdated = !1, this._$Em = null, this._$Ev();
193
+ super(), this._$Ep = undefined, this.isUpdatePending = false, this.hasUpdated = false, this._$Em = null, this._$Ev();
194
194
  }
195
195
  _$Ev() {
196
196
  this._$ES = new Promise(t => this.enableUpdating = t), this._$AL = new Map(), this._$E_(), this.requestUpdate(), this.constructor.l?.forEach(t => t(this));
197
197
  }
198
198
  addController(t) {
199
- (this._$EO ??= new Set()).add(t), void 0 !== this.renderRoot && this.isConnected && t.hostConnected?.();
199
+ (this._$EO ??= new Set()).add(t), undefined !== this.renderRoot && this.isConnected && t.hostConnected?.();
200
200
  }
201
201
  removeController(t) {
202
202
  this._$EO?.delete(t);
@@ -212,7 +212,7 @@
212
212
  return S$1(t, this.constructor.elementStyles), t;
213
213
  }
214
214
  connectedCallback() {
215
- this.renderRoot ??= this.createRenderRoot(), this.enableUpdating(!0), this._$EO?.forEach(t => t.hostConnected?.());
215
+ this.renderRoot ??= this.createRenderRoot(), this.enableUpdating(true), this._$EO?.forEach(t => t.hostConnected?.());
216
216
  }
217
217
  enableUpdating(t) {}
218
218
  disconnectedCallback() {
@@ -224,34 +224,34 @@
224
224
  _$EC(t, s) {
225
225
  const i = this.constructor.elementProperties.get(t),
226
226
  e = this.constructor._$Eu(t, i);
227
- if (void 0 !== e && !0 === i.reflect) {
228
- const r = (void 0 !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
227
+ if (undefined !== e && true === i.reflect) {
228
+ const r = (undefined !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
229
229
  this._$Em = t, null == r ? this.removeAttribute(e) : this.setAttribute(e, r), this._$Em = null;
230
230
  }
231
231
  }
232
232
  _$AK(t, s) {
233
233
  const i = this.constructor,
234
234
  e = i._$Eh.get(t);
235
- if (void 0 !== e && this._$Em !== e) {
235
+ if (undefined !== e && this._$Em !== e) {
236
236
  const t = i.getPropertyOptions(e),
237
237
  r = "function" == typeof t.converter ? {
238
238
  fromAttribute: t.converter
239
- } : void 0 !== t.converter?.fromAttribute ? t.converter : u$1;
239
+ } : undefined !== t.converter?.fromAttribute ? t.converter : u$1;
240
240
  this._$Em = e, this[e] = r.fromAttribute(s, t.type), this._$Em = null;
241
241
  }
242
242
  }
243
243
  requestUpdate(t, s, i) {
244
- if (void 0 !== t) {
244
+ if (undefined !== t) {
245
245
  if (i ??= this.constructor.getPropertyOptions(t), !(i.hasChanged ?? f$1)(this[t], s)) return;
246
246
  this.P(t, s, i);
247
247
  }
248
- !1 === this.isUpdatePending && (this._$ES = this._$ET());
248
+ false === this.isUpdatePending && (this._$ES = this._$ET());
249
249
  }
250
250
  P(t, s, i) {
251
- this._$AL.has(t) || this._$AL.set(t, s), !0 === i.reflect && this._$Em !== t && (this._$Ej ??= new Set()).add(t);
251
+ this._$AL.has(t) || this._$AL.set(t, s), true === i.reflect && this._$Em !== t && (this._$Ej ??= new Set()).add(t);
252
252
  }
253
253
  async _$ET() {
254
- this.isUpdatePending = !0;
254
+ this.isUpdatePending = true;
255
255
  try {
256
256
  await this._$ES;
257
257
  } catch (t) {
@@ -268,26 +268,26 @@
268
268
  if (!this.hasUpdated) {
269
269
  if (this.renderRoot ??= this.createRenderRoot(), this._$Ep) {
270
270
  for (const [t, s] of this._$Ep) this[t] = s;
271
- this._$Ep = void 0;
271
+ this._$Ep = undefined;
272
272
  }
273
273
  const t = this.constructor.elementProperties;
274
- if (t.size > 0) for (const [s, i] of t) !0 !== i.wrapped || this._$AL.has(s) || void 0 === this[s] || this.P(s, this[s], i);
274
+ if (t.size > 0) for (const [s, i] of t) true !== i.wrapped || this._$AL.has(s) || undefined === this[s] || this.P(s, this[s], i);
275
275
  }
276
- let t = !1;
276
+ let t = false;
277
277
  const s = this._$AL;
278
278
  try {
279
279
  t = this.shouldUpdate(s), t ? (this.willUpdate(s), this._$EO?.forEach(t => t.hostUpdate?.()), this.update(s)) : this._$EU();
280
280
  } catch (s) {
281
- throw t = !1, this._$EU(), s;
281
+ throw t = false, this._$EU(), s;
282
282
  }
283
283
  t && this._$AE(s);
284
284
  }
285
285
  willUpdate(t) {}
286
286
  _$AE(t) {
287
- this._$EO?.forEach(t => t.hostUpdated?.()), this.hasUpdated || (this.hasUpdated = !0, this.firstUpdated(t)), this.updated(t);
287
+ this._$EO?.forEach(t => t.hostUpdated?.()), this.hasUpdated || (this.hasUpdated = true, this.firstUpdated(t)), this.updated(t);
288
288
  }
289
289
  _$EU() {
290
- this._$AL = new Map(), this.isUpdatePending = !1;
290
+ this._$AL = new Map(), this.isUpdatePending = false;
291
291
  }
292
292
  get updateComplete() {
293
293
  return this.getUpdateComplete();
@@ -296,7 +296,7 @@
296
296
  return this._$ES;
297
297
  }
298
298
  shouldUpdate(t) {
299
- return !0;
299
+ return true;
300
300
  }
301
301
  update(t) {
302
302
  this._$Ej &&= this._$Ej.forEach(t => this._$EC(t, this[t])), this._$EU();
@@ -316,10 +316,10 @@
316
316
  * SPDX-License-Identifier: BSD-3-Clause
317
317
  */
318
318
  const t = globalThis,
319
- i = t.trustedTypes,
320
- s$1 = i ? i.createPolicy("lit-html", {
319
+ i$1 = t.trustedTypes,
320
+ s = i$1 ? i$1.createPolicy("lit-html", {
321
321
  createHTML: t => t
322
- }) : void 0,
322
+ }) : undefined,
323
323
  e = "$lit$",
324
324
  h = `lit$${Math.random().toFixed(9).slice(2)}$`,
325
325
  o$1 = "?" + h,
@@ -344,19 +344,19 @@
344
344
  }),
345
345
  x$1 = y$1(1),
346
346
  b = y$1(2),
347
- w = Symbol.for("lit-noChange"),
348
- T = Symbol.for("lit-nothing"),
347
+ T = Symbol.for("lit-noChange"),
348
+ E = Symbol.for("lit-nothing"),
349
349
  A = new WeakMap(),
350
- E = r$1.createTreeWalker(r$1, 129);
351
- function C(t, i) {
352
- if (!Array.isArray(t) || !t.hasOwnProperty("raw")) throw Error("invalid template strings array");
353
- return void 0 !== s$1 ? s$1.createHTML(i) : i;
350
+ C = r$1.createTreeWalker(r$1, 129);
351
+ function P(t, i) {
352
+ if (!a(t) || !t.hasOwnProperty("raw")) throw Error("invalid template strings array");
353
+ return undefined !== s ? s.createHTML(i) : i;
354
354
  }
355
- const P = (t, i) => {
355
+ const V = (t, i) => {
356
356
  const s = t.length - 1,
357
357
  o = [];
358
358
  let r,
359
- l = 2 === i ? "<svg>" : "",
359
+ l = 2 === i ? "<svg>" : 3 === i ? "<math>" : "",
360
360
  c = f;
361
361
  for (let i = 0; i < s; i++) {
362
362
  const s = t[i];
@@ -364,13 +364,13 @@
364
364
  u,
365
365
  d = -1,
366
366
  y = 0;
367
- for (; y < s.length && (c.lastIndex = y, u = c.exec(s), null !== u);) y = c.lastIndex, c === f ? "!--" === u[1] ? c = v : void 0 !== u[1] ? c = _ : void 0 !== u[2] ? ($.test(u[2]) && (r = RegExp("</" + u[2], "g")), c = m) : void 0 !== u[3] && (c = m) : c === m ? ">" === u[0] ? (c = r ?? f, d = -1) : void 0 === u[1] ? d = -2 : (d = c.lastIndex - u[2].length, a = u[1], c = void 0 === u[3] ? m : '"' === u[3] ? g : p) : c === g || c === p ? c = m : c === v || c === _ ? c = f : (c = m, r = void 0);
367
+ for (; y < s.length && (c.lastIndex = y, u = c.exec(s), null !== u);) y = c.lastIndex, c === f ? "!--" === u[1] ? c = v : undefined !== u[1] ? c = _ : undefined !== u[2] ? ($.test(u[2]) && (r = RegExp("</" + u[2], "g")), c = m) : undefined !== u[3] && (c = m) : c === m ? ">" === u[0] ? (c = r ?? f, d = -1) : undefined === u[1] ? d = -2 : (d = c.lastIndex - u[2].length, a = u[1], c = undefined === u[3] ? m : '"' === u[3] ? g : p) : c === g || c === p ? c = m : c === v || c === _ ? c = f : (c = m, r = undefined);
368
368
  const x = c === m && t[i + 1].startsWith("/>") ? " " : "";
369
369
  l += c === f ? s + n : d >= 0 ? (o.push(a), s.slice(0, d) + e + s.slice(d) + h + x) : s + h + (-2 === d ? i : x);
370
370
  }
371
- return [C(t, l + (t[s] || "<?>") + (2 === i ? "</svg>" : "")), o];
371
+ return [P(t, l + (t[s] || "<?>") + (2 === i ? "</svg>" : 3 === i ? "</math>" : "")), o];
372
372
  };
373
- class V {
373
+ class N {
374
374
  constructor({
375
375
  strings: t,
376
376
  _$litType$: s
@@ -381,12 +381,12 @@
381
381
  a = 0;
382
382
  const u = t.length - 1,
383
383
  d = this.parts,
384
- [f, v] = P(t, s);
385
- if (this.el = V.createElement(f, n), E.currentNode = this.el.content, 2 === s) {
384
+ [f, v] = V(t, s);
385
+ if (this.el = N.createElement(f, n), C.currentNode = this.el.content, 2 === s || 3 === s) {
386
386
  const t = this.el.content.firstChild;
387
387
  t.replaceWith(...t.childNodes);
388
388
  }
389
- for (; null !== (r = E.nextNode()) && d.length < u;) {
389
+ for (; null !== (r = C.nextNode()) && d.length < u;) {
390
390
  if (1 === r.nodeType) {
391
391
  if (r.hasAttributes()) for (const t of r.getAttributeNames()) if (t.endsWith(e)) {
392
392
  const i = v[a++],
@@ -397,7 +397,7 @@
397
397
  index: c,
398
398
  name: e[2],
399
399
  strings: s,
400
- ctor: "." === e[1] ? k : "?" === e[1] ? H : "@" === e[1] ? I : R
400
+ ctor: "." === e[1] ? H : "?" === e[1] ? I : "@" === e[1] ? L : k
401
401
  }), r.removeAttribute(t);
402
402
  } else t.startsWith(h) && (d.push({
403
403
  type: 6,
@@ -407,8 +407,8 @@
407
407
  const t = r.textContent.split(h),
408
408
  s = t.length - 1;
409
409
  if (s > 0) {
410
- r.textContent = i ? i.emptyScript : "";
411
- for (let i = 0; i < s; i++) r.append(t[i], l()), E.nextNode(), d.push({
410
+ r.textContent = i$1 ? i$1.emptyScript : "";
411
+ for (let i = 0; i < s; i++) r.append(t[i], l()), C.nextNode(), d.push({
412
412
  type: 2,
413
413
  index: ++c
414
414
  });
@@ -433,15 +433,15 @@
433
433
  return s.innerHTML = t, s;
434
434
  }
435
435
  }
436
- function N(t, i, s = t, e) {
437
- if (i === w) return i;
438
- let h = void 0 !== e ? s._$Co?.[e] : s._$Cl;
439
- const o = c(i) ? void 0 : i._$litDirective$;
440
- return h?.constructor !== o && (h?._$AO?.(!1), void 0 === o ? h = void 0 : (h = new o(t), h._$AT(t, s, e)), void 0 !== e ? (s._$Co ??= [])[e] = h : s._$Cl = h), void 0 !== h && (i = N(t, h._$AS(t, i.values), h, e)), i;
436
+ function S(t, i, s = t, e) {
437
+ if (i === T) return i;
438
+ let h = undefined !== e ? s._$Co?.[e] : s._$Cl;
439
+ const o = c(i) ? undefined : i._$litDirective$;
440
+ return h?.constructor !== o && (h?._$AO?.(false), undefined === o ? h = undefined : (h = new o(t), h._$AT(t, s, e)), undefined !== e ? (s._$Co ??= [])[e] = h : s._$Cl = h), undefined !== h && (i = S(t, h._$AS(t, i.values), h, e)), i;
441
441
  }
442
- class S {
442
+ class M {
443
443
  constructor(t, i) {
444
- this._$AV = [], this._$AN = void 0, this._$AD = t, this._$AM = i;
444
+ this._$AV = [], this._$AN = undefined, this._$AD = t, this._$AM = i;
445
445
  }
446
446
  get parentNode() {
447
447
  return this._$AM.parentNode;
@@ -456,37 +456,37 @@
456
456
  },
457
457
  parts: s
458
458
  } = this._$AD,
459
- e = (t?.creationScope ?? r$1).importNode(i, !0);
460
- E.currentNode = e;
461
- let h = E.nextNode(),
459
+ e = (t?.creationScope ?? r$1).importNode(i, true);
460
+ C.currentNode = e;
461
+ let h = C.nextNode(),
462
462
  o = 0,
463
463
  n = 0,
464
464
  l = s[0];
465
- for (; void 0 !== l;) {
465
+ for (; undefined !== l;) {
466
466
  if (o === l.index) {
467
467
  let i;
468
- 2 === l.type ? i = new M(h, h.nextSibling, this, t) : 1 === l.type ? i = new l.ctor(h, l.name, l.strings, this, t) : 6 === l.type && (i = new L(h, this, t)), this._$AV.push(i), l = s[++n];
468
+ 2 === l.type ? i = new R(h, h.nextSibling, this, t) : 1 === l.type ? i = new l.ctor(h, l.name, l.strings, this, t) : 6 === l.type && (i = new z(h, this, t)), this._$AV.push(i), l = s[++n];
469
469
  }
470
- o !== l?.index && (h = E.nextNode(), o++);
470
+ o !== l?.index && (h = C.nextNode(), o++);
471
471
  }
472
- return E.currentNode = r$1, e;
472
+ return C.currentNode = r$1, e;
473
473
  }
474
474
  p(t) {
475
475
  let i = 0;
476
- for (const s of this._$AV) void 0 !== s && (void 0 !== s.strings ? (s._$AI(t, s, i), i += s.strings.length - 2) : s._$AI(t[i])), i++;
476
+ for (const s of this._$AV) undefined !== s && (undefined !== s.strings ? (s._$AI(t, s, i), i += s.strings.length - 2) : s._$AI(t[i])), i++;
477
477
  }
478
478
  }
479
- class M {
479
+ class R {
480
480
  get _$AU() {
481
481
  return this._$AM?._$AU ?? this._$Cv;
482
482
  }
483
483
  constructor(t, i, s, e) {
484
- this.type = 2, this._$AH = T, this._$AN = void 0, this._$AA = t, this._$AB = i, this._$AM = s, this.options = e, this._$Cv = e?.isConnected ?? !0;
484
+ this.type = 2, this._$AH = E, this._$AN = undefined, this._$AA = t, this._$AB = i, this._$AM = s, this.options = e, this._$Cv = e?.isConnected ?? true;
485
485
  }
486
486
  get parentNode() {
487
487
  let t = this._$AA.parentNode;
488
488
  const i = this._$AM;
489
- return void 0 !== i && 11 === t?.nodeType && (t = i.parentNode), t;
489
+ return undefined !== i && 11 === t?.nodeType && (t = i.parentNode), t;
490
490
  }
491
491
  get startNode() {
492
492
  return this._$AA;
@@ -495,52 +495,52 @@
495
495
  return this._$AB;
496
496
  }
497
497
  _$AI(t, i = this) {
498
- t = N(this, t, i), c(t) ? t === T || null == t || "" === t ? (this._$AH !== T && this._$AR(), this._$AH = T) : t !== this._$AH && t !== w && this._(t) : void 0 !== t._$litType$ ? this.$(t) : void 0 !== t.nodeType ? this.T(t) : u(t) ? this.k(t) : this._(t);
498
+ t = S(this, t, i), c(t) ? t === E || null == t || "" === t ? (this._$AH !== E && this._$AR(), this._$AH = E) : t !== this._$AH && t !== T && this._(t) : undefined !== t._$litType$ ? this.$(t) : undefined !== t.nodeType ? this.T(t) : u(t) ? this.k(t) : this._(t);
499
499
  }
500
- S(t) {
500
+ O(t) {
501
501
  return this._$AA.parentNode.insertBefore(t, this._$AB);
502
502
  }
503
503
  T(t) {
504
- this._$AH !== t && (this._$AR(), this._$AH = this.S(t));
504
+ this._$AH !== t && (this._$AR(), this._$AH = this.O(t));
505
505
  }
506
506
  _(t) {
507
- this._$AH !== T && c(this._$AH) ? this._$AA.nextSibling.data = t : this.T(r$1.createTextNode(t)), this._$AH = t;
507
+ this._$AH !== E && c(this._$AH) ? this._$AA.nextSibling.data = t : this.T(r$1.createTextNode(t)), this._$AH = t;
508
508
  }
509
509
  $(t) {
510
510
  const {
511
511
  values: i,
512
512
  _$litType$: s
513
513
  } = t,
514
- e = "number" == typeof s ? this._$AC(t) : (void 0 === s.el && (s.el = V.createElement(C(s.h, s.h[0]), this.options)), s);
514
+ e = "number" == typeof s ? this._$AC(t) : (undefined === s.el && (s.el = N.createElement(P(s.h, s.h[0]), this.options)), s);
515
515
  if (this._$AH?._$AD === e) this._$AH.p(i);else {
516
- const t = new S(e, this),
516
+ const t = new M(e, this),
517
517
  s = t.u(this.options);
518
518
  t.p(i), this.T(s), this._$AH = t;
519
519
  }
520
520
  }
521
521
  _$AC(t) {
522
522
  let i = A.get(t.strings);
523
- return void 0 === i && A.set(t.strings, i = new V(t)), i;
523
+ return undefined === i && A.set(t.strings, i = new N(t)), i;
524
524
  }
525
525
  k(t) {
526
526
  a(this._$AH) || (this._$AH = [], this._$AR());
527
527
  const i = this._$AH;
528
528
  let s,
529
529
  e = 0;
530
- for (const h of t) e === i.length ? i.push(s = new M(this.S(l()), this.S(l()), this, this.options)) : s = i[e], s._$AI(h), e++;
530
+ for (const h of t) e === i.length ? i.push(s = new R(this.O(l()), this.O(l()), this, this.options)) : s = i[e], s._$AI(h), e++;
531
531
  e < i.length && (this._$AR(s && s._$AB.nextSibling, e), i.length = e);
532
532
  }
533
533
  _$AR(t = this._$AA.nextSibling, i) {
534
- for (this._$AP?.(!1, !0, i); t && t !== this._$AB;) {
534
+ for (this._$AP?.(false, true, i); t && t !== this._$AB;) {
535
535
  const i = t.nextSibling;
536
536
  t.remove(), t = i;
537
537
  }
538
538
  }
539
539
  setConnected(t) {
540
- void 0 === this._$AM && (this._$Cv = t, this._$AP?.(t));
540
+ undefined === this._$AM && (this._$Cv = t, this._$AP?.(t));
541
541
  }
542
542
  }
543
- class R {
543
+ class k {
544
544
  get tagName() {
545
545
  return this.element.tagName;
546
546
  }
@@ -548,72 +548,72 @@
548
548
  return this._$AM._$AU;
549
549
  }
550
550
  constructor(t, i, s, e, h) {
551
- this.type = 1, this._$AH = T, this._$AN = void 0, this.element = t, this.name = i, this._$AM = e, this.options = h, s.length > 2 || "" !== s[0] || "" !== s[1] ? (this._$AH = Array(s.length - 1).fill(new String()), this.strings = s) : this._$AH = T;
551
+ this.type = 1, this._$AH = E, this._$AN = undefined, this.element = t, this.name = i, this._$AM = e, this.options = h, s.length > 2 || "" !== s[0] || "" !== s[1] ? (this._$AH = Array(s.length - 1).fill(new String()), this.strings = s) : this._$AH = E;
552
552
  }
553
553
  _$AI(t, i = this, s, e) {
554
554
  const h = this.strings;
555
- let o = !1;
556
- if (void 0 === h) t = N(this, t, i, 0), o = !c(t) || t !== this._$AH && t !== w, o && (this._$AH = t);else {
555
+ let o = false;
556
+ if (undefined === h) t = S(this, t, i, 0), o = !c(t) || t !== this._$AH && t !== T, o && (this._$AH = t);else {
557
557
  const e = t;
558
558
  let n, r;
559
- for (t = h[0], n = 0; n < h.length - 1; n++) r = N(this, e[s + n], i, n), r === w && (r = this._$AH[n]), o ||= !c(r) || r !== this._$AH[n], r === T ? t = T : t !== T && (t += (r ?? "") + h[n + 1]), this._$AH[n] = r;
559
+ for (t = h[0], n = 0; n < h.length - 1; n++) r = S(this, e[s + n], i, n), r === T && (r = this._$AH[n]), o ||= !c(r) || r !== this._$AH[n], r === E ? t = E : t !== E && (t += (r ?? "") + h[n + 1]), this._$AH[n] = r;
560
560
  }
561
561
  o && !e && this.j(t);
562
562
  }
563
563
  j(t) {
564
- t === T ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, t ?? "");
564
+ t === E ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, t ?? "");
565
565
  }
566
566
  }
567
- class k extends R {
567
+ class H extends k {
568
568
  constructor() {
569
569
  super(...arguments), this.type = 3;
570
570
  }
571
571
  j(t) {
572
- this.element[this.name] = t === T ? void 0 : t;
572
+ this.element[this.name] = t === E ? undefined : t;
573
573
  }
574
574
  }
575
- class H extends R {
575
+ class I extends k {
576
576
  constructor() {
577
577
  super(...arguments), this.type = 4;
578
578
  }
579
579
  j(t) {
580
- this.element.toggleAttribute(this.name, !!t && t !== T);
580
+ this.element.toggleAttribute(this.name, !!t && t !== E);
581
581
  }
582
582
  }
583
- class I extends R {
583
+ class L extends k {
584
584
  constructor(t, i, s, e, h) {
585
585
  super(t, i, s, e, h), this.type = 5;
586
586
  }
587
587
  _$AI(t, i = this) {
588
- if ((t = N(this, t, i, 0) ?? T) === w) return;
588
+ if ((t = S(this, t, i, 0) ?? E) === T) return;
589
589
  const s = this._$AH,
590
- e = t === T && s !== T || t.capture !== s.capture || t.once !== s.once || t.passive !== s.passive,
591
- h = t !== T && (s === T || e);
590
+ e = t === E && s !== E || t.capture !== s.capture || t.once !== s.once || t.passive !== s.passive,
591
+ h = t !== E && (s === E || e);
592
592
  e && this.element.removeEventListener(this.name, this, s), h && this.element.addEventListener(this.name, this, t), this._$AH = t;
593
593
  }
594
594
  handleEvent(t) {
595
595
  "function" == typeof this._$AH ? this._$AH.call(this.options?.host ?? this.element, t) : this._$AH.handleEvent(t);
596
596
  }
597
597
  }
598
- class L {
598
+ class z {
599
599
  constructor(t, i, s) {
600
- this.element = t, this.type = 6, this._$AN = void 0, this._$AM = i, this.options = s;
600
+ this.element = t, this.type = 6, this._$AN = undefined, this._$AM = i, this.options = s;
601
601
  }
602
602
  get _$AU() {
603
603
  return this._$AM._$AU;
604
604
  }
605
605
  _$AI(t) {
606
- N(this, t);
606
+ S(this, t);
607
607
  }
608
608
  }
609
- const Z = t.litHtmlPolyfillSupport;
610
- Z?.(V, M), (t.litHtmlVersions ??= []).push("3.1.3");
611
- const j = (t, i, s) => {
609
+ const j = t.litHtmlPolyfillSupport;
610
+ j?.(N, R), (t.litHtmlVersions ??= []).push("3.2.1");
611
+ const B = (t, i, s) => {
612
612
  const e = s?.renderBefore ?? i;
613
613
  let h = e._$litPart$;
614
- if (void 0 === h) {
614
+ if (undefined === h) {
615
615
  const t = s?.renderBefore ?? null;
616
- e._$litPart$ = h = new M(i.insertBefore(l(), t), t, void 0, s ?? {});
616
+ e._$litPart$ = h = new R(i.insertBefore(l(), t), t, undefined, s ?? {});
617
617
  }
618
618
  return h._$AI(t), h;
619
619
  };
@@ -623,38 +623,38 @@
623
623
  * Copyright 2017 Google LLC
624
624
  * SPDX-License-Identifier: BSD-3-Clause
625
625
  */
626
- class s extends b$1 {
626
+ class r extends b$1 {
627
627
  constructor() {
628
628
  super(...arguments), this.renderOptions = {
629
629
  host: this
630
- }, this._$Do = void 0;
630
+ }, this._$Do = undefined;
631
631
  }
632
632
  createRenderRoot() {
633
633
  const t = super.createRenderRoot();
634
634
  return this.renderOptions.renderBefore ??= t.firstChild, t;
635
635
  }
636
636
  update(t) {
637
- const i = this.render();
638
- this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = j(i, this.renderRoot, this.renderOptions);
637
+ const s = this.render();
638
+ this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = B(s, this.renderRoot, this.renderOptions);
639
639
  }
640
640
  connectedCallback() {
641
- super.connectedCallback(), this._$Do?.setConnected(!0);
641
+ super.connectedCallback(), this._$Do?.setConnected(true);
642
642
  }
643
643
  disconnectedCallback() {
644
- super.disconnectedCallback(), this._$Do?.setConnected(!1);
644
+ super.disconnectedCallback(), this._$Do?.setConnected(false);
645
645
  }
646
646
  render() {
647
- return w;
647
+ return T;
648
648
  }
649
649
  }
650
- s._$litElement$ = !0, s[("finalized")] = !0, globalThis.litElementHydrateSupport?.({
651
- LitElement: s
650
+ r._$litElement$ = true, r["finalized"] = true, globalThis.litElementHydrateSupport?.({
651
+ LitElement: r
652
652
  });
653
- const r = globalThis.litElementPolyfillSupport;
654
- r?.({
655
- LitElement: s
653
+ const i = globalThis.litElementPolyfillSupport;
654
+ i?.({
655
+ LitElement: r
656
656
  });
657
- (globalThis.litElementVersions ??= []).push("4.0.5");
657
+ (globalThis.litElementVersions ??= []).push("4.1.1");
658
658
 
659
659
  function ascending$1(a, b) {
660
660
  return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
@@ -1894,7 +1894,7 @@
1894
1894
  }
1895
1895
  }
1896
1896
 
1897
- var constant$2 = (x => () => x);
1897
+ var constant$2 = x => () => x;
1898
1898
 
1899
1899
  function DragEvent(type, {
1900
1900
  sourceEvent,
@@ -2500,7 +2500,7 @@
2500
2500
  return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;
2501
2501
  }
2502
2502
 
2503
- var constant$1 = (x => () => x);
2503
+ var constant$1 = x => () => x;
2504
2504
 
2505
2505
  function linear$2(a, d) {
2506
2506
  return function (t) {
@@ -4572,7 +4572,7 @@
4572
4572
  DecidablesElement Base Class - Not intended for instantiation!
4573
4573
  <decidables-element>
4574
4574
  */
4575
- class DecidablesElement extends s {
4575
+ class DecidablesElement extends r {
4576
4576
  getComputedStyleValue(property) {
4577
4577
  return getComputedStyle(this).getPropertyValue(property).trim();
4578
4578
  }
@@ -4825,7 +4825,7 @@
4825
4825
  `;
4826
4826
  }
4827
4827
  static get styles() {
4828
- return i$2`
4828
+ return i$3`
4829
4829
  :host {
4830
4830
  ---shadow-0: var(--shadow-0, ${r$3(this.cssBoxShadow(0))});
4831
4831
  ---shadow-2: var(--shadow-2, ${r$3(this.cssBoxShadow(2))});
@@ -4903,8 +4903,11 @@
4903
4903
  this.disabled = false;
4904
4904
  }
4905
4905
  static get styles() {
4906
- return [super.styles, i$2`
4906
+ return [super.styles, i$3`
4907
4907
  :host {
4908
+ ---decidables-button-background-color-disabled: var(--decidables-button-background-color, var(---color-element-disabled));
4909
+ ---decidables-button-background-color-enabled: var(--decidables-button-background-color, var(---color-element-enabled));
4910
+
4908
4911
  margin: 0.25rem;
4909
4912
  }
4910
4913
 
@@ -4924,7 +4927,7 @@
4924
4927
  }
4925
4928
 
4926
4929
  button:disabled {
4927
- background-color: var(--decidables-button-background-color, var(---color-element-disabled));
4930
+ background-color: var(---decidables-button-background-color-disabled);
4928
4931
  outline: none;
4929
4932
  box-shadow: none;
4930
4933
  }
@@ -4932,7 +4935,7 @@
4932
4935
  button:enabled {
4933
4936
  cursor: pointer;
4934
4937
 
4935
- background-color: var(--decidables-button-background-color, var(---color-element-enabled));
4938
+ background-color: var(---decidables-button-background-color-enabled);
4936
4939
  outline: none;
4937
4940
  box-shadow: var(---shadow-2);
4938
4941
  }
@@ -4973,7 +4976,7 @@
4973
4976
  * Copyright 2018 Google LLC
4974
4977
  * SPDX-License-Identifier: BSD-3-Clause
4975
4978
  */
4976
- const o = o => o ?? T;
4979
+ const o = o => o ?? E;
4977
4980
 
4978
4981
  class DecidablesSlider extends DecidablesElement {
4979
4982
  static get properties() {
@@ -4983,6 +4986,11 @@
4983
4986
  type: Boolean,
4984
4987
  reflect: true
4985
4988
  },
4989
+ scale: {
4990
+ attribute: 'scale',
4991
+ type: Boolean,
4992
+ reflect: true
4993
+ },
4986
4994
  max: {
4987
4995
  attribute: 'max',
4988
4996
  type: Number,
@@ -5002,6 +5010,11 @@
5002
5010
  attribute: 'value',
5003
5011
  type: Number,
5004
5012
  reflect: true
5013
+ },
5014
+ nonlinear: {
5015
+ attribute: false,
5016
+ type: Boolean,
5017
+ reflect: false
5005
5018
  }
5006
5019
  };
5007
5020
  }
@@ -5010,13 +5023,30 @@
5010
5023
 
5011
5024
  // Attributes
5012
5025
  this.disabled = false;
5026
+ this.scale = false;
5013
5027
  this.max = undefined;
5014
5028
  this.min = undefined;
5015
5029
  this.step = undefined;
5016
5030
  this.value = undefined;
5017
- }
5018
- changed(event) {
5019
- this.value = event.target.value;
5031
+ this.nonlinear = false;
5032
+
5033
+ // Properties
5034
+ this.rangeMax = undefined;
5035
+ this.rangeMin = undefined;
5036
+ this.rangeStep = undefined;
5037
+ this.rangeValue = undefined;
5038
+
5039
+ // Transform
5040
+ this.toRange = undefined;
5041
+ this.fromRange = undefined;
5042
+ }
5043
+ nonlinearRange(nonlinear, toRange, fromRange) {
5044
+ this.nonlinear = nonlinear;
5045
+ this.toRange = nonlinear ? toRange : undefined;
5046
+ this.fromRange = nonlinear ? fromRange : undefined;
5047
+ }
5048
+ rangeChanged(event) {
5049
+ this.value = this.nonlinear ? this.fromRange(event.target.value) : event.target.value;
5020
5050
  this.dispatchEvent(new CustomEvent('change', {
5021
5051
  detail: {
5022
5052
  value: this.value
@@ -5024,12 +5054,25 @@
5024
5054
  bubbles: true
5025
5055
  }));
5026
5056
  }
5027
- inputted(event) {
5057
+ rangeInputted(event) {
5058
+ this.value = this.nonlinear ? this.fromRange(event.target.value) : event.target.value;
5059
+ }
5060
+ spinnerInputted(event) {
5028
5061
  this.value = event.target.value;
5029
5062
  }
5063
+ willUpdate() {
5064
+ this.rangeMax = this.max === undefined ? undefined : this.nonlinear ? this.toRange(this.max) : this.max;
5065
+ this.rangeMin = this.min === undefined ? undefined : this.nonlinear ? this.toRange(this.min) : this.min;
5066
+ this.rangeStep = this.step === undefined ? undefined : this.nonlinear ? 'any' : this.step;
5067
+ this.rangeValue = this.value === undefined ? undefined : this.nonlinear ? this.toRange(this.value) : this.value;
5068
+ }
5030
5069
  static get styles() {
5031
- return [super.styles, i$2`
5070
+ return [super.styles, i$3`
5032
5071
  :host {
5072
+ ---decidables-slider-background-color: var(--decidables-slider-background-color, var(---color-element-disabled));
5073
+ ---decidables-slider-color: var(--decidables-slider-color, var(---color-element-enabled));
5074
+ ---decidables-spinner-background-color: var(--decidables-slider-background-color, none);
5075
+
5033
5076
  ---shadow-2-rotate: var(--shadow-2-rotate, ${r$3(this.cssBoxShadow(2, true, false))});
5034
5077
  ---shadow-4-rotate: var(--shadow-4-rotate, ${r$3(this.cssBoxShadow(4, true, false))});
5035
5078
  ---shadow-8-rotate: var(--shadow-8-rotate, ${r$3(this.cssBoxShadow(8, true, false))});
@@ -5047,7 +5090,10 @@
5047
5090
  }
5048
5091
 
5049
5092
  .range {
5050
- display: inline-block;
5093
+ position: relative;
5094
+ display: flex;
5095
+
5096
+ flex-direction: row;
5051
5097
 
5052
5098
  width: 3.5rem;
5053
5099
  height: 4.75rem;
@@ -5058,6 +5104,8 @@
5058
5104
  --decidables-spinner-input-width: 3.5rem;
5059
5105
 
5060
5106
  margin: 0 0.25rem 0.25rem;
5107
+
5108
+ background: var(---decidables-spinner-background-color);
5061
5109
  }
5062
5110
 
5063
5111
  /* Adapted from http://danielstern.ca/range.css/#/ */
@@ -5096,14 +5144,14 @@
5096
5144
  width: 100%;
5097
5145
  height: 4px;
5098
5146
 
5099
- background: var(---color-element-disabled);
5147
+ background: var(---decidables-slider-background-color);
5100
5148
  border: 0;
5101
5149
  border-radius: 2px;
5102
5150
  box-shadow: none;
5103
5151
  }
5104
5152
 
5105
5153
  input[type=range]:focus::-webkit-slider-runnable-track {
5106
- background: var(---color-element-disabled);
5154
+ background: var(---decidables-slider-background-color);
5107
5155
  }
5108
5156
 
5109
5157
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
@@ -5111,7 +5159,7 @@
5111
5159
  width: 100%;
5112
5160
  height: 4px;
5113
5161
 
5114
- background: var(---color-element-disabled);
5162
+ background: var(---decidables-slider-background-color);
5115
5163
  border: 0;
5116
5164
  border-radius: 2px;
5117
5165
  box-shadow: none;
@@ -5131,7 +5179,7 @@
5131
5179
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5132
5180
  input[type=range]::-ms-fill-lower {
5133
5181
  background: #cccccc;
5134
- /* background: var(---color-element-disabled); */
5182
+ /* background: var(---decidables-slider-background-color); */
5135
5183
  border: 0;
5136
5184
  border-radius: 2px;
5137
5185
  box-shadow: none;
@@ -5140,7 +5188,7 @@
5140
5188
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5141
5189
  input[type=range]::-ms-fill-upper {
5142
5190
  background: #cccccc;
5143
- /* background: var(---color-element-disabled); */
5191
+ /* background: var(---decidables-slider-background-color); */
5144
5192
  border: 0;
5145
5193
  border-radius: 2px;
5146
5194
  box-shadow: none;
@@ -5148,12 +5196,12 @@
5148
5196
 
5149
5197
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5150
5198
  input[type=range]:focus::-ms-fill-lower {
5151
- background: var(---color-element-disabled);
5199
+ background: var(---decidables-slider-background-color);
5152
5200
  }
5153
5201
 
5154
5202
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5155
5203
  input[type=range]:focus::-ms-fill-upper {
5156
- background: var(---color-element-disabled);
5204
+ background: var(---decidables-slider-background-color);
5157
5205
  }
5158
5206
 
5159
5207
  /* Thumb */
@@ -5171,12 +5219,12 @@
5171
5219
  }
5172
5220
 
5173
5221
  input[type=range]:disabled::-webkit-slider-thumb {
5174
- background: var(---color-element-disabled);
5222
+ background: var(---decidables-slider-background-color);
5175
5223
  box-shadow: none;
5176
5224
  }
5177
5225
 
5178
5226
  input[type=range]:enabled::-webkit-slider-thumb {
5179
- background: var(---color-element-enabled);
5227
+ background: var(---decidables-slider-color);
5180
5228
  box-shadow: var(---shadow-2-rotate);
5181
5229
  }
5182
5230
 
@@ -5207,13 +5255,13 @@
5207
5255
 
5208
5256
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5209
5257
  input[type=range]:disabled::-moz-range-thumb {
5210
- background: var(---color-element-disabled);
5258
+ background: var(---decidables-slider-background-color);
5211
5259
  box-shadow: none;
5212
5260
  }
5213
5261
 
5214
5262
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5215
5263
  input[type=range]:enabled::-moz-range-thumb {
5216
- background: var(---color-element-enabled);
5264
+ background: var(---decidables-slider-color);
5217
5265
  box-shadow: var(---shadow-2-rotate);
5218
5266
  }
5219
5267
 
@@ -5250,13 +5298,13 @@
5250
5298
 
5251
5299
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5252
5300
  input[type=range]:disabled::-ms-thumb {
5253
- background: var(---color-element-disabled);
5301
+ background: var(---decidables-slider-background-color);
5254
5302
  box-shadow: none;
5255
5303
  }
5256
5304
 
5257
5305
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5258
5306
  input[type=range]:enabled::-ms-thumb {
5259
- background: var(---color-element-enabled);
5307
+ background: var(---decidables-slider-color);
5260
5308
  box-shadow: var(---shadow-2-rotate);
5261
5309
  }
5262
5310
 
@@ -5278,6 +5326,33 @@
5278
5326
  :host(.keyboard) input[type=range]:enabled:focus:active::-ms-thumb {
5279
5327
  box-shadow: var(---shadow-8-rotate);
5280
5328
  }
5329
+
5330
+ datalist {
5331
+ position: absolute;
5332
+ left: 2rem;
5333
+ z-index: -1;
5334
+ display: flex;
5335
+
5336
+ flex-direction: column;
5337
+
5338
+ align-items: flex-start;
5339
+ justify-content: space-between;
5340
+
5341
+ height: 4.75rem;
5342
+
5343
+ font-size: 0.75rem;
5344
+ }
5345
+
5346
+ option {
5347
+ padding: 0;
5348
+
5349
+ line-height: 0.8;
5350
+ min-block-size: 0;
5351
+ }
5352
+
5353
+ option::before {
5354
+ content: "– ";
5355
+ }
5281
5356
  `];
5282
5357
  }
5283
5358
  render() {
@@ -5286,9 +5361,15 @@
5286
5361
  <slot></slot>
5287
5362
  </label>
5288
5363
  <div class="range">
5289
- <input ?disabled=${this.disabled} type="range" id="slider" min=${o(this.min)} max=${o(this.max)} step=${o(this.step)} .value=${this.value} @change=${this.changed.bind(this)} @input=${this.inputted.bind(this)}>
5364
+ <input ?disabled=${this.disabled} type="range" id="slider" min=${o(this.rangeMin)} max=${o(this.rangeMax)} step=${o(this.rangeStep)} .value=${this.rangeValue} @change=${this.rangeChanged.bind(this)} @input=${this.rangeInputted.bind(this)}>
5365
+ ${this.scale ? x$1`
5366
+ <datalist id="ticks">
5367
+ <option value=${o(this.rangeMax)} label=${o(this.max)}></option>
5368
+ <option value=${o(this.rangeMin)} label=${o(this.min)}></option>
5369
+ </datalist>
5370
+ ` : x$1``}
5290
5371
  </div>
5291
- <decidables-spinner ?disabled=${this.disabled} min=${o(this.min)} max=${o(this.max)} step=${o(this.step)} .value=${this.value} @input=${this.inputted.bind(this)}></decidables-spinner>
5372
+ <decidables-spinner ?disabled=${this.disabled} min=${o(this.min)} max=${o(this.max)} step=${o(this.step)} .value=${this.value} @input=${this.spinnerInputted.bind(this)}></decidables-spinner>
5292
5373
  `;
5293
5374
  }
5294
5375
  }
@@ -5338,7 +5419,7 @@
5338
5419
  this.value = event.target.value;
5339
5420
  }
5340
5421
  static get styles() {
5341
- return [super.styles, i$2`
5422
+ return [super.styles, i$3`
5342
5423
  :host {
5343
5424
  ---decidables-spinner-font-size: var(--decidables-spinner-font-size, 1.125rem);
5344
5425
  ---decidables-spinner-input-width: var(--decidables-spinner-input-width, 4rem);
@@ -5477,7 +5558,7 @@
5477
5558
  }));
5478
5559
  }
5479
5560
  static get styles() {
5480
- return [super.styles, i$2`
5561
+ return [super.styles, i$3`
5481
5562
  :host {
5482
5563
  display: flex;
5483
5564
 
@@ -5630,7 +5711,7 @@
5630
5711
  this.disabled = false;
5631
5712
  }
5632
5713
  static get styles() {
5633
- return [super.styles, i$2`
5714
+ return [super.styles, i$3`
5634
5715
  fieldset {
5635
5716
  display: flex;
5636
5717
 
@@ -5705,7 +5786,7 @@
5705
5786
  }));
5706
5787
  }
5707
5788
  static get styles() {
5708
- return [super.styles, i$2`
5789
+ return [super.styles, i$3`
5709
5790
  :host {
5710
5791
  display: flex;
5711
5792
  }
@@ -5899,7 +5980,7 @@
5899
5980
  }, {});
5900
5981
  }
5901
5982
  static get styles() {
5902
- return [super.styles, i$2`
5983
+ return [super.styles, i$3`
5903
5984
  :host {
5904
5985
  /* Declare base colors */
5905
5986
  ${r$3(Object.keys(AccumulableElement.colors).map(color => {
@@ -6062,7 +6143,7 @@
6062
6143
  this.state = 'ended';
6063
6144
  }
6064
6145
  static get styles() {
6065
- return [super.styles, i$2`
6146
+ return [super.styles, i$3`
6066
6147
  :host {
6067
6148
  display: inline-block;
6068
6149
  }
@@ -6089,15 +6170,15 @@
6089
6170
  render() {
6090
6171
  return x$1`
6091
6172
  <div class="holder">
6092
- ${this.trials ? x$1`<decidables-slider class="trials" min="1" max="100" step="1" .value=${this.trials} @change=${this.setTrials.bind(this)} @input=${this.setTrials.bind(this)}>Trials</decidables-slider>` : x$1``}
6173
+ ${this.trials != null ? x$1`<decidables-slider class="trials" min="1" max="100" step="1" .value=${this.trials} @change=${this.setTrials.bind(this)} @input=${this.setTrials.bind(this)}>Trials</decidables-slider>` : x$1``}
6093
6174
  ${this.resample ? x$1`
6094
6175
  <div class="buttons">
6095
6176
  ${this.resample ? x$1`<decidables-button name="resample" @click=${this.doResample.bind(this)}>Resample</decidables-button>` : x$1``}
6096
6177
  </div>
6097
6178
  ` : x$1``}
6098
- ${this.duration ? x$1`<decidables-slider class="duration" min="10" max="2000" step="10" .value=${this.duration} @change=${this.setDuration.bind(this)} @input=${this.setDuration.bind(this)}>Duration</decidables-slider>` : x$1``}
6099
- ${this.coherence ? x$1`<decidables-slider class="coherence" min="0" max="1" step=".01" .value=${this.coherence} @change=${this.setCoherence.bind(this)} @input=${this.setCoherence.bind(this)}>Coherence</decidables-slider>` : x$1``}
6100
- ${this.color !== undefined ? x$1`
6179
+ ${this.duration != null ? x$1`<decidables-slider class="duration" min="10" max="2000" step="10" .value=${this.duration} @change=${this.setDuration.bind(this)} @input=${this.setDuration.bind(this)}>Duration</decidables-slider>` : x$1``}
6180
+ ${this.coherence != null ? x$1`<decidables-slider class="coherence" min="0" max="1" step=".01" .value=${this.coherence} @change=${this.setCoherence.bind(this)} @input=${this.setCoherence.bind(this)}>Coherence</decidables-slider>` : x$1``}
6181
+ ${this.color != null ? x$1`
6101
6182
  <decidables-toggle class="color" @change=${this.chooseColor.bind(this)}>
6102
6183
  <span slot="label">Emphasis</span>
6103
6184
  <decidables-toggle-option name="toggle" value="none" ?checked=${this.color === 'none'}>None</decidables-toggle-option>
@@ -6122,13 +6203,13 @@
6122
6203
  DDMMath Static Class - Not intended for instantiation!
6123
6204
 
6124
6205
  Model parameters:
6125
- a = boundary separation
6126
- z = starting point as a proportion of a
6127
- v = drift rate (per second)
6128
- t0 = non-decision time (in milliseconds)
6129
- s = within-trial variability in drift rate (s^2 = infinitesimal variance)
6206
+ a = boundary separation [0, Infinity)
6207
+ z = starting point as a proportion of a (0, 1)
6208
+ v = drift rate (per second) (-Infinity, Infinity)
6209
+ t0 = non-decision time (in milliseconds) (0, Infinity)
6210
+ s = within-trial variability in drift rate (s^2 = infinitesimal variance) [0, Infinity)
6130
6211
 
6131
- zPrime = starting point on a 0-to-a scale (typically used in published equations)
6212
+ zPrime = starting point on a 0-to-a scale (typically used in published equations) [0, Infinity)
6132
6213
 
6133
6214
  Behavioral variables:
6134
6215
  pE = proportion of error trials
@@ -6148,7 +6229,37 @@
6148
6229
  EZ-diffusion model (Wagenmakers et al., 2007)
6149
6230
  */
6150
6231
  class DDMMath {
6151
- static s = 1;
6232
+ static s = {
6233
+ DEFAULT: 1
6234
+ };
6235
+ static a = {
6236
+ DEFAULT: 1.2,
6237
+ MIN: 0.01,
6238
+ MAX: 2.0,
6239
+ STEP: 0.01,
6240
+ JUMP: 0.1
6241
+ };
6242
+ static z = {
6243
+ DEFAULT: 0.55,
6244
+ MIN: 0.01,
6245
+ MAX: 0.99,
6246
+ STEP: 0.01,
6247
+ JUMP: 0.1
6248
+ };
6249
+ static v = {
6250
+ DEFAULT: 1.5,
6251
+ MIN: 0.01,
6252
+ MAX: 5.0,
6253
+ STEP: 0.01,
6254
+ JUMP: 0.1
6255
+ };
6256
+ static t0 = {
6257
+ DEFAULT: 150,
6258
+ MIN: 0,
6259
+ MAX: 500,
6260
+ STEP: 1,
6261
+ JUMP: 10
6262
+ };
6152
6263
 
6153
6264
  // Calculate a bunch of statistics for an array of trials
6154
6265
  static trials2stats(trials) {
@@ -6216,7 +6327,7 @@
6216
6327
  }
6217
6328
 
6218
6329
  // Probability of an Error Response
6219
- static azv2pE(a, z, v, s = DDMMath.s) {
6330
+ static azv2pE(a, z, v, s = DDMMath.s.DEFAULT) {
6220
6331
  const zPrime = a * z;
6221
6332
  const A = Math.exp(-2 * v * a / s ** 2);
6222
6333
  const Z = Math.exp(-2 * v * zPrime / s ** 2);
@@ -6224,13 +6335,13 @@
6224
6335
  }
6225
6336
 
6226
6337
  // Probability of a Correct Response
6227
- static azv2pC(a, z, v, s = DDMMath.s) {
6338
+ static azv2pC(a, z, v, s = DDMMath.s.DEFAULT) {
6228
6339
  return DDMMath.azv2pE(a, 1 - z, -v, s);
6229
6340
  }
6230
6341
 
6231
6342
  // Mean Overall RT
6232
6343
  // Equation 5 (Grasman et al., 2009)
6233
- static azvt02m(a, z, v, t0, s = DDMMath.s) {
6344
+ static azvt02m(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6234
6345
  const zPrime = a * z;
6235
6346
  const A = Math.exp(-2 * v * a / s ** 2) - 1;
6236
6347
  const Z = Math.exp(-2 * v * zPrime / s ** 2) - 1;
@@ -6240,7 +6351,7 @@
6240
6351
 
6241
6352
  // SD Overall RT
6242
6353
  // Equation 6 (Grasman et al., 2009)
6243
- static azv2sd(a, z, v, s = DDMMath.s) {
6354
+ static azv2sd(a, z, v, s = DDMMath.s.DEFAULT) {
6244
6355
  const zPrime = a * z;
6245
6356
  const A = Math.exp(-2 * v * a / s ** 2) - 1;
6246
6357
  const Z = Math.exp(-2 * v * zPrime / s ** 2) - 1;
@@ -6250,7 +6361,7 @@
6250
6361
 
6251
6362
  // Mean Error RT
6252
6363
  // Equation 13 (Grasman et al., 2009)
6253
- static azvt02mE(a, z, v, t0, s = DDMMath.s) {
6364
+ static azvt02mE(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6254
6365
  function phi(x, y) {
6255
6366
  return Math.exp(2 * v * y / s ** 2) - Math.exp(2 * v * x / s ** 2);
6256
6367
  }
@@ -6261,7 +6372,7 @@
6261
6372
 
6262
6373
  // SD Error RT
6263
6374
  // Equation 14 (Grasman et al., 2009)
6264
- static azv2sdE(a, z, v, s = DDMMath.s) {
6375
+ static azv2sdE(a, z, v, s = DDMMath.s.DEFAULT) {
6265
6376
  function phi(x, y) {
6266
6377
  return Math.exp(2 * v * y / s ** 2) - Math.exp(2 * v * x / s ** 2);
6267
6378
  }
@@ -6271,17 +6382,17 @@
6271
6382
  }
6272
6383
 
6273
6384
  // Mean Correct RT
6274
- static azvt02mC(a, z, v, t0, s = DDMMath.s) {
6385
+ static azvt02mC(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6275
6386
  return DDMMath.azvt02mE(a, 1 - z, -v, t0, s);
6276
6387
  }
6277
6388
 
6278
6389
  // SD Correct RT
6279
- static azv2sdC(a, z, v, s = DDMMath.s) {
6390
+ static azv2sdC(a, z, v, s = DDMMath.s.DEFAULT) {
6280
6391
  return DDMMath.azv2sdE(a, 1 - z, -v, s);
6281
6392
  }
6282
6393
 
6283
6394
  // Density of Error RT
6284
- static tazv2gE(t, a, z, v, s = DDMMath.s) {
6395
+ static tazv2gE(t, a, z, v, s = DDMMath.s.DEFAULT) {
6285
6396
  if (!t) return 0;
6286
6397
  const zPrime = a * z;
6287
6398
  const base = Math.PI * s ** 2 / a ** 2 * Math.exp(-zPrime * v / s ** 2);
@@ -6298,7 +6409,7 @@
6298
6409
  }
6299
6410
 
6300
6411
  // Density of Correct RT
6301
- static tazv2gC(t, a, z, v, s = DDMMath.s) {
6412
+ static tazv2gC(t, a, z, v, s = DDMMath.s.DEFAULT) {
6302
6413
  return DDMMath.tazv2gE(t, a, 1 - z, -v, s);
6303
6414
  }
6304
6415
 
@@ -6433,10 +6544,7 @@
6433
6544
  this.startTime = undefined; // Start time of current trial
6434
6545
  this.rt = undefined; // RT for current trial
6435
6546
 
6436
- this.correctCount = 0; // Count of Correct Trials
6437
- this.errorCount = 0; // Count of Error Trials
6438
- this.nrCount = 0; // Count of No Response trials
6439
-
6547
+ this.data = {};
6440
6548
  this.trials = []; // Record of trials in block
6441
6549
  this.alignState();
6442
6550
  }
@@ -6453,11 +6561,10 @@
6453
6561
  }
6454
6562
  }
6455
6563
  get totalPayoff() {
6456
- return this.correctCount * this.correctPayoff + this.errorCount * this.errorPayoff + this.nrCount * this.nrPayoff;
6564
+ return this.data.correctCount * this.correctPayoff + this.data.errorCount * this.errorPayoff + this.data.nrCount * this.nrPayoff;
6457
6565
  }
6458
6566
  alignState() {
6459
- const stats = DDMMath.trials2stats(this.trials);
6460
- Object.assign(this, stats);
6567
+ this.data = DDMMath.trials2stats(this.trials);
6461
6568
  }
6462
6569
  start(signal, trial) {
6463
6570
  this.startTime = Date.now();
@@ -6472,7 +6579,6 @@
6472
6579
  this.state = 'feedback';
6473
6580
  if (this.response === undefined) {
6474
6581
  this.outcome = 'nr';
6475
- this.nrCount += 1;
6476
6582
  this.rt = undefined;
6477
6583
  this.trials.push({
6478
6584
  trial: this.trialCount,
@@ -6497,10 +6603,8 @@
6497
6603
  this.response = response;
6498
6604
  if (this.signal === this.response) {
6499
6605
  this.outcome = 'correct';
6500
- this.correctCount += 1;
6501
6606
  } else if (this.signal !== this.response) {
6502
6607
  this.outcome = 'error';
6503
- this.errorCount += 1;
6504
6608
  }
6505
6609
  this.trials.push({
6506
6610
  trial: this.trialCount,
@@ -6519,16 +6623,7 @@
6519
6623
  response: this.response,
6520
6624
  outcome: this.outcome,
6521
6625
  payoff: this.trialPayoff,
6522
- correctCount: this.correctCount,
6523
- errorCount: this.errorCount,
6524
- nrCount: this.nrCount,
6525
- accuracy: this.accuracy,
6526
- meanRT: this.meanRT,
6527
- correctMeanRT: this.correctMeanRT,
6528
- errorMeanRT: this.errorMeanRT,
6529
- sdRT: this.sdRT,
6530
- correctSDRT: this.correctSDRT,
6531
- errorSDRT: this.errorSDRT,
6626
+ data: this.data,
6532
6627
  totalPayoff: this.totalPayoff
6533
6628
  },
6534
6629
  bubbles: true
@@ -6541,9 +6636,6 @@
6541
6636
  this.signal = undefined;
6542
6637
  this.response = undefined;
6543
6638
  this.outcome = undefined;
6544
- this.correctCount = 0;
6545
- this.errorCount = 0;
6546
- this.nrCount = 0;
6547
6639
  this.trials = [];
6548
6640
  this.alignState();
6549
6641
  }
@@ -6567,7 +6659,7 @@
6567
6659
  super.disconnectedCallback();
6568
6660
  }
6569
6661
  static get styles() {
6570
- return [super.styles, i$2`
6662
+ return [super.styles, i$3`
6571
6663
  :host {
6572
6664
  display: inline-block;
6573
6665
  }
@@ -6897,7 +6989,7 @@
6897
6989
  this.sendEvent();
6898
6990
  }
6899
6991
  static get styles() {
6900
- return [super.styles, i$2`
6992
+ return [super.styles, i$3`
6901
6993
  :host {
6902
6994
  display: inline-block;
6903
6995
  }
@@ -7234,7 +7326,7 @@
7234
7326
  };
7235
7327
  }
7236
7328
 
7237
- var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoKICAgIERETU1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIQoKICAgIE1vZGVsIHBhcmFtZXRlcnM6CiAgICAgIGEgPSBib3VuZGFyeSBzZXBhcmF0aW9uCiAgICAgIHogPSBzdGFydGluZyBwb2ludCBhcyBhIHByb3BvcnRpb24gb2YgYQogICAgICB2ID0gZHJpZnQgcmF0ZSAocGVyIHNlY29uZCkKICAgICAgdDAgPSBub24tZGVjaXNpb24gdGltZSAoaW4gbWlsbGlzZWNvbmRzKQogICAgICBzID0gd2l0aGluLXRyaWFsIHZhcmlhYmlsaXR5IGluIGRyaWZ0IHJhdGUgKHNeMiA9IGluZmluaXRlc2ltYWwgdmFyaWFuY2UpCgogICAgICB6UHJpbWUgPSBzdGFydGluZyBwb2ludCBvbiBhIDAtdG8tYSBzY2FsZSAodHlwaWNhbGx5IHVzZWQgaW4gcHVibGlzaGVkIGVxdWF0aW9ucykKCiAgICBCZWhhdmlvcmFsIHZhcmlhYmxlczoKICAgICAgcEUgPSBwcm9wb3J0aW9uIG9mIGVycm9yIHRyaWFscwogICAgICBwQyA9IHByb3BvcnRpb24gb2YgY29ycmVjdCB0cmlhbHMKICAgICAgbSA9IG1lYW4gb2Ygb3ZlcmFsbCBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgbUUgPSBtZWFuIG9mIGVycm9yIFJUcyAoaW4gbWlsbGlzZWNvbmRzKQogICAgICBtQyA9IG1lYW4gY29ycmVjdCBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgc2QgPSBzdGFuZGFyZCBkZXZpYXRpb24gb2Ygb3ZlcmFsbCBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgc2RFID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGVycm9yIFJUcyAoaW4gbWlsbGlzZWNvbmRzKQogICAgICBzZEMgPSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgY29ycmVjdCBSVHMgKGluIG1pbGxpc2Vjb25kcykKCiAgICBFcXVhdGlvbnM6CiAgICAgIFByb2JhYmlsaXR5IG9mIGNvcnJlY3QgYW5kIGVycm9yIHJlc3BvbnNlcyAoQWxleGFuZHJvd2ljeiwgMjAyMCkKICAgICAgTWVhbiBvZiBvdmVyYWxsLCBlcnJvciwgYW5kIGNvcnJlY3QgUlRzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgICAgU3RhbmRhcmQgZGV2aWF0aW9uIG9mIG92ZXJhbGwsIGVycm9yLCBhbmQgY29ycmVjdCBSVHMgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KQogICAgICBEZW5zaXR5IG9mIGVycm9yIGFuZCBjb3JyZWN0IFJUIGRpc3RyaWJ1dGlvbnMgKEFsZXhhbmRyb3dpY3osIDIwMjApCiAgICAgIEVaLWRpZmZ1c2lvbiBtb2RlbCAoV2FnZW5tYWtlcnMgZXQgYWwuLCAyMDA3KQogICovCiAgY2xhc3MgRERNTWF0aCB7CiAgICBzdGF0aWMgcyA9IDE7CgogICAgLy8gQ2FsY3VsYXRlIGEgYnVuY2ggb2Ygc3RhdGlzdGljcyBmb3IgYW4gYXJyYXkgb2YgdHJpYWxzCiAgICBzdGF0aWMgdHJpYWxzMnN0YXRzKHRyaWFscykgewogICAgICBjb25zdCBzdGF0cyA9IHt9OwoKICAgICAgLy8gRmlyc3Qtb3JkZXIgc3VtcwogICAgICBjb25zdCBzdW1zID0gdHJpYWxzLnJlZHVjZSgoYWNjdW11bGF0b3IsIHRyaWFsKSA9PiB7CiAgICAgICAgc3dpdGNoICh0cmlhbC5vdXRjb21lKSB7CiAgICAgICAgICBjYXNlICdjb3JyZWN0JzoKICAgICAgICAgICAgYWNjdW11bGF0b3IuY29ycmVjdENvdW50ICs9IDE7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RSVFN1bSArPSB0cmlhbC5ydDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yQ291bnQgKz0gMTsKICAgICAgICAgICAgYWNjdW11bGF0b3IuZXJyb3JSVFN1bSArPSB0cmlhbC5ydDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICducic6CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLm5yQ291bnQgKz0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAvLyBOby1vcAogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICAgIH0sIHsKICAgICAgICBjb3JyZWN0Q291bnQ6IDAsCiAgICAgICAgZXJyb3JDb3VudDogMCwKICAgICAgICBuckNvdW50OiAwLAogICAgICAgIGNvcnJlY3RSVFN1bTogMCwKICAgICAgICBlcnJvclJUU3VtOiAwCiAgICAgIH0pOwoKICAgICAgLy8gRmlyc3Qtb3JkZXIgc3RhdHMKICAgICAgc3RhdHMuY29ycmVjdENvdW50ID0gc3Vtcy5jb3JyZWN0Q291bnQ7CiAgICAgIHN0YXRzLmVycm9yQ291bnQgPSBzdW1zLmVycm9yQ291bnQ7CiAgICAgIHN0YXRzLm5yQ291bnQgPSBzdW1zLm5yQ291bnQ7CiAgICAgIHN0YXRzLmFjY3VyYWN5ID0gc3Vtcy5jb3JyZWN0Q291bnQgLyAoc3Vtcy5jb3JyZWN0Q291bnQgKyBzdW1zLmVycm9yQ291bnQgKyBzdW1zLm5yQ291bnQpOwogICAgICBzdGF0cy5jb3JyZWN0TWVhblJUID0gc3Vtcy5jb3JyZWN0UlRTdW0gLyBzdW1zLmNvcnJlY3RDb3VudDsKICAgICAgc3RhdHMuZXJyb3JNZWFuUlQgPSBzdW1zLmVycm9yUlRTdW0gLyBzdW1zLmVycm9yQ291bnQ7CiAgICAgIHN0YXRzLm1lYW5SVCA9IChzdW1zLmNvcnJlY3RSVFN1bSArIHN1bXMuZXJyb3JSVFN1bSkgLyAoc3Vtcy5jb3JyZWN0Q291bnQgKyBzdW1zLmVycm9yQ291bnQpOwoKICAgICAgLy8gU2Vjb25kLW9yZGVyIHN1bXMKICAgICAgY29uc3Qgc3VtczIgPSB0cmlhbHMucmVkdWNlKChhY2N1bXVsYXRvciwgdHJpYWwpID0+IHsKICAgICAgICBzd2l0Y2ggKHRyaWFsLm91dGNvbWUpIHsKICAgICAgICAgIGNhc2UgJ2NvcnJlY3QnOgogICAgICAgICAgICBhY2N1bXVsYXRvci5zcyArPSAodHJpYWwucnQgLSBzdGF0cy5tZWFuUlQpICoqIDI7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RTUyArPSAodHJpYWwucnQgLSBzdGF0cy5jb3JyZWN0TWVhblJUKSAqKiAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgICAgICAgYWNjdW11bGF0b3Iuc3MgKz0gKHRyaWFsLnJ0IC0gc3RhdHMubWVhblJUKSAqKiAyOwogICAgICAgICAgICBhY2N1bXVsYXRvci5lcnJvclNTICs9ICh0cmlhbC5ydCAtIHN0YXRzLmVycm9yTWVhblJUKSAqKiAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIC8vIE5vLW9wCiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgfSwgewogICAgICAgIHNzOiAwLAogICAgICAgIGNvcnJlY3RTUzogMCwKICAgICAgICBlcnJvclNTOiAwCiAgICAgIH0pOwoKICAgICAgLy8gU2Vjb25kLW9yZGVyIHN0YXRzCiAgICAgIHN0YXRzLmNvcnJlY3RTRFJUID0gc3RhdHMuY29ycmVjdENvdW50ID4gMSA/IE1hdGguc3FydChzdW1zMi5jb3JyZWN0U1MgLyAoc3RhdHMuY29ycmVjdENvdW50IC0gMSkpIDogTmFOOwogICAgICBzdGF0cy5lcnJvclNEUlQgPSBzdGF0cy5lcnJvckNvdW50ID4gMSA/IE1hdGguc3FydChzdW1zMi5lcnJvclNTIC8gKHN0YXRzLmVycm9yQ291bnQgLSAxKSkgOiBOYU47CiAgICAgIHN0YXRzLnNkUlQgPSBzdGF0cy5jb3JyZWN0Q291bnQgKyBzdGF0cy5lcnJvckNvdW50ID4gMSA/IE1hdGguc3FydChzdW1zMi5zcyAvIChzdGF0cy5jb3JyZWN0Q291bnQgKyBzdGF0cy5lcnJvckNvdW50IC0gMSkpIDogTmFOOwogICAgICByZXR1cm4gc3RhdHM7CiAgICB9CgogICAgLy8gUHJvYmFiaWxpdHkgb2YgYW4gRXJyb3IgUmVzcG9uc2UKICAgIHN0YXRpYyBhenYycEUoYSwgeiwgdiwgcyA9IERETU1hdGgucykgewogICAgICBjb25zdCB6UHJpbWUgPSBhICogejsKICAgICAgY29uc3QgQSA9IE1hdGguZXhwKC0yICogdiAqIGEgLyBzICoqIDIpOwogICAgICBjb25zdCBaID0gTWF0aC5leHAoLTIgKiB2ICogelByaW1lIC8gcyAqKiAyKTsKICAgICAgcmV0dXJuIChBIC0gWikgLyAoQSAtIDEpOwogICAgfQoKICAgIC8vIFByb2JhYmlsaXR5IG9mIGEgQ29ycmVjdCBSZXNwb25zZQogICAgc3RhdGljIGF6djJwQyhhLCB6LCB2LCBzID0gRERNTWF0aC5zKSB7CiAgICAgIHJldHVybiBERE1NYXRoLmF6djJwRShhLCAxIC0geiwgLXYsIHMpOwogICAgfQoKICAgIC8vIE1lYW4gT3ZlcmFsbCBSVAogICAgLy8gRXF1YXRpb24gNSAoR3Jhc21hbiBldCBhbC4sIDIwMDkpCiAgICBzdGF0aWMgYXp2dDAybShhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucykgewogICAgICBjb25zdCB6UHJpbWUgPSBhICogejsKICAgICAgY29uc3QgQSA9IE1hdGguZXhwKC0yICogdiAqIGEgLyBzICoqIDIpIC0gMTsKICAgICAgY29uc3QgWiA9IE1hdGguZXhwKC0yICogdiAqIHpQcmltZSAvIHMgKiogMikgLSAxOwogICAgICBjb25zdCBtZWFuID0gLSh6UHJpbWUgLyB2KSArIGEgLyB2ICogKFogLyBBKTsKICAgICAgcmV0dXJuIHQwICsgbWVhbiAqIDEwMDA7CiAgICB9CgogICAgLy8gU0QgT3ZlcmFsbCBSVAogICAgLy8gRXF1YXRpb24gNiAoR3Jhc21hbiBldCBhbC4sIDIwMDkpCiAgICBzdGF0aWMgYXp2MnNkKGEsIHosIHYsIHMgPSBERE1NYXRoLnMpIHsKICAgICAgY29uc3QgelByaW1lID0gYSAqIHo7CiAgICAgIGNvbnN0IEEgPSBNYXRoLmV4cCgtMiAqIHYgKiBhIC8gcyAqKiAyKSAtIDE7CiAgICAgIGNvbnN0IFogPSBNYXRoLmV4cCgtMiAqIHYgKiB6UHJpbWUgLyBzICoqIDIpIC0gMTsKICAgICAgY29uc3QgdmFyaWFuY2UgPSAoLXYgKiBhICoqIDIgKiAoWiArIDQpICogWiAvIEEgKiogMiArICgoLTMgKiB2ICogYSAqKiAyICsgNCAqIHYgKiB6UHJpbWUgKiBhICsgcyAqKiAyICogYSkgKiBaICsgNCAqIHYgKiB6UHJpbWUgKiBhKSAvIEEgLSBzICoqIDIgKiB6UHJpbWUpIC8gdiAqKiAzOwogICAgICByZXR1cm4gTWF0aC5zcXJ0KHZhcmlhbmNlKSAqIDEwMDA7CiAgICB9CgogICAgLy8gTWVhbiBFcnJvciBSVAogICAgLy8gRXF1YXRpb24gMTMgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KQogICAgc3RhdGljIGF6dnQwMm1FKGEsIHosIHYsIHQwLCBzID0gRERNTWF0aC5zKSB7CiAgICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7CiAgICAgICAgcmV0dXJuIE1hdGguZXhwKDIgKiB2ICogeSAvIHMgKiogMikgLSBNYXRoLmV4cCgyICogdiAqIHggLyBzICoqIDIpOwogICAgICB9CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBtZWFuID0gKHpQcmltZSAqIChwaGkoelByaW1lIC0gYSwgYSkgKyBwaGkoMCwgelByaW1lKSkgKyAyICogYSAqIHBoaSh6UHJpbWUsIDApKSAvICh2ICogcGhpKHpQcmltZSwgYSkgKiBwaGkoLWEsIDApKTsKICAgICAgcmV0dXJuIHQwICsgbWVhbiAqIDEwMDA7CiAgICB9CgogICAgLy8gU0QgRXJyb3IgUlQKICAgIC8vIEVxdWF0aW9uIDE0IChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgIHN0YXRpYyBhenYyc2RFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMpIHsKICAgICAgZnVuY3Rpb24gcGhpKHgsIHkpIHsKICAgICAgICByZXR1cm4gTWF0aC5leHAoMiAqIHYgKiB5IC8gcyAqKiAyKSAtIE1hdGguZXhwKDIgKiB2ICogeCAvIHMgKiogMik7CiAgICAgIH0KICAgICAgY29uc3QgelByaW1lID0gYSAqIHo7CiAgICAgIGNvbnN0IHZhcmlhbmNlID0gLTIgKiBhICogcGhpKDAsIHpQcmltZSkgKiAoMiAqIHYgKiBhICogcGhpKHpQcmltZSwgMiAqIGEpICsgcyAqKiAyICogcGhpKDAsIGEpICogcGhpKHpQcmltZSwgYSkpICogTWF0aC5leHAoMiAqIHYgKiBhIC8gcyAqKiAyKSAvICh2ICoqIDMgKiBwaGkoMCwgYSkgKiogMiAqIHBoaSh6UHJpbWUsIGEpICoqIDIpICsgKDQgKiB2ICogelByaW1lICogKDIgKiBhIC0gelByaW1lKSAqIE1hdGguZXhwKDIgKiB2ICogKHpQcmltZSArIGEpIC8gcyAqKiAyKSArIHpQcmltZSAqIHMgKiogMiAqIHBoaSgyICogelByaW1lLCAyICogYSkpIC8gKHYgKiogMyAqIHBoaSh6UHJpbWUsIGEpICoqIDIpOwogICAgICByZXR1cm4gTWF0aC5zcXJ0KHZhcmlhbmNlKSAqIDEwMDA7CiAgICB9CgogICAgLy8gTWVhbiBDb3JyZWN0IFJUCiAgICBzdGF0aWMgYXp2dDAybUMoYSwgeiwgdiwgdDAsIHMgPSBERE1NYXRoLnMpIHsKICAgICAgcmV0dXJuIERETU1hdGguYXp2dDAybUUoYSwgMSAtIHosIC12LCB0MCwgcyk7CiAgICB9CgogICAgLy8gU0QgQ29ycmVjdCBSVAogICAgc3RhdGljIGF6djJzZEMoYSwgeiwgdiwgcyA9IERETU1hdGgucykgewogICAgICByZXR1cm4gRERNTWF0aC5henYyc2RFKGEsIDEgLSB6LCAtdiwgcyk7CiAgICB9CgogICAgLy8gRGVuc2l0eSBvZiBFcnJvciBSVAogICAgc3RhdGljIHRhenYyZ0UodCwgYSwgeiwgdiwgcyA9IERETU1hdGgucykgewogICAgICBpZiAoIXQpIHJldHVybiAwOwogICAgICBjb25zdCB6UHJpbWUgPSBhICogejsKICAgICAgY29uc3QgYmFzZSA9IE1hdGguUEkgKiBzICoqIDIgLyBhICoqIDIgKiBNYXRoLmV4cCgtelByaW1lICogdiAvIHMgKiogMik7CiAgICAgIGxldCBrID0gMDsKICAgICAgbGV0IHRlcm0gPSAwOwogICAgICBsZXQgc3VtID0gMDsKICAgICAgZG8gewogICAgICAgIGsgKz0gMTsKICAgICAgICB0ZXJtID0gayAqIE1hdGguc2luKE1hdGguUEkgKiB6UHJpbWUgKiBrIC8gYSkgKiBNYXRoLmV4cCgtMC41ICogKHYgKiogMiAvIHMgKiogMiArIE1hdGguUEkgKiogMiAqIGsgKiogMiAqIHMgKiogMiAvIGEgKiogMikgKiB0KTsKICAgICAgICBzdW0gKz0gdGVybTsKICAgICAgfSB3aGlsZSAoayA8IDIwMCk7IC8vID8/IEhBQ0sKCiAgICAgIHJldHVybiBiYXNlICogc3VtOwogICAgfQoKICAgIC8vIERlbnNpdHkgb2YgQ29ycmVjdCBSVAogICAgc3RhdGljIHRhenYyZ0ModCwgYSwgeiwgdiwgcyA9IERETU1hdGgucykgewogICAgICByZXR1cm4gRERNTWF0aC50YXp2MmdFKHQsIGEsIDEgLSB6LCAtdiwgcyk7CiAgICB9CgogICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vcmFvdWwuc29jc2NpLnV2YS5ubC9FWjIvRVoyX25ldy5odG1sCiAgICAvLyBFWi1mdW5jdGlvbiBmb3Igc3RhcnRpbmcgdmFsdWVzCiAgICAvLyBpbnB1dDogb2JqIC0gT2JqZWN0IHdpdGggcHJvcGVydGllcwogICAgLy8gICAgcEMgLSBQcm9wb3J0aW9uIGNvcnJlY3QKICAgIC8vICAgIHNkIC0gc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgUlQncyBpbiBtcwogICAgLy8gICAgbSAtIHNhbXBsZSBtZWFuIG9mIHRoZSBSVCdzIGluIG1zCiAgICAvLyAgICBzIC0gZGlmZnVzaW9uIHN0YW5kYXJkIGRldmlhdGlvbgogICAgLy8gcmV0dXJuczogT2JqZWN0IHdpdGggcHJvcGVydGllcyB2LCBhLCBhbmQgdDAsIGNvbnRhaW5pbmcgRVotZXN0aW1hdGVzIG9mIHRoZXNlIHBhcmFtZXRlcnMKICAgIHN0YXRpYyBkYXRhMmV6KHsKICAgICAgYWNjdXJhY3k6IHBDLAogICAgICBzZFJUOiBzZCwKICAgICAgbWVhblJUOiBtLAogICAgICBzCiAgICB9KSB7CiAgICAgIGZ1bmN0aW9uIHNpZ24ocikgewogICAgICAgIHJldHVybiByID4gMCA/IDEgOiByID09PSAwID8gMCA6IC0xOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGxvZ2l0KHApIHsKICAgICAgICByZXR1cm4gTWF0aC5sb2cocCAvICgxIC0gcCkpOwogICAgICB9CiAgICAgIGNvbnN0IHZydCA9IChzZCAvIDEwMDApICoqIDI7CiAgICAgIGNvbnN0IG1ydCA9IG0gLyAxMDAwOwogICAgICBjb25zdCBzMiA9IHMgKiogMjsKICAgICAgY29uc3QgbCA9IGxvZ2l0KHBDKTsKICAgICAgY29uc3QgeCA9IGwgKiAobCAqIHBDICoqIDIgLSBsICogcEMgKyBwQyAtIDAuNSkgLyB2cnQ7CiAgICAgIGNvbnN0IHYgPSBzaWduKHBDIC0gMC41KSAqIHMgKiB4ICoqICgxIC8gNCk7CiAgICAgIGNvbnN0IGEgPSBzMiAqIGxvZ2l0KHBDKSAvIHY7CiAgICAgIGNvbnN0IHkgPSAtdiAqIGEgLyBzMjsKICAgICAgY29uc3QgbWR0ID0gYSAvICgyICogdikgKiAoMSAtIE1hdGguZXhwKHkpKSAvICgxICsgTWF0aC5leHAoeSkpOwogICAgICBjb25zdCB0MCA9IG1ydCA/IG1ydCAtIG1kdCA6IG51bGw7IC8vIGNvbXB1dGUgVGVyIG9ubHkgaWYgTVJUIHdhcyBwcm92aWRlZAoKICAgICAgY29uc3QgdDBQcmltZSA9IHQwICogMTAwMDsKICAgICAgcmV0dXJuIHsKICAgICAgICB2LAogICAgICAgIGEsCiAgICAgICAgdDA6IHQwUHJpbWUsCiAgICAgICAgcwogICAgICB9OwogICAgfQogICAgc3RhdGljIGRhdGEyZXoyKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGEyZXoyIGlzIG5vdCBpbXBsZW1lbnRlZCEnKTsKICAgIH0KICB9CgogIC8vIEludGVybmFsIGRlcGVuZGVuY2llcwoKICAvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbIm9mZiIsICJzZWxmIl0gKi8KCiAgc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICBjb25zdCBwYXJhbXMgPSBERE1NYXRoLmRhdGEyZXooewogICAgICAuLi5ldmVudC5kYXRhLAogICAgICBzOiBERE1NYXRoLnMKICAgIH0pOwoKICAgIC8vICMjIyMjIEFyYml0cmFyeSBkZWZhdWx0IHZhbHVlcyEhIQogICAgY29uc3QgYSA9ICFpc05hTihwYXJhbXMuYSkgPyBwYXJhbXMuYSA6IDEuNTsKICAgIGNvbnN0IHogPSAhaXNOYU4ocGFyYW1zLnopID8gcGFyYW1zLnogOiAwLjU7CiAgICBjb25zdCB2ID0gIWlzTmFOKHBhcmFtcy52KSA/IHBhcmFtcy52IDogMC4xOwogICAgY29uc3QgdDAgPSAhaXNOYU4ocGFyYW1zLnQwKSA/IHBhcmFtcy50MCA6IDEwMDsKICAgIGNvbnN0IHMgPSAhaXNOYU4ocGFyYW1zLnMpID8gcGFyYW1zLnMgOiBERE1NYXRoLnM7CiAgICBjb25zdCBwcmVkaWN0ZWQgPSB7CiAgICAgIGFjY3VyYWN5OiBERE1NYXRoLmF6djJwQyhhLCB6LCB2KSwKICAgICAgY29ycmVjdE1lYW5SVDogRERNTWF0aC5henZ0MDJtQyhhLCB6LCB2LCB0MCksCiAgICAgIGVycm9yTWVhblJUOiBERE1NYXRoLmF6dnQwMm1FKGEsIHosIHYsIHQwKSwKICAgICAgbWVhblJUOiBERE1NYXRoLmF6dnQwMm0oYSwgeiwgdiwgdDApLAogICAgICBjb3JyZWN0U0RSVDogRERNTWF0aC5henYyc2RDKGEsIHosIHYpLAogICAgICBlcnJvclNEUlQ6IERETU1hdGguYXp2MnNkRShhLCB6LCB2KSwKICAgICAgc2RSVDogRERNTWF0aC5henYyc2QoYSwgeiwgdikKICAgIH07CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgcGFyYW1zOiB7CiAgICAgICAgYSwKICAgICAgICB6LAogICAgICAgIHYsCiAgICAgICAgdDAsCiAgICAgICAgcwogICAgICB9LAogICAgICBwcmVkaWN0ZWQKICAgIH0pOwogIH07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1kZG0tZml0LXdvcmtlci5qcy5tYXAKCg==', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGRtLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uL2FjY3VtdWxhYmxlLW1hdGgvc3JjL2RkbS1tYXRoLmpzIiwiLi4vYWNjdW11bGFibGUtbWF0aC9zcmMvaW5kZXguanMiLCJzcmMvY29tcG9uZW50cy9kZG0tZml0LXdvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qXG4gIERETU1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIVxuXG4gIE1vZGVsIHBhcmFtZXRlcnM6XG4gICAgYSA9IGJvdW5kYXJ5IHNlcGFyYXRpb25cbiAgICB6ID0gc3RhcnRpbmcgcG9pbnQgYXMgYSBwcm9wb3J0aW9uIG9mIGFcbiAgICB2ID0gZHJpZnQgcmF0ZSAocGVyIHNlY29uZClcbiAgICB0MCA9IG5vbi1kZWNpc2lvbiB0aW1lIChpbiBtaWxsaXNlY29uZHMpXG4gICAgcyA9IHdpdGhpbi10cmlhbCB2YXJpYWJpbGl0eSBpbiBkcmlmdCByYXRlIChzXjIgPSBpbmZpbml0ZXNpbWFsIHZhcmlhbmNlKVxuXG4gICAgelByaW1lID0gc3RhcnRpbmcgcG9pbnQgb24gYSAwLXRvLWEgc2NhbGUgKHR5cGljYWxseSB1c2VkIGluIHB1Ymxpc2hlZCBlcXVhdGlvbnMpXG5cbiAgQmVoYXZpb3JhbCB2YXJpYWJsZXM6XG4gICAgcEUgPSBwcm9wb3J0aW9uIG9mIGVycm9yIHRyaWFsc1xuICAgIHBDID0gcHJvcG9ydGlvbiBvZiBjb3JyZWN0IHRyaWFsc1xuICAgIG0gPSBtZWFuIG9mIG92ZXJhbGwgUlRzIChpbiBtaWxsaXNlY29uZHMpXG4gICAgbUUgPSBtZWFuIG9mIGVycm9yIFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIG1DID0gbWVhbiBjb3JyZWN0IFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIHNkID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIG92ZXJhbGwgUlRzIChpbiBtaWxsaXNlY29uZHMpXG4gICAgc2RFID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGVycm9yIFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIHNkQyA9IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBjb3JyZWN0IFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuXG4gIEVxdWF0aW9uczpcbiAgICBQcm9iYWJpbGl0eSBvZiBjb3JyZWN0IGFuZCBlcnJvciByZXNwb25zZXMgKEFsZXhhbmRyb3dpY3osIDIwMjApXG4gICAgTWVhbiBvZiBvdmVyYWxsLCBlcnJvciwgYW5kIGNvcnJlY3QgUlRzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSlcbiAgICBTdGFuZGFyZCBkZXZpYXRpb24gb2Ygb3ZlcmFsbCwgZXJyb3IsIGFuZCBjb3JyZWN0IFJUcyAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gICAgRGVuc2l0eSBvZiBlcnJvciBhbmQgY29ycmVjdCBSVCBkaXN0cmlidXRpb25zIChBbGV4YW5kcm93aWN6LCAyMDIwKVxuICAgIEVaLWRpZmZ1c2lvbiBtb2RlbCAoV2FnZW5tYWtlcnMgZXQgYWwuLCAyMDA3KVxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERETU1hdGgge1xuICBzdGF0aWMgcyA9IDE7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgYnVuY2ggb2Ygc3RhdGlzdGljcyBmb3IgYW4gYXJyYXkgb2YgdHJpYWxzXG4gIHN0YXRpYyB0cmlhbHMyc3RhdHModHJpYWxzKSB7XG4gICAgY29uc3Qgc3RhdHMgPSB7fTtcblxuICAgIC8vIEZpcnN0LW9yZGVyIHN1bXNcbiAgICBjb25zdCBzdW1zID0gdHJpYWxzLnJlZHVjZShcbiAgICAgIChhY2N1bXVsYXRvciwgdHJpYWwpID0+IHtcbiAgICAgICAgc3dpdGNoICh0cmlhbC5vdXRjb21lKSB7XG4gICAgICAgICAgY2FzZSAnY29ycmVjdCc6XG4gICAgICAgICAgICBhY2N1bXVsYXRvci5jb3JyZWN0Q291bnQgKz0gMTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RSVFN1bSArPSB0cmlhbC5ydDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yQ291bnQgKz0gMTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yUlRTdW0gKz0gdHJpYWwucnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICducic6XG4gICAgICAgICAgICBhY2N1bXVsYXRvci5uckNvdW50ICs9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gTm8tb3BcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb3JyZWN0Q291bnQ6IDAsXG4gICAgICAgIGVycm9yQ291bnQ6IDAsXG4gICAgICAgIG5yQ291bnQ6IDAsXG5cbiAgICAgICAgY29ycmVjdFJUU3VtOiAwLFxuICAgICAgICBlcnJvclJUU3VtOiAwLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRmlyc3Qtb3JkZXIgc3RhdHNcbiAgICBzdGF0cy5jb3JyZWN0Q291bnQgPSBzdW1zLmNvcnJlY3RDb3VudDtcbiAgICBzdGF0cy5lcnJvckNvdW50ID0gc3Vtcy5lcnJvckNvdW50O1xuICAgIHN0YXRzLm5yQ291bnQgPSBzdW1zLm5yQ291bnQ7XG4gICAgc3RhdHMuYWNjdXJhY3kgPSBzdW1zLmNvcnJlY3RDb3VudCAvIChzdW1zLmNvcnJlY3RDb3VudCArIHN1bXMuZXJyb3JDb3VudCArIHN1bXMubnJDb3VudCk7XG5cbiAgICBzdGF0cy5jb3JyZWN0TWVhblJUID0gc3Vtcy5jb3JyZWN0UlRTdW0gLyBzdW1zLmNvcnJlY3RDb3VudDtcbiAgICBzdGF0cy5lcnJvck1lYW5SVCA9IHN1bXMuZXJyb3JSVFN1bSAvIHN1bXMuZXJyb3JDb3VudDtcbiAgICBzdGF0cy5tZWFuUlQgPSAoc3Vtcy5jb3JyZWN0UlRTdW0gKyBzdW1zLmVycm9yUlRTdW0pIC8gKHN1bXMuY29ycmVjdENvdW50ICsgc3Vtcy5lcnJvckNvdW50KTtcblxuICAgIC8vIFNlY29uZC1vcmRlciBzdW1zXG4gICAgY29uc3Qgc3VtczIgPSB0cmlhbHMucmVkdWNlKFxuICAgICAgKGFjY3VtdWxhdG9yLCB0cmlhbCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRyaWFsLm91dGNvbWUpIHtcbiAgICAgICAgICBjYXNlICdjb3JyZWN0JzpcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnNzICs9ICh0cmlhbC5ydCAtIHN0YXRzLm1lYW5SVCkgKiogMjtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RTUyArPSAodHJpYWwucnQgLSBzdGF0cy5jb3JyZWN0TWVhblJUKSAqKiAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgYWNjdW11bGF0b3Iuc3MgKz0gKHRyaWFsLnJ0IC0gc3RhdHMubWVhblJUKSAqKiAyO1xuICAgICAgICAgICAgYWNjdW11bGF0b3IuZXJyb3JTUyArPSAodHJpYWwucnQgLSBzdGF0cy5lcnJvck1lYW5SVCkgKiogMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBOby1vcFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNzOiAwLFxuICAgICAgICBjb3JyZWN0U1M6IDAsXG4gICAgICAgIGVycm9yU1M6IDAsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTZWNvbmQtb3JkZXIgc3RhdHNcbiAgICBzdGF0cy5jb3JyZWN0U0RSVCA9IChzdGF0cy5jb3JyZWN0Q291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuY29ycmVjdFNTIC8gKHN0YXRzLmNvcnJlY3RDb3VudCAtIDEpKVxuICAgICAgOiBOYU47XG4gICAgc3RhdHMuZXJyb3JTRFJUID0gKHN0YXRzLmVycm9yQ291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuZXJyb3JTUyAvIChzdGF0cy5lcnJvckNvdW50IC0gMSkpXG4gICAgICA6IE5hTjtcbiAgICBzdGF0cy5zZFJUID0gKHN0YXRzLmNvcnJlY3RDb3VudCArIHN0YXRzLmVycm9yQ291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuc3MgLyAoc3RhdHMuY29ycmVjdENvdW50ICsgc3RhdHMuZXJyb3JDb3VudCAtIDEpKVxuICAgICAgOiBOYU47XG5cbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cblxuICAvLyBQcm9iYWJpbGl0eSBvZiBhbiBFcnJvciBSZXNwb25zZVxuICBzdGF0aWMgYXp2MnBFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMpIHtcbiAgICBjb25zdCB6UHJpbWUgPSBhICogejtcblxuICAgIGNvbnN0IEEgPSBNYXRoLmV4cCgoLTIgKiB2ICogYSkgLyBzICoqIDIpO1xuICAgIGNvbnN0IFogPSBNYXRoLmV4cCgoLTIgKiB2ICogelByaW1lKSAvIHMgKiogMik7XG5cbiAgICByZXR1cm4gKEEgLSBaKSAvIChBIC0gMSk7XG4gIH1cblxuICAvLyBQcm9iYWJpbGl0eSBvZiBhIENvcnJlY3QgUmVzcG9uc2VcbiAgc3RhdGljIGF6djJwQyhhLCB6LCB2LCBzID0gRERNTWF0aC5zKSB7XG4gICAgcmV0dXJuIERETU1hdGguYXp2MnBFKGEsIDEgLSB6LCAtdiwgcyk7XG4gIH1cblxuICAvLyBNZWFuIE92ZXJhbGwgUlRcbiAgLy8gRXF1YXRpb24gNSAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gIHN0YXRpYyBhenZ0MDJtKGEsIHosIHYsIHQwLCBzID0gRERNTWF0aC5zKSB7XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG4gICAgY29uc3QgQSA9IE1hdGguZXhwKCgtMiAqIHYgKiBhKSAvIHMgKiogMikgLSAxO1xuICAgIGNvbnN0IFogPSBNYXRoLmV4cCgoLTIgKiB2ICogelByaW1lKSAvIHMgKiogMikgLSAxO1xuXG4gICAgY29uc3QgbWVhbiA9IC0oelByaW1lIC8gdikgKyAoYSAvIHYpICogKFogLyBBKTtcbiAgICByZXR1cm4gdDAgKyBtZWFuICogMTAwMDtcbiAgfVxuXG4gIC8vIFNEIE92ZXJhbGwgUlRcbiAgLy8gRXF1YXRpb24gNiAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gIHN0YXRpYyBhenYyc2QoYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6O1xuICAgIGNvbnN0IEEgPSBNYXRoLmV4cCgoLTIgKiB2ICogYSkgLyBzICoqIDIpIC0gMTtcbiAgICBjb25zdCBaID0gTWF0aC5leHAoKC0yICogdiAqIHpQcmltZSkgLyBzICoqIDIpIC0gMTtcblxuICAgIGNvbnN0IHZhcmlhbmNlID0gKFxuICAgICAgKFxuICAgICAgICAoLXYgKiBhICoqIDIgKiAoWiArIDQpICogWikgLyBBICoqIDJcbiAgICAgICkgKyAoXG4gICAgICAgICgoLTMgKiB2ICogYSAqKiAyICsgNCAqIHYgKiB6UHJpbWUgKiBhICsgcyAqKiAyICogYSkgKiBaICsgNCAqIHYgKiB6UHJpbWUgKiBhKSAvIEFcbiAgICAgICkgLSAoXG4gICAgICAgIHMgKiogMiAqIHpQcmltZVxuICAgICAgKVxuICAgICkgLyB2ICoqIDM7XG5cbiAgICByZXR1cm4gTWF0aC5zcXJ0KHZhcmlhbmNlKSAqIDEwMDA7XG4gIH1cblxuICAvLyBNZWFuIEVycm9yIFJUXG4gIC8vIEVxdWF0aW9uIDEzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSlcbiAgc3RhdGljIGF6dnQwMm1FKGEsIHosIHYsIHQwLCBzID0gRERNTWF0aC5zKSB7XG4gICAgZnVuY3Rpb24gcGhpKHgsIHkpIHtcbiAgICAgIHJldHVybiBNYXRoLmV4cCgoMiAqIHYgKiB5KSAvIChzICoqIDIpKSAtIE1hdGguZXhwKCgyICogdiAqIHgpIC8gKHMgKiogMikpO1xuICAgIH1cbiAgICBjb25zdCB6UHJpbWUgPSBhICogejtcblxuICAgIGNvbnN0IG1lYW4gPSAoelByaW1lICogKHBoaSh6UHJpbWUgLSBhLCBhKSArIHBoaSgwLCB6UHJpbWUpKSArIDIgKiBhICogcGhpKHpQcmltZSwgMCkpXG4gICAgICAvICh2ICogcGhpKHpQcmltZSwgYSkgKiBwaGkoLWEsIDApKTtcbiAgICByZXR1cm4gdDAgKyBtZWFuICogMTAwMDtcbiAgfVxuXG4gIC8vIFNEIEVycm9yIFJUXG4gIC8vIEVxdWF0aW9uIDE0IChHcmFzbWFuIGV0IGFsLiwgMjAwOSlcbiAgc3RhdGljIGF6djJzZEUoYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7XG4gICAgICByZXR1cm4gTWF0aC5leHAoKDIgKiB2ICogeSkgLyAocyAqKiAyKSkgLSBNYXRoLmV4cCgoMiAqIHYgKiB4KSAvIChzICoqIDIpKTtcbiAgICB9XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG5cbiAgICBjb25zdCB2YXJpYW5jZSA9IChcbiAgICAgIChcbiAgICAgICAgLTIgKiBhICogcGhpKDAsIHpQcmltZSlcbiAgICAgICAgKiAoKDIgKiB2ICogYSAqIHBoaSh6UHJpbWUsIDIgKiBhKSkgKyAocyAqKiAyICogcGhpKDAsIGEpICogcGhpKHpQcmltZSwgYSkpKVxuICAgICAgICAqIE1hdGguZXhwKCgyICogdiAqIGEpIC8gcyAqKiAyKVxuICAgICAgKSAvIChcbiAgICAgICAgdiAqKiAzICogcGhpKDAsIGEpICoqIDIgKiBwaGkoelByaW1lLCBhKSAqKiAyXG4gICAgICApXG4gICAgKSArIChcbiAgICAgIChcbiAgICAgICAgNCAqIHYgKiB6UHJpbWUgKiAoMiAqIGEgLSB6UHJpbWUpICogTWF0aC5leHAoKDIgKiB2ICogKHpQcmltZSArIGEpKSAvIHMgKiogMilcbiAgICAgICAgKyB6UHJpbWUgKiBzICoqIDIgKiBwaGkoMiAqIHpQcmltZSwgMiAqIGEpXG4gICAgICApIC8gKFxuICAgICAgICB2ICoqIDMgKiBwaGkoelByaW1lLCBhKSAqKiAyXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiBNYXRoLnNxcnQodmFyaWFuY2UpICogMTAwMDtcbiAgfVxuXG4gIC8vIE1lYW4gQ29ycmVjdCBSVFxuICBzdGF0aWMgYXp2dDAybUMoYSwgeiwgdiwgdDAsIHMgPSBERE1NYXRoLnMpIHtcbiAgICByZXR1cm4gRERNTWF0aC5henZ0MDJtRShhLCAxIC0geiwgLXYsIHQwLCBzKTtcbiAgfVxuXG4gIC8vIFNEIENvcnJlY3QgUlRcbiAgc3RhdGljIGF6djJzZEMoYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIHJldHVybiBERE1NYXRoLmF6djJzZEUoYSwgMSAtIHosIC12LCBzKTtcbiAgfVxuXG4gIC8vIERlbnNpdHkgb2YgRXJyb3IgUlRcbiAgc3RhdGljIHRhenYyZ0UodCwgYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIGlmICghdCkgcmV0dXJuIDA7XG5cbiAgICBjb25zdCB6UHJpbWUgPSBhICogejtcbiAgICBjb25zdCBiYXNlID0gKChNYXRoLlBJICogcyAqKiAyKSAvIGEgKiogMikgKiBNYXRoLmV4cCgoLXpQcmltZSAqIHYpIC8gcyAqKiAyKTtcblxuICAgIGxldCBrID0gMDtcbiAgICBsZXQgdGVybSA9IDA7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZG8ge1xuICAgICAgayArPSAxO1xuXG4gICAgICB0ZXJtID0ga1xuICAgICAgICAqIE1hdGguc2luKChNYXRoLlBJICogelByaW1lICogaykgLyBhKVxuICAgICAgICAqIE1hdGguZXhwKC0wLjUgKiAoKHYgKiogMiAvIHMgKiogMikgKyAoKE1hdGguUEkgKiogMiAqIGsgKiogMiAqIHMgKiogMikgLyBhICoqIDIpKSAqIHQpO1xuXG4gICAgICBzdW0gKz0gdGVybTtcbiAgICB9IHdoaWxlIChrIDwgMjAwKTsgLy8gPz8gSEFDS1xuXG4gICAgcmV0dXJuIGJhc2UgKiBzdW07XG4gIH1cblxuICAvLyBEZW5zaXR5IG9mIENvcnJlY3QgUlRcbiAgc3RhdGljIHRhenYyZ0ModCwgYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIHJldHVybiBERE1NYXRoLnRhenYyZ0UodCwgYSwgMSAtIHosIC12LCBzKTtcbiAgfVxuXG4gIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3Jhb3VsLnNvY3NjaS51dmEubmwvRVoyL0VaMl9uZXcuaHRtbFxuICAvLyBFWi1mdW5jdGlvbiBmb3Igc3RhcnRpbmcgdmFsdWVzXG4gIC8vIGlucHV0OiBvYmogLSBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gIC8vICAgIHBDIC0gUHJvcG9ydGlvbiBjb3JyZWN0XG4gIC8vICAgIHNkIC0gc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgUlQncyBpbiBtc1xuICAvLyAgICBtIC0gc2FtcGxlIG1lYW4gb2YgdGhlIFJUJ3MgaW4gbXNcbiAgLy8gICAgcyAtIGRpZmZ1c2lvbiBzdGFuZGFyZCBkZXZpYXRpb25cbiAgLy8gcmV0dXJuczogT2JqZWN0IHdpdGggcHJvcGVydGllcyB2LCBhLCBhbmQgdDAsIGNvbnRhaW5pbmcgRVotZXN0aW1hdGVzIG9mIHRoZXNlIHBhcmFtZXRlcnNcbiAgc3RhdGljIGRhdGEyZXooe1xuICAgIGFjY3VyYWN5OiBwQyxcbiAgICBzZFJUOiBzZCxcbiAgICBtZWFuUlQ6IG0sXG4gICAgcyxcbiAgfSkge1xuICAgIGZ1bmN0aW9uIHNpZ24ocikge1xuICAgICAgcmV0dXJuICgociA+IDApID8gMSA6ICgociA9PT0gMCkgPyAwIDogLTEpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2dpdChwKSB7XG4gICAgICByZXR1cm4gTWF0aC5sb2cocCAvICgxIC0gcCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHZydCA9IChzZCAvIDEwMDApICoqIDI7XG4gICAgY29uc3QgbXJ0ID0gbSAvIDEwMDA7XG5cbiAgICBjb25zdCBzMiA9IHMgKiogMjtcbiAgICBjb25zdCBsID0gbG9naXQocEMpO1xuICAgIGNvbnN0IHggPSAobCAqIChsICogcEMgKiogMiAtIGwgKiBwQyArIHBDIC0gMC41KSkgLyB2cnQ7XG4gICAgY29uc3QgdiA9IHNpZ24ocEMgLSAwLjUpICogcyAqIHggKiogKDEgLyA0KTtcbiAgICBjb25zdCBhID0gKHMyICogbG9naXQocEMpKSAvIHY7XG4gICAgY29uc3QgeSA9ICgtdiAqIGEpIC8gczI7XG4gICAgY29uc3QgbWR0ID0gKChhIC8gKDIgKiB2KSkgKiAoMSAtIE1hdGguZXhwKHkpKSkgLyAoMSArIE1hdGguZXhwKHkpKTtcbiAgICBjb25zdCB0MCA9IChtcnQgPyBtcnQgLSBtZHQgOiBudWxsKTsgLy8gY29tcHV0ZSBUZXIgb25seSBpZiBNUlQgd2FzIHByb3ZpZGVkXG5cbiAgICBjb25zdCB0MFByaW1lID0gdDAgKiAxMDAwO1xuICAgIHJldHVybiB7XG4gICAgICB2LFxuICAgICAgYSxcbiAgICAgIHQwOiB0MFByaW1lLFxuICAgICAgcyxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGRhdGEyZXoyKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZGF0YTJlejIgaXMgbm90IGltcGxlbWVudGVkIScpO1xuICB9XG59XG4iLCJcbi8vIEludGVybmFsIGRlcGVuZGVuY2llc1xuaW1wb3J0IERETU1hdGggZnJvbSAnLi9kZG0tbWF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IERETU1hdGg7XG4iLCIvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbXCJvZmZcIiwgXCJzZWxmXCJdICovXG5cbmltcG9ydCBERE1NYXRoIGZyb20gJ0BkZWNpZGFibGVzL2FjY3VtdWxhYmxlLW1hdGgnO1xuXG5zZWxmLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICBjb25zdCBwYXJhbXMgPSBERE1NYXRoLmRhdGEyZXooey4uLmV2ZW50LmRhdGEsIHM6IERETU1hdGguc30pO1xuXG4gIC8vICMjIyMjIEFyYml0cmFyeSBkZWZhdWx0IHZhbHVlcyEhIVxuICBjb25zdCBhID0gIWlzTmFOKHBhcmFtcy5hKSA/IHBhcmFtcy5hIDogMS41O1xuICBjb25zdCB6ID0gIWlzTmFOKHBhcmFtcy56KSA/IHBhcmFtcy56IDogMC41O1xuICBjb25zdCB2ID0gIWlzTmFOKHBhcmFtcy52KSA/IHBhcmFtcy52IDogMC4xO1xuICBjb25zdCB0MCA9ICFpc05hTihwYXJhbXMudDApID8gcGFyYW1zLnQwIDogMTAwO1xuICBjb25zdCBzID0gIWlzTmFOKHBhcmFtcy5zKSA/IHBhcmFtcy5zIDogRERNTWF0aC5zO1xuXG4gIGNvbnN0IHByZWRpY3RlZCA9IHtcbiAgICBhY2N1cmFjeTogRERNTWF0aC5henYycEMoYSwgeiwgdiksXG4gICAgY29ycmVjdE1lYW5SVDogRERNTWF0aC5henZ0MDJtQyhhLCB6LCB2LCB0MCksXG4gICAgZXJyb3JNZWFuUlQ6IERETU1hdGguYXp2dDAybUUoYSwgeiwgdiwgdDApLFxuICAgIG1lYW5SVDogRERNTWF0aC5henZ0MDJtKGEsIHosIHYsIHQwKSxcbiAgICBjb3JyZWN0U0RSVDogRERNTWF0aC5henYyc2RDKGEsIHosIHYpLFxuICAgIGVycm9yU0RSVDogRERNTWF0aC5henYyc2RFKGEsIHosIHYpLFxuICAgIHNkUlQ6IERETU1hdGguYXp2MnNkKGEsIHosIHYpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIHBhcmFtczoge1xuICAgICAgYSwgeiwgdiwgdDAsIHMsXG4gICAgfSxcbiAgICBwcmVkaWN0ZWQsXG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6WyJERE1NYXRoIiwicyIsInRyaWFsczJzdGF0cyIsInRyaWFscyIsInN0YXRzIiwic3VtcyIsInJlZHVjZSIsImFjY3VtdWxhdG9yIiwidHJpYWwiLCJvdXRjb21lIiwiY29ycmVjdENvdW50IiwiY29ycmVjdFJUU3VtIiwicnQiLCJlcnJvckNvdW50IiwiZXJyb3JSVFN1bSIsIm5yQ291bnQiLCJhY2N1cmFjeSIsImNvcnJlY3RNZWFuUlQiLCJlcnJvck1lYW5SVCIsIm1lYW5SVCIsInN1bXMyIiwic3MiLCJjb3JyZWN0U1MiLCJlcnJvclNTIiwiY29ycmVjdFNEUlQiLCJNYXRoIiwic3FydCIsIk5hTiIsImVycm9yU0RSVCIsInNkUlQiLCJhenYycEUiLCJhIiwieiIsInYiLCJ6UHJpbWUiLCJBIiwiZXhwIiwiWiIsImF6djJwQyIsImF6dnQwMm0iLCJ0MCIsIm1lYW4iLCJhenYyc2QiLCJ2YXJpYW5jZSIsImF6dnQwMm1FIiwicGhpIiwieCIsInkiLCJhenYyc2RFIiwiYXp2dDAybUMiLCJhenYyc2RDIiwidGF6djJnRSIsInQiLCJiYXNlIiwiUEkiLCJrIiwidGVybSIsInN1bSIsInNpbiIsInRhenYyZ0MiLCJkYXRhMmV6IiwicEMiLCJzZCIsIm0iLCJzaWduIiwiciIsImxvZ2l0IiwicCIsImxvZyIsInZydCIsIm1ydCIsInMyIiwibCIsIm1kdCIsInQwUHJpbWUiLCJkYXRhMmV6MiIsIkVycm9yIiwic2VsZiIsIm9ubWVzc2FnZSIsImV2ZW50IiwicGFyYW1zIiwiZGF0YSIsImlzTmFOIiwicHJlZGljdGVkIiwicG9zdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7OztFQUNBO0VBQ0E7QUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0VBQ0E7QUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtBQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDZSxNQUFNQSxPQUFPLENBQUM7SUFDM0IsT0FBT0MsQ0FBQyxHQUFHLENBQUMsQ0FBQTs7RUFFWjtJQUNBLE9BQU9DLFlBQVlBLENBQUNDLE1BQU0sRUFBRTtNQUMxQixNQUFNQyxLQUFLLEdBQUcsRUFBRSxDQUFBOztFQUVoQjtNQUNBLE1BQU1DLElBQUksR0FBR0YsTUFBTSxDQUFDRyxNQUFNLENBQ3hCLENBQUNDLFdBQVcsRUFBRUMsS0FBSyxLQUFLO1FBQ3RCLFFBQVFBLEtBQUssQ0FBQ0MsT0FBTztFQUNuQixRQUFBLEtBQUssU0FBUztZQUNaRixXQUFXLENBQUNHLFlBQVksSUFBSSxDQUFDLENBQUE7RUFDN0JILFVBQUFBLFdBQVcsQ0FB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');
7329
+ var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoKICAgIERETU1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIQoKICAgIE1vZGVsIHBhcmFtZXRlcnM6CiAgICAgIGEgPSBib3VuZGFyeSBzZXBhcmF0aW9uIFswLCBJbmZpbml0eSkKICAgICAgeiA9IHN0YXJ0aW5nIHBvaW50IGFzIGEgcHJvcG9ydGlvbiBvZiBhICgwLCAxKQogICAgICB2ID0gZHJpZnQgcmF0ZSAocGVyIHNlY29uZCkgKC1JbmZpbml0eSwgSW5maW5pdHkpCiAgICAgIHQwID0gbm9uLWRlY2lzaW9uIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgKDAsIEluZmluaXR5KQogICAgICBzID0gd2l0aGluLXRyaWFsIHZhcmlhYmlsaXR5IGluIGRyaWZ0IHJhdGUgKHNeMiA9IGluZmluaXRlc2ltYWwgdmFyaWFuY2UpIFswLCBJbmZpbml0eSkKCiAgICAgIHpQcmltZSA9IHN0YXJ0aW5nIHBvaW50IG9uIGEgMC10by1hIHNjYWxlICh0eXBpY2FsbHkgdXNlZCBpbiBwdWJsaXNoZWQgZXF1YXRpb25zKSBbMCwgSW5maW5pdHkpCgogICAgQmVoYXZpb3JhbCB2YXJpYWJsZXM6CiAgICAgIHBFID0gcHJvcG9ydGlvbiBvZiBlcnJvciB0cmlhbHMKICAgICAgcEMgPSBwcm9wb3J0aW9uIG9mIGNvcnJlY3QgdHJpYWxzCiAgICAgIG0gPSBtZWFuIG9mIG92ZXJhbGwgUlRzIChpbiBtaWxsaXNlY29uZHMpCiAgICAgIG1FID0gbWVhbiBvZiBlcnJvciBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgbUMgPSBtZWFuIGNvcnJlY3QgUlRzIChpbiBtaWxsaXNlY29uZHMpCiAgICAgIHNkID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIG92ZXJhbGwgUlRzIChpbiBtaWxsaXNlY29uZHMpCiAgICAgIHNkRSA9IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlcnJvciBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgc2RDID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGNvcnJlY3QgUlRzIChpbiBtaWxsaXNlY29uZHMpCgogICAgRXF1YXRpb25zOgogICAgICBQcm9iYWJpbGl0eSBvZiBjb3JyZWN0IGFuZCBlcnJvciByZXNwb25zZXMgKEFsZXhhbmRyb3dpY3osIDIwMjApCiAgICAgIE1lYW4gb2Ygb3ZlcmFsbCwgZXJyb3IsIGFuZCBjb3JyZWN0IFJUcyAoR3Jhc21hbiBldCBhbC4sIDIwMDkpCiAgICAgIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBvdmVyYWxsLCBlcnJvciwgYW5kIGNvcnJlY3QgUlRzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgICAgRGVuc2l0eSBvZiBlcnJvciBhbmQgY29ycmVjdCBSVCBkaXN0cmlidXRpb25zIChBbGV4YW5kcm93aWN6LCAyMDIwKQogICAgICBFWi1kaWZmdXNpb24gbW9kZWwgKFdhZ2VubWFrZXJzIGV0IGFsLiwgMjAwNykKICAqLwogIGNsYXNzIERETU1hdGggewogICAgc3RhdGljIHMgPSB7CiAgICAgIERFRkFVTFQ6IDEKICAgIH07CiAgICBzdGF0aWMgYSA9IHsKICAgICAgREVGQVVMVDogMS4yLAogICAgICBNSU46IDAuMDEsCiAgICAgIE1BWDogMi4wLAogICAgICBTVEVQOiAwLjAxLAogICAgICBKVU1QOiAwLjEKICAgIH07CiAgICBzdGF0aWMgeiA9IHsKICAgICAgREVGQVVMVDogMC41NSwKICAgICAgTUlOOiAwLjAxLAogICAgICBNQVg6IDAuOTksCiAgICAgIFNURVA6IDAuMDEsCiAgICAgIEpVTVA6IDAuMQogICAgfTsKICAgIHN0YXRpYyB2ID0gewogICAgICBERUZBVUxUOiAxLjUsCiAgICAgIE1JTjogMC4wMSwKICAgICAgTUFYOiA1LjAsCiAgICAgIFNURVA6IDAuMDEsCiAgICAgIEpVTVA6IDAuMQogICAgfTsKICAgIHN0YXRpYyB0MCA9IHsKICAgICAgREVGQVVMVDogMTUwLAogICAgICBNSU46IDAsCiAgICAgIE1BWDogNTAwLAogICAgICBTVEVQOiAxLAogICAgICBKVU1QOiAxMAogICAgfTsKCiAgICAvLyBDYWxjdWxhdGUgYSBidW5jaCBvZiBzdGF0aXN0aWNzIGZvciBhbiBhcnJheSBvZiB0cmlhbHMKICAgIHN0YXRpYyB0cmlhbHMyc3RhdHModHJpYWxzKSB7CiAgICAgIGNvbnN0IHN0YXRzID0ge307CgogICAgICAvLyBGaXJzdC1vcmRlciBzdW1zCiAgICAgIGNvbnN0IHN1bXMgPSB0cmlhbHMucmVkdWNlKChhY2N1bXVsYXRvciwgdHJpYWwpID0+IHsKICAgICAgICBzd2l0Y2ggKHRyaWFsLm91dGNvbWUpIHsKICAgICAgICAgIGNhc2UgJ2NvcnJlY3QnOgogICAgICAgICAgICBhY2N1bXVsYXRvci5jb3JyZWN0Q291bnQgKz0gMTsKICAgICAgICAgICAgYWNjdW11bGF0b3IuY29ycmVjdFJUU3VtICs9IHRyaWFsLnJ0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgICAgICAgYWNjdW11bGF0b3IuZXJyb3JDb3VudCArPSAxOwogICAgICAgICAgICBhY2N1bXVsYXRvci5lcnJvclJUU3VtICs9IHRyaWFsLnJ0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ25yJzoKICAgICAgICAgICAgYWNjdW11bGF0b3IubnJDb3VudCArPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIC8vIE5vLW9wCiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgfSwgewogICAgICAgIGNvcnJlY3RDb3VudDogMCwKICAgICAgICBlcnJvckNvdW50OiAwLAogICAgICAgIG5yQ291bnQ6IDAsCiAgICAgICAgY29ycmVjdFJUU3VtOiAwLAogICAgICAgIGVycm9yUlRTdW06IDAKICAgICAgfSk7CgogICAgICAvLyBGaXJzdC1vcmRlciBzdGF0cwogICAgICBzdGF0cy5jb3JyZWN0Q291bnQgPSBzdW1zLmNvcnJlY3RDb3VudDsKICAgICAgc3RhdHMuZXJyb3JDb3VudCA9IHN1bXMuZXJyb3JDb3VudDsKICAgICAgc3RhdHMubnJDb3VudCA9IHN1bXMubnJDb3VudDsKICAgICAgc3RhdHMuYWNjdXJhY3kgPSBzdW1zLmNvcnJlY3RDb3VudCAvIChzdW1zLmNvcnJlY3RDb3VudCArIHN1bXMuZXJyb3JDb3VudCArIHN1bXMubnJDb3VudCk7CiAgICAgIHN0YXRzLmNvcnJlY3RNZWFuUlQgPSBzdW1zLmNvcnJlY3RSVFN1bSAvIHN1bXMuY29ycmVjdENvdW50OwogICAgICBzdGF0cy5lcnJvck1lYW5SVCA9IHN1bXMuZXJyb3JSVFN1bSAvIHN1bXMuZXJyb3JDb3VudDsKICAgICAgc3RhdHMubWVhblJUID0gKHN1bXMuY29ycmVjdFJUU3VtICsgc3Vtcy5lcnJvclJUU3VtKSAvIChzdW1zLmNvcnJlY3RDb3VudCArIHN1bXMuZXJyb3JDb3VudCk7CgogICAgICAvLyBTZWNvbmQtb3JkZXIgc3VtcwogICAgICBjb25zdCBzdW1zMiA9IHRyaWFscy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCB0cmlhbCkgPT4gewogICAgICAgIHN3aXRjaCAodHJpYWwub3V0Y29tZSkgewogICAgICAgICAgY2FzZSAnY29ycmVjdCc6CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnNzICs9ICh0cmlhbC5ydCAtIHN0YXRzLm1lYW5SVCkgKiogMjsKICAgICAgICAgICAgYWNjdW11bGF0b3IuY29ycmVjdFNTICs9ICh0cmlhbC5ydCAtIHN0YXRzLmNvcnJlY3RNZWFuUlQpICoqIDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnZXJyb3InOgogICAgICAgICAgICBhY2N1bXVsYXRvci5zcyArPSAodHJpYWwucnQgLSBzdGF0cy5tZWFuUlQpICoqIDI7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yU1MgKz0gKHRyaWFsLnJ0IC0gc3RhdHMuZXJyb3JNZWFuUlQpICoqIDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgLy8gTm8tb3AKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICB9LCB7CiAgICAgICAgc3M6IDAsCiAgICAgICAgY29ycmVjdFNTOiAwLAogICAgICAgIGVycm9yU1M6IDAKICAgICAgfSk7CgogICAgICAvLyBTZWNvbmQtb3JkZXIgc3RhdHMKICAgICAgc3RhdHMuY29ycmVjdFNEUlQgPSBzdGF0cy5jb3JyZWN0Q291bnQgPiAxID8gTWF0aC5zcXJ0KHN1bXMyLmNvcnJlY3RTUyAvIChzdGF0cy5jb3JyZWN0Q291bnQgLSAxKSkgOiBOYU47CiAgICAgIHN0YXRzLmVycm9yU0RSVCA9IHN0YXRzLmVycm9yQ291bnQgPiAxID8gTWF0aC5zcXJ0KHN1bXMyLmVycm9yU1MgLyAoc3RhdHMuZXJyb3JDb3VudCAtIDEpKSA6IE5hTjsKICAgICAgc3RhdHMuc2RSVCA9IHN0YXRzLmNvcnJlY3RDb3VudCArIHN0YXRzLmVycm9yQ291bnQgPiAxID8gTWF0aC5zcXJ0KHN1bXMyLnNzIC8gKHN0YXRzLmNvcnJlY3RDb3VudCArIHN0YXRzLmVycm9yQ291bnQgLSAxKSkgOiBOYU47CiAgICAgIHJldHVybiBzdGF0czsKICAgIH0KCiAgICAvLyBQcm9iYWJpbGl0eSBvZiBhbiBFcnJvciBSZXNwb25zZQogICAgc3RhdGljIGF6djJwRShhLCB6LCB2LCBzID0gRERNTWF0aC5zLkRFRkFVTFQpIHsKICAgICAgY29uc3QgelByaW1lID0gYSAqIHo7CiAgICAgIGNvbnN0IEEgPSBNYXRoLmV4cCgtMiAqIHYgKiBhIC8gcyAqKiAyKTsKICAgICAgY29uc3QgWiA9IE1hdGguZXhwKC0yICogdiAqIHpQcmltZSAvIHMgKiogMik7CiAgICAgIHJldHVybiAoQSAtIFopIC8gKEEgLSAxKTsKICAgIH0KCiAgICAvLyBQcm9iYWJpbGl0eSBvZiBhIENvcnJlY3QgUmVzcG9uc2UKICAgIHN0YXRpYyBhenYycEMoYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIHJldHVybiBERE1NYXRoLmF6djJwRShhLCAxIC0geiwgLXYsIHMpOwogICAgfQoKICAgIC8vIE1lYW4gT3ZlcmFsbCBSVAogICAgLy8gRXF1YXRpb24gNSAoR3Jhc21hbiBldCBhbC4sIDIwMDkpCiAgICBzdGF0aWMgYXp2dDAybShhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBBID0gTWF0aC5leHAoLTIgKiB2ICogYSAvIHMgKiogMikgLSAxOwogICAgICBjb25zdCBaID0gTWF0aC5leHAoLTIgKiB2ICogelByaW1lIC8gcyAqKiAyKSAtIDE7CiAgICAgIGNvbnN0IG1lYW4gPSAtKHpQcmltZSAvIHYpICsgYSAvIHYgKiAoWiAvIEEpOwogICAgICByZXR1cm4gdDAgKyBtZWFuICogMTAwMDsKICAgIH0KCiAgICAvLyBTRCBPdmVyYWxsIFJUCiAgICAvLyBFcXVhdGlvbiA2IChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgIHN0YXRpYyBhenYyc2QoYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBBID0gTWF0aC5leHAoLTIgKiB2ICogYSAvIHMgKiogMikgLSAxOwogICAgICBjb25zdCBaID0gTWF0aC5leHAoLTIgKiB2ICogelByaW1lIC8gcyAqKiAyKSAtIDE7CiAgICAgIGNvbnN0IHZhcmlhbmNlID0gKC12ICogYSAqKiAyICogKFogKyA0KSAqIFogLyBBICoqIDIgKyAoKC0zICogdiAqIGEgKiogMiArIDQgKiB2ICogelByaW1lICogYSArIHMgKiogMiAqIGEpICogWiArIDQgKiB2ICogelByaW1lICogYSkgLyBBIC0gcyAqKiAyICogelByaW1lKSAvIHYgKiogMzsKICAgICAgcmV0dXJuIE1hdGguc3FydCh2YXJpYW5jZSkgKiAxMDAwOwogICAgfQoKICAgIC8vIE1lYW4gRXJyb3IgUlQKICAgIC8vIEVxdWF0aW9uIDEzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgIHN0YXRpYyBhenZ0MDJtRShhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7CiAgICAgICAgcmV0dXJuIE1hdGguZXhwKDIgKiB2ICogeSAvIHMgKiogMikgLSBNYXRoLmV4cCgyICogdiAqIHggLyBzICoqIDIpOwogICAgICB9CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBtZWFuID0gKHpQcmltZSAqIChwaGkoelByaW1lIC0gYSwgYSkgKyBwaGkoMCwgelByaW1lKSkgKyAyICogYSAqIHBoaSh6UHJpbWUsIDApKSAvICh2ICogcGhpKHpQcmltZSwgYSkgKiBwaGkoLWEsIDApKTsKICAgICAgcmV0dXJuIHQwICsgbWVhbiAqIDEwMDA7CiAgICB9CgogICAgLy8gU0QgRXJyb3IgUlQKICAgIC8vIEVxdWF0aW9uIDE0IChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgIHN0YXRpYyBhenYyc2RFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkgewogICAgICBmdW5jdGlvbiBwaGkoeCwgeSkgewogICAgICAgIHJldHVybiBNYXRoLmV4cCgyICogdiAqIHkgLyBzICoqIDIpIC0gTWF0aC5leHAoMiAqIHYgKiB4IC8gcyAqKiAyKTsKICAgICAgfQogICAgICBjb25zdCB6UHJpbWUgPSBhICogejsKICAgICAgY29uc3QgdmFyaWFuY2UgPSAtMiAqIGEgKiBwaGkoMCwgelByaW1lKSAqICgyICogdiAqIGEgKiBwaGkoelByaW1lLCAyICogYSkgKyBzICoqIDIgKiBwaGkoMCwgYSkgKiBwaGkoelByaW1lLCBhKSkgKiBNYXRoLmV4cCgyICogdiAqIGEgLyBzICoqIDIpIC8gKHYgKiogMyAqIHBoaSgwLCBhKSAqKiAyICogcGhpKHpQcmltZSwgYSkgKiogMikgKyAoNCAqIHYgKiB6UHJpbWUgKiAoMiAqIGEgLSB6UHJpbWUpICogTWF0aC5leHAoMiAqIHYgKiAoelByaW1lICsgYSkgLyBzICoqIDIpICsgelByaW1lICogcyAqKiAyICogcGhpKDIgKiB6UHJpbWUsIDIgKiBhKSkgLyAodiAqKiAzICogcGhpKHpQcmltZSwgYSkgKiogMik7CiAgICAgIHJldHVybiBNYXRoLnNxcnQodmFyaWFuY2UpICogMTAwMDsKICAgIH0KCiAgICAvLyBNZWFuIENvcnJlY3QgUlQKICAgIHN0YXRpYyBhenZ0MDJtQyhhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIHJldHVybiBERE1NYXRoLmF6dnQwMm1FKGEsIDEgLSB6LCAtdiwgdDAsIHMpOwogICAgfQoKICAgIC8vIFNEIENvcnJlY3QgUlQKICAgIHN0YXRpYyBhenYyc2RDKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkgewogICAgICByZXR1cm4gRERNTWF0aC5henYyc2RFKGEsIDEgLSB6LCAtdiwgcyk7CiAgICB9CgogICAgLy8gRGVuc2l0eSBvZiBFcnJvciBSVAogICAgc3RhdGljIHRhenYyZ0UodCwgYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIGlmICghdCkgcmV0dXJuIDA7CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBiYXNlID0gTWF0aC5QSSAqIHMgKiogMiAvIGEgKiogMiAqIE1hdGguZXhwKC16UHJpbWUgKiB2IC8gcyAqKiAyKTsKICAgICAgbGV0IGsgPSAwOwogICAgICBsZXQgdGVybSA9IDA7CiAgICAgIGxldCBzdW0gPSAwOwogICAgICBkbyB7CiAgICAgICAgayArPSAxOwogICAgICAgIHRlcm0gPSBrICogTWF0aC5zaW4oTWF0aC5QSSAqIHpQcmltZSAqIGsgLyBhKSAqIE1hdGguZXhwKC0wLjUgKiAodiAqKiAyIC8gcyAqKiAyICsgTWF0aC5QSSAqKiAyICogayAqKiAyICogcyAqKiAyIC8gYSAqKiAyKSAqIHQpOwogICAgICAgIHN1bSArPSB0ZXJtOwogICAgICB9IHdoaWxlIChrIDwgMjAwKTsgLy8gPz8gSEFDSwoKICAgICAgcmV0dXJuIGJhc2UgKiBzdW07CiAgICB9CgogICAgLy8gRGVuc2l0eSBvZiBDb3JyZWN0IFJUCiAgICBzdGF0aWMgdGF6djJnQyh0LCBhLCB6LCB2LCBzID0gRERNTWF0aC5zLkRFRkFVTFQpIHsKICAgICAgcmV0dXJuIERETU1hdGgudGF6djJnRSh0LCBhLCAxIC0geiwgLXYsIHMpOwogICAgfQoKICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3Jhb3VsLnNvY3NjaS51dmEubmwvRVoyL0VaMl9uZXcuaHRtbAogICAgLy8gRVotZnVuY3Rpb24gZm9yIHN0YXJ0aW5nIHZhbHVlcwogICAgLy8gaW5wdXQ6IG9iaiAtIE9iamVjdCB3aXRoIHByb3BlcnRpZXMKICAgIC8vICAgIHBDIC0gUHJvcG9ydGlvbiBjb3JyZWN0CiAgICAvLyAgICBzZCAtIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIFJUJ3MgaW4gbXMKICAgIC8vICAgIG0gLSBzYW1wbGUgbWVhbiBvZiB0aGUgUlQncyBpbiBtcwogICAgLy8gICAgcyAtIGRpZmZ1c2lvbiBzdGFuZGFyZCBkZXZpYXRpb24KICAgIC8vIHJldHVybnM6IE9iamVjdCB3aXRoIHByb3BlcnRpZXMgdiwgYSwgYW5kIHQwLCBjb250YWluaW5nIEVaLWVzdGltYXRlcyBvZiB0aGVzZSBwYXJhbWV0ZXJzCiAgICBzdGF0aWMgZGF0YTJleih7CiAgICAgIGFjY3VyYWN5OiBwQywKICAgICAgc2RSVDogc2QsCiAgICAgIG1lYW5SVDogbSwKICAgICAgcwogICAgfSkgewogICAgICBmdW5jdGlvbiBzaWduKHIpIHsKICAgICAgICByZXR1cm4gciA+IDAgPyAxIDogciA9PT0gMCA/IDAgOiAtMTsKICAgICAgfQogICAgICBmdW5jdGlvbiBsb2dpdChwKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubG9nKHAgLyAoMSAtIHApKTsKICAgICAgfQogICAgICBjb25zdCB2cnQgPSAoc2QgLyAxMDAwKSAqKiAyOwogICAgICBjb25zdCBtcnQgPSBtIC8gMTAwMDsKICAgICAgY29uc3QgczIgPSBzICoqIDI7CiAgICAgIGNvbnN0IGwgPSBsb2dpdChwQyk7CiAgICAgIGNvbnN0IHggPSBsICogKGwgKiBwQyAqKiAyIC0gbCAqIHBDICsgcEMgLSAwLjUpIC8gdnJ0OwogICAgICBjb25zdCB2ID0gc2lnbihwQyAtIDAuNSkgKiBzICogeCAqKiAoMSAvIDQpOwogICAgICBjb25zdCBhID0gczIgKiBsb2dpdChwQykgLyB2OwogICAgICBjb25zdCB5ID0gLXYgKiBhIC8gczI7CiAgICAgIGNvbnN0IG1kdCA9IGEgLyAoMiAqIHYpICogKDEgLSBNYXRoLmV4cCh5KSkgLyAoMSArIE1hdGguZXhwKHkpKTsKICAgICAgY29uc3QgdDAgPSBtcnQgPyBtcnQgLSBtZHQgOiBudWxsOyAvLyBjb21wdXRlIFRlciBvbmx5IGlmIE1SVCB3YXMgcHJvdmlkZWQKCiAgICAgIGNvbnN0IHQwUHJpbWUgPSB0MCAqIDEwMDA7CiAgICAgIHJldHVybiB7CiAgICAgICAgdiwKICAgICAgICBhLAogICAgICAgIHQwOiB0MFByaW1lLAogICAgICAgIHMKICAgICAgfTsKICAgIH0KICAgIHN0YXRpYyBkYXRhMmV6MigpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhMmV6MiBpcyBub3QgaW1wbGVtZW50ZWQhJyk7CiAgICB9CiAgfQoKICAvLyBJbnRlcm5hbCBkZXBlbmRlbmNpZXMKCiAgLyogZXNsaW50IG5vLXJlc3RyaWN0ZWQtZ2xvYmFsczogWyJvZmYiLCAic2VsZiJdICovCgogIHNlbGYub25tZXNzYWdlID0gZXZlbnQgPT4gewogICAgY29uc3QgcGFyYW1zID0gRERNTWF0aC5kYXRhMmV6KHsKICAgICAgLi4uZXZlbnQuZGF0YSwKICAgICAgczogRERNTWF0aC5zLkRFRkFVTFQKICAgIH0pOwoKICAgIC8vICMjIyMjIEFyYml0cmFyeSBkZWZhdWx0IHZhbHVlcyEhIQogICAgY29uc3QgYSA9ICFpc05hTihwYXJhbXMuYSkgPyBwYXJhbXMuYSA6IDEuNTsKICAgIGNvbnN0IHogPSAhaXNOYU4ocGFyYW1zLnopID8gcGFyYW1zLnogOiAwLjU7CiAgICBjb25zdCB2ID0gIWlzTmFOKHBhcmFtcy52KSA/IHBhcmFtcy52IDogMC4xOwogICAgY29uc3QgdDAgPSAhaXNOYU4ocGFyYW1zLnQwKSA/IHBhcmFtcy50MCA6IDEwMDsKICAgIGNvbnN0IHMgPSAhaXNOYU4ocGFyYW1zLnMpID8gcGFyYW1zLnMgOiBERE1NYXRoLnMuREVGQVVMVDsKICAgIGNvbnN0IHByZWRpY3RlZCA9IHsKICAgICAgYWNjdXJhY3k6IERETU1hdGguYXp2MnBDKGEsIHosIHYpLAogICAgICBjb3JyZWN0TWVhblJUOiBERE1NYXRoLmF6dnQwMm1DKGEsIHosIHYsIHQwKSwKICAgICAgZXJyb3JNZWFuUlQ6IERETU1hdGguYXp2dDAybUUoYSwgeiwgdiwgdDApLAogICAgICBtZWFuUlQ6IERETU1hdGguYXp2dDAybShhLCB6LCB2LCB0MCksCiAgICAgIGNvcnJlY3RTRFJUOiBERE1NYXRoLmF6djJzZEMoYSwgeiwgdiksCiAgICAgIGVycm9yU0RSVDogRERNTWF0aC5henYyc2RFKGEsIHosIHYpLAogICAgICBzZFJUOiBERE1NYXRoLmF6djJzZChhLCB6LCB2KQogICAgfTsKICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICBwYXJhbXM6IHsKICAgICAgICBhLAogICAgICAgIHosCiAgICAgICAgdiwKICAgICAgICB0MCwKICAgICAgICBzCiAgICAgIH0sCiAgICAgIHByZWRpY3RlZAogICAgfSk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWRkbS1maXQtd29ya2VyLmpzLm1hcAoK', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGRtLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uL2FjY3VtdWxhYmxlLW1hdGgvc3JjL2RkbS1tYXRoLmpzIiwiLi4vYWNjdW11bGFibGUtbWF0aC9zcmMvaW5kZXguanMiLCJzcmMvY29tcG9uZW50cy9kZG0tZml0LXdvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qXG4gIERETU1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIVxuXG4gIE1vZGVsIHBhcmFtZXRlcnM6XG4gICAgYSA9IGJvdW5kYXJ5IHNlcGFyYXRpb24gWzAsIEluZmluaXR5KVxuICAgIHogPSBzdGFydGluZyBwb2ludCBhcyBhIHByb3BvcnRpb24gb2YgYSAoMCwgMSlcbiAgICB2ID0gZHJpZnQgcmF0ZSAocGVyIHNlY29uZCkgKC1JbmZpbml0eSwgSW5maW5pdHkpXG4gICAgdDAgPSBub24tZGVjaXNpb24gdGltZSAoaW4gbWlsbGlzZWNvbmRzKSAoMCwgSW5maW5pdHkpXG4gICAgcyA9IHdpdGhpbi10cmlhbCB2YXJpYWJpbGl0eSBpbiBkcmlmdCByYXRlIChzXjIgPSBpbmZpbml0ZXNpbWFsIHZhcmlhbmNlKSBbMCwgSW5maW5pdHkpXG5cbiAgICB6UHJpbWUgPSBzdGFydGluZyBwb2ludCBvbiBhIDAtdG8tYSBzY2FsZSAodHlwaWNhbGx5IHVzZWQgaW4gcHVibGlzaGVkIGVxdWF0aW9ucykgWzAsIEluZmluaXR5KVxuXG4gIEJlaGF2aW9yYWwgdmFyaWFibGVzOlxuICAgIHBFID0gcHJvcG9ydGlvbiBvZiBlcnJvciB0cmlhbHNcbiAgICBwQyA9IHByb3BvcnRpb24gb2YgY29ycmVjdCB0cmlhbHNcbiAgICBtID0gbWVhbiBvZiBvdmVyYWxsIFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIG1FID0gbWVhbiBvZiBlcnJvciBSVHMgKGluIG1pbGxpc2Vjb25kcylcbiAgICBtQyA9IG1lYW4gY29ycmVjdCBSVHMgKGluIG1pbGxpc2Vjb25kcylcbiAgICBzZCA9IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBvdmVyYWxsIFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIHNkRSA9IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlcnJvciBSVHMgKGluIG1pbGxpc2Vjb25kcylcbiAgICBzZEMgPSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgY29ycmVjdCBSVHMgKGluIG1pbGxpc2Vjb25kcylcblxuICBFcXVhdGlvbnM6XG4gICAgUHJvYmFiaWxpdHkgb2YgY29ycmVjdCBhbmQgZXJyb3IgcmVzcG9uc2VzIChBbGV4YW5kcm93aWN6LCAyMDIwKVxuICAgIE1lYW4gb2Ygb3ZlcmFsbCwgZXJyb3IsIGFuZCBjb3JyZWN0IFJUcyAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gICAgU3RhbmRhcmQgZGV2aWF0aW9uIG9mIG92ZXJhbGwsIGVycm9yLCBhbmQgY29ycmVjdCBSVHMgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KVxuICAgIERlbnNpdHkgb2YgZXJyb3IgYW5kIGNvcnJlY3QgUlQgZGlzdHJpYnV0aW9ucyAoQWxleGFuZHJvd2ljeiwgMjAyMClcbiAgICBFWi1kaWZmdXNpb24gbW9kZWwgKFdhZ2VubWFrZXJzIGV0IGFsLiwgMjAwNylcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBERE1NYXRoIHtcbiAgc3RhdGljIHMgPSB7XG4gICAgREVGQVVMVDogMSxcbiAgfTtcblxuICBzdGF0aWMgYSA9IHtcbiAgICBERUZBVUxUOiAxLjIsXG4gICAgTUlOOiAwLjAxLFxuICAgIE1BWDogMi4wLFxuICAgIFNURVA6IDAuMDEsXG4gICAgSlVNUDogMC4xLFxuICB9O1xuXG4gIHN0YXRpYyB6ID0ge1xuICAgIERFRkFVTFQ6IDAuNTUsXG4gICAgTUlOOiAwLjAxLFxuICAgIE1BWDogMC45OSxcbiAgICBTVEVQOiAwLjAxLFxuICAgIEpVTVA6IDAuMSxcbiAgfTtcblxuICBzdGF0aWMgdiA9IHtcbiAgICBERUZBVUxUOiAxLjUsXG4gICAgTUlOOiAwLjAxLFxuICAgIE1BWDogNS4wLFxuICAgIFNURVA6IDAuMDEsXG4gICAgSlVNUDogMC4xLFxuICB9O1xuXG4gIHN0YXRpYyB0MCA9IHtcbiAgICBERUZBVUxUOiAxNTAsXG4gICAgTUlOOiAwLFxuICAgIE1BWDogNTAwLFxuICAgIFNURVA6IDEsXG4gICAgSlVNUDogMTAsXG4gIH07XG5cbiAgLy8gQ2FsY3VsYXRlIGEgYnVuY2ggb2Ygc3RhdGlzdGljcyBmb3IgYW4gYXJyYXkgb2YgdHJpYWxzXG4gIHN0YXRpYyB0cmlhbHMyc3RhdHModHJpYWxzKSB7XG4gICAgY29uc3Qgc3RhdHMgPSB7fTtcblxuICAgIC8vIEZpcnN0LW9yZGVyIHN1bXNcbiAgICBjb25zdCBzdW1zID0gdHJpYWxzLnJlZHVjZShcbiAgICAgIChhY2N1bXVsYXRvciwgdHJpYWwpID0+IHtcbiAgICAgICAgc3dpdGNoICh0cmlhbC5vdXRjb21lKSB7XG4gICAgICAgICAgY2FzZSAnY29ycmVjdCc6XG4gICAgICAgICAgICBhY2N1bXVsYXRvci5jb3JyZWN0Q291bnQgKz0gMTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RSVFN1bSArPSB0cmlhbC5ydDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yQ291bnQgKz0gMTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yUlRTdW0gKz0gdHJpYWwucnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICducic6XG4gICAgICAgICAgICBhY2N1bXVsYXRvci5uckNvdW50ICs9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gTm8tb3BcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb3JyZWN0Q291bnQ6IDAsXG4gICAgICAgIGVycm9yQ291bnQ6IDAsXG4gICAgICAgIG5yQ291bnQ6IDAsXG5cbiAgICAgICAgY29ycmVjdFJUU3VtOiAwLFxuICAgICAgICBlcnJvclJUU3VtOiAwLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRmlyc3Qtb3JkZXIgc3RhdHNcbiAgICBzdGF0cy5jb3JyZWN0Q291bnQgPSBzdW1zLmNvcnJlY3RDb3VudDtcbiAgICBzdGF0cy5lcnJvckNvdW50ID0gc3Vtcy5lcnJvckNvdW50O1xuICAgIHN0YXRzLm5yQ291bnQgPSBzdW1zLm5yQ291bnQ7XG4gICAgc3RhdHMuYWNjdXJhY3kgPSBzdW1zLmNvcnJlY3RDb3VudCAvIChzdW1zLmNvcnJlY3RDb3VudCArIHN1bXMuZXJyb3JDb3VudCArIHN1bXMubnJDb3VudCk7XG5cbiAgICBzdGF0cy5jb3JyZWN0TWVhblJUID0gc3Vtcy5jb3JyZWN0UlRTdW0gLyBzdW1zLmNvcnJlY3RDb3VudDtcbiAgICBzdGF0cy5lcnJvck1lYW5SVCA9IHN1bXMuZXJyb3JSVFN1bSAvIHN1bXMuZXJyb3JDb3VudDtcbiAgICBzdGF0cy5tZWFuUlQgPSAoc3Vtcy5jb3JyZWN0UlRTdW0gKyBzdW1zLmVycm9yUlRTdW0pIC8gKHN1bXMuY29ycmVjdENvdW50ICsgc3Vtcy5lcnJvckNvdW50KTtcblxuICAgIC8vIFNlY29uZC1vcmRlciBzdW1zXG4gICAgY29uc3Qgc3VtczIgPSB0cmlhbHMucmVkdWNlKFxuICAgICAgKGFjY3VtdWxhdG9yLCB0cmlhbCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRyaWFsLm91dGNvbWUpIHtcbiAgICAgICAgICBjYXNlICdjb3JyZWN0JzpcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnNzICs9ICh0cmlhbC5ydCAtIHN0YXRzLm1lYW5SVCkgKiogMjtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RTUyArPSAodHJpYWwucnQgLSBzdGF0cy5jb3JyZWN0TWVhblJUKSAqKiAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgYWNjdW11bGF0b3Iuc3MgKz0gKHRyaWFsLnJ0IC0gc3RhdHMubWVhblJUKSAqKiAyO1xuICAgICAgICAgICAgYWNjdW11bGF0b3IuZXJyb3JTUyArPSAodHJpYWwucnQgLSBzdGF0cy5lcnJvck1lYW5SVCkgKiogMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBOby1vcFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNzOiAwLFxuICAgICAgICBjb3JyZWN0U1M6IDAsXG4gICAgICAgIGVycm9yU1M6IDAsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTZWNvbmQtb3JkZXIgc3RhdHNcbiAgICBzdGF0cy5jb3JyZWN0U0RSVCA9IChzdGF0cy5jb3JyZWN0Q291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuY29ycmVjdFNTIC8gKHN0YXRzLmNvcnJlY3RDb3VudCAtIDEpKVxuICAgICAgOiBOYU47XG4gICAgc3RhdHMuZXJyb3JTRFJUID0gKHN0YXRzLmVycm9yQ291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuZXJyb3JTUyAvIChzdGF0cy5lcnJvckNvdW50IC0gMSkpXG4gICAgICA6IE5hTjtcbiAgICBzdGF0cy5zZFJUID0gKHN0YXRzLmNvcnJlY3RDb3VudCArIHN0YXRzLmVycm9yQ291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuc3MgLyAoc3RhdHMuY29ycmVjdENvdW50ICsgc3RhdHMuZXJyb3JDb3VudCAtIDEpKVxuICAgICAgOiBOYU47XG5cbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cblxuICAvLyBQcm9iYWJpbGl0eSBvZiBhbiBFcnJvciBSZXNwb25zZVxuICBzdGF0aWMgYXp2MnBFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6O1xuXG4gICAgY29uc3QgQSA9IE1hdGguZXhwKCgtMiAqIHYgKiBhKSAvIHMgKiogMik7XG4gICAgY29uc3QgWiA9IE1hdGguZXhwKCgtMiAqIHYgKiB6UHJpbWUpIC8gcyAqKiAyKTtcblxuICAgIHJldHVybiAoQSAtIFopIC8gKEEgLSAxKTtcbiAgfVxuXG4gIC8vIFByb2JhYmlsaXR5IG9mIGEgQ29ycmVjdCBSZXNwb25zZVxuICBzdGF0aWMgYXp2MnBDKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIHJldHVybiBERE1NYXRoLmF6djJwRShhLCAxIC0geiwgLXYsIHMpO1xuICB9XG5cbiAgLy8gTWVhbiBPdmVyYWxsIFJUXG4gIC8vIEVxdWF0aW9uIDUgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KVxuICBzdGF0aWMgYXp2dDAybShhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG4gICAgY29uc3QgQSA9IE1hdGguZXhwKCgtMiAqIHYgKiBhKSAvIHMgKiogMikgLSAxO1xuICAgIGNvbnN0IFogPSBNYXRoLmV4cCgoLTIgKiB2ICogelByaW1lKSAvIHMgKiogMikgLSAxO1xuXG4gICAgY29uc3QgbWVhbiA9IC0oelByaW1lIC8gdikgKyAoYSAvIHYpICogKFogLyBBKTtcbiAgICByZXR1cm4gdDAgKyBtZWFuICogMTAwMDtcbiAgfVxuXG4gIC8vIFNEIE92ZXJhbGwgUlRcbiAgLy8gRXF1YXRpb24gNiAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gIHN0YXRpYyBhenYyc2QoYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG4gICAgY29uc3QgQSA9IE1hdGguZXhwKCgtMiAqIHYgKiBhKSAvIHMgKiogMikgLSAxO1xuICAgIGNvbnN0IFogPSBNYXRoLmV4cCgoLTIgKiB2ICogelByaW1lKSAvIHMgKiogMikgLSAxO1xuXG4gICAgY29uc3QgdmFyaWFuY2UgPSAoXG4gICAgICAoXG4gICAgICAgICgtdiAqIGEgKiogMiAqIChaICsgNCkgKiBaKSAvIEEgKiogMlxuICAgICAgKSArIChcbiAgICAgICAgKCgtMyAqIHYgKiBhICoqIDIgKyA0ICogdiAqIHpQcmltZSAqIGEgKyBzICoqIDIgKiBhKSAqIFogKyA0ICogdiAqIHpQcmltZSAqIGEpIC8gQVxuICAgICAgKSAtIChcbiAgICAgICAgcyAqKiAyICogelByaW1lXG4gICAgICApXG4gICAgKSAvIHYgKiogMztcblxuICAgIHJldHVybiBNYXRoLnNxcnQodmFyaWFuY2UpICogMTAwMDtcbiAgfVxuXG4gIC8vIE1lYW4gRXJyb3IgUlRcbiAgLy8gRXF1YXRpb24gMTMgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KVxuICBzdGF0aWMgYXp2dDAybUUoYSwgeiwgdiwgdDAsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7XG4gICAgICByZXR1cm4gTWF0aC5leHAoKDIgKiB2ICogeSkgLyAocyAqKiAyKSkgLSBNYXRoLmV4cCgoMiAqIHYgKiB4KSAvIChzICoqIDIpKTtcbiAgICB9XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG5cbiAgICBjb25zdCBtZWFuID0gKHpQcmltZSAqIChwaGkoelByaW1lIC0gYSwgYSkgKyBwaGkoMCwgelByaW1lKSkgKyAyICogYSAqIHBoaSh6UHJpbWUsIDApKVxuICAgICAgLyAodiAqIHBoaSh6UHJpbWUsIGEpICogcGhpKC1hLCAwKSk7XG4gICAgcmV0dXJuIHQwICsgbWVhbiAqIDEwMDA7XG4gIH1cblxuICAvLyBTRCBFcnJvciBSVFxuICAvLyBFcXVhdGlvbiAxNCAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gIHN0YXRpYyBhenYyc2RFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7XG4gICAgICByZXR1cm4gTWF0aC5leHAoKDIgKiB2ICogeSkgLyAocyAqKiAyKSkgLSBNYXRoLmV4cCgoMiAqIHYgKiB4KSAvIChzICoqIDIpKTtcbiAgICB9XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG5cbiAgICBjb25zdCB2YXJpYW5jZSA9IChcbiAgICAgIChcbiAgICAgICAgLTIgKiBhICogcGhpKDAsIHpQcmltZSlcbiAgICAgICAgKiAoKDIgKiB2ICogYSAqIHBoaSh6UHJpbWUsIDIgKiBhKSkgKyAocyAqKiAyICogcGhpKDAsIGEpICogcGhpKHpQcmltZSwgYSkpKVxuICAgICAgICAqIE1hdGguZXhwKCgyICogdiAqIGEpIC8gcyAqKiAyKVxuICAgICAgKSAvIChcbiAgICAgICAgdiAqKiAzICogcGhpKDAsIGEpICoqIDIgKiBwaGkoelByaW1lLCBhKSAqKiAyXG4gICAgICApXG4gICAgKSArIChcbiAgICAgIChcbiAgICAgICAgNCAqIHYgKiB6UHJpbWUgKiAoMiAqIGEgLSB6UHJpbWUpICogTWF0aC5leHAoKDIgKiB2ICogKHpQcmltZSArIGEpKSAvIHMgKiogMilcbiAgICAgICAgKyB6UHJpbWUgKiBzICoqIDIgKiBwaGkoMiAqIHpQcmltZSwgMiAqIGEpXG4gICAgICApIC8gKFxuICAgICAgICB2ICoqIDMgKiBwaGkoelByaW1lLCBhKSAqKiAyXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiBNYXRoLnNxcnQodmFyaWFuY2UpICogMTAwMDtcbiAgfVxuXG4gIC8vIE1lYW4gQ29ycmVjdCBSVFxuICBzdGF0aWMgYXp2dDAybUMoYSwgeiwgdiwgdDAsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIHJldHVybiBERE1NYXRoLmF6dnQwMm1FKGEsIDEgLSB6LCAtdiwgdDAsIHMpO1xuICB9XG5cbiAgLy8gU0QgQ29ycmVjdCBSVFxuICBzdGF0aWMgYXp2MnNkQyhhLCB6LCB2LCBzID0gRERNTWF0aC5zLkRFRkFVTFQpIHtcbiAgICByZXR1cm4gRERNTWF0aC5henYyc2RFKGEsIDEgLSB6LCAtdiwgcyk7XG4gIH1cblxuICAvLyBEZW5zaXR5IG9mIEVycm9yIFJUXG4gIHN0YXRpYyB0YXp2MmdFKHQsIGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIGlmICghdCkgcmV0dXJuIDA7XG5cbiAgICBjb25zdCB6UHJpbWUgPSBhICogejtcbiAgICBjb25zdCBiYXNlID0gKChNYXRoLlBJICogcyAqKiAyKSAvIGEgKiogMikgKiBNYXRoLmV4cCgoLXpQcmltZSAqIHYpIC8gcyAqKiAyKTtcblxuICAgIGxldCBrID0gMDtcbiAgICBsZXQgdGVybSA9IDA7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZG8ge1xuICAgICAgayArPSAxO1xuXG4gICAgICB0ZXJtID0ga1xuICAgICAgICAqIE1hdGguc2luKChNYXRoLlBJICogelByaW1lICogaykgLyBhKVxuICAgICAgICAqIE1hdGguZXhwKC0wLjUgKiAoKHYgKiogMiAvIHMgKiogMikgKyAoKE1hdGguUEkgKiogMiAqIGsgKiogMiAqIHMgKiogMikgLyBhICoqIDIpKSAqIHQpO1xuXG4gICAgICBzdW0gKz0gdGVybTtcbiAgICB9IHdoaWxlIChrIDwgMjAwKTsgLy8gPz8gSEFDS1xuXG4gICAgcmV0dXJuIGJhc2UgKiBzdW07XG4gIH1cblxuICAvLyBEZW5zaXR5IG9mIENvcnJlY3QgUlRcbiAgc3RhdGljIHRhenYyZ0ModCwgYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7XG4gICAgcmV0dXJuIERETU1hdGgudGF6djJnRSh0LCBhLCAxIC0geiwgLXYsIHMpO1xuICB9XG5cbiAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vcmFvdWwuc29jc2NpLnV2YS5ubC9FWjIvRVoyX25ldy5odG1sXG4gIC8vIEVaLWZ1bmN0aW9uIGZvciBzdGFydGluZyB2YWx1ZXNcbiAgLy8gaW5wdXQ6IG9iaiAtIE9iamVjdCB3aXRoIHByb3BlcnRpZXNcbiAgLy8gICAgcEMgLSBQcm9wb3J0aW9uIGNvcnJlY3RcbiAgLy8gICAgc2QgLSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBSVCdzIGluIG1zXG4gIC8vICAgIG0gLSBzYW1wbGUgbWVhbiBvZiB0aGUgUlQncyBpbiBtc1xuICAvLyAgICBzIC0gZGlmZnVzaW9uIHN0YW5kYXJkIGRldmlhdGlvblxuICAvLyByZXR1cm5zOiBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHYsIGEsIGFuZCB0MCwgY29udGFpbmluZyBFWi1lc3RpbWF0ZXMgb2YgdGhlc2UgcGFyYW1ldGVyc1xuICBzdGF0aWMgZGF0YTJleih7XG4gICAgYWNjdXJhY3k6IHBDLFxuICAgIHNkUlQ6IHNkLFxuICAgIG1lYW5SVDogbSxcbiAgICBzLFxuICB9KSB7XG4gICAgZnVuY3Rpb24gc2lnbihyKSB7XG4gICAgICByZXR1cm4gKChyID4gMCkgPyAxIDogKChyID09PSAwKSA/IDAgOiAtMSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvZ2l0KHApIHtcbiAgICAgIHJldHVybiBNYXRoLmxvZyhwIC8gKDEgLSBwKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdnJ0ID0gKHNkIC8gMTAwMCkgKiogMjtcbiAgICBjb25zdCBtcnQgPSBtIC8gMTAwMDtcblxuICAgIGNvbnN0IHMyID0gcyAqKiAyO1xuICAgIGNvbnN0IGwgPSBsb2dpdChwQyk7XG4gICAgY29uc3QgeCA9IChsICogKGwgKiBwQyAqKiAyIC0gbCAqIHBDICsgcEMgLSAwLjUpKSAvIHZydDtcbiAgICBjb25zdCB2ID0gc2lnbihwQyAtIDAuNSkgKiBzICogeCAqKiAoMSAvIDQpO1xuICAgIGNvbnN0IGEgPSAoczIgKiBsb2dpdChwQykpIC8gdjtcbiAgICBjb25zdCB5ID0gKC12ICogYSkgLyBzMjtcbiAgICBjb25zdCBtZHQgPSAoKGEgLyAoMiAqIHYpKSAqICgxIC0gTWF0aC5leHAoeSkpKSAvICgxICsgTWF0aC5leHAoeSkpO1xuICAgIGNvbnN0IHQwID0gKG1ydCA/IG1ydCAtIG1kdCA6IG51bGwpOyAvLyBjb21wdXRlIFRlciBvbmx5IGlmIE1SVCB3YXMgcHJvdmlkZWRcblxuICAgIGNvbnN0IHQwUHJpbWUgPSB0MCAqIDEwMDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHYsXG4gICAgICBhLFxuICAgICAgdDA6IHQwUHJpbWUsXG4gICAgICBzLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZGF0YTJlejIoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhMmV6MiBpcyBub3QgaW1wbGVtZW50ZWQhJyk7XG4gIH1cbn1cbiIsIlxuLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG5pbXBvcnQgRERNTWF0aCBmcm9tICcuL2RkbS1tYXRoJztcblxuZXhwb3J0IGRlZmF1bHQgRERNTWF0aDtcbiIsIi8qIGVzbGludCBuby1yZXN0cmljdGVkLWdsb2JhbHM6IFtcIm9mZlwiLCBcInNlbGZcIl0gKi9cblxuaW1wb3J0IERETU1hdGggZnJvbSAnQGRlY2lkYWJsZXMvYWNjdW11bGFibGUtbWF0aCc7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IERETU1hdGguZGF0YTJleih7Li4uZXZlbnQuZGF0YSwgczogRERNTWF0aC5zLkRFRkFVTFR9KTtcblxuICAvLyAjIyMjIyBBcmJpdHJhcnkgZGVmYXVsdCB2YWx1ZXMhISFcbiAgY29uc3QgYSA9ICFpc05hTihwYXJhbXMuYSkgPyBwYXJhbXMuYSA6IDEuNTtcbiAgY29uc3QgeiA9ICFpc05hTihwYXJhbXMueikgPyBwYXJhbXMueiA6IDAuNTtcbiAgY29uc3QgdiA9ICFpc05hTihwYXJhbXMudikgPyBwYXJhbXMudiA6IDAuMTtcbiAgY29uc3QgdDAgPSAhaXNOYU4ocGFyYW1zLnQwKSA/IHBhcmFtcy50MCA6IDEwMDtcbiAgY29uc3QgcyA9ICFpc05hTihwYXJhbXMucykgPyBwYXJhbXMucyA6IERETU1hdGgucy5ERUZBVUxUO1xuXG4gIGNvbnN0IHByZWRpY3RlZCA9IHtcbiAgICBhY2N1cmFjeTogRERNTWF0aC5henYycEMoYSwgeiwgdiksXG4gICAgY29ycmVjdE1lYW5SVDogRERNTWF0aC5henZ0MDJtQyhhLCB6LCB2LCB0MCksXG4gICAgZXJyb3JNZWFuUlQ6IERETU1hdGguYXp2dDAybUUoYSwgeiwgdiwgdDApLFxuICAgIG1lYW5SVDogRERNTWF0aC5henZ0MDJtKGEsIHosIHYsIHQwKSxcbiAgICBjb3JyZWN0U0RSVDogRERNTWF0aC5henYyc2RDKGEsIHosIHYpLFxuICAgIGVycm9yU0RSVDogRERNTWF0aC5henYyc2RFKGEsIHosIHYpLFxuICAgIHNkUlQ6IERETU1hdGguYXp2MnNkKGEsIHosIHYpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIHBhcmFtczoge1xuICAgICAgYSwgeiwgdiwgdDAsIHMsXG4gICAgfSxcbiAgICBwcmVkaWN0ZWQsXG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6WyJERE1NYXRoIiwicyIsIkRFRkFVTFQiLCJhIiwiTUlOIiwiTUFYIiwiU1RFUCIsIkpVTVAiLCJ6IiwidiIsInQwIiwidHJpYWxzMnN0YXRzIiwidHJpYWxzIiwic3RhdHMiLCJzdW1zIiwicmVkdWNlIiwiYWNjdW11bGF0b3IiLCJ0cmlhbCIsIm91dGNvbWUiLCJjb3JyZWN0Q291bnQiLCJjb3JyZWN0UlRTdW0iLCJydCIsImVycm9yQ291bnQiLCJlcnJvclJUU3VtIiwibnJDb3VudCIsImFjY3VyYWN5IiwiY29ycmVjdE1lYW5SVCIsImVycm9yTWVhblJUIiwibWVhblJUIiwic3VtczIiLCJzcyIsImNvcnJlY3RTUyIsImVycm9yU1MiLCJjb3JyZWN0U0RSVCIsIk1hdGgiLCJzcXJ0IiwiTmFOIiwiZXJyb3JTRFJUIiwic2RSVCIsImF6djJwRSIsInpQcmltZSIsIkEiLCJleHAiLCJaIiwiYXp2MnBDIiwiYXp2dDAybSIsIm1lYW4iLCJhenYyc2QiLCJ2YXJpYW5jZSIsImF6dnQwMm1FIiwicGhpIiwieCIsInkiLCJhenYyc2RFIiwiYXp2dDAybUMiLCJhenYyc2RDIiwidGF6djJnRSIsInQiLCJiYXNlIiwiUEkiLCJrIiwidGVybSIsInN1bSIsInNpbiIsInRhenYyZ0MiLCJkYXRhMmV6IiwicEMiLCJzZCIsIm0iLCJzaWduIiwiciIsImxvZ2l0IiwicCIsImxvZyIsInZydCIsIm1ydCIsInMyIiwibCIsIm1kdCIsInQwUHJpbWUiLCJkYXRhMmV6MiIsIkVycm9yIiwic2VsZiIsIm9ubWVzc2FnZSIsImV2ZW50IiwicGFyYW1zIiwiZGF0YSIsImlzTmFOIiwicHJlZGljdGVkIiwicG9zdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7OztFQUNBO0VBQ0E7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNlLE1BQU1BLE9BQU8sQ0FBQztFQUMzQixFQUFBLE9BQU9DLENBQUMsR0FBRztFQUNUQyxJQUFBQSxPQUFPLEVBQUU7S0FDVjtFQUVELEVBQUEsT0FBT0MsQ0FBQyxHQUFHO0VBQ1RELElBQUFBLE9BQU8sRUFBRSxHQUFHO0VBQ1pFLElBQUFBLEdBQUcsRUFBRSxJQUFJO0VBQ1RDLElBQUFBLEdBQUcsRUFBRSxHQUFHO0VBQ1JDLElBQUFBLElBQUksRUFBRSxJQUFJO0VBQ1ZDLElBQUFBLElBQUksRUFBRTtLQUNQO0VBRUQsRUFBQSxPQUFPQyxDQUFDLEdBQUc7RUFDVE4sSUFBQUEsT0FBTyxFQUFFLElBQUk7RUFDYkUsSUFBQUEsR0FBRyxFQUFFLElBQUk7RUFDVEMsSUFBQUEsR0FBRyxFQUFFLElBQUk7RUFDVEMsSUFBQUEsSUFBSSxFQUFFLElBQUk7RUFDVkMsSUFBQUEsSUFBSSxFQUFFO0tBQ1A7RUFFRCxFQUFBLE9BQU9FLENBQUMsR0FBRztFQUNUUCxJQUFBQSxPQUFPLEVBQUUsR0FBRztFQUNaRSxJQUFBQSxHQUFHLEVBQUUsSUFBSTtFQUNUQyxJQUFBQSxHQUFHLEVBQUUsR0FBRztFQUNSQyxJQUFBQSxJQUFJLEVBQUUsSUFBSTtFQUNWQyxJQUFBQSxJQUFJLEVBQUU7S0FDUDtFQUVELEVBQUEsT0FBT0csRUFBRSxHQUFHO0VBQ1ZSLElBQUFBLE9BQU8sRUFBRSxHQUFHO0VBQ1pFLElBQUFBLEdBQUcsRUFBRSxDQUFDO0VBQ05DLElBQUFBLEdBQUcsRUFBRSxHQUFHO0VBQ1JDLElBQUFBLElBQUksRUFBRSxDQUFDO0VBQ1BDLElBQUFBLElBQUksRUFBRTtLQUNQOztFQUVEO0lBQ0EsT0FBT0ksWUFBWUEsQ0FBQ0MsTUFBTSxFQUFFO01BQzFCLE1BQU1DLEtBQUssR0FBRyxFQUFFOztFQUVoQjtNQUNBLE1BQU1DLElBQUksR0FBR0YsTUFBTSxDQUFDRyxNQUFNLENBQ3hCLENBQUNDLFdBQVcsRUFBRUMsS0FBSyxLQUFLO1FBQ3RCLFFBQVFBLEtBQUssQ0FBQ0MsT0FBTztFQUNuQixRQUFBLEtBQUssU0FBUztZQUNaRixXQUFXLENBQUNHLFlBQVksSUFBSSxDQUFDO0VBQzdCSCxVQUFBQSxXQUFXLENBQUNJLFlBQVksSUFBSUgsS0FBSyxDQUFDSSxFQUFFO0VBQ3BDLFVBQUE7RUFDRixRQUFBLEtBQUssT0FBTztZQUNWTCxXQUFXLENBQUNNLFVBQVUsSUFBSSxDQUFDO0VBQzNCTixVQUFBQSxXQUFXLENBQUNPLFVBQVUsSUFBSU4sS0FBSyxDQUFDSSxFQUFFO0VBQ2xDLFVBQUE7RUFDRixRQUFBLEtBQUssSUFBSTtZQUNQTCxXQUFXLENBQUNRLE9BQU8sSUFBSSxDQUFDO0VBQ3hCLFVBQUE7RUFFQTtFQUNKO0VBQ0EsTUFBQSxPQUFPUixXQUFXO0VBQ3BCLEtBQUMsRUFDRDtFQUNFRyxNQUFBQSxZQUFZLEVBQUUsQ0FBQztFQUNmRyxNQUFBQSxVQUFVLEVBQUUsQ0FBQztFQUNiRSxNQUFBQSxPQUFPLEVBQUUsQ0FBQztFQUVWSixNQUFBQSxZQUFZLEVBQUUsQ0FBQztFQUNmRyxNQUFBQSxVQUFVLEVBQUU7RUFDZCxLQUNGLENBQUM7O0VBRUQ7RUFDQVYsSUFBQUEsS0FBSyxDQUFDTSxZQUFZLEdBQUdMLElBQUksQ0FBQ0ssWUFBWTtFQUN0Q04sSUFBQUEsS0FBSyxDQUFDUyxVQUFVLEdBQUdSLElBQUksQ0FBQ1EsVUFBVTtFQUNsQ1QsSUFBQUEsS0FBSyxDQUFDVyxPQUFPLEdBQUdWLElBQUksQ0FBQ1UsT0FBTztFQUM1QlgsSUFBQUEsS0FBSyxDQUFDWSxRQUFRLEdBQUdYLElBQUksQ0FBQ0ssWUFBWSxJQUFJTCxJQUFJLENBQUNLLFlBQVksR0FBR0wsSUFBSSxDQUFDUSxVQUFVLEdBQUdSLElBQUksQ0FBQ1UsT0FBTyxDQUFDO01BRXpGWCxLQUFLLENBQUNhLGFBQWEsR0FBR1osSUFBSSxDQUFDTSxZQUFZLEdBQUdOLElBQUksQ0FBQ0ssWUFBWTtNQUMzRE4sS0FBSyxDQUFDYyxXQUFXLEdBQUdiLElBQUksQ0FBQ1MsVUFBVSxHQUFHVCxJQUFJLENBQUNRLFVBQVU7RUFDckRULElBQUFBLEtBQUssQ0FBQ2UsTUFBTSxHQUFHLENBQUNkLElBQUksQ0FBQ00sWUFBWSxHQUFHTixJQUFJLENBQUNTLFVBQVUsS0FBS1QsSUFBSSxDQUFDSyxZQUFZLEdBQUdMLElBQUksQ0FBQ1EsVUFBVSxDQUFDOztFQUU1RjtNQUNBLE1BQU1PLEtBQUssR0FBR2pCLE1BQU0sQ0FBQ0csTUFBTSxDQUN6QixDQUFDQyxXQUFXLEVBQUVDLEtBQUssS0FBSztRQUN0QixRQUFRQSxLQUFLLENBQUNDLE9BQU87RUFDbkIsUUFBQSxLQUFLLFNBQVM7RUFDWkYsVUFBQUEsV0FBVyxDQUFDYyxFQUFFLElBQUksQ0FBQ2IsS0FBSyxDQUFDSSxFQUFFLEdBQUdSLEtBQUssQ0FBQ2UsTUFBTSxLQUFLLENBQUM7RUFDaERaLFVBQUFBLFdBQVcsQ0FBQ2UsU0FBUyxJQUFJLENBQUNkLEtBQUssQ0FBQ0ksRUFBRSxHQUFHUixLQUFLLENBQUNhLGFBQWEsS0FBSyxDQUFDO0VBQzlELFVBQUE7RUFDRixRQUFBLEtBQUssT0FBTztFQUNWVixVQUFBQSxXQUFXLENBQUNjLEVBQUUsSUFBSSxDQUFDYixLQUFLLENBQUNJLEVBQUUsR0FBR1IsS0FBSyxDQUFDZSxNQUFNLEtBQUssQ0FBQztFQUNoRFosVUFBQUEsV0FBVyxDQUFDZ0IsT0FBTyxJQUFJLENBQUNmLEtBQUssQ0FBQ0ksRUFBRSxHQUFHUixLQUFLLENBQUNjLFdBQVcsS0FBSyxDQUFDO0VBQzFELFVBQUE7RUFFQTtFQUNKO0VBQ0EsTUFBQSxPQUFPWCxXQUFXO0VBQ3BCLEtBQUMsRUFDRDtFQUNFYyxNQUFBQSxFQUFFLEVBQUUsQ0FBQztFQUNMQyxNQUFBQSxTQUFTLEVBQUUsQ0FBQztFQUNaQyxNQUFBQSxPQUFPLEVBQUU7RUFDWCxLQUNGLENBQUM7O0VBRUQ7TUFDQW5CLEtBQUssQ0FBQ29CLFdBQVcsR0FBSXBCLEtBQUssQ0FBQ00sWUFBWSxHQUFHLENBQUMsR0FDdkNlLElBQUksQ0FBQ0MsSUFBSSxDQUFDTixLQUFLLENBQUNFLFNBQVMsSUFBSWxCLEtBQUssQ0FBQ00sWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQ3JEaUIsR0FBRztNQUNQdkIsS0FBSyxDQUFDd0IsU0FBUyxHQUFJeEIsS0FBSyxDQUFDUyxVQUFVLEdBQUcsQ0FBQyxHQUNuQ1ksSUFBSSxDQUFDQyxJQUFJLENBQUNOLEtBQUssQ0FBQ0csT0FBTyxJQUFJbkIsS0FBSyxDQUFDUyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FDakRjLEdBQUc7RUFDUHZCLElBQUFBLEtBQUssQ0FBQ3lCLElBQUksR0FBSXpCLEtBQUssQ0FBQ00sWUFBWSxHQUFHTixLQUFLLENBQUNTLFVBQVUsR0FBRyxDQUFDLEdBQ25EWSxJQUFJLENBQUNDLElBQUksQ0FBQ04sS0FBSyxDQUFDQyxFQUFFLElBQUlqQixLQUFLLENBQUNNLFlBQVksR0FBR04sS0FBSyxDQUFDUyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FDakVjLEdBQUc7RUFFUCxJQUFBLE9BQU92QixLQUFLO0VBQ2Q7O0VBRUE7RUFDQSxFQUFBLE9BQU8wQixNQUFNQSxDQUFDcEMsQ0FBQyxFQUFFSyxDQUFDLEVBQUVDLENBQUMsRUFBRVIsQ0FBQyxHQUFHRCxPQUFPLENBQUNDLENBQUMsQ0FBQ0MsT0FBTyxFQUFFO0VBQzVDLElBQUEsTUFBTXNDLE1BQU0sR0FBR3JDLENBQUMsR0FBR0ssQ0FBQztFQUVwQixJQUFBLE1BQU1pQyxDQUFDLEdBQUdQLElBQUksQ0FBQ1EsR0FBRyxDQUFFLEVBQUUsR0FBR2pDLENBQUMsR0FBR04sQ0FBQyxHQUFJRixDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ3pDLElBQUEsTUFBTTBDLENBQUMsR0FBR1QsSUFBSSxDQUFDUSxHQUFHLENBQUUsRUFBRSxHQUFHakMsQ0FBQyxHQUFHK0IsTUFBTSxHQUFJdkMsQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUU5QyxPQUFPLENBQUN3QyxDQUFDLEdBQUdFLENBQUMsS0FBS0YsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUMxQjs7RUFFQTtFQUNBLEVBQUEsT0FBT0csTUFBTUEsQ0FBQ3pDLENBQUMsRUFBRUssQ0FBQyxFQUFFQyxDQUFDLEVBQUVSLENBQUMsR0FBR0QsT0FBTyxDQUFDQyxDQUFDLENBQUNDLE9BQU8sRUFBRTtFQUM1QyxJQUFBLE9BQU9GLE9BQU8sQ0FBQ3VDLE1BQU0sQ0FBQ3BDLENBQUMsRUFBRSxDQUFDLEdBQUdLLENBQUMsRUFBRSxDQUFDQyxDQUFDLEVBQUVSLENBQUMsQ0FBQztFQUN4Qzs7RUFFQTtFQUNBO0VBQ0EsRUFBQSxPQUFPNEMsT0FBT0EsQ0FBQzFDLENBQUMsRUFBRUssQ0FBQyxFQUFFQyxDQUFDLEVBQUVDLEVBQUUsRUFBRVQsQ0FBQyxHQUFHRCxPQUFPLENBQUNDLENBQUMsQ0FBQ0MsT0FBTyxFQUFFO0VBQ2pELElBQUEsTUFBTXNDLE1BQU0sR0FBR3JDLENBQUMsR0FBR0ssQ0FBQztFQUNwQixJQUFBLE1BQU1pQyxDQUFDLEdBQUdQLElBQUksQ0FBQ1EsR0FBRyxDQUFFLEVBQUUsR0FBR2pDLENBQUMsR0FBR04sQ0FBQyxHQUFJRixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztFQUM3QyxJQUFBLE1BQU0wQyxDQUFDLEdBQUdULElBQUksQ0FBQ1EsR0FBRyxDQUFFLEVBQUUsR0FBR2pDLENBQUMsR0FBRytCLE1BQU0sR0FBSXZDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO0VBRWxELElBQUEsTUFBTTZDLElBQUksR0FBRyxFQUFFTixNQUFNLEdBQUcvQixDQUFDLENBQUMsR0FBSU4sQ0FBQyxHQUFHTSxDQUFDLElBQUtrQyxDQUFDLEdBQUdGLENBQUMsQ0FBQztFQUM5QyxJQUFBLE9BQU8vQixFQUFFLEdBQUdvQyxJQUFJLEdBQUcsSUFBSTtFQUN6Qjs7RUFFQTtFQUNBO0VBQ0EsRUFBQSxPQUFPQyxNQUFNQSxDQUFDNUMsQ0FBQyxFQUFFSyxDQUFDLEVBQUVDLENBQUMsRUFBRVIsQ0FBQyxHQUFHRCxPQUFPLENBQUNDLENBQUMsQ0FBQ0MsT0FBTyxFQUFFO0VBQzVDLElBQUEsTUFBTXNDLE1BQU0sR0FBR3JDLENBQUMsR0FBR0ssQ0FBQztFQUNwQixJQUFBLE1BQU1pQyxDQUFDLEdBQUdQLElBQUksQ0FBQ1EsR0FBRyxDQUFFLEVBQUUsR0FBR2pDLENBQUMsR0FBR04sQ0FBQyxHQUFJRixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztFQUM3QyxJQUFBLE1BQU0wQyxDQUFDLEdBQUdULElBQUksQ0FBQ1EsR0FBRyxDQUFFLEVBQUUsR0FBR2pDLENBQUMsR0FBRytCLE1BQU0sR0FBSXZDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO0VBRWxELElBQUEsTUFBTStDLFFBQVEsR0FBRyxDQUVaLENBQUN2QyxDQUFDLEdBQUdOLENBQUMsSUFBSSxDQUFDLElBQUl3QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUdBLENBQUMsR0FBSUYsQ0FBQyxJQUFJLENBQUMsR0FFcEMsQ0FBQyxDQUFDLEVBQUUsR0FBR2hDLENBQUMsR0FBR04sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUdNLENBQUMsR0FBRytCLE1BQU0sR0FBR3JDLENBQUMsR0FBR0YsQ0FBQyxJQUFJLENBQUMsR0FBR0UsQ0FBQyxJQUFJd0MsQ0FBQyxHQUFHLENBQUMsR0FBR2xDLENBQUMsR0FBRytCLE1BQU0sR0FBR3JDLENBQUMsSUFBSXNDLENBQ2xGLEdBQ0N4QyxDQUFDLElBQUksQ0FBQyxHQUFHdUMsTUFDVixJQUNDL0IsQ0FBQyxJQUFJLENBQUM7RUFFVixJQUFBLE9BQU95QixJQUFJLENBQUNDLElBQUksQ0FBQ2EsUUFBUSxDQUFDLEdBQUcsSUFBSTtFQUNuQzs7RUFFQTtFQUNBO0VBQ0EsRUFBQSxPQUFPQyxRQUFRQSxDQUFDOUMsQ0FBQyxFQUFFSyxDQUFDLEVBQUVDLENBQUMsRUFBRUMsRUFBRSxFQUFFVCxDQUFDLEdBQUdELE9BQU8sQ0FBQ0MsQ0FBQyxDQUFDQyxPQUFPLEVBQUU7RUFDbEQsSUFBQSxTQUFTZ0QsR0FBR0EsQ0FBQ0MsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDakIsTUFBQSxPQUFPbEIsSUFBSSxDQUFDUSxHQUFHLENBQUUsQ0FBQyxHQUFHakMsQ0FBQyxHQUFHMkMsQ0FBQyxHQUFLbkQsQ0FBQyxJQUFJLENBQUUsQ0FBQyxHQUFHaUMsSUFBSSxDQUFDUSxHQUFHLENBQUUsQ0FBQyxHQUFHakMsQ0FBQyxHQUFHMEMsQ0FBQyxHQUFLbEQsQ0FBQyxJQUFJLENBQUUsQ0FBQztFQUM1RTtFQUNBLElBQUEsTUFBTXVDLE1BQU0sR0FBR3JDLENBQUMsR0FBR0ssQ0FBQztNQUVwQixNQUFNc0MsSUFBSSxHQUFHLENBQUNOLE1BQU0sSUFBSVUsR0FBRyxDQUFDVixNQUFNLEdBQUdyQyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxHQUFHK0MsR0FBRyxDQUFDLENBQUMsRUFBRVYsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUdyQyxDQUFDLEdBQUcrQyxHQUFHLENBQUNWLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FDaEYvQixDQUFDLEdBQUd5QyxHQUFHLENBQUNWLE1BQU0sRUFBRXJDLENBQUMsQ0FBQyxHQUFHK0MsR0FBRyxDQUFDLENBQUMvQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDckMsSUFBQSxPQUFPTyxFQUFFLEdBQUdvQyxJQUFJLEdBQUcsSUFBSTtFQUN6Qjs7RUFFQTtFQUNBO0VBQ0EsRUFBQSxPQUFPTyxPQUFPQSxDQUFDbEQsQ0FBQyxFQUFFSyxDQUFDLEVBQUVDLENBQUMsRUFBRVIsQ0FBQyxHQUFHRCxPQUFPLENBQUNDLENBQUMsQ0FBQ0MsT0FBTyxFQUFFO0VBQzdDLElBQUEsU0FBU2dELEdBQUdBLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ2pCLE1BQUEsT0FBT2xCLElBQUksQ0FBQ1EsR0FBRyxDQUFFLENBQUMsR0FBR2pDLENBQUMsR0FBRzJDLENBQUMsR0FBS25ELENBQUMsSUFBSSxDQUFFLENBQUMsR0FBR2lDLElBQUksQ0FBQ1EsR0FBRyxDQUFFLENBQUMsR0FBR2pDLENBQUMsR0FBRzBDLENBQUMsR0FBS2xELENBQUMsSUFBSSxDQUFFLENBQUM7RUFDNUU7RUFDQSxJQUFBLE1BQU11QyxNQUFNLEdBQUdyQyxDQUFDLEdBQUdLLENBQUM7RUFFcEIsSUFBQSxNQUFNd0MsUUFBUSxHQUVWLEVBQUUsR0FBRzdDLENBQUMsR0FBRytDLEdBQUcsQ0FBQyxDQUFDLEVBQUVWLE1BQU0sQ0FBQyxJQUNuQixDQUFDLEdBQUcvQixDQUFDLEdBQUdOLENBQUMsR0FBRytDLEdBQUcsQ0FBQ1YsTUFBTSxFQUFFLENBQUMsR0FBR3JDLENBQUMsQ0FBQyxHQUFLRixDQUFDLElBQUksQ0FBQyxHQUFHaUQsR0FBRyxDQUFDLENBQUMsRUFBRS9DLENBQUMsQ0FBQyxHQUFHK0MsR0FBRyxDQUFDVixNQUFNLEVBQUVyQyxDQUFDLENBQUUsQ0FBQyxHQUMxRStCLElBQUksQ0FBQ1EsR0FBRyxDQUFFLENBQUMsR0FBR2pDLENBQUMsR0FBR04sQ0FBQyxHQUFJRixDQUFDLElBQUksQ0FBQyxDQUFDLElBRWhDUSxDQUFDLElBQUksQ0FBQyxHQUFHeUMsR0FBRyxDQUFDLENBQUMsRUFBRS9DLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRytDLEdBQUcsQ0FBQ1YsTUFBTSxFQUFFckMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUM5QyxHQUVELENBQ0UsQ0FBQyxHQUFHTSxDQUFDLEdBQUcrQixNQUFNLElBQUksQ0FBQyxHQUFHckMsQ0FBQyxHQUFHcUMsTUFBTSxDQUFDLEdBQUdOLElBQUksQ0FBQ1EsR0FBRyxDQUFFLENBQUMsR0FBR2pDLENBQUMsSUFBSStCLE1BQU0sR0FBR3JDLENBQUMsQ0FBQyxHQUFJRixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQzNFdUMsTUFBTSxHQUFHdkMsQ0FBQyxJQUFJLENBQUMsR0FBR2lELEdBQUcsQ0FBQyxDQUFDLEdBQUdWLE1BQU0sRUFBRSxDQUFDLEdBQUdyQyxDQUFDLENBQUMsS0FFMUNNLENBQUMsSUFBSSxDQUFDLEdBQUd5QyxHQUFHLENBQUNWLE1BQU0sRUFBRXJDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FFL0I7RUFFRCxJQUFBLE9BQU8rQixJQUFJLENBQUNDLElBQUksQ0FBQ2EsUUFBUSxDQUFDLEdBQUcsSUFBSTtFQUNuQzs7RUFFQTtFQUNBLEVBQUEsT0FBT00sUUFBUUEsQ0FBQ25ELENBQUMsRUFBRUssQ0FBQyxFQUFFQyxDQUFDLEVBQUVDLEVBQUUsRUFBRVQsQ0FBQyxHQUFHRCxPQUFPLENBQUNDLENBQUMsQ0FBQ0MsT0FBTyxFQUFFO0VBQ2xELElBQUEsT0FBT0YsT0FBTyxDQUFDaUQsUUFBUSxDQUFDOUMsQ0FBQyxFQUFFLENBQUMsR0FBR0ssQ0FBQyxFQUFFLENBQUNDLENBQUMsRUFBRUMsRUFBRSxFQUFFVCxDQUFDLENBQUM7RUFDOUM7O0VBRUE7RUFDQSxFQUFBLE9BQU9zRCxPQUFPQSxDQUFDcEQsQ0FBQyxFQUFFSyxDQUFDLEVBQUVDLENBQUMsRUFBRVIsQ0FBQyxHQUFHRCxPQUFPLENBQUNDLENBQUMsQ0FBQ0MsT0FBTyxFQUFFO0VBQzdDLElBQUEsT0FBT0YsT0FBTyxDQUFDcUQsT0FBTyxDQUFDbEQsQ0FBQyxFQUFFLENBQUMsR0FBR0ssQ0FBQyxFQUFFLENBQUNDLENBQUMsRUFBRVIsQ0FBQyxDQUFDO0VBQ3pDOztFQUVBO0VBQ0EsRUFBQSxPQUFPdUQsT0FBT0EsQ0FBQ0MsQ0FBQyxFQUFFdEQsQ0FBQyxFQUFFSyxDQUFDLEVBQUVDLENBQUMsRUFBRVIsQ0FBQyxHQUFHRCxPQUFPLENBQUNDLENBQUMsQ0FBQ0MsT0FBTyxFQUFFO0VBQ2hELElBQUEsSUFBSSxDQUFDdUQsQ0FBQyxFQUFFLE9BQU8sQ0FBQztFQUVoQixJQUFBLE1BQU1qQixNQUFNLEdBQUdyQyxDQUFDLEdBQUdLLENBQUM7TUFDcEIsTUFBTWtELElBQUksR0FBS3hCLElBQUksQ0FBQ3lCLEVBQUUsR0FBRzFELENBQUMsSUFBSSxDQUFDLEdBQUlFLENBQUMsSUFBSSxDQUFDLEdBQUkrQixJQUFJLENBQUNRLEdBQUcsQ0FBRSxDQUFDRixNQUFNLEdBQUcvQixDQUFDLEdBQUlSLENBQUMsSUFBSSxDQUFDLENBQUM7TUFFN0UsSUFBSTJELENBQUMsR0FBRyxDQUFDO01BQ1QsSUFBSUMsSUFBSSxHQUFHLENBQUM7TUFDWixJQUFJQyxHQUFHLEdBQUcsQ0FBQztNQUNYLEdBQUc7RUFDREYsTUFBQUEsQ0FBQyxJQUFJLENBQUM7UUFFTkMsSUFBSSxHQUFHRCxDQUFDLEdBQ0oxQixJQUFJLENBQUM2QixHQUFHLENBQUU3QixJQUFJLENBQUN5QixFQUFFLEdBQUduQixNQUFNLEdBQUdvQixDQUFDLEdBQUl6RCxDQUFDLENBQUMsR0FDcEMrQixJQUFJLENBQUNRLEdBQUcsQ0FBQyxJQUFJLElBQUtqQyxDQUFDLElBQUksQ0FBQyxHQUFHUixDQUFDLElBQUksQ0FBQyxHQUFNaUMsSUFBSSxDQUFDeUIsRUFBRSxJQUFJLENBQUMsR0FBR0MsQ0FBQyxJQUFJLENBQUMsR0FBRzNELENBQUMsSUFBSSxDQUFDLEdBQUlFLENBQUMsSUFBSSxDQUFFLENBQUMsR0FBR3NELENBQUMsQ0FBQztFQUUxRkssTUFBQUEsR0FBRyxJQUFJRCxJQUFJO0VBQ2IsS0FBQyxRQUFRRCxDQUFDLEdBQUcsR0FBRyxFQUFFOztNQUVsQixPQUFPRixJQUFJLEdBQUdJLEdBQUc7RUFDbkI7O0VBRUE7RUFDQSxFQUFBLE9BQU9FLE9BQU9BLENBQUNQLENBQUMsRUFBRXRELENBQUMsRUFBRUssQ0FBQyxFQUFFQyxDQUFDLEVBQUVSLENBQUMsR0FBR0QsT0FBTyxDQUFDQyxDQUFDLENBQUNDLE9BQU8sRUFBRTtFQUNoRCxJQUFBLE9BQU9GLE9BQU8sQ0FBQ3dELE9BQU8sQ0FBQ0MsQ0FBQyxFQUFFdEQsQ0FBQyxFQUFFLENBQUMsR0FBR0ssQ0FBQyxFQUFFLENBQUNDLENBQUMsRUFBRVIsQ0FBQyxDQUFDO0VBQzVDOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxFQUFBLE9BQU9nRSxPQUFPQSxDQUFDO0VBQ2J4QyxJQUFBQSxRQUFRLEVBQUV5QyxFQUFFO0VBQ1o1QixJQUFBQSxJQUFJLEVBQUU2QixFQUFFO0VBQ1J2QyxJQUFBQSxNQUFNLEVBQUV3QyxDQUFDO0VBQ1RuRSxJQUFBQTtFQUNGLEdBQUMsRUFBRTtNQUNELFNBQVNvRSxJQUFJQSxDQUFDQyxDQUFDLEVBQUU7RUFDZixNQUFBLE9BQVNBLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxHQUFLQSxDQUFDLEtBQUssQ0FBQyxHQUFJLENBQUMsR0FBRyxFQUFHO0VBQzVDO01BRUEsU0FBU0MsS0FBS0EsQ0FBQ0MsQ0FBQyxFQUFFO1FBQ2hCLE9BQU90QyxJQUFJLENBQUN1QyxHQUFHLENBQUNELENBQUMsSUFBSSxDQUFDLEdBQUdBLENBQUMsQ0FBQyxDQUFDO0VBQzlCO0VBRUEsSUFBQSxNQUFNRSxHQUFHLEdBQUcsQ0FBQ1AsRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDO0VBQzVCLElBQUEsTUFBTVEsR0FBRyxHQUFHUCxDQUFDLEdBQUcsSUFBSTtFQUVwQixJQUFBLE1BQU1RLEVBQUUsR0FBRzNFLENBQUMsSUFBSSxDQUFDO0VBQ2pCLElBQUEsTUFBTTRFLENBQUMsR0FBR04sS0FBSyxDQUFDTCxFQUFFLENBQUM7RUFDbkIsSUFBQSxNQUFNZixDQUFDLEdBQUkwQixDQUFDLElBQUlBLENBQUMsR0FBR1gsRUFBRSxJQUFJLENBQUMsR0FBR1csQ0FBQyxHQUFHWCxFQUFFLEdBQUdBLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBSVEsR0FBRztFQUN2RCxJQUFBLE1BQU1qRSxDQUFDLEdBQUc0RCxJQUFJLENBQUNILEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBR2pFLENBQUMsR0FBR2tELENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQzNDLE1BQU1oRCxDQUFDLEdBQUl5RSxFQUFFLEdBQUdMLEtBQUssQ0FBQ0wsRUFBRSxDQUFDLEdBQUl6RCxDQUFDO0VBQzlCLElBQUEsTUFBTTJDLENBQUMsR0FBSSxDQUFDM0MsQ0FBQyxHQUFHTixDQUFDLEdBQUl5RSxFQUFFO01BQ3ZCLE1BQU1FLEdBQUcsR0FBSzNFLENBQUMsSUFBSSxDQUFDLEdBQUdNLENBQUMsQ0FBQyxJQUFLLENBQUMsR0FBR3lCLElBQUksQ0FBQ1EsR0FBRyxDQUFDVSxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQUMsR0FBR2xCLElBQUksQ0FBQ1EsR0FBRyxDQUFDVSxDQUFDLENBQUMsQ0FBQztNQUNuRSxNQUFNMUMsRUFBRSxHQUFJaUUsR0FBRyxHQUFHQSxHQUFHLEdBQUdHLEdBQUcsR0FBRyxJQUFLLENBQUM7O0VBRXBDLElBQUEsTUFBTUMsT0FBTyxHQUFHckUsRUFBRSxHQUFHLElBQUk7TUFDekIsT0FBTztRQUNMRCxDQUFDO1FBQ0ROLENBQUM7RUFDRE8sTUFBQUEsRUFBRSxFQUFFcUUsT0FBTztFQUNYOUUsTUFBQUE7T0FDRDtFQUNIO0lBRUEsT0FBTytFLFFBQVFBLEdBQUc7RUFDaEIsSUFBQSxNQUFNLElBQUlDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQztFQUNqRDtFQUNGOztFQy9UQTs7RUNEQTs7RUFJQUMsSUFBSSxDQUFDQyxTQUFTLEdBQUlDLEtBQUssSUFBSztFQUMxQixFQUFBLE1BQU1DLE1BQU0sR0FBR3JGLE9BQU8sQ0FBQ2lFLE9BQU8sQ0FBQztNQUFDLEdBQUdtQixLQUFLLENBQUNFLElBQUk7RUFBRXJGLElBQUFBLENBQUMsRUFBRUQsT0FBTyxDQUFDQyxDQUFDLENBQUNDO0VBQU8sR0FBQyxDQUFDOztFQUVyRTtFQUNBLEVBQUEsTUFBTUMsQ0FBQyxHQUFHLENBQUNvRixLQUFLLENBQUNGLE1BQU0sQ0FBQ2xGLENBQUMsQ0FBQyxHQUFHa0YsTUFBTSxDQUFDbEYsQ0FBQyxHQUFHLEdBQUc7RUFDM0MsRUFBQSxNQUFNSyxDQUFDLEdBQUcsQ0FBQytFLEtBQUssQ0FBQ0YsTUFBTSxDQUFDN0UsQ0FBQyxDQUFDLEdBQUc2RSxNQUFNLENBQUM3RSxDQUFDLEdBQUcsR0FBRztFQUMzQyxFQUFBLE1BQU1DLENBQUMsR0FBRyxDQUFDOEUsS0FBSyxDQUFDRixNQUFNLENBQUM1RSxDQUFDLENBQUMsR0FBRzRFLE1BQU0sQ0FBQzVFLENBQUMsR0FBRyxHQUFHO0VBQzNDLEVBQUEsTUFBTUMsRUFBRSxHQUFHLENBQUM2RSxLQUFLLENBQUNGLE1BQU0sQ0FBQzNFLEVBQUUsQ0FBQyxHQUFHMkUsTUFBTSxDQUFDM0UsRUFBRSxHQUFHLEdBQUc7RUFDOUMsRUFBQSxNQUFNVCxDQUFDLEdBQUcsQ0FBQ3NGLEtBQUssQ0FBQ0YsTUFBTSxDQUFDcEYsQ0FBQyxDQUFDLEdBQUdvRixNQUFNLENBQUNwRixDQUFDLEdBQUdELE9BQU8sQ0FBQ0MsQ0FBQyxDQUFDQyxPQUFPO0VBRXpELEVBQUEsTUFBTXNGLFNBQVMsR0FBRztNQUNoQi9ELFFBQVEsRUFBRXpCLE9BQU8sQ0FBQzRDLE1BQU0sQ0FBQ3pDLENBQUMsRUFBRUssQ0FBQyxFQUFFQyxDQUFDLENBQUM7RUFDakNpQixJQUFBQSxhQUFhLEVBQUUxQixPQUFPLENBQUNzRCxRQUFRLENBQUNuRCxDQUFDLEVBQUVLLENBQUMsRUFBRUMsQ0FBQyxFQUFFQyxFQUFFLENBQUM7RUFDNUNpQixJQUFBQSxXQUFXLEVBQUUzQixPQUFPLENBQUNpRCxRQUFRLENBQUM5QyxDQUFDLEVBQUVLLENBQUMsRUFBRUMsQ0FBQyxFQUFFQyxFQUFFLENBQUM7RUFDMUNrQixJQUFBQSxNQUFNLEVBQUU1QixPQUFPLENBQUM2QyxPQUFPLENBQUMxQyxDQUFDLEVBQUVLLENBQUMsRUFBRUMsQ0FBQyxFQUFFQyxFQUFFLENBQUM7TUFDcEN1QixXQUFXLEVBQUVqQyxPQUFPLENBQUN1RCxPQUFPLENBQUNwRCxDQUFDLEVBQUVLLENBQUMsRUFBRUMsQ0FBQyxDQUFDO01BQ3JDNEIsU0FBUyxFQUFFckMsT0FBTyxDQUFDcUQsT0FBTyxDQUFDbEQsQ0FBQyxFQUFFSyxDQUFDLEVBQUVDLENBQUMsQ0FBQztNQUNuQzZCLElBQUksRUFBRXRDLE9BQU8sQ0FBQytDLE1BQU0sQ0FBQzVDLENBQUMsRUFBRUssQ0FBQyxFQUFFQyxDQUFDO0tBQzdCO0lBRUR5RSxJQUFJLENBQUNPLFdBQVcsQ0FBQztFQUNmSixJQUFBQSxNQUFNLEVBQUU7UUFDTmxGLENBQUM7UUFBRUssQ0FBQztRQUFFQyxDQUFDO1FBQUVDLEVBQUU7RUFBRVQsTUFBQUE7T0FDZDtFQUNEdUYsSUFBQUE7RUFDRixHQUFDLENBQUM7RUFDSixDQUFDOzs7Ozs7In0=');
7238
7330
  /* eslint-enable */
7239
7331
 
7240
7332
  /*
@@ -7250,10 +7342,10 @@
7250
7342
  }
7251
7343
  constructor() {
7252
7344
  super();
7253
- this.a = 1.2;
7254
- this.z = 0.35;
7255
- this.v = 1.5;
7256
- this.t0 = 150;
7345
+ this.a = DDMMath.a.DEFAULT;
7346
+ this.z = DDMMath.z.DEFAULT;
7347
+ this.v = DDMMath.v.DEFAULT;
7348
+ this.t0 = DDMMath.t0.DEFAULT;
7257
7349
  this.observed = {};
7258
7350
  this.predicted = {};
7259
7351
  this.working = false;
@@ -7301,7 +7393,7 @@
7301
7393
  this.fit();
7302
7394
  }
7303
7395
  static get styles() {
7304
- return [super.styles, i$2`
7396
+ return [super.styles, i$3`
7305
7397
  :host {
7306
7398
  display: inline-block;
7307
7399
  }
@@ -7418,7 +7510,7 @@
7418
7510
  }));
7419
7511
  }
7420
7512
  static get styles() {
7421
- return [super.styles, i$2`
7513
+ return [super.styles, i$3`
7422
7514
  :host {
7423
7515
  display: inline-block;
7424
7516
  }
@@ -7440,15 +7532,71 @@
7440
7532
  decidables-slider div {
7441
7533
  margin-bottom: 0.25rem;
7442
7534
  }
7535
+
7536
+ .a {
7537
+ --decidables-slider-background-color: var(---color-a-light);
7538
+ --decidables-slider-color: var(---color-a);
7539
+ }
7540
+
7541
+ .z {
7542
+ --decidables-slider-background-color: var(---color-z-light);
7543
+ --decidables-slider-color: var(---color-z);
7544
+ }
7545
+
7546
+ .v {
7547
+ --decidables-slider-background-color: var(---color-v-light);
7548
+ --decidables-slider-color: var(---color-v);
7549
+ }
7550
+
7551
+ .t0 {
7552
+ --decidables-slider-background-color: var(---color-t0-light);
7553
+ --decidables-slider-color: var(---color-t0);
7554
+ }
7443
7555
  `];
7444
7556
  }
7445
7557
  render() {
7446
7558
  return x$1`
7447
7559
  <div class="holder">
7448
- ${this.a != null ? x$1`<decidables-slider class="a" ?disabled=${!this.interactive} min="0.01" max="2" step="0.01" .value=${+this.a.toFixed(2)} @change=${this.setBoundarySeparation.bind(this)} @input=${this.setBoundarySeparation.bind(this)}><div>Boundary Separation<br><span class="math-var">a</span></div></decidables-slider>` : x$1``}
7449
- ${this.z != null ? x$1`<decidables-slider class="z" ?disabled=${!this.interactive} min="0.01" max="0.99" step="0.01" .value=${+this.z.toFixed(2)} @change=${this.setStartingPoint.bind(this)} @input=${this.setStartingPoint.bind(this)}><div>Starting Point<br><span class="math-var">z</span></div></decidables-slider>` : x$1``}
7450
- ${this.v != null ? x$1`<decidables-slider class="v" ?disabled=${!this.interactive} min="0.01" max="5" step="0.01" .value=${+this.v.toFixed(2)} @change=${this.setDriftRate.bind(this)} @input=${this.setDriftRate.bind(this)}><div>Drift Rate<br><span class="math-var">v</span></div></decidables-slider>` : x$1``}
7451
- ${this.t0 != null ? x$1`<decidables-slider class="t0" ?disabled=${!this.interactive} min="0" max="500" step="1" .value=${+this.t0.toFixed(0)} @change=${this.setNondecisionTime.bind(this)} @input=${this.setNondecisionTime.bind(this)}><div>Nondecision Time<br><span class="math-var">t₀</span></div></decidables-slider>` : x$1``}
7560
+ ${this.a != null ? x$1`<decidables-slider class="a"
7561
+ ?disabled=${!this.interactive}
7562
+ scale
7563
+ min=${DDMMath.a.MIN}
7564
+ max=${DDMMath.a.MAX}
7565
+ step=${DDMMath.a.STEP}
7566
+ .value=${+this.a.toFixed(2)}
7567
+ @change=${this.setBoundarySeparation.bind(this)}
7568
+ @input=${this.setBoundarySeparation.bind(this)}
7569
+ ><div>Boundary Separation<br><span class="math-var">a</span></div></decidables-slider>` : x$1``}
7570
+ ${this.z != null ? x$1`<decidables-slider class="z"
7571
+ ?disabled=${!this.interactive}
7572
+ scale
7573
+ min=${DDMMath.z.MIN}
7574
+ max=${DDMMath.z.MAX}
7575
+ step=${DDMMath.z.STEP}
7576
+ .value=${+this.z.toFixed(2)}
7577
+ @change=${this.setStartingPoint.bind(this)}
7578
+ @input=${this.setStartingPoint.bind(this)}
7579
+ ><div>Starting Point<br><span class="math-var">z</span></div></decidables-slider>` : x$1``}
7580
+ ${this.v != null ? x$1`<decidables-slider class="v"
7581
+ ?disabled=${!this.interactive}
7582
+ scale
7583
+ min=${DDMMath.v.MIN}
7584
+ max=${DDMMath.v.MAX}
7585
+ step=${DDMMath.v.STEP}
7586
+ .value=${+this.v.toFixed(2)}
7587
+ @change=${this.setDriftRate.bind(this)}
7588
+ @input=${this.setDriftRate.bind(this)}
7589
+ ><div>Drift Rate<br><span class="math-var">v</span></div></decidables-slider>` : x$1``}
7590
+ ${this.t0 != null ? x$1`<decidables-slider class="t0"
7591
+ ?disabled=${!this.interactive}
7592
+ scale
7593
+ min=${DDMMath.t0.MIN}
7594
+ max=${DDMMath.t0.MAX}
7595
+ step=${DDMMath.t0.STEP}
7596
+ .value=${+this.t0.toFixed(0)}
7597
+ @change=${this.setNondecisionTime.bind(this)}
7598
+ @input=${this.setNondecisionTime.bind(this)}
7599
+ ><div>Nondecision Time<br><span class="math-var">t₀</span></div></decidables-slider>` : x$1``}
7452
7600
  </div>`;
7453
7601
  }
7454
7602
  }
@@ -7586,10 +7734,10 @@
7586
7734
  this.resample();
7587
7735
  this.human = false;
7588
7736
  this.trials = 10;
7589
- this.a = 1.2;
7590
- this.z = 0.35;
7591
- this.v = 1.5;
7592
- this.t0 = 150;
7737
+ this.a = DDMMath.a.DEFAULT;
7738
+ this.z = DDMMath.z.DEFAULT;
7739
+ this.v = DDMMath.v.DEFAULT;
7740
+ this.t0 = DDMMath.t0.DEFAULT;
7593
7741
 
7594
7742
  // this.s = null;
7595
7743
  // this.sz = null;
@@ -7650,7 +7798,7 @@
7650
7798
  while (path.at(-1).e > bounds.lower && path.at(-1).e < bounds.upper) {
7651
7799
  path.push({
7652
7800
  t: path.at(-1).t + this.precision * 1000,
7653
- e: path.at(-1).e + drift + DDMMath.s * random()
7801
+ e: path.at(-1).e + drift + DDMMath.s.DEFAULT * random()
7654
7802
  });
7655
7803
  }
7656
7804
  return path;
@@ -7754,7 +7902,7 @@
7754
7902
  }));
7755
7903
  }
7756
7904
  static get styles() {
7757
- return [super.styles, i$2`
7905
+ return [super.styles, i$3`
7758
7906
  :host {
7759
7907
  display: inline-block;
7760
7908
 
@@ -7940,10 +8088,25 @@
7940
8088
 
7941
8089
  .t0z .point {
7942
8090
  fill: var(---color-element-emphasis);
8091
+ stroke-width: 0;
7943
8092
 
7944
8093
  r: 6px;
7945
8094
  }
7946
8095
 
8096
+ /* Make larger targets for touch users */
8097
+ .interactive .touch {
8098
+ stroke: #000000;
8099
+ stroke-dasharray: none;
8100
+ stroke-opacity: 0;
8101
+ }
8102
+
8103
+ @media (pointer: coarse) {
8104
+ .interactive .touch {
8105
+ stroke-linecap: round;
8106
+ stroke-width: 12;
8107
+ }
8108
+ }
8109
+
7947
8110
  .measure {
7948
8111
  stroke-width: 2;
7949
8112
  }
@@ -8118,9 +8281,9 @@
8118
8281
  let t0 = timeScale.invert(event.x);
8119
8282
  let z = (evidenceScale.invert(event.y) + this.a / 2) / this.a;
8120
8283
  // Clamp t0
8121
- t0 = shift === 'z' ? timeScale.invert(event.subject.x) : t0 < 0 ? 0 : t0 > 500 ? 500 : t0;
8284
+ t0 = shift === 'z' ? timeScale.invert(event.subject.x) : t0 < DDMMath.t0.MIN ? DDMMath.t0.MIN : t0 > DDMMath.t0.MAX ? DDMMath.t0.MAX : t0;
8122
8285
  // Clamp z
8123
- z = shift === 't0' ? (evidenceScale.invert(event.subject.y) + this.a / 2) / this.a : z < 0.01 ? 0.01 : z > 0.99 ? 0.99 : z;
8286
+ z = shift === 't0' ? (evidenceScale.invert(event.subject.y) + this.a / 2) / this.a : z < DDMMath.z.MIN ? DDMMath.z.MIN : z > DDMMath.z.MAX ? DDMMath.z.MAX : z;
8124
8287
  this.t0 = t0;
8125
8288
  this.z = z;
8126
8289
  this.alignState();
@@ -8150,7 +8313,7 @@
8150
8313
  this.drag = true;
8151
8314
  let v = (evidenceScale.invert(event.y) - this.startingPoint) / (timeScale.invert(event.x) - this.t0) * 1000;
8152
8315
  // Clamp drift rate
8153
- v = v < 0.01 ? 0.01 : v > 5 ? 5 : v;
8316
+ v = v < DDMMath.v.MIN ? DDMMath.v.MIN : v > DDMMath.v.MAX ? DDMMath.v.MAX : v;
8154
8317
  this.v = v;
8155
8318
  this.alignState();
8156
8319
  this.dispatchEvent(new CustomEvent('ddm-model-v', {
@@ -8174,12 +8337,13 @@
8174
8337
  }).on('start', event => {
8175
8338
  const element = event.currentTarget;
8176
8339
  select(element).classed('dragging', true);
8177
- }).on('drag', (event, datum) => {
8340
+ }).on('drag', event => {
8178
8341
  this.drag = true;
8179
- let boundary = evidenceScale.invert(event.y);
8180
- // Clamp boundaries to visible evidence
8181
- boundary = boundary < this.scale.evidence.min ? this.scale.evidence.min : boundary > this.scale.evidence.max ? this.scale.evidence.max : datum.bound === 'upper' && boundary < 0.005 ? 0.005 : datum.bound === 'lower' && boundary > -0.005 ? -0.005 : boundary;
8182
- this.a = Math.abs(boundary * 2);
8342
+ const boundary = evidenceScale.invert(event.y);
8343
+ let a = Math.abs(boundary * 2);
8344
+ // Clamp a
8345
+ a = a < DDMMath.a.MIN ? DDMMath.a.MIN : a > DDMMath.a.MAX ? DDMMath.a.MAX : a;
8346
+ this.a = a;
8183
8347
  this.alignState();
8184
8348
  this.dispatchEvent(new CustomEvent('ddm-model-a', {
8185
8349
  detail: {
@@ -8370,8 +8534,8 @@
8370
8534
  });
8371
8535
  accuracyUnderlayerEnter.append('g').classed('axis accuracy', true);
8372
8536
  // MERGE
8373
- const evidenceScaleMerge = evidenceUnderlayerMerge.select('.axis.evidence').attr('transform', `translate(${-0.25 * this.rem}, 0)`);
8374
- const densityScaleMerge = densityUnderlayerMerge.select('.axis.density').attr('transform', `translate(${-0.25 * this.rem}, 0)`);
8537
+ const evidenceScaleMerge = evidenceUnderlayerMerge.select('.axis.evidence').attr('transform', `translate(${ -0.25 * this.rem}, 0)`);
8538
+ const densityScaleMerge = densityUnderlayerMerge.select('.axis.density').attr('transform', `translate(${ -0.25 * this.rem}, 0)`);
8375
8539
  const accuracyScaleMerge = accuracyUnderlayerMerge.select('.axis.accuracy').attr('transform', `translate(${accuracyWidth + 0.25 * this.rem}, 0)`);
8376
8540
  const evidenceScaleTransition = evidenceScaleMerge.transition().duration(transitionDuration).ease(cubicOut).call(axisLeft(evidenceScale)).attr('font-size', null).attr('font-family', null);
8377
8541
  const densityScaleTransition = densityScaleMerge.transition().duration(transitionDuration).ease(cubicOut).each((datum, index, elements) => {
@@ -8393,8 +8557,8 @@
8393
8557
  densityTitleEnter.append('tspan').classed('name', true).text('Density');
8394
8558
  accuracyTitleEnter.append('tspan').classed('name', true).text('Accuracy');
8395
8559
  // MERGE
8396
- evidenceUnderlayerMerge.select('.title.evidence').transition().duration(transitionDuration).ease(cubicOut).attr('transform', `translate(${-2.5 * this.rem}, ${evidenceHeight / 2})rotate(-90)`);
8397
- densityUnderlayerMerge.select('.title.density').transition().duration(transitionDuration).ease(cubicOut).attr('transform', `translate(${-2.5 * this.rem}, ${densityHeight / 2})rotate(-90)`);
8560
+ evidenceUnderlayerMerge.select('.title.evidence').transition().duration(transitionDuration).ease(cubicOut).attr('transform', `translate(${ -2.5 * this.rem}, ${evidenceHeight / 2})rotate(-90)`);
8561
+ densityUnderlayerMerge.select('.title.density').transition().duration(transitionDuration).ease(cubicOut).attr('transform', `translate(${ -2.5 * this.rem}, ${densityHeight / 2})rotate(-90)`);
8398
8562
  accuracyUnderlayerMerge.select('.title.accuracy').transition().duration(transitionDuration).ease(cubicOut).attr('transform', `translate(${accuracyWidth + 2.25 * this.rem}, ${height / 2})rotate(90)`);
8399
8563
 
8400
8564
  //
@@ -8620,20 +8784,23 @@
8620
8784
  return `boundary ${index === 0 ? 'correct' : 'error'}`;
8621
8785
  });
8622
8786
  boundaryEnter.append('line').classed('line', true);
8787
+ boundaryEnter.append('line').classed('line touch', true);
8623
8788
  // MERGE
8624
8789
  const boundaryMerge = boundaryEnter.merge(boundaryUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? (event, datum) => {
8625
8790
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8626
- let a = this.a; /* eslint-disable-line prefer-destructuring */
8791
+ let {
8792
+ a
8793
+ } = this;
8627
8794
  switch (event.key) {
8628
8795
  case 'ArrowUp':
8629
- a += datum.bound === 'upper' ? event.shiftKey ? 0.01 : 0.1 : event.shiftKey ? -0.01 : -0.1;
8796
+ a += datum.bound === 'upper' ? event.shiftKey ? DDMMath.a.STEP : DDMMath.a.JUMP : event.shiftKey ? -0.01 : -0.1;
8630
8797
  break;
8631
8798
  case 'ArrowDown':
8632
- a += datum.bound === 'upper' ? event.shiftKey ? -0.01 : -0.1 : event.shiftKey ? 0.01 : 0.1;
8799
+ a += datum.bound === 'upper' ? event.shiftKey ? -0.01 : -0.1 : event.shiftKey ? DDMMath.a.STEP : DDMMath.a.JUMP;
8633
8800
  break;
8634
8801
  }
8635
- // Clamp boundaries to visible evidence
8636
- a = a < 0.01 ? 0.01 : a > this.scale.evidence.max * 2 ? this.scale.evidence.max * 2 : a;
8802
+ // Clamp a
8803
+ a = a < DDMMath.a.MIN ? DDMMath.a.MIN : a > DDMMath.a.MAX ? DDMMath.a.MAX : a;
8637
8804
  this.a = a;
8638
8805
  this.alignState();
8639
8806
  this.dispatchEvent(new CustomEvent('ddm-model-a', {
@@ -8657,6 +8824,11 @@
8657
8824
  }).attr('y2', datum => {
8658
8825
  return evidenceScale(datum.value);
8659
8826
  });
8827
+ boundaryMerge.select('.line.touch').transition().duration(this.drag ? 0 : transitionDuration).ease(cubicOut).attr('x1', timeScale(this.scale.time.min)).attr('x2', timeScale(this.scale.time.max)).attr('y1', datum => {
8828
+ return evidenceScale(datum.value);
8829
+ }).attr('y2', datum => {
8830
+ return evidenceScale(datum.value);
8831
+ });
8660
8832
  // EXIT
8661
8833
  boundaryUpdate.exit().remove();
8662
8834
 
@@ -8670,21 +8842,25 @@
8670
8842
  // ENTER
8671
8843
  const driftEnter = driftUpdate.enter().append('g').classed('drift', true);
8672
8844
  driftEnter.append('line').classed('line', true);
8845
+ driftEnter.append('line').classed('line touch', true);
8673
8846
  driftEnter.append('path').classed('arrow', true);
8847
+ driftEnter.append('path').classed('arrow touch', true);
8674
8848
  // MERGE
8675
8849
  const driftMerge = driftEnter.merge(driftUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? event => {
8676
8850
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8677
- let v = this.v; /* eslint-disable-line prefer-destructuring */
8851
+ let {
8852
+ v
8853
+ } = this;
8678
8854
  switch (event.key) {
8679
8855
  case 'ArrowUp':
8680
- v += event.shiftKey ? 0.01 : 0.1;
8856
+ v += event.shiftKey ? DDMMath.v.STEP : DDMMath.v.JUMP;
8681
8857
  break;
8682
8858
  case 'ArrowDown':
8683
- v -= event.shiftKey ? 0.01 : 0.1;
8859
+ v -= event.shiftKey ? DDMMath.v.STEP : DDMMath.v.JUMP;
8684
8860
  break;
8685
8861
  }
8686
8862
  // Clamp z
8687
- v = v < 0.01 ? 0.01 : v > 5 ? 5 : v;
8863
+ v = v < DDMMath.v.MIN ? DDMMath.v.MIN : v > DDMMath.v.MAX ? DDMMath.v.MAX : v;
8688
8864
  this.v = v;
8689
8865
  this.alignState();
8690
8866
  this.dispatchEvent(new CustomEvent('ddm-model-v', {
@@ -8709,11 +8885,17 @@
8709
8885
  rotate(${-Math.atan(datum.v / 1000 * scaleRatio) * (180 / Math.PI)})`;
8710
8886
  });
8711
8887
  driftMerge.select('.line').attr('x2', timeScale(200));
8888
+ driftMerge.select('.line.touch').attr('x2', timeScale(200));
8712
8889
  driftMerge.select('.arrow').attr('d', `
8713
8890
  M ${timeScale(200) - this.rem * 0.5},${-this.rem * 0.5}
8714
8891
  l ${this.rem * 0.5},${this.rem * 0.5}
8715
8892
  l ${-this.rem * 0.5},${this.rem * 0.5}
8716
8893
  `);
8894
+ driftMerge.select('.arrow.touch').attr('d', `
8895
+ M ${timeScale(200) - this.rem * 0.5},${-this.rem * 0.5}
8896
+ l ${this.rem * 0.5},${this.rem * 0.5}
8897
+ l ${-this.rem * 0.5},${this.rem * 0.5}
8898
+ `);
8717
8899
  // EXIT
8718
8900
  driftUpdate.exit().remove();
8719
8901
 
@@ -8726,21 +8908,24 @@
8726
8908
  // ENTER
8727
8909
  const t0zEnter = t0zUpdate.enter().append('g').classed('t0z', true);
8728
8910
  t0zEnter.append('line').classed('line', true);
8729
- t0zEnter.append('circle').classed('point', true);
8911
+ t0zEnter.append('line').classed('line touch', true);
8912
+ t0zEnter.append('circle').classed('point touch', true);
8730
8913
  // MERGE
8731
8914
  const t0zMerge = t0zEnter.merge(t0zUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? event => {
8732
8915
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8733
- let z = this.z; /* eslint-disable-line prefer-destructuring */
8916
+ let {
8917
+ z
8918
+ } = this;
8734
8919
  switch (event.key) {
8735
8920
  case 'ArrowUp':
8736
- z += event.shiftKey ? 0.01 : 0.1;
8921
+ z += event.shiftKey ? DDMMath.z.STEP : DDMMath.z.JUMP;
8737
8922
  break;
8738
8923
  case 'ArrowDown':
8739
- z -= event.shiftKey ? 0.01 : 0.1;
8924
+ z -= event.shiftKey ? DDMMath.z.STEP : DDMMath.z.JUMP;
8740
8925
  break;
8741
8926
  }
8742
8927
  // Clamp z
8743
- z = z < 0.01 ? 0.01 : z > 0.99 ? 0.99 : z;
8928
+ z = z < DDMMath.z.MIN ? DDMMath.z.MIN : z > DDMMath.z.MAX ? DDMMath.z.MAX : z;
8744
8929
  this.z = z;
8745
8930
  this.alignState();
8746
8931
  this.dispatchEvent(new CustomEvent('ddm-model-z', {
@@ -8755,14 +8940,14 @@
8755
8940
  let t0 = this.t0; /* eslint-disable-line prefer-destructuring */
8756
8941
  switch (event.key) {
8757
8942
  case 'ArrowRight':
8758
- t0 += event.shiftKey ? 1 : 10;
8943
+ t0 += event.shiftKey ? DDMMath.t0.STEP : DDMMath.t0.JUMP;
8759
8944
  break;
8760
8945
  case 'ArrowLeft':
8761
- t0 -= event.shiftKey ? 1 : 10;
8946
+ t0 -= event.shiftKey ? DDMMath.t0.STEP : DDMMath.t0.JUMP;
8762
8947
  break;
8763
8948
  }
8764
8949
  // Clamp t0
8765
- t0 = t0 < 0 ? 0 : t0 > 500 ? 500 : t0;
8950
+ t0 = t0 < DDMMath.t0.MIN ? DDMMath.t0.MIN : t0 > DDMMath.t0.MAX ? DDMMath.t0.MAX : t0;
8766
8951
  this.t0 = t0;
8767
8952
  this.alignState();
8768
8953
  this.dispatchEvent(new CustomEvent('ddm-model-t0', {
@@ -8788,6 +8973,13 @@
8788
8973
  }).attr('y2', datum => {
8789
8974
  return evidenceScale(datum.startingPoint);
8790
8975
  });
8976
+ t0zMerge.select('.line.touch').transition().duration(this.drag ? 0 : transitionDuration).ease(cubicOut).attr('x1', timeScale(0)).attr('x2', datum => {
8977
+ return timeScale(datum.t0);
8978
+ }).attr('y1', datum => {
8979
+ return evidenceScale(datum.startingPoint);
8980
+ }).attr('y2', datum => {
8981
+ return evidenceScale(datum.startingPoint);
8982
+ });
8791
8983
  t0zMerge.select('.point').transition().duration(this.drag ? 0 : transitionDuration).ease(cubicOut).attr('cx', datum => {
8792
8984
  return timeScale(datum.t0);
8793
8985
  }).attr('cy', datum => {
@@ -9094,7 +9286,7 @@
9094
9286
  this.yScale = undefined; // D3 Scale for y-axis
9095
9287
  }
9096
9288
  static get styles() {
9097
- return [super.styles, i$2`
9289
+ return [super.styles, i$3`
9098
9290
  :host {
9099
9291
  display: inline-block;
9100
9292
 
@@ -9275,7 +9467,7 @@
9275
9467
  const queryUpdate = select(this.renderRoot).select('.content').selectAll('.query').data([]);
9276
9468
  queryUpdate.exit().remove();
9277
9469
  }
9278
- run( /* elapsed */
9470
+ run(/* elapsed */
9279
9471
  ) {
9280
9472
  const realTime = now();
9281
9473
  const currentTime = this.baseTime ? realTime - this.baseTime : 0;
@@ -9471,7 +9663,7 @@
9471
9663
  this.numeric = false;
9472
9664
  }
9473
9665
  static get styles() {
9474
- return [super.styles, i$2`
9666
+ return [super.styles, i$3`
9475
9667
  :host {
9476
9668
  display: block;
9477
9669
 
@@ -9670,9 +9862,9 @@
9670
9862
  }
9671
9863
  constructor() {
9672
9864
  super();
9673
- this.a = 1.5;
9674
- this.z = 0.5;
9675
- this.v = 0.1;
9865
+ this.a = DDMMath.a.DEFAULT;
9866
+ this.z = DDMMath.z.DEFAULT;
9867
+ this.v = DDMMath.v.DEFAULT;
9676
9868
  this.alignState();
9677
9869
  }
9678
9870
  alignState() {
@@ -9714,19 +9906,46 @@
9714
9906
  let s;
9715
9907
  let accuracy;
9716
9908
  if (this.numeric) {
9717
- a = x$1`<decidables-spinner class="a bottom" ?disabled=${!this.interactive} min="0.1" max="2" step="0.01" .value="${this.a}" @input=${this.aInput.bind(this)}>
9909
+ a = x$1`<decidables-spinner class="a bottom"
9910
+ ?disabled=${!this.interactive}
9911
+ min=${DDMMath.a.MIN}
9912
+ max=${DDMMath.a.MAX}
9913
+ step=${DDMMath.a.STEP}
9914
+ .value=${this.a}
9915
+ @input=${this.aInput.bind(this)}
9916
+ >
9718
9917
  <var class="math-var">a</var>
9719
9918
  </decidables-spinner>`;
9720
- z = x$1`<decidables-spinner class="z bottom" ?disabled=${!this.interactive} min="0.01" max="0.99" step="0.01" .value="${this.z}" @input=${this.zInput.bind(this)}>
9919
+ z = x$1`<decidables-spinner class="z bottom"
9920
+ ?disabled=${!this.interactive}
9921
+ min=${DDMMath.z.MIN}
9922
+ max=${DDMMath.z.MAX}
9923
+ step=${DDMMath.z.STEP}
9924
+ .value=${this.z}
9925
+ @input=${this.zInput.bind(this)}
9926
+ >
9721
9927
  <var class="math-var">z</var>
9722
9928
  </decidables-spinner>`;
9723
- v = x$1`<decidables-spinner class="v bottom" ?disabled=${!this.interactive} min="0.01" max="5" step="0.01" .value="${this.v}" @input=${this.vInput.bind(this)}>
9929
+ v = x$1`<decidables-spinner class="v bottom"
9930
+ ?disabled=${!this.interactive}
9931
+ min=${DDMMath.v.MIN}
9932
+ max=${DDMMath.v.MAX}
9933
+ step=${DDMMath.v.STEP}
9934
+ .value=${this.v}
9935
+ @input=${this.vInput.bind(this)}
9936
+ >
9724
9937
  <var class="math-var">v</var>
9725
9938
  </decidables-spinner>`;
9726
- s = x$1`<decidables-spinner class="s bottom" disabled min="0.01" max="1" step="0.01" .value="${DDMMath.s}">
9939
+ s = x$1`<decidables-spinner class="s bottom"
9940
+ disabled
9941
+ .value=${DDMMath.s.DEFAULT}
9942
+ >
9727
9943
  <var class="math-var">s</var>
9728
9944
  </decidables-spinner>`;
9729
- accuracy = x$1`<decidables-spinner class="accuracy bottom" disabled min="0" max="1" step="0.01" .value="${+this.accuracy.toFixed(2)}">
9945
+ accuracy = x$1`<decidables-spinner class="accuracy bottom"
9946
+ disabled
9947
+ .value=${+this.accuracy.toFixed(2)}
9948
+ >
9730
9949
  <var>Accuracy</var>
9731
9950
  </decidables-spinner>`;
9732
9951
  } else {
@@ -9804,10 +10023,10 @@
9804
10023
  }
9805
10024
  constructor() {
9806
10025
  super();
9807
- this.a = 1.5;
9808
- this.z = 0.5;
9809
- this.v = 0.1;
9810
- this.t0 = 200;
10026
+ this.a = DDMMath.a.DEFAULT;
10027
+ this.z = DDMMath.z.DEFAULT;
10028
+ this.v = DDMMath.v.DEFAULT;
10029
+ this.t0 = DDMMath.t0.DEFAULT;
9811
10030
  this.alignState();
9812
10031
  }
9813
10032
  alignState() {
@@ -9856,22 +10075,56 @@
9856
10075
  let s;
9857
10076
  let meanRT;
9858
10077
  if (this.numeric) {
9859
- a = x$1`<decidables-spinner class="a bottom" ?disabled=${!this.interactive} min="0.1" max="2" step="0.01" .value="${this.a}" @input=${this.aInput.bind(this)}>
10078
+ a = x$1`<decidables-spinner class="a bottom"
10079
+ ?disabled=${!this.interactive}
10080
+ min=${DDMMath.a.MIN}
10081
+ max=${DDMMath.a.MAX}
10082
+ step=${DDMMath.a.STEP}
10083
+ .value=${this.a}
10084
+ @input=${this.aInput.bind(this)}
10085
+ >
9860
10086
  <var class="math-var">a</var>
9861
10087
  </decidables-spinner>`;
9862
- z = x$1`<decidables-spinner class="z bottom" ?disabled=${!this.interactive} min="0.01" max="0.99" step="0.01" .value="${this.z}" @input=${this.zInput.bind(this)}>
10088
+ z = x$1`<decidables-spinner class="z bottom"
10089
+ ?disabled=${!this.interactive}
10090
+ min=${DDMMath.z.MIN}
10091
+ max=${DDMMath.z.MAX}
10092
+ step=${DDMMath.z.STEP}
10093
+ .value=${this.z}
10094
+ @input=${this.zInput.bind(this)}
10095
+ >
9863
10096
  <var class="math-var">z</var>
9864
10097
  </decidables-spinner>`;
9865
- v = x$1`<decidables-spinner class="v bottom" ?disabled=${!this.interactive} min="0.01" max="5" step="0.01" .value="${this.v}" @input=${this.vInput.bind(this)}>
10098
+ v = x$1`<decidables-spinner class="v bottom"
10099
+ ?disabled=${!this.interactive}
10100
+ min=${DDMMath.v.MIN}
10101
+ max=${DDMMath.v.MAX}
10102
+ step=${DDMMath.v.STEP}
10103
+ .value=${this.v}
10104
+ @input=${this.vInput.bind(this)}
10105
+ >
9866
10106
  <var class="math-var">v</var>
9867
10107
  </decidables-spinner>`;
9868
- t0 = x$1`<decidables-spinner class="t0 bottom" ?disabled=${!this.interactive} min="0" max="500" step="1" .value="${this.t0}" @input=${this.t0Input.bind(this)}>
10108
+ t0 = x$1`<decidables-spinner class="t0 bottom"
10109
+ ?disabled=${!this.interactive}
10110
+ min=${DDMMath.t0.MIN}
10111
+ max=${DDMMath.t0.MAX}
10112
+ step=${DDMMath.t0.STEP}
10113
+ .value=${this.t0}
10114
+ @input=${this.t0Input.bind(this)}
10115
+ >
9869
10116
  <var class="math-var">t<sub>0</sub></var>
9870
10117
  </decidables-spinner>`;
9871
- s = x$1`<decidables-spinner class="s bottom" disabled min="0.01" max="1" step="0.01" .value="${DDMMath.s}">
10118
+ s = x$1`<decidables-spinner class="s bottom"
10119
+ disabled
10120
+ .value=${DDMMath.s.DEFAULT}
10121
+ >
9872
10122
  <var class="math-var">s</var>
9873
10123
  </decidables-spinner>`;
9874
- meanRT = x$1`<decidables-spinner class="mean-rt bottom" disabled min="0" max="1" step="0.01" .value="${+this.meanRT.toFixed(0)}">
10124
+ meanRT = x$1`<decidables-spinner class="mean-rt bottom"
10125
+ disabled
10126
+ .value=${+this.meanRT.toFixed(0)}
10127
+ >
9875
10128
  <var>Mean RT</var>
9876
10129
  </decidables-spinner>`;
9877
10130
  } else {
@@ -9935,7 +10188,7 @@
9935
10188
  */
9936
10189
  class DDMExample extends AccumulableElement {
9937
10190
  static get styles() {
9938
- return [super.styles, i$2`
10191
+ return [super.styles, i$3`
9939
10192
  :host {
9940
10193
  ---border: var(--border, 1px solid var(---color-border));
9941
10194
  display: inline-block;
@@ -9994,17 +10247,74 @@
9994
10247
  }
9995
10248
  customElements.define('ddm-example', DDMExample);
9996
10249
 
9997
- // import DDMMath from '@decidables/accumulable-math';
9998
-
9999
-
10000
10250
  /*
10001
10251
  DDMExampleHuman element
10002
10252
  <ddm-example-human>
10003
10253
  */
10004
10254
  class DDMExampleHuman extends DDMExample {
10255
+ static get properties() {
10256
+ return {
10257
+ trials: {
10258
+ attribute: 'trials',
10259
+ type: Number,
10260
+ reflect: true
10261
+ },
10262
+ duration: {
10263
+ attribute: 'duration',
10264
+ type: Number,
10265
+ reflect: true
10266
+ },
10267
+ coherence: {
10268
+ attribute: 'coherence',
10269
+ type: Number,
10270
+ reflect: true
10271
+ },
10272
+ color: {
10273
+ attribute: 'color',
10274
+ type: String,
10275
+ reflect: true
10276
+ },
10277
+ a: {
10278
+ attribute: false,
10279
+ type: Number,
10280
+ reflect: false
10281
+ },
10282
+ z: {
10283
+ attribute: false,
10284
+ type: Number,
10285
+ reflect: false
10286
+ },
10287
+ v: {
10288
+ attribute: false,
10289
+ type: Number,
10290
+ reflect: false
10291
+ },
10292
+ t0: {
10293
+ attribute: false,
10294
+ type: Number,
10295
+ reflect: false
10296
+ }
10297
+ };
10298
+ }
10005
10299
  constructor() {
10006
10300
  super();
10007
- this.trialCount = 0;
10301
+ this.trials = 10;
10302
+ this.duration = 2000;
10303
+ this.coherence = 0.5;
10304
+ this.colors = ['none', 'measure', 'outcome', 'all'];
10305
+ this.color = 'outcome';
10306
+ this.a = DDMMath.a.DEFAULT;
10307
+ this.z = DDMMath.z.DEFAULT;
10308
+ this.v = DDMMath.v.DEFAULT;
10309
+ this.t0 = DDMMath.t0.DEFAULT;
10310
+ this.accumulableControl = null;
10311
+ this.rdkTask = null;
10312
+ this.accumulableResponse = null;
10313
+ this.accumulableTable = null;
10314
+ this.ddmParameters = null;
10315
+ this.ddmModel = null;
10316
+ this.ddmFit = null;
10317
+ this.data = undefined;
10008
10318
  }
10009
10319
  connectedCallback() {
10010
10320
  super.connectedCallback();
@@ -10018,57 +10328,32 @@
10018
10328
 
10019
10329
  // Initialize
10020
10330
  this.ddmModel.clear();
10021
- if (this.accumulableControl && this.accumulableControl.hasAttribute('trials')) {
10331
+ if (this.accumulableControl) {
10022
10332
  this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10023
- if (this.rdkTask) {
10024
- this.rdkTask.trials = event.detail.trials;
10025
- }
10026
- if (this.accumulableResponse) {
10027
- this.accumulableResponse.trialTotal = event.detail.trials;
10028
- }
10333
+ this.trials = event.detail.trials;
10029
10334
  });
10030
- }
10031
- if (this.accumulableControl && this.accumulableControl.hasAttribute('duration')) {
10032
10335
  this.accumulableControl.addEventListener('accumulable-control-duration', event => {
10033
- if (this.rdkTask) {
10034
- this.rdkTask.duration = event.detail.duration;
10035
- this.rdkTask.wait = event.detail.duration;
10036
- this.rdkTask.iti = event.detail.duration;
10037
- }
10336
+ this.duration = event.detail.duration;
10038
10337
  });
10039
- }
10040
- if (this.accumulableControl && this.accumulableControl.hasAttribute('coherence')) {
10041
10338
  this.accumulableControl.addEventListener('accumulable-control-coherence', event => {
10042
- if (this.rdkTask) {
10043
- this.rdkTask.coherence = event.detail.coherence;
10044
- }
10339
+ this.coherence = event.detail.coherence;
10045
10340
  });
10046
- }
10047
- if (this.accumulableControl && this.accumulableControl.hasAttribute('color')) {
10048
10341
  this.accumulableControl.addEventListener('accumulable-control-color', event => {
10049
- if (this.accumulableTable) {
10050
- this.accumulableTable.color = event.detail.color;
10051
- }
10342
+ this.color = event.detail.color;
10052
10343
  });
10053
- }
10054
- if (this.accumulableControl && this.accumulableControl.hasAttribute('run')) {
10055
- this.accumulableControl.addEventListener('accumulable-control-run', ( /* event */
10344
+ this.accumulableControl.addEventListener('accumulable-control-run', (/* event */
10056
10345
  ) => {
10057
10346
  if (this.rdkTask) {
10058
10347
  this.rdkTask.running = true;
10059
10348
  }
10060
10349
  });
10061
- }
10062
- if (this.accumulableControl && this.accumulableControl.hasAttribute('pause')) {
10063
- this.accumulableControl.addEventListener('accumulable-control-pause', ( /* event */
10350
+ this.accumulableControl.addEventListener('accumulable-control-pause', (/* event */
10064
10351
  ) => {
10065
10352
  if (this.rdkTask) {
10066
10353
  this.rdkTask.running = false;
10067
10354
  }
10068
10355
  });
10069
- }
10070
- if (this.accumulableControl && this.accumulableControl.hasAttribute('reset')) {
10071
- this.accumulableControl.addEventListener('accumulable-control-reset', ( /* event */
10356
+ this.accumulableControl.addEventListener('accumulable-control-reset', (/* event */
10072
10357
  ) => {
10073
10358
  if (this.rdkTask) {
10074
10359
  this.rdkTask.reset();
@@ -10100,11 +10385,6 @@
10100
10385
  }
10101
10386
  });
10102
10387
  }
10103
- if (this.rdkTask) {
10104
- if (this.accumulableResponse) {
10105
- this.accumulableResponse.trialTotal = this.rdkTask.trials;
10106
- }
10107
- }
10108
10388
  if (this.rdkTask) {
10109
10389
  this.rdkTask.addEventListener('rdk-trial-start', event => {
10110
10390
  if (this.accumulableResponse) {
@@ -10113,7 +10393,7 @@
10113
10393
  });
10114
10394
  }
10115
10395
  if (this.rdkTask) {
10116
- this.rdkTask.addEventListener('rdk-trial-end', ( /* event */
10396
+ this.rdkTask.addEventListener('rdk-trial-end', (/* event */
10117
10397
  ) => {
10118
10398
  if (this.accumulableResponse) {
10119
10399
  this.accumulableResponse.stop();
@@ -10121,7 +10401,7 @@
10121
10401
  });
10122
10402
  }
10123
10403
  if (this.rdkTask) {
10124
- this.rdkTask.addEventListener('rdk-block-end', ( /* event */
10404
+ this.rdkTask.addEventListener('rdk-block-end', (/* event */
10125
10405
  ) => {
10126
10406
  if (this.accumulableControl) {
10127
10407
  this.accumulableControl.complete();
@@ -10130,18 +10410,7 @@
10130
10410
  }
10131
10411
  if (this.accumulableResponse) {
10132
10412
  this.accumulableResponse.addEventListener('accumulable-response', event => {
10133
- if (this.accumulableTable) {
10134
- this.accumulableTable.correctCount = event.detail.correctCount;
10135
- this.accumulableTable.errorCount = event.detail.errorCount;
10136
- this.accumulableTable.nrCount = event.detail.nrCount;
10137
- this.accumulableTable.accuracy = event.detail.accuracy;
10138
- this.accumulableTable.correctMeanRT = event.detail.correctMeanRT;
10139
- this.accumulableTable.errorMeanRT = event.detail.errorMeanRT;
10140
- this.accumulableTable.meanRT = event.detail.meanRT;
10141
- this.accumulableTable.correctSDRT = event.detail.correctSDRT;
10142
- this.accumulableTable.errorSDRT = event.detail.errorSDRT;
10143
- this.accumulableTable.sdRT = event.detail.sdRT;
10144
- }
10413
+ this.data = event.detail.data;
10145
10414
  if (this.ddmModel) {
10146
10415
  this.ddmModel.trial({
10147
10416
  index: event.detail.trial,
@@ -10151,34 +10420,73 @@
10151
10420
  }
10152
10421
  if (this.ddmFit) {
10153
10422
  this.ddmFit.set({
10154
- accuracy: event.detail.accuracy,
10155
- correctMeanRT: event.detail.correctMeanRT,
10156
- errorMeanRT: event.detail.errorMeanRT,
10157
- meanRT: event.detail.meanRT,
10158
- correctSDRT: event.detail.correctSDRT,
10159
- errorSDRT: event.detail.errorSDRT,
10160
- sdRT: event.detail.sdRT
10423
+ accuracy: event.detail.data.accuracy,
10424
+ correctMeanRT: event.detail.data.correctMeanRT,
10425
+ errorMeanRT: event.detail.data.errorMeanRT,
10426
+ meanRT: event.detail.data.meanRT,
10427
+ correctSDRT: event.detail.data.correctSDRT,
10428
+ errorSDRT: event.detail.data.errorSDRT,
10429
+ sdRT: event.detail.data.sdRT
10161
10430
  });
10162
10431
  }
10432
+ this.requestUpdate();
10163
10433
  });
10164
10434
  }
10165
10435
  if (this.ddmFit) {
10166
10436
  this.ddmFit.addEventListener('ddm-fit-update', event => {
10167
- if (this.ddmParameters) {
10168
- this.ddmParameters.a = event.detail.a;
10169
- this.ddmParameters.z = 0.5; // event.detail.z;
10170
- this.ddmParameters.v = event.detail.v;
10171
- this.ddmParameters.t0 = event.detail.t0;
10172
- }
10173
- if (this.ddmModel) {
10174
- this.ddmModel.a = event.detail.a;
10175
- this.ddmModel.z = 0.5; // event.detail.z;
10176
- this.ddmModel.v = event.detail.v;
10177
- this.ddmModel.t0 = event.detail.t0;
10178
- }
10437
+ this.a = event.detail.a;
10438
+ this.z = 0.5; // event.detail.z;
10439
+ this.v = event.detail.v;
10440
+ this.t0 = event.detail.t0;
10179
10441
  });
10180
10442
  }
10181
10443
  }
10444
+ update(changedProperties) {
10445
+ super.update(changedProperties);
10446
+ if (this.accumulableControl) {
10447
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10448
+ this.accumulableControl.duration = this.accumulableControl.duration != null ? this.duration : undefined;
10449
+ this.accumulableControl.coherence = this.accumulableControl.coherence != null ? this.coherence : undefined;
10450
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10451
+ }
10452
+ if (this.rdkTask) {
10453
+ this.rdkTask.trials = this.trials;
10454
+ this.rdkTask.duration = this.duration;
10455
+ this.rdkTask.wait = this.duration;
10456
+ this.rdkTask.iti = this.duration;
10457
+ this.rdkTask.coherence = this.coherence;
10458
+ }
10459
+ if (this.ddmParameters) {
10460
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10461
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10462
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10463
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10464
+ }
10465
+ if (this.ddmModel) {
10466
+ this.ddmModel.a = +this.a;
10467
+ this.ddmModel.z = +this.z;
10468
+ this.ddmModel.v = +this.v;
10469
+ this.ddmModel.t0 = +this.t0;
10470
+ }
10471
+ if (this.accumulableResponse) {
10472
+ this.accumulableResponse.trialTotal = this.trials;
10473
+ }
10474
+ if (this.accumulableTable) {
10475
+ this.accumulableTable.color = this.color;
10476
+ }
10477
+ if (this.accumulableTable && this.data) {
10478
+ this.accumulableTable.correctCount = this.data.correctCount;
10479
+ this.accumulableTable.errorCount = this.data.errorCount;
10480
+ this.accumulableTable.nrCount = this.data.nrCount;
10481
+ this.accumulableTable.accuracy = this.data.accuracy;
10482
+ this.accumulableTable.correctMeanRT = this.data.correctMeanRT;
10483
+ this.accumulableTable.errorMeanRT = this.data.errorMeanRT;
10484
+ this.accumulableTable.meanRT = this.data.meanRT;
10485
+ this.accumulableTable.correctSDRT = this.data.correctSDRT;
10486
+ this.accumulableTable.errorSDRT = this.data.errorSDRT;
10487
+ this.accumulableTable.sdRT = this.data.sdRT;
10488
+ }
10489
+ }
10182
10490
  }
10183
10491
  customElements.define('ddm-example-human', DDMExampleHuman);
10184
10492
 
@@ -10194,6 +10502,11 @@
10194
10502
  type: Number,
10195
10503
  reflect: true
10196
10504
  },
10505
+ color: {
10506
+ attribute: 'color',
10507
+ type: String,
10508
+ reflect: true
10509
+ },
10197
10510
  a: {
10198
10511
  attribute: 'boundary-separation',
10199
10512
  type: Number,
@@ -10219,10 +10532,12 @@
10219
10532
  constructor() {
10220
10533
  super();
10221
10534
  this.trials = 10;
10222
- this.a = 1.2;
10223
- this.z = 0.35;
10224
- this.v = 1.5;
10225
- this.t0 = 150;
10535
+ this.colors = ['none', 'measure', 'outcome', 'all'];
10536
+ this.color = 'outcome';
10537
+ this.a = DDMMath.a.DEFAULT;
10538
+ this.z = DDMMath.z.DEFAULT;
10539
+ this.v = DDMMath.v.DEFAULT;
10540
+ this.t0 = DDMMath.t0.DEFAULT;
10226
10541
  this.accumulableControl = null;
10227
10542
  this.accumulableTable = null;
10228
10543
  this.ddmParameters = null;
@@ -10237,7 +10552,7 @@
10237
10552
  this.ddmParameters = this.querySelector('ddm-parameters');
10238
10553
  this.ddmModel = this.querySelector('ddm-model');
10239
10554
  if (this.accumulableControl) {
10240
- this.accumulableControl.addEventListener('accumulable-control-resample', ( /* event */
10555
+ this.accumulableControl.addEventListener('accumulable-control-resample', (/* event */
10241
10556
  ) => {
10242
10557
  this.ddmModel?.resample();
10243
10558
  this.requestUpdate();
@@ -10245,6 +10560,9 @@
10245
10560
  this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10246
10561
  this.trials = event.detail.trials;
10247
10562
  });
10563
+ this.accumulableControl.addEventListener('accumulable-control-color', event => {
10564
+ this.color = event.detail.color;
10565
+ });
10248
10566
  }
10249
10567
  if (this.ddmParameters) {
10250
10568
  this.ddmParameters.addEventListener('ddm-parameters-a', event => {
@@ -10284,7 +10602,11 @@
10284
10602
  update(changedProperties) {
10285
10603
  super.update(changedProperties);
10286
10604
  if (this.accumulableControl) {
10287
- this.accumulableControl.trials = this.trials;
10605
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10606
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10607
+ }
10608
+ if (this.accumulableTable) {
10609
+ this.accumulableTable.color = this.color;
10288
10610
  }
10289
10611
  if (this.accumulableTable && this.data) {
10290
10612
  this.accumulableTable.correctCount = this.data.correctCount;
@@ -10299,10 +10621,10 @@
10299
10621
  this.accumulableTable.sdRT = this.data.sdRT;
10300
10622
  }
10301
10623
  if (this.ddmParameters) {
10302
- this.ddmParameters.a = this.a;
10303
- this.ddmParameters.z = this.z;
10304
- this.ddmParameters.v = this.v;
10305
- this.ddmParameters.t0 = this.t0;
10624
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10625
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10626
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10627
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10306
10628
  }
10307
10629
  if (this.ddmModel) {
10308
10630
  this.ddmModel.trials = this.trials;
@@ -10315,9 +10637,6 @@
10315
10637
  }
10316
10638
  customElements.define('ddm-example-interactive', DDMExampleInteractive);
10317
10639
 
10318
- // import DDMMath from '@decidables/accumulable-math';
10319
-
10320
-
10321
10640
  /*
10322
10641
  DDMExampleModel element
10323
10642
  <ddm-example-model>
@@ -10374,10 +10693,10 @@
10374
10693
  this.coherence = 0.5;
10375
10694
  this.colors = ['none', 'measure', 'outcome', 'all'];
10376
10695
  this.color = 'outcome';
10377
- this.a = 1.2;
10378
- this.z = 0.35;
10379
- this.v = 1.5;
10380
- this.t0 = 150;
10696
+ this.a = DDMMath.a.DEFAULT;
10697
+ this.z = DDMMath.z.DEFAULT;
10698
+ this.v = DDMMath.v.DEFAULT;
10699
+ this.t0 = DDMMath.t0.DEFAULT;
10381
10700
  this.accumulableControl = null;
10382
10701
  this.rdkTask = null;
10383
10702
  this.ddmParameters = null;
@@ -10399,60 +10718,48 @@
10399
10718
  this.accumulableResponse = this.querySelector('accumulable-response');
10400
10719
  this.accumulableTable = this.querySelector('accumulable-table');
10401
10720
  if (this.accumulableControl) {
10402
- if (this.accumulableControl.hasAttribute('trials')) {
10403
- this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10404
- this.trials = event.detail.trials;
10405
- });
10406
- }
10407
- if (this.accumulableControl.hasAttribute('duration')) {
10408
- this.accumulableControl.addEventListener('accumulable-control-duration', event => {
10409
- this.duration = event.detail.duration;
10410
- });
10411
- }
10412
- if (this.accumulableControl.hasAttribute('color')) {
10413
- this.accumulableControl.addEventListener('accumulable-control-color', event => {
10414
- this.color = event.detail.color;
10415
- });
10416
- }
10417
- if (this.accumulableControl.hasAttribute('run')) {
10418
- this.accumulableControl.addEventListener('accumulable-control-run', ( /* event */
10419
- ) => {
10420
- if (this.rdkTask) {
10421
- this.rdkTask.running = true;
10422
- }
10423
- if (this.ddmModel) {
10424
- this.ddmModel.resumeTrial();
10425
- }
10426
- });
10427
- }
10428
- if (this.accumulableControl.hasAttribute('pause')) {
10429
- this.accumulableControl.addEventListener('accumulable-control-pause', ( /* event */
10430
- ) => {
10431
- if (this.rdkTask) {
10432
- this.rdkTask.running = false;
10433
- }
10434
- if (this.ddmModel) {
10435
- this.ddmModel.pauseTrial();
10436
- }
10437
- });
10438
- }
10439
- if (this.accumulableControl.hasAttribute('reset')) {
10440
- this.accumulableControl.addEventListener('accumulable-control-reset', ( /* event */
10441
- ) => {
10442
- this.trialCount = 0;
10443
- this.signal = undefined;
10444
- if (this.rdkTask) {
10445
- this.rdkTask.reset();
10446
- }
10447
- if (this.ddmModel) {
10448
- this.ddmModel.trials = this.trialCount;
10449
- }
10450
- if (this.accumulableResponse) {
10451
- this.accumulableResponse.reset();
10452
- }
10453
- if (this.accumulableTable) ;
10454
- });
10455
- }
10721
+ this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10722
+ this.trials = event.detail.trials;
10723
+ });
10724
+ this.accumulableControl.addEventListener('accumulable-control-duration', event => {
10725
+ this.duration = event.detail.duration;
10726
+ });
10727
+ this.accumulableControl.addEventListener('accumulable-control-color', event => {
10728
+ this.color = event.detail.color;
10729
+ });
10730
+ this.accumulableControl.addEventListener('accumulable-control-run', (/* event */
10731
+ ) => {
10732
+ if (this.rdkTask) {
10733
+ this.rdkTask.running = true;
10734
+ }
10735
+ if (this.ddmModel) {
10736
+ this.ddmModel.resumeTrial();
10737
+ }
10738
+ });
10739
+ this.accumulableControl.addEventListener('accumulable-control-pause', (/* event */
10740
+ ) => {
10741
+ if (this.rdkTask) {
10742
+ this.rdkTask.running = false;
10743
+ }
10744
+ if (this.ddmModel) {
10745
+ this.ddmModel.pauseTrial();
10746
+ }
10747
+ });
10748
+ this.accumulableControl.addEventListener('accumulable-control-reset', (/* event */
10749
+ ) => {
10750
+ this.trialCount = 0;
10751
+ this.signal = undefined;
10752
+ if (this.rdkTask) {
10753
+ this.rdkTask.reset();
10754
+ }
10755
+ if (this.ddmModel) {
10756
+ this.ddmModel.trials = this.trialCount;
10757
+ }
10758
+ if (this.accumulableResponse) {
10759
+ this.accumulableResponse.reset();
10760
+ }
10761
+ if (this.accumulableTable) ;
10762
+ });
10456
10763
  }
10457
10764
  if (this.rdkTask) {
10458
10765
  this.rdkTask.addEventListener('rdk-trial-start', event => {
@@ -10465,14 +10772,14 @@
10465
10772
  this.ddmModel.trial();
10466
10773
  }
10467
10774
  });
10468
- this.rdkTask.addEventListener('rdk-trial-end', ( /* event */
10775
+ this.rdkTask.addEventListener('rdk-trial-end', (/* event */
10469
10776
  ) => {
10470
10777
  this.signal = undefined;
10471
10778
  if (this.accumulableResponse) {
10472
10779
  this.accumulableResponse.stop();
10473
10780
  }
10474
10781
  });
10475
- this.rdkTask.addEventListener('rdk-block-end', ( /* event */
10782
+ this.rdkTask.addEventListener('rdk-block-end', (/* event */
10476
10783
  ) => {
10477
10784
  if (this.accumulableControl) {
10478
10785
  this.accumulableControl.complete();
@@ -10511,17 +10818,15 @@
10511
10818
  this.model = event.detail.model;
10512
10819
  this.requestUpdate();
10513
10820
  });
10514
- if (this.ddmModel) {
10515
- this.ddmModel.addEventListener('accumulable-response', event => {
10516
- if (this.accumulableResponse) {
10517
- const response = event.detail.outcome === 'correct' ? this.signal : this.signal === 'left' ? 'right' : 'left';
10518
- this.accumulableResponse.responded(response);
10519
- }
10520
- this.data = event.detail.data;
10521
- this.model = event.detail.model;
10522
- this.requestUpdate();
10523
- });
10524
- }
10821
+ this.ddmModel.addEventListener('accumulable-response', event => {
10822
+ if (this.accumulableResponse) {
10823
+ const response = event.detail.outcome === 'correct' ? this.signal : this.signal === 'left' ? 'right' : 'left';
10824
+ this.accumulableResponse.responded(response);
10825
+ }
10826
+ this.data = event.detail.data;
10827
+ this.model = event.detail.model;
10828
+ this.requestUpdate();
10829
+ });
10525
10830
  }
10526
10831
  this.requestUpdate();
10527
10832
  }
@@ -10531,10 +10836,10 @@
10531
10836
  this.trialCount = this.trials;
10532
10837
  }
10533
10838
  if (this.accumulableControl) {
10534
- this.accumulableControl.trials = this.trials;
10535
- this.accumulableControl.duration = this.duration;
10536
- this.accumulableControl.coherence = this.coherence;
10537
- this.accumulableControl.color = this.color;
10839
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10840
+ this.accumulableControl.duration = this.accumulableControl.duration != null ? this.duration : undefined;
10841
+ this.accumulableControl.coherence = this.accumulableControl.coherence != null ? this.coherence : undefined;
10842
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10538
10843
  }
10539
10844
  if (this.rdkTask) {
10540
10845
  this.rdkTask.trials = this.trials;
@@ -10542,10 +10847,10 @@
10542
10847
  this.rdkTask.coherence = this.coherence;
10543
10848
  }
10544
10849
  if (this.ddmParameters) {
10545
- this.ddmParameters.a = this.a;
10546
- this.ddmParameters.z = this.z;
10547
- this.ddmParameters.v = this.v;
10548
- this.ddmParameters.t0 = this.t0;
10850
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10851
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10852
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10853
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10549
10854
  }
10550
10855
  if (this.ddmModel) {
10551
10856
  this.ddmModel.trials = this.trialCount;