@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.
@@ -4,20 +4,20 @@
4
4
  * SPDX-License-Identifier: BSD-3-Clause
5
5
  */
6
6
  const t$1 = globalThis,
7
- e$2 = t$1.ShadowRoot && (undefined === t$1.ShadyCSS || t$1.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
8
- s$1 = Symbol(),
9
- o$3 = new WeakMap();
7
+ e$2 = t$1.ShadowRoot && (void 0 === t$1.ShadyCSS || t$1.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
8
+ s$2 = Symbol(),
9
+ o$4 = new WeakMap();
10
10
  let n$2 = class n {
11
11
  constructor(t, e, o) {
12
- if (this._$cssResult$ = true, o !== s$1) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
12
+ if (this._$cssResult$ = true, o !== s$2) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
13
13
  this.cssText = t, this.t = e;
14
14
  }
15
15
  get styleSheet() {
16
16
  let t = this.o;
17
17
  const s = this.t;
18
- if (e$2 && undefined === t) {
19
- const e = undefined !== s && 1 === s.length;
20
- e && (t = o$3.get(s)), undefined === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && o$3.set(s, t));
18
+ if (e$2 && void 0 === t) {
19
+ const e = void 0 !== s && 1 === s.length;
20
+ e && (t = o$4.get(s)), void 0 === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && o$4.set(s, t));
21
21
  }
22
22
  return t;
23
23
  }
@@ -25,26 +25,26 @@ let n$2 = class n {
25
25
  return this.cssText;
26
26
  }
27
27
  };
28
- const r$3 = t => new n$2("string" == typeof t ? t : t + "", undefined, s$1),
28
+ const r$2 = t => new n$2("string" == typeof t ? t : t + "", void 0, s$2),
29
29
  i$3 = (t, ...e) => {
30
30
  const o = 1 === t.length ? t[0] : e.reduce((e, s, o) => e + (t => {
31
31
  if (true === t._$cssResult$) return t.cssText;
32
32
  if ("number" == typeof t) return t;
33
33
  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.");
34
34
  })(s) + t[o + 1], t[0]);
35
- return new n$2(o, t, s$1);
35
+ return new n$2(o, t, s$2);
36
36
  },
37
37
  S$1 = (s, o) => {
38
38
  if (e$2) s.adoptedStyleSheets = o.map(t => t instanceof CSSStyleSheet ? t : t.styleSheet);else for (const e of o) {
39
39
  const o = document.createElement("style"),
40
40
  n = t$1.litNonce;
41
- undefined !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
41
+ void 0 !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
42
42
  }
43
43
  },
44
44
  c$2 = e$2 ? t => t : t => t instanceof CSSStyleSheet ? (t => {
45
45
  let e = "";
46
46
  for (const s of t.cssRules) e += s.cssText;
47
- return r$3(e);
47
+ return r$2(e);
48
48
  })(t) : t;
49
49
 
50
50
  /**
@@ -55,9 +55,9 @@ const r$3 = t => new n$2("string" == typeof t ? t : t + "", undefined, s$1),
55
55
  const {
56
56
  is: i$2,
57
57
  defineProperty: e$1,
58
- getOwnPropertyDescriptor: r$2,
59
- getOwnPropertyNames: h$1,
60
- getOwnPropertySymbols: o$2,
58
+ getOwnPropertyDescriptor: h$1,
59
+ getOwnPropertyNames: r$1,
60
+ getOwnPropertySymbols: o$3,
61
61
  getPrototypeOf: n$1
62
62
  } = Object,
63
63
  a$1 = globalThis,
@@ -98,33 +98,34 @@ const {
98
98
  }
99
99
  },
100
100
  f$1 = (t, s) => !i$2(t, s),
101
- y$2 = {
101
+ b$1 = {
102
102
  attribute: true,
103
103
  type: String,
104
104
  converter: u$1,
105
105
  reflect: false,
106
+ useDefault: false,
106
107
  hasChanged: f$1
107
108
  };
108
109
  Symbol.metadata ??= Symbol("metadata"), a$1.litPropertyMetadata ??= new WeakMap();
109
- let b$1 = class b extends HTMLElement {
110
+ let y$2 = class y extends HTMLElement {
110
111
  static addInitializer(t) {
111
112
  this._$Ei(), (this.l ??= []).push(t);
112
113
  }
113
114
  static get observedAttributes() {
114
115
  return this.finalize(), this._$Eh && [...this._$Eh.keys()];
115
116
  }
116
- static createProperty(t, s = y$2) {
117
- if (s.state && (s.attribute = false), this._$Ei(), this.elementProperties.set(t, s), !s.noAccessor) {
117
+ static createProperty(t, s = b$1) {
118
+ 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) {
118
119
  const i = Symbol(),
119
- r = this.getPropertyDescriptor(t, i, s);
120
- undefined !== r && e$1(this.prototype, t, r);
120
+ h = this.getPropertyDescriptor(t, i, s);
121
+ void 0 !== h && e$1(this.prototype, t, h);
121
122
  }
122
123
  }
123
124
  static getPropertyDescriptor(t, s, i) {
124
125
  const {
125
126
  get: e,
126
- set: h
127
- } = r$2(this.prototype, t) ?? {
127
+ set: r
128
+ } = h$1(this.prototype, t) ?? {
128
129
  get() {
129
130
  return this[s];
130
131
  },
@@ -133,41 +134,39 @@ let b$1 = class b extends HTMLElement {
133
134
  }
134
135
  };
135
136
  return {
136
- get() {
137
- return e?.call(this);
138
- },
137
+ get: e,
139
138
  set(s) {
140
- const r = e?.call(this);
141
- h.call(this, s), this.requestUpdate(t, r, i);
139
+ const h = e?.call(this);
140
+ r?.call(this, s), this.requestUpdate(t, h, i);
142
141
  },
143
142
  configurable: true,
144
143
  enumerable: true
145
144
  };
146
145
  }
147
146
  static getPropertyOptions(t) {
148
- return this.elementProperties.get(t) ?? y$2;
147
+ return this.elementProperties.get(t) ?? b$1;
149
148
  }
150
149
  static _$Ei() {
151
150
  if (this.hasOwnProperty(d$1("elementProperties"))) return;
152
151
  const t = n$1(this);
153
- t.finalize(), undefined !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
152
+ t.finalize(), void 0 !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
154
153
  }
155
154
  static finalize() {
156
155
  if (this.hasOwnProperty(d$1("finalized"))) return;
157
156
  if (this.finalized = true, this._$Ei(), this.hasOwnProperty(d$1("properties"))) {
158
157
  const t = this.properties,
159
- s = [...h$1(t), ...o$2(t)];
158
+ s = [...r$1(t), ...o$3(t)];
160
159
  for (const i of s) this.createProperty(i, t[i]);
161
160
  }
162
161
  const t = this[Symbol.metadata];
163
162
  if (null !== t) {
164
163
  const s = litPropertyMetadata.get(t);
165
- if (undefined !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
164
+ if (void 0 !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
166
165
  }
167
166
  this._$Eh = new Map();
168
167
  for (const [t, s] of this.elementProperties) {
169
168
  const i = this._$Eu(t, s);
170
- undefined !== i && this._$Eh.set(i, t);
169
+ void 0 !== i && this._$Eh.set(i, t);
171
170
  }
172
171
  this.elementStyles = this.finalizeStyles(this.styles);
173
172
  }
@@ -176,21 +175,21 @@ let b$1 = class b extends HTMLElement {
176
175
  if (Array.isArray(s)) {
177
176
  const e = new Set(s.flat(1 / 0).reverse());
178
177
  for (const s of e) i.unshift(c$2(s));
179
- } else undefined !== s && i.push(c$2(s));
178
+ } else void 0 !== s && i.push(c$2(s));
180
179
  return i;
181
180
  }
182
181
  static _$Eu(t, s) {
183
182
  const i = s.attribute;
184
- return false === i ? undefined : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : undefined;
183
+ return false === i ? void 0 : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : void 0;
185
184
  }
186
185
  constructor() {
187
- super(), this._$Ep = undefined, this.isUpdatePending = false, this.hasUpdated = false, this._$Em = null, this._$Ev();
186
+ super(), this._$Ep = void 0, this.isUpdatePending = false, this.hasUpdated = false, this._$Em = null, this._$Ev();
188
187
  }
189
188
  _$Ev() {
190
189
  this._$ES = new Promise(t => this.enableUpdating = t), this._$AL = new Map(), this._$E_(), this.requestUpdate(), this.constructor.l?.forEach(t => t(this));
191
190
  }
192
191
  addController(t) {
193
- (this._$EO ??= new Set()).add(t), undefined !== this.renderRoot && this.isConnected && t.hostConnected?.();
192
+ (this._$EO ??= new Set()).add(t), void 0 !== this.renderRoot && this.isConnected && t.hostConnected?.();
194
193
  }
195
194
  removeController(t) {
196
195
  this._$EO?.delete(t);
@@ -215,36 +214,44 @@ let b$1 = class b extends HTMLElement {
215
214
  attributeChangedCallback(t, s, i) {
216
215
  this._$AK(t, i);
217
216
  }
218
- _$EC(t, s) {
217
+ _$ET(t, s) {
219
218
  const i = this.constructor.elementProperties.get(t),
220
219
  e = this.constructor._$Eu(t, i);
221
- if (undefined !== e && true === i.reflect) {
222
- const r = (undefined !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
223
- this._$Em = t, null == r ? this.removeAttribute(e) : this.setAttribute(e, r), this._$Em = null;
220
+ if (void 0 !== e && true === i.reflect) {
221
+ const h = (void 0 !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
222
+ this._$Em = t, null == h ? this.removeAttribute(e) : this.setAttribute(e, h), this._$Em = null;
224
223
  }
225
224
  }
226
225
  _$AK(t, s) {
227
226
  const i = this.constructor,
228
227
  e = i._$Eh.get(t);
229
- if (undefined !== e && this._$Em !== e) {
228
+ if (void 0 !== e && this._$Em !== e) {
230
229
  const t = i.getPropertyOptions(e),
231
- r = "function" == typeof t.converter ? {
230
+ h = "function" == typeof t.converter ? {
232
231
  fromAttribute: t.converter
233
- } : undefined !== t.converter?.fromAttribute ? t.converter : u$1;
234
- this._$Em = e, this[e] = r.fromAttribute(s, t.type), this._$Em = null;
232
+ } : void 0 !== t.converter?.fromAttribute ? t.converter : u$1;
233
+ this._$Em = e;
234
+ const r = h.fromAttribute(s, t.type);
235
+ this[e] = r ?? this._$Ej?.get(e) ?? r, this._$Em = null;
235
236
  }
236
237
  }
237
238
  requestUpdate(t, s, i) {
238
- if (undefined !== t) {
239
- if (i ??= this.constructor.getPropertyOptions(t), !(i.hasChanged ?? f$1)(this[t], s)) return;
240
- this.P(t, s, i);
241
- }
242
- false === this.isUpdatePending && (this._$ES = this._$ET());
243
- }
244
- P(t, s, i) {
245
- this._$AL.has(t) || this._$AL.set(t, s), true === i.reflect && this._$Em !== t && (this._$Ej ??= new Set()).add(t);
246
- }
247
- async _$ET() {
239
+ if (void 0 !== t) {
240
+ const e = this.constructor,
241
+ h = this[t];
242
+ 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;
243
+ this.C(t, s, i);
244
+ }
245
+ false === this.isUpdatePending && (this._$ES = this._$EP());
246
+ }
247
+ C(t, s, {
248
+ useDefault: i,
249
+ reflect: e,
250
+ wrapped: h
251
+ }, r) {
252
+ 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));
253
+ }
254
+ async _$EP() {
248
255
  this.isUpdatePending = true;
249
256
  try {
250
257
  await this._$ES;
@@ -262,17 +269,23 @@ let b$1 = class b extends HTMLElement {
262
269
  if (!this.hasUpdated) {
263
270
  if (this.renderRoot ??= this.createRenderRoot(), this._$Ep) {
264
271
  for (const [t, s] of this._$Ep) this[t] = s;
265
- this._$Ep = undefined;
272
+ this._$Ep = void 0;
266
273
  }
267
274
  const t = this.constructor.elementProperties;
268
- if (t.size > 0) for (const [s, i] of t) true !== i.wrapped || this._$AL.has(s) || undefined === this[s] || this.P(s, this[s], i);
275
+ if (t.size > 0) for (const [s, i] of t) {
276
+ const {
277
+ wrapped: t
278
+ } = i,
279
+ e = this[s];
280
+ true !== t || this._$AL.has(s) || void 0 === e || this.C(s, void 0, i, e);
281
+ }
269
282
  }
270
283
  let t = false;
271
284
  const s = this._$AL;
272
285
  try {
273
- t = this.shouldUpdate(s), t ? (this.willUpdate(s), this._$EO?.forEach(t => t.hostUpdate?.()), this.update(s)) : this._$EU();
286
+ t = this.shouldUpdate(s), t ? (this.willUpdate(s), this._$EO?.forEach(t => t.hostUpdate?.()), this.update(s)) : this._$EM();
274
287
  } catch (s) {
275
- throw t = false, this._$EU(), s;
288
+ throw t = false, this._$EM(), s;
276
289
  }
277
290
  t && this._$AE(s);
278
291
  }
@@ -280,7 +293,7 @@ let b$1 = class b extends HTMLElement {
280
293
  _$AE(t) {
281
294
  this._$EO?.forEach(t => t.hostUpdated?.()), this.hasUpdated || (this.hasUpdated = true, this.firstUpdated(t)), this.updated(t);
282
295
  }
283
- _$EU() {
296
+ _$EM() {
284
297
  this._$AL = new Map(), this.isUpdatePending = false;
285
298
  }
286
299
  get updateComplete() {
@@ -293,16 +306,16 @@ let b$1 = class b extends HTMLElement {
293
306
  return true;
294
307
  }
295
308
  update(t) {
296
- this._$Ej &&= this._$Ej.forEach(t => this._$EC(t, this[t])), this._$EU();
309
+ this._$Eq &&= this._$Eq.forEach(t => this._$ET(t, this[t])), this._$EM();
297
310
  }
298
311
  updated(t) {}
299
312
  firstUpdated(t) {}
300
313
  };
301
- b$1.elementStyles = [], b$1.shadowRootOptions = {
314
+ y$2.elementStyles = [], y$2.shadowRootOptions = {
302
315
  mode: "open"
303
- }, b$1[d$1("elementProperties")] = new Map(), b$1[d$1("finalized")] = new Map(), p$1?.({
304
- ReactiveElement: b$1
305
- }), (a$1.reactiveElementVersions ??= []).push("2.0.4");
316
+ }, y$2[d$1("elementProperties")] = new Map(), y$2[d$1("finalized")] = new Map(), p$1?.({
317
+ ReactiveElement: y$2
318
+ }), (a$1.reactiveElementVersions ??= []).push("2.1.1");
306
319
 
307
320
  /**
308
321
  * @license
@@ -311,15 +324,15 @@ b$1.elementStyles = [], b$1.shadowRootOptions = {
311
324
  */
312
325
  const t = globalThis,
313
326
  i$1 = t.trustedTypes,
314
- s = i$1 ? i$1.createPolicy("lit-html", {
327
+ s$1 = i$1 ? i$1.createPolicy("lit-html", {
315
328
  createHTML: t => t
316
- }) : undefined,
329
+ }) : void 0,
317
330
  e = "$lit$",
318
331
  h = `lit$${Math.random().toFixed(9).slice(2)}$`,
319
- o$1 = "?" + h,
320
- n = `<${o$1}>`,
321
- r$1 = document,
322
- l = () => r$1.createComment(""),
332
+ o$2 = "?" + h,
333
+ n = `<${o$2}>`,
334
+ r = document,
335
+ l = () => r.createComment(""),
323
336
  c = t => null === t || "object" != typeof t && "function" != typeof t,
324
337
  a = Array.isArray,
325
338
  u = t => a(t) || "function" == typeof t?.[Symbol.iterator],
@@ -341,10 +354,10 @@ const t = globalThis,
341
354
  T = Symbol.for("lit-noChange"),
342
355
  E = Symbol.for("lit-nothing"),
343
356
  A = new WeakMap(),
344
- C = r$1.createTreeWalker(r$1, 129);
357
+ C = r.createTreeWalker(r, 129);
345
358
  function P(t, i) {
346
359
  if (!a(t) || !t.hasOwnProperty("raw")) throw Error("invalid template strings array");
347
- return undefined !== s ? s.createHTML(i) : i;
360
+ return void 0 !== s$1 ? s$1.createHTML(i) : i;
348
361
  }
349
362
  const V = (t, i) => {
350
363
  const s = t.length - 1,
@@ -358,7 +371,7 @@ const V = (t, i) => {
358
371
  u,
359
372
  d = -1,
360
373
  y = 0;
361
- 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);
374
+ 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);
362
375
  const x = c === m && t[i + 1].startsWith("/>") ? " " : "";
363
376
  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);
