@media-quest/engine 0.0.31 → 0.0.33

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.
@@ -233,7 +233,9 @@ interface DStyle {
233
233
  fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
234
234
  textAlign: "right" | "left" | "center";
235
235
  letterSpacing: DCss.Px;
236
+ lineHeight: number;
236
237
  position: "absolute" | "relative";
238
+ flex: string;
237
239
  display: "flex" | "block";
238
240
  flexDirection: "row" | "colum";
239
241
  flexWrap: "nowrap" | "wrap";
@@ -368,7 +370,6 @@ declare abstract class DElement<T extends HTMLElement> {
368
370
  updateState(state: TaskStateDiff): void;
369
371
  setState(state: TaskState): void;
370
372
  private handleStateChanges;
371
- private normalize;
372
373
  abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;
373
374
  protected updateStyles(style: Partial<DStyle>): void;
374
375
  }
@@ -592,16 +592,45 @@ var DCss;
592
592
  // src/Delement/DStyle.ts
593
593
  var DStyle;
594
594
  ((DStyle2) => {
595
- const isNumber = DUtil.isNumber;
596
595
  const isLengthUnit = DCss.isLengthUnit;
597
596
  DStyle2.normalize = (el) => {
598
- el.style.padding = "0";
599
- el.style.margin = "0";
600
- el.style.position = "absolute";
601
- el.style.boxSizing = "border-box";
597
+ const s = el.style;
598
+ s.position = "absolute";
599
+ s.boxSizing = "border-box";
600
+ s.padding = "0px";
601
+ s.margin = "0px";
602
+ s.width = "100%";
603
+ s.bottom = "";
604
+ s.top = "";
605
+ s.left = "";
606
+ s.right = "";
607
+ s.width = "";
608
+ s.height = "";
609
+ s.flex = "none";
610
+ s.boxShadow = "";
611
+ s.fontSize = "12px";
612
+ s.lineHeight = "1";
613
+ s.textAlign = "center";
614
+ s.textDecoration = "none";
615
+ s.boxShadow = "";
616
+ s.boxSizing = "border-box";
617
+ s.fontWeight = "500";
618
+ s.borderStyle = "";
619
+ s.borderRadius = "";
620
+ s.borderWidth = "";
621
+ s.borderWidth = "10px";
622
+ s.borderColor = "black";
623
+ s.backgroundColor = "";
624
+ s.border = "";
625
+ s.borderStyle = "none";
626
+ s.outline = "";
627
+ s.wordSpacing = "";
628
+ s.userSelect = "none";
629
+ s.textShadow = "";
602
630
  return el;
603
631
  };
604
632
  DStyle2.applyStyles = (el, style, scale) => {
633
+ const { isNumber, isString } = DUtil;
605
634
  const {
606
635
  x,
607
636
  y,
@@ -619,9 +648,11 @@ var DStyle;
619
648
  cursor,
620
649
  fontSize,
621
650
  fontWeight,
651
+ lineHeight,
622
652
  textColor,
623
653
  textAlign,
624
654
  translate,
655
+ flex,
625
656
  margin,
626
657
  padding,
627
658
  letterSpacing,
@@ -650,15 +681,21 @@ var DStyle;
650
681
  minHeight,
651
682
  maxHeight
652
683
  } = style;
653
- if (typeof zIndex === "number") {
684
+ if (isNumber(zIndex)) {
654
685
  el.style.zIndex = "" + zIndex;
655
686
  }
687
+ if (isString(flex)) {
688
+ el.style.flex = flex;
689
+ }
656
690
  if (DCss.isLengthUnit(minWidth)) {
657
691
  el.style.minWidth = DCss.toString(minWidth, scale);
658
692
  }
659
693
  if (DCss.isLengthUnit(maxWidth)) {
660
694
  el.style.maxWidth = DCss.toString(maxWidth, scale);
661
695
  }
696
+ if (typeof lineHeight === "number") {
697
+ el.style.lineHeight = "" + lineHeight;
698
+ }
662
699
  if (DCss.isLengthUnit(minHeight)) {
663
700
  el.style.minHeight = DCss.toString(minHeight, scale);
664
701
  }
@@ -851,7 +888,6 @@ var DElement = class {
851
888
  this.el.innerText = dto.innerText;
852
889
  }
853
890
  this.setStyle = this.setStyle.bind(this);
854
- this.normalize = this.normalize.bind(this);
855
891
  this.appendYourself = this.appendYourself.bind(this);
856
892
  this.updateStyles = this.updateStyles.bind(this);
857
893
  const { onMouseEnter, onMouseLeave } = dto;
@@ -865,7 +901,7 @@ var DElement = class {
865
901
  this.setStyle(onMouseLeave);
866
902
  };
867
903
  }
868
- this.normalize();
904
+ DStyle.normalize(this.el);
869
905
  if (dto) {
870
906
  this.updateStyles(dto?.style);
871
907
  }
@@ -955,12 +991,6 @@ var DElement = class {
955
991
  this.setStyle(whenVideoEndedAndMuted);
956
992
  }
957
993
  }
958
- normalize() {
959
- this.el.style.padding = "0";
960
- this.el.style.margin = "0";
961
- this.el.style.position = "absolute";
962
- this.el.style.boxSizing = "border-box";
963
- }
964
994
  updateStyles(style) {
965
995
  this.currStyle = Object.assign(this.currStyle, style);
966
996
  DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/public-api.ts","../src/engine/history-que.ts","../src/utils/DUtil.ts","../src/rules/condition.ts","../src/rules/rule.ts","../src/rules/rule-engine.ts","../src/engine/next-que.ts","../src/engine/dplayer.ts","../src/engine/scale.ts","../src/Delement/css.ts","../src/Delement/DStyle.ts","../src/common/DTimestamp.ts","../src/page/task-state.ts","../src/Delement/DElement.ts","../src/Delement/Ddiv.ts","../src/Delement/DImg.ts","../src/Delement/DText.ts","../src/Delement/DButton.ts","../src/Delement/element-factory.ts","../src/Delement/button-click-action.ts","../src/events/mq-events.ts","../src/page/Page.ts","../src/page/task.ts","../src/page/task-manager.ts","../src/engine/SchemaEngine.ts"],"sourcesContent":["export * from \"./engine/SchemaResult\";\nexport * from \"./engine/SchemaEngine\";\nexport * from \"./engine/SchemaDto\";\nexport * from \"./engine/page-que-ruleengine-action\";\nexport * from \"./rules/rule\";\nexport * from \"./rules/fact\";\nexport * from \"./rules/rule-engine\";\nexport * from \"./rules/condition\";\nexport * from \"./utils/DUtil\";\n// export * from \"./utils/ID\";\n\nexport * from \"./events/mq-events\";\n\n// ELEMENTS\nexport * from \"./Delement/css\";\nexport * from \"./Delement/DStyle\";\nexport * from \"./Delement/DImg\";\nexport * from \"./Delement/DText\";\nexport * from \"./Delement/DButton\";\nexport * from \"./Delement/Ddiv\";\nexport * from \"./Delement/button-click-action\";\nexport * from \"./Delement/DElement\";\nexport * from \"./Delement/DElement.dto\";\nexport { PageDto } from \"./page/Page\";\nexport * from \"./page/task\";\n","import { Fact } from \"../rules/fact\";\r\nimport { PageResult } from \"../page/page-result\";\r\n\r\nexport class HistoryQue {\r\n private history: PageResult[] = [];\r\n\r\n getFacts(): Array<Fact> {\r\n const answers = this.history.map((h) => h.collectedFacts).flat(1);\r\n // const facts = answers.map((a) => a.fact);\r\n // TODO FIND LATEST FACT (answer) if have multiple.\r\n return answers;\r\n }\r\n\r\n addToHistory(result: PageResult) {\r\n this.history.push(result);\r\n }\r\n}\r\n","// export type RandomObjectId = string & { randomObjectId: true };\r\nexport namespace DUtil {\r\n export const randomString = (length: number): string => {\r\n const letters = \"abcdefghijklmnopqrstuvxyz\";\r\n const uppercase = letters.toUpperCase();\r\n const all = letters + uppercase;\r\n const abs = Math.abs(length);\r\n let result = \"\";\r\n\r\n for (let i = 0; i < abs; i++) {\r\n const char = all.charAt(Math.floor(Math.random() * all.length));\r\n result += char;\r\n }\r\n return result;\r\n };\r\n\r\n export const randomObjectId = () => randomString(32);\r\n\r\n export const deleteProp = <Obj, Key extends keyof Obj>(obj: Obj, key: Key): Omit<Obj, Key> => {\r\n delete obj[key];\r\n return obj;\r\n };\r\n\r\n export const isInRange = (min: number, max: number) => {\r\n return (value: number) => value >= min && value <= max;\r\n };\r\n export const isInfinity = (number: number) => {\r\n return (\r\n number === Number.POSITIVE_INFINITY ||\r\n number === Number.NEGATIVE_INFINITY ||\r\n number === Infinity\r\n );\r\n };\r\n export type NonEmptyArray<T> = [T, ...T[]];\r\n export const isNonEmptyArray = <T>(array: Array<T>): array is NonEmptyArray<T> => {\r\n return array.length > 0;\r\n };\r\n\r\n export const neverCheck = (args: never) => {\r\n console.log(\"OOPS: This value slipped through the never-check\", args);\r\n };\r\n\r\n export const isString = (str: unknown): str is string => typeof str === \"string\";\r\n\r\n export const hasKey = <T extends string>(\r\n obj: unknown,\r\n key: T,\r\n ): obj is Record<typeof key, unknown> => {\r\n if (!isRecord(obj)) {\r\n return false;\r\n }\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n };\r\n\r\n export const isRecord = (obj: unknown): obj is Record<string, unknown> => {\r\n if (!obj) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return false;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (obj === null) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n export const isBool = (obj?: boolean): obj is boolean => typeof obj === \"boolean\";\r\n\r\n export const isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\n export const isFalse = (bool?: boolean): bool is false => bool === false;\r\n\r\n export const isDefined = (obj: unknown): boolean => {\r\n const notNull = obj !== null;\r\n const notUndefined = obj !== undefined;\r\n return notNull && notUndefined;\r\n };\r\n\r\n export const hasKind = (obj: unknown): obj is { readonly kind: string } => {\r\n if (!hasKey(obj, \"kind\")) {\r\n return false;\r\n }\r\n if (typeof obj.kind !== \"string\") {\r\n return false;\r\n }\r\n return obj.kind.length > 0;\r\n };\r\n\r\n export const hasValue = (obj: unknown): obj is { value: unknown } => {\r\n return hasKey(obj, \"value\");\r\n };\r\n export const isNumber = (value?: number): value is number => {\r\n const isNumber = typeof value === \"number\";\r\n const notNaN = !Number.isNaN(value);\r\n return isNumber && notNaN;\r\n };\r\n\r\n export const maxFn = (upperLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, upperLimit);\r\n };\r\n };\r\n\r\n export const minFn = (lowerLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, lowerLimit);\r\n };\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\nexport type Condition = Condition.String | Condition.Numeric | Condition.Complex;\r\n\r\nexport namespace Condition {\r\n export type StringOperator = \"eq\" | \"not-eq\" | \"longer-then\" | \"shorter-then\";\r\n\r\n export type NumericOperator =\r\n | \"eq\"\r\n | \"not-eq\"\r\n | \"greater-then\"\r\n | \"less-then\"\r\n | \"greater-then-inclusive\"\r\n | \"less-then-inclusive\";\r\n\r\n export interface Numeric {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"numeric-condition\";\r\n readonly operator: NumericOperator;\r\n readonly value: number;\r\n }\r\n export interface String {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"string-condition\";\r\n readonly operator: StringOperator;\r\n readonly value: string;\r\n }\r\n\r\n export interface Complex {\r\n readonly kind: \"complex-condition\";\r\n readonly name: string;\r\n readonly all: ReadonlyArray<Condition.Simple>;\r\n readonly some: ReadonlyArray<Condition.Simple>;\r\n }\r\n\r\n export type Simple = Condition.String | Condition.Numeric;\r\n\r\n /**\r\n * An empty condition will evaluate to false,\r\n * @param condition: Condition.Any\r\n * @param facts\r\n */\r\n export const evaluate = (condition: Condition, facts: ReadonlyArray<Fact>) => {\r\n let result: boolean = false;\r\n switch (condition.kind) {\r\n case \"string-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"numeric-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"complex-condition\":\r\n result = evaluateComplex(condition, facts);\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateComplex = (condition: Condition.Complex, facts: ReadonlyArray<Fact>): boolean => {\r\n if (condition.some.length === 0 && condition.all.length === 0) {\r\n return false;\r\n }\r\n const allSolved = condition.all.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n\r\n const someEvaluated = condition.some.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n const allResult = allSolved.every(DUtil.isTrue);\r\n const someResult = someEvaluated.length === 0 || someEvaluated.some(DUtil.isTrue);\r\n return someResult && allResult;\r\n };\r\n\r\n const evaluateSimple = (condition: Condition.Simple, facts: ReadonlyArray<Fact>): boolean => {\r\n const fact = facts.find((f) => f.referenceId === condition.referenceId);\r\n if (!fact) {\r\n return false;\r\n }\r\n let res = false;\r\n switch (condition.kind) {\r\n case \"numeric-condition\":\r\n if (fact.kind === \"numeric-fact\") {\r\n res = evaluateNumeric(condition, fact.value);\r\n }\r\n break;\r\n case \"string-condition\":\r\n if (fact.kind === \"string-fact\") {\r\n res = evaluateString(condition, fact.value);\r\n }\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return res;\r\n };\r\n\r\n export const isEmpty = (complex: Complex) => {\r\n return complex.all.length === 0 && complex.some.length === 0;\r\n };\r\n\r\n const evaluateString = (condition: Readonly<Condition.String>, value: string): boolean => {\r\n const operator = condition.operator;\r\n let result = false;\r\n switch (operator) {\r\n case \"eq\":\r\n result = condition.value === value;\r\n break;\r\n case \"not-eq\":\r\n result = condition.value !== value;\r\n break;\r\n case \"shorter-then\":\r\n result = condition.value !== value;\r\n break;\r\n case \"longer-then\":\r\n result = condition.value !== value;\r\n break;\r\n default:\r\n const check: never = operator;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateNumeric = (condition: Numeric, value: number): boolean => {\r\n const op = condition.operator;\r\n const conditionValue = condition.value;\r\n let result = false;\r\n switch (op) {\r\n case \"eq\":\r\n result = value === conditionValue;\r\n break;\r\n case \"not-eq\":\r\n result = value !== conditionValue;\r\n break;\r\n case \"greater-then\":\r\n result = value > conditionValue;\r\n break;\r\n case \"greater-then-inclusive\":\r\n result = value >= conditionValue;\r\n break;\r\n case \"less-then\":\r\n result = value < conditionValue;\r\n break;\r\n case \"less-then-inclusive\":\r\n result = value <= conditionValue;\r\n break;\r\n default:\r\n const check: never = op;\r\n }\r\n return result;\r\n };\r\n\r\n const _getAllSimple = (condition: Condition): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n switch (condition.kind) {\r\n case \"complex-condition\":\r\n simple.push(...condition.all);\r\n simple.push(...condition.some);\r\n break;\r\n case \"numeric-condition\":\r\n simple.push(condition);\r\n break;\r\n case \"string-condition\":\r\n simple.push(condition);\r\n break;\r\n default:\r\n DUtil.neverCheck(condition);\r\n }\r\n return simple;\r\n };\r\n\r\n export const getAllSimpleConditions = (\r\n condition: Condition | Array<Condition>\r\n ): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n if (Array.isArray(condition)) {\r\n condition.forEach((c) => {\r\n simple.push(..._getAllSimple(c));\r\n });\r\n } else {\r\n simple.push(..._getAllSimple(condition));\r\n }\r\n return simple;\r\n };\r\n}\r\n","import { Condition } from \"./condition\";\r\nimport { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport interface Rule<OnSuccessAction, OnFailureAction> {\r\n readonly id?: string;\r\n readonly description: string;\r\n readonly all: ReadonlyArray<Condition>;\r\n readonly some: ReadonlyArray<Condition>;\r\n readonly onSuccess: ReadonlyArray<OnSuccessAction>;\r\n readonly onFailure: ReadonlyArray<OnFailureAction>;\r\n}\r\n\r\nexport namespace Rule {\r\n /**\r\n * Validates that the rule is valid.\r\n * @param rule\r\n */\r\n\r\n export const isEmpty = (rule: Rule<any, any>): boolean => {\r\n const emptyConditions = rule.all.length === 0 && rule.some.length === 0;\r\n const emptyActions = rule.onSuccess.length === 0 && rule.onFailure.length === 0;\r\n return emptyConditions || emptyActions;\r\n };\r\n\r\n export const solve = (rule: Rule<any, any>, facts: ReadonlyArray<Fact>): boolean => {\r\n if (rule.some.length === 0 && rule.all.length === 0) {\r\n // TODO RETURN WARNING? OR LOGGING ?\r\n return false;\r\n }\r\n\r\n const someSolved = rule.some.map((condition) => Condition.evaluate(condition, facts));\r\n\r\n const someResult = someSolved.length === 0 || someSolved.some(DUtil.isTrue);\r\n\r\n const allSolved = rule.all.map((condition) => Condition.evaluate(condition, facts)).every(DUtil.isTrue);\r\n\r\n return allSolved && someResult;\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { Rule } from \"./rule\";\r\n\r\nexport interface SolveResult<S, F> {\r\n matching: ReadonlyArray<Match<S, F>>;\r\n errors: ReadonlyArray<RuleEngineError>;\r\n}\r\n\r\nexport interface Match<S, F> {\r\n readonly matchingRuleId: string;\r\n readonly ruleDescription: string;\r\n readonly actionList: ReadonlyArray<S> | ReadonlyArray<F>;\r\n}\r\n\r\nexport interface RuleEngineError {\r\n readonly kind?: string;\r\n readonly message: string;\r\n}\r\n\r\nexport class RuleEngine<S, F> {\r\n constructor() {}\r\n\r\n solveAll(rules: Rule<S, F>[], facts: Fact[]): SolveResult<S, F> {\r\n const errors: RuleEngineError[] = [];\r\n const matching: Match<S, F>[] = [];\r\n rules.forEach((rule) => {\r\n if (Rule.isEmpty(rule)) {\r\n errors.push({ message: \"Empty rule: \" + rule.id });\r\n } else if (Rule.solve(rule, facts)) {\r\n const match: Match<S, F> = {\r\n ruleDescription: rule.description,\r\n matchingRuleId: rule.id ?? \"no-id-given\",\r\n actionList: [...rule.onSuccess],\r\n };\r\n matching.push(match);\r\n }\r\n });\r\n return { matching, errors };\r\n }\r\n\r\n solve(rule: Rule<S, F>, facts: Fact[]): boolean {\r\n // TODO Validate, and Return result\r\n return Rule.solve(rule, facts);\r\n }\r\n}\r\n","import { PageDto } from \"../page/Page\";\r\n\r\nexport class NextQue {\r\n private originalOrder: ReadonlyArray<string> = [];\r\n private allPages: PageDto[] = [];\r\n private excludedTags = new Set<string>();\r\n private excludedByPageId = new Set<string>();\r\n private remaining: PageDto[] = [];\r\n constructor(pages: PageDto[] = []) {\r\n this.resetQue(pages);\r\n }\r\n\r\n /**\r\n * Will reset que with the new pages.\r\n * @param pages\r\n */\r\n resetQue(pages: PageDto[]) {\r\n this.allPages = [...pages];\r\n this.remaining = [...pages];\r\n this.excludedTags = new Set();\r\n this.excludedByPageId = new Set();\r\n this.originalOrder = this.allPages.map((p) => p.id);\r\n }\r\n\r\n pop(): PageDto | false {\r\n const next = this.remaining.shift();\r\n // TODO CLONE??\r\n return next ?? false;\r\n }\r\n\r\n peek(): PageDto | false {\r\n const next = this.remaining[0];\r\n return next ?? false;\r\n }\r\n\r\n jumpToPageById(pageId: string): boolean {\r\n const index = this.remaining.findIndex((p) => p.id === pageId);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this.remaining = this.remaining.slice(index);\r\n return true;\r\n }\r\n\r\n removeByTag(tag: string | string[]) {\r\n if (Array.isArray(tag)) {\r\n tag.forEach((tag) => {\r\n this.excludedTags.add(tag);\r\n });\r\n } else {\r\n this.excludedTags.add(tag);\r\n }\r\n this.filterRemaining();\r\n }\r\n\r\n /**\r\n * Will not be included\r\n * @param pages\r\n */\r\n insertAsNextByForce(pages: PageDto[]) {\r\n this.remaining.unshift(...pages);\r\n }\r\n\r\n removeByPageId(pageId: string | string[]) {\r\n if (Array.isArray(pageId)) {\r\n pageId.forEach((id) => {\r\n this.excludedByPageId.add(id);\r\n });\r\n } else {\r\n this.excludedByPageId.add(pageId);\r\n }\r\n this.filterRemaining();\r\n // this.excludedByPageId.add(pageId);\r\n }\r\n\r\n private filterRemaining() {\r\n this.remaining = this.remaining.filter((p) => {\r\n const tags = p.tags ?? [];\r\n const isIncluededByTag = !tags.some((tag) => this.excludedTags.has(tag));\r\n const isIncludedByPageId = !this.excludedByPageId.has(p.id);\r\n return isIncludedByPageId && isIncluededByTag;\r\n });\r\n }\r\n get isEmpty(): boolean {\r\n return this.remaining.length === 0;\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get size(): number {\r\n return this.remaining.length;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get pageCount(): number {\r\n return this.originalOrder.length;\r\n }\r\n}\r\n","import { HistoryQue } from \"./history-que\";\nimport { RuleEngine } from \"../rules/rule-engine\";\nimport { NextQue } from \"./next-que\";\nimport { SchemaDto } from \"./SchemaDto\";\nimport { RuleActionPageQue } from \"./page-que-ruleengine-action\";\nimport { PageDto } from \"../page/Page\";\nimport { PageResult } from \"../page/page-result\";\nimport { Fact } from \"../rules/fact\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport type DPlayerData = Pick<SchemaDto, \"pages\" | \"pageSequences\" | \"rules\" | \"predefinedFacts\">;\nexport class DPlayer {\n private readonly eventLog: Array<MqEvent> = [];\n private history = new HistoryQue();\n private ruleEngine = new RuleEngine<RuleActionPageQue, never>();\n private nextQue = new NextQue();\n private data: DPlayerData;\n private readonly predefinedFacts: ReadonlyArray<Fact>;\n\n constructor(data: DPlayerData) {\n this.data = data;\n const pages = data.pages ?? [];\n this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];\n this.nextQue.resetQue(pages);\n }\n\n saveEvent(event: MqEvent) {\n this.eventLog.push(event);\n }\n\n saveHistory(pageHistory: PageResult) {\n // console.log(\"SAVE HISTORY\", pageHistory);\n this.history.addToHistory(pageHistory);\n this.eventLog.push(...pageHistory.eventLog);\n // Evaluate rules\n const userGeneratedFact = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const facts = [...userGeneratedFact, ...predefinedFacts];\n const result = this.ruleEngine.solveAll(this.data.rules, facts);\n\n const matchingRules = result.matching;\n const actions = matchingRules.map((r) => r.actionList).flat(1);\n // Execute actions\n actions.forEach((a) => {\n // console.log(a.payload);\n switch (a.kind) {\n case \"jumpToPage\":\n this.nextQue.jumpToPageById(a.pageId);\n break;\n case \"excludeByPageId\":\n this.nextQue.removeByPageId(a.pageIds);\n break;\n case \"excludeByTag\":\n this.nextQue.removeByTag(a.tagIds);\n break;\n default:\n console.log(\"UNKNOWN ACTION\", a);\n const check: never = a;\n }\n });\n }\n\n getResults() {\n const pagesLeft = this.nextQue.size;\n const answerFacts = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const eventLog = [...this.eventLog];\n // console.log(answerFacts);\n return { answerFacts, predefinedFacts, eventLog, pagesLeft };\n }\n\n insertSequence(sequenceId: string) {\n this.insertSequenceById(sequenceId);\n }\n\n getNextPage(): PageDto | false {\n const next = this.nextQue.pop();\n return next ?? false;\n }\n\n private insertSequenceById(id: string) {\n const seq = this.data.pageSequences?.find((s) => s.id === id);\n if (seq) {\n this.nextQue.insertAsNextByForce([...seq.pages]);\n } else {\n // HOW TO HANDLE INVALID ID_REFS?? LOGGER??\n // LOG INVALID COMMAND.\n }\n }\n\n /**\n * Total number of pages left in que\n */\n get pagesLeft(): number {\n return this.nextQue.pageCount;\n }\n\n /**\n * Total number of pages in test\n */\n get totalPageCount(): number {\n return this.data.pages.length;\n }\n}\n","export class ScaleService {\r\n private readonly baseHeight;\r\n private readonly baseWidth;\r\n private containerHeight = 1300;\r\n private containerWidth = 1300;\r\n\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n get pageHeight() {\r\n return this.baseHeight * this.scale;\r\n }\r\n get pageWidth() {\r\n return this.baseWidth * this._scale;\r\n }\r\n\r\n private _scale = 1;\r\n\r\n private readonly subscribers = new Set<(scale: number) => void>();\r\n\r\n constructor(config: { baseHeight: number; baseWidth: number; containerHeight: number; containerWidth: number }) {\r\n this.baseHeight = config.baseHeight;\r\n this.baseWidth = config.baseWidth;\r\n this.containerHeight = config.containerHeight;\r\n this.containerWidth = config.containerWidth;\r\n this.updateScale();\r\n }\r\n\r\n setContainerBounds(bounds: { height: number; width: number }) {\r\n this.containerWidth = bounds.width;\r\n this.containerHeight = bounds.height;\r\n this.updateScale();\r\n }\r\n private updateScale() {\r\n const scaleFn = Scale.calc(this.baseHeight, this.baseWidth);\r\n const scale = scaleFn({ height: this.containerHeight, width: this.containerWidth });\r\n const hasChanged = this.scale !== scale;\r\n this._scale = scale;\r\n if (hasChanged) {\r\n this.subscribers.forEach((fn) => {\r\n fn(this._scale);\r\n });\r\n }\r\n }\r\n\r\n onChange(scaleChangeHandler: (scale: number) => void, subscriberId: string) {\r\n // console.log(subscriberId);\r\n this.subscribers.add(scaleChangeHandler);\r\n scaleChangeHandler(this._scale);\r\n return () => {\r\n this.subscribers.delete(scaleChangeHandler);\r\n };\r\n }\r\n}\r\nexport namespace Scale {\r\n export const calc = (baseHeight: number, baseWidth: number) => {\r\n return (container: { height: number; width: number }) => {\r\n const heightRatio = container.height / baseHeight;\r\n const widthRatio = container.width / baseWidth;\r\n return Math.min(heightRatio, widthRatio);\r\n };\r\n };\r\n\r\n type ScalePosInput = { x: number; y: number; h: number; w: number };\r\n\r\n export const scaleFunctionCreator = (scale: number) => {\r\n return (value: number) => value * scale;\r\n };\r\n}\r\n","import { DUtil } from \"../utils/DUtil\";\n\nexport namespace DCss {\n export interface Px {\n readonly _unit: \"px\";\n readonly value: number;\n }\n\n export type LengthString = `${number}px` | `${number}%`;\n export interface Percent {\n readonly _unit: \"percent\";\n readonly value: number;\n }\n\n export type LengthUnit = Px | Percent | number;\n\n /**\n * Will scale to 3% of baseScale\n * @param unit\n * @param scale\n */\n export const toString = (unit: Readonly<LengthUnit>, scale: number): LengthString => {\n const _mapped: Percent | Px =\n typeof unit === \"number\" ? { _unit: \"percent\", value: unit } : unit;\n return _toString(_mapped, scale);\n };\n const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {\n const clampedScale = Math.max(scale, 0.03);\n if (unit._unit === \"px\") {\n if (unit.value < 0.1) {\n return \"0px\";\n }\n\n const rounded = Math.round(unit.value * clampedScale);\n const clamped = Math.max(rounded, 1);\n return (clamped + \"px\") as LengthString;\n }\n return (unit.value + \"%\") as LengthString;\n };\n\n export const isLengthUnit = (unit?: LengthUnit): unit is LengthUnit => {\n if (typeof unit === \"number\") {\n return true;\n }\n\n if (!unit) {\n return false;\n }\n\n const unitKey: keyof DCss.Px = \"_unit\";\n const valueKey: keyof DCss.Px = \"value\";\n const hasUnitKey = DUtil.hasKey(unit, unitKey);\n const hasValueKey = DUtil.hasKey(unit, valueKey);\n return hasUnitKey && hasValueKey;\n };\n}\n","import { DCss } from \"./css\";\nimport { DUtil } from \"../utils/DUtil\";\n\nexport type PStyle = Partial<DStyle>;\nexport interface DStyle {\n opacity: number;\n backgroundColor: string;\n visibility: \"visible\" | \"hidden\";\n cursor:\n | \"pointer\"\n | \"help\"\n | \"copy\"\n | \"wait\"\n | \"not-allowed\"\n | \"context-menu\"\n | \"move\"\n | \"grabbing\"\n | \"grab\"\n | \"zoom-in\"\n | \"zoom-out\"\n | \"none\"\n | \"auto\"\n | \"default\";\n\n zIndex: number;\n // POSITION\n h: number;\n w: number;\n x: number;\n y: number;\n height: DCss.LengthUnit;\n maxHeight: DCss.LengthUnit;\n minHeight: DCss.LengthUnit;\n width: DCss.LengthUnit;\n maxWidth: DCss.LengthUnit;\n minWidth: DCss.LengthUnit;\n bottom: DCss.LengthUnit;\n top: DCss.LengthUnit;\n left: DCss.LengthUnit;\n right: DCss.LengthUnit;\n boxShadow: string;\n\n // BORDERS\n borderStyle: \"solid\" | \"none\" | \"dotted\" | \"dashed\";\n borderRadius: DCss.Px | DCss.Percent;\n borderWidth: DCss.Px;\n borderColor: string;\n\n margin: DCss.Px | DCss.Percent;\n padding: DCss.Px | DCss.Percent;\n paddingLeft: DCss.Px | DCss.Percent;\n paddingRight: DCss.Px | DCss.Percent;\n paddingTop: DCss.Px | DCss.Percent;\n paddingBottom: DCss.Px | DCss.Percent;\n\n // Translate\n transform: string;\n translate: string;\n\n // TEXT\n fontSize: DCss.Px;\n textColor: string;\n fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n textAlign: \"right\" | \"left\" | \"center\";\n letterSpacing: DCss.Px;\n\n // LAYOUT & POSITIONING OVERRIDE\n position: \"absolute\" | \"relative\";\n display: \"flex\" | \"block\";\n flexDirection: \"row\" | \"colum\";\n flexWrap: \"nowrap\" | \"wrap\";\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n alignItems: \"stretch\" | \"baseline\" | \"center\" | \"flex-start\" | \"flex-end\";\n gap: DCss.Px;\n alignContent:\n | \"stretch\"\n | \"center\"\n | \"flex-start\"\n | \"flex-end\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n}\n\nexport namespace DStyle {\n import isNumber = DUtil.isNumber;\n import isLengthUnit = DCss.isLengthUnit;\n export const normalize = <T extends HTMLElement>(el: T): T => {\n el.style.padding = \"0\";\n el.style.margin = \"0\";\n el.style.position = \"absolute\";\n el.style.boxSizing = \"border-box\";\n return el;\n };\n\n export const applyStyles = <T extends HTMLElement>(\n el: T,\n style: Partial<DStyle>,\n scale: number,\n ): T => {\n // const scalePx = DCss.toStringCre(this.scale);\n const {\n x,\n y,\n left,\n right,\n top,\n bottom,\n backgroundColor,\n borderColor,\n borderWidth,\n borderRadius,\n borderStyle,\n w,\n opacity,\n cursor,\n fontSize,\n fontWeight,\n textColor,\n textAlign,\n translate,\n margin,\n padding,\n letterSpacing,\n h,\n height,\n width,\n transform,\n visibility,\n justifyContent,\n alignContent,\n flexWrap,\n display,\n flexDirection,\n alignItems,\n position,\n paddingLeft,\n paddingTop,\n paddingRight,\n paddingBottom,\n gap,\n\n zIndex,\n //\n boxShadow,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n } = style;\n\n if (typeof zIndex === \"number\") {\n el.style.zIndex = \"\" + zIndex;\n }\n\n if (DCss.isLengthUnit(minWidth)) {\n el.style.minWidth = DCss.toString(minWidth, scale);\n }\n\n if (DCss.isLengthUnit(maxWidth)) {\n el.style.maxWidth = DCss.toString(maxWidth, scale);\n }\n\n if (DCss.isLengthUnit(minHeight)) {\n el.style.minHeight = DCss.toString(minHeight, scale);\n }\n\n if (DCss.isLengthUnit(maxHeight)) {\n el.style.maxHeight = DCss.toString(maxHeight, scale);\n }\n\n if (boxShadow) {\n el.style.boxShadow = boxShadow;\n }\n\n if (gap) {\n el.style.gap = DCss.toString(gap, scale);\n }\n\n if (paddingLeft) {\n el.style.paddingLeft = DCss.toString(paddingLeft, scale);\n }\n\n if (paddingRight) {\n el.style.paddingRight = DCss.toString(paddingRight, scale);\n }\n\n if (paddingTop) {\n el.style.paddingTop = DCss.toString(paddingTop, scale);\n }\n\n if (paddingBottom) {\n el.style.paddingBottom = DCss.toString(paddingBottom, scale);\n }\n\n if (position) {\n el.style.position = position;\n }\n if (justifyContent) {\n el.style.justifyContent = justifyContent;\n }\n\n if (alignContent) {\n el.style.alignContent = alignContent;\n }\n if (flexWrap) {\n el.style.flexWrap = flexWrap;\n }\n if (display) {\n el.style.display = display;\n }\n if (flexDirection) {\n el.style.flexDirection = flexDirection;\n }\n if (alignItems) {\n el.style.alignItems = alignItems;\n }\n\n // this.el.style.fontWeight = '900';\n if (backgroundColor) {\n el.style.backgroundColor = backgroundColor;\n }\n\n if (cursor) {\n el.style.cursor = cursor;\n }\n\n if (transform) {\n el.style.transform = transform;\n }\n\n if (textColor) {\n el.style.color = textColor;\n }\n if (textAlign) {\n el.style.textAlign = textAlign;\n }\n\n if (borderColor) {\n el.style.borderColor = borderColor;\n }\n\n if (borderWidth) {\n el.style.borderWidth = DCss.toString(borderWidth, scale);\n }\n\n if (fontWeight) {\n el.style.fontWeight = fontWeight + \"\";\n }\n\n if (borderStyle) {\n el.style.borderStyle = borderStyle;\n }\n\n if (fontSize) {\n el.style.fontSize = DCss.toString(fontSize, scale);\n }\n\n if (DUtil.isNumber(x)) {\n el.style.left = x + \"%\";\n }\n\n if (DUtil.isNumber(y)) {\n el.style.bottom = y + \"%\";\n }\n\n if (DCss.isLengthUnit(height)) {\n el.style.height = DCss.toString(height, scale);\n }\n\n if (DCss.isLengthUnit(width)) {\n el.style.width = DCss.toString(width, scale);\n }\n\n if (DCss.isLengthUnit(left)) {\n el.style.left = DCss.toString(left, scale);\n }\n\n if (DCss.isLengthUnit(right)) {\n el.style.right = DCss.toString(right, scale);\n }\n\n if (DCss.isLengthUnit(bottom)) {\n el.style.bottom = DCss.toString(bottom, scale);\n }\n\n if (DCss.isLengthUnit(top)) {\n el.style.top = DCss.toString(top, scale);\n }\n\n if (DUtil.isNumber(h)) {\n el.style.height = DCss.toString(h, scale);\n }\n\n if (isNumber(w)) {\n el.style.width = DCss.toString(w, scale);\n }\n\n if (DCss.isLengthUnit(borderRadius)) {\n el.style.borderRadius = DCss.toString(borderRadius, scale);\n }\n\n if (letterSpacing) {\n el.style.letterSpacing = DCss.toString(letterSpacing, scale);\n }\n\n if (margin) {\n el.style.margin = DCss.toString(margin, scale);\n }\n\n if (padding) {\n el.style.padding = DCss.toString(padding, scale);\n }\n\n if (isNumber(opacity)) {\n el.style.opacity = opacity + \"\";\n }\n\n if (visibility) {\n el.style.visibility = visibility;\n }\n return el;\n };\n // const propNames = new Set(...ElementKeyNames);\n // export const validKey = (keyName: string) => propNames.has(keyName);\n}\n","export type DTimestamp = number & { __timestamp__: true };\r\nexport namespace DTimestamp {\r\n export const now = () => Date.now() as DTimestamp;\r\n export type Diff = number & { __diff__: true };\r\n\r\n export const addMills = (t: DTimestamp, ms: number): DTimestamp => {\r\n const res = t + Math.abs(ms);\r\n return res as DTimestamp;\r\n };\r\n\r\n export const diff = (t1: DTimestamp, t2: DTimestamp): Diff => {\r\n const t1Abs = Math.abs(t1);\r\n const t2Abs = Math.abs(t2);\r\n return Math.abs(t1Abs - t2Abs) as Diff;\r\n };\r\n\r\n export const diffNow = (t: DTimestamp): Diff => {\r\n return diff(t, now());\r\n };\r\n}\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport diff = DTimestamp.diff;\n\nexport type TaskState = {\n audioIsPlaying: boolean;\n isGifMode: boolean;\n videoPlayState:\n | \"playing\"\n | \"paused\"\n | \"ended\"\n | \"playing-and-muted\"\n | \"paused-and-muted\"\n | \"ended-and-muted\";\n blockFormInput: boolean;\n blockResponseButton: boolean;\n blockAudio: boolean;\n blockVideo: boolean;\n};\n\nexport type TaskStateDiff = Partial<TaskState> & { __diffed__: true };\nexport const TaskState = {\n eq: (a: TaskState, b: TaskState) => {\n return (\n a.audioIsPlaying === b.audioIsPlaying &&\n a.isGifMode === b.isGifMode &&\n a.videoPlayState === b.videoPlayState &&\n a.blockFormInput === b.blockFormInput &&\n a.blockResponseButton === b.blockResponseButton &&\n a.blockAudio === b.blockAudio &&\n a.blockVideo === b.blockVideo\n );\n },\n\n getDiff: (curr: TaskState, prev: TaskState | false): TaskStateDiff => {\n if (prev === false) {\n return curr as TaskStateDiff;\n }\n\n const diff = {} as TaskStateDiff;\n\n if (curr.audioIsPlaying !== prev.audioIsPlaying) {\n diff.audioIsPlaying = curr.audioIsPlaying;\n }\n if (curr.isGifMode !== prev.isGifMode) {\n diff.isGifMode = curr.isGifMode;\n }\n if (curr.videoPlayState !== prev.videoPlayState) {\n diff.videoPlayState = curr.videoPlayState;\n }\n\n if (curr.blockFormInput !== prev.blockFormInput) {\n diff.blockFormInput = curr.blockFormInput;\n }\n if (curr.blockResponseButton !== prev.blockResponseButton) {\n diff.blockResponseButton = curr.blockResponseButton;\n }\n if (curr.blockAudio !== prev.blockAudio) {\n diff.blockAudio = curr.blockAudio;\n }\n if (curr.blockVideo !== prev.blockVideo) {\n diff.blockVideo = curr.blockVideo;\n }\n return diff;\n },\n};\n","import { DStyle, PStyle } from \"./DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\nimport { DElementDto } from \"./DElement.dto\";\nimport { TaskState, TaskStateDiff } from \"../page/task-state\";\n\nexport interface DElementBaseDto {\n readonly style: PStyle;\n readonly onMouseEnter?: PStyle;\n readonly onMouseLeave?: PStyle;\n readonly onMouseDown?: PStyle;\n readonly onMouseUp?: PStyle;\n readonly innerText?: string;\n\n // ACTIONS HANDLERS\n readonly onClick?: ButtonClickAction;\n\n // VIDEO STATED\n readonly whenVideoPaused?: PStyle;\n readonly whenVideoPausedAndMuted?: PStyle;\n readonly whenVideoEnded?: PStyle;\n readonly whenVideoEndedAndMuted?: PStyle;\n readonly whenVideoPlaying?: PStyle;\n readonly whenVideoPlayingAndMuted?: PStyle;\n\n readonly whenAudioPlaying?: PStyle;\n readonly whenAudioPaused?: PStyle;\n readonly whenAudioBlocked?: PStyle;\n readonly whenVideoBlocked?: PStyle;\n readonly whenAudioUnblocked?: PStyle;\n readonly whenVideoUnblocked?: PStyle;\n readonly whenResponseBlocked?: PStyle;\n readonly whenResponseUnblocked?: PStyle;\n readonly whenFormInputBlocked?: PStyle;\n readonly whenFormInputUnblocked?: PStyle;\n}\n\nconst isFalse = (bool?: boolean): bool is false => bool === false;\nconst isTrue = (bool?: boolean): bool is true => bool === true;\n\nexport abstract class DElement<T extends HTMLElement> {\n private prevState: TaskState | false = false;\n\n protected currStyle: Partial<DStyle> = {\n fontSize: { _unit: \"px\", value: 100 },\n fontWeight: 500,\n textColor: \"black\",\n opacity: 1,\n };\n\n protected constructor(\n protected readonly el: T,\n protected readonly dto: DElementBaseDto,\n protected readonly scale: ScaleService,\n ) {\n if (dto.innerText) {\n this.el.innerText = dto.innerText;\n }\n this.setStyle = this.setStyle.bind(this);\n this.normalize = this.normalize.bind(this);\n this.appendYourself = this.appendYourself.bind(this);\n this.updateStyles = this.updateStyles.bind(this);\n const { onMouseEnter, onMouseLeave } = dto;\n\n if (onMouseEnter) {\n this.el.onmouseenter = () => {\n this.setStyle(onMouseEnter);\n };\n }\n if (onMouseLeave) {\n this.el.onmouseleave = () => {\n this.setStyle(onMouseLeave);\n };\n }\n\n this.normalize();\n\n if (dto) {\n this.updateStyles(dto?.style);\n }\n }\n\n /**\n * This method is called when the element is clicked.\n * This method shall be overridden by the pageClass.\n * @param style\n */\n setStyle(style: PStyle) {\n this.updateStyles(style);\n }\n\n getElementByDangerousReference() {\n return this.el;\n }\n\n appendYourself(parent: { append: (el: HTMLElement) => void }) {\n parent.append(this.el);\n // console.log(parent);\n }\n\n updateState(state: TaskStateDiff) {\n this.handleStateChanges(state);\n }\n\n setState(state: TaskState) {\n const prev = this.prevState;\n const diff = TaskState.getDiff(state, prev);\n this.prevState = state;\n if (Object.keys(diff).length > 0) {\n this.handleStateChanges(diff);\n }\n }\n\n private handleStateChanges(diff: TaskStateDiff) {\n const {\n audioIsPlaying,\n videoPlayState,\n blockAudio,\n blockVideo,\n blockResponseButton,\n blockFormInput,\n isGifMode,\n } = diff;\n const {\n whenAudioPaused,\n whenVideoPaused,\n whenAudioPlaying,\n whenFormInputBlocked,\n whenResponseBlocked,\n\n whenVideoPlaying,\n whenVideoEnded,\n\n whenAudioBlocked,\n whenVideoBlocked,\n whenAudioUnblocked,\n whenVideoUnblocked,\n whenResponseUnblocked,\n whenFormInputUnblocked,\n whenVideoPausedAndMuted,\n whenVideoEndedAndMuted,\n whenVideoPlayingAndMuted,\n } = this.dto;\n\n if (isTrue(audioIsPlaying) && whenAudioPlaying) {\n this.setStyle(whenAudioPlaying);\n }\n\n if (isFalse(audioIsPlaying) && whenAudioPaused) {\n this.setStyle(whenAudioPaused);\n }\n\n if (videoPlayState === \"playing\" && whenVideoPlaying) {\n this.setStyle(whenVideoPlaying);\n }\n\n if (videoPlayState === \"paused\" && whenVideoPaused) {\n this.setStyle(whenVideoPaused);\n }\n\n if (videoPlayState === \"ended\" && whenVideoEnded) {\n this.setStyle(whenVideoEnded);\n }\n if (videoPlayState === \"playing-and-muted\" && whenVideoPlayingAndMuted) {\n this.setStyle(whenVideoPlayingAndMuted);\n }\n\n if (videoPlayState === \"paused-and-muted\" && whenVideoPausedAndMuted) {\n this.setStyle(whenVideoPausedAndMuted);\n }\n\n if (videoPlayState === \"ended-and-muted\" && whenVideoEndedAndMuted) {\n this.setStyle(whenVideoEndedAndMuted);\n }\n }\n\n private normalize() {\n this.el.style.padding = \"0\";\n this.el.style.margin = \"0\";\n this.el.style.position = \"absolute\";\n this.el.style.boxSizing = \"border-box\";\n }\n\n abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;\n\n protected updateStyles(style: Partial<DStyle>) {\n this.currStyle = Object.assign(this.currStyle, style);\n DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);\n window.getComputedStyle(this.el);\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { DText, DTextDto } from \"./DText\";\nimport { DImg, DImgDto } from \"./DImg\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DButton, DButtonDto } from \"./DButton\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DDivDto extends DElementBaseDto {\n readonly _tag: \"div\";\n readonly children: Array<DTextDto | DImgDto | DButtonDto>;\n}\n\nexport class DDiv extends DElement<HTMLDivElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 22, y: 4 };\n private children: Array<DText | DImg | DButton> = [];\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n this.children.forEach((child) => {\n child.registerClickHandler(clickHandler);\n });\n }\n\n constructor(dto: DDivDto, scale: ScaleService, children: Array<DText | DImg | DButton>) {\n const d = document.createElement(\"div\");\n super(d, dto, scale);\n this.children = children;\n\n this.children.forEach((child) => {\n child.appendYourself(this.el);\n });\n }\n protected whenConstructed() {\n this.children.forEach((child) => {\n console.log(child);\n });\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DImgDto extends DElementBaseDto {\n readonly _tag: \"img\";\n // readonly id: string;\n readonly url: string;\n}\n\nexport class DImg extends DElement<HTMLImageElement> {\n private static IMAGE_COUNT = 0;\n private readonly imageCount: number;\n readonly TAG: string;\n readonly TIMING_TAG: string;\n private readonly loadStart: DTimestamp;\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n\n constructor(\n protected readonly dto: DImgDto,\n readonly scaleService: ScaleService,\n ) {\n super(document.createElement(\"img\"), dto, scaleService);\n DImg.IMAGE_COUNT += 1;\n this.imageCount = DImg.IMAGE_COUNT;\n this.TAG = \"[D_IMG \" + DImg.IMAGE_COUNT + \" ]: \";\n this.TIMING_TAG = \"load-time (\" + DImg.IMAGE_COUNT + \") \";\n this.el.loading = \"eager\";\n this.el.style.position = \"absolute\";\n this.setStyle(dto.style);\n\n this.loadStart = DTimestamp.now();\n this.el.onload = () => {};\n this.el.onerror = () => {};\n this.el.src = dto.url;\n console.time(this.TIMING_TAG);\n }\n\n log(): void {}\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DTextDto extends DElementBaseDto {\n readonly _tag: \"p\";\n readonly innerText: string;\n}\n\nexport class DText extends DElement<HTMLParagraphElement> {\n constructor(dto: DTextDto, scale: ScaleService) {\n super(document.createElement(\"p\"), dto, scale);\n }\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const onClick = this.dto.onClick;\n if (onClick) {\n clickHandler(onClick);\n }\n };\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DButtonDto extends DElementBaseDto {\n readonly _tag: \"button\";\n}\n\nexport class DButton extends DElement<HTMLButtonElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 40, y: 40 };\n\n constructor(dto: DButtonDto, scale: ScaleService) {\n const d = document.createElement(\"button\");\n super(d, dto, scale);\n }\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n}\n","import { DElement } from \"./DElement\";\nimport { DDiv, DDivDto } from \"./Ddiv\";\nimport { DImg } from \"./DImg\";\nimport { DText } from \"./DText\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DElementDto } from \"./DElement.dto\";\nimport { DButton } from \"./DButton\";\n\nexport const createDElement = (dto: DElementDto, scale: ScaleService): DElement<any> => {\n switch (dto._tag) {\n case \"div\":\n const childEls = createChildrenForDiv(dto, scale);\n return new DDiv(dto, scale, childEls);\n case \"img\":\n return new DImg(dto, scale);\n case \"p\":\n return new DText(dto, scale);\n case \"button\":\n return new DButton(dto, scale);\n default:\n const check: never = dto;\n throw new Error(\"Unknown dto given to the createDElement function.\");\n // TODO LOGGING or create any HTML-ELEMENT??\n }\n};\n\nconst createChildrenForDiv = (dto: DDivDto, scale: ScaleService): DDiv[\"children\"] => {\n const childDto = dto.children;\n const childEls: Array<DImg | DText | DButton> = [];\n childDto.forEach((dto) => {\n switch (dto._tag) {\n case \"p\":\n const newText = new DText(dto, scale);\n childEls.push(newText);\n break;\n case \"img\":\n const newImage = new DImg(dto, scale);\n childEls.push(newImage);\n break;\n case \"button\":\n const newButton = new DButton(dto, scale);\n childEls.push(newButton);\n break;\n default:\n const check: never = dto;\n }\n });\n return childEls;\n};\n","import { PlayAudioTask, PlayVideoTask } from \"../page/task\";\nimport { Fact } from \"../rules/fact\";\n\nexport type ButtonClickAction =\n | { kind: \"play-audio\"; task: PlayAudioTask; vibrateMs?: number }\n | { kind: \"pause-audio\"; vibrateMs?: number }\n | { kind: \"play-video\"; task: PlayVideoTask; vibrateMs?: number }\n | { kind: \"mute-video\"; vibrateMs?: number }\n | { kind: \"un-mute-video\"; vibrateMs?: number }\n | { kind: \"pause-video\"; vibrateMs?: number }\n | { kind: \"submit-fact\"; fact: Fact; vibrateMs?: number }\n | { kind: \"next-page\"; vibrateMs?: number }\n | { kind: \"submit-form\"; vibrateMs?: number };\n\n// export type ButtonClickAction = _ButtonClickAction & ;\nexport const ButtonClickAction = {\n describe: (a: ButtonClickAction): string => {\n switch (a.kind) {\n case \"next-page\":\n return \"go to next page\";\n case \"play-video\":\n return \"VideoId = \" + a.task.videoId;\n case \"play-audio\":\n return \"AudioId = \" + a.task.audioId;\n case \"pause-video\":\n return \"\";\n case \"pause-audio\":\n return \"\";\n case \"submit-fact\":\n return a.fact.label + \" = \" + a.fact.value;\n case \"submit-form\":\n return \"\";\n case \"mute-video\":\n return \"mute-video\";\n case \"un-mute-video\":\n return \"un-mute-video\";\n default:\n const _exhaustiveCheck: never = a;\n return \"\";\n }\n },\n};\n","import { DTimestamp } from \"../common/DTimestamp\";\r\n\r\ninterface _MqEvent<K extends string, P extends object> {\r\n readonly kind: K;\r\n readonly timestamp: DTimestamp;\r\n readonly payload: P;\r\n}\r\n\r\nexport type MqEventEngineStart = _MqEvent<\r\n \"engine-start\",\r\n {\r\n readonly schemaId: string;\r\n readonly schemaPrefix: string;\r\n }\r\n>;\r\nexport interface MqEventPageEnter\r\n extends _MqEvent<\"page-enter\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\nexport interface MqEventPageLeave\r\n extends _MqEvent<\"page-leave\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\n\r\nexport type MqEventUserClicked = _MqEvent<\r\n \"user-clicked\",\r\n { readonly pageId: string; pagePrefix: string; action: string; descriptions: string }\r\n>;\r\n\r\nexport type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;\r\n\r\nexport const MqEvent = {\r\n engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {\r\n return {\r\n kind: \"engine-start\",\r\n timestamp: DTimestamp.now(),\r\n payload: { schemaId, schemaPrefix },\r\n };\r\n },\r\n pageEnter(pageId: string, pagePrefix: string): MqEventPageEnter {\r\n return {\r\n kind: \"page-enter\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n pageLeave(pageId: string, pagePrefix: string): MqEventPageLeave {\r\n return {\r\n kind: \"page-leave\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n userClicked(data: {\r\n pageId: string;\r\n pagePrefix: string;\r\n action: string;\r\n descriptions: string;\r\n }): MqEventUserClicked {\r\n const { pageId, pagePrefix, action, descriptions } = data;\r\n return {\r\n kind: \"user-clicked\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix, action, descriptions },\r\n };\r\n },\r\n} as const;\r\n","import { DElement } from \"../Delement/DElement\";\nimport { TaskManager } from \"./task-manager\";\nimport { createDElement } from \"../Delement/element-factory\";\nimport { ScaleService } from \"../engine/scale\";\nimport { Task } from \"./task\";\nimport { PStyle } from \"../Delement/DStyle\";\nimport { ButtonClickAction } from \"../Delement/button-click-action\";\nimport { DElementDto } from \"../Delement/DElement.dto\";\nimport { Fact } from \"../rules/fact\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { PageResult } from \"./page-result\";\nimport { TaskState } from \"./task-state\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport interface VideoPlayerDto {\n playUrl: string;\n style?: PStyle;\n}\n\nexport interface PageDto {\n readonly id: string;\n readonly prefix: string;\n readonly tags: string[];\n background: string;\n elements: Array<DElementDto>;\n videoPlayer?: VideoPlayerDto;\n initialTasks: Array<Task>;\n}\n\nexport const PageDto = {\n createDummy: (id: number): PageDto => {\n return {\n id: \"id\" + id,\n prefix: \"prefix\" + id,\n tags: [],\n background: \"white\",\n elements: [\n {\n _tag: \"div\",\n style: { x: 10, y: 0, w: 40, h: 20, backgroundColor: \"red\" },\n children: [],\n innerText: \"Next btn \" + id,\n },\n ],\n\n initialTasks: [],\n };\n },\n};\n\nexport class Page {\n private readonly TAG = \"[ DPage ]: \";\n private elements: DElement<HTMLElement>[] = [];\n // private elements: PageComponent[] = [];\n // private layoutComponents: PageLayoutComponent[] = [];\n private pageEntered: DTimestamp = DTimestamp.now();\n private previousState: TaskState | false = false;\n private eventLog = new Array<MqEvent>();\n\n constructor(\n private readonly dto: PageDto,\n private readonly taskManager: TaskManager,\n private readonly scaleService: ScaleService,\n private readonly onCompleted: (result: PageResult) => void,\n ) {\n dto.elements.forEach((el) => {\n const element = createDElement(el, scaleService);\n // if (element instanceof DDiv) {\n // }\n element.registerClickHandler((action) => {\n this.handleButtonAction(action);\n });\n\n this.elements.push(element);\n\n // if(element.)\n // element= (action) => {\n // console.log(\"TODO ONCLICK \");\n // this.handleButtonAction(action);\n // };\n // this.elements.push(element);\n });\n\n if (dto.videoPlayer) {\n this.taskManager.loadVideo(dto.videoPlayer.playUrl);\n if (dto.videoPlayer.style) {\n this.taskManager.setVideoStyles(dto.videoPlayer.style);\n }\n }\n\n if (dto.initialTasks.length) {\n this.taskManager.autoPlaySequence(dto.initialTasks);\n }\n }\n\n private createPageResult(facts: Fact[]): PageResult {\n const pageExited = DTimestamp.now();\n const pageTime = DTimestamp.diff(this.pageEntered, pageExited);\n const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix);\n this.eventLog.push(pageExit);\n const eventLog = [...this.eventLog];\n return {\n pagePrefix: this.dto.prefix,\n pageId: this.dto.id,\n eventLog,\n pageTime,\n collectedFacts: facts,\n };\n }\n private handleButtonAction(a: ButtonClickAction) {\n const event = MqEvent.userClicked({\n pageId: this.dto.id,\n pagePrefix: this.dto.prefix,\n action: a.kind,\n descriptions: ButtonClickAction.describe(a),\n });\n this.eventLog.push(event);\n navigator.vibrate(200);\n const { vibrateMs } = a;\n if (vibrateMs) {\n navigator.vibrate(vibrateMs);\n }\n\n switch (a.kind) {\n case \"next-page\":\n const nextPageResult = this.createPageResult([]);\n this.onCompleted(nextPageResult);\n break;\n case \"play-video\":\n this.taskManager.execute(a.task);\n break;\n case \"play-audio\":\n this.taskManager.execute(a.task);\n break;\n case \"pause-video\":\n this.taskManager.pauseVideo();\n break;\n case \"pause-audio\":\n this.taskManager.pauseAudio();\n break;\n case \"mute-video\":\n this.taskManager.muteVideo();\n break;\n case \"un-mute-video\":\n this.taskManager.unMuteVideo();\n break;\n case \"submit-fact\":\n const submitFactResult = this.createPageResult([a.fact]);\n this.onCompleted(submitFactResult);\n break;\n case \"submit-form\":\n // TODO IMPLEMENT Collection of form-data // LOOP OVER ALL INPUTS\n const submitFormResult = this.createPageResult([]);\n this.onCompleted(submitFormResult);\n break;\n default:\n const _exhaustiveCheck: never = a;\n console.log(_exhaustiveCheck);\n }\n }\n\n appendYourself(parent: HTMLElement) {\n const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix);\n this.pageEntered = DTimestamp.now();\n this.eventLog.push(pageEnterEvent);\n this.elements.forEach((el) => {\n el.appendYourself(parent);\n });\n\n // this.components.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n // this.layoutComponents.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n }\n\n destroy() {\n this.taskManager.clear();\n }\n\n tick() {\n const prev = this.previousState;\n const curr = this.taskManager.getState();\n const diff = TaskState.getDiff(curr, prev);\n this.elements.forEach((element) => {\n element.updateState(diff);\n });\n }\n}\n","type BaseTask = {\r\n readonly blockAudio: boolean;\r\n readonly blockVideo: boolean;\r\n readonly blockResponseButton: boolean;\r\n readonly blockFormInput: boolean;\r\n readonly priority:\r\n | \"run-if-idle\"\r\n | \"follow-queue\"\r\n | \"replace-all\"\r\n | \"replace-current\"\r\n | \"replace-queue\"\r\n | \"prepend-to-queue\"\r\n | \"append-to-queue\";\r\n};\r\nexport type DelayTask = BaseTask & {\r\n readonly kind: \"delay-task\";\r\n readonly duration: number;\r\n};\r\n\r\nexport type PlayAudioTask = BaseTask & {\r\n readonly kind: \"play-audio-task\";\r\n readonly url: string;\r\n readonly audioId: string;\r\n};\r\n\r\nexport type PlayVideoTask = BaseTask & {\r\n readonly kind: \"play-video-task\";\r\n readonly url: string;\r\n readonly videoId: string;\r\n readonly loop?: boolean;\r\n readonly startAt?: number;\r\n readonly stopAt?: \"end\" | \"start\" | number;\r\n readonly volume?: number;\r\n};\r\nconst eq = (a: Task, b: Task) => {\r\n if (!b) {\r\n return false;\r\n }\r\n if (a.kind !== b.kind) {\r\n return false;\r\n }\r\n if (a.kind === \"delay-task\" && b.kind === \"delay-task\") {\r\n return a.duration === b.duration;\r\n }\r\n\r\n if (a.kind === \"play-audio-task\" && b.kind === \"play-audio-task\") {\r\n return a.url === b.url && a.audioId === b.audioId;\r\n }\r\n if (a.kind === \"play-video-task\" && b.kind === \"play-video-task\") {\r\n return (\r\n a.url === b.url &&\r\n a.videoId === b.videoId &&\r\n a.startAt === b.startAt &&\r\n a.stopAt === b.stopAt &&\r\n a.volume === b.volume\r\n );\r\n }\r\n return false;\r\n};\r\nconst deleteTaskList = (task: Task) => {\r\n return task.priority === \"replace-all\" || task.priority === \"replace-queue\";\r\n};\r\n\r\nconst shallRemoveCurrent = (task: Task) => {\r\n return task.priority === \"replace-current\" || task.priority === \"replace-all\";\r\n};\r\n\r\nconst notEq = (a: Task, b: Task) => !eq(a, b);\r\n\r\nconst is = (task: Task | undefined | false | null | {}): task is Task => {\r\n if (!task) {\r\n return false;\r\n }\r\n if (typeof task !== \"object\") {\r\n return false;\r\n }\r\n if (Array.isArray(task)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const Task = {\r\n eq,\r\n is,\r\n notEq,\r\n deleteTaskList,\r\n shallRemoveCurrent,\r\n};\r\nexport type Task = PlayVideoTask | PlayAudioTask | DelayTask;\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport { Task } from \"./task\";\nimport { DStyle, PStyle } from \"../Delement/DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { TaskState } from \"./task-state\";\n\nexport class TaskManager {\n private readonly TAG = \"[TaskManager]: \";\n private readonly videoElement = document.createElement(\"video\");\n private readonly audioElement = document.createElement(\"audio\");\n private readonly showConsoleLogs = false;\n private readonly defaultVideoStyles: PStyle = {\n height: 50,\n width: 100,\n top: 0,\n left: 0,\n };\n private videoStyles: PStyle;\n private runningTask: { task: Task; startedAt: DTimestamp } | false = false;\n private taskList: Array<Task> = [];\n private delayRef: number | false = false;\n\n clear() {\n if (this.showConsoleLogs) console.log(this.TAG + \"CLEAR\");\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n\n this.pauseVideo();\n this.pauseAudio();\n this.videoElement.removeAttribute(\"src\");\n this.videoElement.load();\n this.audioElement.removeAttribute(\"src\");\n this.audioElement.load();\n this.taskList = [];\n this.runningTask = false;\n this.hideVideo();\n }\n\n getState(): TaskState {\n const c = this.runningTask;\n const isGifMode = this.videoElement.loop;\n const audioIsPlaying = c && c.task.kind === \"play-audio-task\" && !this.audioElement.paused;\n const videoIsPlaying = c && c.task.kind === \"play-video-task\" && !this.videoElement.paused;\n const blockResponseButton = c && c.task.blockResponseButton;\n const blockAudio = c && c.task.blockAudio;\n const blockVideo = c && c.task.blockVideo;\n const blockFormInput = c && c.task.blockFormInput;\n const videoIsMuted = this.videoElement.muted;\n\n const videoIsAtTheEnd = this.videoElement.ended;\n let videoPlayState: TaskState[\"videoPlayState\"] = videoIsMuted ? \"paused-and-muted\" : \"paused\";\n\n if (videoIsPlaying) {\n videoPlayState = videoIsMuted ? \"playing-and-muted\" : \"playing\";\n }\n if (videoIsAtTheEnd) {\n videoPlayState = videoIsMuted ? \"ended-and-muted\" : \"ended\";\n }\n\n return {\n audioIsPlaying,\n videoPlayState,\n isGifMode,\n blockFormInput,\n blockResponseButton,\n blockAudio,\n blockVideo,\n };\n }\n\n constructor(\n private readonly mediaLayer: HTMLDivElement,\n private readonly scale: ScaleService,\n private readonly onError: (error: string) => void,\n ) {\n this.hideVideo();\n this.mediaLayer.appendChild(this.videoElement);\n this.mediaLayer.appendChild(this.audioElement);\n this.videoStyles = this.defaultVideoStyles;\n DStyle.normalize(this.videoElement);\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n\n this.videoElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n this.videoElement.onerror = (e) => {\n if (this.videoElement.src !== \"\") {\n onError(\"Error playing video: \" + this.videoElement.src);\n }\n };\n\n this.audioElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n }\n\n execute(task: Task): boolean {\n // console.log(\"EXECUTE TASK\" + task.kind);\n const curr = this.runningTask;\n // TODO Background-task should be handeled as its own kind or something.\n let isBackgroundTask = false;\n\n // Check if we should remove the current task.\n if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {\n this.pauseAudio();\n this.pauseVideo();\n this.runningTask = false;\n }\n\n if (!curr) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n } else if (Task.notEq(curr.task, task)) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n }\n\n if (task.priority === \"replace-all\" || task.priority === \"replace-queue\") {\n this.taskList = [];\n }\n\n // STARTING PLAY VIDEO\n if (task.kind === \"play-video-task\") {\n this.showVideo();\n // this.pauseAudio()\n this.loadVideo(task.url);\n if (task.loop) {\n this.videoElement.loop = true;\n isBackgroundTask = true;\n } else {\n this.videoElement.loop = false;\n }\n\n try {\n this.videoElement.play();\n } catch (e) {\n console.error(e);\n }\n }\n\n // STARTING PLAY AUDIO\n if (task.kind === \"play-audio-task\") {\n if (!this.videoElement.loop) {\n this.pauseVideo();\n }\n if (task.url !== this.audioElement.src) {\n this.audioElement.src = task.url;\n }\n this.audioElement.play();\n }\n\n if (task.kind === \"delay-task\") {\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n this.delayRef = window.setTimeout(() => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n }, task.duration);\n }\n\n if (isBackgroundTask) {\n const startNextTask = this.getNextTask();\n if (startNextTask) {\n this.execute(startNextTask);\n }\n }\n\n return true;\n }\n\n setVideoStyles(styles: PStyle) {\n this.videoStyles = { ...styles };\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n }\n\n autoPlaySequence(tasks: Task[]) {\n this.taskList = [...tasks];\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n if (next.kind === \"play-video-task\" && next.loop) {\n this.videoElement.loop = true;\n }\n }\n }\n\n loadVideo(url: string) {\n // console.log(\"LOAD VIDEO \" + !!url + \" \");\n if (this.videoElement.src !== url) {\n this.videoElement.src = url;\n }\n this.showVideo();\n }\n\n private playVideoElement() {\n this.videoElement\n .play()\n .then(() => {})\n .catch((e) => {\n console.log(e);\n this.onError(\"Error playing video.\");\n });\n }\n\n private showVideo() {\n this.videoElement.style.display = \"block\";\n }\n\n private hideVideo() {\n this.videoElement.style.display = \"none\";\n }\n\n pauseVideo() {\n try {\n if (!this.videoElement.loop) {\n this.videoElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing video.\");\n }\n }\n\n pauseAudio() {\n try {\n if (!this.audioElement.loop) {\n this.audioElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing audio.\");\n }\n }\n\n private getNextTask(): Task | false {\n // console.log(\"Getting next task.\");\n // console.log(this.taskList);\n const first = this.taskList.shift();\n return first ?? false;\n }\n\n muteVideo() {\n this.videoElement.muted = true;\n }\n\n unMuteVideo() {\n this.videoElement.muted = false;\n }\n}\n","import { SchemaDto } from \"./SchemaDto\";\nimport { DPlayer } from \"./dplayer\";\nimport { ScaleService } from \"./scale\";\nimport { Page } from \"../page/Page\";\nimport { TaskManager } from \"../page/task-manager\";\nimport { PageResult } from \"../page/page-result\";\nimport { SchemaResult } from \"./SchemaResult\";\nexport interface EngineLogger {\n info(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n}\n\nconst voidLogger: EngineLogger = {\n info: (message: string) => {},\n error: (message: string) => {},\n warn: (message: string) => {},\n};\n\nexport interface ISchemaEngine {\n onProgress(handler: (result: SchemaResult) => void): void;\n onFatalError(handler: (error: { message: string }) => void): void;\n setLogger(logger: EngineLogger): void;\n}\n\nexport class SchemaEngine implements ISchemaEngine {\n private readonly TAG = \"[ SCHEMA_ENGINE ] :\";\n private readonly scale: ScaleService;\n private readonly hostElement: HTMLDivElement;\n private readonly taskManager: TaskManager;\n private logger: EngineLogger = voidLogger;\n private readonly uiLayer: HTMLDivElement = document.createElement(\"div\");\n private readonly mediaLayer: HTMLDivElement = document.createElement(\"div\");\n private player: DPlayer;\n private currentPage: Page | false = false;\n private readonly tickerRef: number | false = false;\n constructor(\n hostEl: HTMLDivElement,\n private readonly height: number,\n private readonly width: number,\n private readonly schema: SchemaDto,\n ) {\n this.tickerRef = window.setInterval(() => {\n if (this.currentPage) {\n this.currentPage.tick();\n }\n }, 100);\n this.hostElement = hostEl;\n this.hostElement.appendChild(this.mediaLayer);\n this.hostElement.appendChild(this.uiLayer);\n this.scale = new ScaleService({\n baseHeight: schema.baseHeight,\n baseWidth: schema.baseWidth,\n containerWidth: this.width,\n containerHeight: this.height,\n });\n this.logger.info(this.TAG + \"Scale: \" + JSON.stringify(this.scale));\n this.player = new DPlayer(this.schema);\n this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {\n console.log(error);\n });\n\n this.styleSelf();\n this.handlePageCompleted = this.handlePageCompleted.bind(this);\n this.nextPage();\n }\n\n private handlePageCompleted(result: PageResult) {\n // 1 Save data from last page\n this.player.saveHistory(result);\n\n // 2 Emit progress\n const currentResults = this.player.getResults();\n const a: SchemaResult = {\n schemaId: this.schema.id,\n pagesLeft: currentResults.pagesLeft,\n predefinedFacts: currentResults.predefinedFacts,\n eventLog: currentResults.eventLog,\n answers: currentResults.answerFacts,\n };\n if (this._onProgress) {\n this._onProgress(a);\n }\n\n // 3. Next page\n this.nextPage();\n }\n\n private styleSelf() {\n this.hostElement.style.height = this.scale.pageHeight + \"px\";\n this.hostElement.style.width = this.scale.pageWidth + \"px\";\n this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? \"white\";\n this.hostElement.style.position = \"relative\";\n // this.hostElement.style.overflow = \"hidden\";\n const makeStatic = (div: HTMLDivElement) => {\n div.style.height = \"0px\";\n div.style.width = \"0px\";\n div.style.position = \"static\";\n };\n\n makeStatic(this.uiLayer);\n this.uiLayer.style.zIndex = \"10\";\n this.mediaLayer.style.zIndex = \"8\";\n makeStatic(this.mediaLayer);\n }\n\n private nextPage() {\n const nextPage = this.player.getNextPage();\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n\n // console.log(nextPage);\n if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {\n this.taskManager.setVideoStyles(nextPage.videoPlayer.style);\n }\n\n if (!nextPage) {\n // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??\n this.player = new DPlayer(this.schema);\n if (this.player.pagesLeft > 0) {\n this.nextPage();\n }\n return false;\n }\n\n const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {\n this.handlePageCompleted(result);\n });\n this.currentPage = newPage;\n newPage.appendYourself(this.uiLayer);\n return true;\n }\n\n destroy() {\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n }\n\n private _onProgress: ((result: SchemaResult) => void) | false = false;\n onProgress(handler: (result: SchemaResult) => void) {\n this._onProgress = handler;\n }\n\n private _onFatalError: ((error: { message: string }) => void) | false = false;\n onFatalError(handler: (error: { message: string }) => void): void {\n this._onFatalError = handler;\n }\n setLogger(logger: EngineLogger) {\n this.logger = logger;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,aAAN,MAAiB;AAAA,EACd,UAAwB,CAAC;AAAA,EAEjC,WAAwB;AACtB,UAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC;AAGhE,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,QAAoB;AAC/B,SAAK,QAAQ,KAAK,MAAM;AAAA,EAC1B;AACF;;;ACfO,IAAU;AAAA,CAAV,CAAUA,WAAV;AACE,EAAMA,OAAA,eAAe,CAAC,WAA2B;AACtD,UAAM,UAAU;AAChB,UAAM,YAAY,QAAQ,YAAY;AACtC,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,KAAK,IAAI,MAAM;AAC3B,QAAI,SAAS;AAEb,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAM,OAAO,IAAI,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,IAAI,MAAM,CAAC;AAC9D,gBAAU;AAAA,IACZ;AACA,WAAO;AAAA,EACT;AAEO,EAAMA,OAAA,iBAAiB,UAAMA,OAAA,cAAa,EAAE;AAE5C,EAAMA,OAAA,aAAa,CAA6B,KAAU,QAA6B;AAC5F,WAAO,IAAI,GAAG;AACd,WAAO;AAAA,EACT;AAEO,EAAMA,OAAA,YAAY,CAAC,KAAa,QAAgB;AACrD,WAAO,CAAC,UAAkB,SAAS,OAAO,SAAS;AAAA,EACrD;AACO,EAAMA,OAAA,aAAa,CAAC,WAAmB;AAC5C,WACE,WAAW,OAAO,qBAClB,WAAW,OAAO,qBAClB,WAAW;AAAA,EAEf;AAEO,EAAMA,OAAA,kBAAkB,CAAI,UAA+C;AAChF,WAAO,MAAM,SAAS;AAAA,EACxB;AAEO,EAAMA,OAAA,aAAa,CAAC,SAAgB;AACzC,YAAQ,IAAI,oDAAoD,IAAI;AAAA,EACtE;AAEO,EAAMA,OAAA,WAAW,CAAC,QAAgC,OAAO,QAAQ;AAEjE,EAAMA,OAAA,SAAS,CACpB,KACA,QACuC;AACvC,QAAI,KAACA,OAAA,UAAS,GAAG,GAAG;AAClB,aAAO;AAAA,IACT;AACA,WAAO,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG;AAAA,EACtD;AAEO,EAAMA,OAAA,WAAW,CAAC,QAAiD;AACxE,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEO,EAAMA,OAAA,SAAS,CAAC,QAAkC,OAAO,QAAQ;AAEjE,EAAMA,OAAA,SAAS,CAAC,SAAiC,SAAS;AAE1D,EAAMA,OAAA,UAAU,CAAC,SAAkC,SAAS;AAE5D,EAAMA,OAAA,YAAY,CAAC,QAA0B;AAClD,UAAM,UAAU,QAAQ;AACxB,UAAM,eAAe,QAAQ;AAC7B,WAAO,WAAW;AAAA,EACpB;AAEO,EAAMA,OAAA,UAAU,CAAC,QAAmD;AACzE,QAAI,KAACA,OAAA,QAAO,KAAK,MAAM,GAAG;AACxB,aAAO;AAAA,IACT;AACA,QAAI,OAAO,IAAI,SAAS,UAAU;AAChC,aAAO;AAAA,IACT;AACA,WAAO,IAAI,KAAK,SAAS;AAAA,EAC3B;AAEO,EAAMA,OAAA,WAAW,CAAC,QAA4C;AACnE,eAAOA,OAAA,QAAO,KAAK,OAAO;AAAA,EAC5B;AACO,EAAMA,OAAA,WAAW,CAAC,UAAoC;AAC3D,UAAMC,YAAW,OAAO,UAAU;AAClC,UAAM,SAAS,CAAC,OAAO,MAAM,KAAK;AAClC,WAAOA,aAAY;AAAA,EACrB;AAEO,EAAMD,OAAA,QAAQ,CAAC,eAAuB;AAC3C,WAAO,CAAC,UAAkB;AACxB,aAAO,KAAK,IAAI,OAAO,UAAU;AAAA,IACnC;AAAA,EACF;AAEO,EAAMA,OAAA,QAAQ,CAAC,eAAuB;AAC3C,WAAO,CAAC,UAAkB;AACxB,aAAO,KAAK,IAAI,OAAO,UAAU;AAAA,IACnC;AAAA,EACF;AAAA,GAjHe;;;ACGV,IAAU;AAAA,CAAV,CAAUE,eAAV;AA0CI,EAAMA,WAAA,WAAW,CAAC,WAAsB,UAA+B;AAC1E,QAAI,SAAkB;AACtB,YAAQ,UAAU,MAAM;AAAA,MACpB,KAAK;AACD,iBAAS,eAAe,WAAW,KAAK;AACxC;AAAA,MACJ,KAAK;AACD,iBAAS,eAAe,WAAW,KAAK;AACxC;AAAA,MACJ,KAAK;AACD,iBAAS,gBAAgB,WAAW,KAAK;AACzC;AAAA,MACJ;AACI,cAAM,QAAe;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,CAAC,WAA8B,UAAwC;AAC3F,QAAI,UAAU,KAAK,WAAW,KAAK,UAAU,IAAI,WAAW,GAAG;AAC3D,aAAO;AAAA,IACX;AACA,UAAM,YAAY,UAAU,IAAI,IAAI,CAACC,eAAc;AAC/C,aAAO,eAAeA,YAAW,KAAK;AAAA,IAC1C,CAAC;AAED,UAAM,gBAAgB,UAAU,KAAK,IAAI,CAACA,eAAc;AACpD,aAAO,eAAeA,YAAW,KAAK;AAAA,IAC1C,CAAC;AACD,UAAM,YAAY,UAAU,MAAM,MAAM,MAAM;AAC9C,UAAM,aAAa,cAAc,WAAW,KAAK,cAAc,KAAK,MAAM,MAAM;AAChF,WAAO,cAAc;AAAA,EACzB;AAEA,QAAM,iBAAiB,CAAC,WAA6B,UAAwC;AACzF,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB,UAAU,WAAW;AACtE,QAAI,CAAC,MAAM;AACP,aAAO;AAAA,IACX;AACA,QAAI,MAAM;AACV,YAAQ,UAAU,MAAM;AAAA,MACpB,KAAK;AACD,YAAI,KAAK,SAAS,gBAAgB;AAC9B,gBAAM,gBAAgB,WAAW,KAAK,KAAK;AAAA,QAC/C;AACA;AAAA,MACJ,KAAK;AACD,YAAI,KAAK,SAAS,eAAe;AAC7B,gBAAM,eAAe,WAAW,KAAK,KAAK;AAAA,QAC9C;AACA;AAAA,MACJ;AACI,cAAM,QAAe;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AAEO,EAAMD,WAAA,UAAU,CAAC,YAAqB;AACzC,WAAO,QAAQ,IAAI,WAAW,KAAK,QAAQ,KAAK,WAAW;AAAA,EAC/D;AAEA,QAAM,iBAAiB,CAAC,WAAuC,UAA2B;AACtF,UAAM,WAAW,UAAU;AAC3B,QAAI,SAAS;AACb,YAAQ,UAAU;AAAA,MACd,KAAK;AACD,iBAAS,UAAU,UAAU;AAC7B;AAAA,MACJ,KAAK;AACD,iBAAS,UAAU,UAAU;AAC7B;AAAA,MACJ,KAAK;AACD,iBAAS,UAAU,UAAU;AAC7B;AAAA,MACJ,KAAK;AACD,iBAAS,UAAU,UAAU;AAC7B;AAAA,MACJ;AACI,cAAM,QAAe;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,CAAC,WAAoB,UAA2B;AACpE,UAAM,KAAK,UAAU;AACrB,UAAM,iBAAiB,UAAU;AACjC,QAAI,SAAS;AACb,YAAQ,IAAI;AAAA,MACR,KAAK;AACD,iBAAS,UAAU;AACnB;AAAA,MACJ,KAAK;AACD,iBAAS,UAAU;AACnB;AAAA,MACJ,KAAK;AACD,iBAAS,QAAQ;AACjB;AAAA,MACJ,KAAK;AACD,iBAAS,SAAS;AAClB;AAAA,MACJ,KAAK;AACD,iBAAS,QAAQ;AACjB;AAAA,MACJ,KAAK;AACD,iBAAS,SAAS;AAClB;AAAA,MACJ;AACI,cAAM,QAAe;AAAA,IAC7B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,gBAAgB,CAAC,cAA0D;AAC7E,UAAM,SAAkC,CAAC;AACzC,YAAQ,UAAU,MAAM;AAAA,MACpB,KAAK;AACD,eAAO,KAAK,GAAG,UAAU,GAAG;AAC5B,eAAO,KAAK,GAAG,UAAU,IAAI;AAC7B;AAAA,MACJ,KAAK;AACD,eAAO,KAAK,SAAS;AACrB;AAAA,MACJ,KAAK;AACD,eAAO,KAAK,SAAS;AACrB;AAAA,MACJ;AACI,cAAM,WAAW,SAAS;AAAA,IAClC;AACA,WAAO;AAAA,EACX;AAEO,EAAMA,WAAA,yBAAyB,CAClC,cACkC;AAClC,UAAM,SAAkC,CAAC;AACzC,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC1B,gBAAU,QAAQ,CAAC,MAAM;AACrB,eAAO,KAAK,GAAG,cAAc,CAAC,CAAC;AAAA,MACnC,CAAC;AAAA,IACL,OAAO;AACH,aAAO,KAAK,GAAG,cAAc,SAAS,CAAC;AAAA,IAC3C;AACA,WAAO;AAAA,EACX;AAAA,GAzLa;;;ACSV,IAAU;AAAA,CAAV,CAAUE,UAAV;AAME,EAAMA,MAAA,UAAU,CAAC,SAAkC;AACxD,UAAM,kBAAkB,KAAK,IAAI,WAAW,KAAK,KAAK,KAAK,WAAW;AACtE,UAAM,eAAe,KAAK,UAAU,WAAW,KAAK,KAAK,UAAU,WAAW;AAC9E,WAAO,mBAAmB;AAAA,EAC5B;AAEO,EAAMA,MAAA,QAAQ,CAAC,MAAsB,UAAwC;AAClF,QAAI,KAAK,KAAK,WAAW,KAAK,KAAK,IAAI,WAAW,GAAG;AAEnD,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,KAAK,IAAI,CAAC,cAAc,UAAU,SAAS,WAAW,KAAK,CAAC;AAEpF,UAAM,aAAa,WAAW,WAAW,KAAK,WAAW,KAAK,MAAM,MAAM;AAE1E,UAAM,YAAY,KAAK,IAAI,IAAI,CAAC,cAAc,UAAU,SAAS,WAAW,KAAK,CAAC,EAAE,MAAM,MAAM,MAAM;AAEtG,WAAO,aAAa;AAAA,EACtB;AAAA,GAzBe;;;ACMV,IAAM,aAAN,MAAuB;AAAA,EAC5B,cAAc;AAAA,EAAC;AAAA,EAEf,SAAS,OAAqB,OAAkC;AAC9D,UAAM,SAA4B,CAAC;AACnC,UAAM,WAA0B,CAAC;AACjC,UAAM,QAAQ,CAAC,SAAS;AACtB,UAAI,KAAK,QAAQ,IAAI,GAAG;AACtB,eAAO,KAAK,EAAE,SAAS,iBAAiB,KAAK,GAAG,CAAC;AAAA,MACnD,WAAW,KAAK,MAAM,MAAM,KAAK,GAAG;AAClC,cAAM,QAAqB;AAAA,UACzB,iBAAiB,KAAK;AAAA,UACtB,gBAAgB,KAAK,MAAM;AAAA,UAC3B,YAAY,CAAC,GAAG,KAAK,SAAS;AAAA,QAChC;AACA,iBAAS,KAAK,KAAK;AAAA,MACrB;AAAA,IACF,CAAC;AACD,WAAO,EAAE,UAAU,OAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,MAAkB,OAAwB;AAE9C,WAAO,KAAK,MAAM,MAAM,KAAK;AAAA,EAC/B;AACF;;;AC1CO,IAAM,UAAN,MAAc;AAAA,EACX,gBAAuC,CAAC;AAAA,EACxC,WAAsB,CAAC;AAAA,EACvB,eAAe,oBAAI,IAAY;AAAA,EAC/B,mBAAmB,oBAAI,IAAY;AAAA,EACnC,YAAuB,CAAC;AAAA,EAChC,YAAY,QAAmB,CAAC,GAAG;AACjC,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAkB;AACzB,SAAK,WAAW,CAAC,GAAG,KAAK;AACzB,SAAK,YAAY,CAAC,GAAG,KAAK;AAC1B,SAAK,eAAe,oBAAI,IAAI;AAC5B,SAAK,mBAAmB,oBAAI,IAAI;AAChC,SAAK,gBAAgB,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EACpD;AAAA,EAEA,MAAuB;AACrB,UAAM,OAAO,KAAK,UAAU,MAAM;AAElC,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,OAAwB;AACtB,UAAM,OAAO,KAAK,UAAU,CAAC;AAC7B,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,eAAe,QAAyB;AACtC,UAAM,QAAQ,KAAK,UAAU,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM;AAC7D,QAAI,QAAQ,GAAG;AACb,aAAO;AAAA,IACT;AACA,SAAK,YAAY,KAAK,UAAU,MAAM,KAAK;AAC3C,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,KAAwB;AAClC,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAI,QAAQ,CAACC,SAAQ;AACnB,aAAK,aAAa,IAAIA,IAAG;AAAA,MAC3B,CAAC;AAAA,IACH,OAAO;AACL,WAAK,aAAa,IAAI,GAAG;AAAA,IAC3B;AACA,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,OAAkB;AACpC,SAAK,UAAU,QAAQ,GAAG,KAAK;AAAA,EACjC;AAAA,EAEA,eAAe,QAA2B;AACxC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,QAAQ,CAAC,OAAO;AACrB,aAAK,iBAAiB,IAAI,EAAE;AAAA,MAC9B,CAAC;AAAA,IACH,OAAO;AACL,WAAK,iBAAiB,IAAI,MAAM;AAAA,IAClC;AACA,SAAK,gBAAgB;AAAA,EAEvB;AAAA,EAEQ,kBAAkB;AACxB,SAAK,YAAY,KAAK,UAAU,OAAO,CAAC,MAAM;AAC5C,YAAM,OAAO,EAAE,QAAQ,CAAC;AACxB,YAAM,mBAAmB,CAAC,KAAK,KAAK,CAAC,QAAQ,KAAK,aAAa,IAAI,GAAG,CAAC;AACvE,YAAM,qBAAqB,CAAC,KAAK,iBAAiB,IAAI,EAAE,EAAE;AAC1D,aAAO,sBAAsB;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EACA,IAAI,UAAmB;AACrB,WAAO,KAAK,UAAU,WAAW;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,KAAK,cAAc;AAAA,EAC5B;AACF;;;ACzFO,IAAM,UAAN,MAAc;AAAA,EACF,WAA2B,CAAC;AAAA,EACrC,UAAU,IAAI,WAAW;AAAA,EACzB,aAAa,IAAI,WAAqC;AAAA,EACtD,UAAU,IAAI,QAAQ;AAAA,EACtB;AAAA,EACS;AAAA,EAEjB,YAAY,MAAmB;AAC7B,SAAK,OAAO;AACZ,UAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,SAAK,kBAAkB,KAAK,kBAAkB,CAAC,GAAG,KAAK,eAAe,IAAI,CAAC;AAC3E,SAAK,QAAQ,SAAS,KAAK;AAAA,EAC7B;AAAA,EAEA,UAAU,OAAgB;AACxB,SAAK,SAAS,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEA,YAAY,aAAyB;AAEnC,SAAK,QAAQ,aAAa,WAAW;AACrC,SAAK,SAAS,KAAK,GAAG,YAAY,QAAQ;AAE1C,UAAM,oBAAoB,KAAK,QAAQ,SAAS;AAChD,UAAM,kBAAkB,KAAK;AAC7B,UAAM,QAAQ,CAAC,GAAG,mBAAmB,GAAG,eAAe;AACvD,UAAM,SAAS,KAAK,WAAW,SAAS,KAAK,KAAK,OAAO,KAAK;AAE9D,UAAM,gBAAgB,OAAO;AAC7B,UAAM,UAAU,cAAc,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;AAE7D,YAAQ,QAAQ,CAAC,MAAM;AAErB,cAAQ,EAAE,MAAM;AAAA,QACd,KAAK;AACH,eAAK,QAAQ,eAAe,EAAE,MAAM;AACpC;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,eAAe,EAAE,OAAO;AACrC;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,YAAY,EAAE,MAAM;AACjC;AAAA,QACF;AACE,kBAAQ,IAAI,kBAAkB,CAAC;AAC/B,gBAAM,QAAe;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,aAAa;AACX,UAAM,YAAY,KAAK,QAAQ;AAC/B,UAAM,cAAc,KAAK,QAAQ,SAAS;AAC1C,UAAM,kBAAkB,KAAK;AAC7B,UAAM,WAAW,CAAC,GAAG,KAAK,QAAQ;AAElC,WAAO,EAAE,aAAa,iBAAiB,UAAU,UAAU;AAAA,EAC7D;AAAA,EAEA,eAAe,YAAoB;AACjC,SAAK,mBAAmB,UAAU;AAAA,EACpC;AAAA,EAEA,cAA+B;AAC7B,UAAM,OAAO,KAAK,QAAQ,IAAI;AAC9B,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEQ,mBAAmB,IAAY;AACrC,UAAM,MAAM,KAAK,KAAK,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC5D,QAAI,KAAK;AACP,WAAK,QAAQ,oBAAoB,CAAC,GAAG,IAAI,KAAK,CAAC;AAAA,IACjD,OAAO;AAAA,IAGP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAyB;AAC3B,WAAO,KAAK,KAAK,MAAM;AAAA,EACzB;AACF;;;ACvGO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACT,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EAEzB,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,aAAa,KAAK;AAAA,EAChC;AAAA,EACA,IAAI,YAAY;AACd,WAAO,KAAK,YAAY,KAAK;AAAA,EAC/B;AAAA,EAEQ,SAAS;AAAA,EAEA,cAAc,oBAAI,IAA6B;AAAA,EAEhE,YAAY,QAAoG;AAC9G,SAAK,aAAa,OAAO;AACzB,SAAK,YAAY,OAAO;AACxB,SAAK,kBAAkB,OAAO;AAC9B,SAAK,iBAAiB,OAAO;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,mBAAmB,QAA2C;AAC5D,SAAK,iBAAiB,OAAO;AAC7B,SAAK,kBAAkB,OAAO;AAC9B,SAAK,YAAY;AAAA,EACnB;AAAA,EACQ,cAAc;AACpB,UAAM,UAAU,MAAM,KAAK,KAAK,YAAY,KAAK,SAAS;AAC1D,UAAM,QAAQ,QAAQ,EAAE,QAAQ,KAAK,iBAAiB,OAAO,KAAK,eAAe,CAAC;AAClF,UAAM,aAAa,KAAK,UAAU;AAClC,SAAK,SAAS;AACd,QAAI,YAAY;AACd,WAAK,YAAY,QAAQ,CAAC,OAAO;AAC/B,WAAG,KAAK,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS,oBAA6C,cAAsB;AAE1E,SAAK,YAAY,IAAI,kBAAkB;AACvC,uBAAmB,KAAK,MAAM;AAC9B,WAAO,MAAM;AACX,WAAK,YAAY,OAAO,kBAAkB;AAAA,IAC5C;AAAA,EACF;AACF;AACO,IAAU;AAAA,CAAV,CAAUC,WAAV;AACE,EAAMA,OAAA,OAAO,CAAC,YAAoB,cAAsB;AAC7D,WAAO,CAAC,cAAiD;AACvD,YAAM,cAAc,UAAU,SAAS;AACvC,YAAM,aAAa,UAAU,QAAQ;AACrC,aAAO,KAAK,IAAI,aAAa,UAAU;AAAA,IACzC;AAAA,EACF;AAIO,EAAMA,OAAA,uBAAuB,CAAC,UAAkB;AACrD,WAAO,CAAC,UAAkB,QAAQ;AAAA,EACpC;AAAA,GAbe;;;ACrDV,IAAU;AAAA,CAAV,CAAUC,UAAV;AAmBE,EAAMA,MAAA,WAAW,CAAC,MAA4B,UAAgC;AACnF,UAAM,UACJ,OAAO,SAAS,WAAW,EAAE,OAAO,WAAW,OAAO,KAAK,IAAI;AACjE,WAAO,UAAU,SAAS,KAAK;AAAA,EACjC;AACA,QAAM,YAAY,CAAC,MAA8B,UAAgC;AAC/E,UAAM,eAAe,KAAK,IAAI,OAAO,IAAI;AACzC,QAAI,KAAK,UAAU,MAAM;AACvB,UAAI,KAAK,QAAQ,KAAK;AACpB,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,KAAK,MAAM,KAAK,QAAQ,YAAY;AACpD,YAAM,UAAU,KAAK,IAAI,SAAS,CAAC;AACnC,aAAQ,UAAU;AAAA,IACpB;AACA,WAAQ,KAAK,QAAQ;AAAA,EACvB;AAEO,EAAMA,MAAA,eAAe,CAAC,SAA0C;AACrE,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,UAAM,UAAyB;AAC/B,UAAM,WAA0B;AAChC,UAAM,aAAa,MAAM,OAAO,MAAM,OAAO;AAC7C,UAAM,cAAc,MAAM,OAAO,MAAM,QAAQ;AAC/C,WAAO,cAAc;AAAA,EACvB;AAAA,GApDe;;;ACwFV,IAAU;AAAA,CAAV,CAAUC,YAAV;AACL,QAAO,WAAW,MAAM;AACxB,QAAO,eAAe,KAAK;AACpB,EAAMA,QAAA,YAAY,CAAwB,OAAa;AAC5D,OAAG,MAAM,UAAU;AACnB,OAAG,MAAM,SAAS;AAClB,OAAG,MAAM,WAAW;AACpB,OAAG,MAAM,YAAY;AACrB,WAAO;AAAA,EACT;AAEO,EAAMA,QAAA,cAAc,CACzB,IACA,OACA,UACM;AAEN,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,QAAI,OAAO,WAAW,UAAU;AAC9B,SAAG,MAAM,SAAS,KAAK;AAAA,IACzB;AAEA,QAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,SAAG,MAAM,WAAW,KAAK,SAAS,UAAU,KAAK;AAAA,IACnD;AAEA,QAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,SAAG,MAAM,WAAW,KAAK,SAAS,UAAU,KAAK;AAAA,IACnD;AAEA,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,SAAG,MAAM,YAAY,KAAK,SAAS,WAAW,KAAK;AAAA,IACrD;AAEA,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,SAAG,MAAM,YAAY,KAAK,SAAS,WAAW,KAAK;AAAA,IACrD;AAEA,QAAI,WAAW;AACb,SAAG,MAAM,YAAY;AAAA,IACvB;AAEA,QAAI,KAAK;AACP,SAAG,MAAM,MAAM,KAAK,SAAS,KAAK,KAAK;AAAA,IACzC;AAEA,QAAI,aAAa;AACf,SAAG,MAAM,cAAc,KAAK,SAAS,aAAa,KAAK;AAAA,IACzD;AAEA,QAAI,cAAc;AAChB,SAAG,MAAM,eAAe,KAAK,SAAS,cAAc,KAAK;AAAA,IAC3D;AAEA,QAAI,YAAY;AACd,SAAG,MAAM,aAAa,KAAK,SAAS,YAAY,KAAK;AAAA,IACvD;AAEA,QAAI,eAAe;AACjB,SAAG,MAAM,gBAAgB,KAAK,SAAS,eAAe,KAAK;AAAA,IAC7D;AAEA,QAAI,UAAU;AACZ,SAAG,MAAM,WAAW;AAAA,IACtB;AACA,QAAI,gBAAgB;AAClB,SAAG,MAAM,iBAAiB;AAAA,IAC5B;AAEA,QAAI,cAAc;AAChB,SAAG,MAAM,eAAe;AAAA,IAC1B;AACA,QAAI,UAAU;AACZ,SAAG,MAAM,WAAW;AAAA,IACtB;AACA,QAAI,SAAS;AACX,SAAG,MAAM,UAAU;AAAA,IACrB;AACA,QAAI,eAAe;AACjB,SAAG,MAAM,gBAAgB;AAAA,IAC3B;AACA,QAAI,YAAY;AACd,SAAG,MAAM,aAAa;AAAA,IACxB;AAGA,QAAI,iBAAiB;AACnB,SAAG,MAAM,kBAAkB;AAAA,IAC7B;AAEA,QAAI,QAAQ;AACV,SAAG,MAAM,SAAS;AAAA,IACpB;AAEA,QAAI,WAAW;AACb,SAAG,MAAM,YAAY;AAAA,IACvB;AAEA,QAAI,WAAW;AACb,SAAG,MAAM,QAAQ;AAAA,IACnB;AACA,QAAI,WAAW;AACb,SAAG,MAAM,YAAY;AAAA,IACvB;AAEA,QAAI,aAAa;AACf,SAAG,MAAM,cAAc;AAAA,IACzB;AAEA,QAAI,aAAa;AACf,SAAG,MAAM,cAAc,KAAK,SAAS,aAAa,KAAK;AAAA,IACzD;AAEA,QAAI,YAAY;AACd,SAAG,MAAM,aAAa,aAAa;AAAA,IACrC;AAEA,QAAI,aAAa;AACf,SAAG,MAAM,cAAc;AAAA,IACzB;AAEA,QAAI,UAAU;AACZ,SAAG,MAAM,WAAW,KAAK,SAAS,UAAU,KAAK;AAAA,IACnD;AAEA,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,SAAG,MAAM,OAAO,IAAI;AAAA,IACtB;AAEA,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,SAAG,MAAM,SAAS,IAAI;AAAA,IACxB;AAEA,QAAI,KAAK,aAAa,MAAM,GAAG;AAC7B,SAAG,MAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAAA,IAC/C;AAEA,QAAI,KAAK,aAAa,KAAK,GAAG;AAC5B,SAAG,MAAM,QAAQ,KAAK,SAAS,OAAO,KAAK;AAAA,IAC7C;AAEA,QAAI,KAAK,aAAa,IAAI,GAAG;AAC3B,SAAG,MAAM,OAAO,KAAK,SAAS,MAAM,KAAK;AAAA,IAC3C;AAEA,QAAI,KAAK,aAAa,KAAK,GAAG;AAC5B,SAAG,MAAM,QAAQ,KAAK,SAAS,OAAO,KAAK;AAAA,IAC7C;AAEA,QAAI,KAAK,aAAa,MAAM,GAAG;AAC7B,SAAG,MAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAAA,IAC/C;AAEA,QAAI,KAAK,aAAa,GAAG,GAAG;AAC1B,SAAG,MAAM,MAAM,KAAK,SAAS,KAAK,KAAK;AAAA,IACzC;AAEA,QAAI,MAAM,SAAS,CAAC,GAAG;AACrB,SAAG,MAAM,SAAS,KAAK,SAAS,GAAG,KAAK;AAAA,IAC1C;AAEA,QAAI,SAAS,CAAC,GAAG;AACf,SAAG,MAAM,QAAQ,KAAK,SAAS,GAAG,KAAK;AAAA,IACzC;AAEA,QAAI,KAAK,aAAa,YAAY,GAAG;AACnC,SAAG,MAAM,eAAe,KAAK,SAAS,cAAc,KAAK;AAAA,IAC3D;AAEA,QAAI,eAAe;AACjB,SAAG,MAAM,gBAAgB,KAAK,SAAS,eAAe,KAAK;AAAA,IAC7D;AAEA,QAAI,QAAQ;AACV,SAAG,MAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAAA,IAC/C;AAEA,QAAI,SAAS;AACX,SAAG,MAAM,UAAU,KAAK,SAAS,SAAS,KAAK;AAAA,IACjD;AAEA,QAAI,SAAS,OAAO,GAAG;AACrB,SAAG,MAAM,UAAU,UAAU;AAAA,IAC/B;AAEA,QAAI,YAAY;AACd,SAAG,MAAM,aAAa;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAAA,GA9Oe;;;ACzFV,IAAU;AAAA,CAAV,CAAUC,gBAAV;AACI,EAAMA,YAAA,MAAM,MAAM,KAAK,IAAI;AAG3B,EAAMA,YAAA,WAAW,CAAC,GAAe,OAA2B;AAC/D,UAAM,MAAM,IAAI,KAAK,IAAI,EAAE;AAC3B,WAAO;AAAA,EACX;AAEO,EAAMA,YAAA,OAAO,CAAC,IAAgB,OAAyB;AAC1D,UAAM,QAAQ,KAAK,IAAI,EAAE;AACzB,UAAM,QAAQ,KAAK,IAAI,EAAE;AACzB,WAAO,KAAK,IAAI,QAAQ,KAAK;AAAA,EACjC;AAEO,EAAMA,YAAA,UAAU,CAAC,MAAwB;AAC5C,eAAOA,YAAA,MAAK,OAAGA,YAAA,KAAI,CAAC;AAAA,EACxB;AAAA,GAjBa;;;ACmBV,IAAM,YAAY;AAAA,EACvB,IAAI,CAAC,GAAc,MAAiB;AAClC,WACE,EAAE,mBAAmB,EAAE,kBACvB,EAAE,cAAc,EAAE,aAClB,EAAE,mBAAmB,EAAE,kBACvB,EAAE,mBAAmB,EAAE,kBACvB,EAAE,wBAAwB,EAAE,uBAC5B,EAAE,eAAe,EAAE,cACnB,EAAE,eAAe,EAAE;AAAA,EAEvB;AAAA,EAEA,SAAS,CAAC,MAAiB,SAA2C;AACpE,QAAI,SAAS,OAAO;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,CAAC;AAEd,QAAI,KAAK,mBAAmB,KAAK,gBAAgB;AAC/C,WAAK,iBAAiB,KAAK;AAAA,IAC7B;AACA,QAAI,KAAK,cAAc,KAAK,WAAW;AACrC,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,QAAI,KAAK,mBAAmB,KAAK,gBAAgB;AAC/C,WAAK,iBAAiB,KAAK;AAAA,IAC7B;AAEA,QAAI,KAAK,mBAAmB,KAAK,gBAAgB;AAC/C,WAAK,iBAAiB,KAAK;AAAA,IAC7B;AACA,QAAI,KAAK,wBAAwB,KAAK,qBAAqB;AACzD,WAAK,sBAAsB,KAAK;AAAA,IAClC;AACA,QAAI,KAAK,eAAe,KAAK,YAAY;AACvC,WAAK,aAAa,KAAK;AAAA,IACzB;AACA,QAAI,KAAK,eAAe,KAAK,YAAY;AACvC,WAAK,aAAa,KAAK;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACF;;;AC3BA,IAAM,UAAU,CAAC,SAAkC,SAAS;AAC5D,IAAM,SAAS,CAAC,SAAiC,SAAS;AAEnD,IAAe,WAAf,MAA+C;AAAA,EAU1C,YACW,IACA,KACA,OACnB;AAHmB;AACA;AACA;AAEnB,QAAI,IAAI,WAAW;AACjB,WAAK,GAAG,YAAY,IAAI;AAAA,IAC1B;AACA,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,YAAY,KAAK,UAAU,KAAK,IAAI;AACzC,SAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACnD,SAAK,eAAe,KAAK,aAAa,KAAK,IAAI;AAC/C,UAAM,EAAE,cAAc,aAAa,IAAI;AAEvC,QAAI,cAAc;AAChB,WAAK,GAAG,eAAe,MAAM;AAC3B,aAAK,SAAS,YAAY;AAAA,MAC5B;AAAA,IACF;AACA,QAAI,cAAc;AAChB,WAAK,GAAG,eAAe,MAAM;AAC3B,aAAK,SAAS,YAAY;AAAA,MAC5B;AAAA,IACF;AAEA,SAAK,UAAU;AAEf,QAAI,KAAK;AACP,WAAK,aAAa,KAAK,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA,EAvCQ,YAA+B;AAAA,EAE7B,YAA6B;AAAA,IACrC,UAAU,EAAE,OAAO,MAAM,OAAO,IAAI;AAAA,IACpC,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuCA,SAAS,OAAe;AACtB,SAAK,aAAa,KAAK;AAAA,EACzB;AAAA,EAEA,iCAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAe,QAA+C;AAC5D,WAAO,OAAO,KAAK,EAAE;AAAA,EAEvB;AAAA,EAEA,YAAY,OAAsB;AAChC,SAAK,mBAAmB,KAAK;AAAA,EAC/B;AAAA,EAEA,SAAS,OAAkB;AACzB,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,UAAU,QAAQ,OAAO,IAAI;AAC1C,SAAK,YAAY;AACjB,QAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,WAAK,mBAAmB,IAAI;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,mBAAmB,MAAqB;AAC9C,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,KAAK;AAET,QAAI,OAAO,cAAc,KAAK,kBAAkB;AAC9C,WAAK,SAAS,gBAAgB;AAAA,IAChC;AAEA,QAAI,QAAQ,cAAc,KAAK,iBAAiB;AAC9C,WAAK,SAAS,eAAe;AAAA,IAC/B;AAEA,QAAI,mBAAmB,aAAa,kBAAkB;AACpD,WAAK,SAAS,gBAAgB;AAAA,IAChC;AAEA,QAAI,mBAAmB,YAAY,iBAAiB;AAClD,WAAK,SAAS,eAAe;AAAA,IAC/B;AAEA,QAAI,mBAAmB,WAAW,gBAAgB;AAChD,WAAK,SAAS,cAAc;AAAA,IAC9B;AACA,QAAI,mBAAmB,uBAAuB,0BAA0B;AACtE,WAAK,SAAS,wBAAwB;AAAA,IACxC;AAEA,QAAI,mBAAmB,sBAAsB,yBAAyB;AACpE,WAAK,SAAS,uBAAuB;AAAA,IACvC;AAEA,QAAI,mBAAmB,qBAAqB,wBAAwB;AAClE,WAAK,SAAS,sBAAsB;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,YAAY;AAClB,SAAK,GAAG,MAAM,UAAU;AACxB,SAAK,GAAG,MAAM,SAAS;AACvB,SAAK,GAAG,MAAM,WAAW;AACzB,SAAK,GAAG,MAAM,YAAY;AAAA,EAC5B;AAAA,EAIU,aAAa,OAAwB;AAC7C,SAAK,YAAY,OAAO,OAAO,KAAK,WAAW,KAAK;AACpD,WAAO,YAAY,KAAK,IAAI,KAAK,WAAW,KAAK,MAAM,KAAK;AAC5D,WAAO,iBAAiB,KAAK,EAAE;AAAA,EACjC;AACF;;;AClLO,IAAM,OAAN,cAAmB,SAAyB;AAAA,EAChC,MAAM;AAAA,EACJ,eAAe,EAAE,GAAG,IAAI,GAAG,EAAE;AAAA,EACxC,WAA0C,CAAC;AAAA,EAEnD,qBAAqB,cAAmD;AACtE,SAAK,GAAG,UAAU,MAAM;AACtB,YAAM,SAAS,KAAK,IAAI;AACxB,UAAI,QAAQ;AACV,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AACA,SAAK,SAAS,QAAQ,CAAC,UAAU;AAC/B,YAAM,qBAAqB,YAAY;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,KAAc,OAAqB,UAAyC;AACtF,UAAM,IAAI,SAAS,cAAc,KAAK;AACtC,UAAM,GAAG,KAAK,KAAK;AACnB,SAAK,WAAW;AAEhB,SAAK,SAAS,QAAQ,CAAC,UAAU;AAC/B,YAAM,eAAe,KAAK,EAAE;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA,EACU,kBAAkB;AAC1B,SAAK,SAAS,QAAQ,CAAC,UAAU;AAC/B,cAAQ,IAAI,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AChCO,IAAM,OAAN,MAAM,cAAa,SAA2B;AAAA,EAenD,YACqB,KACV,cACT;AACA,UAAM,SAAS,cAAc,KAAK,GAAG,KAAK,YAAY;AAHnC;AACV;AAGT,UAAK,eAAe;AACpB,SAAK,aAAa,MAAK;AACvB,SAAK,MAAM,YAAY,MAAK,cAAc;AAC1C,SAAK,aAAa,gBAAgB,MAAK,cAAc;AACrD,SAAK,GAAG,UAAU;AAClB,SAAK,GAAG,MAAM,WAAW;AACzB,SAAK,SAAS,IAAI,KAAK;AAEvB,SAAK,YAAY,WAAW,IAAI;AAChC,SAAK,GAAG,SAAS,MAAM;AAAA,IAAC;AACxB,SAAK,GAAG,UAAU,MAAM;AAAA,IAAC;AACzB,SAAK,GAAG,MAAM,IAAI;AAClB,YAAQ,KAAK,KAAK,UAAU;AAAA,EAC9B;AAAA,EAhCA,OAAe,cAAc;AAAA,EACZ;AAAA,EACR;AAAA,EACA;AAAA,EACQ;AAAA,EACjB,qBAAqB,cAAyD;AAC5E,SAAK,GAAG,UAAU,MAAM;AACtB,YAAM,SAAS,KAAK,IAAI;AACxB,UAAI,QAAQ;AACV,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAsBA,MAAY;AAAA,EAAC;AACf;;;ACtCO,IAAM,QAAN,cAAoB,SAA+B;AAAA,EACxD,YAAY,KAAe,OAAqB;AAC9C,UAAM,SAAS,cAAc,GAAG,GAAG,KAAK,KAAK;AAAA,EAC/C;AAAA,EAEA,qBAAqB,cAAmD;AACtE,SAAK,GAAG,UAAU,MAAM;AACtB,YAAM,UAAU,KAAK,IAAI;AACzB,UAAI,SAAS;AACX,qBAAa,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;ACdO,IAAM,UAAN,cAAsB,SAA4B;AAAA,EACtC,MAAM;AAAA,EACJ,eAAe,EAAE,GAAG,IAAI,GAAG,GAAG;AAAA,EAEjD,YAAY,KAAiB,OAAqB;AAChD,UAAM,IAAI,SAAS,cAAc,QAAQ;AACzC,UAAM,GAAG,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,qBAAqB,cAAmD;AACtE,SAAK,GAAG,UAAU,MAAM;AACtB,YAAM,SAAS,KAAK,IAAI;AACxB,UAAI,QAAQ;AACV,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF;;;AChBO,IAAM,iBAAiB,CAAC,KAAkB,UAAuC;AACtF,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AACH,YAAM,WAAW,qBAAqB,KAAK,KAAK;AAChD,aAAO,IAAI,KAAK,KAAK,OAAO,QAAQ;AAAA,IACtC,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,KAAK;AAAA,IAC5B,KAAK;AACH,aAAO,IAAI,MAAM,KAAK,KAAK;AAAA,IAC7B,KAAK;AACH,aAAO,IAAI,QAAQ,KAAK,KAAK;AAAA,IAC/B;AACE,YAAM,QAAe;AACrB,YAAM,IAAI,MAAM,mDAAmD;AAAA,EAEvE;AACF;AAEA,IAAM,uBAAuB,CAAC,KAAc,UAA0C;AACpF,QAAM,WAAW,IAAI;AACrB,QAAM,WAA0C,CAAC;AACjD,WAAS,QAAQ,CAACC,SAAQ;AACxB,YAAQA,KAAI,MAAM;AAAA,MAChB,KAAK;AACH,cAAM,UAAU,IAAI,MAAMA,MAAK,KAAK;AACpC,iBAAS,KAAK,OAAO;AACrB;AAAA,MACF,KAAK;AACH,cAAM,WAAW,IAAI,KAAKA,MAAK,KAAK;AACpC,iBAAS,KAAK,QAAQ;AACtB;AAAA,MACF,KAAK;AACH,cAAM,YAAY,IAAI,QAAQA,MAAK,KAAK;AACxC,iBAAS,KAAK,SAAS;AACvB;AAAA,MACF;AACE,cAAM,QAAeA;AAAA,IACzB;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;ACjCO,IAAM,oBAAoB;AAAA,EAC/B,UAAU,CAAC,MAAiC;AAC1C,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,eAAe,EAAE,KAAK;AAAA,MAC/B,KAAK;AACH,eAAO,eAAe,EAAE,KAAK;AAAA,MAC/B,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,EAAE,KAAK,QAAQ,QAAQ,EAAE,KAAK;AAAA,MACvC,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,cAAM,mBAA0B;AAChC,eAAO;AAAA,IACX;AAAA,EACF;AACF;;;ACdO,IAAM,UAAU;AAAA,EACrB,YAAY,UAAkB,cAA0C;AACtE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,WAAW,IAAI;AAAA,MAC1B,SAAS,EAAE,UAAU,aAAa;AAAA,IACpC;AAAA,EACF;AAAA,EACA,UAAU,QAAgB,YAAsC;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,WAAW,IAAI;AAAA,MAC1B,SAAS,EAAE,QAAQ,WAAW;AAAA,IAChC;AAAA,EACF;AAAA,EACA,UAAU,QAAgB,YAAsC;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,WAAW,IAAI;AAAA,MAC1B,SAAS,EAAE,QAAQ,WAAW;AAAA,IAChC;AAAA,EACF;AAAA,EACA,YAAY,MAKW;AACrB,UAAM,EAAE,QAAQ,YAAY,QAAQ,aAAa,IAAI;AACrD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,WAAW,IAAI;AAAA,MAC1B,SAAS,EAAE,QAAQ,YAAY,QAAQ,aAAa;AAAA,IACtD;AAAA,EACF;AACF;;;ACjCO,IAAM,UAAU;AAAA,EACrB,aAAa,CAAC,OAAwB;AACpC,WAAO;AAAA,MACL,IAAI,OAAO;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,CAAC;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,iBAAiB,MAAM;AAAA,UAC3D,UAAU,CAAC;AAAA,UACX,WAAW,cAAc;AAAA,QAC3B;AAAA,MACF;AAAA,MAEA,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AACF;AAEO,IAAM,OAAN,MAAW;AAAA,EAShB,YACmB,KACA,aACA,cACA,aACjB;AAJiB;AACA;AACA;AACA;AAEjB,QAAI,SAAS,QAAQ,CAAC,OAAO;AAC3B,YAAM,UAAU,eAAe,IAAI,YAAY;AAG/C,cAAQ,qBAAqB,CAAC,WAAW;AACvC,aAAK,mBAAmB,MAAM;AAAA,MAChC,CAAC;AAED,WAAK,SAAS,KAAK,OAAO;AAAA,IAQ5B,CAAC;AAED,QAAI,IAAI,aAAa;AACnB,WAAK,YAAY,UAAU,IAAI,YAAY,OAAO;AAClD,UAAI,IAAI,YAAY,OAAO;AACzB,aAAK,YAAY,eAAe,IAAI,YAAY,KAAK;AAAA,MACvD;AAAA,IACF;AAEA,QAAI,IAAI,aAAa,QAAQ;AAC3B,WAAK,YAAY,iBAAiB,IAAI,YAAY;AAAA,IACpD;AAAA,EACF;AAAA,EA1CiB,MAAM;AAAA,EACf,WAAoC,CAAC;AAAA;AAAA;AAAA,EAGrC,cAA0B,WAAW,IAAI;AAAA,EACzC,gBAAmC;AAAA,EACnC,WAAW,IAAI,MAAe;AAAA,EAsC9B,iBAAiB,OAA2B;AAClD,UAAM,aAAa,WAAW,IAAI;AAClC,UAAM,WAAW,WAAW,KAAK,KAAK,aAAa,UAAU;AAC7D,UAAM,WAAW,QAAQ,UAAU,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM;AAC/D,SAAK,SAAS,KAAK,QAAQ;AAC3B,UAAM,WAAW,CAAC,GAAG,KAAK,QAAQ;AAClC,WAAO;AAAA,MACL,YAAY,KAAK,IAAI;AAAA,MACrB,QAAQ,KAAK,IAAI;AAAA,MACjB;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EACQ,mBAAmB,GAAsB;AAC/C,UAAM,QAAQ,QAAQ,YAAY;AAAA,MAChC,QAAQ,KAAK,IAAI;AAAA,MACjB,YAAY,KAAK,IAAI;AAAA,MACrB,QAAQ,EAAE;AAAA,MACV,cAAc,kBAAkB,SAAS,CAAC;AAAA,IAC5C,CAAC;AACD,SAAK,SAAS,KAAK,KAAK;AACxB,cAAU,QAAQ,GAAG;AACrB,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,WAAW;AACb,gBAAU,QAAQ,SAAS;AAAA,IAC7B;AAEA,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,cAAM,iBAAiB,KAAK,iBAAiB,CAAC,CAAC;AAC/C,aAAK,YAAY,cAAc;AAC/B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,QAAQ,EAAE,IAAI;AAC/B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,QAAQ,EAAE,IAAI;AAC/B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,WAAW;AAC5B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,UAAU;AAC3B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,YAAY;AAC7B;AAAA,MACF,KAAK;AACH,cAAM,mBAAmB,KAAK,iBAAiB,CAAC,EAAE,IAAI,CAAC;AACvD,aAAK,YAAY,gBAAgB;AACjC;AAAA,MACF,KAAK;AAEH,cAAM,mBAAmB,KAAK,iBAAiB,CAAC,CAAC;AACjD,aAAK,YAAY,gBAAgB;AACjC;AAAA,MACF;AACE,cAAM,mBAA0B;AAChC,gBAAQ,IAAI,gBAAgB;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,eAAe,QAAqB;AAClC,UAAM,iBAAiB,QAAQ,UAAU,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM;AACrE,SAAK,cAAc,WAAW,IAAI;AAClC,SAAK,SAAS,KAAK,cAAc;AACjC,SAAK,SAAS,QAAQ,CAAC,OAAO;AAC5B,SAAG,eAAe,MAAM;AAAA,IAC1B,CAAC;AAAA,EAQH;AAAA,EAEA,UAAU;AACR,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EAEA,OAAO;AACL,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,KAAK,YAAY,SAAS;AACvC,UAAM,OAAO,UAAU,QAAQ,MAAM,IAAI;AACzC,SAAK,SAAS,QAAQ,CAAC,YAAY;AACjC,cAAQ,YAAY,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;;;AC3JA,IAAM,KAAK,CAAC,GAAS,MAAY;AAC/B,MAAI,CAAC,GAAG;AACN,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,EAAE,MAAM;AACrB,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,gBAAgB,EAAE,SAAS,cAAc;AACtD,WAAO,EAAE,aAAa,EAAE;AAAA,EAC1B;AAEA,MAAI,EAAE,SAAS,qBAAqB,EAAE,SAAS,mBAAmB;AAChE,WAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;AAAA,EAC5C;AACA,MAAI,EAAE,SAAS,qBAAqB,EAAE,SAAS,mBAAmB;AAChE,WACE,EAAE,QAAQ,EAAE,OACZ,EAAE,YAAY,EAAE,WAChB,EAAE,YAAY,EAAE,WAChB,EAAE,WAAW,EAAE,UACf,EAAE,WAAW,EAAE;AAAA,EAEnB;AACA,SAAO;AACT;AACA,IAAM,iBAAiB,CAAC,SAAe;AACrC,SAAO,KAAK,aAAa,iBAAiB,KAAK,aAAa;AAC9D;AAEA,IAAM,qBAAqB,CAAC,SAAe;AACzC,SAAO,KAAK,aAAa,qBAAqB,KAAK,aAAa;AAClE;AAEA,IAAM,QAAQ,CAAC,GAAS,MAAY,CAAC,GAAG,GAAG,CAAC;AAE5C,IAAM,KAAK,CAAC,SAA6D;AACvE,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AClFO,IAAM,cAAN,MAAkB;AAAA,EAiEvB,YACmB,YACA,OACA,SACjB;AAHiB;AACA;AACA;AAEjB,SAAK,UAAU;AACf,SAAK,WAAW,YAAY,KAAK,YAAY;AAC7C,SAAK,WAAW,YAAY,KAAK,YAAY;AAC7C,SAAK,cAAc,KAAK;AACxB,WAAO,UAAU,KAAK,YAAY;AAClC,WAAO,YAAY,KAAK,cAAc,KAAK,aAAa,KAAK,MAAM,KAAK;AAExE,SAAK,aAAa,UAAU,MAAM;AAChC,YAAM,OAAO,KAAK,YAAY;AAC9B,UAAI,MAAM;AACR,aAAK,QAAQ,IAAI;AAAA,MACnB,OAAO;AACL,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AACA,SAAK,aAAa,UAAU,CAAC,MAAM;AACjC,UAAI,KAAK,aAAa,QAAQ,IAAI;AAChC,gBAAQ,0BAA0B,KAAK,aAAa,GAAG;AAAA,MACzD;AAAA,IACF;AAEA,SAAK,aAAa,UAAU,MAAM;AAChC,YAAM,OAAO,KAAK,YAAY;AAC9B,UAAI,MAAM;AACR,aAAK,QAAQ,IAAI;AAAA,MACnB,OAAO;AACL,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAlGiB,MAAM;AAAA,EACN,eAAe,SAAS,cAAc,OAAO;AAAA,EAC7C,eAAe,SAAS,cAAc,OAAO;AAAA,EAC7C,kBAAkB;AAAA,EAClB,qBAA6B;AAAA,IAC5C,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACQ;AAAA,EACA,cAA6D;AAAA,EAC7D,WAAwB,CAAC;AAAA,EACzB,WAA2B;AAAA,EAEnC,QAAQ;AACN,QAAI,KAAK;AAAiB,cAAQ,IAAI,KAAK,MAAM,OAAO;AACxD,QAAI,OAAO,KAAK,aAAa,UAAU;AACrC,aAAO,aAAa,KAAK,QAAQ;AAAA,IACnC;AAEA,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,aAAa,gBAAgB,KAAK;AACvC,SAAK,aAAa,KAAK;AACvB,SAAK,aAAa,gBAAgB,KAAK;AACvC,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,CAAC;AACjB,SAAK,cAAc;AACnB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAsB;AACpB,UAAM,IAAI,KAAK;AACf,UAAM,YAAY,KAAK,aAAa;AACpC,UAAM,iBAAiB,KAAK,EAAE,KAAK,SAAS,qBAAqB,CAAC,KAAK,aAAa;AACpF,UAAM,iBAAiB,KAAK,EAAE,KAAK,SAAS,qBAAqB,CAAC,KAAK,aAAa;AACpF,UAAM,sBAAsB,KAAK,EAAE,KAAK;AACxC,UAAM,aAAa,KAAK,EAAE,KAAK;AAC/B,UAAM,aAAa,KAAK,EAAE,KAAK;AAC/B,UAAM,iBAAiB,KAAK,EAAE,KAAK;AACnC,UAAM,eAAe,KAAK,aAAa;AAEvC,UAAM,kBAAkB,KAAK,aAAa;AAC1C,QAAI,iBAA8C,eAAe,qBAAqB;AAEtF,QAAI,gBAAgB;AAClB,uBAAiB,eAAe,sBAAsB;AAAA,IACxD;AACA,QAAI,iBAAiB;AACnB,uBAAiB,eAAe,oBAAoB;AAAA,IACtD;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAsCA,QAAQ,MAAqB;AAE3B,UAAM,OAAO,KAAK;AAElB,QAAI,mBAAmB;AAGvB,QAAI,QAAQ,KAAK,mBAAmB,IAAI,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI,GAAG;AACxE,WAAK,WAAW;AAChB,WAAK,WAAW;AAChB,WAAK,cAAc;AAAA,IACrB;AAEA,QAAI,CAAC,MAAM;AACT,WAAK,cAAc,EAAE,WAAW,WAAW,IAAI,GAAG,KAAW;AAAA,IAC/D,WAAW,KAAK,MAAM,KAAK,MAAM,IAAI,GAAG;AACtC,WAAK,cAAc,EAAE,WAAW,WAAW,IAAI,GAAG,KAAW;AAAA,IAC/D;AAEA,QAAI,KAAK,aAAa,iBAAiB,KAAK,aAAa,iBAAiB;AACxE,WAAK,WAAW,CAAC;AAAA,IACnB;AAGA,QAAI,KAAK,SAAS,mBAAmB;AACnC,WAAK,UAAU;AAEf,WAAK,UAAU,KAAK,GAAG;AACvB,UAAI,KAAK,MAAM;AACb,aAAK,aAAa,OAAO;AACzB,2BAAmB;AAAA,MACrB,OAAO;AACL,aAAK,aAAa,OAAO;AAAA,MAC3B;AAEA,UAAI;AACF,aAAK,aAAa,KAAK;AAAA,MACzB,SAAS,GAAG;AACV,gBAAQ,MAAM,CAAC;AAAA,MACjB;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,mBAAmB;AACnC,UAAI,CAAC,KAAK,aAAa,MAAM;AAC3B,aAAK,WAAW;AAAA,MAClB;AACA,UAAI,KAAK,QAAQ,KAAK,aAAa,KAAK;AACtC,aAAK,aAAa,MAAM,KAAK;AAAA,MAC/B;AACA,WAAK,aAAa,KAAK;AAAA,IACzB;AAEA,QAAI,KAAK,SAAS,cAAc;AAC9B,UAAI,OAAO,KAAK,aAAa,UAAU;AACrC,eAAO,aAAa,KAAK,QAAQ;AAAA,MACnC;AACA,WAAK,WAAW,OAAO,WAAW,MAAM;AACtC,cAAM,OAAO,KAAK,YAAY;AAC9B,YAAI,MAAM;AACR,eAAK,QAAQ,IAAI;AAAA,QACnB,OAAO;AACL,eAAK,cAAc;AAAA,QACrB;AAAA,MACF,GAAG,KAAK,QAAQ;AAAA,IAClB;AAEA,QAAI,kBAAkB;AACpB,YAAM,gBAAgB,KAAK,YAAY;AACvC,UAAI,eAAe;AACjB,aAAK,QAAQ,aAAa;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,QAAgB;AAC7B,SAAK,cAAc,EAAE,GAAG,OAAO;AAC/B,WAAO,YAAY,KAAK,cAAc,KAAK,aAAa,KAAK,MAAM,KAAK;AAAA,EAC1E;AAAA,EAEA,iBAAiB,OAAe;AAC9B,SAAK,WAAW,CAAC,GAAG,KAAK;AACzB,UAAM,OAAO,KAAK,YAAY;AAC9B,QAAI,MAAM;AACR,WAAK,QAAQ,IAAI;AACjB,UAAI,KAAK,SAAS,qBAAqB,KAAK,MAAM;AAChD,aAAK,aAAa,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,KAAa;AAErB,QAAI,KAAK,aAAa,QAAQ,KAAK;AACjC,WAAK,aAAa,MAAM;AAAA,IAC1B;AACA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,mBAAmB;AACzB,SAAK,aACF,KAAK,EACL,KAAK,MAAM;AAAA,IAAC,CAAC,EACb,MAAM,CAAC,MAAM;AACZ,cAAQ,IAAI,CAAC;AACb,WAAK,QAAQ,sBAAsB;AAAA,IACrC,CAAC;AAAA,EACL;AAAA,EAEQ,YAAY;AAClB,SAAK,aAAa,MAAM,UAAU;AAAA,EACpC;AAAA,EAEQ,YAAY;AAClB,SAAK,aAAa,MAAM,UAAU;AAAA,EACpC;AAAA,EAEA,aAAa;AACX,QAAI;AACF,UAAI,CAAC,KAAK,aAAa,MAAM;AAC3B,aAAK,aAAa,MAAM;AAAA,MAC1B;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,IAAI,CAAC;AACb,WAAK,QAAQ,sBAAsB;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,aAAa;AACX,QAAI;AACF,UAAI,CAAC,KAAK,aAAa,MAAM;AAC3B,aAAK,aAAa,MAAM;AAAA,MAC1B;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,IAAI,CAAC;AACb,WAAK,QAAQ,sBAAsB;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,cAA4B;AAGlC,UAAM,QAAQ,KAAK,SAAS,MAAM;AAClC,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,YAAY;AACV,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA,EAEA,cAAc;AACZ,SAAK,aAAa,QAAQ;AAAA,EAC5B;AACF;;;ACzPA,IAAM,aAA2B;AAAA,EAC/B,MAAM,CAAC,YAAoB;AAAA,EAAC;AAAA,EAC5B,OAAO,CAAC,YAAoB;AAAA,EAAC;AAAA,EAC7B,MAAM,CAAC,YAAoB;AAAA,EAAC;AAC9B;AAQO,IAAM,eAAN,MAA4C;AAAA,EAWjD,YACE,QACiB,QACA,OACA,QACjB;AAHiB;AACA;AACA;AAEjB,SAAK,YAAY,OAAO,YAAY,MAAM;AACxC,UAAI,KAAK,aAAa;AACpB,aAAK,YAAY,KAAK;AAAA,MACxB;AAAA,IACF,GAAG,GAAG;AACN,SAAK,cAAc;AACnB,SAAK,YAAY,YAAY,KAAK,UAAU;AAC5C,SAAK,YAAY,YAAY,KAAK,OAAO;AACzC,SAAK,QAAQ,IAAI,aAAa;AAAA,MAC5B,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO;AAAA,MAClB,gBAAgB,KAAK;AAAA,MACrB,iBAAiB,KAAK;AAAA,IACxB,CAAC;AACD,SAAK,OAAO,KAAK,KAAK,MAAM,YAAY,KAAK,UAAU,KAAK,KAAK,CAAC;AAClE,SAAK,SAAS,IAAI,QAAQ,KAAK,MAAM;AACrC,SAAK,cAAc,IAAI,YAAY,KAAK,YAAY,KAAK,OAAO,CAAC,UAAU;AACzE,cAAQ,IAAI,KAAK;AAAA,IACnB,CAAC;AAED,SAAK,UAAU;AACf,SAAK,sBAAsB,KAAK,oBAAoB,KAAK,IAAI;AAC7D,SAAK,SAAS;AAAA,EAChB;AAAA,EAvCiB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACT,SAAuB;AAAA,EACd,UAA0B,SAAS,cAAc,KAAK;AAAA,EACtD,aAA6B,SAAS,cAAc,KAAK;AAAA,EAClE;AAAA,EACA,cAA4B;AAAA,EACnB,YAA4B;AAAA,EAgCrC,oBAAoB,QAAoB;AAE9C,SAAK,OAAO,YAAY,MAAM;AAG9B,UAAM,iBAAiB,KAAK,OAAO,WAAW;AAC9C,UAAM,IAAkB;AAAA,MACtB,UAAU,KAAK,OAAO;AAAA,MACtB,WAAW,eAAe;AAAA,MAC1B,iBAAiB,eAAe;AAAA,MAChC,UAAU,eAAe;AAAA,MACzB,SAAS,eAAe;AAAA,IAC1B;AACA,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,CAAC;AAAA,IACpB;AAGA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,YAAY;AAClB,SAAK,YAAY,MAAM,SAAS,KAAK,MAAM,aAAa;AACxD,SAAK,YAAY,MAAM,QAAQ,KAAK,MAAM,YAAY;AACtD,SAAK,YAAY,MAAM,kBAAkB,KAAK,OAAO,mBAAmB;AACxE,SAAK,YAAY,MAAM,WAAW;AAElC,UAAM,aAAa,CAAC,QAAwB;AAC1C,UAAI,MAAM,SAAS;AACnB,UAAI,MAAM,QAAQ;AAClB,UAAI,MAAM,WAAW;AAAA,IACvB;AAEA,eAAW,KAAK,OAAO;AACvB,SAAK,QAAQ,MAAM,SAAS;AAC5B,SAAK,WAAW,MAAM,SAAS;AAC/B,eAAW,KAAK,UAAU;AAAA,EAC5B;AAAA,EAEQ,WAAW;AACjB,UAAM,WAAW,KAAK,OAAO,YAAY;AACzC,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,QAAQ;AACzB,WAAK,QAAQ,YAAY;AAAA,IAC3B;AAGA,QAAI,YAAY,SAAS,eAAe,SAAS,YAAY,OAAO;AAClE,WAAK,YAAY,eAAe,SAAS,YAAY,KAAK;AAAA,IAC5D;AAEA,QAAI,CAAC,UAAU;AAEb,WAAK,SAAS,IAAI,QAAQ,KAAK,MAAM;AACrC,UAAI,KAAK,OAAO,YAAY,GAAG;AAC7B,aAAK,SAAS;AAAA,MAChB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,IAAI,KAAK,UAAU,KAAK,aAAa,KAAK,OAAO,CAAC,WAAW;AAC3E,WAAK,oBAAoB,MAAM;AAAA,IACjC,CAAC;AACD,SAAK,cAAc;AACnB,YAAQ,eAAe,KAAK,OAAO;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,QAAQ;AACzB,WAAK,QAAQ,YAAY;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,cAAwD;AAAA,EAChE,WAAW,SAAyC;AAClD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgE;AAAA,EACxE,aAAa,SAAqD;AAChE,SAAK,gBAAgB;AAAA,EACvB;AAAA,EACA,UAAU,QAAsB;AAC9B,SAAK,SAAS;AAAA,EAChB;AACF;","names":["DUtil","isNumber","Condition","condition","Rule","tag","Scale","DCss","DStyle","DTimestamp","dto"]}
1
+ {"version":3,"sources":["../src/public-api.ts","../src/engine/history-que.ts","../src/utils/DUtil.ts","../src/rules/condition.ts","../src/rules/rule.ts","../src/rules/rule-engine.ts","../src/engine/next-que.ts","../src/engine/dplayer.ts","../src/engine/scale.ts","../src/Delement/css.ts","../src/Delement/DStyle.ts","../src/common/DTimestamp.ts","../src/page/task-state.ts","../src/Delement/DElement.ts","../src/Delement/Ddiv.ts","../src/Delement/DImg.ts","../src/Delement/DText.ts","../src/Delement/DButton.ts","../src/Delement/element-factory.ts","../src/Delement/button-click-action.ts","../src/events/mq-events.ts","../src/page/Page.ts","../src/page/task.ts","../src/page/task-manager.ts","../src/engine/SchemaEngine.ts"],"sourcesContent":["export * from \"./engine/SchemaResult\";\nexport * from \"./engine/SchemaEngine\";\nexport * from \"./engine/SchemaDto\";\nexport * from \"./engine/page-que-ruleengine-action\";\nexport * from \"./rules/rule\";\nexport * from \"./rules/fact\";\nexport * from \"./rules/rule-engine\";\nexport * from \"./rules/condition\";\nexport * from \"./utils/DUtil\";\n// export * from \"./utils/ID\";\n\nexport * from \"./events/mq-events\";\n\n// ELEMENTS\nexport * from \"./Delement/css\";\nexport * from \"./Delement/DStyle\";\nexport * from \"./Delement/DImg\";\nexport * from \"./Delement/DText\";\nexport * from \"./Delement/DButton\";\nexport * from \"./Delement/Ddiv\";\nexport * from \"./Delement/button-click-action\";\nexport * from \"./Delement/DElement\";\nexport * from \"./Delement/DElement.dto\";\nexport { PageDto } from \"./page/Page\";\nexport * from \"./page/task\";\n","import { Fact } from \"../rules/fact\";\r\nimport { PageResult } from \"../page/page-result\";\r\n\r\nexport class HistoryQue {\r\n private history: PageResult[] = [];\r\n\r\n getFacts(): Array<Fact> {\r\n const answers = this.history.map((h) => h.collectedFacts).flat(1);\r\n // const facts = answers.map((a) => a.fact);\r\n // TODO FIND LATEST FACT (answer) if have multiple.\r\n return answers;\r\n }\r\n\r\n addToHistory(result: PageResult) {\r\n this.history.push(result);\r\n }\r\n}\r\n","// export type RandomObjectId = string & { randomObjectId: true };\r\nexport namespace DUtil {\r\n export const randomString = (length: number): string => {\r\n const letters = \"abcdefghijklmnopqrstuvxyz\";\r\n const uppercase = letters.toUpperCase();\r\n const all = letters + uppercase;\r\n const abs = Math.abs(length);\r\n let result = \"\";\r\n\r\n for (let i = 0; i < abs; i++) {\r\n const char = all.charAt(Math.floor(Math.random() * all.length));\r\n result += char;\r\n }\r\n return result;\r\n };\r\n\r\n export const randomObjectId = () => randomString(32);\r\n\r\n export const deleteProp = <Obj, Key extends keyof Obj>(obj: Obj, key: Key): Omit<Obj, Key> => {\r\n delete obj[key];\r\n return obj;\r\n };\r\n\r\n export const isInRange = (min: number, max: number) => {\r\n return (value: number) => value >= min && value <= max;\r\n };\r\n export const isInfinity = (number: number) => {\r\n return (\r\n number === Number.POSITIVE_INFINITY ||\r\n number === Number.NEGATIVE_INFINITY ||\r\n number === Infinity\r\n );\r\n };\r\n export type NonEmptyArray<T> = [T, ...T[]];\r\n export const isNonEmptyArray = <T>(array: Array<T>): array is NonEmptyArray<T> => {\r\n return array.length > 0;\r\n };\r\n\r\n export const neverCheck = (args: never) => {\r\n console.log(\"OOPS: This value slipped through the never-check\", args);\r\n };\r\n\r\n export const isString = (str: unknown): str is string => typeof str === \"string\";\r\n\r\n export const hasKey = <T extends string>(\r\n obj: unknown,\r\n key: T,\r\n ): obj is Record<typeof key, unknown> => {\r\n if (!isRecord(obj)) {\r\n return false;\r\n }\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n };\r\n\r\n export const isRecord = (obj: unknown): obj is Record<string, unknown> => {\r\n if (!obj) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return false;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (obj === null) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n export const isBool = (obj?: boolean): obj is boolean => typeof obj === \"boolean\";\r\n\r\n export const isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\n export const isFalse = (bool?: boolean): bool is false => bool === false;\r\n\r\n export const isDefined = (obj: unknown): boolean => {\r\n const notNull = obj !== null;\r\n const notUndefined = obj !== undefined;\r\n return notNull && notUndefined;\r\n };\r\n\r\n export const hasKind = (obj: unknown): obj is { readonly kind: string } => {\r\n if (!hasKey(obj, \"kind\")) {\r\n return false;\r\n }\r\n if (typeof obj.kind !== \"string\") {\r\n return false;\r\n }\r\n return obj.kind.length > 0;\r\n };\r\n\r\n export const hasValue = (obj: unknown): obj is { value: unknown } => {\r\n return hasKey(obj, \"value\");\r\n };\r\n export const isNumber = (value?: number): value is number => {\r\n const isNumber = typeof value === \"number\";\r\n const notNaN = !Number.isNaN(value);\r\n return isNumber && notNaN;\r\n };\r\n\r\n export const maxFn = (upperLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, upperLimit);\r\n };\r\n };\r\n\r\n export const minFn = (lowerLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, lowerLimit);\r\n };\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\nexport type Condition = Condition.String | Condition.Numeric | Condition.Complex;\r\n\r\nexport namespace Condition {\r\n export type StringOperator = \"eq\" | \"not-eq\" | \"longer-then\" | \"shorter-then\";\r\n\r\n export type NumericOperator =\r\n | \"eq\"\r\n | \"not-eq\"\r\n | \"greater-then\"\r\n | \"less-then\"\r\n | \"greater-then-inclusive\"\r\n | \"less-then-inclusive\";\r\n\r\n export interface Numeric {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"numeric-condition\";\r\n readonly operator: NumericOperator;\r\n readonly value: number;\r\n }\r\n export interface String {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"string-condition\";\r\n readonly operator: StringOperator;\r\n readonly value: string;\r\n }\r\n\r\n export interface Complex {\r\n readonly kind: \"complex-condition\";\r\n readonly name: string;\r\n readonly all: ReadonlyArray<Condition.Simple>;\r\n readonly some: ReadonlyArray<Condition.Simple>;\r\n }\r\n\r\n export type Simple = Condition.String | Condition.Numeric;\r\n\r\n /**\r\n * An empty condition will evaluate to false,\r\n * @param condition: Condition.Any\r\n * @param facts\r\n */\r\n export const evaluate = (condition: Condition, facts: ReadonlyArray<Fact>) => {\r\n let result: boolean = false;\r\n switch (condition.kind) {\r\n case \"string-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"numeric-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"complex-condition\":\r\n result = evaluateComplex(condition, facts);\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateComplex = (condition: Condition.Complex, facts: ReadonlyArray<Fact>): boolean => {\r\n if (condition.some.length === 0 && condition.all.length === 0) {\r\n return false;\r\n }\r\n const allSolved = condition.all.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n\r\n const someEvaluated = condition.some.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n const allResult = allSolved.every(DUtil.isTrue);\r\n const someResult = someEvaluated.length === 0 || someEvaluated.some(DUtil.isTrue);\r\n return someResult && allResult;\r\n };\r\n\r\n const evaluateSimple = (condition: Condition.Simple, facts: ReadonlyArray<Fact>): boolean => {\r\n const fact = facts.find((f) => f.referenceId === condition.referenceId);\r\n if (!fact) {\r\n return false;\r\n }\r\n let res = false;\r\n switch (condition.kind) {\r\n case \"numeric-condition\":\r\n if (fact.kind === \"numeric-fact\") {\r\n res = evaluateNumeric(condition, fact.value);\r\n }\r\n break;\r\n case \"string-condition\":\r\n if (fact.kind === \"string-fact\") {\r\n res = evaluateString(condition, fact.value);\r\n }\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return res;\r\n };\r\n\r\n export const isEmpty = (complex: Complex) => {\r\n return complex.all.length === 0 && complex.some.length === 0;\r\n };\r\n\r\n const evaluateString = (condition: Readonly<Condition.String>, value: string): boolean => {\r\n const operator = condition.operator;\r\n let result = false;\r\n switch (operator) {\r\n case \"eq\":\r\n result = condition.value === value;\r\n break;\r\n case \"not-eq\":\r\n result = condition.value !== value;\r\n break;\r\n case \"shorter-then\":\r\n result = condition.value !== value;\r\n break;\r\n case \"longer-then\":\r\n result = condition.value !== value;\r\n break;\r\n default:\r\n const check: never = operator;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateNumeric = (condition: Numeric, value: number): boolean => {\r\n const op = condition.operator;\r\n const conditionValue = condition.value;\r\n let result = false;\r\n switch (op) {\r\n case \"eq\":\r\n result = value === conditionValue;\r\n break;\r\n case \"not-eq\":\r\n result = value !== conditionValue;\r\n break;\r\n case \"greater-then\":\r\n result = value > conditionValue;\r\n break;\r\n case \"greater-then-inclusive\":\r\n result = value >= conditionValue;\r\n break;\r\n case \"less-then\":\r\n result = value < conditionValue;\r\n break;\r\n case \"less-then-inclusive\":\r\n result = value <= conditionValue;\r\n break;\r\n default:\r\n const check: never = op;\r\n }\r\n return result;\r\n };\r\n\r\n const _getAllSimple = (condition: Condition): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n switch (condition.kind) {\r\n case \"complex-condition\":\r\n simple.push(...condition.all);\r\n simple.push(...condition.some);\r\n break;\r\n case \"numeric-condition\":\r\n simple.push(condition);\r\n break;\r\n case \"string-condition\":\r\n simple.push(condition);\r\n break;\r\n default:\r\n DUtil.neverCheck(condition);\r\n }\r\n return simple;\r\n };\r\n\r\n export const getAllSimpleConditions = (\r\n condition: Condition | Array<Condition>\r\n ): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n if (Array.isArray(condition)) {\r\n condition.forEach((c) => {\r\n simple.push(..._getAllSimple(c));\r\n });\r\n } else {\r\n simple.push(..._getAllSimple(condition));\r\n }\r\n return simple;\r\n };\r\n}\r\n","import { Condition } from \"./condition\";\r\nimport { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport interface Rule<OnSuccessAction, OnFailureAction> {\r\n readonly id?: string;\r\n readonly description: string;\r\n readonly all: ReadonlyArray<Condition>;\r\n readonly some: ReadonlyArray<Condition>;\r\n readonly onSuccess: ReadonlyArray<OnSuccessAction>;\r\n readonly onFailure: ReadonlyArray<OnFailureAction>;\r\n}\r\n\r\nexport namespace Rule {\r\n /**\r\n * Validates that the rule is valid.\r\n * @param rule\r\n */\r\n\r\n export const isEmpty = (rule: Rule<any, any>): boolean => {\r\n const emptyConditions = rule.all.length === 0 && rule.some.length === 0;\r\n const emptyActions = rule.onSuccess.length === 0 && rule.onFailure.length === 0;\r\n return emptyConditions || emptyActions;\r\n };\r\n\r\n export const solve = (rule: Rule<any, any>, facts: ReadonlyArray<Fact>): boolean => {\r\n if (rule.some.length === 0 && rule.all.length === 0) {\r\n // TODO RETURN WARNING? OR LOGGING ?\r\n return false;\r\n }\r\n\r\n const someSolved = rule.some.map((condition) => Condition.evaluate(condition, facts));\r\n\r\n const someResult = someSolved.length === 0 || someSolved.some(DUtil.isTrue);\r\n\r\n const allSolved = rule.all.map((condition) => Condition.evaluate(condition, facts)).every(DUtil.isTrue);\r\n\r\n return allSolved && someResult;\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { Rule } from \"./rule\";\r\n\r\nexport interface SolveResult<S, F> {\r\n matching: ReadonlyArray<Match<S, F>>;\r\n errors: ReadonlyArray<RuleEngineError>;\r\n}\r\n\r\nexport interface Match<S, F> {\r\n readonly matchingRuleId: string;\r\n readonly ruleDescription: string;\r\n readonly actionList: ReadonlyArray<S> | ReadonlyArray<F>;\r\n}\r\n\r\nexport interface RuleEngineError {\r\n readonly kind?: string;\r\n readonly message: string;\r\n}\r\n\r\nexport class RuleEngine<S, F> {\r\n constructor() {}\r\n\r\n solveAll(rules: Rule<S, F>[], facts: Fact[]): SolveResult<S, F> {\r\n const errors: RuleEngineError[] = [];\r\n const matching: Match<S, F>[] = [];\r\n rules.forEach((rule) => {\r\n if (Rule.isEmpty(rule)) {\r\n errors.push({ message: \"Empty rule: \" + rule.id });\r\n } else if (Rule.solve(rule, facts)) {\r\n const match: Match<S, F> = {\r\n ruleDescription: rule.description,\r\n matchingRuleId: rule.id ?? \"no-id-given\",\r\n actionList: [...rule.onSuccess],\r\n };\r\n matching.push(match);\r\n }\r\n });\r\n return { matching, errors };\r\n }\r\n\r\n solve(rule: Rule<S, F>, facts: Fact[]): boolean {\r\n // TODO Validate, and Return result\r\n return Rule.solve(rule, facts);\r\n }\r\n}\r\n","import { PageDto } from \"../page/Page\";\r\n\r\nexport class NextQue {\r\n private originalOrder: ReadonlyArray<string> = [];\r\n private allPages: PageDto[] = [];\r\n private excludedTags = new Set<string>();\r\n private excludedByPageId = new Set<string>();\r\n private remaining: PageDto[] = [];\r\n constructor(pages: PageDto[] = []) {\r\n this.resetQue(pages);\r\n }\r\n\r\n /**\r\n * Will reset que with the new pages.\r\n * @param pages\r\n */\r\n resetQue(pages: PageDto[]) {\r\n this.allPages = [...pages];\r\n this.remaining = [...pages];\r\n this.excludedTags = new Set();\r\n this.excludedByPageId = new Set();\r\n this.originalOrder = this.allPages.map((p) => p.id);\r\n }\r\n\r\n pop(): PageDto | false {\r\n const next = this.remaining.shift();\r\n // TODO CLONE??\r\n return next ?? false;\r\n }\r\n\r\n peek(): PageDto | false {\r\n const next = this.remaining[0];\r\n return next ?? false;\r\n }\r\n\r\n jumpToPageById(pageId: string): boolean {\r\n const index = this.remaining.findIndex((p) => p.id === pageId);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this.remaining = this.remaining.slice(index);\r\n return true;\r\n }\r\n\r\n removeByTag(tag: string | string[]) {\r\n if (Array.isArray(tag)) {\r\n tag.forEach((tag) => {\r\n this.excludedTags.add(tag);\r\n });\r\n } else {\r\n this.excludedTags.add(tag);\r\n }\r\n this.filterRemaining();\r\n }\r\n\r\n /**\r\n * Will not be included\r\n * @param pages\r\n */\r\n insertAsNextByForce(pages: PageDto[]) {\r\n this.remaining.unshift(...pages);\r\n }\r\n\r\n removeByPageId(pageId: string | string[]) {\r\n if (Array.isArray(pageId)) {\r\n pageId.forEach((id) => {\r\n this.excludedByPageId.add(id);\r\n });\r\n } else {\r\n this.excludedByPageId.add(pageId);\r\n }\r\n this.filterRemaining();\r\n // this.excludedByPageId.add(pageId);\r\n }\r\n\r\n private filterRemaining() {\r\n this.remaining = this.remaining.filter((p) => {\r\n const tags = p.tags ?? [];\r\n const isIncluededByTag = !tags.some((tag) => this.excludedTags.has(tag));\r\n const isIncludedByPageId = !this.excludedByPageId.has(p.id);\r\n return isIncludedByPageId && isIncluededByTag;\r\n });\r\n }\r\n get isEmpty(): boolean {\r\n return this.remaining.length === 0;\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get size(): number {\r\n return this.remaining.length;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get pageCount(): number {\r\n return this.originalOrder.length;\r\n }\r\n}\r\n","import { HistoryQue } from \"./history-que\";\nimport { RuleEngine } from \"../rules/rule-engine\";\nimport { NextQue } from \"./next-que\";\nimport { SchemaDto } from \"./SchemaDto\";\nimport { RuleActionPageQue } from \"./page-que-ruleengine-action\";\nimport { PageDto } from \"../page/Page\";\nimport { PageResult } from \"../page/page-result\";\nimport { Fact } from \"../rules/fact\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport type DPlayerData = Pick<SchemaDto, \"pages\" | \"pageSequences\" | \"rules\" | \"predefinedFacts\">;\nexport class DPlayer {\n private readonly eventLog: Array<MqEvent> = [];\n private history = new HistoryQue();\n private ruleEngine = new RuleEngine<RuleActionPageQue, never>();\n private nextQue = new NextQue();\n private data: DPlayerData;\n private readonly predefinedFacts: ReadonlyArray<Fact>;\n\n constructor(data: DPlayerData) {\n this.data = data;\n const pages = data.pages ?? [];\n this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];\n this.nextQue.resetQue(pages);\n }\n\n saveEvent(event: MqEvent) {\n this.eventLog.push(event);\n }\n\n saveHistory(pageHistory: PageResult) {\n // console.log(\"SAVE HISTORY\", pageHistory);\n this.history.addToHistory(pageHistory);\n this.eventLog.push(...pageHistory.eventLog);\n // Evaluate rules\n const userGeneratedFact = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const facts = [...userGeneratedFact, ...predefinedFacts];\n const result = this.ruleEngine.solveAll(this.data.rules, facts);\n\n const matchingRules = result.matching;\n const actions = matchingRules.map((r) => r.actionList).flat(1);\n // Execute actions\n actions.forEach((a) => {\n // console.log(a.payload);\n switch (a.kind) {\n case \"jumpToPage\":\n this.nextQue.jumpToPageById(a.pageId);\n break;\n case \"excludeByPageId\":\n this.nextQue.removeByPageId(a.pageIds);\n break;\n case \"excludeByTag\":\n this.nextQue.removeByTag(a.tagIds);\n break;\n default:\n console.log(\"UNKNOWN ACTION\", a);\n const check: never = a;\n }\n });\n }\n\n getResults() {\n const pagesLeft = this.nextQue.size;\n const answerFacts = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const eventLog = [...this.eventLog];\n // console.log(answerFacts);\n return { answerFacts, predefinedFacts, eventLog, pagesLeft };\n }\n\n insertSequence(sequenceId: string) {\n this.insertSequenceById(sequenceId);\n }\n\n getNextPage(): PageDto | false {\n const next = this.nextQue.pop();\n return next ?? false;\n }\n\n private insertSequenceById(id: string) {\n const seq = this.data.pageSequences?.find((s) => s.id === id);\n if (seq) {\n this.nextQue.insertAsNextByForce([...seq.pages]);\n } else {\n // HOW TO HANDLE INVALID ID_REFS?? LOGGER??\n // LOG INVALID COMMAND.\n }\n }\n\n /**\n * Total number of pages left in que\n */\n get pagesLeft(): number {\n return this.nextQue.pageCount;\n }\n\n /**\n * Total number of pages in test\n */\n get totalPageCount(): number {\n return this.data.pages.length;\n }\n}\n","export class ScaleService {\r\n private readonly baseHeight;\r\n private readonly baseWidth;\r\n private containerHeight = 1300;\r\n private containerWidth = 1300;\r\n\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n get pageHeight() {\r\n return this.baseHeight * this.scale;\r\n }\r\n get pageWidth() {\r\n return this.baseWidth * this._scale;\r\n }\r\n\r\n private _scale = 1;\r\n\r\n private readonly subscribers = new Set<(scale: number) => void>();\r\n\r\n constructor(config: { baseHeight: number; baseWidth: number; containerHeight: number; containerWidth: number }) {\r\n this.baseHeight = config.baseHeight;\r\n this.baseWidth = config.baseWidth;\r\n this.containerHeight = config.containerHeight;\r\n this.containerWidth = config.containerWidth;\r\n this.updateScale();\r\n }\r\n\r\n setContainerBounds(bounds: { height: number; width: number }) {\r\n this.containerWidth = bounds.width;\r\n this.containerHeight = bounds.height;\r\n this.updateScale();\r\n }\r\n private updateScale() {\r\n const scaleFn = Scale.calc(this.baseHeight, this.baseWidth);\r\n const scale = scaleFn({ height: this.containerHeight, width: this.containerWidth });\r\n const hasChanged = this.scale !== scale;\r\n this._scale = scale;\r\n if (hasChanged) {\r\n this.subscribers.forEach((fn) => {\r\n fn(this._scale);\r\n });\r\n }\r\n }\r\n\r\n onChange(scaleChangeHandler: (scale: number) => void, subscriberId: string) {\r\n // console.log(subscriberId);\r\n this.subscribers.add(scaleChangeHandler);\r\n scaleChangeHandler(this._scale);\r\n return () => {\r\n this.subscribers.delete(scaleChangeHandler);\r\n };\r\n }\r\n}\r\nexport namespace Scale {\r\n export const calc = (baseHeight: number, baseWidth: number) => {\r\n return (container: { height: number; width: number }) => {\r\n const heightRatio = container.height / baseHeight;\r\n const widthRatio = container.width / baseWidth;\r\n return Math.min(heightRatio, widthRatio);\r\n };\r\n };\r\n\r\n type ScalePosInput = { x: number; y: number; h: number; w: number };\r\n\r\n export const scaleFunctionCreator = (scale: number) => {\r\n return (value: number) => value * scale;\r\n };\r\n}\r\n","import { DUtil } from \"../utils/DUtil\";\n\nexport namespace DCss {\n export interface Px {\n readonly _unit: \"px\";\n readonly value: number;\n }\n\n export type LengthString = `${number}px` | `${number}%`;\n export interface Percent {\n readonly _unit: \"percent\";\n readonly value: number;\n }\n\n export type LengthUnit = Px | Percent | number;\n\n /**\n * Will scale to 3% of baseScale\n * @param unit\n * @param scale\n */\n export const toString = (unit: Readonly<LengthUnit>, scale: number): LengthString => {\n const _mapped: Percent | Px =\n typeof unit === \"number\" ? { _unit: \"percent\", value: unit } : unit;\n return _toString(_mapped, scale);\n };\n const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {\n const clampedScale = Math.max(scale, 0.03);\n if (unit._unit === \"px\") {\n if (unit.value < 0.1) {\n return \"0px\";\n }\n\n const rounded = Math.round(unit.value * clampedScale);\n const clamped = Math.max(rounded, 1);\n return (clamped + \"px\") as LengthString;\n }\n return (unit.value + \"%\") as LengthString;\n };\n\n export const isLengthUnit = (unit?: LengthUnit): unit is LengthUnit => {\n if (typeof unit === \"number\") {\n return true;\n }\n\n if (!unit) {\n return false;\n }\n\n const unitKey: keyof DCss.Px = \"_unit\";\n const valueKey: keyof DCss.Px = \"value\";\n const hasUnitKey = DUtil.hasKey(unit, unitKey);\n const hasValueKey = DUtil.hasKey(unit, valueKey);\n return hasUnitKey && hasValueKey;\n };\n}\n","import { DCss } from \"./css\";\nimport { DUtil } from \"../utils/DUtil\";\n\nexport type PStyle = Partial<DStyle>;\nexport interface DStyle {\n opacity: number;\n backgroundColor: string;\n visibility: \"visible\" | \"hidden\";\n cursor:\n | \"pointer\"\n | \"help\"\n | \"copy\"\n | \"wait\"\n | \"not-allowed\"\n | \"context-menu\"\n | \"move\"\n | \"grabbing\"\n | \"grab\"\n | \"zoom-in\"\n | \"zoom-out\"\n | \"none\"\n | \"auto\"\n | \"default\";\n\n zIndex: number;\n // POSITION\n h: number;\n w: number;\n x: number;\n y: number;\n height: DCss.LengthUnit;\n maxHeight: DCss.LengthUnit;\n minHeight: DCss.LengthUnit;\n width: DCss.LengthUnit;\n maxWidth: DCss.LengthUnit;\n minWidth: DCss.LengthUnit;\n bottom: DCss.LengthUnit;\n top: DCss.LengthUnit;\n left: DCss.LengthUnit;\n right: DCss.LengthUnit;\n boxShadow: string;\n\n // BORDERS\n borderStyle: \"solid\" | \"none\" | \"dotted\" | \"dashed\";\n borderRadius: DCss.Px | DCss.Percent;\n borderWidth: DCss.Px;\n borderColor: string;\n\n margin: DCss.Px | DCss.Percent;\n padding: DCss.Px | DCss.Percent;\n paddingLeft: DCss.Px | DCss.Percent;\n paddingRight: DCss.Px | DCss.Percent;\n paddingTop: DCss.Px | DCss.Percent;\n paddingBottom: DCss.Px | DCss.Percent;\n\n // Translate\n transform: string;\n translate: string;\n\n // TEXT\n fontSize: DCss.Px;\n textColor: string;\n fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n textAlign: \"right\" | \"left\" | \"center\";\n letterSpacing: DCss.Px;\n lineHeight: number;\n\n // LAYOUT & POSITIONING OVERRIDE\n position: \"absolute\" | \"relative\";\n flex: string;\n display: \"flex\" | \"block\";\n flexDirection: \"row\" | \"colum\";\n flexWrap: \"nowrap\" | \"wrap\";\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n alignItems: \"stretch\" | \"baseline\" | \"center\" | \"flex-start\" | \"flex-end\";\n gap: DCss.Px;\n alignContent:\n | \"stretch\"\n | \"center\"\n | \"flex-start\"\n | \"flex-end\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n}\n\nexport namespace DStyle {\n // import isNumber = DUtil.isNumber;\n import isLengthUnit = DCss.isLengthUnit;\n export const normalize = <T extends HTMLElement>(el: T): T => {\n const s = el.style;\n s.position = \"absolute\";\n s.boxSizing = \"border-box\";\n s.padding = \"0px\";\n s.margin = \"0px\";\n\n s.width = \"100%\";\n\n s.bottom = \"\";\n s.top = \"\";\n s.left = \"\";\n s.right = \"\";\n // s.flexGrow = \"2\";\n // s.flexShrink = \"1\";\n // s.flexGrow = \"0\";\n // s.flexShrink = \"0\";\n // s.flexBasis = \"5\";\n s.width = \"\";\n s.height = \"\";\n s.flex = \"none\";\n\n s.boxShadow = \"\";\n s.fontSize = \"12px\";\n s.lineHeight = \"1\";\n s.textAlign = \"center\";\n s.textDecoration = \"none\";\n s.boxShadow = \"\";\n s.boxSizing = \"border-box\";\n s.fontWeight = \"500\";\n s.borderStyle = \"\";\n s.borderRadius = \"\";\n s.borderWidth = \"\";\n s.borderWidth = \"10px\";\n s.borderColor = \"black\";\n s.backgroundColor = \"\";\n s.border = \"\";\n s.borderStyle = \"none\";\n s.outline = \"\";\n s.wordSpacing = \"\";\n s.userSelect = \"none\";\n s.textShadow = \"\";\n return el;\n };\n\n export const applyStyles = <T extends HTMLElement>(\n el: T,\n style: Partial<DStyle>,\n scale: number,\n ): T => {\n const { isNumber, isString } = DUtil;\n // const scalePx = DCss.toStringCre(this.scale);\n const {\n x,\n y,\n left,\n right,\n top,\n bottom,\n backgroundColor,\n borderColor,\n borderWidth,\n borderRadius,\n borderStyle,\n w,\n opacity,\n cursor,\n fontSize,\n fontWeight,\n lineHeight,\n textColor,\n textAlign,\n translate,\n flex,\n margin,\n padding,\n letterSpacing,\n h,\n height,\n width,\n transform,\n visibility,\n justifyContent,\n alignContent,\n flexWrap,\n display,\n flexDirection,\n alignItems,\n position,\n paddingLeft,\n paddingTop,\n paddingRight,\n paddingBottom,\n gap,\n\n zIndex,\n //\n boxShadow,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n } = style;\n\n if (isNumber(zIndex)) {\n el.style.zIndex = \"\" + zIndex;\n }\n if (isString(flex)) {\n el.style.flex = flex;\n }\n\n if (DCss.isLengthUnit(minWidth)) {\n el.style.minWidth = DCss.toString(minWidth, scale);\n }\n\n if (DCss.isLengthUnit(maxWidth)) {\n el.style.maxWidth = DCss.toString(maxWidth, scale);\n }\n\n if (typeof lineHeight === \"number\") {\n el.style.lineHeight = \"\" + lineHeight;\n }\n\n if (DCss.isLengthUnit(minHeight)) {\n el.style.minHeight = DCss.toString(minHeight, scale);\n }\n\n if (DCss.isLengthUnit(maxHeight)) {\n el.style.maxHeight = DCss.toString(maxHeight, scale);\n }\n\n if (boxShadow) {\n el.style.boxShadow = boxShadow;\n }\n\n if (gap) {\n el.style.gap = DCss.toString(gap, scale);\n }\n\n if (paddingLeft) {\n el.style.paddingLeft = DCss.toString(paddingLeft, scale);\n }\n\n if (paddingRight) {\n el.style.paddingRight = DCss.toString(paddingRight, scale);\n }\n\n if (paddingTop) {\n el.style.paddingTop = DCss.toString(paddingTop, scale);\n }\n\n if (paddingBottom) {\n el.style.paddingBottom = DCss.toString(paddingBottom, scale);\n }\n\n if (position) {\n el.style.position = position;\n }\n if (justifyContent) {\n el.style.justifyContent = justifyContent;\n }\n\n if (alignContent) {\n el.style.alignContent = alignContent;\n }\n if (flexWrap) {\n el.style.flexWrap = flexWrap;\n }\n if (display) {\n el.style.display = display;\n }\n if (flexDirection) {\n el.style.flexDirection = flexDirection;\n }\n if (alignItems) {\n el.style.alignItems = alignItems;\n }\n\n // this.el.style.fontWeight = '900';\n if (backgroundColor) {\n el.style.backgroundColor = backgroundColor;\n }\n\n if (cursor) {\n el.style.cursor = cursor;\n }\n\n if (transform) {\n el.style.transform = transform;\n }\n\n if (textColor) {\n el.style.color = textColor;\n }\n if (textAlign) {\n el.style.textAlign = textAlign;\n }\n\n if (borderColor) {\n el.style.borderColor = borderColor;\n }\n\n if (borderWidth) {\n el.style.borderWidth = DCss.toString(borderWidth, scale);\n }\n\n if (fontWeight) {\n el.style.fontWeight = fontWeight + \"\";\n }\n\n if (borderStyle) {\n el.style.borderStyle = borderStyle;\n }\n\n if (fontSize) {\n el.style.fontSize = DCss.toString(fontSize, scale);\n }\n\n if (DUtil.isNumber(x)) {\n el.style.left = x + \"%\";\n }\n\n if (DUtil.isNumber(y)) {\n el.style.bottom = y + \"%\";\n }\n\n if (DCss.isLengthUnit(height)) {\n el.style.height = DCss.toString(height, scale);\n }\n\n if (DCss.isLengthUnit(width)) {\n el.style.width = DCss.toString(width, scale);\n }\n\n if (DCss.isLengthUnit(left)) {\n el.style.left = DCss.toString(left, scale);\n }\n\n if (DCss.isLengthUnit(right)) {\n el.style.right = DCss.toString(right, scale);\n }\n\n if (DCss.isLengthUnit(bottom)) {\n el.style.bottom = DCss.toString(bottom, scale);\n }\n\n if (DCss.isLengthUnit(top)) {\n el.style.top = DCss.toString(top, scale);\n }\n\n if (DUtil.isNumber(h)) {\n el.style.height = DCss.toString(h, scale);\n }\n\n if (isNumber(w)) {\n el.style.width = DCss.toString(w, scale);\n }\n\n if (DCss.isLengthUnit(borderRadius)) {\n el.style.borderRadius = DCss.toString(borderRadius, scale);\n }\n\n if (letterSpacing) {\n el.style.letterSpacing = DCss.toString(letterSpacing, scale);\n }\n\n if (margin) {\n el.style.margin = DCss.toString(margin, scale);\n }\n\n if (padding) {\n el.style.padding = DCss.toString(padding, scale);\n }\n\n if (isNumber(opacity)) {\n el.style.opacity = opacity + \"\";\n }\n\n if (visibility) {\n el.style.visibility = visibility;\n }\n return el;\n };\n\n // const propNames = new Set(...ElementKeyNames);\n // export const validKey = (keyName: string) => propNames.has(keyName);\n}\n","export type DTimestamp = number & { __timestamp__: true };\r\nexport namespace DTimestamp {\r\n export const now = () => Date.now() as DTimestamp;\r\n export type Diff = number & { __diff__: true };\r\n\r\n export const addMills = (t: DTimestamp, ms: number): DTimestamp => {\r\n const res = t + Math.abs(ms);\r\n return res as DTimestamp;\r\n };\r\n\r\n export const diff = (t1: DTimestamp, t2: DTimestamp): Diff => {\r\n const t1Abs = Math.abs(t1);\r\n const t2Abs = Math.abs(t2);\r\n return Math.abs(t1Abs - t2Abs) as Diff;\r\n };\r\n\r\n export const diffNow = (t: DTimestamp): Diff => {\r\n return diff(t, now());\r\n };\r\n}\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport diff = DTimestamp.diff;\n\nexport type TaskState = {\n audioIsPlaying: boolean;\n isGifMode: boolean;\n videoPlayState:\n | \"playing\"\n | \"paused\"\n | \"ended\"\n | \"playing-and-muted\"\n | \"paused-and-muted\"\n | \"ended-and-muted\";\n blockFormInput: boolean;\n blockResponseButton: boolean;\n blockAudio: boolean;\n blockVideo: boolean;\n};\n\nexport type TaskStateDiff = Partial<TaskState> & { __diffed__: true };\nexport const TaskState = {\n eq: (a: TaskState, b: TaskState) => {\n return (\n a.audioIsPlaying === b.audioIsPlaying &&\n a.isGifMode === b.isGifMode &&\n a.videoPlayState === b.videoPlayState &&\n a.blockFormInput === b.blockFormInput &&\n a.blockResponseButton === b.blockResponseButton &&\n a.blockAudio === b.blockAudio &&\n a.blockVideo === b.blockVideo\n );\n },\n\n getDiff: (curr: TaskState, prev: TaskState | false): TaskStateDiff => {\n if (prev === false) {\n return curr as TaskStateDiff;\n }\n\n const diff = {} as TaskStateDiff;\n\n if (curr.audioIsPlaying !== prev.audioIsPlaying) {\n diff.audioIsPlaying = curr.audioIsPlaying;\n }\n if (curr.isGifMode !== prev.isGifMode) {\n diff.isGifMode = curr.isGifMode;\n }\n if (curr.videoPlayState !== prev.videoPlayState) {\n diff.videoPlayState = curr.videoPlayState;\n }\n\n if (curr.blockFormInput !== prev.blockFormInput) {\n diff.blockFormInput = curr.blockFormInput;\n }\n if (curr.blockResponseButton !== prev.blockResponseButton) {\n diff.blockResponseButton = curr.blockResponseButton;\n }\n if (curr.blockAudio !== prev.blockAudio) {\n diff.blockAudio = curr.blockAudio;\n }\n if (curr.blockVideo !== prev.blockVideo) {\n diff.blockVideo = curr.blockVideo;\n }\n return diff;\n },\n};\n","import { DStyle, PStyle } from \"./DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\nimport { TaskState, TaskStateDiff } from \"../page/task-state\";\n\nexport interface DElementBaseDto {\n readonly style: PStyle;\n readonly onMouseEnter?: PStyle;\n readonly onMouseLeave?: PStyle;\n readonly onMouseDown?: PStyle;\n readonly onMouseUp?: PStyle;\n readonly innerText?: string;\n\n // ACTIONS HANDLERS\n readonly onClick?: ButtonClickAction;\n\n // VIDEO STATED\n readonly whenVideoPaused?: PStyle;\n readonly whenVideoPausedAndMuted?: PStyle;\n readonly whenVideoEnded?: PStyle;\n readonly whenVideoEndedAndMuted?: PStyle;\n readonly whenVideoPlaying?: PStyle;\n readonly whenVideoPlayingAndMuted?: PStyle;\n\n readonly whenAudioPlaying?: PStyle;\n readonly whenAudioPaused?: PStyle;\n readonly whenAudioBlocked?: PStyle;\n readonly whenVideoBlocked?: PStyle;\n readonly whenAudioUnblocked?: PStyle;\n readonly whenVideoUnblocked?: PStyle;\n readonly whenResponseBlocked?: PStyle;\n readonly whenResponseUnblocked?: PStyle;\n readonly whenFormInputBlocked?: PStyle;\n readonly whenFormInputUnblocked?: PStyle;\n}\n\nconst isFalse = (bool?: boolean): bool is false => bool === false;\nconst isTrue = (bool?: boolean): bool is true => bool === true;\n\nexport abstract class DElement<T extends HTMLElement> {\n private prevState: TaskState | false = false;\n\n protected currStyle: Partial<DStyle> = {\n fontSize: { _unit: \"px\", value: 100 },\n fontWeight: 500,\n textColor: \"black\",\n opacity: 1,\n };\n\n protected constructor(\n protected readonly el: T,\n protected readonly dto: DElementBaseDto,\n protected readonly scale: ScaleService,\n ) {\n if (dto.innerText) {\n this.el.innerText = dto.innerText;\n }\n this.setStyle = this.setStyle.bind(this);\n // this.normalize = this.normalize.bind(this);\n this.appendYourself = this.appendYourself.bind(this);\n this.updateStyles = this.updateStyles.bind(this);\n const { onMouseEnter, onMouseLeave } = dto;\n\n if (onMouseEnter) {\n this.el.onmouseenter = () => {\n this.setStyle(onMouseEnter);\n };\n }\n if (onMouseLeave) {\n this.el.onmouseleave = () => {\n this.setStyle(onMouseLeave);\n };\n }\n\n DStyle.normalize(this.el);\n\n if (dto) {\n this.updateStyles(dto?.style);\n }\n }\n\n /**\n * This method is called when the element is clicked.\n * This method shall be overridden by the pageClass.\n * @param style\n */\n setStyle(style: PStyle) {\n this.updateStyles(style);\n }\n\n getElementByDangerousReference() {\n return this.el;\n }\n\n appendYourself(parent: { append: (el: HTMLElement) => void }) {\n parent.append(this.el);\n // console.log(parent);\n }\n\n updateState(state: TaskStateDiff) {\n this.handleStateChanges(state);\n }\n\n setState(state: TaskState) {\n const prev = this.prevState;\n const diff = TaskState.getDiff(state, prev);\n this.prevState = state;\n if (Object.keys(diff).length > 0) {\n this.handleStateChanges(diff);\n }\n }\n\n private handleStateChanges(diff: TaskStateDiff) {\n const {\n audioIsPlaying,\n videoPlayState,\n blockAudio,\n blockVideo,\n blockResponseButton,\n blockFormInput,\n isGifMode,\n } = diff;\n const {\n whenAudioPaused,\n whenVideoPaused,\n whenAudioPlaying,\n whenFormInputBlocked,\n whenResponseBlocked,\n\n whenVideoPlaying,\n whenVideoEnded,\n\n whenAudioBlocked,\n whenVideoBlocked,\n whenAudioUnblocked,\n whenVideoUnblocked,\n whenResponseUnblocked,\n whenFormInputUnblocked,\n whenVideoPausedAndMuted,\n whenVideoEndedAndMuted,\n whenVideoPlayingAndMuted,\n } = this.dto;\n\n if (isTrue(audioIsPlaying) && whenAudioPlaying) {\n this.setStyle(whenAudioPlaying);\n }\n\n if (isFalse(audioIsPlaying) && whenAudioPaused) {\n this.setStyle(whenAudioPaused);\n }\n\n if (videoPlayState === \"playing\" && whenVideoPlaying) {\n this.setStyle(whenVideoPlaying);\n }\n\n if (videoPlayState === \"paused\" && whenVideoPaused) {\n this.setStyle(whenVideoPaused);\n }\n\n if (videoPlayState === \"ended\" && whenVideoEnded) {\n this.setStyle(whenVideoEnded);\n }\n if (videoPlayState === \"playing-and-muted\" && whenVideoPlayingAndMuted) {\n this.setStyle(whenVideoPlayingAndMuted);\n }\n\n if (videoPlayState === \"paused-and-muted\" && whenVideoPausedAndMuted) {\n this.setStyle(whenVideoPausedAndMuted);\n }\n\n if (videoPlayState === \"ended-and-muted\" && whenVideoEndedAndMuted) {\n this.setStyle(whenVideoEndedAndMuted);\n }\n }\n\n // private normalize() {\n // this.el.style.padding = \"0\";\n // this.el.style.margin = \"0\";\n // this.el.style.position = \"absolute\";\n // this.el.style.boxSizing = \"border-box\";\n // }\n\n abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;\n\n protected updateStyles(style: Partial<DStyle>) {\n this.currStyle = Object.assign(this.currStyle, style);\n DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);\n window.getComputedStyle(this.el);\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { DText, DTextDto } from \"./DText\";\nimport { DImg, DImgDto } from \"./DImg\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DButton, DButtonDto } from \"./DButton\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DDivDto extends DElementBaseDto {\n readonly _tag: \"div\";\n readonly children: Array<DTextDto | DImgDto | DButtonDto>;\n}\n\nexport class DDiv extends DElement<HTMLDivElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 22, y: 4 };\n private children: Array<DText | DImg | DButton> = [];\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n this.children.forEach((child) => {\n child.registerClickHandler(clickHandler);\n });\n }\n\n constructor(dto: DDivDto, scale: ScaleService, children: Array<DText | DImg | DButton>) {\n const d = document.createElement(\"div\");\n super(d, dto, scale);\n this.children = children;\n\n this.children.forEach((child) => {\n child.appendYourself(this.el);\n });\n }\n protected whenConstructed() {\n this.children.forEach((child) => {\n console.log(child);\n });\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DImgDto extends DElementBaseDto {\n readonly _tag: \"img\";\n // readonly id: string;\n readonly url: string;\n}\n\nexport class DImg extends DElement<HTMLImageElement> {\n private static IMAGE_COUNT = 0;\n private readonly imageCount: number;\n readonly TAG: string;\n readonly TIMING_TAG: string;\n private readonly loadStart: DTimestamp;\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n\n constructor(\n protected readonly dto: DImgDto,\n readonly scaleService: ScaleService,\n ) {\n super(document.createElement(\"img\"), dto, scaleService);\n DImg.IMAGE_COUNT += 1;\n this.imageCount = DImg.IMAGE_COUNT;\n this.TAG = \"[D_IMG \" + DImg.IMAGE_COUNT + \" ]: \";\n this.TIMING_TAG = \"load-time (\" + DImg.IMAGE_COUNT + \") \";\n this.el.loading = \"eager\";\n this.el.style.position = \"absolute\";\n this.setStyle(dto.style);\n\n this.loadStart = DTimestamp.now();\n this.el.onload = () => {};\n this.el.onerror = () => {};\n this.el.src = dto.url;\n console.time(this.TIMING_TAG);\n }\n\n log(): void {}\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DTextDto extends DElementBaseDto {\n readonly _tag: \"p\";\n readonly innerText: string;\n}\n\nexport class DText extends DElement<HTMLParagraphElement> {\n constructor(dto: DTextDto, scale: ScaleService) {\n super(document.createElement(\"p\"), dto, scale);\n }\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const onClick = this.dto.onClick;\n if (onClick) {\n clickHandler(onClick);\n }\n };\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DButtonDto extends DElementBaseDto {\n readonly _tag: \"button\";\n}\n\nexport class DButton extends DElement<HTMLButtonElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 40, y: 40 };\n\n constructor(dto: DButtonDto, scale: ScaleService) {\n const d = document.createElement(\"button\");\n super(d, dto, scale);\n }\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n}\n","import { DElement } from \"./DElement\";\nimport { DDiv, DDivDto } from \"./Ddiv\";\nimport { DImg } from \"./DImg\";\nimport { DText } from \"./DText\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DElementDto } from \"./DElement.dto\";\nimport { DButton } from \"./DButton\";\n\nexport const createDElement = (dto: DElementDto, scale: ScaleService): DElement<any> => {\n switch (dto._tag) {\n case \"div\":\n const childEls = createChildrenForDiv(dto, scale);\n return new DDiv(dto, scale, childEls);\n case \"img\":\n return new DImg(dto, scale);\n case \"p\":\n return new DText(dto, scale);\n case \"button\":\n return new DButton(dto, scale);\n default:\n const check: never = dto;\n throw new Error(\"Unknown dto given to the createDElement function.\");\n // TODO LOGGING or create any HTML-ELEMENT??\n }\n};\n\nconst createChildrenForDiv = (dto: DDivDto, scale: ScaleService): DDiv[\"children\"] => {\n const childDto = dto.children;\n const childEls: Array<DImg | DText | DButton> = [];\n childDto.forEach((dto) => {\n switch (dto._tag) {\n case \"p\":\n const newText = new DText(dto, scale);\n childEls.push(newText);\n break;\n case \"img\":\n const newImage = new DImg(dto, scale);\n childEls.push(newImage);\n break;\n case \"button\":\n const newButton = new DButton(dto, scale);\n childEls.push(newButton);\n break;\n default:\n const check: never = dto;\n }\n });\n return childEls;\n};\n","import { PlayAudioTask, PlayVideoTask } from \"../page/task\";\nimport { Fact } from \"../rules/fact\";\n\nexport type ButtonClickAction =\n | { kind: \"play-audio\"; task: PlayAudioTask; vibrateMs?: number }\n | { kind: \"pause-audio\"; vibrateMs?: number }\n | { kind: \"play-video\"; task: PlayVideoTask; vibrateMs?: number }\n | { kind: \"mute-video\"; vibrateMs?: number }\n | { kind: \"un-mute-video\"; vibrateMs?: number }\n | { kind: \"pause-video\"; vibrateMs?: number }\n | { kind: \"submit-fact\"; fact: Fact; vibrateMs?: number }\n | { kind: \"next-page\"; vibrateMs?: number }\n | { kind: \"submit-form\"; vibrateMs?: number };\n\n// export type ButtonClickAction = _ButtonClickAction & ;\nexport const ButtonClickAction = {\n describe: (a: ButtonClickAction): string => {\n switch (a.kind) {\n case \"next-page\":\n return \"go to next page\";\n case \"play-video\":\n return \"VideoId = \" + a.task.videoId;\n case \"play-audio\":\n return \"AudioId = \" + a.task.audioId;\n case \"pause-video\":\n return \"\";\n case \"pause-audio\":\n return \"\";\n case \"submit-fact\":\n return a.fact.label + \" = \" + a.fact.value;\n case \"submit-form\":\n return \"\";\n case \"mute-video\":\n return \"mute-video\";\n case \"un-mute-video\":\n return \"un-mute-video\";\n default:\n const _exhaustiveCheck: never = a;\n return \"\";\n }\n },\n};\n","import { DTimestamp } from \"../common/DTimestamp\";\r\n\r\ninterface _MqEvent<K extends string, P extends object> {\r\n readonly kind: K;\r\n readonly timestamp: DTimestamp;\r\n readonly payload: P;\r\n}\r\n\r\nexport type MqEventEngineStart = _MqEvent<\r\n \"engine-start\",\r\n {\r\n readonly schemaId: string;\r\n readonly schemaPrefix: string;\r\n }\r\n>;\r\nexport interface MqEventPageEnter\r\n extends _MqEvent<\"page-enter\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\nexport interface MqEventPageLeave\r\n extends _MqEvent<\"page-leave\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\n\r\nexport type MqEventUserClicked = _MqEvent<\r\n \"user-clicked\",\r\n { readonly pageId: string; pagePrefix: string; action: string; descriptions: string }\r\n>;\r\n\r\nexport type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;\r\n\r\nexport const MqEvent = {\r\n engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {\r\n return {\r\n kind: \"engine-start\",\r\n timestamp: DTimestamp.now(),\r\n payload: { schemaId, schemaPrefix },\r\n };\r\n },\r\n pageEnter(pageId: string, pagePrefix: string): MqEventPageEnter {\r\n return {\r\n kind: \"page-enter\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n pageLeave(pageId: string, pagePrefix: string): MqEventPageLeave {\r\n return {\r\n kind: \"page-leave\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n userClicked(data: {\r\n pageId: string;\r\n pagePrefix: string;\r\n action: string;\r\n descriptions: string;\r\n }): MqEventUserClicked {\r\n const { pageId, pagePrefix, action, descriptions } = data;\r\n return {\r\n kind: \"user-clicked\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix, action, descriptions },\r\n };\r\n },\r\n} as const;\r\n","import { DElement } from \"../Delement/DElement\";\nimport { TaskManager } from \"./task-manager\";\nimport { createDElement } from \"../Delement/element-factory\";\nimport { ScaleService } from \"../engine/scale\";\nimport { Task } from \"./task\";\nimport { PStyle } from \"../Delement/DStyle\";\nimport { ButtonClickAction } from \"../Delement/button-click-action\";\nimport { DElementDto } from \"../Delement/DElement.dto\";\nimport { Fact } from \"../rules/fact\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { PageResult } from \"./page-result\";\nimport { TaskState } from \"./task-state\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport interface VideoPlayerDto {\n playUrl: string;\n style?: PStyle;\n}\n\nexport interface PageDto {\n readonly id: string;\n readonly prefix: string;\n readonly tags: string[];\n background: string;\n elements: Array<DElementDto>;\n videoPlayer?: VideoPlayerDto;\n initialTasks: Array<Task>;\n}\n\nexport const PageDto = {\n createDummy: (id: number): PageDto => {\n return {\n id: \"id\" + id,\n prefix: \"prefix\" + id,\n tags: [],\n background: \"white\",\n elements: [\n {\n _tag: \"div\",\n style: { x: 10, y: 0, w: 40, h: 20, backgroundColor: \"red\" },\n children: [],\n innerText: \"Next btn \" + id,\n },\n ],\n\n initialTasks: [],\n };\n },\n};\n\nexport class Page {\n private readonly TAG = \"[ DPage ]: \";\n private elements: DElement<HTMLElement>[] = [];\n // private elements: PageComponent[] = [];\n // private layoutComponents: PageLayoutComponent[] = [];\n private pageEntered: DTimestamp = DTimestamp.now();\n private previousState: TaskState | false = false;\n private eventLog = new Array<MqEvent>();\n\n constructor(\n private readonly dto: PageDto,\n private readonly taskManager: TaskManager,\n private readonly scaleService: ScaleService,\n private readonly onCompleted: (result: PageResult) => void,\n ) {\n dto.elements.forEach((el) => {\n const element = createDElement(el, scaleService);\n // if (element instanceof DDiv) {\n // }\n element.registerClickHandler((action) => {\n this.handleButtonAction(action);\n });\n\n this.elements.push(element);\n\n // if(element.)\n // element= (action) => {\n // console.log(\"TODO ONCLICK \");\n // this.handleButtonAction(action);\n // };\n // this.elements.push(element);\n });\n\n if (dto.videoPlayer) {\n this.taskManager.loadVideo(dto.videoPlayer.playUrl);\n if (dto.videoPlayer.style) {\n this.taskManager.setVideoStyles(dto.videoPlayer.style);\n }\n }\n\n if (dto.initialTasks.length) {\n this.taskManager.autoPlaySequence(dto.initialTasks);\n }\n }\n\n private createPageResult(facts: Fact[]): PageResult {\n const pageExited = DTimestamp.now();\n const pageTime = DTimestamp.diff(this.pageEntered, pageExited);\n const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix);\n this.eventLog.push(pageExit);\n const eventLog = [...this.eventLog];\n return {\n pagePrefix: this.dto.prefix,\n pageId: this.dto.id,\n eventLog,\n pageTime,\n collectedFacts: facts,\n };\n }\n private handleButtonAction(a: ButtonClickAction) {\n const event = MqEvent.userClicked({\n pageId: this.dto.id,\n pagePrefix: this.dto.prefix,\n action: a.kind,\n descriptions: ButtonClickAction.describe(a),\n });\n this.eventLog.push(event);\n navigator.vibrate(200);\n const { vibrateMs } = a;\n if (vibrateMs) {\n navigator.vibrate(vibrateMs);\n }\n\n switch (a.kind) {\n case \"next-page\":\n const nextPageResult = this.createPageResult([]);\n this.onCompleted(nextPageResult);\n break;\n case \"play-video\":\n this.taskManager.execute(a.task);\n break;\n case \"play-audio\":\n this.taskManager.execute(a.task);\n break;\n case \"pause-video\":\n this.taskManager.pauseVideo();\n break;\n case \"pause-audio\":\n this.taskManager.pauseAudio();\n break;\n case \"mute-video\":\n this.taskManager.muteVideo();\n break;\n case \"un-mute-video\":\n this.taskManager.unMuteVideo();\n break;\n case \"submit-fact\":\n const submitFactResult = this.createPageResult([a.fact]);\n this.onCompleted(submitFactResult);\n break;\n case \"submit-form\":\n // TODO IMPLEMENT Collection of form-data // LOOP OVER ALL INPUTS\n const submitFormResult = this.createPageResult([]);\n this.onCompleted(submitFormResult);\n break;\n default:\n const _exhaustiveCheck: never = a;\n console.log(_exhaustiveCheck);\n }\n }\n\n appendYourself(parent: HTMLElement) {\n const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix);\n this.pageEntered = DTimestamp.now();\n this.eventLog.push(pageEnterEvent);\n this.elements.forEach((el) => {\n el.appendYourself(parent);\n });\n\n // this.components.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n // this.layoutComponents.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n }\n\n destroy() {\n this.taskManager.clear();\n }\n\n tick() {\n const prev = this.previousState;\n const curr = this.taskManager.getState();\n const diff = TaskState.getDiff(curr, prev);\n this.elements.forEach((element) => {\n element.updateState(diff);\n });\n }\n}\n","type BaseTask = {\r\n readonly blockAudio: boolean;\r\n readonly blockVideo: boolean;\r\n readonly blockResponseButton: boolean;\r\n readonly blockFormInput: boolean;\r\n readonly priority:\r\n | \"run-if-idle\"\r\n | \"follow-queue\"\r\n | \"replace-all\"\r\n | \"replace-current\"\r\n | \"replace-queue\"\r\n | \"prepend-to-queue\"\r\n | \"append-to-queue\";\r\n};\r\nexport type DelayTask = BaseTask & {\r\n readonly kind: \"delay-task\";\r\n readonly duration: number;\r\n};\r\n\r\nexport type PlayAudioTask = BaseTask & {\r\n readonly kind: \"play-audio-task\";\r\n readonly url: string;\r\n readonly audioId: string;\r\n};\r\n\r\nexport type PlayVideoTask = BaseTask & {\r\n readonly kind: \"play-video-task\";\r\n readonly url: string;\r\n readonly videoId: string;\r\n readonly loop?: boolean;\r\n readonly startAt?: number;\r\n readonly stopAt?: \"end\" | \"start\" | number;\r\n readonly volume?: number;\r\n};\r\nconst eq = (a: Task, b: Task) => {\r\n if (!b) {\r\n return false;\r\n }\r\n if (a.kind !== b.kind) {\r\n return false;\r\n }\r\n if (a.kind === \"delay-task\" && b.kind === \"delay-task\") {\r\n return a.duration === b.duration;\r\n }\r\n\r\n if (a.kind === \"play-audio-task\" && b.kind === \"play-audio-task\") {\r\n return a.url === b.url && a.audioId === b.audioId;\r\n }\r\n if (a.kind === \"play-video-task\" && b.kind === \"play-video-task\") {\r\n return (\r\n a.url === b.url &&\r\n a.videoId === b.videoId &&\r\n a.startAt === b.startAt &&\r\n a.stopAt === b.stopAt &&\r\n a.volume === b.volume\r\n );\r\n }\r\n return false;\r\n};\r\nconst deleteTaskList = (task: Task) => {\r\n return task.priority === \"replace-all\" || task.priority === \"replace-queue\";\r\n};\r\n\r\nconst shallRemoveCurrent = (task: Task) => {\r\n return task.priority === \"replace-current\" || task.priority === \"replace-all\";\r\n};\r\n\r\nconst notEq = (a: Task, b: Task) => !eq(a, b);\r\n\r\nconst is = (task: Task | undefined | false | null | {}): task is Task => {\r\n if (!task) {\r\n return false;\r\n }\r\n if (typeof task !== \"object\") {\r\n return false;\r\n }\r\n if (Array.isArray(task)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const Task = {\r\n eq,\r\n is,\r\n notEq,\r\n deleteTaskList,\r\n shallRemoveCurrent,\r\n};\r\nexport type Task = PlayVideoTask | PlayAudioTask | DelayTask;\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport { Task } from \"./task\";\nimport { DStyle, PStyle } from \"../Delement/DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { TaskState } from \"./task-state\";\n\nexport class TaskManager {\n private readonly TAG = \"[TaskManager]: \";\n private readonly videoElement = document.createElement(\"video\");\n private readonly audioElement = document.createElement(\"audio\");\n private readonly showConsoleLogs = false;\n private readonly defaultVideoStyles: PStyle = {\n height: 50,\n width: 100,\n top: 0,\n left: 0,\n };\n private videoStyles: PStyle;\n private runningTask: { task: Task; startedAt: DTimestamp } | false = false;\n private taskList: Array<Task> = [];\n private delayRef: number | false = false;\n\n clear() {\n if (this.showConsoleLogs) console.log(this.TAG + \"CLEAR\");\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n\n this.pauseVideo();\n this.pauseAudio();\n this.videoElement.removeAttribute(\"src\");\n this.videoElement.load();\n this.audioElement.removeAttribute(\"src\");\n this.audioElement.load();\n this.taskList = [];\n this.runningTask = false;\n this.hideVideo();\n }\n\n getState(): TaskState {\n const c = this.runningTask;\n const isGifMode = this.videoElement.loop;\n const audioIsPlaying = c && c.task.kind === \"play-audio-task\" && !this.audioElement.paused;\n const videoIsPlaying = c && c.task.kind === \"play-video-task\" && !this.videoElement.paused;\n const blockResponseButton = c && c.task.blockResponseButton;\n const blockAudio = c && c.task.blockAudio;\n const blockVideo = c && c.task.blockVideo;\n const blockFormInput = c && c.task.blockFormInput;\n const videoIsMuted = this.videoElement.muted;\n\n const videoIsAtTheEnd = this.videoElement.ended;\n let videoPlayState: TaskState[\"videoPlayState\"] = videoIsMuted ? \"paused-and-muted\" : \"paused\";\n\n if (videoIsPlaying) {\n videoPlayState = videoIsMuted ? \"playing-and-muted\" : \"playing\";\n }\n if (videoIsAtTheEnd) {\n videoPlayState = videoIsMuted ? \"ended-and-muted\" : \"ended\";\n }\n\n return {\n audioIsPlaying,\n videoPlayState,\n isGifMode,\n blockFormInput,\n blockResponseButton,\n blockAudio,\n blockVideo,\n };\n }\n\n constructor(\n private readonly mediaLayer: HTMLDivElement,\n private readonly scale: ScaleService,\n private readonly onError: (error: string) => void,\n ) {\n this.hideVideo();\n this.mediaLayer.appendChild(this.videoElement);\n this.mediaLayer.appendChild(this.audioElement);\n this.videoStyles = this.defaultVideoStyles;\n DStyle.normalize(this.videoElement);\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n\n this.videoElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n this.videoElement.onerror = (e) => {\n if (this.videoElement.src !== \"\") {\n onError(\"Error playing video: \" + this.videoElement.src);\n }\n };\n\n this.audioElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n }\n\n execute(task: Task): boolean {\n // console.log(\"EXECUTE TASK\" + task.kind);\n const curr = this.runningTask;\n // TODO Background-task should be handeled as its own kind or something.\n let isBackgroundTask = false;\n\n // Check if we should remove the current task.\n if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {\n this.pauseAudio();\n this.pauseVideo();\n this.runningTask = false;\n }\n\n if (!curr) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n } else if (Task.notEq(curr.task, task)) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n }\n\n if (task.priority === \"replace-all\" || task.priority === \"replace-queue\") {\n this.taskList = [];\n }\n\n // STARTING PLAY VIDEO\n if (task.kind === \"play-video-task\") {\n this.showVideo();\n // this.pauseAudio()\n this.loadVideo(task.url);\n if (task.loop) {\n this.videoElement.loop = true;\n isBackgroundTask = true;\n } else {\n this.videoElement.loop = false;\n }\n\n try {\n this.videoElement.play();\n } catch (e) {\n console.error(e);\n }\n }\n\n // STARTING PLAY AUDIO\n if (task.kind === \"play-audio-task\") {\n if (!this.videoElement.loop) {\n this.pauseVideo();\n }\n if (task.url !== this.audioElement.src) {\n this.audioElement.src = task.url;\n }\n this.audioElement.play();\n }\n\n if (task.kind === \"delay-task\") {\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n this.delayRef = window.setTimeout(() => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n }, task.duration);\n }\n\n if (isBackgroundTask) {\n const startNextTask = this.getNextTask();\n if (startNextTask) {\n this.execute(startNextTask);\n }\n }\n\n return true;\n }\n\n setVideoStyles(styles: PStyle) {\n this.videoStyles = { ...styles };\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n }\n\n autoPlaySequence(tasks: Task[]) {\n this.taskList = [...tasks];\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n if (next.kind === \"play-video-task\" && next.loop) {\n this.videoElement.loop = true;\n }\n }\n }\n\n loadVideo(url: string) {\n // console.log(\"LOAD VIDEO \" + !!url + \" \");\n if (this.videoElement.src !== url) {\n this.videoElement.src = url;\n }\n this.showVideo();\n }\n\n private playVideoElement() {\n this.videoElement\n .play()\n .then(() => {})\n .catch((e) => {\n console.log(e);\n this.onError(\"Error playing video.\");\n });\n }\n\n private showVideo() {\n this.videoElement.style.display = \"block\";\n }\n\n private hideVideo() {\n this.videoElement.style.display = \"none\";\n }\n\n pauseVideo() {\n try {\n if (!this.videoElement.loop) {\n this.videoElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing video.\");\n }\n }\n\n pauseAudio() {\n try {\n if (!this.audioElement.loop) {\n this.audioElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing audio.\");\n }\n }\n\n private getNextTask(): Task | false {\n // console.log(\"Getting next task.\");\n // console.log(this.taskList);\n const first = this.taskList.shift();\n return first ?? false;\n }\n\n muteVideo() {\n this.videoElement.muted = true;\n }\n\n unMuteVideo() {\n this.videoElement.muted = false;\n }\n}\n","import { SchemaDto } from \"./SchemaDto\";\nimport { DPlayer } from \"./dplayer\";\nimport { ScaleService } from \"./scale\";\nimport { Page } from \"../page/Page\";\nimport { TaskManager } from \"../page/task-manager\";\nimport { PageResult } from \"../page/page-result\";\nimport { SchemaResult } from \"./SchemaResult\";\nexport interface EngineLogger {\n info(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n}\n\nconst voidLogger: EngineLogger = {\n info: (message: string) => {},\n error: (message: string) => {},\n warn: (message: string) => {},\n};\n\nexport interface ISchemaEngine {\n onProgress(handler: (result: SchemaResult) => void): void;\n onFatalError(handler: (error: { message: string }) => void): void;\n setLogger(logger: EngineLogger): void;\n}\n\nexport class SchemaEngine implements ISchemaEngine {\n private readonly TAG = \"[ SCHEMA_ENGINE ] :\";\n private readonly scale: ScaleService;\n private readonly hostElement: HTMLDivElement;\n private readonly taskManager: TaskManager;\n private logger: EngineLogger = voidLogger;\n private readonly uiLayer: HTMLDivElement = document.createElement(\"div\");\n private readonly mediaLayer: HTMLDivElement = document.createElement(\"div\");\n private player: DPlayer;\n private currentPage: Page | false = false;\n private readonly tickerRef: number | false = false;\n constructor(\n hostEl: HTMLDivElement,\n private readonly height: number,\n private readonly width: number,\n private readonly schema: SchemaDto,\n ) {\n this.tickerRef = window.setInterval(() => {\n if (this.currentPage) {\n this.currentPage.tick();\n }\n }, 100);\n this.hostElement = hostEl;\n this.hostElement.appendChild(this.mediaLayer);\n this.hostElement.appendChild(this.uiLayer);\n this.scale = new ScaleService({\n baseHeight: schema.baseHeight,\n baseWidth: schema.baseWidth,\n containerWidth: this.width,\n containerHeight: this.height,\n });\n this.logger.info(this.TAG + \"Scale: \" + JSON.stringify(this.scale));\n this.player = new DPlayer(this.schema);\n this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {\n console.log(error);\n });\n\n this.styleSelf();\n this.handlePageCompleted = this.handlePageCompleted.bind(this);\n this.nextPage();\n }\n\n private handlePageCompleted(result: PageResult) {\n // 1 Save data from last page\n this.player.saveHistory(result);\n\n // 2 Emit progress\n const currentResults = this.player.getResults();\n const a: SchemaResult = {\n schemaId: this.schema.id,\n pagesLeft: currentResults.pagesLeft,\n predefinedFacts: currentResults.predefinedFacts,\n eventLog: currentResults.eventLog,\n answers: currentResults.answerFacts,\n };\n if (this._onProgress) {\n this._onProgress(a);\n }\n\n // 3. Next page\n this.nextPage();\n }\n\n private styleSelf() {\n this.hostElement.style.height = this.scale.pageHeight + \"px\";\n this.hostElement.style.width = this.scale.pageWidth + \"px\";\n this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? \"white\";\n this.hostElement.style.position = \"relative\";\n // this.hostElement.style.overflow = \"hidden\";\n const makeStatic = (div: HTMLDivElement) => {\n div.style.height = \"0px\";\n div.style.width = \"0px\";\n div.style.position = \"static\";\n };\n\n makeStatic(this.uiLayer);\n this.uiLayer.style.zIndex = \"10\";\n this.mediaLayer.style.zIndex = \"8\";\n makeStatic(this.mediaLayer);\n }\n\n private nextPage() {\n const nextPage = this.player.getNextPage();\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n\n // console.log(nextPage);\n if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {\n this.taskManager.setVideoStyles(nextPage.videoPlayer.style);\n }\n\n if (!nextPage) {\n // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??\n this.player = new DPlayer(this.schema);\n if (this.player.pagesLeft > 0) {\n this.nextPage();\n }\n return false;\n }\n\n const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {\n this.handlePageCompleted(result);\n });\n this.currentPage = newPage;\n newPage.appendYourself(this.uiLayer);\n return true;\n }\n\n destroy() {\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n }\n\n private _onProgress: ((result: SchemaResult) => void) | false = false;\n onProgress(handler: (result: SchemaResult) => void) {\n this._onProgress = handler;\n }\n\n private _onFatalError: ((error: { message: string }) => void) | false = false;\n onFatalError(handler: (error: { message: string }) => void): void {\n this._onFatalError = handler;\n }\n setLogger(logger: EngineLogger) {\n this.logger = logger;\n }\n}\n"],"mappings":"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","names":["DUtil","isNumber","Condition","condition","Rule","tag","Scale","DCss","DStyle","DTimestamp","dto"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@media-quest/engine",
3
- "version": "0.0.31",
3
+ "version": "0.0.33",
4
4
  "description": "Rendering engine for media-quest schemas.",
5
5
  "main": "dist/public-api.js",
6
6
  "types": "dist/public-api.d.ts",
@@ -1,7 +1,6 @@
1
1
  import { DStyle, PStyle } from "./DStyle";
2
2
  import { ScaleService } from "../engine/scale";
3
3
  import { ButtonClickAction } from "./button-click-action";
4
- import { DElementDto } from "./DElement.dto";
5
4
  import { TaskState, TaskStateDiff } from "../page/task-state";
6
5
 
7
6
  export interface DElementBaseDto {
@@ -57,7 +56,7 @@ export abstract class DElement<T extends HTMLElement> {
57
56
  this.el.innerText = dto.innerText;
58
57
  }
59
58
  this.setStyle = this.setStyle.bind(this);
60
- this.normalize = this.normalize.bind(this);
59
+ // this.normalize = this.normalize.bind(this);
61
60
  this.appendYourself = this.appendYourself.bind(this);
62
61
  this.updateStyles = this.updateStyles.bind(this);
63
62
  const { onMouseEnter, onMouseLeave } = dto;
@@ -73,7 +72,7 @@ export abstract class DElement<T extends HTMLElement> {
73
72
  };
74
73
  }
75
74
 
76
- this.normalize();
75
+ DStyle.normalize(this.el);
77
76
 
78
77
  if (dto) {
79
78
  this.updateStyles(dto?.style);
@@ -174,12 +173,12 @@ export abstract class DElement<T extends HTMLElement> {
174
173
  }
175
174
  }
176
175
 
177
- private normalize() {
178
- this.el.style.padding = "0";
179
- this.el.style.margin = "0";
180
- this.el.style.position = "absolute";
181
- this.el.style.boxSizing = "border-box";
182
- }
176
+ // private normalize() {
177
+ // this.el.style.padding = "0";
178
+ // this.el.style.margin = "0";
179
+ // this.el.style.position = "absolute";
180
+ // this.el.style.boxSizing = "border-box";
181
+ // }
183
182
 
184
183
  abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;
185
184
 
@@ -63,9 +63,11 @@ export interface DStyle {
63
63
  fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
64
64
  textAlign: "right" | "left" | "center";
65
65
  letterSpacing: DCss.Px;
66
+ lineHeight: number;
66
67
 
67
68
  // LAYOUT & POSITIONING OVERRIDE
68
69
  position: "absolute" | "relative";
70
+ flex: string;
69
71
  display: "flex" | "block";
70
72
  flexDirection: "row" | "colum";
71
73
  flexWrap: "nowrap" | "wrap";
@@ -89,13 +91,50 @@ export interface DStyle {
89
91
  }
90
92
 
91
93
  export namespace DStyle {
92
- import isNumber = DUtil.isNumber;
94
+ // import isNumber = DUtil.isNumber;
93
95
  import isLengthUnit = DCss.isLengthUnit;
94
96
  export const normalize = <T extends HTMLElement>(el: T): T => {
95
- el.style.padding = "0";
96
- el.style.margin = "0";
97
- el.style.position = "absolute";
98
- el.style.boxSizing = "border-box";
97
+ const s = el.style;
98
+ s.position = "absolute";
99
+ s.boxSizing = "border-box";
100
+ s.padding = "0px";
101
+ s.margin = "0px";
102
+
103
+ s.width = "100%";
104
+
105
+ s.bottom = "";
106
+ s.top = "";
107
+ s.left = "";
108
+ s.right = "";
109
+ // s.flexGrow = "2";
110
+ // s.flexShrink = "1";
111
+ // s.flexGrow = "0";
112
+ // s.flexShrink = "0";
113
+ // s.flexBasis = "5";
114
+ s.width = "";
115
+ s.height = "";
116
+ s.flex = "none";
117
+
118
+ s.boxShadow = "";
119
+ s.fontSize = "12px";
120
+ s.lineHeight = "1";
121
+ s.textAlign = "center";
122
+ s.textDecoration = "none";
123
+ s.boxShadow = "";
124
+ s.boxSizing = "border-box";
125
+ s.fontWeight = "500";
126
+ s.borderStyle = "";
127
+ s.borderRadius = "";
128
+ s.borderWidth = "";
129
+ s.borderWidth = "10px";
130
+ s.borderColor = "black";
131
+ s.backgroundColor = "";
132
+ s.border = "";
133
+ s.borderStyle = "none";
134
+ s.outline = "";
135
+ s.wordSpacing = "";
136
+ s.userSelect = "none";
137
+ s.textShadow = "";
99
138
  return el;
100
139
  };
101
140
 
@@ -104,6 +143,7 @@ export namespace DStyle {
104
143
  style: Partial<DStyle>,
105
144
  scale: number,
106
145
  ): T => {
146
+ const { isNumber, isString } = DUtil;
107
147
  // const scalePx = DCss.toStringCre(this.scale);
108
148
  const {
109
149
  x,
@@ -122,9 +162,11 @@ export namespace DStyle {
122
162
  cursor,
123
163
  fontSize,
124
164
  fontWeight,
165
+ lineHeight,
125
166
  textColor,
126
167
  textAlign,
127
168
  translate,
169
+ flex,
128
170
  margin,
129
171
  padding,
130
172
  letterSpacing,
@@ -155,9 +197,12 @@ export namespace DStyle {
155
197
  maxHeight,
156
198
  } = style;
157
199
 
158
- if (typeof zIndex === "number") {
200
+ if (isNumber(zIndex)) {
159
201
  el.style.zIndex = "" + zIndex;
160
202
  }
203
+ if (isString(flex)) {
204
+ el.style.flex = flex;
205
+ }
161
206
 
162
207
  if (DCss.isLengthUnit(minWidth)) {
163
208
  el.style.minWidth = DCss.toString(minWidth, scale);
@@ -167,6 +212,10 @@ export namespace DStyle {
167
212
  el.style.maxWidth = DCss.toString(maxWidth, scale);
168
213
  }
169
214
 
215
+ if (typeof lineHeight === "number") {
216
+ el.style.lineHeight = "" + lineHeight;
217
+ }
218
+
170
219
  if (DCss.isLengthUnit(minHeight)) {
171
220
  el.style.minHeight = DCss.toString(minHeight, scale);
172
221
  }
@@ -327,6 +376,7 @@ export namespace DStyle {
327
376
  }
328
377
  return el;
329
378
  };
379
+
330
380
  // const propNames = new Set(...ElementKeyNames);
331
381
  // export const validKey = (keyName: string) => propNames.has(keyName);
332
382
  }