@decidables/accumulable-elements 0.1.3 → 0.2.1

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 && (undefined === t$1.ShadyCSS || t$1.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
14
- s$1 = Symbol(),
15
- o$3 = new WeakMap();
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(),
15
+ o$4 = new WeakMap();
16
16
  let n$2 = class n {
17
17
  constructor(t, e, o) {
18
- if (this._$cssResult$ = true, o !== s$1) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
18
+ if (this._$cssResult$ = true, o !== s$2) 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 && 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));
24
+ if (e$2 && void 0 === t) {
25
+ const e = void 0 !== s && 1 === s.length;
26
+ e && (t = o$4.get(s)), void 0 === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && o$4.set(s, t));
27
27
  }
28
28
  return t;
29
29
  }
@@ -31,26 +31,26 @@
31
31
  return this.cssText;
32
32
  }
33
33
  };
34
- const r$3 = t => new n$2("string" == typeof t ? t : t + "", undefined, s$1),
34
+ const r$2 = t => new n$2("string" == typeof t ? t : t + "", void 0, s$2),
35
35
  i$3 = (t, ...e) => {
36
36
  const o = 1 === t.length ? t[0] : e.reduce((e, s, o) => e + (t => {
37
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$1);
41
+ return new n$2(o, t, s$2);
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
- undefined !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
47
+ void 0 !== 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 => {
51
51
  let e = "";
52
52
  for (const s of t.cssRules) e += s.cssText;
53
- return r$3(e);
53
+ return r$2(e);
54
54
  })(t) : t;
55
55
 
56
56
  /**
@@ -61,9 +61,9 @@
61
61
  const {
62
62
  is: i$2,
63
63
  defineProperty: e$1,
64
- getOwnPropertyDescriptor: r$2,
65
- getOwnPropertyNames: h$1,
66
- getOwnPropertySymbols: o$2,
64
+ getOwnPropertyDescriptor: h$1,
65
+ getOwnPropertyNames: r$1,
66
+ getOwnPropertySymbols: o$3,
67
67
  getPrototypeOf: n$1
68
68
  } = Object,
69
69
  a$1 = globalThis,
@@ -104,33 +104,34 @@
104
104
  }
105
105
  },
106
106
  f$1 = (t, s) => !i$2(t, s),
107
- y$2 = {
107
+ b$1 = {
108
108
  attribute: true,
109
109
  type: String,
110
110
  converter: u$1,
111
111
  reflect: false,
112
+ useDefault: false,
112
113
  hasChanged: f$1
113
114
  };
114
115
  Symbol.metadata ??= Symbol("metadata"), a$1.litPropertyMetadata ??= new WeakMap();
115
- let b$1 = class b extends HTMLElement {
116
+ let y$2 = class y extends HTMLElement {
116
117
  static addInitializer(t) {
117
118
  this._$Ei(), (this.l ??= []).push(t);
118
119
  }
119
120
  static get observedAttributes() {
120
121
  return this.finalize(), this._$Eh && [...this._$Eh.keys()];
121
122
  }
122
- static createProperty(t, s = y$2) {
123
- if (s.state && (s.attribute = false), this._$Ei(), this.elementProperties.set(t, s), !s.noAccessor) {
123
+ static createProperty(t, s = b$1) {
124
+ if (s.state && (s.attribute = false), this._$Ei(), this.prototype.hasOwnProperty(t) && ((s = Object.create(s)).wrapped = true), this.elementProperties.set(t, s), !s.noAccessor) {
124
125
  const i = Symbol(),
125
- r = this.getPropertyDescriptor(t, i, s);
126
- undefined !== r && e$1(this.prototype, t, r);
126
+ h = this.getPropertyDescriptor(t, i, s);
127
+ void 0 !== h && e$1(this.prototype, t, h);
127
128
  }
128
129
  }
129
130
  static getPropertyDescriptor(t, s, i) {
130
131
  const {
131
132
  get: e,
132
- set: h
133
- } = r$2(this.prototype, t) ?? {
133
+ set: r
134
+ } = h$1(this.prototype, t) ?? {
134
135
  get() {
135
136
  return this[s];
136
137
  },
@@ -139,41 +140,39 @@
139
140
  }
140
141
  };
141
142
  return {
142
- get() {
143
- return e?.call(this);
144
- },
143
+ get: e,
145
144
  set(s) {
146
- const r = e?.call(this);
147
- h.call(this, s), this.requestUpdate(t, r, i);
145
+ const h = e?.call(this);
146
+ r?.call(this, s), this.requestUpdate(t, h, i);
148
147
  },
149
148
  configurable: true,
150
149
  enumerable: true
151
150
  };
152
151
  }
153
152
  static getPropertyOptions(t) {
154
- return this.elementProperties.get(t) ?? y$2;
153
+ return this.elementProperties.get(t) ?? b$1;
155
154
  }
156
155
  static _$Ei() {
157
156
  if (this.hasOwnProperty(d$1("elementProperties"))) return;
158
157
  const t = n$1(this);
159
- t.finalize(), undefined !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
158
+ t.finalize(), void 0 !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
160
159
  }
161
160
  static finalize() {
162
161
  if (this.hasOwnProperty(d$1("finalized"))) return;
163
162
  if (this.finalized = true, this._$Ei(), this.hasOwnProperty(d$1("properties"))) {
164
163
  const t = this.properties,
165
- s = [...h$1(t), ...o$2(t)];
164
+ s = [...r$1(t), ...o$3(t)];
166
165
  for (const i of s) this.createProperty(i, t[i]);
167
166
  }
168
167
  const t = this[Symbol.metadata];
169
168
  if (null !== t) {
170
169
  const s = litPropertyMetadata.get(t);
171
- if (undefined !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
170
+ if (void 0 !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
172
171
  }
173
172
  this._$Eh = new Map();
174
173
  for (const [t, s] of this.elementProperties) {
175
174
  const i = this._$Eu(t, s);
176
- undefined !== i && this._$Eh.set(i, t);
175
+ void 0 !== i && this._$Eh.set(i, t);
177
176
  }
178
177
  this.elementStyles = this.finalizeStyles(this.styles);
179
178
  }
@@ -182,21 +181,21 @@
182
181
  if (Array.isArray(s)) {
183
182
  const e = new Set(s.flat(1 / 0).reverse());
184
183
  for (const s of e) i.unshift(c$2(s));
185
- } else undefined !== s && i.push(c$2(s));
184
+ } else void 0 !== s && i.push(c$2(s));
186
185
  return i;
187
186
  }
188
187
  static _$Eu(t, s) {
189
188
  const i = s.attribute;
190
- return false === i ? undefined : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : undefined;
189
+ return false === i ? void 0 : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : void 0;
191
190
  }
192
191
  constructor() {
193
- super(), this._$Ep = undefined, this.isUpdatePending = false, this.hasUpdated = false, this._$Em = null, this._$Ev();
192
+ super(), this._$Ep = void 0, this.isUpdatePending = false, this.hasUpdated = false, this._$Em = null, this._$Ev();
194
193
  }
195
194
  _$Ev() {
196
195
  this._$ES = new Promise(t => this.enableUpdating = t), this._$AL = new Map(), this._$E_(), this.requestUpdate(), this.constructor.l?.forEach(t => t(this));
197
196
  }
198
197
  addController(t) {
199
- (this._$EO ??= new Set()).add(t), undefined !== this.renderRoot && this.isConnected && t.hostConnected?.();
198
+ (this._$EO ??= new Set()).add(t), void 0 !== this.renderRoot && this.isConnected && t.hostConnected?.();
200
199
  }
201
200
  removeController(t) {
202
201
  this._$EO?.delete(t);
@@ -221,36 +220,44 @@
221
220
  attributeChangedCallback(t, s, i) {
222
221
  this._$AK(t, i);
223
222
  }
224
- _$EC(t, s) {
223
+ _$ET(t, s) {
225
224
  const i = this.constructor.elementProperties.get(t),
226
225
  e = this.constructor._$Eu(t, i);
227
- if (undefined !== e && true === i.reflect) {
228
- const r = (undefined !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
229
- this._$Em = t, null == r ? this.removeAttribute(e) : this.setAttribute(e, r), this._$Em = null;
226
+ if (void 0 !== e && true === i.reflect) {
227
+ const h = (void 0 !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
228
+ this._$Em = t, null == h ? this.removeAttribute(e) : this.setAttribute(e, h), this._$Em = null;
230
229
  }
231
230
  }
232
231
  _$AK(t, s) {
233
232
  const i = this.constructor,
234
233
  e = i._$Eh.get(t);
235
- if (undefined !== e && this._$Em !== e) {
234
+ if (void 0 !== e && this._$Em !== e) {
236
235
  const t = i.getPropertyOptions(e),
237
- r = "function" == typeof t.converter ? {
236
+ h = "function" == typeof t.converter ? {
238
237
  fromAttribute: t.converter
239
- } : undefined !== t.converter?.fromAttribute ? t.converter : u$1;
240
- this._$Em = e, this[e] = r.fromAttribute(s, t.type), this._$Em = null;
238
+ } : void 0 !== t.converter?.fromAttribute ? t.converter : u$1;
239
+ this._$Em = e;
240
+ const r = h.fromAttribute(s, t.type);
241
+ this[e] = r ?? this._$Ej?.get(e) ?? r, this._$Em = null;
241
242
  }
242
243
  }
243
244
  requestUpdate(t, s, i) {
244
- if (undefined !== t) {
245
- if (i ??= this.constructor.getPropertyOptions(t), !(i.hasChanged ?? f$1)(this[t], s)) return;
246
- this.P(t, s, i);
247
- }
248
- false === this.isUpdatePending && (this._$ES = this._$ET());
249
- }
250
- P(t, s, i) {
251
- this._$AL.has(t) || this._$AL.set(t, s), true === i.reflect && this._$Em !== t && (this._$Ej ??= new Set()).add(t);
252
- }
253
- async _$ET() {
245
+ if (void 0 !== t) {
246
+ const e = this.constructor,
247
+ h = this[t];
248
+ if (i ??= e.getPropertyOptions(t), !((i.hasChanged ?? f$1)(h, s) || i.useDefault && i.reflect && h === this._$Ej?.get(t) && !this.hasAttribute(e._$Eu(t, i)))) return;
249
+ this.C(t, s, i);
250
+ }
251
+ false === this.isUpdatePending && (this._$ES = this._$EP());
252
+ }
253
+ C(t, s, {
254
+ useDefault: i,
255
+ reflect: e,
256
+ wrapped: h
257
+ }, r) {
258
+ i && !(this._$Ej ??= new Map()).has(t) && (this._$Ej.set(t, r ?? s ?? this[t]), true !== h || void 0 !== r) || (this._$AL.has(t) || (this.hasUpdated || i || (s = void 0), this._$AL.set(t, s)), true === e && this._$Em !== t && (this._$Eq ??= new Set()).add(t));
259
+ }
260
+ async _$EP() {
254
261
  this.isUpdatePending = true;
255
262
  try {
256
263
  await this._$ES;
@@ -268,17 +275,23 @@
268
275
  if (!this.hasUpdated) {
269
276
  if (this.renderRoot ??= this.createRenderRoot(), this._$Ep) {
270
277
  for (const [t, s] of this._$Ep) this[t] = s;
271
- this._$Ep = undefined;
278
+ this._$Ep = void 0;
272
279
  }
273
280
  const t = this.constructor.elementProperties;
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);
281
+ if (t.size > 0) for (const [s, i] of t) {
282
+ const {
283
+ wrapped: t
284
+ } = i,
285
+ e = this[s];
286
+ true !== t || this._$AL.has(s) || void 0 === e || this.C(s, void 0, i, e);
287
+ }
275
288
  }
276
289
  let t = false;
277
290
  const s = this._$AL;
278
291
  try {
279
- t = this.shouldUpdate(s), t ? (this.willUpdate(s), this._$EO?.forEach(t => t.hostUpdate?.()), this.update(s)) : this._$EU();
292
+ t = this.shouldUpdate(s), t ? (this.willUpdate(s), this._$EO?.forEach(t => t.hostUpdate?.()), this.update(s)) : this._$EM();
280
293
  } catch (s) {
281
- throw t = false, this._$EU(), s;
294
+ throw t = false, this._$EM(), s;
282
295
  }
283
296
  t && this._$AE(s);
284
297
  }
@@ -286,7 +299,7 @@
286
299
  _$AE(t) {
287
300
  this._$EO?.forEach(t => t.hostUpdated?.()), this.hasUpdated || (this.hasUpdated = true, this.firstUpdated(t)), this.updated(t);
288
301
  }
289
- _$EU() {
302
+ _$EM() {
290
303
  this._$AL = new Map(), this.isUpdatePending = false;
291
304
  }
292
305
  get updateComplete() {
@@ -299,16 +312,16 @@
299
312
  return true;
300
313
  }
301
314
  update(t) {
302
- this._$Ej &&= this._$Ej.forEach(t => this._$EC(t, this[t])), this._$EU();
315
+ this._$Eq &&= this._$Eq.forEach(t => this._$ET(t, this[t])), this._$EM();
303
316
  }
304
317
  updated(t) {}
305
318
  firstUpdated(t) {}
306
319
  };
307
- b$1.elementStyles = [], b$1.shadowRootOptions = {
320
+ y$2.elementStyles = [], y$2.shadowRootOptions = {
308
321
  mode: "open"
309
- }, b$1[d$1("elementProperties")] = new Map(), b$1[d$1("finalized")] = new Map(), p$1?.({
310
- ReactiveElement: b$1
311
- }), (a$1.reactiveElementVersions ??= []).push("2.0.4");
322
+ }, y$2[d$1("elementProperties")] = new Map(), y$2[d$1("finalized")] = new Map(), p$1?.({
323
+ ReactiveElement: y$2
324
+ }), (a$1.reactiveElementVersions ??= []).push("2.1.1");
312
325
 
313
326
  /**
314
327
  * @license
@@ -317,15 +330,15 @@
317
330
  */
318
331
  const t = globalThis,
319
332
  i$1 = t.trustedTypes,
320
- s = i$1 ? i$1.createPolicy("lit-html", {
333
+ s$1 = i$1 ? i$1.createPolicy("lit-html", {
321
334
  createHTML: t => t
322
- }) : undefined,
335
+ }) : void 0,
323
336
  e = "$lit$",
324
337
  h = `lit$${Math.random().toFixed(9).slice(2)}$`,
325
- o$1 = "?" + h,
326
- n = `<${o$1}>`,
327
- r$1 = document,
328
- l = () => r$1.createComment(""),
338
+ o$2 = "?" + h,
339
+ n = `<${o$2}>`,
340
+ r = document,
341
+ l = () => r.createComment(""),
329
342
  c = t => null === t || "object" != typeof t && "function" != typeof t,
330
343
  a = Array.isArray,
331
344
  u = t => a(t) || "function" == typeof t?.[Symbol.iterator],
@@ -347,10 +360,10 @@
347
360
  T = Symbol.for("lit-noChange"),
348
361
  E = Symbol.for("lit-nothing"),
349
362
  A = new WeakMap(),
350
- C = r$1.createTreeWalker(r$1, 129);
363
+ C = r.createTreeWalker(r, 129);
351
364
  function P(t, i) {
352
365
  if (!a(t) || !t.hasOwnProperty("raw")) throw Error("invalid template strings array");
353
- return undefined !== s ? s.createHTML(i) : i;
366
+ return void 0 !== s$1 ? s$1.createHTML(i) : i;
354
367
  }
355
368
  const V = (t, i) => {
356
369
  const s = t.length - 1,
@@ -364,7 +377,7 @@
364
377
  u,
365
378
  d = -1,
366
379
  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 : 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);
380
+ 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);
368
381
  const x = c === m && t[i + 1].startsWith("/>") ? " " : "";
369
382
  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
383
  }
@@ -415,7 +428,7 @@
415
428
  r.append(t[s], l());
416
429
  }
417
430
  }
418
- } else if (8 === r.nodeType) if (r.data === o$1) d.push({
431
+ } else if (8 === r.nodeType) if (r.data === o$2) d.push({
419
432
  type: 2,
420
433
  index: c
421
434
  });else {
@@ -429,19 +442,19 @@
429
442
  }
430
443
  }
431
444
  static createElement(t, i) {
432
- const s = r$1.createElement("template");
445
+ const s = r.createElement("template");
433
446
  return s.innerHTML = t, s;
434
447
  }
435
448
  }
436
449
  function S(t, i, s = t, e) {
437
450
  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;
451
+ let h = void 0 !== e ? s._$Co?.[e] : s._$Cl;
452
+ const o = c(i) ? void 0 : i._$litDirective$;
453
+ return h?.constructor !== o && (h?._$AO?.(false), 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 = S(t, h._$AS(t, i.values), h, e)), i;
441
454
  }
442
455
  class M {
443
456
  constructor(t, i) {
444
- this._$AV = [], this._$AN = undefined, this._$AD = t, this._$AM = i;
457
+ this._$AV = [], this._$AN = void 0, this._$AD = t, this._$AM = i;
445
458
  }
446
459
  get parentNode() {
447
460
  return this._$AM.parentNode;
@@ -456,24 +469,24 @@
456
469
  },
457
470
  parts: s
458
471
  } = this._$AD,
459
- e = (t?.creationScope ?? r$1).importNode(i, true);
472
+ e = (t?.creationScope ?? r).importNode(i, true);
460
473
  C.currentNode = e;
461
474
  let h = C.nextNode(),
462
475
  o = 0,
463
476
  n = 0,
464
477
  l = s[0];
465
- for (; undefined !== l;) {
478
+ for (; void 0 !== l;) {
466
479
  if (o === l.index) {
467
480
  let i;
468
481
  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
482
  }
470
483
  o !== l?.index && (h = C.nextNode(), o++);
471
484
  }
472
- return C.currentNode = r$1, e;
485
+ return C.currentNode = r, e;
473
486
  }
474
487
  p(t) {
475
488
  let i = 0;
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++;
489
+ 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++;
477
490
  }
478
491
  }
479
492
  class R {
@@ -481,12 +494,12 @@
481
494
  return this._$AM?._$AU ?? this._$Cv;
482
495
  }
483
496
  constructor(t, i, s, e) {
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;
497
+ this.type = 2, this._$AH = E, this._$AN = void 0, this._$AA = t, this._$AB = i, this._$AM = s, this.options = e, this._$Cv = e?.isConnected ?? true;
485
498
  }
486
499
  get parentNode() {
487
500
  let t = this._$AA.parentNode;
488
501
  const i = this._$AM;
489
- return undefined !== i && 11 === t?.nodeType && (t = i.parentNode), t;
502
+ return void 0 !== i && 11 === t?.nodeType && (t = i.parentNode), t;
490
503
  }
491
504
  get startNode() {
492
505
  return this._$AA;
@@ -495,7 +508,7 @@
495
508
  return this._$AB;
496
509
  }
497
510
  _$AI(t, i = this) {
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);
511
+ 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) : void 0 !== t._$litType$ ? this.$(t) : void 0 !== t.nodeType ? this.T(t) : u(t) ? this.k(t) : this._(t);
499
512
  }
500
513
  O(t) {
501
514
  return this._$AA.parentNode.insertBefore(t, this._$AB);
@@ -504,14 +517,14 @@
504
517
  this._$AH !== t && (this._$AR(), this._$AH = this.O(t));
505
518
  }
506
519
  _(t) {
507
- this._$AH !== E && c(this._$AH) ? this._$AA.nextSibling.data = t : this.T(r$1.createTextNode(t)), this._$AH = t;
520
+ this._$AH !== E && c(this._$AH) ? this._$AA.nextSibling.data = t : this.T(r.createTextNode(t)), this._$AH = t;
508
521
  }