364
377
  }
@@ -409,7 +422,7 @@ class N {
409
422
  r.append(t[s], l());
410
423
  }
411
424
  }
412
- } else if (8 === r.nodeType) if (r.data === o$1) d.push({
425
+ } else if (8 === r.nodeType) if (r.data === o$2) d.push({
413
426
  type: 2,
414
427
  index: c
415
428
  });else {
@@ -423,19 +436,19 @@ class N {
423
436
  }
424
437
  }
425
438
  static createElement(t, i) {
426
- const s = r$1.createElement("template");
439
+ const s = r.createElement("template");
427
440
  return s.innerHTML = t, s;
428
441
  }
429
442
  }
430
443
  function S(t, i, s = t, e) {
431
444
  if (i === T) return i;
432
- let h = undefined !== e ? s._$Co?.[e] : s._$Cl;
433
- const o = c(i) ? undefined : i._$litDirective$;
434
- 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;
445
+ let h = void 0 !== e ? s._$Co?.[e] : s._$Cl;
446
+ const o = c(i) ? void 0 : i._$litDirective$;
447
+ 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;
435
448
  }
436
449
  class M {
437
450
  constructor(t, i) {
438
- this._$AV = [], this._$AN = undefined, this._$AD = t, this._$AM = i;
451
+ this._$AV = [], this._$AN = void 0, this._$AD = t, this._$AM = i;
439
452
  }
440
453
  get parentNode() {
441
454
  return this._$AM.parentNode;
@@ -450,24 +463,24 @@ class M {
450
463
  },
451
464
  parts: s
452
465
  } = this._$AD,
453
- e = (t?.creationScope ?? r$1).importNode(i, true);
466
+ e = (t?.creationScope ?? r).importNode(i, true);
454
467
  C.currentNode = e;
455
468
  let h = C.nextNode(),
456
469
  o = 0,
457
470
  n = 0,
458
471
  l = s[0];
459
- for (; undefined !== l;) {
472
+ for (; void 0 !== l;) {
460
473
  if (o === l.index) {
461
474
  let i;
462
475
  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];
463
476
  }
464
477
  o !== l?.index && (h = C.nextNode(), o++);
465
478
  }
466
- return C.currentNode = r$1, e;
479
+ return C.currentNode = r, e;
467
480
  }
468
481
  p(t) {
469
482
  let i = 0;
470
- 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++;
483
+ 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++;
471
484
  }
472
485
  }
473
486
  class R {
@@ -475,12 +488,12 @@ class R {
475
488
  return this._$AM?._$AU ?? this._$Cv;
476
489
  }
477
490
  constructor(t, i, s, e) {
478
- 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;
491
+ 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;
479
492
  }
480
493
  get parentNode() {
481
494
  let t = this._$AA.parentNode;
482
495
  const i = this._$AM;
483
- return undefined !== i && 11 === t?.nodeType && (t = i.parentNode), t;
496
+ return void 0 !== i && 11 === t?.nodeType && (t = i.parentNode), t;
484
497
  }
485
498
  get startNode() {
486
499
  return this._$AA;
@@ -489,7 +502,7 @@ class R {
489
502
  return this._$AB;
490
503
  }
491
504
  _$AI(t, i = this) {
492
- 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);
505
+ 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);
493
506
  }
