@riddledc/riddle-proof 0.7.160 → 0.7.162

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.
@@ -5738,54 +5738,79 @@ async function executeSetupAction(action, ordinal, viewport) {
5738
5738
  const durationMs = setupNumber(action.duration_ms ?? action.durationMs, 0);
5739
5739
  const pointerType = String(action.pointer_type || action.pointerType || "mouse").trim().toLowerCase();
5740
5740
  if (pointerType === "touch" || pointerType === "pen") {
5741
- const localStart = {
5742
- x: coordinate(fromX, box.width),
5743
- y: coordinate(fromY, box.height),
5744
- };
5745
- const localEnd = {
5746
- x: coordinate(toX, box.width),
5747
- y: coordinate(toY, box.height),
5748
- };
5749
- await target.evaluate(async (element, payload) => {
5750
- const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
5751
- const rect = element.getBoundingClientRect();
5752
- const pointerId = payload.pointerType === "touch" ? 11 : 12;
5753
- const point = (progress) => ({
5754
- clientX: rect.left + payload.start.x + (payload.end.x - payload.start.x) * progress,
5755
- clientY: rect.top + payload.start.y + (payload.end.y - payload.start.y) * progress,
5756
- });
5757
- const dispatch = (type, progress) => {
5758
- const coords = point(progress);
5759
- element.dispatchEvent(new PointerEvent(type, {
5760
- bubbles: true,
5761
- cancelable: true,
5762
- composed: true,
5763
- pointerId,
5764
- pointerType: payload.pointerType,
5765
- isPrimary: true,
5766
- buttons: type === "pointerup" ? 0 : 1,
5767
- button: type === "pointerup" ? 0 : 0,
5768
- clientX: coords.clientX,
5769
- clientY: coords.clientY,
5770
- }));
5771
- };
5772
- dispatch("pointerover", 0);
5773
- dispatch("pointerenter", 0);
5774
- dispatch("pointerdown", 0);
5775
- for (let step = 1; step <= payload.steps; step += 1) {
5776
- dispatch("pointermove", step / payload.steps);
5777
- if (payload.durationMs && payload.steps > 1) await wait(payload.durationMs / payload.steps);
5741
+ const client = await page.context().newCDPSession(page);
5742
+ try {
5743
+ if (pointerType === "touch") {
5744
+ const touchPoint = (x, y) => ({
5745
+ x,
5746
+ y,
5747
+ radiusX: 1,
5748
+ radiusY: 1,
5749
+ force: 1,
5750
+ id: 11,
5751
+ });
5752
+ await client.send("Input.dispatchTouchEvent", {
5753
+ type: "touchStart",
5754
+ touchPoints: [touchPoint(start.x, start.y)],
5755
+ });
5756
+ for (let step = 1; step <= steps; step += 1) {
5757
+ const progress = step / steps;
5758
+ await client.send("Input.dispatchTouchEvent", {
5759
+ type: "touchMove",
5760
+ touchPoints: [
5761
+ touchPoint(
5762
+ start.x + (end.x - start.x) * progress,
5763
+ start.y + (end.y - start.y) * progress,
5764
+ ),
5765
+ ],
5766
+ });
5767
+ if (durationMs && steps > 1) await page.waitForTimeout(durationMs / steps);
5768
+ }
5769
+ await client.send("Input.dispatchTouchEvent", {
5770
+ type: "touchEnd",
5771
+ touchPoints: [],
5772
+ });
5773
+ } else {
5774
+ await client.send("Input.dispatchMouseEvent", {
5775
+ type: "mouseMoved",
5776
+ x: start.x,
5777
+ y: start.y,
5778
+ pointerType: "pen",
5779
+ });
5780
+ await client.send("Input.dispatchMouseEvent", {
5781
+ type: "mousePressed",
5782
+ x: start.x,
5783
+ y: start.y,
5784
+ button: "left",
5785
+ buttons: 1,
5786
+ clickCount: 1,
5787
+ pointerType: "pen",
5788
+ });
5789
+ for (let step = 1; step <= steps; step += 1) {
5790
+ const progress = step / steps;
5791
+ await client.send("Input.dispatchMouseEvent", {
5792
+ type: "mouseMoved",
5793
+ x: start.x + (end.x - start.x) * progress,
5794
+ y: start.y + (end.y - start.y) * progress,
5795
+ button: "left",
5796
+ buttons: 1,
5797
+ pointerType: "pen",
5798
+ });
5799
+ if (durationMs && steps > 1) await page.waitForTimeout(durationMs / steps);
5800
+ }
5801
+ await client.send("Input.dispatchMouseEvent", {
5802
+ type: "mouseReleased",
5803
+ x: end.x,
5804
+ y: end.y,
5805
+ button: "left",
5806
+ buttons: 0,
5807
+ clickCount: 1,
5808
+ pointerType: "pen",
5809
+ });
5778
5810
  }
5779
- dispatch("pointerup", 1);
5780
- dispatch("pointerout", 1);
5781
- dispatch("pointerleave", 1);
5782
- }, {
5783
- pointerType,
5784
- start: localStart,
5785
- end: localEnd,
5786
- steps,
5787
- durationMs,
5788
- });
5811
+ } finally {
5812
+ await client.detach().catch(() => {});
5813
+ }
5789
5814
  } else {
5790
5815
  await page.mouse.move(start.x, start.y);
5791
5816
  await page.mouse.down();
@@ -5818,6 +5843,7 @@ async function executeSetupAction(action, ordinal, viewport) {
5818
5843
  to_x: toX,
5819
5844
  to_y: toY,
5820
5845
  pointer_type: pointerType,
5846
+ input_dispatch: pointerType === "touch" || pointerType === "pen" ? "cdp" : "playwright_mouse",
5821
5847
  steps,
5822
5848
  duration_ms: durationMs || undefined,
5823
5849
  };
package/dist/cli.cjs CHANGED
@@ -12679,54 +12679,79 @@ async function executeSetupAction(action, ordinal, viewport) {
12679
12679
  const durationMs = setupNumber(action.duration_ms ?? action.durationMs, 0);
12680
12680
  const pointerType = String(action.pointer_type || action.pointerType || "mouse").trim().toLowerCase();
12681
12681
  if (pointerType === "touch" || pointerType === "pen") {
12682
- const localStart = {
12683
- x: coordinate(fromX, box.width),
12684
- y: coordinate(fromY, box.height),
12685
- };
12686
- const localEnd = {
12687
- x: coordinate(toX, box.width),
12688
- y: coordinate(toY, box.height),
12689
- };
12690
- await target.evaluate(async (element, payload) => {
12691
- const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
12692
- const rect = element.getBoundingClientRect();
12693
- const pointerId = payload.pointerType === "touch" ? 11 : 12;
12694
- const point = (progress) => ({
12695
- clientX: rect.left + payload.start.x + (payload.end.x - payload.start.x) * progress,
12696
- clientY: rect.top + payload.start.y + (payload.end.y - payload.start.y) * progress,
12697
- });
12698
- const dispatch = (type, progress) => {
12699
- const coords = point(progress);
12700
- element.dispatchEvent(new PointerEvent(type, {
12701
- bubbles: true,
12702
- cancelable: true,
12703
- composed: true,
12704
- pointerId,
12705
- pointerType: payload.pointerType,
12706
- isPrimary: true,
12707
- buttons: type === "pointerup" ? 0 : 1,
12708
- button: type === "pointerup" ? 0 : 0,
12709
- clientX: coords.clientX,
12710
- clientY: coords.clientY,
12711
- }));
12712
- };
12713
- dispatch("pointerover", 0);
12714
- dispatch("pointerenter", 0);
12715
- dispatch("pointerdown", 0);
12716
- for (let step = 1; step <= payload.steps; step += 1) {
12717
- dispatch("pointermove", step / payload.steps);
12718
- if (payload.durationMs && payload.steps > 1) await wait(payload.durationMs / payload.steps);
12682
+ const client = await page.context().newCDPSession(page);
12683
+ try {
12684
+ if (pointerType === "touch") {
12685
+ const touchPoint = (x, y) => ({
12686
+ x,
12687
+ y,
12688
+ radiusX: 1,
12689
+ radiusY: 1,
12690
+ force: 1,
12691
+ id: 11,
12692
+ });
12693
+ await client.send("Input.dispatchTouchEvent", {
12694
+ type: "touchStart",
12695
+ touchPoints: [touchPoint(start.x, start.y)],
12696
+ });
12697
+ for (let step = 1; step <= steps; step += 1) {
12698
+ const progress = step / steps;
12699
+ await client.send("Input.dispatchTouchEvent", {
12700
+ type: "touchMove",
12701
+ touchPoints: [
12702
+ touchPoint(
12703
+ start.x + (end.x - start.x) * progress,
12704
+ start.y + (end.y - start.y) * progress,
12705
+ ),
12706
+ ],
12707
+ });
12708
+ if (durationMs && steps > 1) await page.waitForTimeout(durationMs / steps);
12709
+ }
12710
+ await client.send("Input.dispatchTouchEvent", {
12711
+ type: "touchEnd",
12712
+ touchPoints: [],
12713
+ });
12714
+ } else {
12715
+ await client.send("Input.dispatchMouseEvent", {
12716
+ type: "mouseMoved",
12717
+ x: start.x,
12718
+ y: start.y,
12719
+ pointerType: "pen",
12720
+ });
12721
+ await client.send("Input.dispatchMouseEvent", {
12722
+ type: "mousePressed",
12723
+ x: start.x,
12724
+ y: start.y,
12725
+ button: "left",
12726
+ buttons: 1,
12727
+ clickCount: 1,
12728
+ pointerType: "pen",
12729
+ });
12730
+ for (let step = 1; step <= steps; step += 1) {
12731
+ const progress = step / steps;
12732
+ await client.send("Input.dispatchMouseEvent", {
12733
+ type: "mouseMoved",
12734
+ x: start.x + (end.x - start.x) * progress,
12735
+ y: start.y + (end.y - start.y) * progress,
12736
+ button: "left",
12737
+ buttons: 1,
12738
+ pointerType: "pen",
12739
+ });
12740
+ if (durationMs && steps > 1) await page.waitForTimeout(durationMs / steps);
12741
+ }
12742
+ await client.send("Input.dispatchMouseEvent", {
12743
+ type: "mouseReleased",
12744
+ x: end.x,
12745
+ y: end.y,
12746
+ button: "left",
12747
+ buttons: 0,
12748
+ clickCount: 1,
12749
+ pointerType: "pen",
12750
+ });
12719
12751
  }
12720
- dispatch("pointerup", 1);
12721
- dispatch("pointerout", 1);
12722
- dispatch("pointerleave", 1);
12723
- }, {
12724
- pointerType,
12725
- start: localStart,
12726
- end: localEnd,
12727
- steps,
12728
- durationMs,
12729
- });
12752
+ } finally {
12753
+ await client.detach().catch(() => {});
12754
+ }
12730
12755
  } else {
12731
12756
  await page.mouse.move(start.x, start.y);
12732
12757
  await page.mouse.down();
@@ -12759,6 +12784,7 @@ async function executeSetupAction(action, ordinal, viewport) {
12759
12784
  to_x: toX,
12760
12785
  to_y: toY,
12761
12786
  pointer_type: pointerType,
12787
+ input_dispatch: pointerType === "touch" || pointerType === "pen" ? "cdp" : "playwright_mouse",
12762
12788
  steps,
12763
12789
  duration_ms: durationMs || undefined,
12764
12790
  };
package/dist/cli.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  profileStatusExitCode,
14
14
  resolveRiddleProofProfileTargetUrl,
15
15
  resolveRiddleProofProfileTimeoutSec
16
- } from "./chunk-MV7UM4EV.js";
16
+ } from "./chunk-ZLNPYVMJ.js";
17
17
  import {
18
18
  createRiddleApiClient,
19
19
  isTerminalRiddleJobStatus,
package/dist/index.cjs CHANGED
@@ -14471,54 +14471,79 @@ async function executeSetupAction(action, ordinal, viewport) {
14471
14471
  const durationMs = setupNumber(action.duration_ms ?? action.durationMs, 0);
14472
14472
  const pointerType = String(action.pointer_type || action.pointerType || "mouse").trim().toLowerCase();
14473
14473
  if (pointerType === "touch" || pointerType === "pen") {
14474
- const localStart = {
14475
- x: coordinate(fromX, box.width),
14476
- y: coordinate(fromY, box.height),
14477
- };
14478
- const localEnd = {
14479
- x: coordinate(toX, box.width),
14480
- y: coordinate(toY, box.height),
14481
- };
14482
- await target.evaluate(async (element, payload) => {
14483
- const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
14484
- const rect = element.getBoundingClientRect();
14485
- const pointerId = payload.pointerType === "touch" ? 11 : 12;
14486
- const point = (progress) => ({
14487
- clientX: rect.left + payload.start.x + (payload.end.x - payload.start.x) * progress,
14488
- clientY: rect.top + payload.start.y + (payload.end.y - payload.start.y) * progress,
14489
- });
14490
- const dispatch = (type, progress) => {
14491
- const coords = point(progress);
14492
- element.dispatchEvent(new PointerEvent(type, {
14493
- bubbles: true,
14494
- cancelable: true,
14495
- composed: true,
14496
- pointerId,
14497
- pointerType: payload.pointerType,
14498
- isPrimary: true,
14499
- buttons: type === "pointerup" ? 0 : 1,
14500
- button: type === "pointerup" ? 0 : 0,
14501
- clientX: coords.clientX,
14502
- clientY: coords.clientY,
14503
- }));
14504
- };
14505
- dispatch("pointerover", 0);
14506
- dispatch("pointerenter", 0);
14507
- dispatch("pointerdown", 0);
14508
- for (let step = 1; step <= payload.steps; step += 1) {
14509
- dispatch("pointermove", step / payload.steps);
14510
- if (payload.durationMs && payload.steps > 1) await wait(payload.durationMs / payload.steps);
14474
+ const client = await page.context().newCDPSession(page);
14475
+ try {
14476
+ if (pointerType === "touch") {
14477
+ const touchPoint = (x, y) => ({
14478
+ x,
14479
+ y,
14480
+ radiusX: 1,
14481
+ radiusY: 1,
14482
+ force: 1,
14483
+ id: 11,
14484
+ });
14485
+ await client.send("Input.dispatchTouchEvent", {
14486
+ type: "touchStart",
14487
+ touchPoints: [touchPoint(start.x, start.y)],
14488
+ });
14489
+ for (let step = 1; step <= steps; step += 1) {
14490
+ const progress = step / steps;
14491
+ await client.send("Input.dispatchTouchEvent", {
14492
+ type: "touchMove",
14493
+ touchPoints: [
14494
+ touchPoint(
14495
+ start.x + (end.x - start.x) * progress,
14496
+ start.y + (end.y - start.y) * progress,
14497
+ ),
14498
+ ],
14499
+ });
14500
+ if (durationMs && steps > 1) await page.waitForTimeout(durationMs / steps);
14501
+ }
14502
+ await client.send("Input.dispatchTouchEvent", {
14503
+ type: "touchEnd",
14504
+ touchPoints: [],
14505
+ });
14506
+ } else {
14507
+ await client.send("Input.dispatchMouseEvent", {
14508
+ type: "mouseMoved",
14509
+ x: start.x,
14510
+ y: start.y,
14511
+ pointerType: "pen",
14512
+ });
14513
+ await client.send("Input.dispatchMouseEvent", {
14514
+ type: "mousePressed",
14515
+ x: start.x,
14516
+ y: start.y,
14517
+ button: "left",
14518
+ buttons: 1,
14519
+ clickCount: 1,
14520
+ pointerType: "pen",
14521
+ });
14522
+ for (let step = 1; step <= steps; step += 1) {
14523
+ const progress = step / steps;
14524
+ await client.send("Input.dispatchMouseEvent", {
14525
+ type: "mouseMoved",
14526
+ x: start.x + (end.x - start.x) * progress,
14527
+ y: start.y + (end.y - start.y) * progress,
14528
+ button: "left",
14529
+ buttons: 1,
14530
+ pointerType: "pen",
14531
+ });
14532
+ if (durationMs && steps > 1) await page.waitForTimeout(durationMs / steps);
14533
+ }
14534
+ await client.send("Input.dispatchMouseEvent", {
14535
+ type: "mouseReleased",
14536
+ x: end.x,
14537
+ y: end.y,
14538
+ button: "left",
14539
+ buttons: 0,
14540
+ clickCount: 1,
14541
+ pointerType: "pen",
14542
+ });
14511
14543
  }
14512
- dispatch("pointerup", 1);
14513
- dispatch("pointerout", 1);
14514
- dispatch("pointerleave", 1);
14515
- }, {
14516
- pointerType,
14517
- start: localStart,
14518
- end: localEnd,
14519
- steps,
14520
- durationMs,
14521
- });
14544
+ } finally {
14545
+ await client.detach().catch(() => {});
14546
+ }
14522
14547
  } else {
14523
14548
  await page.mouse.move(start.x, start.y);
14524
14549
  await page.mouse.down();
@@ -14551,6 +14576,7 @@ async function executeSetupAction(action, ordinal, viewport) {
14551
14576
  to_x: toX,
14552
14577
  to_y: toY,
14553
14578
  pointer_type: pointerType,
14579
+ input_dispatch: pointerType === "touch" || pointerType === "pen" ? "cdp" : "playwright_mouse",
14554
14580
  steps,
14555
14581
  duration_ms: durationMs || undefined,
14556
14582
  };
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ import {
62
62
  resolveRiddleProofProfileTimeoutSec,
63
63
  slugifyRiddleProofProfileName,
64
64
  summarizeRiddleProofProfileResult
65
- } from "./chunk-MV7UM4EV.js";
65
+ } from "./chunk-ZLNPYVMJ.js";
66
66
  import {
67
67
  DEFAULT_RIDDLE_API_BASE_URL,
68
68
  DEFAULT_RIDDLE_API_KEY_FILE,
package/dist/profile.cjs CHANGED
@@ -5785,54 +5785,79 @@ async function executeSetupAction(action, ordinal, viewport) {
5785
5785
  const durationMs = setupNumber(action.duration_ms ?? action.durationMs, 0);
5786
5786
  const pointerType = String(action.pointer_type || action.pointerType || "mouse").trim().toLowerCase();
5787
5787
  if (pointerType === "touch" || pointerType === "pen") {
5788
- const localStart = {
5789
- x: coordinate(fromX, box.width),
5790
- y: coordinate(fromY, box.height),
5791
- };
5792
- const localEnd = {
5793
- x: coordinate(toX, box.width),
5794
- y: coordinate(toY, box.height),
5795
- };
5796
- await target.evaluate(async (element, payload) => {
5797
- const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
5798
- const rect = element.getBoundingClientRect();
5799
- const pointerId = payload.pointerType === "touch" ? 11 : 12;
5800
- const point = (progress) => ({
5801
- clientX: rect.left + payload.start.x + (payload.end.x - payload.start.x) * progress,
5802
- clientY: rect.top + payload.start.y + (payload.end.y - payload.start.y) * progress,
5803
- });
5804
- const dispatch = (type, progress) => {
5805
- const coords = point(progress);
5806
- element.dispatchEvent(new PointerEvent(type, {
5807
- bubbles: true,
5808
- cancelable: true,
5809
- composed: true,
5810
- pointerId,
5811
- pointerType: payload.pointerType,
5812
- isPrimary: true,
5813
- buttons: type === "pointerup" ? 0 : 1,
5814
- button: type === "pointerup" ? 0 : 0,
5815
- clientX: coords.clientX,
5816
- clientY: coords.clientY,
5817
- }));
5818
- };
5819
- dispatch("pointerover", 0);
5820
- dispatch("pointerenter", 0);
5821
- dispatch("pointerdown", 0);
5822
- for (let step = 1; step <= payload.steps; step += 1) {
5823
- dispatch("pointermove", step / payload.steps);
5824
- if (payload.durationMs && payload.steps > 1) await wait(payload.durationMs / payload.steps);
5788
+ const client = await page.context().newCDPSession(page);
5789
+ try {
5790
+ if (pointerType === "touch") {
5791
+ const touchPoint = (x, y) => ({
5792
+ x,
5793
+ y,
5794
+ radiusX: 1,
5795
+ radiusY: 1,
5796
+ force: 1,
5797
+ id: 11,
5798
+ });
5799
+ await client.send("Input.dispatchTouchEvent", {
5800
+ type: "touchStart",
5801
+ touchPoints: [touchPoint(start.x, start.y)],
5802
+ });
5803
+ for (let step = 1; step <= steps; step += 1) {
5804
+ const progress = step / steps;
5805
+ await client.send("Input.dispatchTouchEvent", {
5806
+ type: "touchMove",
5807
+ touchPoints: [
5808
+ touchPoint(
5809
+ start.x + (end.x - start.x) * progress,
5810
+ start.y + (end.y - start.y) * progress,
5811
+ ),
5812
+ ],
5813
+ });
5814
+ if (durationMs && steps > 1) await page.waitForTimeout(durationMs / steps);
5815
+ }
5816
+ await client.send("Input.dispatchTouchEvent", {
5817
+ type: "touchEnd",
5818
+ touchPoints: [],
5819
+ });
5820
+ } else {
5821
+ await client.send("Input.dispatchMouseEvent", {
5822
+ type: "mouseMoved",
5823
+ x: start.x,
5824
+ y: start.y,
5825
+ pointerType: "pen",
5826
+ });
5827
+ await client.send("Input.dispatchMouseEvent", {
5828
+ type: "mousePressed",
5829
+ x: start.x,
5830
+ y: start.y,
5831
+ button: "left",
5832
+ buttons: 1,
5833
+ clickCount: 1,
5834
+ pointerType: "pen",
5835
+ });
5836
+ for (let step = 1; step <= steps; step += 1) {
5837
+ const progress = step / steps;
5838
+ await client.send("Input.dispatchMouseEvent", {
5839
+ type: "mouseMoved",
5840
+ x: start.x + (end.x - start.x) * progress,
5841
+ y: start.y + (end.y - start.y) * progress,
5842
+ button: "left",
5843
+ buttons: 1,
5844
+ pointerType: "pen",
5845
+ });
5846
+ if (durationMs && steps > 1) await page.waitForTimeout(durationMs / steps);
5847
+ }
5848
+ await client.send("Input.dispatchMouseEvent", {
5849
+ type: "mouseReleased",
5850
+ x: end.x,
5851
+ y: end.y,
5852
+ button: "left",
5853
+ buttons: 0,
5854
+ clickCount: 1,
5855
+ pointerType: "pen",
5856
+ });
5825
5857
  }
5826
- dispatch("pointerup", 1);
5827
- dispatch("pointerout", 1);
5828
- dispatch("pointerleave", 1);
5829
- }, {
5830
- pointerType,
5831
- start: localStart,
5832
- end: localEnd,
5833
- steps,
5834
- durationMs,
5835
- });
5858
+ } finally {
5859
+ await client.detach().catch(() => {});
5860
+ }
5836
5861
  } else {
5837
5862
  await page.mouse.move(start.x, start.y);
5838
5863
  await page.mouse.down();
@@ -5865,6 +5890,7 @@ async function executeSetupAction(action, ordinal, viewport) {
5865
5890
  to_x: toX,
5866
5891
  to_y: toY,
5867
5892
  pointer_type: pointerType,
5893
+ input_dispatch: pointerType === "touch" || pointerType === "pen" ? "cdp" : "playwright_mouse",
5868
5894
  steps,
5869
5895
  duration_ms: durationMs || undefined,
5870
5896
  };
package/dist/profile.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  resolveRiddleProofProfileTimeoutSec,
24
24
  slugifyRiddleProofProfileName,
25
25
  summarizeRiddleProofProfileResult
26
- } from "./chunk-MV7UM4EV.js";
26
+ } from "./chunk-ZLNPYVMJ.js";
27
27
  export {
28
28
  RIDDLE_PROOF_PROFILE_CHECK_TYPES,
29
29
  RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.7.160",
3
+ "version": "0.7.162",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",