509
522
  $(t) {
510
523
  const {
511
524
  values: i,
512
525
  _$litType$: s
513
526
  } = t,
514
- e = "number" == typeof s ? this._$AC(t) : (undefined === s.el && (s.el = N.createElement(P(s.h, s.h[0]), this.options)), s);
527
+ e = "number" == typeof s ? this._$AC(t) : (void 0 === s.el && (s.el = N.createElement(P(s.h, s.h[0]), this.options)), s);
515
528
  if (this._$AH?._$AD === e) this._$AH.p(i);else {
516
529
  const t = new M(e, this),
517
530
  s = t.u(this.options);
@@ -520,7 +533,7 @@
520
533
  }
521
534
  _$AC(t) {
522
535
  let i = A.get(t.strings);
523
- return undefined === i && A.set(t.strings, i = new N(t)), i;
536
+ return void 0 === i && A.set(t.strings, i = new N(t)), i;
524
537
  }
525
538
  k(t) {
526
539
  a(this._$AH) || (this._$AH = [], this._$AR());
@@ -531,13 +544,13 @@
531
544
  e < i.length && (this._$AR(s && s._$AB.nextSibling, e), i.length = e);
532
545
  }
533
546
  _$AR(t = this._$AA.nextSibling, i) {
534
- for (this._$AP?.(false, true, i); t && t !== this._$AB;) {
547
+ for (this._$AP?.(false, true, i); t !== this._$AB;) {
535
548
  const i = t.nextSibling;
536
549
  t.remove(), t = i;
537
550
  }
538
551
  }
539
552
  setConnected(t) {
540
- undefined === this._$AM && (this._$Cv = t, this._$AP?.(t));
553
+ void 0 === this._$AM && (this._$Cv = t, this._$AP?.(t));
541
554
  }
542
555
  }
543
556
  class k {
@@ -548,12 +561,12 @@
548
561
  return this._$AM._$AU;
549
562
  }
550
563
  constructor(t, i, s, e, h) {
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;
564
+ this.type = 1, this._$AH = E, 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 = E;
552
565
  }
553
566
  _$AI(t, i = this, s, e) {
554
567
  const h = this.strings;
555
568
  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 {
569
+ if (void 0 === h) t = S(this, t, i, 0), o = !c(t) || t !== this._$AH && t !== T, o && (this._$AH = t);else {
557
570
  const e = t;
558
571
  let n, r;
559
572
  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;
@@ -569,7 +582,7 @@
569
582
  super(...arguments), this.type = 3;
570
583
  }
571
584
  j(t) {
572
- this.element[this.name] = t === E ? undefined : t;
585
+ this.element[this.name] = t === E ? void 0 : t;
573
586
  }
574
587
  }
575
588
  class I extends k {
@@ -597,7 +610,7 @@
597
610
  }
598
611
  class z {
599
612
  constructor(t, i, s) {
600
- this.element = t, this.type = 6, this._$AN = undefined, this._$AM = i, this.options = s;
613
+ this.element = t, this.type = 6, this._$AN = void 0, this._$AM = i, this.options = s;
601
614
  }
602
615
  get _$AU() {
603
616
  return this._$AM._$AU;
@@ -607,13 +620,13 @@
607
620
  }
608
621
  }
609
622
  const j = t.litHtmlPolyfillSupport;
610
- j?.(N, R), (t.litHtmlVersions ??= []).push("3.2.1");
623
+ j?.(N, R), (t.litHtmlVersions ??= []).push("3.3.1");
611
624
  const B = (t, i, s) => {
612
625
  const e = s?.renderBefore ?? i;
613
626
  let h = e._$litPart$;
614
- if (undefined === h) {
627
+ if (void 0 === h) {
615
628
  const t = s?.renderBefore ?? null;
616
- e._$litPart$ = h = new R(i.insertBefore(l(), t), t, undefined, s ?? {});
629
+ e._$litPart$ = h = new R(i.insertBefore(l(), t), t, void 0, s ?? {});
617
630
  }
618
631
  return h._$AI(t), h;
619
632
  };
@@ -623,19 +636,20 @@
623
636
  * Copyright 2017 Google LLC
624
637
  * SPDX-License-Identifier: BSD-3-Clause
625
638
  */
626
- class r extends b$1 {
639
+ const s = globalThis;
640
+ class i extends y$2 {
627
641
  constructor() {
628
642
  super(...arguments), this.renderOptions = {
629
643
  host: this
630
- }, this._$Do = undefined;
644
+ }, this._$Do = void 0;
631
645
  }
632
646
  createRenderRoot() {
633
647
  const t = super.createRenderRoot();
634
648
  return this.renderOptions.renderBefore ??= t.firstChild, t;
635
649
  }
636
650
  update(t) {
637
- const s = this.render();
638
- this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = B(s, this.renderRoot, this.renderOptions);
651
+ const r = this.render();
652
+ this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = B(r, this.renderRoot, this.renderOptions);
639
653
  }
640
654
  connectedCallback() {
641
655
  super.connectedCallback(), this._$Do?.setConnected(true);
@@ -647,14 +661,14 @@
647
661
  return T;
648
662
  }
649
663
  }
650
- r._$litElement$ = true, r["finalized"] = true, globalThis.litElementHydrateSupport?.({
651
- LitElement: r
664
+ i._$litElement$ = true, i["finalized"] = true, s.litElementHydrateSupport?.({
665
+ LitElement: i
652
666
  });
653
- const i = globalThis.litElementPolyfillSupport;
654
- i?.({
655
- LitElement: r
667
+ const o$1 = s.litElementPolyfillSupport;
668
+ o$1?.({
669
+ LitElement: i
656
670
  });
657
- (globalThis.litElementVersions ??= []).push("4.1.1");
671
+ (s.litElementVersions ??= []).push("4.2.1");
658
672
 
659
673
  function ascending$1(a, b) {
660
674
  return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
@@ -4572,7 +4586,7 @@
4572
4586
  DecidablesElement Base Class - Not intended for instantiation!
4573
4587
  <decidables-element>
4574
4588
  */
4575
- class DecidablesElement extends r {
4589
+ class DecidablesElement extends i {
4576
4590
  getComputedStyleValue(property) {
4577
4591
  return getComputedStyle(this).getPropertyValue(property).trim();
4578
4592
  }
@@ -4827,22 +4841,22 @@
4827
4841
  static get styles() {
4828
4842
  return i$3`
4829
4843
  :host {
4830
- ---shadow-0: var(--shadow-0, ${r$3(this.cssBoxShadow(0))});
4831
- ---shadow-2: var(--shadow-2, ${r$3(this.cssBoxShadow(2))});
4832
- ---shadow-4: var(--shadow-4, ${r$3(this.cssBoxShadow(4))});
4833
- ---shadow-8: var(--shadow-8, ${r$3(this.cssBoxShadow(8))});
4834
-
4835
- ---color-background: var(--color-background, ${r$3(this.greys.white)});
4836
- ---color-border: var(--color-border, ${r$3(this.greys.light75)});
4837
- ---color-text: var(--color-text, ${r$3(this.greys.dark75)});
4838
- ---color-text-inverse: var(--color-text-inverse, ${r$3(this.greys.white)});
4839
- ---color-link: var(--color-link, ${r$3(this.greys.dark25)});
4840
- ---color-element-background: var(--color-element-background, ${r$3(this.greys.light75)});
4841
- ---color-element-disabled: var(--color-element-disabled, ${r$3(this.greys.light50)});
4842
- ---color-element-enabled: var(--color-element-enabled, ${r$3(this.greys.dark25)});
4843
- ---color-element-selected: var(--color-element-selected, ${r$3(this.greys.grey)});
4844
- ---color-element-border: var(--color-element-border, ${r$3(this.greys.dark50)});
4845
- ---color-element-emphasis: var(--color-element-emphasis, ${r$3(this.greys.dark75)});
4844
+ ---shadow-0: var(--shadow-0, ${r$2(this.cssBoxShadow(0))});
4845
+ ---shadow-2: var(--shadow-2, ${r$2(this.cssBoxShadow(2))});
4846
+ ---shadow-4: var(--shadow-4, ${r$2(this.cssBoxShadow(4))});
4847
+ ---shadow-8: var(--shadow-8, ${r$2(this.cssBoxShadow(8))});
4848
+
4849
+ ---color-background: var(--color-background, ${r$2(this.greys.white)});
4850
+ ---color-border: var(--color-border, ${r$2(this.greys.light75)});
4851
+ ---color-text: var(--color-text, ${r$2(this.greys.dark75)});
4852
+ ---color-text-inverse: var(--color-text-inverse, ${r$2(this.greys.white)});
4853
+ ---color-link: var(--color-link, ${r$2(this.greys.dark25)});
4854
+ ---color-element-background: var(--color-element-background, ${r$2(this.greys.light75)});
4855
+ ---color-element-disabled: var(--color-element-disabled, ${r$2(this.greys.light50)});
4856
+ ---color-element-enabled: var(--color-element-enabled, ${r$2(this.greys.dark25)});
4857
+ ---color-element-selected: var(--color-element-selected, ${r$2(this.greys.grey)});
4858
+ ---color-element-border: var(--color-element-border, ${r$2(this.greys.dark50)});
4859
+ ---color-element-emphasis: var(--color-element-emphasis, ${r$2(this.greys.dark75)});
4846
4860
 
4847
4861
  ---font-family-base: var(--font-family-base, "Source Sans", sans-serif);
4848
4862
  ---font-family-math: var(--font-family-math, "Source Serif", serif);
@@ -4852,6 +4866,7 @@
4852
4866
  ---transition-duration: var(--transition-duration, 500ms);
4853
4867
 
4854
4868
  font-family: var(---font-family-base);
4869
+ font-weight: normal;
4855
4870
  }
4856
4871
 
4857
4872
  :host,
@@ -4905,6 +4920,9 @@
4905
4920
  static get styles() {
4906
4921
  return [super.styles, i$3`
4907
4922
  :host {
4923
+ ---decidables-button-background-color-disabled: var(--decidables-button-background-color, var(---color-element-disabled));
4924
+ ---decidables-button-background-color-enabled: var(--decidables-button-background-color, var(---color-element-enabled));
4925
+
4908
4926
  margin: 0.25rem;
4909
4927
  }
4910
4928
 
@@ -4924,7 +4942,7 @@
4924
4942
  }
4925
4943
 
4926
4944
  button:disabled {
4927
- background-color: var(--decidables-button-background-color, var(---color-element-disabled));
4945
+ background-color: var(---decidables-button-background-color-disabled);
4928
4946
  outline: none;
4929
4947
  box-shadow: none;
4930
4948
  }
@@ -4932,7 +4950,7 @@
4932
4950
  button:enabled {
4933
4951
  cursor: pointer;
4934
4952
 
4935
- background-color: var(--decidables-button-background-color, var(---color-element-enabled));
4953
+ background-color: var(---decidables-button-background-color-enabled);
4936
4954
  outline: none;
4937
4955
  box-shadow: var(---shadow-2);
4938
4956
  }
@@ -4983,6 +5001,11 @@
4983
5001
  type: Boolean,
4984
5002
  reflect: true
4985
5003
  },
5004
+ scale: {
5005
+ attribute: 'scale',
5006
+ type: Boolean,
5007
+ reflect: true
5008
+ },
4986
5009
  max: {
4987
5010
  attribute: 'max',
4988
5011
  type: Number,
@@ -5002,6 +5025,11 @@
5002
5025
  attribute: 'value',
5003
5026
  type: Number,
5004
5027
  reflect: true
5028
+ },
5029
+ nonlinear: {
5030
+ attribute: false,
5031
+ type: Boolean,
5032
+ reflect: false
5005
5033
  }
5006
5034
  };
5007
5035
  }
@@ -5010,13 +5038,30 @@
5010
5038
 
5011
5039
  // Attributes
5012
5040
  this.disabled = false;
5041
+ this.scale = false;
5013
5042
  this.max = undefined;
5014
5043
  this.min = undefined;
5015
5044
  this.step = undefined;
5016
5045
  this.value = undefined;
5017
- }
5018
- changed(event) {
5019
- this.value = event.target.value;
5046
+ this.nonlinear = false;
5047
+
5048
+ // Properties
5049
+ this.rangeMax = undefined;
5050
+ this.rangeMin = undefined;
5051
+ this.rangeStep = undefined;
5052
+ this.rangeValue = undefined;
5053
+
5054
+ // Transform
5055
+ this.toRange = undefined;
5056
+ this.fromRange = undefined;
5057
+ }
5058
+ nonlinearRange(nonlinear, toRange, fromRange) {
5059
+ this.nonlinear = nonlinear;
5060
+ this.toRange = nonlinear ? toRange : undefined;
5061
+ this.fromRange = nonlinear ? fromRange : undefined;
5062
+ }
5063
+ rangeChanged(event) {
5064
+ this.value = this.nonlinear ? this.fromRange(event.target.value) : event.target.value;
5020
5065
  this.dispatchEvent(new CustomEvent('change', {
5021
5066
  detail: {
5022
5067
  value: this.value
@@ -5024,15 +5069,28 @@
5024
5069
  bubbles: true
5025
5070
  }));
5026
5071
  }
5027
- inputted(event) {
5072
+ rangeInputted(event) {
5073
+ this.value = this.nonlinear ? this.fromRange(event.target.value) : event.target.value;
5074
+ }
5075
+ spinnerInputted(event) {
5028
5076
  this.value = event.target.value;
5029
5077
  }
5078
+ willUpdate() {
5079
+ this.rangeMax = this.max === undefined ? undefined : this.nonlinear ? this.toRange(this.max) : this.max;
5080
+ this.rangeMin = this.min === undefined ? undefined : this.nonlinear ? this.toRange(this.min) : this.min;
5081
+ this.rangeStep = this.step === undefined ? undefined : this.nonlinear ? 'any' : this.step;
5082
+ this.rangeValue = this.value === undefined ? undefined : this.nonlinear ? this.toRange(this.value) : this.value;
5083
+ }
5030
5084
  static get styles() {
5031
5085
  return [super.styles, i$3`
5032
5086
  :host {
5033
- ---shadow-2-rotate: var(--shadow-2-rotate, ${r$3(this.cssBoxShadow(2, true, false))});
5034
- ---shadow-4-rotate: var(--shadow-4-rotate, ${r$3(this.cssBoxShadow(4, true, false))});
5035
- ---shadow-8-rotate: var(--shadow-8-rotate, ${r$3(this.cssBoxShadow(8, true, false))});
5087
+ ---decidables-slider-background-color: var(--decidables-slider-background-color, var(---color-element-disabled));
5088
+ ---decidables-slider-color: var(--decidables-slider-color, var(---color-element-enabled));
5089
+ ---decidables-spinner-background-color: var(--decidables-slider-background-color, none);
5090
+
5091
+ ---shadow-2-rotate: var(--shadow-2-rotate, ${r$2(this.cssBoxShadow(2, true, false))});
5092
+ ---shadow-4-rotate: var(--shadow-4-rotate, ${r$2(this.cssBoxShadow(4, true, false))});
5093
+ ---shadow-8-rotate: var(--shadow-8-rotate, ${r$2(this.cssBoxShadow(8, true, false))});
5036
5094
 
5037
5095
  display: flex;
5038
5096
 
@@ -5047,7 +5105,10 @@
5047
5105
  }
5048
5106
 
5049
5107
  .range {
5050
- display: inline-block;
5108
+ position: relative;
5109
+ display: flex;
5110
+
5111
+ flex-direction: row;
5051
5112
 
5052
5113
  width: 3.5rem;
5053
5114
  height: 4.75rem;
@@ -5058,6 +5119,8 @@
5058
5119
  --decidables-spinner-input-width: 3.5rem;
5059
5120
 
5060
5121
  margin: 0 0.25rem 0.25rem;
5122
+
5123
+ background: var(---decidables-spinner-background-color);
5061
5124
  }
5062
5125
 
5063
5126
  /* Adapted from http://danielstern.ca/range.css/#/ */
@@ -5096,14 +5159,14 @@
5096
5159
  width: 100%;
5097
5160
  height: 4px;
5098
5161
 
5099
- background: var(---color-element-disabled);
5162
+ background: var(---decidables-slider-background-color);
5100
5163
  border: 0;
5101
5164
  border-radius: 2px;
5102
5165
  box-shadow: none;
5103
5166
  }
5104
5167
 
5105
5168
  input[type=range]:focus::-webkit-slider-runnable-track {
5106
- background: var(---color-element-disabled);
5169
+ background: var(---decidables-slider-background-color);
5107
5170
  }
5108
5171
 
5109
5172
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
@@ -5111,7 +5174,7 @@
5111
5174
  width: 100%;
5112
5175
  height: 4px;
5113
5176
 
5114
- background: var(---color-element-disabled);
5177
+ background: var(---decidables-slider-background-color);
5115
5178
  border: 0;
5116
5179
  border-radius: 2px;
5117
5180
  box-shadow: none;
@@ -5131,7 +5194,7 @@
5131
5194
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5132
5195
  input[type=range]::-ms-fill-lower {
5133
5196
  background: #cccccc;
5134
- /* background: var(---color-element-disabled); */
5197
+ /* background: var(---decidables-slider-background-color); */
5135
5198
  border: 0;
5136
5199
  border-radius: 2px;
5137
5200
  box-shadow: none;
@@ -5140,7 +5203,7 @@
5140
5203
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5141
5204
  input[type=range]::-ms-fill-upper {
5142
5205
  background: #cccccc;
5143
- /* background: var(---color-element-disabled); */
5206
+ /* background: var(---decidables-slider-background-color); */
5144
5207
  border: 0;
5145
5208
  border-radius: 2px;
5146
5209
  box-shadow: none;
@@ -5148,12 +5211,12 @@
5148
5211
 
5149
5212
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5150
5213
  input[type=range]:focus::-ms-fill-lower {
5151
- background: var(---color-element-disabled);
5214
+ background: var(---decidables-slider-background-color);
5152
5215
  }
5153
5216
 
5154
5217
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5155
5218
  input[type=range]:focus::-ms-fill-upper {
5156
- background: var(---color-element-disabled);
5219
+ background: var(---decidables-slider-background-color);
5157
5220
  }
5158
5221
 
5159
5222
  /* Thumb */
@@ -5171,12 +5234,12 @@
5171
5234
  }
5172
5235
 
5173
5236
  input[type=range]:disabled::-webkit-slider-thumb {
5174
- background: var(---color-element-disabled);
5237
+ background: var(---decidables-slider-background-color);
5175
5238
  box-shadow: none;
5176
5239
  }
5177
5240
 
5178
5241
  input[type=range]:enabled::-webkit-slider-thumb {
5179
- background: var(---color-element-enabled);
5242
+ background: var(---decidables-slider-color);
5180
5243
  box-shadow: var(---shadow-2-rotate);
5181
5244
  }
5182
5245
 
@@ -5207,13 +5270,13 @@
5207
5270
 
5208
5271
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5209
5272
  input[type=range]:disabled::-moz-range-thumb {
5210
- background: var(---color-element-disabled);
5273
+ background: var(---decidables-slider-background-color);
5211
5274
  box-shadow: none;
5212
5275
  }
5213
5276
 
5214
5277
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5215
5278
  input[type=range]:enabled::-moz-range-thumb {
5216
- background: var(---color-element-enabled);
5279
+ background: var(---decidables-slider-color);
5217
5280
  box-shadow: var(---shadow-2-rotate);
5218
5281
  }
5219
5282
 
@@ -5250,13 +5313,13 @@
5250
5313
 
5251
5314
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5252
5315
  input[type=range]:disabled::-ms-thumb {
5253
- background: var(---color-element-disabled);
5316
+ background: var(---decidables-slider-background-color);
5254
5317
  box-shadow: none;
5255
5318
  }
5256
5319
 
5257
5320
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5258
5321
  input[type=range]:enabled::-ms-thumb {
5259
- background: var(---color-element-enabled);
5322
+ background: var(---decidables-slider-color);
5260
5323
  box-shadow: var(---shadow-2-rotate);
5261
5324
  }
5262
5325
 
@@ -5278,6 +5341,33 @@
5278
5341
  :host(.keyboard) input[type=range]:enabled:focus:active::-ms-thumb {
5279
5342
  box-shadow: var(---shadow-8-rotate);
5280
5343
  }
5344
+
5345
+ datalist {
5346
+ position: absolute;
5347
+ left: 2rem;
5348
+ z-index: -1;
5349
+ display: flex;
5350
+
5351
+ flex-direction: column;
5352
+
5353
+ align-items: flex-start;
5354
+ justify-content: space-between;
5355
+
5356
+ height: 4.75rem;
5357
+
5358
+ font-size: 0.75rem;
5359
+ }
5360
+
5361
+ option {
5362
+ padding: 0;
5363
+
5364
+ line-height: 0.8;
5365
+ min-block-size: 0;
5366
+ }
5367
+
5368
+ option::before {
5369
+ content: "– ";
5370
+ }
5281
5371
  `];
5282
5372
  }
5283
5373
  render() {
@@ -5286,9 +5376,15 @@
5286
5376
  <slot></slot>
5287
5377
  </label>
5288
5378
  <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)}>
5379
+ <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)}>
5380
+ ${this.scale ? x$1`
5381
+ <datalist id="ticks">
5382
+ <option value=${o(this.rangeMax)} label=${o(this.max)}></option>
5383
+ <option value=${o(this.rangeMin)} label=${o(this.min)}></option>
5384
+ </datalist>
5385
+ ` : x$1``}
5290
5386
  </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>
5387
+ <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
5388
  `;
5293
5389
  }
5294
5390
  }
@@ -5497,7 +5593,6 @@
5497
5593
  padding: 0;
5498
5594
  margin: -1px;
5499
5595
  overflow: hidden;
5500
- clip: rect(0 0 0 0);
5501
5596
 
5502
5597
  white-space: nowrap;
5503
5598
 
@@ -5719,7 +5814,6 @@
5719
5814
  padding: 0;
5720
5815
  margin: -1px;
5721
5816
  overflow: hidden;
5722
- clip: rect(0 0 0 0);
5723
5817
 
5724
5818
  white-space: nowrap;
5725
5819
 
@@ -5902,17 +5996,17 @@
5902
5996
  return [super.styles, i$3`
5903
5997
  :host {
5904
5998
  /* Declare base colors */
5905
- ${r$3(Object.keys(AccumulableElement.colors).map(color => {
5999
+ ${r$2(Object.keys(AccumulableElement.colors).map(color => {
5906
6000
  return `---color-${color}: var(--color-${color}, ${this.colors[color]});`;
5907
6001
  }).join('\n'))}
5908
6002
 
5909
6003
  /* Declare light colors */
5910
- ${r$3(Object.keys(AccumulableElement.colors).map(color => {
6004
+ ${r$2(Object.keys(AccumulableElement.colors).map(color => {
5911
6005
  return `---color-${color}-light: var(--color-${color}-light, ${this.lights[color]});`;
5912
6006
  }).join('\n'))}
5913
6007
 
5914
6008
  /* Declare dark colors */
5915
- ${r$3(Object.keys(AccumulableElement.colors).map(color => {
6009
+ ${r$2(Object.keys(AccumulableElement.colors).map(color => {
5916
6010
  return `---color-${color}-dark: var(--color-${color}-dark, ${this.darks[color]});`;
5917
6011
  }).join('\n'))}
5918
6012
  }
@@ -6089,15 +6183,15 @@
6089
6183
  render() {
6090
6184
  return x$1`
6091
6185
  <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``}
6186
+ ${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
6187
  ${this.resample ? x$1`
6094
6188
  <div class="buttons">
6095
6189
  ${this.resample ? x$1`<decidables-button name="resample" @click=${this.doResample.bind(this)}>Resample</decidables-button>` : x$1``}
6096
6190
  </div>
6097
6191
  ` : 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`
6192
+ ${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``}
6193
+ ${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``}
6194
+ ${this.color != null ? x$1`
6101
6195
  <decidables-toggle class="color" @change=${this.chooseColor.bind(this)}>
6102
6196
  <span slot="label">Emphasis</span>
6103
6197
  <decidables-toggle-option name="toggle" value="none" ?checked=${this.color === 'none'}>None</decidables-toggle-option>
@@ -6122,13 +6216,13 @@
6122
6216
  DDMMath Static Class - Not intended for instantiation!
6123
6217
 
6124
6218
  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)
6219
+ a = boundary separation [0, Infinity)
6220
+ z = starting point as a proportion of a (0, 1)
6221
+ v = drift rate (per second) (-Infinity, Infinity)
6222
+ t0 = non-decision time (in milliseconds) (0, Infinity)
6223
+ s = within-trial variability in drift rate (s^2 = infinitesimal variance) [0, Infinity)
6130
6224
 
6131
- zPrime = starting point on a 0-to-a scale (typically used in published equations)
6225
+ zPrime = starting point on a 0-to-a scale (typically used in published equations) [0, Infinity)
6132
6226
 
6133
6227
  Behavioral variables:
6134
6228
  pE = proportion of error trials
@@ -6148,7 +6242,37 @@
6148
6242
  EZ-diffusion model (Wagenmakers et al., 2007)
6149
6243
  */
6150
6244
  class DDMMath {
6151
- static s = 1;
6245
+ static s = {
6246
+ DEFAULT: 1
6247
+ };
6248
+ static a = {
6249
+ DEFAULT: 1.2,
6250
+ MIN: 0.01,
6251
+ MAX: 2.0,
6252
+ STEP: 0.01,
6253
+ JUMP: 0.1
6254
+ };
6255
+ static z = {
6256
+ DEFAULT: 0.55,
6257
+ MIN: 0.01,
6258
+ MAX: 0.99,
6259
+ STEP: 0.01,
6260
+ JUMP: 0.1
6261
+ };
6262
+ static v = {
6263
+ DEFAULT: 1.5,
6264
+ MIN: 0.01,
6265
+ MAX: 5.0,
6266
+ STEP: 0.01,
6267
+ JUMP: 0.1
6268
+ };
6269
+ static t0 = {
6270
+ DEFAULT: 150,
6271
+ MIN: 0,
6272
+ MAX: 500,
6273
+ STEP: 1,
6274
+ JUMP: 10
6275
+ };
6152
6276
 
6153
6277
  // Calculate a bunch of statistics for an array of trials
6154
6278
  static trials2stats(trials) {
@@ -6216,7 +6340,7 @@
6216
6340
  }
6217
6341
 
6218
6342
  // Probability of an Error Response
6219
- static azv2pE(a, z, v, s = DDMMath.s) {
6343
+ static azv2pE(a, z, v, s = DDMMath.s.DEFAULT) {
6220
6344
  const zPrime = a * z;
6221
6345
  const A = Math.exp(-2 * v * a / s ** 2);
6222
6346
  const Z = Math.exp(-2 * v * zPrime / s ** 2);
@@ -6224,13 +6348,13 @@
6224
6348
  }
6225
6349
 
6226
6350
  // Probability of a Correct Response
6227
- static azv2pC(a, z, v, s = DDMMath.s) {
6351
+ static azv2pC(a, z, v, s = DDMMath.s.DEFAULT) {
6228
6352
  return DDMMath.azv2pE(a, 1 - z, -v, s);
6229
6353
  }
6230
6354
 
6231
6355
  // Mean Overall RT
6232
6356
  // Equation 5 (Grasman et al., 2009)
6233
- static azvt02m(a, z, v, t0, s = DDMMath.s) {
6357
+ static azvt02m(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6234
6358
  const zPrime = a * z;
6235
6359
  const A = Math.exp(-2 * v * a / s ** 2) - 1;
6236
6360
  const Z = Math.exp(-2 * v * zPrime / s ** 2) - 1;
@@ -6240,7 +6364,7 @@
6240
6364
 
6241
6365
  // SD Overall RT
6242
6366
  // Equation 6 (Grasman et al., 2009)
6243
- static azv2sd(a, z, v, s = DDMMath.s) {
6367
+ static azv2sd(a, z, v, s = DDMMath.s.DEFAULT) {
6244
6368
  const zPrime = a * z;
6245
6369
  const A = Math.exp(-2 * v * a / s ** 2) - 1;
6246
6370
  const Z = Math.exp(-2 * v * zPrime / s ** 2) - 1;
@@ -6250,7 +6374,7 @@
6250
6374
 
6251
6375
  // Mean Error RT
6252
6376
  // Equation 13 (Grasman et al., 2009)
6253
- static azvt02mE(a, z, v, t0, s = DDMMath.s) {
6377
+ static azvt02mE(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6254
6378
  function phi(x, y) {
6255
6379
  return Math.exp(2 * v * y / s ** 2) - Math.exp(2 * v * x / s ** 2);
6256
6380
  }
@@ -6261,7 +6385,7 @@
6261
6385
 
6262
6386
  // SD Error RT
6263
6387
  // Equation 14 (Grasman et al., 2009)
6264
- static azv2sdE(a, z, v, s = DDMMath.s) {
6388
+ static azv2sdE(a, z, v, s = DDMMath.s.DEFAULT) {
6265
6389
  function phi(x, y) {
6266
6390
  return Math.exp(2 * v * y / s ** 2) - Math.exp(2 * v * x / s ** 2);
6267
6391
  }
@@ -6271,17 +6395,17 @@
6271
6395
  }
6272
6396
 
6273
6397
  // Mean Correct RT
6274
- static azvt02mC(a, z, v, t0, s = DDMMath.s) {
6398
+ static azvt02mC(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6275
6399
  return DDMMath.azvt02mE(a, 1 - z, -v, t0, s);
6276
6400
  }
6277
6401
 
6278
6402
  // SD Correct RT
6279
- static azv2sdC(a, z, v, s = DDMMath.s) {
6403
+ static azv2sdC(a, z, v, s = DDMMath.s.DEFAULT) {
6280
6404
  return DDMMath.azv2sdE(a, 1 - z, -v, s);
6281
6405
  }
6282
6406
 
6283
6407
  // Density of Error RT
6284
- static tazv2gE(t, a, z, v, s = DDMMath.s) {
6408
+ static tazv2gE(t, a, z, v, s = DDMMath.s.DEFAULT) {
6285
6409
  if (!t) return 0;
6286
6410
  const zPrime = a * z;
6287
6411
  const base = Math.PI * s ** 2 / a ** 2 * Math.exp(-zPrime * v / s ** 2);
@@ -6298,7 +6422,7 @@
6298
6422
  }
6299
6423
 
6300
6424
  // Density of Correct RT
6301
- static tazv2gC(t, a, z, v, s = DDMMath.s) {
6425
+ static tazv2gC(t, a, z, v, s = DDMMath.s.DEFAULT) {
6302
6426
  return DDMMath.tazv2gE(t, a, 1 - z, -v, s);
6303
6427
  }
6304
6428
 
@@ -6433,10 +6557,7 @@
6433
6557
  this.startTime = undefined; // Start time of current trial
6434
6558
  this.rt = undefined; // RT for current trial
6435
6559
 
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
-
6560
+ this.data = {};
6440
6561
  this.trials = []; // Record of trials in block
6441
6562
  this.alignState();
6442
6563
  }
@@ -6453,11 +6574,10 @@
6453
6574
  }
6454
6575
  }
6455
6576
  get totalPayoff() {
6456
- return this.correctCount * this.correctPayoff + this.errorCount * this.errorPayoff + this.nrCount * this.nrPayoff;
6577
+ return this.data.correctCount * this.correctPayoff + this.data.errorCount * this.errorPayoff + this.data.nrCount * this.nrPayoff;
6457
6578
  }
6458
6579
  alignState() {
6459
- const stats = DDMMath.trials2stats(this.trials);
6460
- Object.assign(this, stats);
6580
+ this.data = DDMMath.trials2stats(this.trials);
6461
6581
  }
6462
6582
  start(signal, trial) {
6463
6583
  this.startTime = Date.now();
@@ -6472,7 +6592,6 @@
6472
6592
  this.state = 'feedback';
6473
6593
  if (this.response === undefined) {
6474
6594
  this.outcome = 'nr';
6475
- this.nrCount += 1;
6476
6595
  this.rt = undefined;
6477
6596
  this.trials.push({
6478
6597
  trial: this.trialCount,
@@ -6497,10 +6616,8 @@
6497
6616
  this.response = response;
6498
6617
  if (this.signal === this.response) {
6499
6618
  this.outcome = 'correct';
6500
- this.correctCount += 1;
6501
6619
  } else if (this.signal !== this.response) {
6502
6620
  this.outcome = 'error';
6503
- this.errorCount += 1;
6504
6621
  }
6505
6622
  this.trials.push({
6506
6623
  trial: this.trialCount,
@@ -6519,16 +6636,7 @@
6519
6636
  response: this.response,
6520
6637
  outcome: this.outcome,
6521
6638
  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,
6639
+ data: this.data,
6532
6640
  totalPayoff: this.totalPayoff
6533
6641
  },
6534
6642
  bubbles: true
@@ -6541,9 +6649,6 @@
6541
6649
  this.signal = undefined;
6542
6650
  this.response = undefined;
6543
6651
  this.outcome = undefined;
6544
- this.correctCount = 0;
6545
- this.errorCount = 0;
6546
- this.nrCount = 0;
6547
6652
  this.trials = [];
6548
6653
  this.alignState();
6549
6654
  }
@@ -7234,7 +7339,7 @@
7234
7339
  };
7235
7340
  }
7236
7341
 
7237
- var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoKICAgIERETU1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIQoKICAgIE1vZGVsIHBhcmFtZXRlcnM6CiAgICAgIGEgPSBib3VuZGFyeSBzZXBhcmF0aW9uCiAgICAgIHogPSBzdGFydGluZyBwb2ludCBhcyBhIHByb3BvcnRpb24gb2YgYQogICAgICB2ID0gZHJpZnQgcmF0ZSAocGVyIHNlY29uZCkKICAgICAgdDAgPSBub24tZGVjaXNpb24gdGltZSAoaW4gbWlsbGlzZWNvbmRzKQogICAgICBzID0gd2l0aGluLXRyaWFsIHZhcmlhYmlsaXR5IGluIGRyaWZ0IHJhdGUgKHNeMiA9IGluZmluaXRlc2ltYWwgdmFyaWFuY2UpCgogICAgICB6UHJpbWUgPSBzdGFydGluZyBwb2ludCBvbiBhIDAtdG8tYSBzY2FsZSAodHlwaWNhbGx5IHVzZWQgaW4gcHVibGlzaGVkIGVxdWF0aW9ucykKCiAgICBCZWhhdmlvcmFsIHZhcmlhYmxlczoKICAgICAgcEUgPSBwcm9wb3J0aW9uIG9mIGVycm9yIHRyaWFscwogICAgICBwQyA9IHByb3BvcnRpb24gb2YgY29ycmVjdCB0cmlhbHMKICAgICAgbSA9IG1lYW4gb2Ygb3ZlcmFsbCBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgbUUgPSBtZWFuIG9mIGVycm9yIFJUcyAoaW4gbWlsbGlzZWNvbmRzKQogICAgICBtQyA9IG1lYW4gY29ycmVjdCBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgc2QgPSBzdGFuZGFyZCBkZXZpYXRpb24gb2Ygb3ZlcmFsbCBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgc2RFID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGVycm9yIFJUcyAoaW4gbWlsbGlzZWNvbmRzKQogICAgICBzZEMgPSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgY29ycmVjdCBSVHMgKGluIG1pbGxpc2Vjb25kcykKCiAgICBFcXVhdGlvbnM6CiAgICAgIFByb2JhYmlsaXR5IG9mIGNvcnJlY3QgYW5kIGVycm9yIHJlc3BvbnNlcyAoQWxleGFuZHJvd2ljeiwgMjAyMCkKICAgICAgTWVhbiBvZiBvdmVyYWxsLCBlcnJvciwgYW5kIGNvcnJlY3QgUlRzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgICAgU3RhbmRhcmQgZGV2aWF0aW9uIG9mIG92ZXJhbGwsIGVycm9yLCBhbmQgY29ycmVjdCBSVHMgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KQogICAgICBEZW5zaXR5IG9mIGVycm9yIGFuZCBjb3JyZWN0IFJUIGRpc3RyaWJ1dGlvbnMgKEFsZXhhbmRyb3dpY3osIDIwMjApCiAgICAgIEVaLWRpZmZ1c2lvbiBtb2RlbCAoV2FnZW5tYWtlcnMgZXQgYWwuLCAyMDA3KQogICovCiAgY2xhc3MgRERNTWF0aCB7CiAgICBzdGF0aWMgcyA9IDE7CgogICAgLy8gQ2FsY3VsYXRlIGEgYnVuY2ggb2Ygc3RhdGlzdGljcyBmb3IgYW4gYXJyYXkgb2YgdHJpYWxzCiAgICBzdGF0aWMgdHJpYWxzMnN0YXRzKHRyaWFscykgewogICAgICBjb25zdCBzdGF0cyA9IHt9OwoKICAgICAgLy8gRmlyc3Qtb3JkZXIgc3VtcwogICAgICBjb25zdCBzdW1zID0gdHJpYWxzLnJlZHVjZSgoYWNjdW11bGF0b3IsIHRyaWFsKSA9PiB7CiAgICAgICAgc3dpdGNoICh0cmlhbC5vdXRjb21lKSB7CiAgICAgICAgICBjYXNlICdjb3JyZWN0JzoKICAgICAgICAgICAgYWNjdW11bGF0b3IuY29ycmVjdENvdW50ICs9IDE7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RSVFN1bSArPSB0cmlhbC5ydDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yQ291bnQgKz0gMTsKICAgICAgICAgICAgYWNjdW11bGF0b3IuZXJyb3JSVFN1bSArPSB0cmlhbC5ydDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICducic6CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLm5yQ291bnQgKz0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAvLyBOby1vcAogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICAgIH0sIHsKICAgICAgICBjb3JyZWN0Q291bnQ6IDAsCiAgICAgICAgZXJyb3JDb3VudDogMCwKICAgICAgICBuckNvdW50OiAwLAogICAgICAgIGNvcnJlY3RSVFN1bTogMCwKICAgICAgICBlcnJvclJUU3VtOiAwCiAgICAgIH0pOwoKICAgICAgLy8gRmlyc3Qtb3JkZXIgc3RhdHMKICAgICAgc3RhdHMuY29ycmVjdENvdW50ID0gc3Vtcy5jb3JyZWN0Q291bnQ7CiAgICAgIHN0YXRzLmVycm9yQ291bnQgPSBzdW1zLmVycm9yQ291bnQ7CiAgICAgIHN0YXRzLm5yQ291bnQgPSBzdW1zLm5yQ291bnQ7CiAgICAgIHN0YXRzLmFjY3VyYWN5ID0gc3Vtcy5jb3JyZWN0Q291bnQgLyAoc3Vtcy5jb3JyZWN0Q291bnQgKyBzdW1zLmVycm9yQ291bnQgKyBzdW1zLm5yQ291bnQpOwogICAgICBzdGF0cy5jb3JyZWN0TWVhblJUID0gc3Vtcy5jb3JyZWN0UlRTdW0gLyBzdW1zLmNvcnJlY3RDb3VudDsKICAgICAgc3RhdHMuZXJyb3JNZWFuUlQgPSBzdW1zLmVycm9yUlRTdW0gLyBzdW1zLmVycm9yQ291bnQ7CiAgICAgIHN0YXRzLm1lYW5SVCA9IChzdW1zLmNvcnJlY3RSVFN1bSArIHN1bXMuZXJyb3JSVFN1bSkgLyAoc3Vtcy5jb3JyZWN0Q291bnQgKyBzdW1zLmVycm9yQ291bnQpOwoKICAgICAgLy8gU2Vjb25kLW9yZGVyIHN1bXMKICAgICAgY29uc3Qgc3VtczIgPSB0cmlhbHMucmVkdWNlKChhY2N1bXVsYXRvciwgdHJpYWwpID0+IHsKICAgICAgICBzd2l0Y2ggKHRyaWFsLm91dGNvbWUpIHsKICAgICAgICAgIGNhc2UgJ2NvcnJlY3QnOgogICAgICAgICAgICBhY2N1bXVsYXRvci5zcyArPSAodHJpYWwucnQgLSBzdGF0cy5tZWFuUlQpICoqIDI7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RTUyArPSAodHJpYWwucnQgLSBzdGF0cy5jb3JyZWN0TWVhblJUKSAqKiAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgICAgICAgYWNjdW11bGF0b3Iuc3MgKz0gKHRyaWFsLnJ0IC0gc3RhdHMubWVhblJUKSAqKiAyOwogICAgICAgICAgICBhY2N1bXVsYXRvci5lcnJvclNTICs9ICh0cmlhbC5ydCAtIHN0YXRzLmVycm9yTWVhblJUKSAqKiAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIC8vIE5vLW9wCiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgfSwgewogICAgICAgIHNzOiAwLAogICAgICAgIGNvcnJlY3RTUzogMCwKICAgICAgICBlcnJvclNTOiAwCiAgICAgIH0pOwoKICAgICAgLy8gU2Vjb25kLW9yZGVyIHN0YXRzCiAgICAgIHN0YXRzLmNvcnJlY3RTRFJUID0gc3RhdHMuY29ycmVjdENvdW50ID4gMSA/IE1hdGguc3FydChzdW1zMi5jb3JyZWN0U1MgLyAoc3RhdHMuY29ycmVjdENvdW50IC0gMSkpIDogTmFOOwogICAgICBzdGF0cy5lcnJvclNEUlQgPSBzdGF0cy5lcnJvckNvdW50ID4gMSA/IE1hdGguc3FydChzdW1zMi5lcnJvclNTIC8gKHN0YXRzLmVycm9yQ291bnQgLSAxKSkgOiBOYU47CiAgICAgIHN0YXRzLnNkUlQgPSBzdGF0cy5jb3JyZWN0Q291bnQgKyBzdGF0cy5lcnJvckNvdW50ID4gMSA/IE1hdGguc3FydChzdW1zMi5zcyAvIChzdGF0cy5jb3JyZWN0Q291bnQgKyBzdGF0cy5lcnJvckNvdW50IC0gMSkpIDogTmFOOwogICAgICByZXR1cm4gc3RhdHM7CiAgICB9CgogICAgLy8gUHJvYmFiaWxpdHkgb2YgYW4gRXJyb3IgUmVzcG9uc2UKICAgIHN0YXRpYyBhenYycEUoYSwgeiwgdiwgcyA9IERETU1hdGgucykgewogICAgICBjb25zdCB6UHJpbWUgPSBhICogejsKICAgICAgY29uc3QgQSA9IE1hdGguZXhwKC0yICogdiAqIGEgLyBzICoqIDIpOwogICAgICBjb25zdCBaID0gTWF0aC5leHAoLTIgKiB2ICogelByaW1lIC8gcyAqKiAyKTsKICAgICAgcmV0dXJuIChBIC0gWikgLyAoQSAtIDEpOwogICAgfQoKICAgIC8vIFByb2JhYmlsaXR5IG9mIGEgQ29ycmVjdCBSZXNwb25zZQogICAgc3RhdGljIGF6djJwQyhhLCB6LCB2LCBzID0gRERNTWF0aC5zKSB7CiAgICAgIHJldHVybiBERE1NYXRoLmF6djJwRShhLCAxIC0geiwgLXYsIHMpOwogICAgfQoKICAgIC8vIE1lYW4gT3ZlcmFsbCBSVAogICAgLy8gRXF1YXRpb24gNSAoR3Jhc21hbiBldCBhbC4sIDIwMDkpCiAgICBzdGF0aWMgYXp2dDAybShhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucykgewogICAgICBjb25zdCB6UHJpbWUgPSBhICogejsKICAgICAgY29uc3QgQSA9IE1hdGguZXhwKC0yICogdiAqIGEgLyBzICoqIDIpIC0gMTsKICAgICAgY29uc3QgWiA9IE1hdGguZXhwKC0yICogdiAqIHpQcmltZSAvIHMgKiogMikgLSAxOwogICAgICBjb25zdCBtZWFuID0gLSh6UHJpbWUgLyB2KSArIGEgLyB2ICogKFogLyBBKTsKICAgICAgcmV0dXJuIHQwICsgbWVhbiAqIDEwMDA7CiAgICB9CgogICAgLy8gU0QgT3ZlcmFsbCBSVAogICAgLy8gRXF1YXRpb24gNiAoR3Jhc21hbiBldCBhbC4sIDIwMDkpCiAgICBzdGF0aWMgYXp2MnNkKGEsIHosIHYsIHMgPSBERE1NYXRoLnMpIHsKICAgICAgY29uc3QgelByaW1lID0gYSAqIHo7CiAgICAgIGNvbnN0IEEgPSBNYXRoLmV4cCgtMiAqIHYgKiBhIC8gcyAqKiAyKSAtIDE7CiAgICAgIGNvbnN0IFogPSBNYXRoLmV4cCgtMiAqIHYgKiB6UHJpbWUgLyBzICoqIDIpIC0gMTsKICAgICAgY29uc3QgdmFyaWFuY2UgPSAoLXYgKiBhICoqIDIgKiAoWiArIDQpICogWiAvIEEgKiogMiArICgoLTMgKiB2ICogYSAqKiAyICsgNCAqIHYgKiB6UHJpbWUgKiBhICsgcyAqKiAyICogYSkgKiBaICsgNCAqIHYgKiB6UHJpbWUgKiBhKSAvIEEgLSBzICoqIDIgKiB6UHJpbWUpIC8gdiAqKiAzOwogICAgICByZXR1cm4gTWF0aC5zcXJ0KHZhcmlhbmNlKSAqIDEwMDA7CiAgICB9CgogICAgLy8gTWVhbiBFcnJvciBSVAogICAgLy8gRXF1YXRpb24gMTMgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KQogICAgc3RhdGljIGF6dnQwMm1FKGEsIHosIHYsIHQwLCBzID0gRERNTWF0aC5zKSB7CiAgICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7CiAgICAgICAgcmV0dXJuIE1hdGguZXhwKDIgKiB2ICogeSAvIHMgKiogMikgLSBNYXRoLmV4cCgyICogdiAqIHggLyBzICoqIDIpOwogICAgICB9CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBtZWFuID0gKHpQcmltZSAqIChwaGkoelByaW1lIC0gYSwgYSkgKyBwaGkoMCwgelByaW1lKSkgKyAyICogYSAqIHBoaSh6UHJpbWUsIDApKSAvICh2ICogcGhpKHpQcmltZSwgYSkgKiBwaGkoLWEsIDApKTsKICAgICAgcmV0dXJuIHQwICsgbWVhbiAqIDEwMDA7CiAgICB9CgogICAgLy8gU0QgRXJyb3IgUlQKICAgIC8vIEVxdWF0aW9uIDE0IChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgIHN0YXRpYyBhenYyc2RFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMpIHsKICAgICAgZnVuY3Rpb24gcGhpKHgsIHkpIHsKICAgICAgICByZXR1cm4gTWF0aC5leHAoMiAqIHYgKiB5IC8gcyAqKiAyKSAtIE1hdGguZXhwKDIgKiB2ICogeCAvIHMgKiogMik7CiAgICAgIH0KICAgICAgY29uc3QgelByaW1lID0gYSAqIHo7CiAgICAgIGNvbnN0IHZhcmlhbmNlID0gLTIgKiBhICogcGhpKDAsIHpQcmltZSkgKiAoMiAqIHYgKiBhICogcGhpKHpQcmltZSwgMiAqIGEpICsgcyAqKiAyICogcGhpKDAsIGEpICogcGhpKHpQcmltZSwgYSkpICogTWF0aC5leHAoMiAqIHYgKiBhIC8gcyAqKiAyKSAvICh2ICoqIDMgKiBwaGkoMCwgYSkgKiogMiAqIHBoaSh6UHJpbWUsIGEpICoqIDIpICsgKDQgKiB2ICogelByaW1lICogKDIgKiBhIC0gelByaW1lKSAqIE1hdGguZXhwKDIgKiB2ICogKHpQcmltZSArIGEpIC8gcyAqKiAyKSArIHpQcmltZSAqIHMgKiogMiAqIHBoaSgyICogelByaW1lLCAyICogYSkpIC8gKHYgKiogMyAqIHBoaSh6UHJpbWUsIGEpICoqIDIpOwogICAgICByZXR1cm4gTWF0aC5zcXJ0KHZhcmlhbmNlKSAqIDEwMDA7CiAgICB9CgogICAgLy8gTWVhbiBDb3JyZWN0IFJUCiAgICBzdGF0aWMgYXp2dDAybUMoYSwgeiwgdiwgdDAsIHMgPSBERE1NYXRoLnMpIHsKICAgICAgcmV0dXJuIERETU1hdGguYXp2dDAybUUoYSwgMSAtIHosIC12LCB0MCwgcyk7CiAgICB9CgogICAgLy8gU0QgQ29ycmVjdCBSVAogICAgc3RhdGljIGF6djJzZEMoYSwgeiwgdiwgcyA9IERETU1hdGgucykgewogICAgICByZXR1cm4gRERNTWF0aC5henYyc2RFKGEsIDEgLSB6LCAtdiwgcyk7CiAgICB9CgogICAgLy8gRGVuc2l0eSBvZiBFcnJvciBSVAogICAgc3RhdGljIHRhenYyZ0UodCwgYSwgeiwgdiwgcyA9IERETU1hdGgucykgewogICAgICBpZiAoIXQpIHJldHVybiAwOwogICAgICBjb25zdCB6UHJpbWUgPSBhICogejsKICAgICAgY29uc3QgYmFzZSA9IE1hdGguUEkgKiBzICoqIDIgLyBhICoqIDIgKiBNYXRoLmV4cCgtelByaW1lICogdiAvIHMgKiogMik7CiAgICAgIGxldCBrID0gMDsKICAgICAgbGV0IHRlcm0gPSAwOwogICAgICBsZXQgc3VtID0gMDsKICAgICAgZG8gewogICAgICAgIGsgKz0gMTsKICAgICAgICB0ZXJtID0gayAqIE1hdGguc2luKE1hdGguUEkgKiB6UHJpbWUgKiBrIC8gYSkgKiBNYXRoLmV4cCgtMC41ICogKHYgKiogMiAvIHMgKiogMiArIE1hdGguUEkgKiogMiAqIGsgKiogMiAqIHMgKiogMiAvIGEgKiogMikgKiB0KTsKICAgICAgICBzdW0gKz0gdGVybTsKICAgICAgfSB3aGlsZSAoayA8IDIwMCk7IC8vID8/IEhBQ0sKCiAgICAgIHJldHVybiBiYXNlICogc3VtOwogICAgfQoKICAgIC8vIERlbnNpdHkgb2YgQ29ycmVjdCBSVAogICAgc3RhdGljIHRhenYyZ0ModCwgYSwgeiwgdiwgcyA9IERETU1hdGgucykgewogICAgICByZXR1cm4gRERNTWF0aC50YXp2MmdFKHQsIGEsIDEgLSB6LCAtdiwgcyk7CiAgICB9CgogICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vcmFvdWwuc29jc2NpLnV2YS5ubC9FWjIvRVoyX25ldy5odG1sCiAgICAvLyBFWi1mdW5jdGlvbiBmb3Igc3RhcnRpbmcgdmFsdWVzCiAgICAvLyBpbnB1dDogb2JqIC0gT2JqZWN0IHdpdGggcHJvcGVydGllcwogICAgLy8gICAgcEMgLSBQcm9wb3J0aW9uIGNvcnJlY3QKICAgIC8vICAgIHNkIC0gc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgUlQncyBpbiBtcwogICAgLy8gICAgbSAtIHNhbXBsZSBtZWFuIG9mIHRoZSBSVCdzIGluIG1zCiAgICAvLyAgICBzIC0gZGlmZnVzaW9uIHN0YW5kYXJkIGRldmlhdGlvbgogICAgLy8gcmV0dXJuczogT2JqZWN0IHdpdGggcHJvcGVydGllcyB2LCBhLCBhbmQgdDAsIGNvbnRhaW5pbmcgRVotZXN0aW1hdGVzIG9mIHRoZXNlIHBhcmFtZXRlcnMKICAgIHN0YXRpYyBkYXRhMmV6KHsKICAgICAgYWNjdXJhY3k6IHBDLAogICAgICBzZFJUOiBzZCwKICAgICAgbWVhblJUOiBtLAogICAgICBzCiAgICB9KSB7CiAgICAgIGZ1bmN0aW9uIHNpZ24ocikgewogICAgICAgIHJldHVybiByID4gMCA/IDEgOiByID09PSAwID8gMCA6IC0xOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGxvZ2l0KHApIHsKICAgICAgICByZXR1cm4gTWF0aC5sb2cocCAvICgxIC0gcCkpOwogICAgICB9CiAgICAgIGNvbnN0IHZydCA9IChzZCAvIDEwMDApICoqIDI7CiAgICAgIGNvbnN0IG1ydCA9IG0gLyAxMDAwOwogICAgICBjb25zdCBzMiA9IHMgKiogMjsKICAgICAgY29uc3QgbCA9IGxvZ2l0KHBDKTsKICAgICAgY29uc3QgeCA9IGwgKiAobCAqIHBDICoqIDIgLSBsICogcEMgKyBwQyAtIDAuNSkgLyB2cnQ7CiAgICAgIGNvbnN0IHYgPSBzaWduKHBDIC0gMC41KSAqIHMgKiB4ICoqICgxIC8gNCk7CiAgICAgIGNvbnN0IGEgPSBzMiAqIGxvZ2l0KHBDKSAvIHY7CiAgICAgIGNvbnN0IHkgPSAtdiAqIGEgLyBzMjsKICAgICAgY29uc3QgbWR0ID0gYSAvICgyICogdikgKiAoMSAtIE1hdGguZXhwKHkpKSAvICgxICsgTWF0aC5leHAoeSkpOwogICAgICBjb25zdCB0MCA9IG1ydCA/IG1ydCAtIG1kdCA6IG51bGw7IC8vIGNvbXB1dGUgVGVyIG9ubHkgaWYgTVJUIHdhcyBwcm92aWRlZAoKICAgICAgY29uc3QgdDBQcmltZSA9IHQwICogMTAwMDsKICAgICAgcmV0dXJuIHsKICAgICAgICB2LAogICAgICAgIGEsCiAgICAgICAgdDA6IHQwUHJpbWUsCiAgICAgICAgcwogICAgICB9OwogICAgfQogICAgc3RhdGljIGRhdGEyZXoyKCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGEyZXoyIGlzIG5vdCBpbXBsZW1lbnRlZCEnKTsKICAgIH0KICB9CgogIC8vIEludGVybmFsIGRlcGVuZGVuY2llcwoKICAvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbIm9mZiIsICJzZWxmIl0gKi8KCiAgc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICBjb25zdCBwYXJhbXMgPSBERE1NYXRoLmRhdGEyZXooewogICAgICAuLi5ldmVudC5kYXRhLAogICAgICBzOiBERE1NYXRoLnMKICAgIH0pOwoKICAgIC8vICMjIyMjIEFyYml0cmFyeSBkZWZhdWx0IHZhbHVlcyEhIQogICAgY29uc3QgYSA9ICFpc05hTihwYXJhbXMuYSkgPyBwYXJhbXMuYSA6IDEuNTsKICAgIGNvbnN0IHogPSAhaXNOYU4ocGFyYW1zLnopID8gcGFyYW1zLnogOiAwLjU7CiAgICBjb25zdCB2ID0gIWlzTmFOKHBhcmFtcy52KSA/IHBhcmFtcy52IDogMC4xOwogICAgY29uc3QgdDAgPSAhaXNOYU4ocGFyYW1zLnQwKSA/IHBhcmFtcy50MCA6IDEwMDsKICAgIGNvbnN0IHMgPSAhaXNOYU4ocGFyYW1zLnMpID8gcGFyYW1zLnMgOiBERE1NYXRoLnM7CiAgICBjb25zdCBwcmVkaWN0ZWQgPSB7CiAgICAgIGFjY3VyYWN5OiBERE1NYXRoLmF6djJwQyhhLCB6LCB2KSwKICAgICAgY29ycmVjdE1lYW5SVDogRERNTWF0aC5henZ0MDJtQyhhLCB6LCB2LCB0MCksCiAgICAgIGVycm9yTWVhblJUOiBERE1NYXRoLmF6dnQwMm1FKGEsIHosIHYsIHQwKSwKICAgICAgbWVhblJUOiBERE1NYXRoLmF6dnQwMm0oYSwgeiwgdiwgdDApLAogICAgICBjb3JyZWN0U0RSVDogRERNTWF0aC5henYyc2RDKGEsIHosIHYpLAogICAgICBlcnJvclNEUlQ6IERETU1hdGguYXp2MnNkRShhLCB6LCB2KSwKICAgICAgc2RSVDogRERNTWF0aC5henYyc2QoYSwgeiwgdikKICAgIH07CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgcGFyYW1zOiB7CiAgICAgICAgYSwKICAgICAgICB6LAogICAgICAgIHYsCiAgICAgICAgdDAsCiAgICAgICAgcwogICAgICB9LAogICAgICBwcmVkaWN0ZWQKICAgIH0pOwogIH07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1kZG0tZml0LXdvcmtlci5qcy5tYXAKCg==', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGRtLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uL2FjY3VtdWxhYmxlLW1hdGgvc3JjL2RkbS1tYXRoLmpzIiwiLi4vYWNjdW11bGFibGUtbWF0aC9zcmMvaW5kZXguanMiLCJzcmMvY29tcG9uZW50cy9kZG0tZml0LXdvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qXG4gIERETU1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIVxuXG4gIE1vZGVsIHBhcmFtZXRlcnM6XG4gICAgYSA9IGJvdW5kYXJ5IHNlcGFyYXRpb25cbiAgICB6ID0gc3RhcnRpbmcgcG9pbnQgYXMgYSBwcm9wb3J0aW9uIG9mIGFcbiAgICB2ID0gZHJpZnQgcmF0ZSAocGVyIHNlY29uZClcbiAgICB0MCA9IG5vbi1kZWNpc2lvbiB0aW1lIChpbiBtaWxsaXNlY29uZHMpXG4gICAgcyA9IHdpdGhpbi10cmlhbCB2YXJpYWJpbGl0eSBpbiBkcmlmdCByYXRlIChzXjIgPSBpbmZpbml0ZXNpbWFsIHZhcmlhbmNlKVxuXG4gICAgelByaW1lID0gc3RhcnRpbmcgcG9pbnQgb24gYSAwLXRvLWEgc2NhbGUgKHR5cGljYWxseSB1c2VkIGluIHB1Ymxpc2hlZCBlcXVhdGlvbnMpXG5cbiAgQmVoYXZpb3JhbCB2YXJpYWJsZXM6XG4gICAgcEUgPSBwcm9wb3J0aW9uIG9mIGVycm9yIHRyaWFsc1xuICAgIHBDID0gcHJvcG9ydGlvbiBvZiBjb3JyZWN0IHRyaWFsc1xuICAgIG0gPSBtZWFuIG9mIG92ZXJhbGwgUlRzIChpbiBtaWxsaXNlY29uZHMpXG4gICAgbUUgPSBtZWFuIG9mIGVycm9yIFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIG1DID0gbWVhbiBjb3JyZWN0IFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIHNkID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIG92ZXJhbGwgUlRzIChpbiBtaWxsaXNlY29uZHMpXG4gICAgc2RFID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGVycm9yIFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIHNkQyA9IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBjb3JyZWN0IFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuXG4gIEVxdWF0aW9uczpcbiAgICBQcm9iYWJpbGl0eSBvZiBjb3JyZWN0IGFuZCBlcnJvciByZXNwb25zZXMgKEFsZXhhbmRyb3dpY3osIDIwMjApXG4gICAgTWVhbiBvZiBvdmVyYWxsLCBlcnJvciwgYW5kIGNvcnJlY3QgUlRzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSlcbiAgICBTdGFuZGFyZCBkZXZpYXRpb24gb2Ygb3ZlcmFsbCwgZXJyb3IsIGFuZCBjb3JyZWN0IFJUcyAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gICAgRGVuc2l0eSBvZiBlcnJvciBhbmQgY29ycmVjdCBSVCBkaXN0cmlidXRpb25zIChBbGV4YW5kcm93aWN6LCAyMDIwKVxuICAgIEVaLWRpZmZ1c2lvbiBtb2RlbCAoV2FnZW5tYWtlcnMgZXQgYWwuLCAyMDA3KVxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERETU1hdGgge1xuICBzdGF0aWMgcyA9IDE7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgYnVuY2ggb2Ygc3RhdGlzdGljcyBmb3IgYW4gYXJyYXkgb2YgdHJpYWxzXG4gIHN0YXRpYyB0cmlhbHMyc3RhdHModHJpYWxzKSB7XG4gICAgY29uc3Qgc3RhdHMgPSB7fTtcblxuICAgIC8vIEZpcnN0LW9yZGVyIHN1bXNcbiAgICBjb25zdCBzdW1zID0gdHJpYWxzLnJlZHVjZShcbiAgICAgIChhY2N1bXVsYXRvciwgdHJpYWwpID0+IHtcbiAgICAgICAgc3dpdGNoICh0cmlhbC5vdXRjb21lKSB7XG4gICAgICAgICAgY2FzZSAnY29ycmVjdCc6XG4gICAgICAgICAgICBhY2N1bXVsYXRvci5jb3JyZWN0Q291bnQgKz0gMTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RSVFN1bSArPSB0cmlhbC5ydDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yQ291bnQgKz0gMTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yUlRTdW0gKz0gdHJpYWwucnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICducic6XG4gICAgICAgICAgICBhY2N1bXVsYXRvci5uckNvdW50ICs9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gTm8tb3BcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb3JyZWN0Q291bnQ6IDAsXG4gICAgICAgIGVycm9yQ291bnQ6IDAsXG4gICAgICAgIG5yQ291bnQ6IDAsXG5cbiAgICAgICAgY29ycmVjdFJUU3VtOiAwLFxuICAgICAgICBlcnJvclJUU3VtOiAwLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRmlyc3Qtb3JkZXIgc3RhdHNcbiAgICBzdGF0cy5jb3JyZWN0Q291bnQgPSBzdW1zLmNvcnJlY3RDb3VudDtcbiAgICBzdGF0cy5lcnJvckNvdW50ID0gc3Vtcy5lcnJvckNvdW50O1xuICAgIHN0YXRzLm5yQ291bnQgPSBzdW1zLm5yQ291bnQ7XG4gICAgc3RhdHMuYWNjdXJhY3kgPSBzdW1zLmNvcnJlY3RDb3VudCAvIChzdW1zLmNvcnJlY3RDb3VudCArIHN1bXMuZXJyb3JDb3VudCArIHN1bXMubnJDb3VudCk7XG5cbiAgICBzdGF0cy5jb3JyZWN0TWVhblJUID0gc3Vtcy5jb3JyZWN0UlRTdW0gLyBzdW1zLmNvcnJlY3RDb3VudDtcbiAgICBzdGF0cy5lcnJvck1lYW5SVCA9IHN1bXMuZXJyb3JSVFN1bSAvIHN1bXMuZXJyb3JDb3VudDtcbiAgICBzdGF0cy5tZWFuUlQgPSAoc3Vtcy5jb3JyZWN0UlRTdW0gKyBzdW1zLmVycm9yUlRTdW0pIC8gKHN1bXMuY29ycmVjdENvdW50ICsgc3Vtcy5lcnJvckNvdW50KTtcblxuICAgIC8vIFNlY29uZC1vcmRlciBzdW1zXG4gICAgY29uc3Qgc3VtczIgPSB0cmlhbHMucmVkdWNlKFxuICAgICAgKGFjY3VtdWxhdG9yLCB0cmlhbCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRyaWFsLm91dGNvbWUpIHtcbiAgICAgICAgICBjYXNlICdjb3JyZWN0JzpcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnNzICs9ICh0cmlhbC5ydCAtIHN0YXRzLm1lYW5SVCkgKiogMjtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RTUyArPSAodHJpYWwucnQgLSBzdGF0cy5jb3JyZWN0TWVhblJUKSAqKiAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgYWNjdW11bGF0b3Iuc3MgKz0gKHRyaWFsLnJ0IC0gc3RhdHMubWVhblJUKSAqKiAyO1xuICAgICAgICAgICAgYWNjdW11bGF0b3IuZXJyb3JTUyArPSAodHJpYWwucnQgLSBzdGF0cy5lcnJvck1lYW5SVCkgKiogMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBOby1vcFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNzOiAwLFxuICAgICAgICBjb3JyZWN0U1M6IDAsXG4gICAgICAgIGVycm9yU1M6IDAsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTZWNvbmQtb3JkZXIgc3RhdHNcbiAgICBzdGF0cy5jb3JyZWN0U0RSVCA9IChzdGF0cy5jb3JyZWN0Q291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuY29ycmVjdFNTIC8gKHN0YXRzLmNvcnJlY3RDb3VudCAtIDEpKVxuICAgICAgOiBOYU47XG4gICAgc3RhdHMuZXJyb3JTRFJUID0gKHN0YXRzLmVycm9yQ291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuZXJyb3JTUyAvIChzdGF0cy5lcnJvckNvdW50IC0gMSkpXG4gICAgICA6IE5hTjtcbiAgICBzdGF0cy5zZFJUID0gKHN0YXRzLmNvcnJlY3RDb3VudCArIHN0YXRzLmVycm9yQ291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuc3MgLyAoc3RhdHMuY29ycmVjdENvdW50ICsgc3RhdHMuZXJyb3JDb3VudCAtIDEpKVxuICAgICAgOiBOYU47XG5cbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cblxuICAvLyBQcm9iYWJpbGl0eSBvZiBhbiBFcnJvciBSZXNwb25zZVxuICBzdGF0aWMgYXp2MnBFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMpIHtcbiAgICBjb25zdCB6UHJpbWUgPSBhICogejtcblxuICAgIGNvbnN0IEEgPSBNYXRoLmV4cCgoLTIgKiB2ICogYSkgLyBzICoqIDIpO1xuICAgIGNvbnN0IFogPSBNYXRoLmV4cCgoLTIgKiB2ICogelByaW1lKSAvIHMgKiogMik7XG5cbiAgICByZXR1cm4gKEEgLSBaKSAvIChBIC0gMSk7XG4gIH1cblxuICAvLyBQcm9iYWJpbGl0eSBvZiBhIENvcnJlY3QgUmVzcG9uc2VcbiAgc3RhdGljIGF6djJwQyhhLCB6LCB2LCBzID0gRERNTWF0aC5zKSB7XG4gICAgcmV0dXJuIERETU1hdGguYXp2MnBFKGEsIDEgLSB6LCAtdiwgcyk7XG4gIH1cblxuICAvLyBNZWFuIE92ZXJhbGwgUlRcbiAgLy8gRXF1YXRpb24gNSAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gIHN0YXRpYyBhenZ0MDJtKGEsIHosIHYsIHQwLCBzID0gRERNTWF0aC5zKSB7XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG4gICAgY29uc3QgQSA9IE1hdGguZXhwKCgtMiAqIHYgKiBhKSAvIHMgKiogMikgLSAxO1xuICAgIGNvbnN0IFogPSBNYXRoLmV4cCgoLTIgKiB2ICogelByaW1lKSAvIHMgKiogMikgLSAxO1xuXG4gICAgY29uc3QgbWVhbiA9IC0oelByaW1lIC8gdikgKyAoYSAvIHYpICogKFogLyBBKTtcbiAgICByZXR1cm4gdDAgKyBtZWFuICogMTAwMDtcbiAgfVxuXG4gIC8vIFNEIE92ZXJhbGwgUlRcbiAgLy8gRXF1YXRpb24gNiAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gIHN0YXRpYyBhenYyc2QoYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6O1xuICAgIGNvbnN0IEEgPSBNYXRoLmV4cCgoLTIgKiB2ICogYSkgLyBzICoqIDIpIC0gMTtcbiAgICBjb25zdCBaID0gTWF0aC5leHAoKC0yICogdiAqIHpQcmltZSkgLyBzICoqIDIpIC0gMTtcblxuICAgIGNvbnN0IHZhcmlhbmNlID0gKFxuICAgICAgKFxuICAgICAgICAoLXYgKiBhICoqIDIgKiAoWiArIDQpICogWikgLyBBICoqIDJcbiAgICAgICkgKyAoXG4gICAgICAgICgoLTMgKiB2ICogYSAqKiAyICsgNCAqIHYgKiB6UHJpbWUgKiBhICsgcyAqKiAyICogYSkgKiBaICsgNCAqIHYgKiB6UHJpbWUgKiBhKSAvIEFcbiAgICAgICkgLSAoXG4gICAgICAgIHMgKiogMiAqIHpQcmltZVxuICAgICAgKVxuICAgICkgLyB2ICoqIDM7XG5cbiAgICByZXR1cm4gTWF0aC5zcXJ0KHZhcmlhbmNlKSAqIDEwMDA7XG4gIH1cblxuICAvLyBNZWFuIEVycm9yIFJUXG4gIC8vIEVxdWF0aW9uIDEzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSlcbiAgc3RhdGljIGF6dnQwMm1FKGEsIHosIHYsIHQwLCBzID0gRERNTWF0aC5zKSB7XG4gICAgZnVuY3Rpb24gcGhpKHgsIHkpIHtcbiAgICAgIHJldHVybiBNYXRoLmV4cCgoMiAqIHYgKiB5KSAvIChzICoqIDIpKSAtIE1hdGguZXhwKCgyICogdiAqIHgpIC8gKHMgKiogMikpO1xuICAgIH1cbiAgICBjb25zdCB6UHJpbWUgPSBhICogejtcblxuICAgIGNvbnN0IG1lYW4gPSAoelByaW1lICogKHBoaSh6UHJpbWUgLSBhLCBhKSArIHBoaSgwLCB6UHJpbWUpKSArIDIgKiBhICogcGhpKHpQcmltZSwgMCkpXG4gICAgICAvICh2ICogcGhpKHpQcmltZSwgYSkgKiBwaGkoLWEsIDApKTtcbiAgICByZXR1cm4gdDAgKyBtZWFuICogMTAwMDtcbiAgfVxuXG4gIC8vIFNEIEVycm9yIFJUXG4gIC8vIEVxdWF0aW9uIDE0IChHcmFzbWFuIGV0IGFsLiwgMjAwOSlcbiAgc3RhdGljIGF6djJzZEUoYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7XG4gICAgICByZXR1cm4gTWF0aC5leHAoKDIgKiB2ICogeSkgLyAocyAqKiAyKSkgLSBNYXRoLmV4cCgoMiAqIHYgKiB4KSAvIChzICoqIDIpKTtcbiAgICB9XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG5cbiAgICBjb25zdCB2YXJpYW5jZSA9IChcbiAgICAgIChcbiAgICAgICAgLTIgKiBhICogcGhpKDAsIHpQcmltZSlcbiAgICAgICAgKiAoKDIgKiB2ICogYSAqIHBoaSh6UHJpbWUsIDIgKiBhKSkgKyAocyAqKiAyICogcGhpKDAsIGEpICogcGhpKHpQcmltZSwgYSkpKVxuICAgICAgICAqIE1hdGguZXhwKCgyICogdiAqIGEpIC8gcyAqKiAyKVxuICAgICAgKSAvIChcbiAgICAgICAgdiAqKiAzICogcGhpKDAsIGEpICoqIDIgKiBwaGkoelByaW1lLCBhKSAqKiAyXG4gICAgICApXG4gICAgKSArIChcbiAgICAgIChcbiAgICAgICAgNCAqIHYgKiB6UHJpbWUgKiAoMiAqIGEgLSB6UHJpbWUpICogTWF0aC5leHAoKDIgKiB2ICogKHpQcmltZSArIGEpKSAvIHMgKiogMilcbiAgICAgICAgKyB6UHJpbWUgKiBzICoqIDIgKiBwaGkoMiAqIHpQcmltZSwgMiAqIGEpXG4gICAgICApIC8gKFxuICAgICAgICB2ICoqIDMgKiBwaGkoelByaW1lLCBhKSAqKiAyXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiBNYXRoLnNxcnQodmFyaWFuY2UpICogMTAwMDtcbiAgfVxuXG4gIC8vIE1lYW4gQ29ycmVjdCBSVFxuICBzdGF0aWMgYXp2dDAybUMoYSwgeiwgdiwgdDAsIHMgPSBERE1NYXRoLnMpIHtcbiAgICByZXR1cm4gRERNTWF0aC5henZ0MDJtRShhLCAxIC0geiwgLXYsIHQwLCBzKTtcbiAgfVxuXG4gIC8vIFNEIENvcnJlY3QgUlRcbiAgc3RhdGljIGF6djJzZEMoYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIHJldHVybiBERE1NYXRoLmF6djJzZEUoYSwgMSAtIHosIC12LCBzKTtcbiAgfVxuXG4gIC8vIERlbnNpdHkgb2YgRXJyb3IgUlRcbiAgc3RhdGljIHRhenYyZ0UodCwgYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIGlmICghdCkgcmV0dXJuIDA7XG5cbiAgICBjb25zdCB6UHJpbWUgPSBhICogejtcbiAgICBjb25zdCBiYXNlID0gKChNYXRoLlBJICogcyAqKiAyKSAvIGEgKiogMikgKiBNYXRoLmV4cCgoLXpQcmltZSAqIHYpIC8gcyAqKiAyKTtcblxuICAgIGxldCBrID0gMDtcbiAgICBsZXQgdGVybSA9IDA7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZG8ge1xuICAgICAgayArPSAxO1xuXG4gICAgICB0ZXJtID0ga1xuICAgICAgICAqIE1hdGguc2luKChNYXRoLlBJICogelByaW1lICogaykgLyBhKVxuICAgICAgICAqIE1hdGguZXhwKC0wLjUgKiAoKHYgKiogMiAvIHMgKiogMikgKyAoKE1hdGguUEkgKiogMiAqIGsgKiogMiAqIHMgKiogMikgLyBhICoqIDIpKSAqIHQpO1xuXG4gICAgICBzdW0gKz0gdGVybTtcbiAgICB9IHdoaWxlIChrIDwgMjAwKTsgLy8gPz8gSEFDS1xuXG4gICAgcmV0dXJuIGJhc2UgKiBzdW07XG4gIH1cblxuICAvLyBEZW5zaXR5IG9mIENvcnJlY3QgUlRcbiAgc3RhdGljIHRhenYyZ0ModCwgYSwgeiwgdiwgcyA9IERETU1hdGgucykge1xuICAgIHJldHVybiBERE1NYXRoLnRhenYyZ0UodCwgYSwgMSAtIHosIC12LCBzKTtcbiAgfVxuXG4gIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3Jhb3VsLnNvY3NjaS51dmEubmwvRVoyL0VaMl9uZXcuaHRtbFxuICAvLyBFWi1mdW5jdGlvbiBmb3Igc3RhcnRpbmcgdmFsdWVzXG4gIC8vIGlucHV0OiBvYmogLSBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gIC8vICAgIHBDIC0gUHJvcG9ydGlvbiBjb3JyZWN0XG4gIC8vICAgIHNkIC0gc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgUlQncyBpbiBtc1xuICAvLyAgICBtIC0gc2FtcGxlIG1lYW4gb2YgdGhlIFJUJ3MgaW4gbXNcbiAgLy8gICAgcyAtIGRpZmZ1c2lvbiBzdGFuZGFyZCBkZXZpYXRpb25cbiAgLy8gcmV0dXJuczogT2JqZWN0IHdpdGggcHJvcGVydGllcyB2LCBhLCBhbmQgdDAsIGNvbnRhaW5pbmcgRVotZXN0aW1hdGVzIG9mIHRoZXNlIHBhcmFtZXRlcnNcbiAgc3RhdGljIGRhdGEyZXooe1xuICAgIGFjY3VyYWN5OiBwQyxcbiAgICBzZFJUOiBzZCxcbiAgICBtZWFuUlQ6IG0sXG4gICAgcyxcbiAgfSkge1xuICAgIGZ1bmN0aW9uIHNpZ24ocikge1xuICAgICAgcmV0dXJuICgociA+IDApID8gMSA6ICgociA9PT0gMCkgPyAwIDogLTEpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2dpdChwKSB7XG4gICAgICByZXR1cm4gTWF0aC5sb2cocCAvICgxIC0gcCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHZydCA9IChzZCAvIDEwMDApICoqIDI7XG4gICAgY29uc3QgbXJ0ID0gbSAvIDEwMDA7XG5cbiAgICBjb25zdCBzMiA9IHMgKiogMjtcbiAgICBjb25zdCBsID0gbG9naXQocEMpO1xuICAgIGNvbnN0IHggPSAobCAqIChsICogcEMgKiogMiAtIGwgKiBwQyArIHBDIC0gMC41KSkgLyB2cnQ7XG4gICAgY29uc3QgdiA9IHNpZ24ocEMgLSAwLjUpICogcyAqIHggKiogKDEgLyA0KTtcbiAgICBjb25zdCBhID0gKHMyICogbG9naXQocEMpKSAvIHY7XG4gICAgY29uc3QgeSA9ICgtdiAqIGEpIC8gczI7XG4gICAgY29uc3QgbWR0ID0gKChhIC8gKDIgKiB2KSkgKiAoMSAtIE1hdGguZXhwKHkpKSkgLyAoMSArIE1hdGguZXhwKHkpKTtcbiAgICBjb25zdCB0MCA9IChtcnQgPyBtcnQgLSBtZHQgOiBudWxsKTsgLy8gY29tcHV0ZSBUZXIgb25seSBpZiBNUlQgd2FzIHByb3ZpZGVkXG5cbiAgICBjb25zdCB0MFByaW1lID0gdDAgKiAxMDAwO1xuICAgIHJldHVybiB7XG4gICAgICB2LFxuICAgICAgYSxcbiAgICAgIHQwOiB0MFByaW1lLFxuICAgICAgcyxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGRhdGEyZXoyKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZGF0YTJlejIgaXMgbm90IGltcGxlbWVudGVkIScpO1xuICB9XG59XG4iLCJcbi8vIEludGVybmFsIGRlcGVuZGVuY2llc1xuaW1wb3J0IERETU1hdGggZnJvbSAnLi9kZG0tbWF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IERETU1hdGg7XG4iLCIvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbXCJvZmZcIiwgXCJzZWxmXCJdICovXG5cbmltcG9ydCBERE1NYXRoIGZyb20gJ0BkZWNpZGFibGVzL2FjY3VtdWxhYmxlLW1hdGgnO1xuXG5zZWxmLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICBjb25zdCBwYXJhbXMgPSBERE1NYXRoLmRhdGEyZXooey4uLmV2ZW50LmRhdGEsIHM6IERETU1hdGguc30pO1xuXG4gIC8vICMjIyMjIEFyYml0cmFyeSBkZWZhdWx0IHZhbHVlcyEhIVxuICBjb25zdCBhID0gIWlzTmFOKHBhcmFtcy5hKSA/IHBhcmFtcy5hIDogMS41O1xuICBjb25zdCB6ID0gIWlzTmFOKHBhcmFtcy56KSA/IHBhcmFtcy56IDogMC41O1xuICBjb25zdCB2ID0gIWlzTmFOKHBhcmFtcy52KSA/IHBhcmFtcy52IDogMC4xO1xuICBjb25zdCB0MCA9ICFpc05hTihwYXJhbXMudDApID8gcGFyYW1zLnQwIDogMTAwO1xuICBjb25zdCBzID0gIWlzTmFOKHBhcmFtcy5zKSA/IHBhcmFtcy5zIDogRERNTWF0aC5zO1xuXG4gIGNvbnN0IHByZWRpY3RlZCA9IHtcbiAgICBhY2N1cmFjeTogRERNTWF0aC5henYycEMoYSwgeiwgdiksXG4gICAgY29ycmVjdE1lYW5SVDogRERNTWF0aC5henZ0MDJtQyhhLCB6LCB2LCB0MCksXG4gICAgZXJyb3JNZWFuUlQ6IERETU1hdGguYXp2dDAybUUoYSwgeiwgdiwgdDApLFxuICAgIG1lYW5SVDogRERNTWF0aC5henZ0MDJtKGEsIHosIHYsIHQwKSxcbiAgICBjb3JyZWN0U0RSVDogRERNTWF0aC5henYyc2RDKGEsIHosIHYpLFxuICAgIGVycm9yU0RSVDogRERNTWF0aC5henYyc2RFKGEsIHosIHYpLFxuICAgIHNkUlQ6IERETU1hdGguYXp2MnNkKGEsIHosIHYpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIHBhcmFtczoge1xuICAgICAgYSwgeiwgdiwgdDAsIHMsXG4gICAgfSxcbiAgICBwcmVkaWN0ZWQsXG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6WyJERE1NYXRoIiwicyIsInRyaWFsczJzdGF0cyIsInRyaWFscyIsInN0YXRzIiwic3VtcyIsInJlZHVjZSIsImFjY3VtdWxhdG9yIiwidHJpYWwiLCJvdXRjb21lIiwiY29ycmVjdENvdW50IiwiY29ycmVjdFJUU3VtIiwicnQiLCJlcnJvckNvdW50IiwiZXJyb3JSVFN1bSIsIm5yQ291bnQiLCJhY2N1cmFjeSIsImNvcnJlY3RNZWFuUlQiLCJlcnJvck1lYW5SVCIsIm1lYW5SVCIsInN1bXMyIiwic3MiLCJjb3JyZWN0U1MiLCJlcnJvclNTIiwiY29ycmVjdFNEUlQiLCJNYXRoIiwic3FydCIsIk5hTiIsImVycm9yU0RSVCIsInNkUlQiLCJhenYycEUiLCJhIiwieiIsInYiLCJ6UHJpbWUiLCJBIiwiZXhwIiwiWiIsImF6djJwQyIsImF6dnQwMm0iLCJ0MCIsIm1lYW4iLCJhenYyc2QiLCJ2YXJpYW5jZSIsImF6dnQwMm1FIiwicGhpIiwieCIsInkiLCJhenYyc2RFIiwiYXp2dDAybUMiLCJhenYyc2RDIiwidGF6djJnRSIsInQiLCJiYXNlIiwiUEkiLCJrIiwidGVybSIsInN1bSIsInNpbiIsInRhenYyZ0MiLCJkYXRhMmV6IiwicEMiLCJzZCIsIm0iLCJzaWduIiwiciIsImxvZ2l0IiwicCIsImxvZyIsInZydCIsIm1ydCIsInMyIiwibCIsIm1kdCIsInQwUHJpbWUiLCJkYXRhMmV6MiIsIkVycm9yIiwic2VsZiIsIm9ubWVzc2FnZSIsImV2ZW50IiwicGFyYW1zIiwiZGF0YSIsImlzTmFOIiwicHJlZGljdGVkIiwicG9zdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7OztFQUNBO0VBQ0E7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNlLE1BQU1BLE9BQU8sQ0FBQztJQUMzQixPQUFPQyxDQUFDLEdBQUcsQ0FBQzs7RUFFWjtJQUNBLE9BQU9DLFlBQVlBLENBQUNDLE1BQU0sRUFBRTtNQUMxQixNQUFNQyxLQUFLLEdBQUcsRUFBRTs7RUFFaEI7TUFDQSxNQUFNQyxJQUFJLEdBQUdGLE1BQU0sQ0FBQ0csTUFBTSxDQUN4QixDQUFDQyxXQUFXLEVBQUVDLEtBQUssS0FBSztRQUN0QixRQUFRQSxLQUFLLENBQUNDLE9BQU87RUFDbkIsUUFBQSxLQUFLLFNBQVM7WUFDWkYsV0FBVyxDQUFDRyxZQUFZLElBQUksQ0FBQztFQUM3QkgsVUFBQUEsV0FBVyxDQUFDSSxZQUFZLElBQUlILEtBQUssQ0FBQ0ksRUFBRTtF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');
7342
+ var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoKICAgIERETU1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIQoKICAgIE1vZGVsIHBhcmFtZXRlcnM6CiAgICAgIGEgPSBib3VuZGFyeSBzZXBhcmF0aW9uIFswLCBJbmZpbml0eSkKICAgICAgeiA9IHN0YXJ0aW5nIHBvaW50IGFzIGEgcHJvcG9ydGlvbiBvZiBhICgwLCAxKQogICAgICB2ID0gZHJpZnQgcmF0ZSAocGVyIHNlY29uZCkgKC1JbmZpbml0eSwgSW5maW5pdHkpCiAgICAgIHQwID0gbm9uLWRlY2lzaW9uIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgKDAsIEluZmluaXR5KQogICAgICBzID0gd2l0aGluLXRyaWFsIHZhcmlhYmlsaXR5IGluIGRyaWZ0IHJhdGUgKHNeMiA9IGluZmluaXRlc2ltYWwgdmFyaWFuY2UpIFswLCBJbmZpbml0eSkKCiAgICAgIHpQcmltZSA9IHN0YXJ0aW5nIHBvaW50IG9uIGEgMC10by1hIHNjYWxlICh0eXBpY2FsbHkgdXNlZCBpbiBwdWJsaXNoZWQgZXF1YXRpb25zKSBbMCwgSW5maW5pdHkpCgogICAgQmVoYXZpb3JhbCB2YXJpYWJsZXM6CiAgICAgIHBFID0gcHJvcG9ydGlvbiBvZiBlcnJvciB0cmlhbHMKICAgICAgcEMgPSBwcm9wb3J0aW9uIG9mIGNvcnJlY3QgdHJpYWxzCiAgICAgIG0gPSBtZWFuIG9mIG92ZXJhbGwgUlRzIChpbiBtaWxsaXNlY29uZHMpCiAgICAgIG1FID0gbWVhbiBvZiBlcnJvciBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgbUMgPSBtZWFuIGNvcnJlY3QgUlRzIChpbiBtaWxsaXNlY29uZHMpCiAgICAgIHNkID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIG92ZXJhbGwgUlRzIChpbiBtaWxsaXNlY29uZHMpCiAgICAgIHNkRSA9IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlcnJvciBSVHMgKGluIG1pbGxpc2Vjb25kcykKICAgICAgc2RDID0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGNvcnJlY3QgUlRzIChpbiBtaWxsaXNlY29uZHMpCgogICAgRXF1YXRpb25zOgogICAgICBQcm9iYWJpbGl0eSBvZiBjb3JyZWN0IGFuZCBlcnJvciByZXNwb25zZXMgKEFsZXhhbmRyb3dpY3osIDIwMjApCiAgICAgIE1lYW4gb2Ygb3ZlcmFsbCwgZXJyb3IsIGFuZCBjb3JyZWN0IFJUcyAoR3Jhc21hbiBldCBhbC4sIDIwMDkpCiAgICAgIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBvdmVyYWxsLCBlcnJvciwgYW5kIGNvcnJlY3QgUlRzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgICAgRGVuc2l0eSBvZiBlcnJvciBhbmQgY29ycmVjdCBSVCBkaXN0cmlidXRpb25zIChBbGV4YW5kcm93aWN6LCAyMDIwKQogICAgICBFWi1kaWZmdXNpb24gbW9kZWwgKFdhZ2VubWFrZXJzIGV0IGFsLiwgMjAwNykKICAqLwogIGNsYXNzIERETU1hdGggewogICAgc3RhdGljIHMgPSB7CiAgICAgIERFRkFVTFQ6IDEKICAgIH07CiAgICBzdGF0aWMgYSA9IHsKICAgICAgREVGQVVMVDogMS4yLAogICAgICBNSU46IDAuMDEsCiAgICAgIE1BWDogMi4wLAogICAgICBTVEVQOiAwLjAxLAogICAgICBKVU1QOiAwLjEKICAgIH07CiAgICBzdGF0aWMgeiA9IHsKICAgICAgREVGQVVMVDogMC41NSwKICAgICAgTUlOOiAwLjAxLAogICAgICBNQVg6IDAuOTksCiAgICAgIFNURVA6IDAuMDEsCiAgICAgIEpVTVA6IDAuMQogICAgfTsKICAgIHN0YXRpYyB2ID0gewogICAgICBERUZBVUxUOiAxLjUsCiAgICAgIE1JTjogMC4wMSwKICAgICAgTUFYOiA1LjAsCiAgICAgIFNURVA6IDAuMDEsCiAgICAgIEpVTVA6IDAuMQogICAgfTsKICAgIHN0YXRpYyB0MCA9IHsKICAgICAgREVGQVVMVDogMTUwLAogICAgICBNSU46IDAsCiAgICAgIE1BWDogNTAwLAogICAgICBTVEVQOiAxLAogICAgICBKVU1QOiAxMAogICAgfTsKCiAgICAvLyBDYWxjdWxhdGUgYSBidW5jaCBvZiBzdGF0aXN0aWNzIGZvciBhbiBhcnJheSBvZiB0cmlhbHMKICAgIHN0YXRpYyB0cmlhbHMyc3RhdHModHJpYWxzKSB7CiAgICAgIGNvbnN0IHN0YXRzID0ge307CgogICAgICAvLyBGaXJzdC1vcmRlciBzdW1zCiAgICAgIGNvbnN0IHN1bXMgPSB0cmlhbHMucmVkdWNlKChhY2N1bXVsYXRvciwgdHJpYWwpID0+IHsKICAgICAgICBzd2l0Y2ggKHRyaWFsLm91dGNvbWUpIHsKICAgICAgICAgIGNhc2UgJ2NvcnJlY3QnOgogICAgICAgICAgICBhY2N1bXVsYXRvci5jb3JyZWN0Q291bnQgKz0gMTsKICAgICAgICAgICAgYWNjdW11bGF0b3IuY29ycmVjdFJUU3VtICs9IHRyaWFsLnJ0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgICAgICAgYWNjdW11bGF0b3IuZXJyb3JDb3VudCArPSAxOwogICAgICAgICAgICBhY2N1bXVsYXRvci5lcnJvclJUU3VtICs9IHRyaWFsLnJ0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ25yJzoKICAgICAgICAgICAgYWNjdW11bGF0b3IubnJDb3VudCArPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIC8vIE5vLW9wCiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgfSwgewogICAgICAgIGNvcnJlY3RDb3VudDogMCwKICAgICAgICBlcnJvckNvdW50OiAwLAogICAgICAgIG5yQ291bnQ6IDAsCiAgICAgICAgY29ycmVjdFJUU3VtOiAwLAogICAgICAgIGVycm9yUlRTdW06IDAKICAgICAgfSk7CgogICAgICAvLyBGaXJzdC1vcmRlciBzdGF0cwogICAgICBzdGF0cy5jb3JyZWN0Q291bnQgPSBzdW1zLmNvcnJlY3RDb3VudDsKICAgICAgc3RhdHMuZXJyb3JDb3VudCA9IHN1bXMuZXJyb3JDb3VudDsKICAgICAgc3RhdHMubnJDb3VudCA9IHN1bXMubnJDb3VudDsKICAgICAgc3RhdHMuYWNjdXJhY3kgPSBzdW1zLmNvcnJlY3RDb3VudCAvIChzdW1zLmNvcnJlY3RDb3VudCArIHN1bXMuZXJyb3JDb3VudCArIHN1bXMubnJDb3VudCk7CiAgICAgIHN0YXRzLmNvcnJlY3RNZWFuUlQgPSBzdW1zLmNvcnJlY3RSVFN1bSAvIHN1bXMuY29ycmVjdENvdW50OwogICAgICBzdGF0cy5lcnJvck1lYW5SVCA9IHN1bXMuZXJyb3JSVFN1bSAvIHN1bXMuZXJyb3JDb3VudDsKICAgICAgc3RhdHMubWVhblJUID0gKHN1bXMuY29ycmVjdFJUU3VtICsgc3Vtcy5lcnJvclJUU3VtKSAvIChzdW1zLmNvcnJlY3RDb3VudCArIHN1bXMuZXJyb3JDb3VudCk7CgogICAgICAvLyBTZWNvbmQtb3JkZXIgc3VtcwogICAgICBjb25zdCBzdW1zMiA9IHRyaWFscy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCB0cmlhbCkgPT4gewogICAgICAgIHN3aXRjaCAodHJpYWwub3V0Y29tZSkgewogICAgICAgICAgY2FzZSAnY29ycmVjdCc6CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnNzICs9ICh0cmlhbC5ydCAtIHN0YXRzLm1lYW5SVCkgKiogMjsKICAgICAgICAgICAgYWNjdW11bGF0b3IuY29ycmVjdFNTICs9ICh0cmlhbC5ydCAtIHN0YXRzLmNvcnJlY3RNZWFuUlQpICoqIDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnZXJyb3InOgogICAgICAgICAgICBhY2N1bXVsYXRvci5zcyArPSAodHJpYWwucnQgLSBzdGF0cy5tZWFuUlQpICoqIDI7CiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yU1MgKz0gKHRyaWFsLnJ0IC0gc3RhdHMuZXJyb3JNZWFuUlQpICoqIDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgLy8gTm8tb3AKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICB9LCB7CiAgICAgICAgc3M6IDAsCiAgICAgICAgY29ycmVjdFNTOiAwLAogICAgICAgIGVycm9yU1M6IDAKICAgICAgfSk7CgogICAgICAvLyBTZWNvbmQtb3JkZXIgc3RhdHMKICAgICAgc3RhdHMuY29ycmVjdFNEUlQgPSBzdGF0cy5jb3JyZWN0Q291bnQgPiAxID8gTWF0aC5zcXJ0KHN1bXMyLmNvcnJlY3RTUyAvIChzdGF0cy5jb3JyZWN0Q291bnQgLSAxKSkgOiBOYU47CiAgICAgIHN0YXRzLmVycm9yU0RSVCA9IHN0YXRzLmVycm9yQ291bnQgPiAxID8gTWF0aC5zcXJ0KHN1bXMyLmVycm9yU1MgLyAoc3RhdHMuZXJyb3JDb3VudCAtIDEpKSA6IE5hTjsKICAgICAgc3RhdHMuc2RSVCA9IHN0YXRzLmNvcnJlY3RDb3VudCArIHN0YXRzLmVycm9yQ291bnQgPiAxID8gTWF0aC5zcXJ0KHN1bXMyLnNzIC8gKHN0YXRzLmNvcnJlY3RDb3VudCArIHN0YXRzLmVycm9yQ291bnQgLSAxKSkgOiBOYU47CiAgICAgIHJldHVybiBzdGF0czsKICAgIH0KCiAgICAvLyBQcm9iYWJpbGl0eSBvZiBhbiBFcnJvciBSZXNwb25zZQogICAgc3RhdGljIGF6djJwRShhLCB6LCB2LCBzID0gRERNTWF0aC5zLkRFRkFVTFQpIHsKICAgICAgY29uc3QgelByaW1lID0gYSAqIHo7CiAgICAgIGNvbnN0IEEgPSBNYXRoLmV4cCgtMiAqIHYgKiBhIC8gcyAqKiAyKTsKICAgICAgY29uc3QgWiA9IE1hdGguZXhwKC0yICogdiAqIHpQcmltZSAvIHMgKiogMik7CiAgICAgIHJldHVybiAoQSAtIFopIC8gKEEgLSAxKTsKICAgIH0KCiAgICAvLyBQcm9iYWJpbGl0eSBvZiBhIENvcnJlY3QgUmVzcG9uc2UKICAgIHN0YXRpYyBhenYycEMoYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIHJldHVybiBERE1NYXRoLmF6djJwRShhLCAxIC0geiwgLXYsIHMpOwogICAgfQoKICAgIC8vIE1lYW4gT3ZlcmFsbCBSVAogICAgLy8gRXF1YXRpb24gNSAoR3Jhc21hbiBldCBhbC4sIDIwMDkpCiAgICBzdGF0aWMgYXp2dDAybShhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBBID0gTWF0aC5leHAoLTIgKiB2ICogYSAvIHMgKiogMikgLSAxOwogICAgICBjb25zdCBaID0gTWF0aC5leHAoLTIgKiB2ICogelByaW1lIC8gcyAqKiAyKSAtIDE7CiAgICAgIGNvbnN0IG1lYW4gPSAtKHpQcmltZSAvIHYpICsgYSAvIHYgKiAoWiAvIEEpOwogICAgICByZXR1cm4gdDAgKyBtZWFuICogMTAwMDsKICAgIH0KCiAgICAvLyBTRCBPdmVyYWxsIFJUCiAgICAvLyBFcXVhdGlvbiA2IChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgIHN0YXRpYyBhenYyc2QoYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBBID0gTWF0aC5leHAoLTIgKiB2ICogYSAvIHMgKiogMikgLSAxOwogICAgICBjb25zdCBaID0gTWF0aC5leHAoLTIgKiB2ICogelByaW1lIC8gcyAqKiAyKSAtIDE7CiAgICAgIGNvbnN0IHZhcmlhbmNlID0gKC12ICogYSAqKiAyICogKFogKyA0KSAqIFogLyBBICoqIDIgKyAoKC0zICogdiAqIGEgKiogMiArIDQgKiB2ICogelByaW1lICogYSArIHMgKiogMiAqIGEpICogWiArIDQgKiB2ICogelByaW1lICogYSkgLyBBIC0gcyAqKiAyICogelByaW1lKSAvIHYgKiogMzsKICAgICAgcmV0dXJuIE1hdGguc3FydCh2YXJpYW5jZSkgKiAxMDAwOwogICAgfQoKICAgIC8vIE1lYW4gRXJyb3IgUlQKICAgIC8vIEVxdWF0aW9uIDEzIChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgIHN0YXRpYyBhenZ0MDJtRShhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7CiAgICAgICAgcmV0dXJuIE1hdGguZXhwKDIgKiB2ICogeSAvIHMgKiogMikgLSBNYXRoLmV4cCgyICogdiAqIHggLyBzICoqIDIpOwogICAgICB9CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBtZWFuID0gKHpQcmltZSAqIChwaGkoelByaW1lIC0gYSwgYSkgKyBwaGkoMCwgelByaW1lKSkgKyAyICogYSAqIHBoaSh6UHJpbWUsIDApKSAvICh2ICogcGhpKHpQcmltZSwgYSkgKiBwaGkoLWEsIDApKTsKICAgICAgcmV0dXJuIHQwICsgbWVhbiAqIDEwMDA7CiAgICB9CgogICAgLy8gU0QgRXJyb3IgUlQKICAgIC8vIEVxdWF0aW9uIDE0IChHcmFzbWFuIGV0IGFsLiwgMjAwOSkKICAgIHN0YXRpYyBhenYyc2RFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkgewogICAgICBmdW5jdGlvbiBwaGkoeCwgeSkgewogICAgICAgIHJldHVybiBNYXRoLmV4cCgyICogdiAqIHkgLyBzICoqIDIpIC0gTWF0aC5leHAoMiAqIHYgKiB4IC8gcyAqKiAyKTsKICAgICAgfQogICAgICBjb25zdCB6UHJpbWUgPSBhICogejsKICAgICAgY29uc3QgdmFyaWFuY2UgPSAtMiAqIGEgKiBwaGkoMCwgelByaW1lKSAqICgyICogdiAqIGEgKiBwaGkoelByaW1lLCAyICogYSkgKyBzICoqIDIgKiBwaGkoMCwgYSkgKiBwaGkoelByaW1lLCBhKSkgKiBNYXRoLmV4cCgyICogdiAqIGEgLyBzICoqIDIpIC8gKHYgKiogMyAqIHBoaSgwLCBhKSAqKiAyICogcGhpKHpQcmltZSwgYSkgKiogMikgKyAoNCAqIHYgKiB6UHJpbWUgKiAoMiAqIGEgLSB6UHJpbWUpICogTWF0aC5leHAoMiAqIHYgKiAoelByaW1lICsgYSkgLyBzICoqIDIpICsgelByaW1lICogcyAqKiAyICogcGhpKDIgKiB6UHJpbWUsIDIgKiBhKSkgLyAodiAqKiAzICogcGhpKHpQcmltZSwgYSkgKiogMik7CiAgICAgIHJldHVybiBNYXRoLnNxcnQodmFyaWFuY2UpICogMTAwMDsKICAgIH0KCiAgICAvLyBNZWFuIENvcnJlY3QgUlQKICAgIHN0YXRpYyBhenZ0MDJtQyhhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIHJldHVybiBERE1NYXRoLmF6dnQwMm1FKGEsIDEgLSB6LCAtdiwgdDAsIHMpOwogICAgfQoKICAgIC8vIFNEIENvcnJlY3QgUlQKICAgIHN0YXRpYyBhenYyc2RDKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkgewogICAgICByZXR1cm4gRERNTWF0aC5henYyc2RFKGEsIDEgLSB6LCAtdiwgcyk7CiAgICB9CgogICAgLy8gRGVuc2l0eSBvZiBFcnJvciBSVAogICAgc3RhdGljIHRhenYyZ0UodCwgYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7CiAgICAgIGlmICghdCkgcmV0dXJuIDA7CiAgICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6OwogICAgICBjb25zdCBiYXNlID0gTWF0aC5QSSAqIHMgKiogMiAvIGEgKiogMiAqIE1hdGguZXhwKC16UHJpbWUgKiB2IC8gcyAqKiAyKTsKICAgICAgbGV0IGsgPSAwOwogICAgICBsZXQgdGVybSA9IDA7CiAgICAgIGxldCBzdW0gPSAwOwogICAgICBkbyB7CiAgICAgICAgayArPSAxOwogICAgICAgIHRlcm0gPSBrICogTWF0aC5zaW4oTWF0aC5QSSAqIHpQcmltZSAqIGsgLyBhKSAqIE1hdGguZXhwKC0wLjUgKiAodiAqKiAyIC8gcyAqKiAyICsgTWF0aC5QSSAqKiAyICogayAqKiAyICogcyAqKiAyIC8gYSAqKiAyKSAqIHQpOwogICAgICAgIHN1bSArPSB0ZXJtOwogICAgICB9IHdoaWxlIChrIDwgMjAwKTsgLy8gPz8gSEFDSwoKICAgICAgcmV0dXJuIGJhc2UgKiBzdW07CiAgICB9CgogICAgLy8gRGVuc2l0eSBvZiBDb3JyZWN0IFJUCiAgICBzdGF0aWMgdGF6djJnQyh0LCBhLCB6LCB2LCBzID0gRERNTWF0aC5zLkRFRkFVTFQpIHsKICAgICAgcmV0dXJuIERETU1hdGgudGF6djJnRSh0LCBhLCAxIC0geiwgLXYsIHMpOwogICAgfQoKICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3Jhb3VsLnNvY3NjaS51dmEubmwvRVoyL0VaMl9uZXcuaHRtbAogICAgLy8gRVotZnVuY3Rpb24gZm9yIHN0YXJ0aW5nIHZhbHVlcwogICAgLy8gaW5wdXQ6IG9iaiAtIE9iamVjdCB3aXRoIHByb3BlcnRpZXMKICAgIC8vICAgIHBDIC0gUHJvcG9ydGlvbiBjb3JyZWN0CiAgICAvLyAgICBzZCAtIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIFJUJ3MgaW4gbXMKICAgIC8vICAgIG0gLSBzYW1wbGUgbWVhbiBvZiB0aGUgUlQncyBpbiBtcwogICAgLy8gICAgcyAtIGRpZmZ1c2lvbiBzdGFuZGFyZCBkZXZpYXRpb24KICAgIC8vIHJldHVybnM6IE9iamVjdCB3aXRoIHByb3BlcnRpZXMgdiwgYSwgYW5kIHQwLCBjb250YWluaW5nIEVaLWVzdGltYXRlcyBvZiB0aGVzZSBwYXJhbWV0ZXJzCiAgICBzdGF0aWMgZGF0YTJleih7CiAgICAgIGFjY3VyYWN5OiBwQywKICAgICAgc2RSVDogc2QsCiAgICAgIG1lYW5SVDogbSwKICAgICAgcwogICAgfSkgewogICAgICBmdW5jdGlvbiBzaWduKHIpIHsKICAgICAgICByZXR1cm4gciA+IDAgPyAxIDogciA9PT0gMCA/IDAgOiAtMTsKICAgICAgfQogICAgICBmdW5jdGlvbiBsb2dpdChwKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubG9nKHAgLyAoMSAtIHApKTsKICAgICAgfQogICAgICBjb25zdCB2cnQgPSAoc2QgLyAxMDAwKSAqKiAyOwogICAgICBjb25zdCBtcnQgPSBtIC8gMTAwMDsKICAgICAgY29uc3QgczIgPSBzICoqIDI7CiAgICAgIGNvbnN0IGwgPSBsb2dpdChwQyk7CiAgICAgIGNvbnN0IHggPSBsICogKGwgKiBwQyAqKiAyIC0gbCAqIHBDICsgcEMgLSAwLjUpIC8gdnJ0OwogICAgICBjb25zdCB2ID0gc2lnbihwQyAtIDAuNSkgKiBzICogeCAqKiAoMSAvIDQpOwogICAgICBjb25zdCBhID0gczIgKiBsb2dpdChwQykgLyB2OwogICAgICBjb25zdCB5ID0gLXYgKiBhIC8gczI7CiAgICAgIGNvbnN0IG1kdCA9IGEgLyAoMiAqIHYpICogKDEgLSBNYXRoLmV4cCh5KSkgLyAoMSArIE1hdGguZXhwKHkpKTsKICAgICAgY29uc3QgdDAgPSBtcnQgPyBtcnQgLSBtZHQgOiBudWxsOyAvLyBjb21wdXRlIFRlciBvbmx5IGlmIE1SVCB3YXMgcHJvdmlkZWQKCiAgICAgIGNvbnN0IHQwUHJpbWUgPSB0MCAqIDEwMDA7CiAgICAgIHJldHVybiB7CiAgICAgICAgdiwKICAgICAgICBhLAogICAgICAgIHQwOiB0MFByaW1lLAogICAgICAgIHMKICAgICAgfTsKICAgIH0KICAgIHN0YXRpYyBkYXRhMmV6MigpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhMmV6MiBpcyBub3QgaW1wbGVtZW50ZWQhJyk7CiAgICB9CiAgfQoKICAvLyBJbnRlcm5hbCBkZXBlbmRlbmNpZXMKCiAgLyogZXNsaW50IG5vLXJlc3RyaWN0ZWQtZ2xvYmFsczogWyJvZmYiLCAic2VsZiJdICovCgogIHNlbGYub25tZXNzYWdlID0gZXZlbnQgPT4gewogICAgY29uc3QgcGFyYW1zID0gRERNTWF0aC5kYXRhMmV6KHsKICAgICAgLi4uZXZlbnQuZGF0YSwKICAgICAgczogRERNTWF0aC5zLkRFRkFVTFQKICAgIH0pOwoKICAgIC8vICMjIyMjIEFyYml0cmFyeSBkZWZhdWx0IHZhbHVlcyEhIQogICAgY29uc3QgYSA9ICFpc05hTihwYXJhbXMuYSkgPyBwYXJhbXMuYSA6IDEuNTsKICAgIGNvbnN0IHogPSAhaXNOYU4ocGFyYW1zLnopID8gcGFyYW1zLnogOiAwLjU7CiAgICBjb25zdCB2ID0gIWlzTmFOKHBhcmFtcy52KSA/IHBhcmFtcy52IDogMC4xOwogICAgY29uc3QgdDAgPSAhaXNOYU4ocGFyYW1zLnQwKSA/IHBhcmFtcy50MCA6IDEwMDsKICAgIGNvbnN0IHMgPSAhaXNOYU4ocGFyYW1zLnMpID8gcGFyYW1zLnMgOiBERE1NYXRoLnMuREVGQVVMVDsKICAgIGNvbnN0IHByZWRpY3RlZCA9IHsKICAgICAgYWNjdXJhY3k6IERETU1hdGguYXp2MnBDKGEsIHosIHYpLAogICAgICBjb3JyZWN0TWVhblJUOiBERE1NYXRoLmF6dnQwMm1DKGEsIHosIHYsIHQwKSwKICAgICAgZXJyb3JNZWFuUlQ6IERETU1hdGguYXp2dDAybUUoYSwgeiwgdiwgdDApLAogICAgICBtZWFuUlQ6IERETU1hdGguYXp2dDAybShhLCB6LCB2LCB0MCksCiAgICAgIGNvcnJlY3RTRFJUOiBERE1NYXRoLmF6djJzZEMoYSwgeiwgdiksCiAgICAgIGVycm9yU0RSVDogRERNTWF0aC5henYyc2RFKGEsIHosIHYpLAogICAgICBzZFJUOiBERE1NYXRoLmF6djJzZChhLCB6LCB2KQogICAgfTsKICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICBwYXJhbXM6IHsKICAgICAgICBhLAogICAgICAgIHosCiAgICAgICAgdiwKICAgICAgICB0MCwKICAgICAgICBzCiAgICAgIH0sCiAgICAgIHByZWRpY3RlZAogICAgfSk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWRkbS1maXQtd29ya2VyLmpzLm1hcAoK', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGRtLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uL2FjY3VtdWxhYmxlLW1hdGgvc3JjL2RkbS1tYXRoLmpzIiwiLi4vYWNjdW11bGFibGUtbWF0aC9zcmMvaW5kZXguanMiLCJzcmMvY29tcG9uZW50cy9kZG0tZml0LXdvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qXG4gIERETU1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIVxuXG4gIE1vZGVsIHBhcmFtZXRlcnM6XG4gICAgYSA9IGJvdW5kYXJ5IHNlcGFyYXRpb24gWzAsIEluZmluaXR5KVxuICAgIHogPSBzdGFydGluZyBwb2ludCBhcyBhIHByb3BvcnRpb24gb2YgYSAoMCwgMSlcbiAgICB2ID0gZHJpZnQgcmF0ZSAocGVyIHNlY29uZCkgKC1JbmZpbml0eSwgSW5maW5pdHkpXG4gICAgdDAgPSBub24tZGVjaXNpb24gdGltZSAoaW4gbWlsbGlzZWNvbmRzKSAoMCwgSW5maW5pdHkpXG4gICAgcyA9IHdpdGhpbi10cmlhbCB2YXJpYWJpbGl0eSBpbiBkcmlmdCByYXRlIChzXjIgPSBpbmZpbml0ZXNpbWFsIHZhcmlhbmNlKSBbMCwgSW5maW5pdHkpXG5cbiAgICB6UHJpbWUgPSBzdGFydGluZyBwb2ludCBvbiBhIDAtdG8tYSBzY2FsZSAodHlwaWNhbGx5IHVzZWQgaW4gcHVibGlzaGVkIGVxdWF0aW9ucykgWzAsIEluZmluaXR5KVxuXG4gIEJlaGF2aW9yYWwgdmFyaWFibGVzOlxuICAgIHBFID0gcHJvcG9ydGlvbiBvZiBlcnJvciB0cmlhbHNcbiAgICBwQyA9IHByb3BvcnRpb24gb2YgY29ycmVjdCB0cmlhbHNcbiAgICBtID0gbWVhbiBvZiBvdmVyYWxsIFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIG1FID0gbWVhbiBvZiBlcnJvciBSVHMgKGluIG1pbGxpc2Vjb25kcylcbiAgICBtQyA9IG1lYW4gY29ycmVjdCBSVHMgKGluIG1pbGxpc2Vjb25kcylcbiAgICBzZCA9IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBvdmVyYWxsIFJUcyAoaW4gbWlsbGlzZWNvbmRzKVxuICAgIHNkRSA9IHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlcnJvciBSVHMgKGluIG1pbGxpc2Vjb25kcylcbiAgICBzZEMgPSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgY29ycmVjdCBSVHMgKGluIG1pbGxpc2Vjb25kcylcblxuICBFcXVhdGlvbnM6XG4gICAgUHJvYmFiaWxpdHkgb2YgY29ycmVjdCBhbmQgZXJyb3IgcmVzcG9uc2VzIChBbGV4YW5kcm93aWN6LCAyMDIwKVxuICAgIE1lYW4gb2Ygb3ZlcmFsbCwgZXJyb3IsIGFuZCBjb3JyZWN0IFJUcyAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gICAgU3RhbmRhcmQgZGV2aWF0aW9uIG9mIG92ZXJhbGwsIGVycm9yLCBhbmQgY29ycmVjdCBSVHMgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KVxuICAgIERlbnNpdHkgb2YgZXJyb3IgYW5kIGNvcnJlY3QgUlQgZGlzdHJpYnV0aW9ucyAoQWxleGFuZHJvd2ljeiwgMjAyMClcbiAgICBFWi1kaWZmdXNpb24gbW9kZWwgKFdhZ2VubWFrZXJzIGV0IGFsLiwgMjAwNylcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBERE1NYXRoIHtcbiAgc3RhdGljIHMgPSB7XG4gICAgREVGQVVMVDogMSxcbiAgfTtcblxuICBzdGF0aWMgYSA9IHtcbiAgICBERUZBVUxUOiAxLjIsXG4gICAgTUlOOiAwLjAxLFxuICAgIE1BWDogMi4wLFxuICAgIFNURVA6IDAuMDEsXG4gICAgSlVNUDogMC4xLFxuICB9O1xuXG4gIHN0YXRpYyB6ID0ge1xuICAgIERFRkFVTFQ6IDAuNTUsXG4gICAgTUlOOiAwLjAxLFxuICAgIE1BWDogMC45OSxcbiAgICBTVEVQOiAwLjAxLFxuICAgIEpVTVA6IDAuMSxcbiAgfTtcblxuICBzdGF0aWMgdiA9IHtcbiAgICBERUZBVUxUOiAxLjUsXG4gICAgTUlOOiAwLjAxLFxuICAgIE1BWDogNS4wLFxuICAgIFNURVA6IDAuMDEsXG4gICAgSlVNUDogMC4xLFxuICB9O1xuXG4gIHN0YXRpYyB0MCA9IHtcbiAgICBERUZBVUxUOiAxNTAsXG4gICAgTUlOOiAwLFxuICAgIE1BWDogNTAwLFxuICAgIFNURVA6IDEsXG4gICAgSlVNUDogMTAsXG4gIH07XG5cbiAgLy8gQ2FsY3VsYXRlIGEgYnVuY2ggb2Ygc3RhdGlzdGljcyBmb3IgYW4gYXJyYXkgb2YgdHJpYWxzXG4gIHN0YXRpYyB0cmlhbHMyc3RhdHModHJpYWxzKSB7XG4gICAgY29uc3Qgc3RhdHMgPSB7fTtcblxuICAgIC8vIEZpcnN0LW9yZGVyIHN1bXNcbiAgICBjb25zdCBzdW1zID0gdHJpYWxzLnJlZHVjZShcbiAgICAgIChhY2N1bXVsYXRvciwgdHJpYWwpID0+IHtcbiAgICAgICAgc3dpdGNoICh0cmlhbC5vdXRjb21lKSB7XG4gICAgICAgICAgY2FzZSAnY29ycmVjdCc6XG4gICAgICAgICAgICBhY2N1bXVsYXRvci5jb3JyZWN0Q291bnQgKz0gMTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RSVFN1bSArPSB0cmlhbC5ydDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yQ291bnQgKz0gMTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmVycm9yUlRTdW0gKz0gdHJpYWwucnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICducic6XG4gICAgICAgICAgICBhY2N1bXVsYXRvci5uckNvdW50ICs9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gTm8tb3BcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb3JyZWN0Q291bnQ6IDAsXG4gICAgICAgIGVycm9yQ291bnQ6IDAsXG4gICAgICAgIG5yQ291bnQ6IDAsXG5cbiAgICAgICAgY29ycmVjdFJUU3VtOiAwLFxuICAgICAgICBlcnJvclJUU3VtOiAwLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRmlyc3Qtb3JkZXIgc3RhdHNcbiAgICBzdGF0cy5jb3JyZWN0Q291bnQgPSBzdW1zLmNvcnJlY3RDb3VudDtcbiAgICBzdGF0cy5lcnJvckNvdW50ID0gc3Vtcy5lcnJvckNvdW50O1xuICAgIHN0YXRzLm5yQ291bnQgPSBzdW1zLm5yQ291bnQ7XG4gICAgc3RhdHMuYWNjdXJhY3kgPSBzdW1zLmNvcnJlY3RDb3VudCAvIChzdW1zLmNvcnJlY3RDb3VudCArIHN1bXMuZXJyb3JDb3VudCArIHN1bXMubnJDb3VudCk7XG5cbiAgICBzdGF0cy5jb3JyZWN0TWVhblJUID0gc3Vtcy5jb3JyZWN0UlRTdW0gLyBzdW1zLmNvcnJlY3RDb3VudDtcbiAgICBzdGF0cy5lcnJvck1lYW5SVCA9IHN1bXMuZXJyb3JSVFN1bSAvIHN1bXMuZXJyb3JDb3VudDtcbiAgICBzdGF0cy5tZWFuUlQgPSAoc3Vtcy5jb3JyZWN0UlRTdW0gKyBzdW1zLmVycm9yUlRTdW0pIC8gKHN1bXMuY29ycmVjdENvdW50ICsgc3Vtcy5lcnJvckNvdW50KTtcblxuICAgIC8vIFNlY29uZC1vcmRlciBzdW1zXG4gICAgY29uc3Qgc3VtczIgPSB0cmlhbHMucmVkdWNlKFxuICAgICAgKGFjY3VtdWxhdG9yLCB0cmlhbCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRyaWFsLm91dGNvbWUpIHtcbiAgICAgICAgICBjYXNlICdjb3JyZWN0JzpcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnNzICs9ICh0cmlhbC5ydCAtIHN0YXRzLm1lYW5SVCkgKiogMjtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmNvcnJlY3RTUyArPSAodHJpYWwucnQgLSBzdGF0cy5jb3JyZWN0TWVhblJUKSAqKiAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgYWNjdW11bGF0b3Iuc3MgKz0gKHRyaWFsLnJ0IC0gc3RhdHMubWVhblJUKSAqKiAyO1xuICAgICAgICAgICAgYWNjdW11bGF0b3IuZXJyb3JTUyArPSAodHJpYWwucnQgLSBzdGF0cy5lcnJvck1lYW5SVCkgKiogMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBOby1vcFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNzOiAwLFxuICAgICAgICBjb3JyZWN0U1M6IDAsXG4gICAgICAgIGVycm9yU1M6IDAsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTZWNvbmQtb3JkZXIgc3RhdHNcbiAgICBzdGF0cy5jb3JyZWN0U0RSVCA9IChzdGF0cy5jb3JyZWN0Q291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuY29ycmVjdFNTIC8gKHN0YXRzLmNvcnJlY3RDb3VudCAtIDEpKVxuICAgICAgOiBOYU47XG4gICAgc3RhdHMuZXJyb3JTRFJUID0gKHN0YXRzLmVycm9yQ291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuZXJyb3JTUyAvIChzdGF0cy5lcnJvckNvdW50IC0gMSkpXG4gICAgICA6IE5hTjtcbiAgICBzdGF0cy5zZFJUID0gKHN0YXRzLmNvcnJlY3RDb3VudCArIHN0YXRzLmVycm9yQ291bnQgPiAxKVxuICAgICAgPyBNYXRoLnNxcnQoc3VtczIuc3MgLyAoc3RhdHMuY29ycmVjdENvdW50ICsgc3RhdHMuZXJyb3JDb3VudCAtIDEpKVxuICAgICAgOiBOYU47XG5cbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cblxuICAvLyBQcm9iYWJpbGl0eSBvZiBhbiBFcnJvciBSZXNwb25zZVxuICBzdGF0aWMgYXp2MnBFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIGNvbnN0IHpQcmltZSA9IGEgKiB6O1xuXG4gICAgY29uc3QgQSA9IE1hdGguZXhwKCgtMiAqIHYgKiBhKSAvIHMgKiogMik7XG4gICAgY29uc3QgWiA9IE1hdGguZXhwKCgtMiAqIHYgKiB6UHJpbWUpIC8gcyAqKiAyKTtcblxuICAgIHJldHVybiAoQSAtIFopIC8gKEEgLSAxKTtcbiAgfVxuXG4gIC8vIFByb2JhYmlsaXR5IG9mIGEgQ29ycmVjdCBSZXNwb25zZVxuICBzdGF0aWMgYXp2MnBDKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIHJldHVybiBERE1NYXRoLmF6djJwRShhLCAxIC0geiwgLXYsIHMpO1xuICB9XG5cbiAgLy8gTWVhbiBPdmVyYWxsIFJUXG4gIC8vIEVxdWF0aW9uIDUgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KVxuICBzdGF0aWMgYXp2dDAybShhLCB6LCB2LCB0MCwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG4gICAgY29uc3QgQSA9IE1hdGguZXhwKCgtMiAqIHYgKiBhKSAvIHMgKiogMikgLSAxO1xuICAgIGNvbnN0IFogPSBNYXRoLmV4cCgoLTIgKiB2ICogelByaW1lKSAvIHMgKiogMikgLSAxO1xuXG4gICAgY29uc3QgbWVhbiA9IC0oelByaW1lIC8gdikgKyAoYSAvIHYpICogKFogLyBBKTtcbiAgICByZXR1cm4gdDAgKyBtZWFuICogMTAwMDtcbiAgfVxuXG4gIC8vIFNEIE92ZXJhbGwgUlRcbiAgLy8gRXF1YXRpb24gNiAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gIHN0YXRpYyBhenYyc2QoYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG4gICAgY29uc3QgQSA9IE1hdGguZXhwKCgtMiAqIHYgKiBhKSAvIHMgKiogMikgLSAxO1xuICAgIGNvbnN0IFogPSBNYXRoLmV4cCgoLTIgKiB2ICogelByaW1lKSAvIHMgKiogMikgLSAxO1xuXG4gICAgY29uc3QgdmFyaWFuY2UgPSAoXG4gICAgICAoXG4gICAgICAgICgtdiAqIGEgKiogMiAqIChaICsgNCkgKiBaKSAvIEEgKiogMlxuICAgICAgKSArIChcbiAgICAgICAgKCgtMyAqIHYgKiBhICoqIDIgKyA0ICogdiAqIHpQcmltZSAqIGEgKyBzICoqIDIgKiBhKSAqIFogKyA0ICogdiAqIHpQcmltZSAqIGEpIC8gQVxuICAgICAgKSAtIChcbiAgICAgICAgcyAqKiAyICogelByaW1lXG4gICAgICApXG4gICAgKSAvIHYgKiogMztcblxuICAgIHJldHVybiBNYXRoLnNxcnQodmFyaWFuY2UpICogMTAwMDtcbiAgfVxuXG4gIC8vIE1lYW4gRXJyb3IgUlRcbiAgLy8gRXF1YXRpb24gMTMgKEdyYXNtYW4gZXQgYWwuLCAyMDA5KVxuICBzdGF0aWMgYXp2dDAybUUoYSwgeiwgdiwgdDAsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7XG4gICAgICByZXR1cm4gTWF0aC5leHAoKDIgKiB2ICogeSkgLyAocyAqKiAyKSkgLSBNYXRoLmV4cCgoMiAqIHYgKiB4KSAvIChzICoqIDIpKTtcbiAgICB9XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG5cbiAgICBjb25zdCBtZWFuID0gKHpQcmltZSAqIChwaGkoelByaW1lIC0gYSwgYSkgKyBwaGkoMCwgelByaW1lKSkgKyAyICogYSAqIHBoaSh6UHJpbWUsIDApKVxuICAgICAgLyAodiAqIHBoaSh6UHJpbWUsIGEpICogcGhpKC1hLCAwKSk7XG4gICAgcmV0dXJuIHQwICsgbWVhbiAqIDEwMDA7XG4gIH1cblxuICAvLyBTRCBFcnJvciBSVFxuICAvLyBFcXVhdGlvbiAxNCAoR3Jhc21hbiBldCBhbC4sIDIwMDkpXG4gIHN0YXRpYyBhenYyc2RFKGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIGZ1bmN0aW9uIHBoaSh4LCB5KSB7XG4gICAgICByZXR1cm4gTWF0aC5leHAoKDIgKiB2ICogeSkgLyAocyAqKiAyKSkgLSBNYXRoLmV4cCgoMiAqIHYgKiB4KSAvIChzICoqIDIpKTtcbiAgICB9XG4gICAgY29uc3QgelByaW1lID0gYSAqIHo7XG5cbiAgICBjb25zdCB2YXJpYW5jZSA9IChcbiAgICAgIChcbiAgICAgICAgLTIgKiBhICogcGhpKDAsIHpQcmltZSlcbiAgICAgICAgKiAoKDIgKiB2ICogYSAqIHBoaSh6UHJpbWUsIDIgKiBhKSkgKyAocyAqKiAyICogcGhpKDAsIGEpICogcGhpKHpQcmltZSwgYSkpKVxuICAgICAgICAqIE1hdGguZXhwKCgyICogdiAqIGEpIC8gcyAqKiAyKVxuICAgICAgKSAvIChcbiAgICAgICAgdiAqKiAzICogcGhpKDAsIGEpICoqIDIgKiBwaGkoelByaW1lLCBhKSAqKiAyXG4gICAgICApXG4gICAgKSArIChcbiAgICAgIChcbiAgICAgICAgNCAqIHYgKiB6UHJpbWUgKiAoMiAqIGEgLSB6UHJpbWUpICogTWF0aC5leHAoKDIgKiB2ICogKHpQcmltZSArIGEpKSAvIHMgKiogMilcbiAgICAgICAgKyB6UHJpbWUgKiBzICoqIDIgKiBwaGkoMiAqIHpQcmltZSwgMiAqIGEpXG4gICAgICApIC8gKFxuICAgICAgICB2ICoqIDMgKiBwaGkoelByaW1lLCBhKSAqKiAyXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiBNYXRoLnNxcnQodmFyaWFuY2UpICogMTAwMDtcbiAgfVxuXG4gIC8vIE1lYW4gQ29ycmVjdCBSVFxuICBzdGF0aWMgYXp2dDAybUMoYSwgeiwgdiwgdDAsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIHJldHVybiBERE1NYXRoLmF6dnQwMm1FKGEsIDEgLSB6LCAtdiwgdDAsIHMpO1xuICB9XG5cbiAgLy8gU0QgQ29ycmVjdCBSVFxuICBzdGF0aWMgYXp2MnNkQyhhLCB6LCB2LCBzID0gRERNTWF0aC5zLkRFRkFVTFQpIHtcbiAgICByZXR1cm4gRERNTWF0aC5henYyc2RFKGEsIDEgLSB6LCAtdiwgcyk7XG4gIH1cblxuICAvLyBEZW5zaXR5IG9mIEVycm9yIFJUXG4gIHN0YXRpYyB0YXp2MmdFKHQsIGEsIHosIHYsIHMgPSBERE1NYXRoLnMuREVGQVVMVCkge1xuICAgIGlmICghdCkgcmV0dXJuIDA7XG5cbiAgICBjb25zdCB6UHJpbWUgPSBhICogejtcbiAgICBjb25zdCBiYXNlID0gKChNYXRoLlBJICogcyAqKiAyKSAvIGEgKiogMikgKiBNYXRoLmV4cCgoLXpQcmltZSAqIHYpIC8gcyAqKiAyKTtcblxuICAgIGxldCBrID0gMDtcbiAgICBsZXQgdGVybSA9IDA7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZG8ge1xuICAgICAgayArPSAxO1xuXG4gICAgICB0ZXJtID0ga1xuICAgICAgICAqIE1hdGguc2luKChNYXRoLlBJICogelByaW1lICogaykgLyBhKVxuICAgICAgICAqIE1hdGguZXhwKC0wLjUgKiAoKHYgKiogMiAvIHMgKiogMikgKyAoKE1hdGguUEkgKiogMiAqIGsgKiogMiAqIHMgKiogMikgLyBhICoqIDIpKSAqIHQpO1xuXG4gICAgICBzdW0gKz0gdGVybTtcbiAgICB9IHdoaWxlIChrIDwgMjAwKTsgLy8gPz8gSEFDS1xuXG4gICAgcmV0dXJuIGJhc2UgKiBzdW07XG4gIH1cblxuICAvLyBEZW5zaXR5IG9mIENvcnJlY3QgUlRcbiAgc3RhdGljIHRhenYyZ0ModCwgYSwgeiwgdiwgcyA9IERETU1hdGgucy5ERUZBVUxUKSB7XG4gICAgcmV0dXJuIERETU1hdGgudGF6djJnRSh0LCBhLCAxIC0geiwgLXYsIHMpO1xuICB9XG5cbiAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vcmFvdWwuc29jc2NpLnV2YS5ubC9FWjIvRVoyX25ldy5odG1sXG4gIC8vIEVaLWZ1bmN0aW9uIGZvciBzdGFydGluZyB2YWx1ZXNcbiAgLy8gaW5wdXQ6IG9iaiAtIE9iamVjdCB3aXRoIHByb3BlcnRpZXNcbiAgLy8gICAgcEMgLSBQcm9wb3J0aW9uIGNvcnJlY3RcbiAgLy8gICAgc2QgLSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBSVCdzIGluIG1zXG4gIC8vICAgIG0gLSBzYW1wbGUgbWVhbiBvZiB0aGUgUlQncyBpbiBtc1xuICAvLyAgICBzIC0gZGlmZnVzaW9uIHN0YW5kYXJkIGRldmlhdGlvblxuICAvLyByZXR1cm5zOiBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHYsIGEsIGFuZCB0MCwgY29udGFpbmluZyBFWi1lc3RpbWF0ZXMgb2YgdGhlc2UgcGFyYW1ldGVyc1xuICBzdGF0aWMgZGF0YTJleih7XG4gICAgYWNjdXJhY3k6IHBDLFxuICAgIHNkUlQ6IHNkLFxuICAgIG1lYW5SVDogbSxcbiAgICBzLFxuICB9KSB7XG4gICAgZnVuY3Rpb24gc2lnbihyKSB7XG4gICAgICByZXR1cm4gKChyID4gMCkgPyAxIDogKChyID09PSAwKSA/IDAgOiAtMSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvZ2l0KHApIHtcbiAgICAgIHJldHVybiBNYXRoLmxvZyhwIC8gKDEgLSBwKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdnJ0ID0gKHNkIC8gMTAwMCkgKiogMjtcbiAgICBjb25zdCBtcnQgPSBtIC8gMTAwMDtcblxuICAgIGNvbnN0IHMyID0gcyAqKiAyO1xuICAgIGNvbnN0IGwgPSBsb2dpdChwQyk7XG4gICAgY29uc3QgeCA9IChsICogKGwgKiBwQyAqKiAyIC0gbCAqIHBDICsgcEMgLSAwLjUpKSAvIHZydDtcbiAgICBjb25zdCB2ID0gc2lnbihwQyAtIDAuNSkgKiBzICogeCAqKiAoMSAvIDQpO1xuICAgIGNvbnN0IGEgPSAoczIgKiBsb2dpdChwQykpIC8gdjtcbiAgICBjb25zdCB5ID0gKC12ICogYSkgLyBzMjtcbiAgICBjb25zdCBtZHQgPSAoKGEgLyAoMiAqIHYpKSAqICgxIC0gTWF0aC5leHAoeSkpKSAvICgxICsgTWF0aC5leHAoeSkpO1xuICAgIGNvbnN0IHQwID0gKG1ydCA/IG1ydCAtIG1kdCA6IG51bGwpOyAvLyBjb21wdXRlIFRlciBvbmx5IGlmIE1SVCB3YXMgcHJvdmlkZWRcblxuICAgIGNvbnN0IHQwUHJpbWUgPSB0MCAqIDEwMDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHYsXG4gICAgICBhLFxuICAgICAgdDA6IHQwUHJpbWUsXG4gICAgICBzLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZGF0YTJlejIoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhMmV6MiBpcyBub3QgaW1wbGVtZW50ZWQhJyk7XG4gIH1cbn1cbiIsIlxuLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG5pbXBvcnQgRERNTWF0aCBmcm9tICcuL2RkbS1tYXRoJztcblxuZXhwb3J0IGRlZmF1bHQgRERNTWF0aDtcbiIsIi8qIGVzbGludCBuby1yZXN0cmljdGVkLWdsb2JhbHM6IFtcIm9mZlwiLCBcInNlbGZcIl0gKi9cblxuaW1wb3J0IERETU1hdGggZnJvbSAnQGRlY2lkYWJsZXMvYWNjdW11bGFibGUtbWF0aCc7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IERETU1hdGguZGF0YTJleih7Li4uZXZlbnQuZGF0YSwgczogRERNTWF0aC5zLkRFRkFVTFR9KTtcblxuICAvLyAjIyMjIyBBcmJpdHJhcnkgZGVmYXVsdCB2YWx1ZXMhISFcbiAgY29uc3QgYSA9ICFpc05hTihwYXJhbXMuYSkgPyBwYXJhbXMuYSA6IDEuNTtcbiAgY29uc3QgeiA9ICFpc05hTihwYXJhbXMueikgPyBwYXJhbXMueiA6IDAuNTtcbiAgY29uc3QgdiA9ICFpc05hTihwYXJhbXMudikgPyBwYXJhbXMudiA6IDAuMTtcbiAgY29uc3QgdDAgPSAhaXNOYU4ocGFyYW1zLnQwKSA/IHBhcmFtcy50MCA6IDEwMDtcbiAgY29uc3QgcyA9ICFpc05hTihwYXJhbXMucykgPyBwYXJhbXMucyA6IERETU1hdGgucy5ERUZBVUxUO1xuXG4gIGNvbnN0IHByZWRpY3RlZCA9IHtcbiAgICBhY2N1cmFjeTogRERNTWF0aC5henYycEMoYSwgeiwgdiksXG4gICAgY29ycmVjdE1lYW5SVDogRERNTWF0aC5henZ0MDJtQyhhLCB6LCB2LCB0MCksXG4gICAgZXJyb3JNZWFuUlQ6IERETU1hdGguYXp2dDAybUUoYSwgeiwgdiwgdDApLFxuICAgIG1lYW5SVDogRERNTWF0aC5henZ0MDJtKGEsIHosIHYsIHQwKSxcbiAgICBjb3JyZWN0U0RSVDogRERNTWF0aC5henYyc2RDKGEsIHosIHYpLFxuICAgIGVycm9yU0RSVDogRERNTWF0aC5henYyc2RFKGEsIHosIHYpLFxuICAgIHNkUlQ6IERETU1hdGguYXp2MnNkKGEsIHosIHYpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIHBhcmFtczoge1xuICAgICAgYSwgeiwgdiwgdDAsIHMsXG4gICAgfSxcbiAgICBwcmVkaWN0ZWQsXG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6WyJERE1NYXRoIiwicyIsIkRFRkFVTFQiLCJhIiwiTUlOIiwiTUFYIiwiU1RFUCIsIkpVTVAiLCJ6IiwidiIsInQwIiwidHJpYWxzMnN0YXRzIiwidHJpYWxzIiwic3RhdHMiLCJzdW1zIiwicmVkdWNlIiwiYWNjdW11bGF0b3IiLCJ0cmlhbCIsIm91dGNvbWUiLCJjb3JyZWN0Q291bnQiLCJjb3JyZWN0UlRTdW0iLCJydCIsImVycm9yQ291bnQiLCJlcnJvclJUU3VtIiwibnJDb3VudCIsImFjY3VyYWN5IiwiY29ycmVjdE1lYW5SVCIsImVycm9yTWVhblJUIiwibWVhblJUIiwic3VtczIiLCJzcyIsImNvcnJlY3RTUyIsImVycm9yU1MiLCJjb3JyZWN0U0RSVCIsIk1hdGgiLCJzcXJ0IiwiTmFOIiwiZXJyb3JTRFJUIiwic2RSVCIsImF6djJwRSIsInpQcmltZSIsIkEiLCJleHAiLCJaIiwiYXp2MnBDIiwiYXp2dDAybSIsIm1lYW4iLCJhenYyc2QiLCJ2YXJpYW5jZSIsImF6dnQwMm1FIiwicGhpIiwieCIsInkiLCJhenYyc2RFIiwiYXp2dDAybUMiLCJhenYyc2RDIiwidGF6djJnRSIsInQiLCJiYXNlIiwiUEkiLCJrIiwidGVybSIsInN1bSIsInNpbiIsInRhenYyZ0MiLCJkYXRhMmV6IiwicEMiLCJzZCIsIm0iLCJzaWduIiwiciIsImxvZ2l0IiwicCIsImxvZyIsInZydCIsIm1ydCIsInMyIiwibCIsIm1kdCIsInQwUHJpbWUiLCJkYXRhMmV6MiIsIkVycm9yIiwic2VsZiIsIm9ubWVzc2FnZSIsImV2ZW50IiwicGFyYW1zIiwiZGF0YSIsImlzTmFOIiwicHJlZGljdGVkIiwicG9zdE1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7OztFQUNBO0VBQ0E7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNlLE1BQU1BLE9BQU8sQ0FBQztFQUMzQixFQUFBLE9BQU9DLENBQUMsR0FBRztFQUNUQyxJQUFBQSxPQUFPLEVBQUU7S0FDVjtFQUVELEVBQUEsT0FBT0MsQ0FBQyxHQUFHO0VBQ1RELElBQUFBLE9BQU8sRUFBRSxHQUFHO0VBQ1pFLElBQUFBLEdBQUcsRUFBRSxJQUFJO0VBQ1RDLElBQUFBLEdBQUcsRUFBRSxHQUFHO0VBQ1JDLElBQUFBLElBQUksRUFBRSxJQUFJO0VBQ1ZDLElBQUFBLElBQUksRUFBRTtLQUNQO0VBRUQsRUFBQSxPQUFPQyxDQUFDLEdBQUc7RUFDVE4sSUFBQUEsT0FBTyxFQUFFLElBQUk7RUFDYkUsSUFBQUEsR0FBRyxFQUFFLElBQUk7RUFDVEMsSUFBQUEsR0FBRyxFQUFFLElBQUk7RUFDVEMsSUFBQUEsSUFBSSxFQUFFLElBQUk7RUFDVkMsSUFBQUEsSUFBSSxFQUFFO0tBQ1A7RUFFRCxFQUFBLE9BQU9FLENBQUMsR0FBRztFQUNUUCxJQUFBQSxPQUFPLEVBQUUsR0FBRztFQUNaRSxJQUFBQSxHQUFHLEVBQUUsSUFBSTtFQUNUQyxJQUFBQSxHQUFHLEVBQUUsR0FBRztFQUNSQyxJQUFBQSxJQUFJLEVBQUUsSUFBSTtFQUNWQyxJQUFBQSxJQUFJLEVBQUU7S0FDUDtFQUVE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');
7238
7343
  /* eslint-enable */
7239
7344
 
7240
7345
  /*
@@ -7250,10 +7355,10 @@
7250
7355
  }
7251
7356
  constructor() {
7252
7357
  super();
7253
- this.a = 1.2;
7254
- this.z = 0.35;
7255
- this.v = 1.5;
7256
- this.t0 = 150;
7358
+ this.a = DDMMath.a.DEFAULT;
7359
+ this.z = DDMMath.z.DEFAULT;
7360
+ this.v = DDMMath.v.DEFAULT;
7361
+ this.t0 = DDMMath.t0.DEFAULT;
7257
7362
  this.observed = {};
7258
7363
  this.predicted = {};
7259
7364
  this.working = false;
@@ -7440,15 +7545,71 @@
7440
7545
  decidables-slider div {
7441
7546
  margin-bottom: 0.25rem;
7442
7547
  }
7548
+
7549
+ .a {
7550
+ --decidables-slider-background-color: var(---color-a-light);
7551
+ --decidables-slider-color: var(---color-a);
7552
+ }
7553
+
7554
+ .z {
7555
+ --decidables-slider-background-color: var(---color-z-light);
7556
+ --decidables-slider-color: var(---color-z);
7557
+ }
7558
+
7559
+ .v {
7560
+ --decidables-slider-background-color: var(---color-v-light);
7561
+ --decidables-slider-color: var(---color-v);
7562
+ }
7563
+
7564
+ .t0 {
7565
+ --decidables-slider-background-color: var(---color-t0-light);
7566
+ --decidables-slider-color: var(---color-t0);
7567
+ }
7443
7568
  `];
7444
7569
  }
7445
7570
  render() {
7446
7571
  return x$1`
7447
7572
  <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``}
7573
+ ${this.a != null ? x$1`<decidables-slider class="a"
7574
+ ?disabled=${!this.interactive}
7575
+ scale
7576
+ min=${DDMMath.a.MIN}
7577
+ max=${DDMMath.a.MAX}
7578
+ step=${DDMMath.a.STEP}
7579
+ .value=${+this.a.toFixed(2)}
7580
+ @change=${this.setBoundarySeparation.bind(this)}
7581
+ @input=${this.setBoundarySeparation.bind(this)}
7582
+ ><div>Boundary Separation<br><span class="math-var">a</span></div></decidables-slider>` : x$1``}
7583
+ ${this.z != null ? x$1`<decidables-slider class="z"
7584
+ ?disabled=${!this.interactive}
7585
+ scale
7586
+ min=${DDMMath.z.MIN}
7587
+ max=${DDMMath.z.MAX}
7588
+ step=${DDMMath.z.STEP}
7589
+ .value=${+this.z.toFixed(2)}
7590
+ @change=${this.setStartingPoint.bind(this)}
7591
+ @input=${this.setStartingPoint.bind(this)}
7592
+ ><div>Starting Point<br><span class="math-var">z</span></div></decidables-slider>` : x$1``}
7593
+ ${this.v != null ? x$1`<decidables-slider class="v"
7594
+ ?disabled=${!this.interactive}
7595
+ scale
7596
+ min=${DDMMath.v.MIN}
7597
+ max=${DDMMath.v.MAX}
7598
+ step=${DDMMath.v.STEP}
7599
+ .value=${+this.v.toFixed(2)}
7600
+ @change=${this.setDriftRate.bind(this)}
7601
+ @input=${this.setDriftRate.bind(this)}
7602
+ ><div>Drift Rate<br><span class="math-var">v</span></div></decidables-slider>` : x$1``}
7603
+ ${this.t0 != null ? x$1`<decidables-slider class="t0"
7604
+ ?disabled=${!this.interactive}
7605
+ scale
7606
+ min=${DDMMath.t0.MIN}
7607
+ max=${DDMMath.t0.MAX}
7608
+ step=${DDMMath.t0.STEP}
7609
+ .value=${+this.t0.toFixed(0)}
7610
+ @change=${this.setNondecisionTime.bind(this)}
7611
+ @input=${this.setNondecisionTime.bind(this)}
7612
+ ><div>Nondecision Time<br><span class="math-var">t₀</span></div></decidables-slider>` : x$1``}
7452
7613
  </div>`;
7453
7614
  }
7454
7615
  }
@@ -7586,10 +7747,10 @@
7586
7747
  this.resample();
7587
7748
  this.human = false;
7588
7749
  this.trials = 10;
7589
- this.a = 1.2;
7590
- this.z = 0.35;
7591
- this.v = 1.5;
7592
- this.t0 = 150;
7750
+ this.a = DDMMath.a.DEFAULT;
7751
+ this.z = DDMMath.z.DEFAULT;
7752
+ this.v = DDMMath.v.DEFAULT;
7753
+ this.t0 = DDMMath.t0.DEFAULT;
7593
7754
 
7594
7755
  // this.s = null;
7595
7756
  // this.sz = null;
@@ -7650,7 +7811,7 @@
7650
7811
  while (path.at(-1).e > bounds.lower && path.at(-1).e < bounds.upper) {
7651
7812
  path.push({
7652
7813
  t: path.at(-1).t + this.precision * 1000,
7653
- e: path.at(-1).e + drift + DDMMath.s * random()
7814
+ e: path.at(-1).e + drift + DDMMath.s.DEFAULT * random()
7654
7815
  });
7655
7816
  }
7656
7817
  return path;
@@ -7940,10 +8101,25 @@
7940
8101
 
7941
8102
  .t0z .point {
7942
8103
  fill: var(---color-element-emphasis);
8104
+ stroke-width: 0;
7943
8105
 
7944
8106
  r: 6px;
7945
8107
  }
7946
8108
 
8109
+ /* Make larger targets for touch users */
8110
+ .interactive .touch {
8111
+ stroke: #000000;
8112
+ stroke-dasharray: none;
8113
+ stroke-opacity: 0;
8114
+ }
8115
+
8116
+ @media (pointer: coarse) {
8117
+ .interactive .touch {
8118
+ stroke-linecap: round;
8119
+ stroke-width: 12;
8120
+ }
8121
+ }
8122
+
7947
8123
  .measure {
7948
8124
  stroke-width: 2;
7949
8125
  }
@@ -8118,9 +8294,9 @@
8118
8294
  let t0 = timeScale.invert(event.x);
8119
8295
  let z = (evidenceScale.invert(event.y) + this.a / 2) / this.a;
8120
8296
  // Clamp t0
8121
- t0 = shift === 'z' ? timeScale.invert(event.subject.x) : t0 < 0 ? 0 : t0 > 500 ? 500 : t0;
8297
+ t0 = shift === 'z' ? timeScale.invert(event.subject.x) : t0 < DDMMath.t0.MIN ? DDMMath.t0.MIN : t0 > DDMMath.t0.MAX ? DDMMath.t0.MAX : t0;
8122
8298
  // 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;
8299
+ 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
8300
  this.t0 = t0;
8125
8301
  this.z = z;
8126
8302
  this.alignState();
@@ -8150,7 +8326,7 @@
8150
8326
  this.drag = true;
8151
8327
  let v = (evidenceScale.invert(event.y) - this.startingPoint) / (timeScale.invert(event.x) - this.t0) * 1000;
8152
8328
  // Clamp drift rate
8153
- v = v < 0.01 ? 0.01 : v > 5 ? 5 : v;
8329
+ v = v < DDMMath.v.MIN ? DDMMath.v.MIN : v > DDMMath.v.MAX ? DDMMath.v.MAX : v;
8154
8330
  this.v = v;
8155
8331
  this.alignState();
8156
8332
  this.dispatchEvent(new CustomEvent('ddm-model-v', {
@@ -8174,12 +8350,13 @@
8174
8350
  }).on('start', event => {
8175
8351
  const element = event.currentTarget;
8176
8352
  select(element).classed('dragging', true);
8177
- }).on('drag', (event, datum) => {
8353
+ }).on('drag', event => {
8178
8354
  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 > -5e-3 ? -5e-3 : boundary;
8182
- this.a = Math.abs(boundary * 2);
8355
+ const boundary = evidenceScale.invert(event.y);
8356
+ let a = Math.abs(boundary * 2);
8357
+ // Clamp a
8358
+ a = a < DDMMath.a.MIN ? DDMMath.a.MIN : a > DDMMath.a.MAX ? DDMMath.a.MAX : a;
8359
+ this.a = a;
8183
8360
  this.alignState();
8184
8361
  this.dispatchEvent(new CustomEvent('ddm-model-a', {
8185
8362
  detail: {
@@ -8620,20 +8797,23 @@
8620
8797
  return `boundary ${index === 0 ? 'correct' : 'error'}`;
8621
8798
  });
8622
8799
  boundaryEnter.append('line').classed('line', true);
8800
+ boundaryEnter.append('line').classed('line touch', true);
8623
8801
  // MERGE
8624
8802
  const boundaryMerge = boundaryEnter.merge(boundaryUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? (event, datum) => {
8625
8803
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8626
- let a = this.a; /* eslint-disable-line prefer-destructuring */
8804
+ let {
8805
+ a
8806
+ } = this;
8627
8807
  switch (event.key) {
8628
8808
  case 'ArrowUp':
8629
- a += datum.bound === 'upper' ? event.shiftKey ? 0.01 : 0.1 : event.shiftKey ? -0.01 : -0.1;
8809
+ a += datum.bound === 'upper' ? event.shiftKey ? DDMMath.a.STEP : DDMMath.a.JUMP : event.shiftKey ? -0.01 : -0.1;
8630
8810
  break;
8631
8811
  case 'ArrowDown':
8632
- a += datum.bound === 'upper' ? event.shiftKey ? -0.01 : -0.1 : event.shiftKey ? 0.01 : 0.1;
8812
+ a += datum.bound === 'upper' ? event.shiftKey ? -0.01 : -0.1 : event.shiftKey ? DDMMath.a.STEP : DDMMath.a.JUMP;
8633
8813
  break;
8634
8814
  }
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;
8815
+ // Clamp a
8816
+ a = a < DDMMath.a.MIN ? DDMMath.a.MIN : a > DDMMath.a.MAX ? DDMMath.a.MAX : a;
8637
8817
  this.a = a;
8638
8818
  this.alignState();
8639
8819
  this.dispatchEvent(new CustomEvent('ddm-model-a', {
@@ -8657,6 +8837,11 @@
8657
8837
  }).attr('y2', datum => {
8658
8838
  return evidenceScale(datum.value);
8659
8839
  });
8840
+ 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 => {
8841
+ return evidenceScale(datum.value);
8842
+ }).attr('y2', datum => {
8843
+ return evidenceScale(datum.value);
8844
+ });
8660
8845
  // EXIT
8661
8846
  boundaryUpdate.exit().remove();
8662
8847
 
@@ -8670,21 +8855,25 @@
8670
8855
  // ENTER
8671
8856
  const driftEnter = driftUpdate.enter().append('g').classed('drift', true);
8672
8857
  driftEnter.append('line').classed('line', true);
8858
+ driftEnter.append('line').classed('line touch', true);
8673
8859
  driftEnter.append('path').classed('arrow', true);
8860
+ driftEnter.append('path').classed('arrow touch', true);
8674
8861
  // MERGE
8675
8862
  const driftMerge = driftEnter.merge(driftUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? event => {
8676
8863
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8677
- let v = this.v; /* eslint-disable-line prefer-destructuring */
8864
+ let {
8865
+ v
8866
+ } = this;
8678
8867
  switch (event.key) {
8679
8868
  case 'ArrowUp':
8680
- v += event.shiftKey ? 0.01 : 0.1;
8869
+ v += event.shiftKey ? DDMMath.v.STEP : DDMMath.v.JUMP;
8681
8870
  break;
8682
8871
  case 'ArrowDown':
8683
- v -= event.shiftKey ? 0.01 : 0.1;
8872
+ v -= event.shiftKey ? DDMMath.v.STEP : DDMMath.v.JUMP;
8684
8873
  break;
8685
8874
  }
8686
8875
  // Clamp z
8687
- v = v < 0.01 ? 0.01 : v > 5 ? 5 : v;
8876
+ v = v < DDMMath.v.MIN ? DDMMath.v.MIN : v > DDMMath.v.MAX ? DDMMath.v.MAX : v;
8688
8877
  this.v = v;
8689
8878
  this.alignState();
8690
8879
  this.dispatchEvent(new CustomEvent('ddm-model-v', {
@@ -8709,11 +8898,17 @@
8709
8898
  rotate(${-Math.atan(datum.v / 1000 * scaleRatio) * (180 / Math.PI)})`;
8710
8899
  });
8711
8900
  driftMerge.select('.line').attr('x2', timeScale(200));
8901
+ driftMerge.select('.line.touch').attr('x2', timeScale(200));
8712
8902
  driftMerge.select('.arrow').attr('d', `
8713
8903
  M ${timeScale(200) - this.rem * 0.5},${-this.rem * 0.5}
8714
8904
  l ${this.rem * 0.5},${this.rem * 0.5}
8715
8905
  l ${-this.rem * 0.5},${this.rem * 0.5}
8716
8906
  `);
8907
+ driftMerge.select('.arrow.touch').attr('d', `
8908
+ M ${timeScale(200) - this.rem * 0.5},${-this.rem * 0.5}
8909
+ l ${this.rem * 0.5},${this.rem * 0.5}
8910
+ l ${-this.rem * 0.5},${this.rem * 0.5}
8911
+ `);
8717
8912
  // EXIT
8718
8913
  driftUpdate.exit().remove();
8719
8914
 
@@ -8726,21 +8921,24 @@
8726
8921
  // ENTER
8727
8922
  const t0zEnter = t0zUpdate.enter().append('g').classed('t0z', true);
8728
8923
  t0zEnter.append('line').classed('line', true);
8729
- t0zEnter.append('circle').classed('point', true);
8924
+ t0zEnter.append('line').classed('line touch', true);
8925
+ t0zEnter.append('circle').classed('point touch', true);
8730
8926
  // MERGE
8731
8927
  const t0zMerge = t0zEnter.merge(t0zUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? event => {
8732
8928
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8733
- let z = this.z; /* eslint-disable-line prefer-destructuring */
8929
+ let {
8930
+ z
8931
+ } = this;
8734
8932
  switch (event.key) {
8735
8933
  case 'ArrowUp':
8736
- z += event.shiftKey ? 0.01 : 0.1;
8934
+ z += event.shiftKey ? DDMMath.z.STEP : DDMMath.z.JUMP;
8737
8935
  break;
8738
8936
  case 'ArrowDown':
8739
- z -= event.shiftKey ? 0.01 : 0.1;
8937
+ z -= event.shiftKey ? DDMMath.z.STEP : DDMMath.z.JUMP;
8740
8938
  break;
8741
8939
  }
8742
8940
  // Clamp z
8743
- z = z < 0.01 ? 0.01 : z > 0.99 ? 0.99 : z;
8941
+ z = z < DDMMath.z.MIN ? DDMMath.z.MIN : z > DDMMath.z.MAX ? DDMMath.z.MAX : z;
8744
8942
  this.z = z;
8745
8943
  this.alignState();
8746
8944
  this.dispatchEvent(new CustomEvent('ddm-model-z', {
@@ -8755,14 +8953,14 @@
8755
8953
  let t0 = this.t0; /* eslint-disable-line prefer-destructuring */
8756
8954
  switch (event.key) {
8757
8955
  case 'ArrowRight':
8758
- t0 += event.shiftKey ? 1 : 10;
8956
+ t0 += event.shiftKey ? DDMMath.t0.STEP : DDMMath.t0.JUMP;
8759
8957
  break;
8760
8958
  case 'ArrowLeft':
8761
- t0 -= event.shiftKey ? 1 : 10;
8959
+ t0 -= event.shiftKey ? DDMMath.t0.STEP : DDMMath.t0.JUMP;
8762
8960
  break;
8763
8961
  }
8764
8962
  // Clamp t0
8765
- t0 = t0 < 0 ? 0 : t0 > 500 ? 500 : t0;
8963
+ t0 = t0 < DDMMath.t0.MIN ? DDMMath.t0.MIN : t0 > DDMMath.t0.MAX ? DDMMath.t0.MAX : t0;
8766
8964
  this.t0 = t0;
8767
8965
  this.alignState();
8768
8966
  this.dispatchEvent(new CustomEvent('ddm-model-t0', {
@@ -8788,6 +8986,13 @@
8788
8986
  }).attr('y2', datum => {
8789
8987
  return evidenceScale(datum.startingPoint);
8790
8988
  });
8989
+ t0zMerge.select('.line.touch').transition().duration(this.drag ? 0 : transitionDuration).ease(cubicOut).attr('x1', timeScale(0)).attr('x2', datum => {
8990
+ return timeScale(datum.t0);
8991
+ }).attr('y1', datum => {
8992
+ return evidenceScale(datum.startingPoint);
8993
+ }).attr('y2', datum => {
8994
+ return evidenceScale(datum.startingPoint);
8995
+ });
8791
8996
  t0zMerge.select('.point').transition().duration(this.drag ? 0 : transitionDuration).ease(cubicOut).attr('cx', datum => {
8792
8997
  return timeScale(datum.t0);
8793
8998
  }).attr('cy', datum => {
@@ -9670,9 +9875,9 @@
9670
9875
  }
9671
9876
  constructor() {
9672
9877
  super();
9673
- this.a = 1.5;
9674
- this.z = 0.5;
9675
- this.v = 0.1;
9878
+ this.a = DDMMath.a.DEFAULT;
9879
+ this.z = DDMMath.z.DEFAULT;
9880
+ this.v = DDMMath.v.DEFAULT;
9676
9881
  this.alignState();
9677
9882
  }
9678
9883
  alignState() {
@@ -9714,19 +9919,46 @@
9714
9919
  let s;
9715
9920
  let accuracy;
9716
9921
  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)}>
9922
+ a = x$1`<decidables-spinner class="a bottom"
9923
+ ?disabled=${!this.interactive}
9924
+ min=${DDMMath.a.MIN}
9925
+ max=${DDMMath.a.MAX}
9926
+ step=${DDMMath.a.STEP}
9927
+ .value=${this.a}
9928
+ @input=${this.aInput.bind(this)}
9929
+ >
9718
9930
  <var class="math-var">a</var>
9719
9931
  </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)}>
9932
+ z = x$1`<decidables-spinner class="z bottom"
9933
+ ?disabled=${!this.interactive}
9934
+ min=${DDMMath.z.MIN}
9935
+ max=${DDMMath.z.MAX}
9936
+ step=${DDMMath.z.STEP}
9937
+ .value=${this.z}
9938
+ @input=${this.zInput.bind(this)}
9939
+ >
9721
9940
  <var class="math-var">z</var>
9722
9941
  </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)}>
9942
+ v = x$1`<decidables-spinner class="v bottom"
9943
+ ?disabled=${!this.interactive}
9944
+ min=${DDMMath.v.MIN}
9945
+ max=${DDMMath.v.MAX}
9946
+ step=${DDMMath.v.STEP}
9947
+ .value=${this.v}
9948
+ @input=${this.vInput.bind(this)}
9949
+ >
9724
9950
  <var class="math-var">v</var>
9725
9951
  </decidables-spinner>`;
9726
- s = x$1`<decidables-spinner class="s bottom" disabled min="0.01" max="1" step="0.01" .value="${DDMMath.s}">
9952
+ s = x$1`<decidables-spinner class="s bottom"
9953
+ disabled
9954
+ .value=${DDMMath.s.DEFAULT}
9955
+ >
9727
9956
  <var class="math-var">s</var>
9728
9957
  </decidables-spinner>`;
9729
- accuracy = x$1`<decidables-spinner class="accuracy bottom" disabled min="0" max="1" step="0.01" .value="${+this.accuracy.toFixed(2)}">
9958
+ accuracy = x$1`<decidables-spinner class="accuracy bottom"
9959
+ disabled
9960
+ .value=${+this.accuracy.toFixed(2)}
9961
+ >
9730
9962
  <var>Accuracy</var>
9731
9963
  </decidables-spinner>`;
9732
9964
  } else {
@@ -9804,10 +10036,10 @@
9804
10036
  }
9805
10037
  constructor() {
9806
10038
  super();
9807
- this.a = 1.5;
9808
- this.z = 0.5;
9809
- this.v = 0.1;
9810
- this.t0 = 200;
10039
+ this.a = DDMMath.a.DEFAULT;
10040
+ this.z = DDMMath.z.DEFAULT;
10041
+ this.v = DDMMath.v.DEFAULT;
10042
+ this.t0 = DDMMath.t0.DEFAULT;
9811
10043
  this.alignState();
9812
10044
  }
9813
10045
  alignState() {
@@ -9856,22 +10088,56 @@
9856
10088
  let s;
9857
10089
  let meanRT;
9858
10090
  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)}>
10091
+ a = x$1`<decidables-spinner class="a bottom"
10092
+ ?disabled=${!this.interactive}
10093
+ min=${DDMMath.a.MIN}
10094
+ max=${DDMMath.a.MAX}
10095
+ step=${DDMMath.a.STEP}
10096
+ .value=${this.a}
10097
+ @input=${this.aInput.bind(this)}
10098
+ >
9860
10099
  <var class="math-var">a</var>
9861
10100
  </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)}>
10101
+ z = x$1`<decidables-spinner class="z bottom"
10102
+ ?disabled=${!this.interactive}
10103
+ min=${DDMMath.z.MIN}
10104
+ max=${DDMMath.z.MAX}
10105
+ step=${DDMMath.z.STEP}
10106
+ .value=${this.z}
10107
+ @input=${this.zInput.bind(this)}
10108
+ >
9863
10109
  <var class="math-var">z</var>
9864
10110
  </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)}>
10111
+ v = x$1`<decidables-spinner class="v bottom"
10112
+ ?disabled=${!this.interactive}
10113
+ min=${DDMMath.v.MIN}
10114
+ max=${DDMMath.v.MAX}
10115
+ step=${DDMMath.v.STEP}
10116
+ .value=${this.v}
10117
+ @input=${this.vInput.bind(this)}
10118
+ >
9866
10119
  <var class="math-var">v</var>
9867
10120
  </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)}>
10121
+ t0 = x$1`<decidables-spinner class="t0 bottom"
10122
+ ?disabled=${!this.interactive}
10123
+ min=${DDMMath.t0.MIN}
10124
+ max=${DDMMath.t0.MAX}
10125
+ step=${DDMMath.t0.STEP}
10126
+ .value=${this.t0}
10127
+ @input=${this.t0Input.bind(this)}
10128
+ >
9869
10129
  <var class="math-var">t<sub>0</sub></var>
9870
10130
  </decidables-spinner>`;
9871
- s = x$1`<decidables-spinner class="s bottom" disabled min="0.01" max="1" step="0.01" .value="${DDMMath.s}">
10131
+ s = x$1`<decidables-spinner class="s bottom"
10132
+ disabled
10133
+ .value=${DDMMath.s.DEFAULT}
10134
+ >
9872
10135
  <var class="math-var">s</var>
9873
10136
  </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)}">
10137
+ meanRT = x$1`<decidables-spinner class="mean-rt bottom"
10138
+ disabled
10139
+ .value=${+this.meanRT.toFixed(0)}
10140
+ >
9875
10141
  <var>Mean RT</var>
9876
10142
  </decidables-spinner>`;
9877
10143
  } else {
@@ -9994,17 +10260,74 @@
9994
10260
  }
9995
10261
  customElements.define('ddm-example', DDMExample);
9996
10262
 
9997
- // import DDMMath from '@decidables/accumulable-math';
9998
-
9999
-
10000
10263
  /*
10001
10264
  DDMExampleHuman element
10002
10265
  <ddm-example-human>
10003
10266
  */
10004
10267
  class DDMExampleHuman extends DDMExample {
10268
+ static get properties() {
10269
+ return {
10270
+ trials: {
10271
+ attribute: 'trials',
10272
+ type: Number,
10273
+ reflect: true
10274
+ },
10275
+ duration: {
10276
+ attribute: 'duration',
10277
+ type: Number,
10278
+ reflect: true
10279
+ },
10280
+ coherence: {
10281
+ attribute: 'coherence',
10282
+ type: Number,
10283
+ reflect: true
10284
+ },
10285
+ color: {
10286
+ attribute: 'color',
10287
+ type: String,
10288
+ reflect: true
10289
+ },
10290
+ a: {
10291
+ attribute: false,
10292
+ type: Number,
10293
+ reflect: false
10294
+ },
10295
+ z: {
10296
+ attribute: false,
10297
+ type: Number,
10298
+ reflect: false
10299
+ },
10300
+ v: {
10301
+ attribute: false,
10302
+ type: Number,
10303
+ reflect: false
10304
+ },
10305
+ t0: {
10306
+ attribute: false,
10307
+ type: Number,
10308
+ reflect: false
10309
+ }
10310
+ };
10311
+ }
10005
10312
  constructor() {
10006
10313
  super();
10007
- this.trialCount = 0;
10314
+ this.trials = 10;
10315
+ this.duration = 2000;
10316
+ this.coherence = 0.5;
10317
+ this.colors = ['none', 'measure', 'outcome', 'all'];
10318
+ this.color = 'outcome';
10319
+ this.a = DDMMath.a.DEFAULT;
10320
+ this.z = DDMMath.z.DEFAULT;
10321
+ this.v = DDMMath.v.DEFAULT;
10322
+ this.t0 = DDMMath.t0.DEFAULT;
10323
+ this.accumulableControl = null;
10324
+ this.rdkTask = null;
10325
+ this.accumulableResponse = null;
10326
+ this.accumulableTable = null;
10327
+ this.ddmParameters = null;
10328
+ this.ddmModel = null;
10329
+ this.ddmFit = null;
10330
+ this.data = undefined;
10008
10331
  }
10009
10332
  connectedCallback() {
10010
10333
  super.connectedCallback();
@@ -10018,56 +10341,31 @@
10018
10341
 
10019
10342
  // Initialize
10020
10343
  this.ddmModel.clear();
10021
- if (this.accumulableControl && this.accumulableControl.hasAttribute('trials')) {
10344
+ if (this.accumulableControl) {
10022
10345
  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
- }
10346
+ this.trials = event.detail.trials;
10029
10347
  });
10030
- }
10031
- if (this.accumulableControl && this.accumulableControl.hasAttribute('duration')) {
10032
10348
  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
- }
10349
+ this.duration = event.detail.duration;
10038
10350
  });
10039
- }
10040
- if (this.accumulableControl && this.accumulableControl.hasAttribute('coherence')) {
10041
10351
  this.accumulableControl.addEventListener('accumulable-control-coherence', event => {
10042
- if (this.rdkTask) {
10043
- this.rdkTask.coherence = event.detail.coherence;
10044
- }
10352
+ this.coherence = event.detail.coherence;
10045
10353
  });
10046
- }
10047
- if (this.accumulableControl && this.accumulableControl.hasAttribute('color')) {
10048
10354
  this.accumulableControl.addEventListener('accumulable-control-color', event => {
10049
- if (this.accumulableTable) {
10050
- this.accumulableTable.color = event.detail.color;
10051
- }
10355
+ this.color = event.detail.color;
10052
10356
  });
10053
- }
10054
- if (this.accumulableControl && this.accumulableControl.hasAttribute('run')) {
10055
10357
  this.accumulableControl.addEventListener('accumulable-control-run', (/* event */
10056
10358
  ) => {
10057
10359
  if (this.rdkTask) {
10058
10360
  this.rdkTask.running = true;
10059
10361
  }
10060
10362
  });
10061
- }
10062
- if (this.accumulableControl && this.accumulableControl.hasAttribute('pause')) {
10063
10363
  this.accumulableControl.addEventListener('accumulable-control-pause', (/* event */
10064
10364
  ) => {
10065
10365
  if (this.rdkTask) {
10066
10366
  this.rdkTask.running = false;
10067
10367
  }
10068
10368
  });
10069
- }
10070
- if (this.accumulableControl && this.accumulableControl.hasAttribute('reset')) {
10071
10369
  this.accumulableControl.addEventListener('accumulable-control-reset', (/* event */
10072
10370
  ) => {
10073
10371
  if (this.rdkTask) {
@@ -10100,11 +10398,6 @@
10100
10398
  }
10101
10399
  });
10102
10400
  }
10103
- if (this.rdkTask) {
10104
- if (this.accumulableResponse) {
10105
- this.accumulableResponse.trialTotal = this.rdkTask.trials;
10106
- }
10107
- }
10108
10401
  if (this.rdkTask) {
10109
10402
  this.rdkTask.addEventListener('rdk-trial-start', event => {
10110
10403
  if (this.accumulableResponse) {
@@ -10130,18 +10423,7 @@
10130
10423
  }
10131
10424
  if (this.accumulableResponse) {
10132
10425
  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
- }
10426
+ this.data = event.detail.data;
10145
10427
  if (this.ddmModel) {
10146
10428
  this.ddmModel.trial({
10147
10429
  index: event.detail.trial,
@@ -10151,34 +10433,73 @@
10151
10433
  }
10152
10434
  if (this.ddmFit) {
10153
10435
  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
10436
+ accuracy: event.detail.data.accuracy,
10437
+ correctMeanRT: event.detail.data.correctMeanRT,
10438
+ errorMeanRT: event.detail.data.errorMeanRT,
10439
+ meanRT: event.detail.data.meanRT,
10440
+ correctSDRT: event.detail.data.correctSDRT,
10441
+ errorSDRT: event.detail.data.errorSDRT,
10442
+ sdRT: event.detail.data.sdRT
10161
10443
  });
10162
10444
  }
10445
+ this.requestUpdate();
10163
10446
  });
10164
10447
  }
10165
10448
  if (this.ddmFit) {
10166
10449
  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
- }
10450
+ this.a = event.detail.a;
10451
+ this.z = 0.5; // event.detail.z;
10452
+ this.v = event.detail.v;
10453
+ this.t0 = event.detail.t0;
10179
10454
  });
10180
10455
  }
10181
10456
  }
10457
+ update(changedProperties) {
10458
+ super.update(changedProperties);
10459
+ if (this.accumulableControl) {
10460
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10461
+ this.accumulableControl.duration = this.accumulableControl.duration != null ? this.duration : undefined;
10462
+ this.accumulableControl.coherence = this.accumulableControl.coherence != null ? this.coherence : undefined;
10463
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10464
+ }
10465
+ if (this.rdkTask) {
10466
+ this.rdkTask.trials = this.trials;
10467
+ this.rdkTask.duration = this.duration;
10468
+ this.rdkTask.wait = this.duration;
10469
+ this.rdkTask.iti = this.duration;
10470
+ this.rdkTask.coherence = this.coherence;
10471
+ }
10472
+ if (this.ddmParameters) {
10473
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10474
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10475
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10476
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10477
+ }
10478
+ if (this.ddmModel) {
10479
+ this.ddmModel.a = +this.a;
10480
+ this.ddmModel.z = +this.z;
10481
+ this.ddmModel.v = +this.v;
10482
+ this.ddmModel.t0 = +this.t0;
10483
+ }
10484
+ if (this.accumulableResponse) {
10485
+ this.accumulableResponse.trialTotal = this.trials;
10486
+ }
10487
+ if (this.accumulableTable) {
10488
+ this.accumulableTable.color = this.color;
10489
+ }
10490
+ if (this.accumulableTable && this.data) {
10491
+ this.accumulableTable.correctCount = this.data.correctCount;
10492
+ this.accumulableTable.errorCount = this.data.errorCount;
10493
+ this.accumulableTable.nrCount = this.data.nrCount;
10494
+ this.accumulableTable.accuracy = this.data.accuracy;
10495
+ this.accumulableTable.correctMeanRT = this.data.correctMeanRT;
10496
+ this.accumulableTable.errorMeanRT = this.data.errorMeanRT;
10497
+ this.accumulableTable.meanRT = this.data.meanRT;
10498
+ this.accumulableTable.correctSDRT = this.data.correctSDRT;
10499
+ this.accumulableTable.errorSDRT = this.data.errorSDRT;
10500
+ this.accumulableTable.sdRT = this.data.sdRT;
10501
+ }
10502
+ }
10182
10503
  }
10183
10504
  customElements.define('ddm-example-human', DDMExampleHuman);
10184
10505
 
@@ -10194,6 +10515,11 @@
10194
10515
  type: Number,
10195
10516
  reflect: true
10196
10517
  },
10518
+ color: {
10519
+ attribute: 'color',
10520
+ type: String,
10521
+ reflect: true
10522
+ },
10197
10523
  a: {
10198
10524
  attribute: 'boundary-separation',
10199
10525
  type: Number,
@@ -10219,10 +10545,12 @@
10219
10545
  constructor() {
10220
10546
  super();
10221
10547
  this.trials = 10;
10222
- this.a = 1.2;
10223
- this.z = 0.35;
10224
- this.v = 1.5;
10225
- this.t0 = 150;
10548
+ this.colors = ['none', 'measure', 'outcome', 'all'];
10549
+ this.color = 'outcome';
10550
+ this.a = DDMMath.a.DEFAULT;
10551
+ this.z = DDMMath.z.DEFAULT;
10552
+ this.v = DDMMath.v.DEFAULT;
10553
+ this.t0 = DDMMath.t0.DEFAULT;
10226
10554
  this.accumulableControl = null;
10227
10555
  this.accumulableTable = null;
10228
10556
  this.ddmParameters = null;
@@ -10245,6 +10573,9 @@
10245
10573
  this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10246
10574
  this.trials = event.detail.trials;
10247
10575
  });
10576
+ this.accumulableControl.addEventListener('accumulable-control-color', event => {
10577
+ this.color = event.detail.color;
10578
+ });
10248
10579
  }
10249
10580
  if (this.ddmParameters) {
10250
10581
  this.ddmParameters.addEventListener('ddm-parameters-a', event => {
@@ -10284,7 +10615,11 @@
10284
10615
  update(changedProperties) {
10285
10616
  super.update(changedProperties);
10286
10617
  if (this.accumulableControl) {
10287
- this.accumulableControl.trials = this.trials;
10618
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10619
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10620
+ }
10621
+ if (this.accumulableTable) {
10622
+ this.accumulableTable.color = this.color;
10288
10623
  }
10289
10624
  if (this.accumulableTable && this.data) {
10290
10625
  this.accumulableTable.correctCount = this.data.correctCount;
@@ -10299,10 +10634,10 @@
10299
10634
  this.accumulableTable.sdRT = this.data.sdRT;
10300
10635
  }
10301
10636
  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;
10637
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10638
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10639
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10640
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10306
10641
  }
10307
10642
  if (this.ddmModel) {
10308
10643
  this.ddmModel.trials = this.trials;
@@ -10315,9 +10650,6 @@
10315
10650
  }
10316
10651
  customElements.define('ddm-example-interactive', DDMExampleInteractive);
10317
10652
 
10318
- // import DDMMath from '@decidables/accumulable-math';
10319
-
10320
-
10321
10653
  /*
10322
10654
  DDMExampleModel element
10323
10655
  <ddm-example-model>
@@ -10374,10 +10706,10 @@
10374
10706
  this.coherence = 0.5;
10375
10707
  this.colors = ['none', 'measure', 'outcome', 'all'];
10376
10708
  this.color = 'outcome';
10377
- this.a = 1.2;
10378
- this.z = 0.35;
10379
- this.v = 1.5;
10380
- this.t0 = 150;
10709
+ this.a = DDMMath.a.DEFAULT;
10710
+ this.z = DDMMath.z.DEFAULT;
10711
+ this.v = DDMMath.v.DEFAULT;
10712
+ this.t0 = DDMMath.t0.DEFAULT;
10381
10713
  this.accumulableControl = null;
10382
10714
  this.rdkTask = null;
10383
10715
  this.ddmParameters = null;
@@ -10399,60 +10731,48 @@
10399
10731
  this.accumulableResponse = this.querySelector('accumulable-response');
10400
10732
  this.accumulableTable = this.querySelector('accumulable-table');
10401
10733
  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
- }
10734
+ this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10735
+ this.trials = event.detail.trials;
10736
+ });
10737
+ this.accumulableControl.addEventListener('accumulable-control-duration', event => {
10738
+ this.duration = event.detail.duration;
10739
+ });
10740
+ this.accumulableControl.addEventListener('accumulable-control-color', event => {
10741
+ this.color = event.detail.color;
10742
+ });
10743
+ this.accumulableControl.addEventListener('accumulable-control-run', (/* event */
10744
+ ) => {
10745
+ if (this.rdkTask) {
10746
+ this.rdkTask.running = true;
10747
+ }
10748
+ if (this.ddmModel) {
10749
+ this.ddmModel.resumeTrial();
10750
+ }
10751
+ });
10752
+ this.accumulableControl.addEventListener('accumulable-control-pause', (/* event */
10753
+ ) => {
10754
+ if (this.rdkTask) {
10755
+ this.rdkTask.running = false;
10756
+ }
10757
+ if (this.ddmModel) {
10758
+ this.ddmModel.pauseTrial();
10759
+ }
10760
+ });
10761
+ this.accumulableControl.addEventListener('accumulable-control-reset', (/* event */
10762
+ ) => {
10763
+ this.trialCount = 0;
10764
+ this.signal = undefined;
10765
+ if (this.rdkTask) {
10766
+ this.rdkTask.reset();
10767
+ }
10768
+ if (this.ddmModel) {
10769
+ this.ddmModel.trials = this.trialCount;
10770
+ }
10771
+ if (this.accumulableResponse) {
10772
+ this.accumulableResponse.reset();
10773
+ }
10774
+ if (this.accumulableTable) ;
10775
+ });
10456
10776
  }
10457
10777
  if (this.rdkTask) {
10458
10778
  this.rdkTask.addEventListener('rdk-trial-start', event => {
@@ -10511,17 +10831,15 @@
10511
10831
  this.model = event.detail.model;
10512
10832
  this.requestUpdate();
10513
10833
  });
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
- }
10834
+ this.ddmModel.addEventListener('accumulable-response', event => {
10835
+ if (this.accumulableResponse) {
10836
+ const response = event.detail.outcome === 'correct' ? this.signal : this.signal === 'left' ? 'right' : 'left';
10837
+ this.accumulableResponse.responded(response);
10838
+ }
10839
+ this.data = event.detail.data;
10840
+ this.model = event.detail.model;
10841
+ this.requestUpdate();
10842
+ });
10525
10843
  }
10526
10844
  this.requestUpdate();
10527
10845
  }
@@ -10531,10 +10849,10 @@
10531
10849
  this.trialCount = this.trials;
10532
10850
  }
10533
10851
  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;
10852
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10853
+ this.accumulableControl.duration = this.accumulableControl.duration != null ? this.duration : undefined;
10854
+ this.accumulableControl.coherence = this.accumulableControl.coherence != null ? this.coherence : undefined;
10855
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10538
10856
  }
10539
10857
  if (this.rdkTask) {
10540
10858
  this.rdkTask.trials = this.trials;
@@ -10542,10 +10860,10 @@
10542
10860
  this.rdkTask.coherence = this.coherence;
10543
10861
  }
10544
10862
  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;
10863
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10864
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10865
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10866
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10549
10867
  }
10550
10868
  if (this.ddmModel) {
10551
10869
  this.ddmModel.trials = this.trialCount;