494
507
  O(t) {
495
508
  return this._$AA.parentNode.insertBefore(t, this._$AB);
@@ -498,14 +511,14 @@ class R {
498
511
  this._$AH !== t && (this._$AR(), this._$AH = this.O(t));
499
512
  }
500
513
  _(t) {
501
- this._$AH !== E && c(this._$AH) ? this._$AA.nextSibling.data = t : this.T(r$1.createTextNode(t)), this._$AH = t;
514
+ this._$AH !== E && c(this._$AH) ? this._$AA.nextSibling.data = t : this.T(r.createTextNode(t)), this._$AH = t;
502
515
  }
503
516
  $(t) {
504
517
  const {
505
518
  values: i,
506
519
  _$litType$: s
507
520
  } = t,
508
- e = "number" == typeof s ? this._$AC(t) : (undefined === s.el && (s.el = N.createElement(P(s.h, s.h[0]), this.options)), s);
521
+ e = "number" == typeof s ? this._$AC(t) : (void 0 === s.el && (s.el = N.createElement(P(s.h, s.h[0]), this.options)), s);
509
522
  if (this._$AH?._$AD === e) this._$AH.p(i);else {
510
523
  const t = new M(e, this),
511
524
  s = t.u(this.options);
@@ -514,7 +527,7 @@ class R {
514
527
  }
515
528
  _$AC(t) {
516
529
  let i = A.get(t.strings);
517
- return undefined === i && A.set(t.strings, i = new N(t)), i;
530
+ return void 0 === i && A.set(t.strings, i = new N(t)), i;
518
531
  }
519
532
  k(t) {
520
533
  a(this._$AH) || (this._$AH = [], this._$AR());
@@ -525,13 +538,13 @@ class R {
525
538
  e < i.length && (this._$AR(s && s._$AB.nextSibling, e), i.length = e);
526
539
  }
527
540
  _$AR(t = this._$AA.nextSibling, i) {
528
- for (this._$AP?.(false, true, i); t && t !== this._$AB;) {
541
+ for (this._$AP?.(false, true, i); t !== this._$AB;) {
529
542
  const i = t.nextSibling;
530
543
  t.remove(), t = i;
531
544
  }
532
545
  }
533
546
  setConnected(t) {
534
- undefined === this._$AM && (this._$Cv = t, this._$AP?.(t));
547
+ void 0 === this._$AM && (this._$Cv = t, this._$AP?.(t));
535
548
  }
536
549
  }
537
550
  class k {
@@ -542,12 +555,12 @@ class k {
542
555
  return this._$AM._$AU;
543
556
  }
544
557
  constructor(t, i, s, e, h) {
545
- 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;
558
+ 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;
546
559
  }
547
560
  _$AI(t, i = this, s, e) {
548
561
  const h = this.strings;
549
562
  let o = false;
550
- if (undefined === h) t = S(this, t, i, 0), o = !c(t) || t !== this._$AH && t !== T, o && (this._$AH = t);else {
563
+ if (void 0 === h) t = S(this, t, i, 0), o = !c(t) || t !== this._$AH && t !== T, o && (this._$AH = t);else {
551
564
  const e = t;
552
565
  let n, r;
553
566
  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;
@@ -563,7 +576,7 @@ class H extends k {
563
576
  super(...arguments), this.type = 3;
564
577
  }
565
578
  j(t) {
566
- this.element[this.name] = t === E ? undefined : t;
579
+ this.element[this.name] = t === E ? void 0 : t;
567
580
  }
568
581
  }
569
582
  class I extends k {
@@ -591,7 +604,7 @@ class L extends k {
591
604
  }
592
605
  class z {
593
606
  constructor(t, i, s) {
594
- this.element = t, this.type = 6, this._$AN = undefined, this._$AM = i, this.options = s;
607
+ this.element = t, this.type = 6, this._$AN = void 0, this._$AM = i, this.options = s;
595
608
  }
596
609
  get _$AU() {
597
610
  return this._$AM._$AU;
@@ -601,13 +614,13 @@ class z {
601
614
  }
602
615
  }
603
616
  const j = t.litHtmlPolyfillSupport;
604
- j?.(N, R), (t.litHtmlVersions ??= []).push("3.2.1");
617
+ j?.(N, R), (t.litHtmlVersions ??= []).push("3.3.1");
605
618
  const B = (t, i, s) => {
606
619
  const e = s?.renderBefore ?? i;
607
620
  let h = e._$litPart$;
608
- if (undefined === h) {
621
+ if (void 0 === h) {
609
622
  const t = s?.renderBefore ?? null;
610
- e._$litPart$ = h = new R(i.insertBefore(l(), t), t, undefined, s ?? {});
623
+ e._$litPart$ = h = new R(i.insertBefore(l(), t), t, void 0, s ?? {});
611
624
  }
612
625
  return h._$AI(t), h;
613
626
  };
@@ -617,19 +630,20 @@ const B = (t, i, s) => {
617
630
  * Copyright 2017 Google LLC
618
631
  * SPDX-License-Identifier: BSD-3-Clause
619
632
  */
620
- class r extends b$1 {
633
+ const s = globalThis;
634
+ class i extends y$2 {
621
635
  constructor() {
622
636
  super(...arguments), this.renderOptions = {
623
637
  host: this
624
- }, this._$Do = undefined;
638
+ }, this._$Do = void 0;
625
639
  }
626
640
  createRenderRoot() {
627
641
  const t = super.createRenderRoot();
628
642
  return this.renderOptions.renderBefore ??= t.firstChild, t;
629
643
  }
630
644
  update(t) {
631
- const s = this.render();
632
- this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = B(s, this.renderRoot, this.renderOptions);
645
+ const r = this.render();
646
+ this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = B(r, this.renderRoot, this.renderOptions);
633
647
  }
634
648
  connectedCallback() {
635
649
  super.connectedCallback(), this._$Do?.setConnected(true);
@@ -641,14 +655,14 @@ class r extends b$1 {
641
655
  return T;
642
656
  }
643
657
  }
644
- r._$litElement$ = true, r["finalized"] = true, globalThis.litElementHydrateSupport?.({
645
- LitElement: r
658
+ i._$litElement$ = true, i["finalized"] = true, s.litElementHydrateSupport?.({
659
+ LitElement: i
646
660
  });
647
- const i = globalThis.litElementPolyfillSupport;
648
- i?.({
649
- LitElement: r
661
+ const o$1 = s.litElementPolyfillSupport;
662
+ o$1?.({
663
+ LitElement: i
650
664
  });
651
- (globalThis.litElementVersions ??= []).push("4.1.1");
665
+ (s.litElementVersions ??= []).push("4.2.1");
652
666
 
653
667
  function ascending$1(a, b) {
654
668
  return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
@@ -4566,7 +4580,7 @@ Transform.prototype;
4566
4580
  DecidablesElement Base Class - Not intended for instantiation!
4567
4581
  <decidables-element>
4568
4582
  */
4569
- class DecidablesElement extends r {
4583
+ class DecidablesElement extends i {
4570
4584
  getComputedStyleValue(property) {
4571
4585
  return getComputedStyle(this).getPropertyValue(property).trim();
4572
4586
  }
@@ -4821,22 +4835,22 @@ class DecidablesElement extends r {
4821
4835
  static get styles() {
4822
4836
  return i$3`
4823
4837
  :host {
4824
- ---shadow-0: var(--shadow-0, ${r$3(this.cssBoxShadow(0))});
4825
- ---shadow-2: var(--shadow-2, ${r$3(this.cssBoxShadow(2))});
4826
- ---shadow-4: var(--shadow-4, ${r$3(this.cssBoxShadow(4))});
4827
- ---shadow-8: var(--shadow-8, ${r$3(this.cssBoxShadow(8))});
4828
-
4829
- ---color-background: var(--color-background, ${r$3(this.greys.white)});
4830
- ---color-border: var(--color-border, ${r$3(this.greys.light75)});
4831
- ---color-text: var(--color-text, ${r$3(this.greys.dark75)});
4832
- ---color-text-inverse: var(--color-text-inverse, ${r$3(this.greys.white)});
4833
- ---color-link: var(--color-link, ${r$3(this.greys.dark25)});
4834
- ---color-element-background: var(--color-element-background, ${r$3(this.greys.light75)});
4835
- ---color-element-disabled: var(--color-element-disabled, ${r$3(this.greys.light50)});
4836
- ---color-element-enabled: var(--color-element-enabled, ${r$3(this.greys.dark25)});
4837
- ---color-element-selected: var(--color-element-selected, ${r$3(this.greys.grey)});
4838
- ---color-element-border: var(--color-element-border, ${r$3(this.greys.dark50)});
4839
- ---color-element-emphasis: var(--color-element-emphasis, ${r$3(this.greys.dark75)});
4838
+ ---shadow-0: var(--shadow-0, ${r$2(this.cssBoxShadow(0))});
4839
+ ---shadow-2: var(--shadow-2, ${r$2(this.cssBoxShadow(2))});
4840
+ ---shadow-4: var(--shadow-4, ${r$2(this.cssBoxShadow(4))});
4841
+ ---shadow-8: var(--shadow-8, ${r$2(this.cssBoxShadow(8))});
4842
+
4843
+ ---color-background: var(--color-background, ${r$2(this.greys.white)});
4844
+ ---color-border: var(--color-border, ${r$2(this.greys.light75)});
4845
+ ---color-text: var(--color-text, ${r$2(this.greys.dark75)});
4846
+ ---color-text-inverse: var(--color-text-inverse, ${r$2(this.greys.white)});
4847
+ ---color-link: var(--color-link, ${r$2(this.greys.dark25)});
4848
+ ---color-element-background: var(--color-element-background, ${r$2(this.greys.light75)});
4849
+ ---color-element-disabled: var(--color-element-disabled, ${r$2(this.greys.light50)});
4850
+ ---color-element-enabled: var(--color-element-enabled, ${r$2(this.greys.dark25)});
4851
+ ---color-element-selected: var(--color-element-selected, ${r$2(this.greys.grey)});
4852
+ ---color-element-border: var(--color-element-border, ${r$2(this.greys.dark50)});
4853
+ ---color-element-emphasis: var(--color-element-emphasis, ${r$2(this.greys.dark75)});
4840
4854
 
4841
4855
  ---font-family-base: var(--font-family-base, "Source Sans", sans-serif);
4842
4856
  ---font-family-math: var(--font-family-math, "Source Serif", serif);
@@ -4846,6 +4860,7 @@ class DecidablesElement extends r {
4846
4860
  ---transition-duration: var(--transition-duration, 500ms);
4847
4861
 
4848
4862
  font-family: var(---font-family-base);
4863
+ font-weight: normal;
4849
4864
  }
4850
4865
 
4851
4866
  :host,
@@ -4899,6 +4914,9 @@ class DecidablesButton extends DecidablesElement {
4899
4914
  static get styles() {
4900
4915
  return [super.styles, i$3`
4901
4916
  :host {
4917
+ ---decidables-button-background-color-disabled: var(--decidables-button-background-color, var(---color-element-disabled));
4918
+ ---decidables-button-background-color-enabled: var(--decidables-button-background-color, var(---color-element-enabled));
4919
+
4902
4920
  margin: 0.25rem;
4903
4921
  }
4904
4922
 
@@ -4918,7 +4936,7 @@ class DecidablesButton extends DecidablesElement {
4918
4936
  }
4919
4937
 
4920
4938
  button:disabled {
4921
- background-color: var(--decidables-button-background-color, var(---color-element-disabled));
4939
+ background-color: var(---decidables-button-background-color-disabled);
4922
4940
  outline: none;
4923
4941
  box-shadow: none;
4924
4942
  }
@@ -4926,7 +4944,7 @@ class DecidablesButton extends DecidablesElement {
4926
4944
  button:enabled {
4927
4945
  cursor: pointer;
4928
4946
 
4929
- background-color: var(--decidables-button-background-color, var(---color-element-enabled));
4947
+ background-color: var(---decidables-button-background-color-enabled);
4930
4948
  outline: none;
4931
4949
  box-shadow: var(---shadow-2);
4932
4950
  }
@@ -4977,6 +4995,11 @@ class DecidablesSlider extends DecidablesElement {
4977
4995
  type: Boolean,
4978
4996
  reflect: true
4979
4997
  },
4998
+ scale: {
4999
+ attribute: 'scale',
5000
+ type: Boolean,
5001
+ reflect: true
5002
+ },
4980
5003
  max: {
4981
5004
  attribute: 'max',
4982
5005
  type: Number,
@@ -4996,6 +5019,11 @@ class DecidablesSlider extends DecidablesElement {
4996
5019
  attribute: 'value',
4997
5020
  type: Number,
4998
5021
  reflect: true
5022
+ },
5023
+ nonlinear: {
5024
+ attribute: false,
5025
+ type: Boolean,
5026
+ reflect: false
4999
5027
  }
5000
5028
  };
5001
5029
  }
@@ -5004,13 +5032,30 @@ class DecidablesSlider extends DecidablesElement {
5004
5032
 
5005
5033
  // Attributes
5006
5034
  this.disabled = false;
5035
+ this.scale = false;
5007
5036
  this.max = undefined;
5008
5037
  this.min = undefined;
5009
5038
  this.step = undefined;
5010
5039
  this.value = undefined;
5011
- }
5012
- changed(event) {
5013
- this.value = event.target.value;
5040
+ this.nonlinear = false;
5041
+
5042
+ // Properties
5043
+ this.rangeMax = undefined;
5044
+ this.rangeMin = undefined;
5045
+ this.rangeStep = undefined;
5046
+ this.rangeValue = undefined;
5047
+
5048
+ // Transform
5049
+ this.toRange = undefined;
5050
+ this.fromRange = undefined;
5051
+ }
5052
+ nonlinearRange(nonlinear, toRange, fromRange) {
5053
+ this.nonlinear = nonlinear;
5054
+ this.toRange = nonlinear ? toRange : undefined;
5055
+ this.fromRange = nonlinear ? fromRange : undefined;
5056
+ }
5057
+ rangeChanged(event) {
5058
+ this.value = this.nonlinear ? this.fromRange(event.target.value) : event.target.value;
5014
5059
  this.dispatchEvent(new CustomEvent('change', {
5015
5060
  detail: {
5016
5061
  value: this.value
@@ -5018,15 +5063,28 @@ class DecidablesSlider extends DecidablesElement {
5018
5063
  bubbles: true
5019
5064
  }));
5020
5065
  }
5021
- inputted(event) {
5066
+ rangeInputted(event) {
5067
+ this.value = this.nonlinear ? this.fromRange(event.target.value) : event.target.value;
5068
+ }
5069
+ spinnerInputted(event) {
5022
5070
  this.value = event.target.value;
5023
5071
  }
5072
+ willUpdate() {
5073
+ this.rangeMax = this.max === undefined ? undefined : this.nonlinear ? this.toRange(this.max) : this.max;
5074
+ this.rangeMin = this.min === undefined ? undefined : this.nonlinear ? this.toRange(this.min) : this.min;
5075
+ this.rangeStep = this.step === undefined ? undefined : this.nonlinear ? 'any' : this.step;
5076
+ this.rangeValue = this.value === undefined ? undefined : this.nonlinear ? this.toRange(this.value) : this.value;
5077
+ }
5024
5078
  static get styles() {
5025
5079
  return [super.styles, i$3`
5026
5080
  :host {
5027
- ---shadow-2-rotate: var(--shadow-2-rotate, ${r$3(this.cssBoxShadow(2, true, false))});
5028
- ---shadow-4-rotate: var(--shadow-4-rotate, ${r$3(this.cssBoxShadow(4, true, false))});
5029
- ---shadow-8-rotate: var(--shadow-8-rotate, ${r$3(this.cssBoxShadow(8, true, false))});
5081
+ ---decidables-slider-background-color: var(--decidables-slider-background-color, var(---color-element-disabled));
5082
+ ---decidables-slider-color: var(--decidables-slider-color, var(---color-element-enabled));
5083
+ ---decidables-spinner-background-color: var(--decidables-slider-background-color, none);
5084
+
5085
+ ---shadow-2-rotate: var(--shadow-2-rotate, ${r$2(this.cssBoxShadow(2, true, false))});
5086
+ ---shadow-4-rotate: var(--shadow-4-rotate, ${r$2(this.cssBoxShadow(4, true, false))});
5087
+ ---shadow-8-rotate: var(--shadow-8-rotate, ${r$2(this.cssBoxShadow(8, true, false))});
5030
5088
 
5031
5089
  display: flex;
5032
5090
 
@@ -5041,7 +5099,10 @@ class DecidablesSlider extends DecidablesElement {
5041
5099
  }
5042
5100
 
5043
5101
  .range {
5044
- display: inline-block;
5102
+ position: relative;
5103
+ display: flex;
5104
+
5105
+ flex-direction: row;
5045
5106
 
5046
5107
  width: 3.5rem;
5047
5108
  height: 4.75rem;
@@ -5052,6 +5113,8 @@ class DecidablesSlider extends DecidablesElement {
5052
5113
  --decidables-spinner-input-width: 3.5rem;
5053
5114
 
5054
5115
  margin: 0 0.25rem 0.25rem;
5116
+
5117
+ background: var(---decidables-spinner-background-color);
5055
5118
  }
5056
5119
 
5057
5120
  /* Adapted from http://danielstern.ca/range.css/#/ */
@@ -5090,14 +5153,14 @@ class DecidablesSlider extends DecidablesElement {
5090
5153
  width: 100%;
5091
5154
  height: 4px;
5092
5155
 
5093
- background: var(---color-element-disabled);
5156
+ background: var(---decidables-slider-background-color);
5094
5157
  border: 0;
5095
5158
  border-radius: 2px;
5096
5159
  box-shadow: none;
5097
5160
  }
5098
5161
 
5099
5162
  input[type=range]:focus::-webkit-slider-runnable-track {
5100
- background: var(---color-element-disabled);
5163
+ background: var(---decidables-slider-background-color);
5101
5164
  }
5102
5165
 
5103
5166
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
@@ -5105,7 +5168,7 @@ class DecidablesSlider extends DecidablesElement {
5105
5168
  width: 100%;
5106
5169
  height: 4px;
5107
5170
 
5108
- background: var(---color-element-disabled);
5171
+ background: var(---decidables-slider-background-color);
5109
5172
  border: 0;
5110
5173
  border-radius: 2px;
5111
5174
  box-shadow: none;
@@ -5125,7 +5188,7 @@ class DecidablesSlider extends DecidablesElement {
5125
5188
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5126
5189
  input[type=range]::-ms-fill-lower {
5127
5190
  background: #cccccc;
5128
- /* background: var(---color-element-disabled); */
5191
+ /* background: var(---decidables-slider-background-color); */
5129
5192
  border: 0;
5130
5193
  border-radius: 2px;
5131
5194
  box-shadow: none;
@@ -5134,7 +5197,7 @@ class DecidablesSlider extends DecidablesElement {
5134
5197
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5135
5198
  input[type=range]::-ms-fill-upper {
5136
5199
  background: #cccccc;
5137
- /* background: var(---color-element-disabled); */
5200
+ /* background: var(---decidables-slider-background-color); */
5138
5201
  border: 0;
5139
5202
  border-radius: 2px;
5140
5203
  box-shadow: none;
@@ -5142,12 +5205,12 @@ class DecidablesSlider extends DecidablesElement {
5142
5205
 
5143
5206
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5144
5207
  input[type=range]:focus::-ms-fill-lower {
5145
- background: var(---color-element-disabled);
5208
+ background: var(---decidables-slider-background-color);
5146
5209
  }
5147
5210
 
5148
5211
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5149
5212
  input[type=range]:focus::-ms-fill-upper {
5150
- background: var(---color-element-disabled);
5213
+ background: var(---decidables-slider-background-color);
5151
5214
  }
5152
5215
 
5153
5216
  /* Thumb */
@@ -5165,12 +5228,12 @@ class DecidablesSlider extends DecidablesElement {
5165
5228
  }
5166
5229
 
5167
5230
  input[type=range]:disabled::-webkit-slider-thumb {
5168
- background: var(---color-element-disabled);
5231
+ background: var(---decidables-slider-background-color);
5169
5232
  box-shadow: none;
5170
5233
  }
5171
5234
 
5172
5235
  input[type=range]:enabled::-webkit-slider-thumb {
5173
- background: var(---color-element-enabled);
5236
+ background: var(---decidables-slider-color);
5174
5237
  box-shadow: var(---shadow-2-rotate);
5175
5238
  }
5176
5239
 
@@ -5201,13 +5264,13 @@ class DecidablesSlider extends DecidablesElement {
5201
5264
 
5202
5265
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5203
5266
  input[type=range]:disabled::-moz-range-thumb {
5204
- background: var(---color-element-disabled);
5267
+ background: var(---decidables-slider-background-color);
5205
5268
  box-shadow: none;
5206
5269
  }
5207
5270
 
5208
5271
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5209
5272
  input[type=range]:enabled::-moz-range-thumb {
5210
- background: var(---color-element-enabled);
5273
+ background: var(---decidables-slider-color);
5211
5274
  box-shadow: var(---shadow-2-rotate);
5212
5275
  }
5213
5276
 
@@ -5244,13 +5307,13 @@ class DecidablesSlider extends DecidablesElement {
5244
5307
 
5245
5308
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5246
5309
  input[type=range]:disabled::-ms-thumb {
5247
- background: var(---color-element-disabled);
5310
+ background: var(---decidables-slider-background-color);
5248
5311
  box-shadow: none;
5249
5312
  }
5250
5313
 
5251
5314
  /* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
5252
5315
  input[type=range]:enabled::-ms-thumb {
5253
- background: var(---color-element-enabled);
5316
+ background: var(---decidables-slider-color);
5254
5317
  box-shadow: var(---shadow-2-rotate);
5255
5318
  }
5256
5319
 
@@ -5272,6 +5335,33 @@ class DecidablesSlider extends DecidablesElement {
5272
5335
  :host(.keyboard) input[type=range]:enabled:focus:active::-ms-thumb {
5273
5336
  box-shadow: var(---shadow-8-rotate);
5274
5337
  }
5338
+
5339
+ datalist {
5340
+ position: absolute;
5341
+ left: 2rem;
5342
+ z-index: -1;
5343
+ display: flex;
5344
+
5345
+ flex-direction: column;
5346
+
5347
+ align-items: flex-start;
5348
+ justify-content: space-between;
5349
+
5350
+ height: 4.75rem;
5351
+
5352
+ font-size: 0.75rem;
5353
+ }
5354
+
5355
+ option {
5356
+ padding: 0;
5357
+
5358
+ line-height: 0.8;
5359
+ min-block-size: 0;
5360
+ }
5361
+
5362
+ option::before {
5363
+ content: "– ";
5364
+ }
5275
5365
  `];
5276
5366
  }
5277
5367
  render() {
@@ -5280,9 +5370,15 @@ class DecidablesSlider extends DecidablesElement {
5280
5370
  <slot></slot>
5281
5371
  </label>
5282
5372
  <div class="range">
5283
- <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)}>
5373
+ <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)}>
5374
+ ${this.scale ? x$1`
5375
+ <datalist id="ticks">
5376
+ <option value=${o(this.rangeMax)} label=${o(this.max)}></option>
5377
+ <option value=${o(this.rangeMin)} label=${o(this.min)}></option>
5378
+ </datalist>
5379
+ ` : x$1``}
5284
5380
  </div>
5285
- <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>
5381
+ <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>
5286
5382
  `;
5287
5383
  }
5288
5384
  }
@@ -5491,7 +5587,6 @@ class DecidablesSwitch extends DecidablesElement {
5491
5587
  padding: 0;
5492
5588
  margin: -1px;
5493
5589
  overflow: hidden;
5494
- clip: rect(0 0 0 0);
5495
5590
 
5496
5591
  white-space: nowrap;
5497
5592
 
@@ -5713,7 +5808,6 @@ class DecidablesToggleOption extends DecidablesElement {
5713
5808
  padding: 0;
5714
5809
  margin: -1px;
5715
5810
  overflow: hidden;
5716
- clip: rect(0 0 0 0);
5717
5811
 
5718
5812
  white-space: nowrap;
5719
5813
 
@@ -5896,17 +5990,17 @@ class AccumulableElement extends DecidablesElement {
5896
5990
  return [super.styles, i$3`
5897
5991
  :host {
5898
5992
  /* Declare base colors */
5899
- ${r$3(Object.keys(AccumulableElement.colors).map(color => {
5993
+ ${r$2(Object.keys(AccumulableElement.colors).map(color => {
5900
5994
  return `---color-${color}: var(--color-${color}, ${this.colors[color]});`;
5901
5995
  }).join('\n'))}
5902
5996
 
5903
5997
  /* Declare light colors */
5904
- ${r$3(Object.keys(AccumulableElement.colors).map(color => {
5998
+ ${r$2(Object.keys(AccumulableElement.colors).map(color => {
5905
5999
  return `---color-${color}-light: var(--color-${color}-light, ${this.lights[color]});`;
5906
6000
  }).join('\n'))}
5907
6001
 
5908
6002
  /* Declare dark colors */
5909
- ${r$3(Object.keys(AccumulableElement.colors).map(color => {
6003
+ ${r$2(Object.keys(AccumulableElement.colors).map(color => {
5910
6004
  return `---color-${color}-dark: var(--color-${color}-dark, ${this.darks[color]});`;
5911
6005
  }).join('\n'))}
5912
6006
  }
@@ -6083,15 +6177,15 @@ class AccumulableControl extends AccumulableElement {
6083
6177
  render() {
6084
6178
  return x$1`
6085
6179
  <div class="holder">
6086
- ${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``}
6180
+ ${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``}
6087
6181
  ${this.resample ? x$1`
6088
6182
  <div class="buttons">
6089
6183
  ${this.resample ? x$1`<decidables-button name="resample" @click=${this.doResample.bind(this)}>Resample</decidables-button>` : x$1``}
6090
6184
  </div>
6091
6185
  ` : x$1``}
6092
- ${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``}
6093
- ${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``}
6094
- ${this.color !== undefined ? x$1`
6186
+ ${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``}
6187
+ ${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``}
6188
+ ${this.color != null ? x$1`
6095
6189
  <decidables-toggle class="color" @change=${this.chooseColor.bind(this)}>
6096
6190
  <span slot="label">Emphasis</span>
6097
6191
  <decidables-toggle-option name="toggle" value="none" ?checked=${this.color === 'none'}>None</decidables-toggle-option>
@@ -6116,13 +6210,13 @@ customElements.define('accumulable-control', AccumulableControl);
6116
6210
  DDMMath Static Class - Not intended for instantiation!
6117
6211
 
6118
6212
  Model parameters:
6119
- a = boundary separation
6120
- z = starting point as a proportion of a
6121
- v = drift rate (per second)
6122
- t0 = non-decision time (in milliseconds)
6123
- s = within-trial variability in drift rate (s^2 = infinitesimal variance)
6213
+ a = boundary separation [0, Infinity)
6214
+ z = starting point as a proportion of a (0, 1)
6215
+ v = drift rate (per second) (-Infinity, Infinity)
6216
+ t0 = non-decision time (in milliseconds) (0, Infinity)
6217
+ s = within-trial variability in drift rate (s^2 = infinitesimal variance) [0, Infinity)
6124
6218
 
6125
- zPrime = starting point on a 0-to-a scale (typically used in published equations)
6219
+ zPrime = starting point on a 0-to-a scale (typically used in published equations) [0, Infinity)
6126
6220
 
6127
6221
  Behavioral variables:
6128
6222
  pE = proportion of error trials
@@ -6142,7 +6236,37 @@ customElements.define('accumulable-control', AccumulableControl);
6142
6236
  EZ-diffusion model (Wagenmakers et al., 2007)
6143
6237
  */
6144
6238
  class DDMMath {
6145
- static s = 1;
6239
+ static s = {
6240
+ DEFAULT: 1
6241
+ };
6242
+ static a = {
6243
+ DEFAULT: 1.2,
6244
+ MIN: 0.01,
6245
+ MAX: 2.0,
6246
+ STEP: 0.01,
6247
+ JUMP: 0.1
6248
+ };
6249
+ static z = {
6250
+ DEFAULT: 0.55,
6251
+ MIN: 0.01,
6252
+ MAX: 0.99,
6253
+ STEP: 0.01,
6254
+ JUMP: 0.1
6255
+ };
6256
+ static v = {
6257
+ DEFAULT: 1.5,
6258
+ MIN: 0.01,
6259
+ MAX: 5.0,
6260
+ STEP: 0.01,
6261
+ JUMP: 0.1
6262
+ };
6263
+ static t0 = {
6264
+ DEFAULT: 150,
6265
+ MIN: 0,
6266
+ MAX: 500,
6267
+ STEP: 1,
6268
+ JUMP: 10
6269
+ };
6146
6270
 
6147
6271
  // Calculate a bunch of statistics for an array of trials
6148
6272
  static trials2stats(trials) {
@@ -6210,7 +6334,7 @@ class DDMMath {
6210
6334
  }
6211
6335
 
6212
6336
  // Probability of an Error Response
6213
- static azv2pE(a, z, v, s = DDMMath.s) {
6337
+ static azv2pE(a, z, v, s = DDMMath.s.DEFAULT) {
6214
6338
  const zPrime = a * z;
6215
6339
  const A = Math.exp(-2 * v * a / s ** 2);
6216
6340
  const Z = Math.exp(-2 * v * zPrime / s ** 2);
@@ -6218,13 +6342,13 @@ class DDMMath {
6218
6342
  }
6219
6343
 
6220
6344
  // Probability of a Correct Response
6221
- static azv2pC(a, z, v, s = DDMMath.s) {
6345
+ static azv2pC(a, z, v, s = DDMMath.s.DEFAULT) {
6222
6346
  return DDMMath.azv2pE(a, 1 - z, -v, s);
6223
6347
  }
6224
6348
 
6225
6349
  // Mean Overall RT
6226
6350
  // Equation 5 (Grasman et al., 2009)
6227
- static azvt02m(a, z, v, t0, s = DDMMath.s) {
6351
+ static azvt02m(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6228
6352
  const zPrime = a * z;
6229
6353
  const A = Math.exp(-2 * v * a / s ** 2) - 1;
6230
6354
  const Z = Math.exp(-2 * v * zPrime / s ** 2) - 1;
@@ -6234,7 +6358,7 @@ class DDMMath {
6234
6358
 
6235
6359
  // SD Overall RT
6236
6360
  // Equation 6 (Grasman et al., 2009)
6237
- static azv2sd(a, z, v, s = DDMMath.s) {
6361
+ static azv2sd(a, z, v, s = DDMMath.s.DEFAULT) {
6238
6362
  const zPrime = a * z;
6239
6363
  const A = Math.exp(-2 * v * a / s ** 2) - 1;
6240
6364
  const Z = Math.exp(-2 * v * zPrime / s ** 2) - 1;
@@ -6244,7 +6368,7 @@ class DDMMath {
6244
6368
 
6245
6369
  // Mean Error RT
6246
6370
  // Equation 13 (Grasman et al., 2009)
6247
- static azvt02mE(a, z, v, t0, s = DDMMath.s) {
6371
+ static azvt02mE(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6248
6372
  function phi(x, y) {
6249
6373
  return Math.exp(2 * v * y / s ** 2) - Math.exp(2 * v * x / s ** 2);
6250
6374
  }
@@ -6255,7 +6379,7 @@ class DDMMath {
6255
6379
 
6256
6380
  // SD Error RT
6257
6381
  // Equation 14 (Grasman et al., 2009)
6258
- static azv2sdE(a, z, v, s = DDMMath.s) {
6382
+ static azv2sdE(a, z, v, s = DDMMath.s.DEFAULT) {
6259
6383
  function phi(x, y) {
6260
6384
  return Math.exp(2 * v * y / s ** 2) - Math.exp(2 * v * x / s ** 2);
6261
6385
  }
@@ -6265,17 +6389,17 @@ class DDMMath {
6265
6389
  }
6266
6390
 
6267
6391
  // Mean Correct RT
6268
- static azvt02mC(a, z, v, t0, s = DDMMath.s) {
6392
+ static azvt02mC(a, z, v, t0, s = DDMMath.s.DEFAULT) {
6269
6393
  return DDMMath.azvt02mE(a, 1 - z, -v, t0, s);
6270
6394
  }
6271
6395
 
6272
6396
  // SD Correct RT
6273
- static azv2sdC(a, z, v, s = DDMMath.s) {
6397
+ static azv2sdC(a, z, v, s = DDMMath.s.DEFAULT) {
6274
6398
  return DDMMath.azv2sdE(a, 1 - z, -v, s);
6275
6399
  }
6276
6400
 
6277
6401
  // Density of Error RT
6278
- static tazv2gE(t, a, z, v, s = DDMMath.s) {
6402
+ static tazv2gE(t, a, z, v, s = DDMMath.s.DEFAULT) {
6279
6403
  if (!t) return 0;
6280
6404
  const zPrime = a * z;
6281
6405
  const base = Math.PI * s ** 2 / a ** 2 * Math.exp(-zPrime * v / s ** 2);
@@ -6292,7 +6416,7 @@ class DDMMath {
6292
6416
  }
6293
6417
 
6294
6418
  // Density of Correct RT
6295
- static tazv2gC(t, a, z, v, s = DDMMath.s) {
6419
+ static tazv2gC(t, a, z, v, s = DDMMath.s.DEFAULT) {
6296
6420
  return DDMMath.tazv2gE(t, a, 1 - z, -v, s);
6297
6421
  }
6298
6422
 
@@ -6427,10 +6551,7 @@ class AccumulableResponse extends AccumulableElement {
6427
6551
  this.startTime = undefined; // Start time of current trial
6428
6552
  this.rt = undefined; // RT for current trial
6429
6553
 
6430
- this.correctCount = 0; // Count of Correct Trials
6431
- this.errorCount = 0; // Count of Error Trials
6432
- this.nrCount = 0; // Count of No Response trials
6433
-
6554
+ this.data = {};
6434
6555
  this.trials = []; // Record of trials in block
6435
6556
  this.alignState();
6436
6557
  }
@@ -6447,11 +6568,10 @@ class AccumulableResponse extends AccumulableElement {
6447
6568
  }
6448
6569
  }
6449
6570
  get totalPayoff() {
6450
- return this.correctCount * this.correctPayoff + this.errorCount * this.errorPayoff + this.nrCount * this.nrPayoff;
6571
+ return this.data.correctCount * this.correctPayoff + this.data.errorCount * this.errorPayoff + this.data.nrCount * this.nrPayoff;
6451
6572
  }
6452
6573
  alignState() {
6453
- const stats = DDMMath.trials2stats(this.trials);
6454
- Object.assign(this, stats);
6574
+ this.data = DDMMath.trials2stats(this.trials);
6455
6575
  }
6456
6576
  start(signal, trial) {
6457
6577
  this.startTime = Date.now();
@@ -6466,7 +6586,6 @@ class AccumulableResponse extends AccumulableElement {
6466
6586
  this.state = 'feedback';
6467
6587
  if (this.response === undefined) {
6468
6588
  this.outcome = 'nr';
6469
- this.nrCount += 1;
6470
6589
  this.rt = undefined;
6471
6590
  this.trials.push({
6472
6591
  trial: this.trialCount,
@@ -6491,10 +6610,8 @@ class AccumulableResponse extends AccumulableElement {
6491
6610
  this.response = response;
6492
6611
  if (this.signal === this.response) {
6493
6612
  this.outcome = 'correct';
6494
- this.correctCount += 1;
6495
6613
  } else if (this.signal !== this.response) {
6496
6614
  this.outcome = 'error';
6497
- this.errorCount += 1;
6498
6615
  }
6499
6616
  this.trials.push({
6500
6617
  trial: this.trialCount,
@@ -6513,16 +6630,7 @@ class AccumulableResponse extends AccumulableElement {
6513
6630
  response: this.response,
6514
6631
  outcome: this.outcome,
6515
6632
  payoff: this.trialPayoff,
6516
- correctCount: this.correctCount,
6517
- errorCount: this.errorCount,
6518
- nrCount: this.nrCount,
6519
- accuracy: this.accuracy,
6520
- meanRT: this.meanRT,
6521
- correctMeanRT: this.correctMeanRT,
6522
- errorMeanRT: this.errorMeanRT,
6523
- sdRT: this.sdRT,
6524
- correctSDRT: this.correctSDRT,
6525
- errorSDRT: this.errorSDRT,
6633
+ data: this.data,
6526
6634
  totalPayoff: this.totalPayoff
6527
6635
  },
6528
6636
  bubbles: true
@@ -6535,9 +6643,6 @@ class AccumulableResponse extends AccumulableElement {
6535
6643
  this.signal = undefined;
6536
6644
  this.response = undefined;
6537
6645
  this.outcome = undefined;
6538
- this.correctCount = 0;
6539
- this.errorCount = 0;
6540
- this.nrCount = 0;
6541
6646
  this.trials = [];
6542
6647
  this.alignState();
6543
6648
  }
@@ -7228,7 +7333,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
7228
7333
  };
7229
7334
  }
7230
7335
 
7231
- 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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');
7336
+ 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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');
7232
7337
  /* eslint-enable */
7233
7338
 
7234
7339
  /*
@@ -7244,10 +7349,10 @@ class DDMFit extends AccumulableElement {
7244
7349
  }
7245
7350
  constructor() {
7246
7351
  super();
7247
- this.a = 1.2;
7248
- this.z = 0.35;
7249
- this.v = 1.5;
7250
- this.t0 = 150;
7352
+ this.a = DDMMath.a.DEFAULT;
7353
+ this.z = DDMMath.z.DEFAULT;
7354
+ this.v = DDMMath.v.DEFAULT;
7355
+ this.t0 = DDMMath.t0.DEFAULT;
7251
7356
  this.observed = {};
7252
7357
  this.predicted = {};
7253
7358
  this.working = false;
@@ -7434,15 +7539,71 @@ class DDMParameters extends AccumulableElement {
7434
7539
  decidables-slider div {
7435
7540
  margin-bottom: 0.25rem;
7436
7541
  }
7542
+
7543
+ .a {
7544
+ --decidables-slider-background-color: var(---color-a-light);
7545
+ --decidables-slider-color: var(---color-a);
7546
+ }
7547
+
7548
+ .z {
7549
+ --decidables-slider-background-color: var(---color-z-light);
7550
+ --decidables-slider-color: var(---color-z);
7551
+ }
7552
+
7553
+ .v {
7554
+ --decidables-slider-background-color: var(---color-v-light);
7555
+ --decidables-slider-color: var(---color-v);
7556
+ }
7557
+
7558
+ .t0 {
7559
+ --decidables-slider-background-color: var(---color-t0-light);
7560
+ --decidables-slider-color: var(---color-t0);
7561
+ }
7437
7562
  `];
7438
7563
  }
7439
7564
  render() {
7440
7565
  return x$1`
7441
7566
  <div class="holder">
7442
- ${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``}
7443
- ${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``}
7444
- ${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``}
7445
- ${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``}
7567
+ ${this.a != null ? x$1`<decidables-slider class="a"
7568
+ ?disabled=${!this.interactive}
7569
+ scale
7570
+ min=${DDMMath.a.MIN}
7571
+ max=${DDMMath.a.MAX}
7572
+ step=${DDMMath.a.STEP}
7573
+ .value=${+this.a.toFixed(2)}
7574
+ @change=${this.setBoundarySeparation.bind(this)}
7575
+ @input=${this.setBoundarySeparation.bind(this)}
7576
+ ><div>Boundary Separation<br><span class="math-var">a</span></div></decidables-slider>` : x$1``}
7577
+ ${this.z != null ? x$1`<decidables-slider class="z"
7578
+ ?disabled=${!this.interactive}
7579
+ scale
7580
+ min=${DDMMath.z.MIN}
7581
+ max=${DDMMath.z.MAX}
7582
+ step=${DDMMath.z.STEP}
7583
+ .value=${+this.z.toFixed(2)}
7584
+ @change=${this.setStartingPoint.bind(this)}
7585
+ @input=${this.setStartingPoint.bind(this)}
7586
+ ><div>Starting Point<br><span class="math-var">z</span></div></decidables-slider>` : x$1``}
7587
+ ${this.v != null ? x$1`<decidables-slider class="v"
7588
+ ?disabled=${!this.interactive}
7589
+ scale
7590
+ min=${DDMMath.v.MIN}
7591
+ max=${DDMMath.v.MAX}
7592
+ step=${DDMMath.v.STEP}
7593
+ .value=${+this.v.toFixed(2)}
7594
+ @change=${this.setDriftRate.bind(this)}
7595
+ @input=${this.setDriftRate.bind(this)}
7596
+ ><div>Drift Rate<br><span class="math-var">v</span></div></decidables-slider>` : x$1``}
7597
+ ${this.t0 != null ? x$1`<decidables-slider class="t0"
7598
+ ?disabled=${!this.interactive}
7599
+ scale
7600
+ min=${DDMMath.t0.MIN}
7601
+ max=${DDMMath.t0.MAX}
7602
+ step=${DDMMath.t0.STEP}
7603
+ .value=${+this.t0.toFixed(0)}
7604
+ @change=${this.setNondecisionTime.bind(this)}
7605
+ @input=${this.setNondecisionTime.bind(this)}
7606
+ ><div>Nondecision Time<br><span class="math-var">t₀</span></div></decidables-slider>` : x$1``}
7446
7607
  </div>`;
7447
7608
  }
7448
7609
  }
@@ -7580,10 +7741,10 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
7580
7741
  this.resample();
7581
7742
  this.human = false;
7582
7743
  this.trials = 10;
7583
- this.a = 1.2;
7584
- this.z = 0.35;
7585
- this.v = 1.5;
7586
- this.t0 = 150;
7744
+ this.a = DDMMath.a.DEFAULT;
7745
+ this.z = DDMMath.z.DEFAULT;
7746
+ this.v = DDMMath.v.DEFAULT;
7747
+ this.t0 = DDMMath.t0.DEFAULT;
7587
7748
 
7588
7749
  // this.s = null;
7589
7750
  // this.sz = null;
@@ -7644,7 +7805,7 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
7644
7805
  while (path.at(-1).e > bounds.lower && path.at(-1).e < bounds.upper) {
7645
7806
  path.push({
7646
7807
  t: path.at(-1).t + this.precision * 1000,
7647
- e: path.at(-1).e + drift + DDMMath.s * random()
7808
+ e: path.at(-1).e + drift + DDMMath.s.DEFAULT * random()
7648
7809
  });
7649
7810
  }
7650
7811
  return path;
@@ -7934,10 +8095,25 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
7934
8095
 
7935
8096
  .t0z .point {
7936
8097
  fill: var(---color-element-emphasis);
8098
+ stroke-width: 0;
7937
8099
 
7938
8100
  r: 6px;
7939
8101
  }
7940
8102
 
8103
+ /* Make larger targets for touch users */
8104
+ .interactive .touch {
8105
+ stroke: #000000;
8106
+ stroke-dasharray: none;
8107
+ stroke-opacity: 0;
8108
+ }
8109
+
8110
+ @media (pointer: coarse) {
8111
+ .interactive .touch {
8112
+ stroke-linecap: round;
8113
+ stroke-width: 12;
8114
+ }
8115
+ }
8116
+
7941
8117
  .measure {
7942
8118
  stroke-width: 2;
7943
8119
  }
@@ -8112,9 +8288,9 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8112
8288
  let t0 = timeScale.invert(event.x);
8113
8289
  let z = (evidenceScale.invert(event.y) + this.a / 2) / this.a;
8114
8290
  // Clamp t0
8115
- t0 = shift === 'z' ? timeScale.invert(event.subject.x) : t0 < 0 ? 0 : t0 > 500 ? 500 : t0;
8291
+ t0 = shift === 'z' ? timeScale.invert(event.subject.x) : t0 < DDMMath.t0.MIN ? DDMMath.t0.MIN : t0 > DDMMath.t0.MAX ? DDMMath.t0.MAX : t0;
8116
8292
  // Clamp z
8117
- z = shift === 't0' ? (evidenceScale.invert(event.subject.y) + this.a / 2) / this.a : z < 0.01 ? 0.01 : z > 0.99 ? 0.99 : z;
8293
+ 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;
8118
8294
  this.t0 = t0;
8119
8295
  this.z = z;
8120
8296
  this.alignState();
@@ -8144,7 +8320,7 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8144
8320
  this.drag = true;
8145
8321
  let v = (evidenceScale.invert(event.y) - this.startingPoint) / (timeScale.invert(event.x) - this.t0) * 1000;
8146
8322
  // Clamp drift rate
8147
- v = v < 0.01 ? 0.01 : v > 5 ? 5 : v;
8323
+ v = v < DDMMath.v.MIN ? DDMMath.v.MIN : v > DDMMath.v.MAX ? DDMMath.v.MAX : v;
8148
8324
  this.v = v;
8149
8325
  this.alignState();
8150
8326
  this.dispatchEvent(new CustomEvent('ddm-model-v', {
@@ -8168,12 +8344,13 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8168
8344
  }).on('start', event => {
8169
8345
  const element = event.currentTarget;
8170
8346
  select(element).classed('dragging', true);
8171
- }).on('drag', (event, datum) => {
8347
+ }).on('drag', event => {
8172
8348
  this.drag = true;
8173
- let boundary = evidenceScale.invert(event.y);
8174
- // Clamp boundaries to visible evidence
8175
- 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;
8176
- this.a = Math.abs(boundary * 2);
8349
+ const boundary = evidenceScale.invert(event.y);
8350
+ let a = Math.abs(boundary * 2);
8351
+ // Clamp a
8352
+ a = a < DDMMath.a.MIN ? DDMMath.a.MIN : a > DDMMath.a.MAX ? DDMMath.a.MAX : a;
8353
+ this.a = a;
8177
8354
  this.alignState();
8178
8355
  this.dispatchEvent(new CustomEvent('ddm-model-a', {
8179
8356
  detail: {
@@ -8614,20 +8791,23 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8614
8791
  return `boundary ${index === 0 ? 'correct' : 'error'}`;
8615
8792
  });
8616
8793
  boundaryEnter.append('line').classed('line', true);
8794
+ boundaryEnter.append('line').classed('line touch', true);
8617
8795
  // MERGE
8618
8796
  const boundaryMerge = boundaryEnter.merge(boundaryUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? (event, datum) => {
8619
8797
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8620
- let a = this.a; /* eslint-disable-line prefer-destructuring */
8798
+ let {
8799
+ a
8800
+ } = this;
8621
8801
  switch (event.key) {
8622
8802
  case 'ArrowUp':
8623
- a += datum.bound === 'upper' ? event.shiftKey ? 0.01 : 0.1 : event.shiftKey ? -0.01 : -0.1;
8803
+ a += datum.bound === 'upper' ? event.shiftKey ? DDMMath.a.STEP : DDMMath.a.JUMP : event.shiftKey ? -0.01 : -0.1;
8624
8804
  break;
8625
8805
  case 'ArrowDown':
8626
- a += datum.bound === 'upper' ? event.shiftKey ? -0.01 : -0.1 : event.shiftKey ? 0.01 : 0.1;
8806
+ a += datum.bound === 'upper' ? event.shiftKey ? -0.01 : -0.1 : event.shiftKey ? DDMMath.a.STEP : DDMMath.a.JUMP;
8627
8807
  break;
8628
8808
  }
8629
- // Clamp boundaries to visible evidence
8630
- a = a < 0.01 ? 0.01 : a > this.scale.evidence.max * 2 ? this.scale.evidence.max * 2 : a;
8809
+ // Clamp a
8810
+ a = a < DDMMath.a.MIN ? DDMMath.a.MIN : a > DDMMath.a.MAX ? DDMMath.a.MAX : a;
8631
8811
  this.a = a;
8632
8812
  this.alignState();
8633
8813
  this.dispatchEvent(new CustomEvent('ddm-model-a', {
@@ -8651,6 +8831,11 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8651
8831
  }).attr('y2', datum => {
8652
8832
  return evidenceScale(datum.value);
8653
8833
  });
8834
+ 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 => {
8835
+ return evidenceScale(datum.value);
8836
+ }).attr('y2', datum => {
8837
+ return evidenceScale(datum.value);
8838
+ });
8654
8839
  // EXIT
8655
8840
  boundaryUpdate.exit().remove();
8656
8841
 
@@ -8664,21 +8849,25 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8664
8849
  // ENTER
8665
8850
  const driftEnter = driftUpdate.enter().append('g').classed('drift', true);
8666
8851
  driftEnter.append('line').classed('line', true);
8852
+ driftEnter.append('line').classed('line touch', true);
8667
8853
  driftEnter.append('path').classed('arrow', true);
8854
+ driftEnter.append('path').classed('arrow touch', true);
8668
8855
  // MERGE
8669
8856
  const driftMerge = driftEnter.merge(driftUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? event => {
8670
8857
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8671
- let v = this.v; /* eslint-disable-line prefer-destructuring */
8858
+ let {
8859
+ v
8860
+ } = this;
8672
8861
  switch (event.key) {
8673
8862
  case 'ArrowUp':
8674
- v += event.shiftKey ? 0.01 : 0.1;
8863
+ v += event.shiftKey ? DDMMath.v.STEP : DDMMath.v.JUMP;
8675
8864
  break;
8676
8865
  case 'ArrowDown':
8677
- v -= event.shiftKey ? 0.01 : 0.1;
8866
+ v -= event.shiftKey ? DDMMath.v.STEP : DDMMath.v.JUMP;
8678
8867
  break;
8679
8868
  }
8680
8869
  // Clamp z
8681
- v = v < 0.01 ? 0.01 : v > 5 ? 5 : v;
8870
+ v = v < DDMMath.v.MIN ? DDMMath.v.MIN : v > DDMMath.v.MAX ? DDMMath.v.MAX : v;
8682
8871
  this.v = v;
8683
8872
  this.alignState();
8684
8873
  this.dispatchEvent(new CustomEvent('ddm-model-v', {
@@ -8703,11 +8892,17 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8703
8892
  rotate(${-Math.atan(datum.v / 1000 * scaleRatio) * (180 / Math.PI)})`;
8704
8893
  });
8705
8894
  driftMerge.select('.line').attr('x2', timeScale(200));
8895
+ driftMerge.select('.line.touch').attr('x2', timeScale(200));
8706
8896
  driftMerge.select('.arrow').attr('d', `
8707
8897
  M ${timeScale(200) - this.rem * 0.5},${-this.rem * 0.5}
8708
8898
  l ${this.rem * 0.5},${this.rem * 0.5}
8709
8899
  l ${-this.rem * 0.5},${this.rem * 0.5}
8710
8900
  `);
8901
+ driftMerge.select('.arrow.touch').attr('d', `
8902
+ M ${timeScale(200) - this.rem * 0.5},${-this.rem * 0.5}
8903
+ l ${this.rem * 0.5},${this.rem * 0.5}
8904
+ l ${-this.rem * 0.5},${this.rem * 0.5}
8905
+ `);
8711
8906
  // EXIT
8712
8907
  driftUpdate.exit().remove();
8713
8908
 
@@ -8720,21 +8915,24 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8720
8915
  // ENTER
8721
8916
  const t0zEnter = t0zUpdate.enter().append('g').classed('t0z', true);
8722
8917
  t0zEnter.append('line').classed('line', true);
8723
- t0zEnter.append('circle').classed('point', true);
8918
+ t0zEnter.append('line').classed('line touch', true);
8919
+ t0zEnter.append('circle').classed('point touch', true);
8724
8920
  // MERGE
8725
8921
  const t0zMerge = t0zEnter.merge(t0zUpdate).attr('tabindex', this.interactive ? 0 : null).classed('interactive', this.interactive).on('keydown', this.interactive ? event => {
8726
8922
  if (['ArrowUp', 'ArrowDown'].includes(event.key)) {
8727
- let z = this.z; /* eslint-disable-line prefer-destructuring */
8923
+ let {
8924
+ z
8925
+ } = this;
8728
8926
  switch (event.key) {
8729
8927
  case 'ArrowUp':
8730
- z += event.shiftKey ? 0.01 : 0.1;
8928
+ z += event.shiftKey ? DDMMath.z.STEP : DDMMath.z.JUMP;
8731
8929
  break;
8732
8930
  case 'ArrowDown':
8733
- z -= event.shiftKey ? 0.01 : 0.1;
8931
+ z -= event.shiftKey ? DDMMath.z.STEP : DDMMath.z.JUMP;
8734
8932
  break;
8735
8933
  }
8736
8934
  // Clamp z
8737
- z = z < 0.01 ? 0.01 : z > 0.99 ? 0.99 : z;
8935
+ z = z < DDMMath.z.MIN ? DDMMath.z.MIN : z > DDMMath.z.MAX ? DDMMath.z.MAX : z;
8738
8936
  this.z = z;
8739
8937
  this.alignState();
8740
8938
  this.dispatchEvent(new CustomEvent('ddm-model-z', {
@@ -8749,14 +8947,14 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8749
8947
  let t0 = this.t0; /* eslint-disable-line prefer-destructuring */
8750
8948
  switch (event.key) {
8751
8949
  case 'ArrowRight':
8752
- t0 += event.shiftKey ? 1 : 10;
8950
+ t0 += event.shiftKey ? DDMMath.t0.STEP : DDMMath.t0.JUMP;
8753
8951
  break;
8754
8952
  case 'ArrowLeft':
8755
- t0 -= event.shiftKey ? 1 : 10;
8953
+ t0 -= event.shiftKey ? DDMMath.t0.STEP : DDMMath.t0.JUMP;
8756
8954
  break;
8757
8955
  }
8758
8956
  // Clamp t0
8759
- t0 = t0 < 0 ? 0 : t0 > 500 ? 500 : t0;
8957
+ t0 = t0 < DDMMath.t0.MIN ? DDMMath.t0.MIN : t0 > DDMMath.t0.MAX ? DDMMath.t0.MAX : t0;
8760
8958
  this.t0 = t0;
8761
8959
  this.alignState();
8762
8960
  this.dispatchEvent(new CustomEvent('ddm-model-t0', {
@@ -8782,6 +8980,13 @@ class DDMModel extends DecidablesMixinResizeable(AccumulableElement) {
8782
8980
  }).attr('y2', datum => {
8783
8981
  return evidenceScale(datum.startingPoint);
8784
8982
  });
8983
+ t0zMerge.select('.line.touch').transition().duration(this.drag ? 0 : transitionDuration).ease(cubicOut).attr('x1', timeScale(0)).attr('x2', datum => {
8984
+ return timeScale(datum.t0);
8985
+ }).attr('y1', datum => {
8986
+ return evidenceScale(datum.startingPoint);
8987
+ }).attr('y2', datum => {
8988
+ return evidenceScale(datum.startingPoint);
8989
+ });
8785
8990
  t0zMerge.select('.point').transition().duration(this.drag ? 0 : transitionDuration).ease(cubicOut).attr('cx', datum => {
8786
8991
  return timeScale(datum.t0);
8787
8992
  }).attr('cy', datum => {
@@ -9664,9 +9869,9 @@ class DDMEquationAZV2PC extends DDMEquation {
9664
9869
  }
9665
9870
  constructor() {
9666
9871
  super();
9667
- this.a = 1.5;
9668
- this.z = 0.5;
9669
- this.v = 0.1;
9872
+ this.a = DDMMath.a.DEFAULT;
9873
+ this.z = DDMMath.z.DEFAULT;
9874
+ this.v = DDMMath.v.DEFAULT;
9670
9875
  this.alignState();
9671
9876
  }
9672
9877
  alignState() {
@@ -9708,19 +9913,46 @@ class DDMEquationAZV2PC extends DDMEquation {
9708
9913
  let s;
9709
9914
  let accuracy;
9710
9915
  if (this.numeric) {
9711
- 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)}>
9916
+ a = x$1`<decidables-spinner class="a bottom"
9917
+ ?disabled=${!this.interactive}
9918
+ min=${DDMMath.a.MIN}
9919
+ max=${DDMMath.a.MAX}
9920
+ step=${DDMMath.a.STEP}
9921
+ .value=${this.a}
9922
+ @input=${this.aInput.bind(this)}
9923
+ >
9712
9924
  <var class="math-var">a</var>
9713
9925
  </decidables-spinner>`;
9714
- 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)}>
9926
+ z = x$1`<decidables-spinner class="z bottom"
9927
+ ?disabled=${!this.interactive}
9928
+ min=${DDMMath.z.MIN}
9929
+ max=${DDMMath.z.MAX}
9930
+ step=${DDMMath.z.STEP}
9931
+ .value=${this.z}
9932
+ @input=${this.zInput.bind(this)}
9933
+ >
9715
9934
  <var class="math-var">z</var>
9716
9935
  </decidables-spinner>`;
9717
- 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)}>
9936
+ v = x$1`<decidables-spinner class="v bottom"
9937
+ ?disabled=${!this.interactive}
9938
+ min=${DDMMath.v.MIN}
9939
+ max=${DDMMath.v.MAX}
9940
+ step=${DDMMath.v.STEP}
9941
+ .value=${this.v}
9942
+ @input=${this.vInput.bind(this)}
9943
+ >
9718
9944
  <var class="math-var">v</var>
9719
9945
  </decidables-spinner>`;
9720
- s = x$1`<decidables-spinner class="s bottom" disabled min="0.01" max="1" step="0.01" .value="${DDMMath.s}">
9946
+ s = x$1`<decidables-spinner class="s bottom"
9947
+ disabled
9948
+ .value=${DDMMath.s.DEFAULT}
9949
+ >
9721
9950
  <var class="math-var">s</var>
9722
9951
  </decidables-spinner>`;
9723
- accuracy = x$1`<decidables-spinner class="accuracy bottom" disabled min="0" max="1" step="0.01" .value="${+this.accuracy.toFixed(2)}">
9952
+ accuracy = x$1`<decidables-spinner class="accuracy bottom"
9953
+ disabled
9954
+ .value=${+this.accuracy.toFixed(2)}
9955
+ >
9724
9956
  <var>Accuracy</var>
9725
9957
  </decidables-spinner>`;
9726
9958
  } else {
@@ -9798,10 +10030,10 @@ class DDMEquationAZVT02M extends DDMEquation {
9798
10030
  }
9799
10031
  constructor() {
9800
10032
  super();
9801
- this.a = 1.5;
9802
- this.z = 0.5;
9803
- this.v = 0.1;
9804
- this.t0 = 200;
10033
+ this.a = DDMMath.a.DEFAULT;
10034
+ this.z = DDMMath.z.DEFAULT;
10035
+ this.v = DDMMath.v.DEFAULT;
10036
+ this.t0 = DDMMath.t0.DEFAULT;
9805
10037
  this.alignState();
9806
10038
  }
9807
10039
  alignState() {
@@ -9850,22 +10082,56 @@ class DDMEquationAZVT02M extends DDMEquation {
9850
10082
  let s;
9851
10083
  let meanRT;
9852
10084
  if (this.numeric) {
9853
- 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)}>
10085
+ a = x$1`<decidables-spinner class="a bottom"
10086
+ ?disabled=${!this.interactive}
10087
+ min=${DDMMath.a.MIN}
10088
+ max=${DDMMath.a.MAX}
10089
+ step=${DDMMath.a.STEP}
10090
+ .value=${this.a}
10091
+ @input=${this.aInput.bind(this)}
10092
+ >
9854
10093
  <var class="math-var">a</var>
9855
10094
  </decidables-spinner>`;
9856
- 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)}>
10095
+ z = x$1`<decidables-spinner class="z bottom"
10096
+ ?disabled=${!this.interactive}
10097
+ min=${DDMMath.z.MIN}
10098
+ max=${DDMMath.z.MAX}
10099
+ step=${DDMMath.z.STEP}
10100
+ .value=${this.z}
10101
+ @input=${this.zInput.bind(this)}
10102
+ >
9857
10103
  <var class="math-var">z</var>
9858
10104
  </decidables-spinner>`;
9859
- 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)}>
10105
+ v = x$1`<decidables-spinner class="v bottom"
10106
+ ?disabled=${!this.interactive}
10107
+ min=${DDMMath.v.MIN}
10108
+ max=${DDMMath.v.MAX}
10109
+ step=${DDMMath.v.STEP}
10110
+ .value=${this.v}
10111
+ @input=${this.vInput.bind(this)}
10112
+ >
9860
10113
  <var class="math-var">v</var>
9861
10114
  </decidables-spinner>`;
9862
- 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)}>
10115
+ t0 = x$1`<decidables-spinner class="t0 bottom"
10116
+ ?disabled=${!this.interactive}
10117
+ min=${DDMMath.t0.MIN}
10118
+ max=${DDMMath.t0.MAX}
10119
+ step=${DDMMath.t0.STEP}
10120
+ .value=${this.t0}
10121
+ @input=${this.t0Input.bind(this)}
10122
+ >
9863
10123
  <var class="math-var">t<sub>0</sub></var>
9864
10124
  </decidables-spinner>`;
9865
- s = x$1`<decidables-spinner class="s bottom" disabled min="0.01" max="1" step="0.01" .value="${DDMMath.s}">
10125
+ s = x$1`<decidables-spinner class="s bottom"
10126
+ disabled
10127
+ .value=${DDMMath.s.DEFAULT}
10128
+ >
9866
10129
  <var class="math-var">s</var>
9867
10130
  </decidables-spinner>`;
9868
- meanRT = x$1`<decidables-spinner class="mean-rt bottom" disabled min="0" max="1" step="0.01" .value="${+this.meanRT.toFixed(0)}">
10131
+ meanRT = x$1`<decidables-spinner class="mean-rt bottom"
10132
+ disabled
10133
+ .value=${+this.meanRT.toFixed(0)}
10134
+ >
9869
10135
  <var>Mean RT</var>
9870
10136
  </decidables-spinner>`;
9871
10137
  } else {
@@ -9988,17 +10254,74 @@ class DDMExample extends AccumulableElement {
9988
10254
  }
9989
10255
  customElements.define('ddm-example', DDMExample);
9990
10256
 
9991
- // import DDMMath from '@decidables/accumulable-math';
9992
-
9993
-
9994
10257
  /*
9995
10258
  DDMExampleHuman element
9996
10259
  <ddm-example-human>
9997
10260
  */
9998
10261
  class DDMExampleHuman extends DDMExample {
10262
+ static get properties() {
10263
+ return {
10264
+ trials: {
10265
+ attribute: 'trials',
10266
+ type: Number,
10267
+ reflect: true
10268
+ },
10269
+ duration: {
10270
+ attribute: 'duration',
10271
+ type: Number,
10272
+ reflect: true
10273
+ },
10274
+ coherence: {
10275
+ attribute: 'coherence',
10276
+ type: Number,
10277
+ reflect: true
10278
+ },
10279
+ color: {
10280
+ attribute: 'color',
10281
+ type: String,
10282
+ reflect: true
10283
+ },
10284
+ a: {
10285
+ attribute: false,
10286
+ type: Number,
10287
+ reflect: false
10288
+ },
10289
+ z: {
10290
+ attribute: false,
10291
+ type: Number,
10292
+ reflect: false
10293
+ },
10294
+ v: {
10295
+ attribute: false,
10296
+ type: Number,
10297
+ reflect: false
10298
+ },
10299
+ t0: {
10300
+ attribute: false,
10301
+ type: Number,
10302
+ reflect: false
10303
+ }
10304
+ };
10305
+ }
9999
10306
  constructor() {
10000
10307
  super();
10001
- this.trialCount = 0;
10308
+ this.trials = 10;
10309
+ this.duration = 2000;
10310
+ this.coherence = 0.5;
10311
+ this.colors = ['none', 'measure', 'outcome', 'all'];
10312
+ this.color = 'outcome';
10313
+ this.a = DDMMath.a.DEFAULT;
10314
+ this.z = DDMMath.z.DEFAULT;
10315
+ this.v = DDMMath.v.DEFAULT;
10316
+ this.t0 = DDMMath.t0.DEFAULT;
10317
+ this.accumulableControl = null;
10318
+ this.rdkTask = null;
10319
+ this.accumulableResponse = null;
10320
+ this.accumulableTable = null;
10321
+ this.ddmParameters = null;
10322
+ this.ddmModel = null;
10323
+ this.ddmFit = null;
10324
+ this.data = undefined;
10002
10325
  }
10003
10326
  connectedCallback() {
10004
10327
  super.connectedCallback();
@@ -10012,56 +10335,31 @@ class DDMExampleHuman extends DDMExample {
10012
10335
 
10013
10336
  // Initialize
10014
10337
  this.ddmModel.clear();
10015
- if (this.accumulableControl && this.accumulableControl.hasAttribute('trials')) {
10338
+ if (this.accumulableControl) {
10016
10339
  this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10017
- if (this.rdkTask) {
10018
- this.rdkTask.trials = event.detail.trials;
10019
- }
10020
- if (this.accumulableResponse) {
10021
- this.accumulableResponse.trialTotal = event.detail.trials;
10022
- }
10340
+ this.trials = event.detail.trials;
10023
10341
  });
10024
- }
10025
- if (this.accumulableControl && this.accumulableControl.hasAttribute('duration')) {
10026
10342
  this.accumulableControl.addEventListener('accumulable-control-duration', event => {
10027
- if (this.rdkTask) {
10028
- this.rdkTask.duration = event.detail.duration;
10029
- this.rdkTask.wait = event.detail.duration;
10030
- this.rdkTask.iti = event.detail.duration;
10031
- }
10343
+ this.duration = event.detail.duration;
10032
10344
  });
10033
- }
10034
- if (this.accumulableControl && this.accumulableControl.hasAttribute('coherence')) {
10035
10345
  this.accumulableControl.addEventListener('accumulable-control-coherence', event => {
10036
- if (this.rdkTask) {
10037
- this.rdkTask.coherence = event.detail.coherence;
10038
- }
10346
+ this.coherence = event.detail.coherence;
10039
10347
  });
10040
- }
10041
- if (this.accumulableControl && this.accumulableControl.hasAttribute('color')) {
10042
10348
  this.accumulableControl.addEventListener('accumulable-control-color', event => {
10043
- if (this.accumulableTable) {
10044
- this.accumulableTable.color = event.detail.color;
10045
- }
10349
+ this.color = event.detail.color;
10046
10350
  });
10047
- }
10048
- if (this.accumulableControl && this.accumulableControl.hasAttribute('run')) {
10049
10351
  this.accumulableControl.addEventListener('accumulable-control-run', (/* event */
10050
10352
  ) => {
10051
10353
  if (this.rdkTask) {
10052
10354
  this.rdkTask.running = true;
10053
10355
  }
10054
10356
  });
10055
- }
10056
- if (this.accumulableControl && this.accumulableControl.hasAttribute('pause')) {
10057
10357
  this.accumulableControl.addEventListener('accumulable-control-pause', (/* event */
10058
10358
  ) => {
10059
10359
  if (this.rdkTask) {
10060
10360
  this.rdkTask.running = false;
10061
10361
  }
10062
10362
  });
10063
- }
10064
- if (this.accumulableControl && this.accumulableControl.hasAttribute('reset')) {
10065
10363
  this.accumulableControl.addEventListener('accumulable-control-reset', (/* event */
10066
10364
  ) => {
10067
10365
  if (this.rdkTask) {
@@ -10094,11 +10392,6 @@ class DDMExampleHuman extends DDMExample {
10094
10392
  }
10095
10393
  });
10096
10394
  }
10097
- if (this.rdkTask) {
10098
- if (this.accumulableResponse) {
10099
- this.accumulableResponse.trialTotal = this.rdkTask.trials;
10100
- }
10101
- }
10102
10395
  if (this.rdkTask) {
10103
10396
  this.rdkTask.addEventListener('rdk-trial-start', event => {
10104
10397
  if (this.accumulableResponse) {
@@ -10124,18 +10417,7 @@ class DDMExampleHuman extends DDMExample {
10124
10417
  }
10125
10418
  if (this.accumulableResponse) {
10126
10419
  this.accumulableResponse.addEventListener('accumulable-response', event => {
10127
- if (this.accumulableTable) {
10128
- this.accumulableTable.correctCount = event.detail.correctCount;
10129
- this.accumulableTable.errorCount = event.detail.errorCount;
10130
- this.accumulableTable.nrCount = event.detail.nrCount;
10131
- this.accumulableTable.accuracy = event.detail.accuracy;
10132
- this.accumulableTable.correctMeanRT = event.detail.correctMeanRT;
10133
- this.accumulableTable.errorMeanRT = event.detail.errorMeanRT;
10134
- this.accumulableTable.meanRT = event.detail.meanRT;
10135
- this.accumulableTable.correctSDRT = event.detail.correctSDRT;
10136
- this.accumulableTable.errorSDRT = event.detail.errorSDRT;
10137
- this.accumulableTable.sdRT = event.detail.sdRT;
10138
- }
10420
+ this.data = event.detail.data;
10139
10421
  if (this.ddmModel) {
10140
10422
  this.ddmModel.trial({
10141
10423
  index: event.detail.trial,
@@ -10145,34 +10427,73 @@ class DDMExampleHuman extends DDMExample {
10145
10427
  }
10146
10428
  if (this.ddmFit) {
10147
10429
  this.ddmFit.set({
10148
- accuracy: event.detail.accuracy,
10149
- correctMeanRT: event.detail.correctMeanRT,
10150
- errorMeanRT: event.detail.errorMeanRT,
10151
- meanRT: event.detail.meanRT,
10152
- correctSDRT: event.detail.correctSDRT,
10153
- errorSDRT: event.detail.errorSDRT,
10154
- sdRT: event.detail.sdRT
10430
+ accuracy: event.detail.data.accuracy,
10431
+ correctMeanRT: event.detail.data.correctMeanRT,
10432
+ errorMeanRT: event.detail.data.errorMeanRT,
10433
+ meanRT: event.detail.data.meanRT,
10434
+ correctSDRT: event.detail.data.correctSDRT,
10435
+ errorSDRT: event.detail.data.errorSDRT,
10436
+ sdRT: event.detail.data.sdRT
10155
10437
  });
10156
10438
  }
10439
+ this.requestUpdate();
10157
10440
  });
10158
10441
  }
10159
10442
  if (this.ddmFit) {
10160
10443
  this.ddmFit.addEventListener('ddm-fit-update', event => {
10161
- if (this.ddmParameters) {
10162
- this.ddmParameters.a = event.detail.a;
10163
- this.ddmParameters.z = 0.5; // event.detail.z;
10164
- this.ddmParameters.v = event.detail.v;
10165
- this.ddmParameters.t0 = event.detail.t0;
10166
- }
10167
- if (this.ddmModel) {
10168
- this.ddmModel.a = event.detail.a;
10169
- this.ddmModel.z = 0.5; // event.detail.z;
10170
- this.ddmModel.v = event.detail.v;
10171
- this.ddmModel.t0 = event.detail.t0;
10172
- }
10444
+ this.a = event.detail.a;
10445
+ this.z = 0.5; // event.detail.z;
10446
+ this.v = event.detail.v;
10447
+ this.t0 = event.detail.t0;
10173
10448
  });
10174
10449
  }
10175
10450
  }
10451
+ update(changedProperties) {
10452
+ super.update(changedProperties);
10453
+ if (this.accumulableControl) {
10454
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10455
+ this.accumulableControl.duration = this.accumulableControl.duration != null ? this.duration : undefined;
10456
+ this.accumulableControl.coherence = this.accumulableControl.coherence != null ? this.coherence : undefined;
10457
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10458
+ }
10459
+ if (this.rdkTask) {
10460
+ this.rdkTask.trials = this.trials;
10461
+ this.rdkTask.duration = this.duration;
10462
+ this.rdkTask.wait = this.duration;
10463
+ this.rdkTask.iti = this.duration;
10464
+ this.rdkTask.coherence = this.coherence;
10465
+ }
10466
+ if (this.ddmParameters) {
10467
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10468
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10469
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10470
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10471
+ }
10472
+ if (this.ddmModel) {
10473
+ this.ddmModel.a = +this.a;
10474
+ this.ddmModel.z = +this.z;
10475
+ this.ddmModel.v = +this.v;
10476
+ this.ddmModel.t0 = +this.t0;
10477
+ }
10478
+ if (this.accumulableResponse) {
10479
+ this.accumulableResponse.trialTotal = this.trials;
10480
+ }
10481
+ if (this.accumulableTable) {
10482
+ this.accumulableTable.color = this.color;
10483
+ }
10484
+ if (this.accumulableTable && this.data) {
10485
+ this.accumulableTable.correctCount = this.data.correctCount;
10486
+ this.accumulableTable.errorCount = this.data.errorCount;
10487
+ this.accumulableTable.nrCount = this.data.nrCount;
10488
+ this.accumulableTable.accuracy = this.data.accuracy;
10489
+ this.accumulableTable.correctMeanRT = this.data.correctMeanRT;
10490
+ this.accumulableTable.errorMeanRT = this.data.errorMeanRT;
10491
+ this.accumulableTable.meanRT = this.data.meanRT;
10492
+ this.accumulableTable.correctSDRT = this.data.correctSDRT;
10493
+ this.accumulableTable.errorSDRT = this.data.errorSDRT;
10494
+ this.accumulableTable.sdRT = this.data.sdRT;
10495
+ }
10496
+ }
10176
10497
  }
10177
10498
  customElements.define('ddm-example-human', DDMExampleHuman);
10178
10499
 
@@ -10188,6 +10509,11 @@ class DDMExampleInteractive extends DDMExample {
10188
10509
  type: Number,
10189
10510
  reflect: true
10190
10511
  },
10512
+ color: {
10513
+ attribute: 'color',
10514
+ type: String,
10515
+ reflect: true
10516
+ },
10191
10517
  a: {
10192
10518
  attribute: 'boundary-separation',
10193
10519
  type: Number,
@@ -10213,10 +10539,12 @@ class DDMExampleInteractive extends DDMExample {
10213
10539
  constructor() {
10214
10540
  super();
10215
10541
  this.trials = 10;
10216
- this.a = 1.2;
10217
- this.z = 0.35;
10218
- this.v = 1.5;
10219
- this.t0 = 150;
10542
+ this.colors = ['none', 'measure', 'outcome', 'all'];
10543
+ this.color = 'outcome';
10544
+ this.a = DDMMath.a.DEFAULT;
10545
+ this.z = DDMMath.z.DEFAULT;
10546
+ this.v = DDMMath.v.DEFAULT;
10547
+ this.t0 = DDMMath.t0.DEFAULT;
10220
10548
  this.accumulableControl = null;
10221
10549
  this.accumulableTable = null;
10222
10550
  this.ddmParameters = null;
@@ -10239,6 +10567,9 @@ class DDMExampleInteractive extends DDMExample {
10239
10567
  this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10240
10568
  this.trials = event.detail.trials;
10241
10569
  });
10570
+ this.accumulableControl.addEventListener('accumulable-control-color', event => {
10571
+ this.color = event.detail.color;
10572
+ });
10242
10573
  }
10243
10574
  if (this.ddmParameters) {
10244
10575
  this.ddmParameters.addEventListener('ddm-parameters-a', event => {
@@ -10278,7 +10609,11 @@ class DDMExampleInteractive extends DDMExample {
10278
10609
  update(changedProperties) {
10279
10610
  super.update(changedProperties);
10280
10611
  if (this.accumulableControl) {
10281
- this.accumulableControl.trials = this.trials;
10612
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10613
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10614
+ }
10615
+ if (this.accumulableTable) {
10616
+ this.accumulableTable.color = this.color;
10282
10617
  }
10283
10618
  if (this.accumulableTable && this.data) {
10284
10619
  this.accumulableTable.correctCount = this.data.correctCount;
@@ -10293,10 +10628,10 @@ class DDMExampleInteractive extends DDMExample {
10293
10628
  this.accumulableTable.sdRT = this.data.sdRT;
10294
10629
  }
10295
10630
  if (this.ddmParameters) {
10296
- this.ddmParameters.a = this.a;
10297
- this.ddmParameters.z = this.z;
10298
- this.ddmParameters.v = this.v;
10299
- this.ddmParameters.t0 = this.t0;
10631
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10632
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10633
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10634
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10300
10635
  }
10301
10636
  if (this.ddmModel) {
10302
10637
  this.ddmModel.trials = this.trials;
@@ -10309,9 +10644,6 @@ class DDMExampleInteractive extends DDMExample {
10309
10644
  }
10310
10645
  customElements.define('ddm-example-interactive', DDMExampleInteractive);
10311
10646
 
10312
- // import DDMMath from '@decidables/accumulable-math';
10313
-
10314
-
10315
10647
  /*
10316
10648
  DDMExampleModel element
10317
10649
  <ddm-example-model>
@@ -10368,10 +10700,10 @@ class DDMExampleModel extends DDMExample {
10368
10700
  this.coherence = 0.5;
10369
10701
  this.colors = ['none', 'measure', 'outcome', 'all'];
10370
10702
  this.color = 'outcome';
10371
- this.a = 1.2;
10372
- this.z = 0.35;
10373
- this.v = 1.5;
10374
- this.t0 = 150;
10703
+ this.a = DDMMath.a.DEFAULT;
10704
+ this.z = DDMMath.z.DEFAULT;
10705
+ this.v = DDMMath.v.DEFAULT;
10706
+ this.t0 = DDMMath.t0.DEFAULT;
10375
10707
  this.accumulableControl = null;
10376
10708
  this.rdkTask = null;
10377
10709
  this.ddmParameters = null;
@@ -10393,60 +10725,48 @@ class DDMExampleModel extends DDMExample {
10393
10725
  this.accumulableResponse = this.querySelector('accumulable-response');
10394
10726
  this.accumulableTable = this.querySelector('accumulable-table');
10395
10727
  if (this.accumulableControl) {
10396
- if (this.accumulableControl.hasAttribute('trials')) {
10397
- this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10398
- this.trials = event.detail.trials;
10399
- });
10400
- }
10401
- if (this.accumulableControl.hasAttribute('duration')) {
10402
- this.accumulableControl.addEventListener('accumulable-control-duration', event => {
10403
- this.duration = event.detail.duration;
10404
- });
10405
- }
10406
- if (this.accumulableControl.hasAttribute('color')) {
10407
- this.accumulableControl.addEventListener('accumulable-control-color', event => {
10408
- this.color = event.detail.color;
10409
- });
10410
- }
10411
- if (this.accumulableControl.hasAttribute('run')) {
10412
- this.accumulableControl.addEventListener('accumulable-control-run', (/* event */
10413
- ) => {
10414
- if (this.rdkTask) {
10415
- this.rdkTask.running = true;
10416
- }
10417
- if (this.ddmModel) {
10418
- this.ddmModel.resumeTrial();
10419
- }
10420
- });
10421
- }
10422
- if (this.accumulableControl.hasAttribute('pause')) {
10423
- this.accumulableControl.addEventListener('accumulable-control-pause', (/* event */
10424
- ) => {
10425
- if (this.rdkTask) {
10426
- this.rdkTask.running = false;
10427
- }
10428
- if (this.ddmModel) {
10429
- this.ddmModel.pauseTrial();
10430
- }
10431
- });
10432
- }
10433
- if (this.accumulableControl.hasAttribute('reset')) {
10434
- this.accumulableControl.addEventListener('accumulable-control-reset', (/* event */
10435
- ) => {
10436
- this.trialCount = 0;
10437
- this.signal = undefined;
10438
- if (this.rdkTask) {
10439
- this.rdkTask.reset();
10440
- }
10441
- if (this.ddmModel) {
10442
- this.ddmModel.trials = this.trialCount;
10443
- }
10444
- if (this.accumulableResponse) {
10445
- this.accumulableResponse.reset();
10446
- }
10447
- if (this.accumulableTable) ;
10448
- });
10449
- }
10728
+ this.accumulableControl.addEventListener('accumulable-control-trials', event => {
10729
+ this.trials = event.detail.trials;
10730
+ });
10731
+ this.accumulableControl.addEventListener('accumulable-control-duration', event => {
10732
+ this.duration = event.detail.duration;
10733
+ });
10734
+ this.accumulableControl.addEventListener('accumulable-control-color', event => {
10735
+ this.color = event.detail.color;
10736
+ });
10737
+ this.accumulableControl.addEventListener('accumulable-control-run', (/* event */
10738
+ ) => {
10739
+ if (this.rdkTask) {
10740
+ this.rdkTask.running = true;
10741
+ }
10742
+ if (this.ddmModel) {
10743
+ this.ddmModel.resumeTrial();
10744
+ }
10745
+ });
10746
+ this.accumulableControl.addEventListener('accumulable-control-pause', (/* event */
10747
+ ) => {
10748
+ if (this.rdkTask) {
10749
+ this.rdkTask.running = false;
10750
+ }
10751
+ if (this.ddmModel) {
10752
+ this.ddmModel.pauseTrial();
10753
+ }
10754
+ });
10755
+ this.accumulableControl.addEventListener('accumulable-control-reset', (/* event */
10756
+ ) => {
10757
+ this.trialCount = 0;
10758
+ this.signal = undefined;
10759
+ if (this.rdkTask) {
10760
+ this.rdkTask.reset();
10761
+ }
10762
+ if (this.ddmModel) {
10763
+ this.ddmModel.trials = this.trialCount;
10764
+ }
10765
+ if (this.accumulableResponse) {
10766
+ this.accumulableResponse.reset();
10767
+ }
10768
+ if (this.accumulableTable) ;
10769
+ });
10450
10770
  }
10451
10771
  if (this.rdkTask) {
10452
10772
  this.rdkTask.addEventListener('rdk-trial-start', event => {
@@ -10505,17 +10825,15 @@ class DDMExampleModel extends DDMExample {
10505
10825
  this.model = event.detail.model;
10506
10826
  this.requestUpdate();
10507
10827
  });
10508
- if (this.ddmModel) {
10509
- this.ddmModel.addEventListener('accumulable-response', event => {
10510
- if (this.accumulableResponse) {
10511
- const response = event.detail.outcome === 'correct' ? this.signal : this.signal === 'left' ? 'right' : 'left';
10512
- this.accumulableResponse.responded(response);
10513
- }
10514
- this.data = event.detail.data;
10515
- this.model = event.detail.model;
10516
- this.requestUpdate();
10517
- });
10518
- }
10828
+ this.ddmModel.addEventListener('accumulable-response', event => {
10829
+ if (this.accumulableResponse) {
10830
+ const response = event.detail.outcome === 'correct' ? this.signal : this.signal === 'left' ? 'right' : 'left';
10831
+ this.accumulableResponse.responded(response);
10832
+ }
10833
+ this.data = event.detail.data;
10834
+ this.model = event.detail.model;
10835
+ this.requestUpdate();
10836
+ });
10519
10837
  }
10520
10838
  this.requestUpdate();
10521
10839
  }
@@ -10525,10 +10843,10 @@ class DDMExampleModel extends DDMExample {
10525
10843
  this.trialCount = this.trials;
10526
10844
  }
10527
10845
  if (this.accumulableControl) {
10528
- this.accumulableControl.trials = this.trials;
10529
- this.accumulableControl.duration = this.duration;
10530
- this.accumulableControl.coherence = this.coherence;
10531
- this.accumulableControl.color = this.color;
10846
+ this.accumulableControl.trials = this.accumulableControl.trials != null ? this.trials : undefined;
10847
+ this.accumulableControl.duration = this.accumulableControl.duration != null ? this.duration : undefined;
10848
+ this.accumulableControl.coherence = this.accumulableControl.coherence != null ? this.coherence : undefined;
10849
+ this.accumulableControl.color = this.accumulableControl.color != null ? this.color : undefined;
10532
10850
  }
10533
10851
  if (this.rdkTask) {
10534
10852
  this.rdkTask.trials = this.trials;
@@ -10536,10 +10854,10 @@ class DDMExampleModel extends DDMExample {
10536
10854
  this.rdkTask.coherence = this.coherence;
10537
10855
  }
10538
10856
  if (this.ddmParameters) {
10539
- this.ddmParameters.a = this.a;
10540
- this.ddmParameters.z = this.z;
10541
- this.ddmParameters.v = this.v;
10542
- this.ddmParameters.t0 = this.t0;
10857
+ this.ddmParameters.a = this.ddmParameters.a != null ? this.a : undefined;
10858
+ this.ddmParameters.z = this.ddmParameters.z != null ? this.z : undefined;
10859
+ this.ddmParameters.v = this.ddmParameters.a != null ? this.v : undefined;
10860
+ this.ddmParameters.t0 = this.ddmParameters.t0 != null ? this.t0 : undefined;
10543
10861
  }
10544
10862
  if (this.ddmModel) {
10545
10863
  this.ddmModel.trials = this.trialCount;