From 26ba1b674cafa0406d10d21aabc071ef63d8094b Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Apr 2025 16:15:35 +0545 Subject: [PATCH 01/60] test: add outcome test on loggedIn state --- .../lib/pages/outcomeDetailsPage.ts | 233 +++++++- .../playwright/lib/pages/outcomesPage.ts | 333 ++++++++++- .../9-outcomes/outcomes.loggedin.spec.ts | 122 ++++ .../tests/9-outcomes/outcomes.spec.ts | 561 +++--------------- 4 files changed, 761 insertions(+), 488 deletions(-) create mode 100644 tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.loggedin.spec.ts diff --git a/tests/govtool-frontend/playwright/lib/pages/outcomeDetailsPage.ts b/tests/govtool-frontend/playwright/lib/pages/outcomeDetailsPage.ts index 878d71b67..dd94a1c6b 100644 --- a/tests/govtool-frontend/playwright/lib/pages/outcomeDetailsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/outcomeDetailsPage.ts @@ -1,7 +1,14 @@ import environments from "@constants/environments"; import { formatWithThousandSeparator } from "@helpers/adaFormat"; -import { Page, Response } from "@playwright/test"; -import { outcomeProposal, VoterType } from "@types"; +import { Browser, expect, Page, Response } from "@playwright/test"; +import { outcomeProposal, outcomeType } from "@types"; +import OutComesPage from "./outcomesPage"; +import { + areCCVoteTotalsDisplayed, + areDRepVoteTotalsDisplayed, + areSPOVoteTotalsDisplayed, +} from "@helpers/featureFlag"; +import { parseVotingPowerAndPercentage } from "@helpers/index"; export default class OutcomeDetailsPage { readonly dRepYesVotes = this.page.getByTestId("DReps-yes-votes-submitted"); @@ -81,4 +88,226 @@ export default class OutcomeDetailsPage { sPosNoConfidence, }; } + + async shouldDisplayCorrectVotingResults( + browser: Browser, + isLoggedIn = false + ) { + await Promise.all( + Object.keys(outcomeType).map(async (filterKey) => { + const outcomePage = new OutComesPage(this.page); + const { + govActionDetailsPage, + metricsResponsePromise, + outcomeResponsePromise, + } = await outcomePage.navigateToFilteredProposalDetail( + browser, + filterKey, + isLoggedIn + ); + + const outcomeResponse = await outcomeResponsePromise; + const proposalToCheck = (await outcomeResponse.json())[0]; + + const metricsResponse = await metricsResponsePromise; + + const { autoAbstain, noConfidence, sPosAutoAbstain, sPosNoConfidence } = + await govActionDetailsPage.getSposAndDRepAbstainNoConfidence( + metricsResponse + ); + + const currentPageUrl = govActionDetailsPage.currentPage.url(); + + // check dRep votes + if (await areDRepVoteTotalsDisplayed(proposalToCheck)) { + await govActionDetailsPage.dRepExpandButton.click(); + + await expect( + govActionDetailsPage.dRepResultData.getByRole("row", { + name: "Yes", + }), + { + message: `DRep "Yes" voting power checked for ${currentPageUrl}`, + } + ).toHaveText( + `Yes${formatWithThousandSeparator(proposalToCheck.yes_votes, false)}`, + { + timeout: 60_000, + } + ); //BUG missing testIds + + await expect( + govActionDetailsPage.dRepResultData.getByRole("row", { + name: "Auto-Abstain", + }), + { + message: `DRep "Auto-Abstain" voting power checked for ${currentPageUrl}`, + } + ).toHaveText(`Auto-Abstain${autoAbstain}`); //BUG missing testIds + await expect( + govActionDetailsPage.dRepResultData.getByRole("row", { + name: "No Confidence", + }), + { + message: `DRep "No Confidence" voting power checked for ${currentPageUrl}`, + } + ).toHaveText(`No Confidence${noConfidence}`); //BUG missing testIds + await expect( + govActionDetailsPage.dRepResultData.getByRole("row", { + name: "Explicit", + }), + { + message: `DRep "Explicit" voting power checked for ${currentPageUrl}`, + } + ).toHaveText( + `Explicit${formatWithThousandSeparator(proposalToCheck.abstain_votes, false)}` + ); + + await expect( + govActionDetailsPage.dRepResultData + .getByRole("row", { + name: "No", + }) + .first(), + { + message: `DRep "No" voting power checked for ${currentPageUrl}`, + } + ).toHaveText( + `No${formatWithThousandSeparator(proposalToCheck.no_votes, false)}` + ); //BUG missing testIds + } + + // check sPos votes + if (await areSPOVoteTotalsDisplayed(proposalToCheck)) { + await govActionDetailsPage.sPosExpandButton.click(); + const totalSposNoVotes = + filterKey === "NoConfidence" + ? proposalToCheck.pool_no_votes + : parseInt(sPosNoConfidence.replace(/,/g, "")) * 1000000 + + parseInt(proposalToCheck.pool_no_votes); + + const totalSposYesVotesForNoConfidence = + parseInt(sPosNoConfidence.replace(/,/g, "")) * 1000000 + + parseInt(proposalToCheck.pool_yes_votes); + + const totalSposYesVotes = + filterKey === "NoConfidence" + ? totalSposYesVotesForNoConfidence + : proposalToCheck.pool_yes_votes; + await expect( + govActionDetailsPage.sPosResultData.getByRole("row", { + name: "Yes", + }), + { + message: `SPos "Yes" voting power checked for ${currentPageUrl}`, + } + ).toHaveText( + `Yes${formatWithThousandSeparator(totalSposYesVotes, false)}`, + { + timeout: 60_000, + } + ); //BUG missing testIds + + await expect( + govActionDetailsPage.sPosResultData.getByRole("row", { + name: "Auto-Abstain", + }), + { + message: `SPos "Auto-Abstain" voting power checked for ${currentPageUrl}`, + } + ).toHaveText(`Auto-Abstain${sPosAutoAbstain}`); //BUG missing testIds + await expect( + govActionDetailsPage.sPosResultData.getByRole("row", { + name: "No Confidence", + }), + { + message: `SPos "No Confidence" voting power checked for ${currentPageUrl}`, + } + ).toHaveText(`No Confidence${sPosNoConfidence}`); //BUG missing testIds + await expect( + govActionDetailsPage.sPosResultData.getByRole("row", { + name: "Explicit", + }), + { + message: `SPos "Explicit" voting power checked for ${currentPageUrl}`, + } + ).toHaveText( + `Explicit${formatWithThousandSeparator(proposalToCheck.pool_abstain_votes, false)}` + ); //BUG missing testIds + await expect( + govActionDetailsPage.sPosResultData + .getByRole("row", { + name: "No", + }) + .first(), + { + message: `SPos "No" voting power checked for ${currentPageUrl}`, + } + ).toHaveText( + `No${formatWithThousandSeparator(totalSposNoVotes, false)}` + ); //BUG missing testIds + } + + // check ccCommittee votes + if (areCCVoteTotalsDisplayed(proposalToCheck)) { + const ccYesVoteSubmittedText = + await govActionDetailsPage.ccCommitteeYesVotes.textContent(); + + const { percentage: yesPercentage } = parseVotingPowerAndPercentage( + ccYesVoteSubmittedText + ); + + await expect(govActionDetailsPage.ccCommitteeYesVotes, { + message: `CC "Yes" vote count checked for ${currentPageUrl}`, + }).toHaveText(`${proposalToCheck.cc_yes_votes} - ${yesPercentage}`); + await expect( + govActionDetailsPage.cCResultData.getByRole("row", { + name: "Abstain Votes", + }), + { + message: `CC "Abstain" vote count checked for ${currentPageUrl}`, + } + ).toHaveText(`Abstain Votes${proposalToCheck.pool_abstain_votes}`); //BUG missing testIds + + const noPercentage = 100 - parseFloat(yesPercentage.replace("%", "")); + await expect(govActionDetailsPage.ccCommitteeNoVotes, { + message: `CC "No" vote count checked for ${currentPageUrl}`, + }).toHaveText( + `${proposalToCheck.cc_no_votes} - ${noPercentage.toFixed(2)}%` + ); + } + }) + ); + } + + async verifyInvalidOutcomeMetadata({ + outcomeResponse, + type, + url, + hash, + }: { + outcomeResponse: outcomeProposal; + type: string; + url: string; + hash: string; + }) { + await this.page.route(/.*\/governance-actions\/[a-f0-9]{64}\?.*/, (route) => + route.fulfill({ body: JSON.stringify([outcomeResponse]) }) + ); + + const outcomePage = new OutComesPage(this.page); + await outcomePage.goto(); + await outcomePage.viewFirstOutcomes(); + const outcomeTitle = await outcomePage.title.textContent(); + + await expect( + outcomePage.title, + outcomeTitle.toLowerCase() !== type.toLowerCase() && + `The URL "${url}" and hash "${hash}" do not match the expected properties for type "${type}".` + ).toHaveText(type, { + ignoreCase: true, + timeout: 60_000, + }); + await expect(outcomePage.metadataErrorLearnMoreBtn).toBeVisible(); + } } diff --git a/tests/govtool-frontend/playwright/lib/pages/outcomesPage.ts b/tests/govtool-frontend/playwright/lib/pages/outcomesPage.ts index 0d0d3e0f8..e8a72481a 100644 --- a/tests/govtool-frontend/playwright/lib/pages/outcomesPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/outcomesPage.ts @@ -2,9 +2,24 @@ import environments from "@constants/environments"; import { outcomeStatusType } from "@constants/index"; import { toCamelCase } from "@helpers/string"; import { functionWaitedAssert, waitedLoop } from "@helpers/waitedLoop"; -import { expect, Locator, Page } from "@playwright/test"; -import { outcomeProposal, outcomeType } from "@types"; +import { Browser, expect, Locator, Page } from "@playwright/test"; +import { outcomeMetadata, outcomeProposal, outcomeType } from "@types"; import OutcomeDetailsPage from "./outcomeDetailsPage"; +import { isMobile } from "@helpers/mobile"; +import extractExpiryDateFromText from "@helpers/extractExpiryDateFromText"; +import { createNewPageWithWallet, injectLogger } from "@helpers/page"; +import { createTempUserAuth } from "@datafactory/createAuth"; +import { user01Wallet } from "@constants/staticWallets"; +import { user01AuthFile } from "@constants/auth"; + +const status = ["Expired", "Ratified", "Enacted", "Live"]; + +enum SortOption { + SoonToExpire = "Soon to expire", + NewestFirst = "Newest first", + OldestFirst = "Oldest first", + HighestAmountYesVote = "Highest amount of yes votes", +} export default class OutComesPage { // Buttons @@ -236,4 +251,318 @@ export default class OutComesPage { }); return outcomeStatus.some((status) => filters.includes(status)); } + + async shouldAccessPage() { + await this.page.goto("/"); + + if (isMobile(this.page)) { + await this.page.getByTestId("open-drawer-button").click(); + } + await this.page.getByTestId("governance-actions-outcomes-link").click(); + + await expect(this.page.getByText(/outcomes/i)).toHaveCount(2); + } + + async filterOutcomes() { + await this.filterBtn.click(); + const filterOptionNames = Object.values(outcomeType); + + // proposal type filter + await this.applyAndValidateFilters( + filterOptionNames, + this._validateFiltersInOutcomeCard + ); + + // proposal status filter + await this.applyAndValidateFilters( + status, + this._validateStatusFiltersInOutcomeCard + ); + } + + async sortOutcomes() { + await this.sortBtn.click(); + + await this.sortAndValidate( + SortOption.NewestFirst, + (p1, p2) => p1.expiry_date >= p2.time + ); + + await this.sortAndValidate( + SortOption.OldestFirst, + (p1, p2) => p1.expiry_date <= p2.expiry_date + ); + + await this.sortAndValidate( + SortOption.HighestAmountYesVote, + (p1, p2) => parseInt(p1.yes_votes) >= parseInt(p2.yes_votes) + ); + } + + async filterAndSortOutcomes() { + const filterOptionKeys = Object.keys(outcomeType); + const filterOptionNames = Object.values(outcomeType); + + const choice = Math.floor(Math.random() * filterOptionKeys.length); + await this.goto({ filter: filterOptionKeys[choice] }); + await this.sortBtn.click(); + + await this.sortAndValidate( + SortOption.OldestFirst, + (p1, p2) => p1.expiry_date <= p2.expiry_date + ); + + await this.validateFilters( + [filterOptionNames[choice]], + this._validateFiltersInOutcomeCard + ); + } + + async verifyAllOutcomesAreExpired() { + const proposalCards = await this.getAllOutcomes(); + + for (const proposalCard of proposalCards) { + const expiryDateEl = proposalCard.locator( + '[data-testid$="-Expired-date"]' + ); + const expiryDateTxt = await expiryDateEl.innerText(); + const expiryDate = extractExpiryDateFromText(expiryDateTxt); + const today = new Date(); + expect(today >= expiryDate).toBeTruthy(); + } + } + + async VerifyLoadMoreOutcomes() { + const responsePromise = this.page.waitForResponse((response) => + response + .url() + .includes(`governance-actions?search=&filters=&sort=newestFirst&page=2`) + ); + await this.goto(); + + let governanceActionIdsBefore: String[]; + let governanceActionIdsAfter: String[]; + + await functionWaitedAssert( + async () => { + governanceActionIdsBefore = + await this.getAllListedCIP105GovernanceIds(); + await this.showMoreBtn.click(); + }, + { message: "Show more button not visible" } + ); + + const response = await responsePromise; + const governanceActionListAfter = await response.json(); + + await functionWaitedAssert( + async () => { + governanceActionIdsAfter = await this.getAllListedCIP105GovernanceIds(); + expect(governanceActionIdsAfter.length).toBeGreaterThan( + governanceActionIdsBefore.length + ); + }, + { message: "Outcomes not loaded after clicking show more" } + ); + + if (governanceActionListAfter.length >= governanceActionIdsBefore.length) { + await expect(this.showMoreBtn).toBeVisible(); + expect(true).toBeTruthy(); + } else { + await expect(this.showMoreBtn).not.toBeVisible(); + } + } + + async fetchOutcomeIdFromNetwork(governanceActionId: string) { + let updatedGovernanceActionId = governanceActionId; + await this.page.route( + "**/governance-actions?search=&filters=&sort=**", + async (route) => { + const response = await route.fetch(); + const data: outcomeProposal[] = await response.json(); + if (!governanceActionId) { + if (data.length > 0) { + const randomIndexForId = Math.floor(Math.random() * data.length); + updatedGovernanceActionId = + data[randomIndexForId].tx_hash + + "#" + + data[randomIndexForId].index; + } + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(data), + }); + } + ); + + const responsePromise = this.page.waitForResponse( + "**/governance-actions?search=&filters=&sort=**" + ); + await this.goto(); + await responsePromise; + return updatedGovernanceActionId; + } + + async fetchOutcomeTitleFromNetwork(governanceActionTitle: string) { + let updatedGovernanceActionTitle = governanceActionTitle; + await this.page.route( + "**/governance-actions/metadata?**", + async (route) => { + try { + const response = await route.fetch(); + if (response.status() !== 200) { + await route.continue(); + return; + } + const data: outcomeMetadata = await response.json(); + if (!governanceActionTitle && data.data.title != null) { + updatedGovernanceActionTitle = data.data.title; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(data), + }); + } catch (error) { + return; + } + } + ); + await this.goto(); + const metadataResponsePromise = this.page.waitForResponse( + "**/governance-actions/metadata?**" + ); + await metadataResponsePromise; + return updatedGovernanceActionTitle; + } + + async searchOutcomesById(governanceActionId: string) { + await this.searchInput.fill(governanceActionId); + await expect( + this.page.getByRole("progressbar").getByRole("img") + ).toBeVisible(); + + await functionWaitedAssert( + async () => { + const idSearchOutcomeCards = await this.getAllOutcomes(); + expect(idSearchOutcomeCards.length, { + message: + idSearchOutcomeCards.length == 0 && "No governance actions found", + }).toBeGreaterThan(0); + for (const outcomeCard of idSearchOutcomeCards) { + const id = await outcomeCard + .locator('[data-testid$="-CIP-105-id"]') + .textContent(); + expect(id.replace(/^.*ID/, "")).toContain(governanceActionId); + } + }, + { name: "search by id" } + ); + } + + async searchOutcomesByTitle(governanceActionTitle: string) { + await this.searchInput.fill(governanceActionTitle); + await expect( + this.page.getByRole("progressbar").getByRole("img") + ).toBeVisible(); + + await functionWaitedAssert( + async () => { + const titleSearchOutcomeCards = await this.getAllOutcomes(); + expect(titleSearchOutcomeCards.length, { + message: + titleSearchOutcomeCards.length == 0 && + "No governance actions found", + }).toBeGreaterThan(0); + for (const outcomeCard of titleSearchOutcomeCards) { + const title = await outcomeCard + .locator('[data-testid$="-card-title"]') + .textContent(); + expect(title.toLowerCase()).toContain( + governanceActionTitle.toLowerCase() + ); + } + }, + { name: "search by title" } + ); + } + + async shouldCopyGovernanceActionId(governanceActionId: string) { + await this.searchInput.fill(governanceActionId); + + await this.page + .getByTestId(`${governanceActionId}-CIP-105-id`) + .getByTestId("copy-button") + .click(); + await expect(this.page.getByText("Copied to clipboard")).toBeVisible({ + timeout: 60_000, + }); + const copiedTextDRepDirectory = await this.page.evaluate(() => + navigator.clipboard.readText() + ); + expect(copiedTextDRepDirectory).toEqual(governanceActionId); + } + + async navigateToFilteredProposalDetail( + browser: Browser, + filterKey: string, + isLoggedIn: boolean + ) { + let page: Page; + if (!isLoggedIn) { + page = await browser.newPage(); + } else { + page = await createNewPageWithWallet(browser, { + storageState: user01AuthFile, + wallet: user01Wallet, + }); + } + injectLogger(page); + + const outcomeListResponsePromise = page.waitForResponse( + (response) => + response + .url() + .includes(`governance-actions?search=&filters=${filterKey}`), + { timeout: 60_000 } + ); + + const metricsResponsePromise = page.waitForResponse( + (response) => response.url().includes(`/misc/network/metrics?epoch`), + { timeout: 60_000 } + ); + + const outcomePage = new OutComesPage(page); + await outcomePage.goto({ filter: filterKey }); + + const outcomeListResponse = await outcomeListResponsePromise; + const proposals = await outcomeListResponse.json(); + + expect( + proposals.length, + proposals.length == 0 && "No proposals found!" + ).toBeGreaterThan(0); + + const { index: governanceActionIndex, tx_hash: governanceTransactionHash } = + proposals[0]; + + const outcomeResponsePromise = page.waitForResponse( + (response) => + response + .url() + .includes( + `governance-actions/${governanceTransactionHash}?index=${governanceActionIndex}` + ), + { timeout: 60_000 } + ); + + const govActionDetailsPage = await outcomePage.viewFirstOutcomes(); + return { + govActionDetailsPage, + outcomeResponsePromise, + metricsResponsePromise, + }; + } } diff --git a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.loggedin.spec.ts new file mode 100644 index 000000000..864286c65 --- /dev/null +++ b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.loggedin.spec.ts @@ -0,0 +1,122 @@ +import { user01AuthFile } from "@constants/auth"; +import { InvalidMetadata } from "@constants/index"; +import { user01Wallet } from "@constants/staticWallets"; +import { test } from "@fixtures/walletExtension"; +import { setAllureEpic } from "@helpers/allure"; +import OutcomeDetailsPage from "@pages/outcomeDetailsPage"; +import OutComesPage from "@pages/outcomesPage"; +import { Page } from "@playwright/test"; + +const invalidOutcomeProposals = require("../../lib/_mock/outcome.json"); + +test.beforeEach(async () => { + await setAllureEpic("9. Outcomes"); +}); + +test.use({ + storageState: user01AuthFile, + wallet: user01Wallet, +}); + +test.describe("Outcomes page", () => { + let outcomePage: OutComesPage; + test.beforeEach(async ({ page }) => { + outcomePage = new OutComesPage(page); + }); + + test("9A_2. Should access Outcomes page in connected state", async () => { + await outcomePage.shouldAccessPage(); + }); + test.describe("outcome sorting and filtering", () => { + test("9C_1B. Should filter Governance Action Type on governance actions page", async () => { + test.slow(); + await outcomePage.goto(); + + await outcomePage.filterOutcomes(); + }); + + test("9C_2B. Should sort Governance Action Type on outcomes page", async () => { + test.slow(); + + await outcomePage.goto({ sort: "oldestFirst" }); + + await outcomePage.sortOutcomes(); + }); + + test("9C_3B. Should filter and sort Governance Action Type on outcomes page", async () => { + await outcomePage.filterAndSortOutcomes(); + }); + }); + + test("9E_2. Should verify all of the displayed governance actions have expired", async () => { + await outcomePage.goto(); + + await outcomePage.verifyAllOutcomesAreExpired(); + }); + + test("9F_2. Should load more Outcomes on show more", async () => { + await outcomePage.VerifyLoadMoreOutcomes(); + }); + + test.describe("Outcome details dependent test", () => { + let governanceActionId: string | undefined; + let governanceActionTitle: string | undefined; + let currentPage: Page; + test.beforeEach(async ({ page }) => { + const outcomePage = new OutComesPage(page); + governanceActionId = + await outcomePage.fetchOutcomeIdFromNetwork(governanceActionId); + governanceActionTitle = await outcomePage.fetchOutcomeTitleFromNetwork( + governanceActionTitle + ); + currentPage = page; + }); + + test("9B_2. Should search outcomes proposal by title and id", async () => { + // search by id + await outcomePage.searchOutcomesById(governanceActionId); + + await outcomePage.searchOutcomesByTitle(governanceActionTitle); + }); + + test("9D_2. Should copy governanceActionId in disconnect state", async ({ + context, + }) => { + await context.grantPermissions(["clipboard-read", "clipboard-write"]); + await outcomePage.shouldCopyGovernanceActionId(governanceActionId); + }); + }); +}); + +test.describe("Outcome details", () => { + test("9G_2. Should display correct vote counts on outcome details page", async ({ + browser, + page, + }) => { + const outcomeDetailPage = new OutcomeDetailsPage(page); + + await outcomeDetailPage.shouldDisplayCorrectVotingResults(browser, true); + }); + + test.describe("Invalid Outcome Metadata", () => { + InvalidMetadata.forEach(({ type, reason, url, hash }, index) => { + test(`9H_${index + 1}B: Should display "${type}" message in outcomes when ${reason}`, async ({ + page, + }) => { + const outcomeResponse = { + ...invalidOutcomeProposals[0], + url, + data_hash: hash, + }; + + const outcomeDetailPage = new OutcomeDetailsPage(page); + await outcomeDetailPage.verifyInvalidOutcomeMetadata({ + outcomeResponse, + type, + url, + hash, + }); + }); + }); + }); +}); diff --git a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts index 0976ebb49..6e67b8727 100644 --- a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts +++ b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts @@ -1,20 +1,9 @@ import { InvalidMetadata } from "@constants/index"; import { test } from "@fixtures/walletExtension"; -import { formatWithThousandSeparator } from "@helpers/adaFormat"; import { setAllureEpic } from "@helpers/allure"; -import extractExpiryDateFromText from "@helpers/extractExpiryDateFromText"; -import { - areCCVoteTotalsDisplayed, - areDRepVoteTotalsDisplayed, - areSPOVoteTotalsDisplayed, -} from "@helpers/featureFlag"; -import { parseVotingPowerAndPercentage } from "@helpers/index"; -import { isMobile } from "@helpers/mobile"; -import { injectLogger } from "@helpers/page"; -import { functionWaitedAssert } from "@helpers/waitedLoop"; +import OutcomeDetailsPage from "@pages/outcomeDetailsPage"; import OutComesPage from "@pages/outcomesPage"; -import { expect, Page } from "@playwright/test"; -import { outcomeMetadata, outcomeProposal, outcomeType } from "@types"; +import { Page } from "@playwright/test"; const invalidOutcomeProposals = require("../../lib/_mock/outcome.json"); @@ -22,501 +11,105 @@ test.beforeEach(async () => { await setAllureEpic("9. Outcomes"); }); -const status = ["Expired", "Ratified", "Enacted", "Live"]; - -enum SortOption { - SoonToExpire = "Soon to expire", - NewestFirst = "Newest first", - OldestFirst = "Oldest first", - HighestAmountYesVote = "Highest amount of yes votes", -} -test("9A. Should access Outcomes page in disconnect state", async ({ - page, -}) => { - await page.goto("/"); - - if (isMobile(page)) { - await page.getByTestId("open-drawer-button").click(); - } - await page.getByTestId("governance-actions-outcomes-link").click(); - - await expect(page.getByText(/outcomes/i)).toHaveCount(2); -}); - -test.describe("Outcome details dependent test", () => { - let governanceActionId: string | undefined; - let governanceActionTitle: string | undefined; - let currentPage: Page; +test.describe("Outcomes page", () => { + let outcomePage: OutComesPage; test.beforeEach(async ({ page }) => { - // intercept outcomes data for id - await page.route( - "**/governance-actions?search=&filters=&sort=**", - async (route) => { - const response = await route.fetch(); - const data: outcomeProposal[] = await response.json(); - if (!governanceActionId) { - if (data.length > 0) { - const randomIndexForId = Math.floor(Math.random() * data.length); - governanceActionId = - data[randomIndexForId].tx_hash + - "#" + - data[randomIndexForId].index; - } - } - await route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify(data), - }); - } - ); - - // intercept metadata for title - await page.route("**/governance-actions/metadata?**", async (route) => { - try { - const response = await route.fetch(); - if (response.status() !== 200) { - await route.continue(); - return; - } - const data: outcomeMetadata = await response.json(); - if (!governanceActionTitle && data.data.title != null) { - governanceActionTitle = data.data.title; - } - await route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify(data), - }); - } catch (error) { - return; - } - }); - - const responsePromise = page.waitForResponse( - "**/governance-actions?search=&filters=&sort=**" - ); - const metadataResponsePromise = page.waitForResponse( - "**/governance-actions/metadata?**" - ); - - const outcomesPage = new OutComesPage(page); - await outcomesPage.goto(); - - await responsePromise; - await metadataResponsePromise; - currentPage = page; + outcomePage = new OutComesPage(page); }); - test("9B. Should search outcomes proposal by title and id", async ({}) => { - const outcomesPage = new OutComesPage(currentPage); - // search by id - await outcomesPage.searchInput.fill(governanceActionId); - await expect( - currentPage.getByRole("progressbar").getByRole("img") - ).toBeVisible(); - - await functionWaitedAssert( - async () => { - const idSearchOutcomeCards = await outcomesPage.getAllOutcomes(); - expect(idSearchOutcomeCards.length, { - message: - idSearchOutcomeCards.length == 0 && "No governance actions found", - }).toBeGreaterThan(0); - for (const outcomeCard of idSearchOutcomeCards) { - const id = await outcomeCard - .locator('[data-testid$="-CIP-105-id"]') - .textContent(); - expect(id.replace(/^.*ID/, "")).toContain(governanceActionId); - } - }, - { name: "search by id" } - ); - - // search by title - await outcomesPage.searchInput.fill(governanceActionTitle); - await expect( - currentPage.getByRole("progressbar").getByRole("img") - ).toBeVisible(); - - await functionWaitedAssert( - async () => { - const titleSearchOutcomeCards = await outcomesPage.getAllOutcomes(); - expect(titleSearchOutcomeCards.length, { - message: - titleSearchOutcomeCards.length == 0 && - "No governance actions found", - }).toBeGreaterThan(0); - for (const outcomeCard of titleSearchOutcomeCards) { - const title = await outcomeCard - .locator('[data-testid$="-card-title"]') - .textContent(); - expect(title.toLowerCase()).toContain( - governanceActionTitle.toLowerCase() - ); - } - }, - { name: "search by title" } - ); + test("9A_1. Should access Outcomes page in disconnect state", async () => { + await outcomePage.shouldAccessPage(); }); - test("9D. Should copy governanceActionId", async ({ page, context }) => { - await context.grantPermissions(["clipboard-read", "clipboard-write"]); - const outcomesPage = new OutComesPage(currentPage); - - await outcomesPage.searchInput.fill(governanceActionId); + test.describe("outcome sorting and filtering", () => { + test("9C_1A. Should filter Governance Action Type on governance actions page in disconnect state", async () => { + test.slow(); + await outcomePage.goto(); - await page - .getByTestId(`${governanceActionId}-CIP-105-id`) - .getByTestId("copy-button") - .click(); - await expect(page.getByText("Copied to clipboard")).toBeVisible({ - timeout: 60_000, + await outcomePage.filterOutcomes(); }); - const copiedTextDRepDirectory = await page.evaluate(() => - navigator.clipboard.readText() - ); - expect(copiedTextDRepDirectory).toEqual(governanceActionId); - }); -}); - -test("9C_1. Should filter Governance Action Type on governance actions page", async ({ - page, -}) => { - test.slow(); - const outcomePage = new OutComesPage(page); - await outcomePage.goto(); - - await outcomePage.filterBtn.click(); - const filterOptionNames = Object.values(outcomeType); - - // proposal type filter - await outcomePage.applyAndValidateFilters( - filterOptionNames, - outcomePage._validateFiltersInOutcomeCard - ); - - // proposal status filter - await outcomePage.applyAndValidateFilters( - status, - outcomePage._validateStatusFiltersInOutcomeCard - ); -}); - -test("9C_2. Should sort Governance Action Type on outcomes page", async ({ - page, -}) => { - test.slow(); - - const outcomePage = new OutComesPage(page); - await outcomePage.goto({ sort: "oldestFirst" }); - - await outcomePage.sortBtn.click(); - - await outcomePage.sortAndValidate( - SortOption.NewestFirst, - (p1, p2) => p1.expiry_date >= p2.time - ); - - await outcomePage.sortAndValidate( - SortOption.OldestFirst, - (p1, p2) => p1.expiry_date <= p2.expiry_date - ); - - await outcomePage.sortAndValidate( - SortOption.HighestAmountYesVote, - (p1, p2) => parseInt(p1.yes_votes) >= parseInt(p2.yes_votes) - ); -}); - -test("9C_3. Should filter and sort Governance Action Type on outcomes page", async ({ - page, -}) => { - const outcomePage = new OutComesPage(page); - const filterOptionKeys = Object.keys(outcomeType); - const filterOptionNames = Object.values(outcomeType); - - const choice = Math.floor(Math.random() * filterOptionKeys.length); - await outcomePage.goto({ filter: filterOptionKeys[choice] }); - await outcomePage.sortBtn.click(); - - await outcomePage.sortAndValidate( - SortOption.OldestFirst, - (p1, p2) => p1.expiry_date <= p2.expiry_date - ); - - await outcomePage.validateFilters( - [filterOptionNames[choice]], - outcomePage._validateFiltersInOutcomeCard - ); -}); - -test("9E. Should verify all of the displayed governance actions have expired", async ({ - page, -}) => { - const outcomePage = new OutComesPage(page); - await outcomePage.goto(); - - const proposalCards = await outcomePage.getAllOutcomes(); - - for (const proposalCard of proposalCards) { - const expiryDateEl = proposalCard.locator('[data-testid$="-Expired-date"]'); - const expiryDateTxt = await expiryDateEl.innerText(); - const expiryDate = extractExpiryDateFromText(expiryDateTxt); - const today = new Date(); - expect(today >= expiryDate).toBeTruthy(); - } -}); + test("9C_2A. Should sort Governance Action Type on outcomes page in disconnect state", async () => { + test.slow(); -test("9F. Should load more Outcomes on show more", async ({ page }) => { - const responsePromise = page.waitForResponse((response) => - response - .url() - .includes(`governance-actions?search=&filters=&sort=newestFirst&page=2`) - ); - const outcomePage = new OutComesPage(page); - await outcomePage.goto(); + await outcomePage.goto({ sort: "oldestFirst" }); - let governanceActionIdsBefore: String[]; - let governanceActionIdsAfter: String[]; - - await functionWaitedAssert( - async () => { - governanceActionIdsBefore = - await outcomePage.getAllListedCIP105GovernanceIds(); - await outcomePage.showMoreBtn.click(); - }, - { message: "Show more button not visible" } - ); - - const response = await responsePromise; - const governanceActionListAfter = await response.json(); - - await functionWaitedAssert( - async () => { - governanceActionIdsAfter = - await outcomePage.getAllListedCIP105GovernanceIds(); - expect(governanceActionIdsAfter.length).toBeGreaterThan( - governanceActionIdsBefore.length - ); - }, - { message: "Outcomes not loaded after clicking show more" } - ); + await outcomePage.sortOutcomes(); + }); - if (governanceActionListAfter.length >= governanceActionIdsBefore.length) { - await expect(outcomePage.showMoreBtn).toBeVisible(); - expect(true).toBeTruthy(); - } else { - await expect(outcomePage.showMoreBtn).not.toBeVisible(); - } -}); + test("9C_3A. Should filter and sort Governance Action Type on outcomes page in disconnect state", async () => { + await outcomePage.filterAndSortOutcomes(); + }); + }); -test("9G. Should display correct vote counts on outcome details page", async ({ - browser, -}) => { - await Promise.all( - Object.keys(outcomeType).map(async (filterKey) => { - const page = await browser.newPage(); - injectLogger(page); + test("9E_1. Should verify all of the displayed governance actions have expired in disconnect state", async () => { + await outcomePage.goto(); - const outcomeListResponsePromise = page.waitForResponse( - (response) => - response - .url() - .includes(`governance-actions?search=&filters=${filterKey}`), - { timeout: 60_000 } - ); + await outcomePage.verifyAllOutcomesAreExpired(); + }); - const metricsResponsePromise = page.waitForResponse( - (response) => response.url().includes(`/misc/network/metrics?epoch`), - { timeout: 60_000 } - ); + test("9F_1. Should load more Outcomes on show more in disconnect state", async () => { + await outcomePage.VerifyLoadMoreOutcomes(); + }); + test.describe("Outcome details dependent test", () => { + let governanceActionId: string | undefined; + let governanceActionTitle: string | undefined; + let currentPage: Page; + test.beforeEach(async ({ page }) => { const outcomePage = new OutComesPage(page); - await outcomePage.goto({ filter: filterKey }); - - const outcomeListResponse = await outcomeListResponsePromise; - const proposals = await outcomeListResponse.json(); - - expect( - proposals.length, - proposals.length == 0 && "No proposals found!" - ).toBeGreaterThan(0); - - const { - index: governanceActionIndex, - tx_hash: governanceTransactionHash, - } = proposals[0]; - - const outcomeResponsePromise = page.waitForResponse( - (response) => - response - .url() - .includes( - `governance-actions/${governanceTransactionHash}?index=${governanceActionIndex}` - ), - { timeout: 60_000 } + governanceActionId = + await outcomePage.fetchOutcomeIdFromNetwork(governanceActionId); + governanceActionTitle = await outcomePage.fetchOutcomeTitleFromNetwork( + governanceActionTitle ); + currentPage = page; + }); - const govActionDetailsPage = await outcomePage.viewFirstOutcomes(); - - const outcomeResponse = await outcomeResponsePromise; - const proposalToCheck = (await outcomeResponse.json())[0]; - - const metricsResponse = await metricsResponsePromise; - - const { autoAbstain, noConfidence, sPosAutoAbstain, sPosNoConfidence } = - await govActionDetailsPage.getSposAndDRepAbstainNoConfidence( - metricsResponse - ); - - // check dRep votes - if (await areDRepVoteTotalsDisplayed(proposalToCheck)) { - await govActionDetailsPage.dRepExpandButton.click(); - - await expect( - govActionDetailsPage.dRepResultData.getByRole("row", { - name: "Yes", - }) - ).toHaveText( - `Yes${formatWithThousandSeparator(proposalToCheck.yes_votes, false)}`, - { - timeout: 60_000, - } - ); //BUG missing testIds - - await expect( - govActionDetailsPage.dRepResultData.getByRole("row", { - name: "Auto-Abstain", - }) - ).toHaveText(`Auto-Abstain${autoAbstain}`); //BUG missing testIds - await expect( - govActionDetailsPage.dRepResultData.getByRole("row", { - name: "No Confidence", - }) - ).toHaveText(`No Confidence${noConfidence}`); //BUG missing testIds - await expect( - govActionDetailsPage.dRepResultData.getByRole("row", { - name: "Explicit", - }) - ).toHaveText( - `Explicit${formatWithThousandSeparator(proposalToCheck.abstain_votes, false)}` - ); - - await expect( - govActionDetailsPage.dRepResultData - .getByRole("row", { - name: "No", - }) - .first() - ).toHaveText( - `No${formatWithThousandSeparator(proposalToCheck.no_votes, false)}` - ); //BUG missing testIds - } - - // check sPos votes - if (await areSPOVoteTotalsDisplayed(proposalToCheck)) { - await govActionDetailsPage.sPosExpandButton.click(); - const totalSposNoVotes = - parseInt(sPosNoConfidence.replace(/,/g, "")) + - proposalToCheck.pool_no_votes * 1000000; - - await expect( - govActionDetailsPage.sPosResultData.getByRole("row", { - name: "Yes", - }) - ).toHaveText( - `Yes${formatWithThousandSeparator(proposalToCheck.pool_yes_votes, false)}`, - { - timeout: 60_000, - } - ); //BUG missing testIds - - await expect( - govActionDetailsPage.sPosResultData.getByRole("row", { - name: "Auto-Abstain", - }) - ).toHaveText(`Auto-Abstain${sPosAutoAbstain}`); //BUG missing testIds - await expect( - govActionDetailsPage.sPosResultData.getByRole("row", { - name: "No Confidence", - }) - ).toHaveText(`No Confidence${sPosNoConfidence}`); //BUG missing testIds - await expect( - govActionDetailsPage.sPosResultData.getByRole("row", { - name: "Explicit", - }) - ).toHaveText( - `Explicit${formatWithThousandSeparator(proposalToCheck.pool_abstain_votes, false)}` - ); //BUG missing testIds - await expect( - govActionDetailsPage.sPosResultData - .getByRole("row", { - name: "No", - }) - .first() - ).toHaveText(`No${formatWithThousandSeparator(totalSposNoVotes)}`); //BUG missing testIds - } - - // check ccCommittee votes - if (areCCVoteTotalsDisplayed(proposalToCheck)) { - const ccYesVoteSubmittedText = - await govActionDetailsPage.ccCommitteeYesVotes.textContent(); - const ccNoVoteSubmittedText = - await govActionDetailsPage.ccCommitteeYesVotes.textContent(); - const { percentage: yesPercentage } = parseVotingPowerAndPercentage( - ccYesVoteSubmittedText - ); - const { percentage: noPercentage } = parseVotingPowerAndPercentage( - ccNoVoteSubmittedText - ); - await expect(govActionDetailsPage.ccCommitteeYesVotes).toHaveText( - `${proposalToCheck.cc_yes_votes} - ${yesPercentage}` - ); - await expect( - govActionDetailsPage.cCResultData.getByRole("row", { - name: "Abstain Votes", - }) - ).toHaveText(`Abstain Votes${proposalToCheck.pool_abstain_votes}`); //BUG missing testIds + test("9B_1. Should search outcomes proposal by title and id in disconnect state", async () => { + // search by id + await outcomePage.searchOutcomesById(governanceActionId); - await expect(govActionDetailsPage.ccCommitteeNoVotes).toHaveText( - `${proposalToCheck.cc_no_votes} - ${noPercentage}` - ); - } - }) - ); -}); + await outcomePage.searchOutcomesByTitle(governanceActionTitle); + }); -test.describe("Invalid Outcome Metadata", () => { - InvalidMetadata.forEach(({ type, reason, url, hash }, index) => { - test(`9H_${index + 1}: Should display "${type}" message in outcomes when ${reason}`, async ({ - page, + test("9D_1. Should copy governanceActionId in disconnect state", async ({ + context, }) => { - const outcomeResponse = { - ...invalidOutcomeProposals[0], - url, - data_hash: hash, - }; - - await page.route(/.*\/governance-actions\/[a-f0-9]{64}\?.*/, (route) => - route.fulfill({ body: JSON.stringify([outcomeResponse]) }) - ); + await context.grantPermissions(["clipboard-read", "clipboard-write"]); + await outcomePage.shouldCopyGovernanceActionId(governanceActionId); + }); + }); +}); - const outcomePage = new OutComesPage(page); - await outcomePage.goto(); - await outcomePage.viewFirstOutcomes(); - const outcomeTitle = await outcomePage.title.textContent(); +test.describe("Outcome details", () => { + test("9G_1. Should display correct vote counts on outcome details page in disconnect state", async ({ + browser, + page, + }) => { + const outcomeDetailPage = new OutcomeDetailsPage(page); + await outcomeDetailPage.shouldDisplayCorrectVotingResults(browser); + }); - await expect( - outcomePage.title, - outcomeTitle.toLowerCase() !== type.toLowerCase() && - `The URL "${url}" and hash "${hash}" do not match the expected properties for type "${type}".` - ).toHaveText(type, { - ignoreCase: true, - timeout: 60_000, + test.describe("Invalid Outcome Metadata", () => { + InvalidMetadata.forEach(({ type, reason, url, hash }, index) => { + test(`9H_${index + 1}A: Should display "${type}" message in outcomes when ${reason}`, async ({ + page, + }) => { + const outcomeResponse = { + ...invalidOutcomeProposals[0], + url, + data_hash: hash, + }; + + const outcomeDetailPage = new OutcomeDetailsPage(page); + await outcomeDetailPage.verifyInvalidOutcomeMetadata({ + outcomeResponse, + type, + url, + hash, + }); }); - await expect(outcomePage.metadataErrorLearnMoreBtn).toBeVisible(); }); }); }); From e11e578500bf8454afd81aee9503d242a99bba63 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 24 Apr 2025 14:51:31 +0545 Subject: [PATCH 02/60] docs: update Playwright test guide with setup and running instructions --- tests/govtool-frontend/playwright/README.md | 141 +++++++++++++++++--- 1 file changed, 126 insertions(+), 15 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 47a5edca3..28db7ee6b 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -1,29 +1,140 @@ -# GitHub Pages Deployment SSH Deploy Key Generation Guide +# πŸš€ GovTool Integration Test Guide -This guide walks you through the process of generating an SSH deploy key for GitHub Pages deployment and securely integrating it into your workflow. +## βœ… Prerequisites -## Generating the SSH Deploy Key +Make sure the following are installed on your machine: -Execute the following command in your terminal to generate the SSH deploy key: +- **Git** +- **Node.js** & **npm** + +--- + +## πŸ› οΈ Setup Instructions + +### 1. Clone the Repository + +```bash +git clone https://github.com/IntersectMBO/govtool +``` + +### 2. Navigate to the Playwright Test Directory + +```bash +cd tests/govtool-frontend/playwright +``` + +### 3. Configure Environment Variables + +- Copy the `.env.example` file to `.env`: + +```bash +cp .env.example .env +``` + +- Update the `.env` file with the appropriate values. + +### 4. Install Dependencies + +```bash +npm install +``` + +### 5. Install Playwright Browsers + +```bash +npx playwright install +``` + +--- + +## πŸ§ͺ Running Tests + +### πŸ” Run All Tests + +```bash +npm run test +``` + +### ▢️ Run Specific Test Suites + +1. **Delegation Pillars** + + ```bash + npm run test:delegation-pillars + ``` + +2. **Voting Pillars** + + ```bash + npm run test:voting-pillars + ``` + +3. **Outcomes** + + ```bash + npm run test:outcomes + ``` + +4. **Proposal Pillars** + + ```bash + npm run test:proposal-pillars + ``` + +5. **Proposal Discussion** + + ```bash + npm run test:proposal-discussion + ``` + +6. **Proposal Budget** + + ```bash + npm run test:proposal-budget + ``` + +7. **Wallet Connect** + + ```bash + npm run test:wallet-connect + ``` + +8. **Usersnap Integration** + + ```bash + npm run test:usersnap + ``` + +9. **Miscellaneous Tests** + + ```bash + npm run test:misc + ``` + +--- + +## πŸ“Š Visualize Allure Report + +To generate and view the Allure report: ```bash -ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f gh-pages -N "" +npm run allure:serve ``` -This command will generate two files: +--- -- `gh-pages.pub`: Public key -- `gh-pages`: Private key +## πŸ–₯️ Tip for VS Code Users (Running Individual Tests) -## Integration Steps +- Use the terminal to run any specific test suite using the commands above. +- Make sure all test files are recognized in the **Test Explorer**. +- Click the **Play** icon to run tests individually. -1. **Repository Settings:** +![Test Runner Screenshot](image.png) - - Navigate to your repository settings. +--- -2. **Adding Public Key to Deploy Keys: Add to** [`https://github.com/cardanoapi/govtool-test-reports`](https://github.com/cardanoapi/govtool-test-reports) +## πŸ“š Additional Resources - - Go to Deploy Keys and add your public key. Make sure to grant it write access. +For development and contribution guidelines, refer to: -3. **Adding Private Key to Secrets:** - - Go to Secrets and add your private key as `DEPLOY_KEY`. +**`DEVELOPERS_GUIDE.md`** From 71908daae8ffbfd7888778dfc95e050ce533642a Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 24 Apr 2025 14:51:41 +0545 Subject: [PATCH 03/60] docs: add Developer's Guide with project structure and test organization --- .../playwright/DEVELOPERS_GUIDE.md | 106 ++++++++++++++++++ tests/govtool-frontend/playwright/image.png | Bin 0 -> 23504 bytes 2 files changed, 106 insertions(+) create mode 100644 tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md create mode 100644 tests/govtool-frontend/playwright/image.png diff --git a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md new file mode 100644 index 000000000..5e10d65ec --- /dev/null +++ b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md @@ -0,0 +1,106 @@ +# **Developer's Guide** + +This document serves as a guide for new developers participating in the project. It provides an overview of the project’s directory structure and describes the purpose of each component. + +--- + +## **Directory Structure** + +### `lib/` +Contains the utility logic, helpers, mock datas and shared services, including: +- _mock (mock data) +- constants +- datafactory +- fixtures +- forms +- Pages +- helpers +- Services + +--- + +## **Test Directory: `tests/`** + +This directory contains all automated test cases, organized by feature area: + +### Feature-Based Test Suites + +1. **`1-wallet-connect/`** + Wallet connection test cases. + +2. **`2-delegation/`** + Delegation functionality and visibility tests for delegated wallets. + +3. **`3-drep-registration/`** + dRep registration, editing functionality, validation, and visibility test cases. + +4. **`4-proposal-visibility/`** + Voting visibility tests for voting pillars. + +5. **`5-proposal-functionality/`** + Voting functionality tests and validation of voting metadata. + +6. **`6-miscellaneous/`** + Miscellaneous tests, such as documentation URL checks. + +7. **`7-proposal-submission/`** + Proposal submission form validation, visibility, draft handling, and submission tests. + +8. **`8-proposal-discussion/`** + Tests related to proposal discussions adjacent to the submission form. + +9. **`9-outcomes/`** + Tests related to proposal outcome visibility and validations. + +10. **`10-user-snap/`** + Usersnap-related test cases. + +11. **`11-proposal-budget/`** + Tests for proposal budget functionality and associated forms. + +12. **`12-proposal-budget-submission/`** + Proposal budget submission form validation, draft, visibility, and submission tests. + +--- + +### Authentication & Setup Scripts + +13. **`auth.setup.ts`** + Sets up authentication for users and adaHolder wallets. + +14. **`proposal-budget.auth.setup.ts`** + Authentication setup for proposal budget wallets. + +15. **`proposal-discussion.auth.setup.ts`** + Authentication setup for proposal discussion wallets. + +16. **`dRep.auth.setup.ts`** + Authentication setup for dRep wallets. + +17. **`dRep.setup.ts`** + Setup for temporary and static dRep wallet registration. + +18. **`proposal-budget.dRep.setup.ts`** + dRep wallet registration setup for proposal budget tests. + +19. **`proposal.setup.ts`** + Setup for proposal submission wallets. + +20. **`wallet.bootstrap.ts`** + Initializes adaHolder and dRep wallets with test funds for spendable ADA functionality. + +--- + +### Teardown Scripts + +21. **`delegation.teardown.ts`** + Resets delegation status (abstains delegation from delegated wallets). + +22. **`faucet.setup.ts`** + Funds the test faucet wallet. + +23. **`faucet.teardown.ts`** + Refunds all unspendable ADA from test wallets back to the proposal faucet. + +24. **`dRep.teardown.ts`** + Handles deregistration of dRep wallets registered during tests or setup. diff --git a/tests/govtool-frontend/playwright/image.png b/tests/govtool-frontend/playwright/image.png new file mode 100644 index 0000000000000000000000000000000000000000..8c0647f3e39994a515bb22e28209f1052908cd34 GIT binary patch literal 23504 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 literal 0 HcmV?d00001 From 25c7cc626f8478329db04855528027352f518ffb Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 09:28:57 +0545 Subject: [PATCH 04/60] docs: add instructions for generating test wallets to avoid conflicts --- tests/govtool-frontend/playwright/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 28db7ee6b..887f1ab94 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -49,6 +49,14 @@ npx playwright install ## πŸ§ͺ Running Tests +## πŸ”‘ Generate Test Wallets + +```bash +npm run generate-wallets +``` + +⚠️ Run this command before each test run to avoid wallet conflicts during testing. + ### πŸ” Run All Tests ```bash From 366ffac4b19cacd929fddbd0fdfe41e616dca5e3 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 09:29:05 +0545 Subject: [PATCH 05/60] chore: add test scripts for running microservice tests --- tests/govtool-frontend/playwright/package.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/govtool-frontend/playwright/package.json b/tests/govtool-frontend/playwright/package.json index 652504847..bb783c0c2 100644 --- a/tests/govtool-frontend/playwright/package.json +++ b/tests/govtool-frontend/playwright/package.json @@ -25,7 +25,15 @@ "allure:serve": "npx allure serve", "test": "npx playwright test", "format": "prettier . --write", + "test:delegation-pillars": "npx playwright test delegation dRepRegistration editDRep --ui", + "test:voting-pillars": "npx playwright test proposalVisibility proposalFunctionality --ui", "test:outcomes": "npx playwright test outcomes.spec.ts --ui", + "test:proposal-pillars": "npx playwright test proposalDiscussion proposalSubmission proposalBudget --ui", + "test:proposal-discussion": "npx playwright test proposalDiscussion proposalSubmission --ui", + "test:proposal-budget": "npx playwright test proposalBudget --ui", + "test:wallet-connect": "npx playwright test walletConnect --ui", + "test:usersnap": "npx playwright test userSnap.spec.ts --ui", + "test:misc": "npx playwright test miscellaneous --ui", "generate-wallets": "ts-node ./generate_wallets.ts 24" }, "dependencies": { From 4dd17dbe8930cf12d8fcb481e435c96c7134f6dd Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 10:40:37 +0545 Subject: [PATCH 06/60] chore: update environment configuration and remove unused PDF_URL --- tests/govtool-frontend/playwright/.env.example | 8 ++------ .../playwright/lib/constants/environments.ts | 1 - 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/govtool-frontend/playwright/.env.example b/tests/govtool-frontend/playwright/.env.example index 33e20db29..91aca845d 100644 --- a/tests/govtool-frontend/playwright/.env.example +++ b/tests/govtool-frontend/playwright/.env.example @@ -1,11 +1,8 @@ HOST_URL=http://localhost:3000 -API_URL=http://localhost:3000/api DOCS_URL=https://docs.gov.tools - -PDF_URL=https://dev.api.pdf.gov.tools - +// Faucet API key to load fund from faucet # Faucet FAUCET_API_KEY= @@ -23,10 +20,9 @@ METADATA_BUCKET_URL=https://metadata-govtool.cardanoapi.io FAUCET_ADDRESS=addr_test1vqeux7xwusdju9dvsj8h7mca9aup2k439kfmwy773xxc2hcu7zy99 - PROPOSAL_FAUCET_PAYMENT_PRIVATE=********************************************** PROPOSAL_FAUCET_STAKE_PRIVATE=********************************************** PROPOSAL_FAUCET_DREP_PRIVATE=********************************************** CI=true -TEST_WORKERS=6 \ No newline at end of file +TEST_WORKERS=6 // Number of workers to run in parallel \ No newline at end of file diff --git a/tests/govtool-frontend/playwright/lib/constants/environments.ts b/tests/govtool-frontend/playwright/lib/constants/environments.ts index 1d36e6417..2f0fa2a7a 100644 --- a/tests/govtool-frontend/playwright/lib/constants/environments.ts +++ b/tests/govtool-frontend/playwright/lib/constants/environments.ts @@ -13,7 +13,6 @@ const environments = { blockfrostApiUrl: "https://cardano-" + NETWORK + ".blockfrost.io/api", apiUrl: `${SERVER_HOST_URL}/api`, docsUrl: process.env.DOCS_URL || "https://docs.gov.tools/cardano-govtool", - pdfUrl: process.env.PDF_URL || "https://dev.api.pdf.gov.tools", networkId: NETWORK === "mainnet" ? 1 : 0, faucet: { apiUrl: `https://faucet.${NETWORK}.world.dev.cardano.org`, From 8930261209901496823a76d259d37de8501c69f0 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 10:40:48 +0545 Subject: [PATCH 07/60] chore: update Playwright test scripts to include headless options --- tests/govtool-frontend/playwright/package.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/package.json b/tests/govtool-frontend/playwright/package.json index bb783c0c2..3a890eb54 100644 --- a/tests/govtool-frontend/playwright/package.json +++ b/tests/govtool-frontend/playwright/package.json @@ -23,8 +23,7 @@ "allure:generate": "npx allure generate ./allure-results --clean", "allure:open": "npx allure open ./allure-report", "allure:serve": "npx allure serve", - "test": "npx playwright test", - "format": "prettier . --write", + "test": "npx playwright test --ui", "test:delegation-pillars": "npx playwright test delegation dRepRegistration editDRep --ui", "test:voting-pillars": "npx playwright test proposalVisibility proposalFunctionality --ui", "test:outcomes": "npx playwright test outcomes.spec.ts --ui", @@ -34,6 +33,17 @@ "test:wallet-connect": "npx playwright test walletConnect --ui", "test:usersnap": "npx playwright test userSnap.spec.ts --ui", "test:misc": "npx playwright test miscellaneous --ui", + "test:headless": "npx playwright test", + "test:headless:delegation-pillars": "npx playwright test delegation dRepRegistration editDRep", + "test:headless:voting-pillars": "npx playwright test proposalVisibility proposalFunctionality", + "test:headless:outcomes": "npx playwright test outcomes.spec.ts", + "test:headless:proposal-pillars": "npx playwright test proposalDiscussion proposalSubmission proposalBudget", + "test:headless:proposal-discussion": "npx playwright test proposalDiscussion proposalSubmission", + "test:headless:proposal-budget": "npx playwright test proposalBudget", + "test:headless:wallet-connect": "npx playwright test walletConnect", + "test:headless:usersnap": "npx playwright test userSnap.spec.ts", + "test:headless:misc": "npx playwright test miscellaneous", + "format": "prettier . --write", "generate-wallets": "ts-node ./generate_wallets.ts 24" }, "dependencies": { From 21938259f96dbb9bcb78adfb2af79ec07a3a5dd0 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 10:41:27 +0545 Subject: [PATCH 08/60] docs: enhance Developer's Guide with vscode instructions --- .../playwright/DEVELOPERS_GUIDE.md | 69 ++++++++++++++---- tests/govtool-frontend/playwright/image-1.png | Bin 0 -> 34260 bytes tests/govtool-frontend/playwright/image-2.png | Bin 0 -> 42017 bytes 3 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 tests/govtool-frontend/playwright/image-1.png create mode 100644 tests/govtool-frontend/playwright/image-2.png diff --git a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md index 5e10d65ec..2bd5e47f0 100644 --- a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md +++ b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md @@ -7,8 +7,10 @@ This document serves as a guide for new developers participating in the project. ## **Directory Structure** ### `lib/` + Contains the utility logic, helpers, mock datas and shared services, including: -- _mock (mock data) + +- \_mock (mock data) - constants - datafactory - fixtures @@ -53,54 +55,89 @@ This directory contains all automated test cases, organized by feature area: Tests related to proposal outcome visibility and validations. 10. **`10-user-snap/`** - Usersnap-related test cases. + Usersnap-related test cases. 11. **`11-proposal-budget/`** - Tests for proposal budget functionality and associated forms. + Tests for proposal budget functionality and associated forms. 12. **`12-proposal-budget-submission/`** - Proposal budget submission form validation, draft, visibility, and submission tests. + Proposal budget submission form validation, draft, visibility, and submission tests. --- ### Authentication & Setup Scripts 13. **`auth.setup.ts`** - Sets up authentication for users and adaHolder wallets. + Sets up authentication for users and adaHolder wallets. 14. **`proposal-budget.auth.setup.ts`** - Authentication setup for proposal budget wallets. + Authentication setup for proposal budget wallets. 15. **`proposal-discussion.auth.setup.ts`** - Authentication setup for proposal discussion wallets. + Authentication setup for proposal discussion wallets. 16. **`dRep.auth.setup.ts`** - Authentication setup for dRep wallets. + Authentication setup for dRep wallets. 17. **`dRep.setup.ts`** - Setup for temporary and static dRep wallet registration. + Setup for temporary and static dRep wallet registration. 18. **`proposal-budget.dRep.setup.ts`** - dRep wallet registration setup for proposal budget tests. + dRep wallet registration setup for proposal budget tests. 19. **`proposal.setup.ts`** - Setup for proposal submission wallets. + Setup for proposal submission wallets. 20. **`wallet.bootstrap.ts`** - Initializes adaHolder and dRep wallets with test funds for spendable ADA functionality. + Initializes adaHolder and dRep wallets with test funds for spendable ADA functionality. --- ### Teardown Scripts 21. **`delegation.teardown.ts`** - Resets delegation status (abstains delegation from delegated wallets). + Resets delegation status (abstains delegation from delegated wallets). 22. **`faucet.setup.ts`** - Funds the test faucet wallet. + Funds the test faucet wallet. 23. **`faucet.teardown.ts`** - Refunds all unspendable ADA from test wallets back to the proposal faucet. + Refunds all unspendable ADA from test wallets back to the proposal faucet. 24. **`dRep.teardown.ts`** - Handles deregistration of dRep wallets registered during tests or setup. + Handles deregistration of dRep wallets registered during tests or setup. + +--- + +Sure! Here's a refined and clearer version of your note: + +--- + +## πŸ–₯️ Tip for VS Code Users: Running Individual Tests + +- Use the terminal to run specific test suites using the commands provided in the **README.md**. +- Ensure all test files are recognized in the **Test Explorer**. + +![Test Runner Screenshot](image.png) + +- Use the **Play** ▢️ icon to run individual tests directly from the UI. + +--- + +### 🎯 Running Individual Tests Without Wallet Dependency + +- Add **Playwright Test for VSCode** extension + + ![Playwright Test Screenshot](image-1.png) + +1. **Remove** the `CI` environment variable. +2. **Navigate** to the specific directory where your test is located to run it directly. + + ![Directory Navigation Screenshot](image-2.png) + +> **Note:** +> +> - To run tests _without wallet dependency_, make sure the required wallet/auth setup has already been completed beforehand. +> - To run tests _with wallet dependency_ and generate **Allure reports**, **do not** remove the `CI` environment variable. + +--- diff --git a/tests/govtool-frontend/playwright/image-1.png b/tests/govtool-frontend/playwright/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0995056cfbf5a5f60a77b3338026862aa75e7848 GIT binary patch literal 34260 zcmd42V|XRO+OQkjwkMg`wrzW2+qP{x6Wg{qv7Jnu6&okB-~FC*etti{b@f_Z-K)B~ zs{6U>(OnS=a^mnXI50p!K=6_hB1%9&AdBDSD=3KXUu@-gl9kbj0{|iY+TIDM1rzJ)C{aFtQe1?{6IiNK$0SYD(=}A-9FyR zsvS=svO=!X?8&xTAk76bQa=h~2uPf8ctr5H2+9#c0?z6ki)V~7%*u{2@GtQ~utjHq zmK0IU|<4!3{#Z_kjRUIUO8|Jw?PAV1Ro zQ9q#sY5({7dr;#4UoVKjn*Vpue-MN7G5%-x|CirH$5CRe+>~bJD4u;bR*`-6p`9fG z1wOr|{+ATqMJ5y&CNLNDkF99dNq?4A7i6dz&_Re!5Riah{t1`KRkS08pmM4QUK;`I zEUPIvVEfaDTYiKu>XXk;$&G(cVR-rj##RNkjjSlA5`p+r;xH7oxRG99I(}@2+t~6o zmSm1g$OgQ*a1d$Mn^)fU|L{Zd!37i)-It)syV0=w85+Yh6@hIh>Y3j`MXCoJ}o zBqqno46K&$NsX{$Uwdk5epp!H*$Mk^c1B4kCifMQo|JB`&M1*^pCwM#Ph`}hajEfH z+x6YQML@BWKso4-S~`Q{?@>GrQZaP)|Gi2$)_vMT`kBE@Qvpe(coS^SM<$qTB}LrW z-G{dF4{h|6PM)+DqI1Mjl|Uq1JvBv0A?YW~oP3aoj{yud64IDXogTW6rWB>THTgWs8*AXu4@vjdp7^b2fZvc(i4Qx%zmZYhp?f9^7 zGj>FkAW~1;r+TY18_brK9De;Q8!iz2^)y-Krz@|Q8trEXZh|Qx^B60XNeL=U zVh`;Wd_PV;WdS1q7^r1Ou{o59`71akeH8gSc^QEgyzI(#*Sf(#9?V(H+7;D=-osNq z*_3o+@pf3exky%qS{YW;(~bb!v6Lk-Ix#cgdovLu@UWvdxrw^6WlF1`qAoG-fj9C# z_CaxMNQgEj#a6yJoOY^v-C0)fIkTR5-WRG}A)RbMn*R_fnnS|G3?q{)tDq8bLHy6) zEL6I@ww?$4)#9=_FoZLKf0#BU&0C|P-B>%q9B@TlS3m4wjIB4$iq;5-_XVMsL6fuP8`6bl+DnXa48>K}g}r|9kT4S0Gmz zU1p^&v$kxNt^L(gAHUCiiS>hMZs1+JT7~z3C(OX5UsQBV^aZtsE(_jCyuYwohAlbV#n;=4@NiV=nCDo*K6f3q46l#%hAH!uJ%Iiq9*XV+`^FW3Bqx zx`IWu1OC>e9`kszy*A!I5{W|*s1y*LIKn93b7x>wOg`Zgx0Oawy1Qd8GSH97NX_G+ zB?@*B?8!}`+mcL%SX}8u8d6Clg^y>1b_ZVt!I#b}Hek{X&Bsk2jf05S2s&LMP0W5G z1F!t##Ph<)zHSdj=`9cIXB#>Q|4^z_dcB=;Uz?udfbQRDyxWpss|xWajo zRff;gisHB8|1`SkO>>LJNH8Whb0y&9XEDMlB02>r<3qgSMWEWQ8d~}zyX^_SfM~N? zqET;*!$?L^FoptF$TzyZ4zpZUdB#X3n!haAOdqBLn$K*QV{3X4aJ9+k&%(WST0dLB zW!d6oq)!%Y5xP9+{iQr7Dg#>fu%zOAT$Gb7z31&znf?gSo1Leqymoov1$jnPQFh2L zb-;x-awYI!H#N#IA0m>T+gVkXe(*X{xwzPJ)6U4Ad|z{|$+5PS_R3E^6PEOWN}(|7 zqD$){G&5oxp0K^$Tl+$eZEaO(2V5NW*2y9A6v}%2QwX~x!*>z5Upz*OOl*!cl3K49 zX;xzmMmd|5j)7IbvW*8h#zT3n;HC2%MMQ(OqV5EMtWv?aNK$)`N+TTp@KMVuBv5W#rpvg_H~UzSa1 zI@bg+_f3*nm?7G02NRf5H>5R~W&`K@^>u|3f516Hgf_v^C^yCK6*4so?<3#gyK=mT*t<_ORo893+ah?ZywWSo@qRbyM(m~`L& zR`9wyqGU36sSOv8u}_KLovf`-@|(tc=$&2KbgIBzjZ|1-bI2(t_`bf5602-MC{=3!Bl#ZQ68?&+zBi( zJK-hbuRI*|ebYv`2OAW@OzV+FN0129DKYyNCwSS;d6~)crOuVLk89^7%qKy5KGtwP zK4{^JKrj6r;~WQ9=pU_GS|Q1vVoXp z8Y|moC68u0VnOc8Dla=J^AaKN7+S-nmcqRB@q6Nca)Brg3P1ht6;m+Okpl5*|tBM?#Zw~t&Y}~ zq6F0U>{BnQllaf0%si#W)iXLQuk_EYw~zS6(Te3;0rcWoui#FIPNqOU;&0R1Ua>Hq zcWd2L_0Hoa^euP&Zo)COYu=+W*rFdsZDvwHXe84{@Rb4QYD)c}_zHm;n=5`wttui# zrP<43Qaw{!-S~cm%V=Nfcgr%U^0dFmh%xNEm(AY7Jb5d$sWZe>68d#hR|z^zlD0@- z+puCGxc>$Eo zN7DWs@}BnWr{I)Ud?CzQBo)v0Ja<3O-CniM?b00xANNMx=)i8e_2o1i^_aU zKZ1~?2v;=n@m=h9N|%WyyedYw@V*|$T))zyrPW?9QgpvoWggMMAsTBfR<#}n2$6*6~Z+^ER+y9PtnbmC^?w<@DSL+ zlZr4*O)7F|x+`;FlY);RaA{+uKDSgCooxs5vl>Rz7M|}6VM?%z=r|jYCu6`hY-xTa zlx9w}PL{83kB|DeYab$*5BV+6>5x^i>+PtuUe3B9Edcdg&fa;eVN9A*`3GK(t|ec^ zY*n7JS=0LNm1ZaNt}Ja8&mB_$Z9!Q=pHH>8-t^pgb2Gx{@B21KXA;s5)(mmoIhr`r z4RbP`5dsXyd8jE#A5MbAUz|sAyPivuj0^;_Chq-o`=+RsB>sSK@s7GynJjHQ2!N<> zdSkZA%A2WV=NjdGu+x9u_?%_U>X>@Ykl1$ml2AI#@sxkrseJ&RI3bEP>`eOQYkv47 z=k6+E+I2mnu!hZE)Glau1eZs-7w^K{pUgp?J9NGB)N;m&&VFTTYqHFWS%Tz;pnB;a z-pJAg`tz}7ZD72EO|F97_YbP1wf;uU#{MTs1<^A?bA+u5i<87>pDCQqK5Q_H+vapbl74;d7%zb$ z7RhvGX05RN?#@cceCBxqeu7#;a%%tJL_;8mHgWr9iS#L(6s~AN_lU_U8&>Zb@_tL~O;y;S<(>6tmyE~d8P66Oqa6j2a5Qd2k|G*`dsMcH11Zc%-}N@M3dq(Bb;YZ_nILGnaS^dPVwu#3S$*me_|8 zV;tH$+RB$lg1qE$-m&iVUPGAs?E+Cg1#!R$9`FbH=3}od>2FKg-tr1@zn5yB=O}Pv zfWG|nO{3KTfcjrh3X{6jyR9Wnxud)S(KppbBI#E1)gCx?NN&T0Ny&0nZm$YLzWCpw17~0#yL)Fa2fGq)m8-v`~2Se5V0sn?lg>ZRm+n;7vFko#Y-(fcu9pv zTXy&kro@7Cs@()*EvYa;HF^9cnJ2&DelGHa>`&6DVvs)q5%dqqz{VHWCKxHD3#YNT z+R`zWu~_REoEZ@YwCKpOBD!tw z!Erw{8H$hDTI7@wK{@AouF`m3+7$U6t*CRXK1EmGYfAnMGvXA_*Zt-t-HX2w3som> zy<@m}q9LvyZwLr84Mx~EnA-r+pifkD42ROUz<;)8Jb6o(!v|y8-lIu@1(TO=%Vu&Y!lRif(X?29x+| zojlru)e^%dQ-kQGCDntATOk*~C)Cb`4xB`K?YNL{DMTad*(B~NV5nXFXuU)SE&`&V zN{j<)xk>|G1(R?o*Q~sR7ttd(g#S(92a@>{it1J}e@Ad!$#DWdJ7$(7InKhWTz_rD z_*ze{_zLGW{K#3H53RCW4>udIj-ShJ4)#M{TJ8AWD;Z=;4AUdF&FAaYr7EwC(q(8o z;p~j#@yKvN%Cch%+tN7X3{h z;dbeh`Lw4PWsyXCLwadR%SHw71SV+!0r*44!fy?~2^)6JjC3ZL0l|BRu(eW9j)}L~ znjai*r8LhE^1Hio+dseTvU`X;P0*k%FbI4tO|^49InwjPwhuO;4F40VG3n4={mqY6 zGrYbJIB~1{oO{4eC3t+Deg-tO!tc2X{5H)(^=rWgkEp_4DYE{8+F-2@p;BRA>g=qS zzpUIN)u(HRh$r8uBd^e?Neuw9Ek$L;+AZ>-dbG}nreupos2d@-bE$X#jtjlVP|*_P z7*QAlVM_TspW$V@0nZDKI=S{XrT?zYt2WUaZfuNR;%?2CX<@c#5si|X9*%PncfFDpLVrGcT4M6xsZD?^&X zU45vtwU44Iee~#rjjVXnr7E^01M5)^1QC4-v-nEv4D|%eUo0-W8|pXJ|Cktc*0asN zN2-_xgZ+mROX&y4qAUg5((0p*`K`FR9r$9X>t&wh5ReaI9@gW5U1Um3Tx1w#ql2G5 zDk2i4WHi^@Sp9ae=kw2)(OAX15#g?T3&hdI-u{EA9ge8LAiO)m1N)^{J>h+DVUdrT zw@ll`xHhYT5c*u7#AAM5F$TJ<{glU+4~nz37k#U>m)D;)W9?C$zU}^~y&efcvZEX~ zYq&h0VP$r$yBF=h;+z5m7@*7xK8mn3#VkE2*$7TuiDS2+E~*Q;N+65JnKM|AJgZQP zc9wj&J1~2RF=MytMH;|2cyKYmq1^4S9zm&QGFOF|PSqT3tu-?>hnpM!@>IoR_BrL( z&<6G|W|!@pgA@C&&j-v=lDW7V^2Hss@S7<=KG^t<9>=Ho>7$#-Ctsgr(auYfTS=*% z|M62$)t*d5O|dQFhC>VRxnhd~AX={~b#nfsh19;_`f)hi4e);PeJk^W87b-B*JB{x&thy@Mhv7Tbn=b6)gEZt?e_lUXH)`jg55AGn06=@wq2JA1o5$820@*q1P5Gi{1&i}JfY@#8pz zad&XC@sOtz-(!p;zl-BP^Z%*~>G5 zgte`gwy+l)1Cy5np;)HLb*~8^7bUhGOg9iy%(s+Xb|(fW_xgYwec{qhvp zw*BY1GH|`D0d#iS{RGz8>nUaVo5diu*zOMqRto>W@*Wmjeog}&;a~2ipt#GtgQT#H zlE_r`vruV>0lP}17r(Ep3~TVkZVB{a49vhy=((=h+U%Et*1(3eHQFqHn1&^FK&0f$ zkyEl(Lb}DVbph0NvvmV$k&_QsrI!K471DThu6UdMv9CP03lXxpfgQcg-9r`?B^@nL z=ZkEDr#lCI9xZ(PKELZDV`^6!cku5dbFxQ$dZ)SNLz*cBsuyH`S+aCx8kj;`Em%4D zRR>xV85IVeXAD>EI1xnJR_!0PI*oN~MF$5v{Pn5ou8HpeCGeI7jyFaNLN>~bKF<(R z16W5fXMdejWTfm4ckcwP98+L{to<5cYMw4U;oY@G)g+*(3H6SKAljDMtAN+A+F}Vc zPE?XLE<>mBXfpKQhkh$t*Xf@cy&VsS^l;>xWY>|;*@&X2Nn#wA$!ZnHN6%_`Y>R&O zM{-uGua3>uW(I;T7ad!%HL;5Oo_wkrZ^v`!lDxctmX3$dt)gR1PfXy%P)813@l#)^ zsJ^y|Pl#j9R({FR60?(=rdZv!12VlMKlr?3Mxlv_$6-PbSAVJsqs-X+ZVN&z7clGd1!z?{>9!$4&f$KW*Img3y?U-NVC;Nhu+hSA6m2Hah>j$ ztxxkW;kgUopRzJxt5;h6!f3I6!ecexPtWm)V7XgFpo<20ofBK zAc#s*w)|6<@J2^JBZ|h1owZ+S3t_-OGSlYF-yhau~{Xv0Oz$pg= zazf*!X=>ifX*@o_9Ta;7iz|1foQo4dMQhT4R^*B0rFDEXtE@Dk-k0jA^yr0n z#$YRF0*l5OmL%Ttb9d7G-P>u;L}ASvXm@Rpsdp|_@z!In;a&2{Yg=An z-q4jA|6o0wnI7aDjxPVLi`&)q#8Kw$L_L!$Gyu;MgFwYk)5pbZnpR!AU(MT{jPI=I z`DK{R>{zEso4yc(m3Y|l)=-{6`e1A6rmpysTPdyGI)7N`y<}KHe#Br^0w1*&J{KR1 zN8kMS;A&4Mb z4oL9|h>#$ws9v&_vpx&sEFNNILsNSs8v$RT@>6gsOHA zOv${#35jU;JIz_eYmw0&zQ8T3hOFL~1FS&4Ss($s11NA1imK?}?UP9gY2{Ybv!H)5uPG;I*+iSq6Uh!Tp-8tc(JbL8srG$wCb+{M1D|nPO9wcyYh&ECjQ1o0;T_jIDyPVPa~uW z#QWwYG*-$fYJo$A$<(7v&A|9zpM2W&`$gl(z&Vrv;sm8c=Y~mLu69R9>J``7voB7^ zNeZMh{Ar~6MkC3##?}piG{6BspJMd?7=SKyL6b|-HQj%7NI#~-$Qe`j9zl43%E}_E+{jr@I!NA z#f85(B>&nA5V+^6w~xi{!D#1bL52%lOKsvz&U%|TlJADE`6 z6iV=eSDa$FKsuh2SL;V1Z`4{SPB@vMdrNA#F6<4I;{PBtyIv7Ui#t{A$)@2~A@F8)ioqXb3dMy%mtNw}*GUUnE>~Wf34^ETg()bsV&ch5v=_#`*^+!ug zY`m#q26fcV5TUYfsOsBa41;0o$_~#gBkvcwHCi6=m40u)7V1Ort})+|f+U=oEIwzA zs^rHsmo?VOjo28z>>>x(tRA+@QvmFY13&(1@a{D6lRyrR*+hdGQb|tdIntb%M0lu} z*gGfm8efaV$@v;ltErreB|_`ZC`m}RT>^e3V#n%E$WJFC&a;w|k%&@@I_mj|e_<4p zlB;$@7+Y%Nn+4V9{TK~1jaTBTQRe+ueJ0Dz7v$uETE0GjBML{9{l#$}N9dP3x=~ZD z!!AGh?bA`~?L&YmmJg_;x(@4V3M$kLtb?OJXUQ%nKQ-OsJv215Og2Y70NPpX?@rES zI0RvU6Ah|=KBB%Mov2gH$M}&~6w+cE2Tmb|g=D3{_UarD@7mD*jgjOZ0Utvk{Y?+o zCk|AtLTY*(V#n^(;4d$-TY9l?_ms@`ue~!lZ>GC!)~e0RLiT~av?snf3d;%8g9LLZ z^ZPO~*(PUV8}=aNOHF*;R&RuC?~LH7ty^JEB7dq9536aIxwF!z5IEg~(DKccgefz5 zUQpzgFUYrUQbzjuX%3*RwY7NLa3*YF-XirR^@y`JoJ<18;ucr>PQBTFr}_ZwbruT{kqug| zW9eo)qi6F>6ME}Ip`(#?rB9Q&9=TBU*LiVuY_p>WsIw**Z^O9+w|95#2eI63@3)h0 z&RyBMeGmOodY=k0dRDy}Gok!q;*ipLbj1A9SN2`W8IwMhY<1;T(GC1HCTo|=t8Zez zUsI$4neXbyw^GPX;P-@mpqXWg_8VCu=mKr5VCfo}I+hrE{Xsnzh1<#l;rrib8 z$%VNVBTP%cM=vp2JKh@*a^e$vvxux>Mt(kpMc^T#TErq*#0nsh6r}UJ2CLmv%>fUx zn7WtbkF^n!okZhC7>f^*i=g@Pg?EHP5EgQ z9I)V(diT!;X8qR{~%1ehpri=iKd1#PjEns=Ozpf{CY9;q>wjez}o?ddK z+}0--O0#z%jk6{+2kJ4_GeXyyEXg_brODUgz$B>8E@@)V*Bg%xcxYCy`lYQCh)@4H z(|J#R``L}Pp$K_2OK;LVDo^Bk<@iVa-?)S=7Z*e+2~mc6INMP zG5ZY!g`7Qg=okd*AqBpo6b|Fymo72TT9Dn1{$Mt6=Yi&;<%)rTM~W42`YED-xhG)A zyhm)jpJ)sXpGilDiPH_S)n;%qGD5ckB{F~vCC)GYCC(LkXw@ubrA51dW77$s^~;$X zsH6VfkGjYeLZ&&~z7c1mhoEgqy`h&W>3ZAvp#n%@B%}0)8TY92UY8l(sw_tU8B4dL zE4FWeS8mAt6_jWq&QH|EXL*{-!kwni3B_)Qtn9VVOyHO+;D%OZ_l%wc-^qY)TB zzwza7x4a55imylUJ_oB=Ky+@nYqValfTm;pjv6Ow=H=OM(u%hnaY;vi6hc3nzux66 zeqBy7r((0)@E(+EM<|cv7e)LHs=bZjPEcGhB`zfsS{Qxa`TP;~>6>4w4;V!wx`GT=R2A3khM{4!p_r!5#Q0TOpZi-yo>Xw zGedbqX0w^0J^Nk9_H;%gh%|j)4?v;T%mCM1)E&Qe4Kd-24XwN?{fryl;`Gc2M|N4h z-1Gn*z;H6lb`eQIUvl{B1vB&wr}n`M2~a!munS21&JeAvIPkA~ zuel#-+|a*bYVHC+SDB#@ORAN{Qa={EH3B^CfIX6^*4p?xMx7^VqP-?H{3_!2hpt8s zk~5wZnJ`;wyyDUGSV(^3{2_!uk<}nCxAv%upMZ!LKT{M&NfnK&Hy2_(C)ACRW_A1+ zc>DRH>i;`VZFgzC?cl3n-^&%6+U+|pDxt(cm7a1ct-+=rnd$_@WUDol7?x`PzN3C% z9GYccx4vHINz8U)a#elX91e%9S!9mfm$Qn`{nz{`v6S*f#qCa z`bUcq?ITuEUo4KFc4w$9aL1r9VwTE{_+!Cw1fh0!H`0ZLJx)+6A})rWjLFcJ(&AwI zX!7C7>D`!o;zBhYX0P$#yl^zQw|Flki^I9DI+n{{o^bzwzi0WbamXGK^=j(izVqq8 zl?!@UKLqWw0nucnK)$hX;|nS8(*u+ELzQgj1|&_^ix42~;r;o*c+c;hIn~};lntV10L3S6Ohaa>?DRgMa?^XV2X1 zh&cZ9Ja>ECN%i3r1JRq*&m1d(66D#LG|js}P<^OBsH}WV%hd>R^5opI0o_3+5z+Q3 zr(pa{VA!?UDJB29qEW3q8YG<%$e5n}@@gS3{tEFnl^JLiwh%1WG~=&RMYz zSu~NsoqJdeK-s_FTafg*DTUiXZuoWJuN!EwzPT2wKm=|p->gHv^TS}Was>Ykc|WG)Ps-=llnr4wm1#|8)&dSlZE@78tu45i zfIr+aAG(n;J6~;Y5+;{at~r~_;l1#J-RZAnkeL+WzJf@k+mIPl-+C6!w%xxUH{HdR zyYPm8$g|x)?2m)af#}(sYSrHyJh_2*-k(GmXHnlAH^0<&-}a9A%OIe<7?x26aMkz- zRlqX;3`NQxry>#cjGEPt!~fc{!t?x~n&R(FQrvKLprS*N^Bq4;0@^_`M|Qi#8+jK- z-Qj7B1jLFx`E;6~LnHFZ+zu%r5b~@*M3WkFGq8rDt**KUIkSDaDE%@Bo_vlTt;u$4OK<9t znVU#~r@O_;5dYSQhoi3@+1M%hy<$PelW>N8MY(=d`p>VT6ZPRu_R+!lmF~8$E3piA z$hU7`1P_L&R9iwC%z{C^QP$S*QXXgg!e)Eo8c6*&WE&OlYx7!i^hXTxoY|acuJ5;G zqhVm&@_*g&e+#pvl@+J+2~w%N_|9~5bMvz|-$*oeP~lIFYBjpvcSk+nm!sv2A3?ys z$MG*&ng?(1;Ay(Y{TFwOomEvgB=XOG9YkS7epSaG)T->tO&nA}iqn z&l`ehi(J?qZIPZZUD~bt9!zQ3Dv(RcrUrZp<9A^KT)#;sx2Ck_aT$LT6wGXiTO~2Z z)K_HD>bGvVPK0#wL3c_9tm91VOcfl~Hyc~;NDXhKwBf8zH~_5lV6>0uzTUyzA8m1Zu7=m14;h8_MD7Ozl7ObOKWm_K zvR983EH*`0^zDv}3F*QAQ?xk}c{}KJc1-jNmku=|tU1t_Gt$xX28HL=+cm!&oqO}% zOc}~~Pbb}JkzVPFLe*tSzoyfJ08a(yfJ?(&yf3;(D=i6lg@ zKirwThKrYAn9h*bn)Y12UwYj_73AOMO{uC4JCZ+Uq}~$L^cfW{E`OPtw>23Kai8|)%{R~tuC`?^c(FQzu0%d>rW4S! zaRVeNLaHZCiWHJ?IU7|&Y zg@8UOHaD|^dRakq`JQC$%>TqGVEL_?n6v8UZ4bI=$w1!-EPk{O^KGrcw>>Cxuk3F- zn{j~Xb`cwb4I&H84Lpl*in>F|9?TD)dR{>3D3Bn1nj&=`HbmpW~+2jm0;zv%tT;9A(k1t8-cn zHdF>z{t+OZDuX#J1QxTw zn5N?Gtc=$b%IM`z5OBtIw(edV}oe-7a?Jj zh0)JE212)!-{xF@RKlTqjwHR46e(8fWT6A<4K*tQ4)_B`WP{3fHNH+koCH}Y3~~;g zTu+G5yq*orzFT+r23vGWsj_Sp)9WTj33_BwH!N+CpsT0eIK30TZ3P`b96M$@b+Ddh z*Pp#Dky9!Q1BSp|?(RzYqqg#J)0@}vPt@_X##GWq8mSRm-0=C$J)RfY>foa zVU*v#%SDMm1cB~&m%8$KKLqoSGsXgo({0e(jqhSsIv+Pk7~%kjRUW1Xw6{LSExMu zV4Y$&PhS?t(H$~>|N27<*C7e>PgA~B)~B8EbpJu$2w#)tN+8h+1{ zy0SB!A&x*LgKP1`O-YSg!g>2J{)E=E2s)oUxHM*Mgq#GQcQ`2*>0f9Y3*#W*_ZZzx zV1W@PKMd@*$}%o*I&^#i!$Rkf(lkA5joB=KGfHEc#H$3^fVN%t@b`k4v6-1GwwG*9 zC-;XX_0C8OqTRbac@>6xQ?Ne)#W6TK#f$Z1tgjsNmL3SZe7mA-SQ3_N$yG$`uh;P9 z>F>gX#AUOj2~ghnbGi!L_HBrP>)a#~3f#_B3pg?4XSa-KP(p3z8^;5TI$|&c6sxyH z+$!TGD^!$Tzo#MTkf4yT=!yWF#>DihfF*;T=Ja>Ue~J8T%Yk%}Czh-H{XyhITDrbW za#D(nF-@KDhjXcxE6{IbT2suJ7s;+Kn;ezL1@BtvAr|)F-SD;%Zma=#a`Wxyb3j%# z;9>u2?`a=Cqkbc1%oAI_+6nkTxF4s*g^)8{MNo)`Xz==Mtkv65&(=6R`kc|y}+oc{Y!K7eGNEy}h~JJz$+diRrz6~-sR%@BD4iFEgHl-|4IMn37plYLeTbm_lZ3}fAsmXveBA7$wKICRBmX}{YaL<^?0H)8%IN&<#&r6@avnK z-`p^^r)7ckOrpkg`zI%-3#Ht0Y}TXWNfg>26`czDVeI`PBV(&i#>_30e5_AeZ9!SayM z1$)LEfmPiM2=Kg`Wu!x3%@93OQ1f?aV|w8NPo{?wy;YO1V7xffNDT6zdm~72e|4ta zd6nwA`LiR>r7-bs+5vk=z#6&D&Im7J17aJBqulGM;36(;{A=@pyRxlP(`KIS`$%k5xXV*|MJs{<<#uWu?86Ct zracI1CA{D)zLL|RBfJ-w{D=cP42P4{Bb`UP4I|=AN+s2N-?=7~?y4#$*gM9NM^&gpX{a`a46hfTF51s)YRRr{;JM4_D6CrLSNQe0VASY1HrGM9vHdmP z+CUtY%^gX}G$ujJza58PrN5*$+DJVqztpkxvsYuR;TR@fIA*b@GxuS`C~-}t?`-F9 z!8320RZD}R#S)U1!2?T%l%3m+1(Wi?wW@sK{dXt>A}Bz&)3sp9GK0wkMyx2|`=I$% z0T&LU=R1~L11-<#KtMC}D4a3zq@pl&NHb<6*%2rLhYo^{L7PYUyX|;T+>HH=o z1xVN{j_b%d*Zh!@mRBC}j6t5YJsy7G!20ZEIuzo4cJ6c&Cl|54zCEy=4W)NH7N?1|;%cIn%${oX4J@=|I4@SxA9; zfE8-`fho=vmuVNd8Sj}V?-~GmBdC{3vWO|95aAGe3dlC2-hESoV*TW6l;r5FHnzdh zEnkk#M{nETbGLg7GuQ18I2|d zpIl)D72VSqCw$I+B?+lzEZ1I_ZN+p?QPyj0V{?V+1i7*G#@Rj zZOm&Tmm7wBdlPba7QO92Z0>>q1)@PGq_`=i0^^s&Y5RX4^c{^ zRmu>e-_`nSLYpD>-t$D{k;%t=x>>J$_+U zbT%gtmjdG@#3;&$Q|vhlyeqv86Z}40h`}!~x?vKF32&-P5K=I1e&|tn|L%c4?)}Ra z*in~w{~!lx#jg1F@SxlBK`jn*4jbWUi^n^_EHN5tBy;1c%;iDvVb3!rC@F!QJ&W4I zu&>O+)=YyrcPoH5!IweB+adUeNjv|HNn4ucy?nyaEKXcWp0RayT}8@I5YuFQv}Z#Q z&9N*lTSakIQkXtLk_;u%wEthT7bcR?23Mn2FO<_Om;GIpaYVR8qN8 zTh#U&IS_L1p&^-o8K;7jf)j}8Bc3;s?Z zbdkjsx#?AqTTu*~fLuVF^q4fQkct#_9_TpyTu5~JGpb0!9gDVzi9%doWC!J3F4dlX zNU%BhHwgnlr{76puU!#}9PJ$C)_!xqy`x>LO{o*B#a8~KJZbK{xE!J6$)sa&EHNhc zFdhruxG>n*ii!{x3Rn&#GpHR%;?Joix%;IF-*>mX0eg8^-10GT!q&DOCqulAX)-P( z(w|k6aX7;N7$QLuA_mZibkS=3Jt%7w28;;NJ`9SeT0szbuG_GZhJ|@93N)T-F#M}2 zO*`aJy9Dg^#HxkqSpN-?d>WWIBq(4J;E=|3{(^_w_=f2 znM0nNU2*WSb|fNrD8L|XV?$a8!&}E8pJ;N8v6tA>*)lTND+S_+=Ntz-wJn z3`L-Hv!7L9!80NMgmg-vCDPKlIo5*Jswx)Z;QjVoU``H=TTYEioOQ&X*fpI#uPv{P zIzP|*ZO~lhC@LYkiKHe3Os*!B3eHU-El#K<^L`1GUDQf<3^37urlX>yuwMbPp~Qw% zaj6SY0gL_xx5%bBECCB&Ggq+aWWQ~!A@!rb!S@{;$<4y4LYRh}6iD-e|K}q}fJO~SiI?LOd+y9p4W2Q#NN1MT zE7~25#UsqwkMM@fZbkF`HoZ%&GsvAf(teRYOlnOKEmK4jYU+v?i#!>Ux?u+iip|&v z=58(7SoEq@UBUKhoau*fA_7;+`i(L-pp+PL)A=<14-xZczlcTF%h_ zJ)8J#^}lfo5rH{3>TgICQ^L744NA*BPq*xctIMLL(3@63U~^`|8ATau_MlWk18*z* zQ`Dt}ck9x#vSs2EJe};7jj>pBZS=@a#V--_q}ucGV(W;|j;y8?fq+Zt4?<}K0#nHg zK9v+z*rBMpVij~nMODLdi4`KrR)B^DDh)-A68twj^-)3Qe}0XotcVC2XST0NK}?@g z!~y1=;U=eqm6thaqM<*aPdbj9z#(uMF=tBt&%NuPjND#WHJm_Ju5@eH%~0Cuq%eFS z$TO5=Wq~z~w)BgU>4zWY@dPvqrNG~YeG9Y{U?C-?Cp6t{rQ%m-#byQ^RHP-XS#VAaa=>3 zHM2=7g}j&Yi0s*|fx5QM$prI9+=hOuVKsk|qx@>qA&?N{`J%An6D%D@4rYc@GW~h9 z?X0Nk;)P8K#juw=*z{LHE@}v1N2LGT`Gm(vz(+%uyg__i8MA=Mx}k47dql@b5f9S#!#o@yk*#Sv-A+wiE=ZBeCL#xtZoUu z6MglnsOWgcUyY**lop&=kZ%U4T^{D&3W?w%6KIyiliX#aaE#l4QV9edlt<$A1|s($ zscnuijZ_RR|o+g1JT12;g_>&duSqv9iQZ41x>z0Q!!U z#XiAp55#XY*)=mZB1Ua;?JqP^U}yIciAkr8!^k%j7x)e;#ZHkV+ajSS9Eva*Ziq2o zXBBT+T1-D_2tNXHt(ncqn6-2ZA7t#~)J zq?$vY`sJea@ak$!pet0g1jwE;t!t&XK-`~bDANZ(Gs zSI$6Y{2(s|bAURra37{IvdGPf;v3 zP;|%pu(SQ`j)BFv)p~&vSYsC)MyxSP2tY*ddlk4i z&uUQqI#ihI(@b*#Y-KP2!Im`+of6ruY%FU468iUCXS-o9E~KSL{(#e+g~SQ{#;}u< zuaI52lZJCbUak;TcB?8J$W%?iqv~(-axUt6x1hooKJ}B(SeL&9*uD2I^-OS}3m~kU zLQ{1sd%2Hn4-Qa`RtBKG8!Pqx_v+IAx?9w@zLWm0{3`wigX=4D>3n%92DB7d{{~Oy zmv!J`3K{ZQoRrS(s2?xRdWJIOxj1**)>SI-0S} zR~5IP&fMEE35Jc6%>^=lGc%ag%uPA-iA@2EK3yi;zWxdGfP9*x6t8fj( zV}|@o_)`7yh0of)z7*t2Qxnt)6r6}&a=peoT}f*+Qh^5A+o?5N8wmr(BV`=mmeIT~ zu>xbI%iP(ShMh@P*-H1V+pYbe?l6P#N7Njx^m_I&Q*8s*4(t%z{96O0PH*;7Tf*b6 zzK|hS?dz|7zuMauX|_{G#uxf^^@yqByaQ6IaJ%0Mhoi4Q5oNHF#~pUrQT-+*kP^M3 zY$Cjy`a#`e2NT3B(48q&Y($xrM{Qy=q}7Jy&cERy?)eyY_Udmid}cx8A5{vz+E>K$ zwyt&cVL?~;ST%fT(J=sZcdkOaR*xG+uq|}AQBu8*!tEwcA8@Vy>}!LrlND5jQGZ;} z0mkaaB(nJJjepU`_UM051d);MlYE}1szeCEWa-%z#Txg`J-VxQ|A7Om57VnU&hG*P zZ5lLJA6_4?qQC-^mfDnWg+5^b=Qiy`41297dWR;sZJEv=uqm__-6GmK_I#Gr5-R4^ zQvD&1-9kzFGlgu8(}ma8yZ!){(c=m2QU-o!1M%?^CZ*A}DcTN-=GPPYoAWs7xA0Ky z6yHZv4O_OKKfsOc6N0^0ku|T7b*->JM_iRoIi#?SV>7D%Kn1j-(U{;6OAM>(jiKx! zBbv6pbkS?5Ku~|UAW>te%d;-8Vq~iY`U`x2hwBNcSYHCuP zYX1~|bPDEC+gc3!Wmz$8g4t^ij{C@PH+ul=^u7=rY1MHifGrcc9=mhWn-|8cDk%2C zFFnTpwD?_|%6~HyTs1myEpNplkY^~tuM>|y*o9bn5+9;B_HtjB8{vU>=tG1D+DL&S zYqPuLCuII7xC)L#usxziZgxnf{1)yKUO=ggb_ zAQ^ri!kM=DGt$z1%xRtI=%Ldnf$&T0cs(T%XIg4GBB-|t7T(+b zm4r7Vt%teOg8_78pOY-hmr+9Qfpin0-|cybz2lvboT&C3ck=rE1-l_6PGPc%V6-0%7}oNB*fh#>#g|W~%I1ucecvhq(NgM+l9(dmkCS zH(Kh9H6?2r|GG6(kIj0d*F4mlMsE`X z4oIZyxVcC5VQ%!sL>$O3dON}(*#B)hFrIvOJvV)xSj0<^B)Ep_CUb2<1ubC=H0LWRF%FzKAoUJcJ)uxC9^sU ztlK*ScIU6E5Mrm?*9N?E2;vK*9Y~$W4BaA6*2n4-A>aiQ6!Nr~gTe%n5CPp9Ip7O+^d^~0!q7?VGl zz-C-S^6}X7if|c&P$Yy9PfvUa6n}Z$dG|-S5)5gkE4BwXkJ-YbHY9#5cE8emxRfdW znVSlOtXlQ5Bv~+jmG3$1bK(i=QM0{~@3OJ)?vx_K8vvUuMcVsjP>&IV;-nmPxb#ao z58*ykI6uJJAm-q|qkBq{*7`Z5k+x?fbL@?_Zvh(SJW=_%V4-;lV>X5;(A!vZss89# zg1s?pwcs_IQCpa`MY1X{{j^ZK9qvHO<;R$sX}6931<&te_HN5)L(!&BSbDz(V~qLePc=RSydeC}2G{*q8 zGz_y@`}|8o^NheDk9KU?ltrDPf6B1T_N=a+iWzb}Ql%X#SY2{IIzvI)VL`|;HS^eo z!F)5~>&$1U&7<$a%VT(1Ti}0ZTlzs;4tH^AfKSw1#z398U2FEE0h_U3Q@pMs*{d!y zjH{CFV~6yNM-nhDI(TDyDxmF&picqOwA$yQAlP;@iU$YAE=jZ^vDY^4)hpw=Tti5H z2)U%7lFxyv`ets<3W~%#-Sohhh?|e;eByByKLgW;c|}odMqCUJ%I8otGE1m7`u?S$g?jJ zFU?Jsd)NtL_oDjLRIs)gnF0pI-Rf8+k&SU-OAG+-8sB559#%u+9d%il-NBP?g0%hReuan z;K-sDP4!=v7LK+4kIYNeVN&w zKNko`)ClT}PbC{4`&mK9?6B+}3xV6)oY9wSc+%>s=8K=VQFJpREQ@LBPuC&*lUU#4?yzX^-O!p~Xc{l;7 zg=-!P9kRcFXf!-|t3JKtPd8@QX!`DDIro11NRuSvC#5IEgf^mN(#fm``}C15+rsW1 zaS7}ZPbR!UbfUxHr7tD6a*}j?t3-o22ePAZ_l6^V@H3{wajNDTY!Hq(R7i72ml#IB zOLXp6Sm!;Es_Te)%#`v(FfXdApn^uXCFkCaCbq*6$RA@QWRWnVU`j_1)5Yy(1WXJMarBTcrM? z8}b1fg=Eol`m}s)NocpU1MSiA`f*MF6iI^hAtP~RC{QGv>wL;Wy53+2FkD-JleQSy z+{SQJ!hE<+4sSMO*Y5dia@bpxiV{Vj5?pfLr42JCZ>Lt}{_=iqJizk65R% zh%+(@H{6MevD}$NtuaQMhb{ia6O5+aVrVNk< zs>8i~9V0v$jv~jDU+L3}{|E!0%)9*MapB4Mkkd-k90ny3GTF@?p#geZ=)n&T2TJR+ z+3{_u06c6!Ln7GLBo`ns?17HTr#$0h=NbU_jsr_v*}90_?!p~y?)t4~{&q@z)%$j= z-a2Bg+}IvrSc>VOk4*l8G1MyU?w+JZ`gz`DYo9fCf0L%jM;u86zNCflSshn#AI_He^+hq=51;=8Afy5-2gRZa$%ud-mIYb_ zQBKQ_#92x8V|DP?gv%VRir*?%Rgb6kkxmy|tDFH}%%vbZ2}nC=8O>5A2=pvJ@POIK z7;^kCl_?ih#q)1oQgF?iOfE`>fs>2|9*%C!(f2M)MNK_%y9f2$uQjggJ|Fm_o!KPV zCXpxACl{x+eyD~oj}|mPH*|8yG^OwRCR>S)K&1iyl^7@;4( zr!En`j=s!w>Vb}A@LMps>AWM;-=}d%XSq?`V30q0h3SWw(cC7TzweE?3KwVg!Q6Sq zuZ@LSXOwM_?Q;EZQym52(v7bZ>O!BNpn}7rG2628-Ct`Fy|S^&l6_1c&F_{Lz90CA zZiBIP2~H(J)vqs8(B-QVx^x`L(mvki@XE4@iXNZ%Lu4H7=tBO}B+|c2uiLJ`_ z8azB&`$nhL-_EgIzXT)O8(y$Jv9V>G_BzRCqse+dlcPwrQ5}rN_Z9EE<*}iu4Fht& zIT=&vQB$PbTv}hg_C$eUaagp1uj%HrP9r{9AYO9jp9yb>KJJi!Ag}=d80VV z0j2uhi~!xn02O~NIkZc^LEq)a%OH=DXdyX1;gl;c8y6nxyX6b zsId0%Nq$J0}L)CHaX;4YZepZgF@by*+K!;{QV0T`2AaxN3#wz#UYdp+t>^8aL;KP83v zL6BPIK3|QJ8xGd2J2R@+WSyb~T8e~jKT6HTJJ_OpGd52r`t$b9lP7-bs7Gt(u zmbK}wA~?m$2}Jv*a2+N13!j;y)Z5W5_3_&3BQ8|V2e4kE_Y>Z)ufAsd>$fAMM9yyx zx(@>-j5-7v0xlq{A-2M9S6)z3QC50dyr!k@#Q&Q@U%sI8p~iOwhZkYT9`Pdu^M7C- zCIme#tJ`~Iqe{v3h#4TA4wx7F zt_}OSr@>Z@vQB^OlZ>_hi`R{T|AIM37Mmw2@RFFTY=2t~14#?njxN8h`w&(_+m8!b zu=?fBOXF5#!sazSq*46`uxEiLF$j_cA0|1gA)pcobgVzXCtJ^wW|0ydG?`iBPLA>K33F7)mPX zdK}{p4ZZ*l_*lflRN)+U%}5>5J$iDawz6tgw!Uw<<8dElfFSj_n&Ku*l*WMCF2xgo z&!z$Izxi$#s0uU`h;-d-zY^5@ACDsf2wbF7sr|SE34T)YZ5+bT!RH>pgA- zrJ5?5IfmBwGl_*)z5Eo?ieIW68o+FhBT()1{}I*M6UK9?N2GL&ru(~VG_OSz+1fZ>;H@?0dt-Zfkd{R85spye0+EZVNVh! zVwE{&c2dB;WzEvEJr-z}S>h~16=ERE6T}MEkvk(krRa2WN|kpt@9D7|-Bh%4!i|B9 z`nT1cXx-HE{|4!|L@EJc0~Crl>l`U$Ju1cxH^aAu1k8=rcz#H2W#OO791hYdkneX- znzcJv7lWhwc16{r3lXq$s-e&UyhI^XdCm{DJ$+o zJBj-Ke}JE47;*>Iow5j^`~XVb2h78qgSyD2!lUD@->G0^k7n4oGdak9f?tMzE^kqJd0CF=|gSqpbs-VeeJFaUN?;8_}P{%u_Y=JGkvut9QhLX z^)!5_i1gPHmp6!uEi7Cs8TS|oOQsJ}iYA0~*%Ybzocz9@3WLc1qLZ`If9xU#pofyo zZOaZ?0;8$6#ieG(RhAjIZ&Fo4M3_e2g#Jd22Y~)~6JTK1k92(8sEUil8lq0Bd{1d6 zWux^A2O$_sQI+}nr^68>TF}hTjX_VCDi{v`g(^jz=M+cc2^kN(^VHFPC(m^h#}N2* z7837z%JP&F5GAZJQ*DItF2%0g^faOhYadR;Vrrzn(o zMtp0{BZF{>8-IA$J2e%F(ig|m}ZK# zHD&hJz{V!*p0Bez^4ekr&5!`BN%wz#>j@kIYD^v_K_kqW0nAKK^1RvreXi|WUI9^s< zBJQ<>MN$IyY0G*gT$gHg_cb173&e0BK4xrR9r`1bC!!U9`J)(&nN~~_ES{jkRr(hg9VQ?5=Q*by>K~E1q#01gPXQl<9 z6lG>+hB>Mx5_GhNmi6h#V(|F32hB^+MCx8LONHV6=Yv5>Op(6@DctEo>rpLwsnK-h zuswHjg^r(R3JI})<9OukH7qMnKM+i*B2lts|BQ=#=HczLL(GK`N-^_?%Jwp(8Ehv? zEe{j?E6Z4v^?%!%QFb#K?|)WN(e(X5=SvN^*0WhQ6|D31Vp9>M*LWJ3-V^#qFr4&q z*tiN=PLS&F#TRej;^g-)st|7Vcn<&9Tv)M1_X>mYl!AJLVI^XKKG1i4nAnd4_mjy( z#{QF%Sc=1)5Jq9Dk8K+OBkygSt7ra zl>c;RJczk{ozF53qBU_6c5CBF+ZCV)tqHSlf;o+g9YJq`#27pL4eJ{EjOxJiA3a7e z3y4Sol-=p17dmSg+BE&Cy|**Z_pK-qru4CHKFkV!yM5_{pso=Q+I4TzHbc6)Ny4c^ z;_gZ?Sm%nb?G!%lij#)Np4e!uHZbnH9$L*+ZjamviHC`jH&G3PU#`Ps95b@G{dmuy zOGD%2Z=wO7@WxL|*{|1RmB;Z$(^48jeA9#%+N&tikL!~iSDhUNL?IPL(>bO)Sd2~g z%91^cwdb|2;~KhC0Ri95OwVXwTz5l6h>ypGSeJN(Oee>*tDkTFcrFe!O|`Nn)v$_s zvN?xljW5bsy9(HAV#%92e}~yvyz2D+R(_P35HzR1?Rqb75*P;f@t58aJlTQMdHd3n zzZr>qgID_sMV%|a%-<8A5fD4>?q!sd zcn5+)x@5!4mJZwQwVC}bNY6?;DhR~<{Rzi8O^@`t%ZMa)ikx8stfAv!hGYJvf2o$) zC;C=+mD2(_Tp>BXVs}H~>?7cYetD$Gw4NsW`%#M6%gLMW^HOK9re1eFCi)e^dbk`^|z2meoB0!Zqfml7@!lM^>!R41Z&UpiU7(DrCghfyp)|R z^uu`ht5h_HsE3*r`_&Z-dGHqZ48`x=!~)NWR26x^TO83G7pM8bqkuMIPz0U8c-P}3 zH8GEh^yk~>HQ%0`_>gArI>2Hj);-TthN`z6Kyg^j_2u6t;V8;h*+$s;B$B$0{I6lQ zJJ~}v(JcA!_69IxxmU*7;G7cu!l{(erY z2^6_@JBZYWZ0HNU?MdHl_^35J(}drr*k~m*-p=ER$Qf;KqImN%v!`MFIww*H?erNh zWxhD(%bm0-JH#AaWhPqkEVxtQqx_efgVDB~tFYwqW^())n~Q>xgsyd^uOC%DHk~Vr)4xTDz*~v~pdfjz4JF|B<-(o3 zB=)2ygqHZrual=)PPVSf0&5CZEjTR>(w#2TgO;{q@a>Y8;~qrFxkje8R|JX=^W?@99R6rIHfz*u=Ae6kV0yqeF|Te0Uxy=|;O5S_#`!d#IY4N%{i?%ck-|1pjZwkh zi;gu8Z?E+Sm6GegIhT*SRKB3KYdhb_oX2Hku$9zmGBdxyM1nUqZVa|h5Te&M_4zU3 zqe)JOw<-WK_kv}{k8wufYM)tl3B2pab$2nH0m~@F4p|U(^xQ)Hj`8KLzlBCe|1&TE zx(n;#FYrL?iomhM&uJiI^nG2Nk(qyJ-6Ew2_ib7coj>cqAuhv7$A-&l!;Q%{*FjUP z(Ls&Xn^#Dc0mnO1Buxba7OxQ;`b+=k$qdR81ELIO+{xG&P8TUm zh2sEti-jtTa2Y^A-8}}>%jES4pPNr{WrPzkm-~9*q%XSbM}i=J>+;|?JcW$IB+>IR zFva&81*e+pHW&#F+rs)bizYX4?2DEi1=-eDQVCpDJ_KXuIk+FJ5w+W0t9|RBO=LV7k{8ax6i8 zVKb~*5IRkjsJp)~G$umJZpprkfkrx)Z%@`V&)(3}T7!vN2aZL*Z0NJ{)`a8&NVfGd z*z(k5$_hs56t`w|Wrk-sls3S2$$tRZ-KpCUGhlsRRmzuz`;4Dk5*Ys7XQ82q3o4(Q zriZ4{PDaVQo@gqB)BH~6XWPO{%ob2xzH-#;mO$RpBh>6azjyrbd(+xbur(&X5E+cu zHIv?VQXAY&=$G4pfH|=^QxtKk%Z`u6r)NkzQ~@!R#ZYu`(AsLynm?$pGM~!Qn?~Cj z$2tmgsiw&C`q1Z3b37SJgeV^Gb`ZYZXxwOjL(;b`b#Zviv3qongz@FqFIbPCqlt`Vm795n@gfNgO!zQvIZ@9iok#!&ETDYK}l6X`+pI&^~_J#XQ<<4fsP(ra&3>t^-Yj@ zX23wsY+W9{^)(1ggZ`!lvpR_#;_y(I+6!NX&h;$%tzzI4Cs#ZrKRsHmiV?sZ{u`K6 zt5Uj>c6v4D0oNH2@XULFHZaWd$Scv!eZOJ+eOz!Z5g%Uq_(tMR-=5f;Pi6aB{@k{r zi)z#BZ?WciHGQh~Z6cy?eqtO6QkC_x1{NChMSMiZDL?5>Q)$StLl^Zpxt_b`` zZE~D&vSjzk`Ft9?O8$FAI>XnK!MX}X}XoZv!yeaDLhPLSPjRyw- zI~~wS8{lvJoibA$1Q`OIzn`2oYxPwzi9Wtybqt4bb@Ybs_SEH!ZpHbja45hcM3;wv zwQG?>c`r`>$|%Su zU5BRJG17oEDO(-Tv_5<1lR@9yOEW-?zz?!>9`BrqC<{dX+=KDxwIk1J`-O3 zea@yLDkHpxKt-tBPyzx@9HGVZ(?Le&N!S;r{G<xAeH(>%^~D^MHno?v;D)*G zNJs!@P(Ze41a?;s-#2$`K!7`8Jl^x|p~@C#`U*TL>k0r0vPXi zGTIV)6R+44qYl(I^Bzc~mGGqMzb9)?$y^D7x@c9r%o(L01ZGG+ziQYRay-R>kTI9O z&p$l?)-fpOVPg?f?1sO0EmJm+A06T=Z+hGJuhy7*6(56<{^a*H49AjL=Cj#e@Jt2R4s9w3*X!0QoPG zhj56Nn7yElrpU{vg9*YR5rg2gXR*jVaJ1kKeRJJh!@(FO**K3|Psw`D^^tAHnByQF zai_x?E@6c1Kgsy zSIm$eyBO zM>H}TiK zH=Ak|w}E(WKxIQG!jD7fYMyWT+YKg`7oq8O2HN~{3(PuAu6X}gNmhXN%fV#}Fy*Qr z`d0*p;usA^Fq_>8K9`i-KLEou4_ytP&i7nJdg7fDFZTN44QWuFQg;6CiEs%Z9z^P! zzj`z0Jey=~X3G+^`|30UqMoP)t)9--ZgAxPKkhnS@O#DKp=qo;Nk7fA^Og6uqS!D@E0~oVJm%5oZGx%pe$ASS9Y`+z- zC)%tx`567hSjzjc*2w;s6p{_Y--=JoBi6`TCv=!Ghs$E_B5-a&lZ!KcJ^bFw!yX5| zOa4|Q$#5dh#8&3+Zd_3A5OC16Tth$ZXocetc-1125l>n&o=1X=Yi_&)4d)(So6HYM zbH_E6!=F(8=?|OhW}LJGtZE1{ z>={JchS>0=EXI@V6X(T9*}D8*yEea;ZYqZ~TxkIX621#j)Rt8x&(%p(pYHg_PcGEs zSIPgjeUG>CihEnHU6WUm{ApamU+SW$BbM*fRT|^7wH~OrEHXmlIMHJy4>z$M)=XM{ zEnY8W2w3oxG2n*Ww`8$(w?^LQ^$OWlWgUlnM6L>%u$%2r@8#A3`*v zN}q>Ys=u^;H~aX4{4ensfieblPy}8FXB%FNjri>gd@tk|h23}7s=q^c+kj)V`N2&n z`0?=eX8WF5l%#v^vV=Rt9v@Z6WWUM9!^1OORoC3iCQ{HeSg1j7{IvqVETHRD+Cyr? zQRUC~yApCm`HH^qQRiVy10HTPR>v;?UcyY3^WyMl2u3=(J6$RISD(&Arya#x8>7*j z+=1f;4;DYY^dj`8uE^OHxF_@67LvCgs2MIVCb+(i^xM4epd5w08e~`C%yT{*Y6e)JCB|Z2_`G1&~O0>E&+P z;buURU)MCICrh)(p7)(AsV1KP-??BY6j+F76D*YZV#D5mS@j0+_c2T_@C>Z68&?7j6A{Hf>0J|4Z_aDO1Yw6Dq~I-p zw)sYJ8vv@e#{h{<6&2JXiTII=ClZKsK&>yfMg2*}0HrA(#1fc00cEWs4UK@I4iu(z?e)Ec=NZUATK5 ztbSciw)K6?z~l27(9Ybr-z8+6uC`8elDg@A(t3FDnde=f@fz8BOB&9TR#4d4ed{Dl;Qf}r?q*XB~`+l zL`ku=RmRH1rlD|g|9PFz;&q)8R4_(SdKJ{Q(01mt_BB1Z*<-6@e@Q5LP9yb$d**Ef zxQFMe>+ib!QGY7@nwPQi@pcPW8$05cWwyW{dR$(Y$InL~AWY;%4Jp4C>Zdw^q|w~f zq;E3#JpJr&LhXdo8@}AwmH}o+&YFLfgin1JPI>{Yv{HWBgjz{ng5Gor-xuI6t-j0; z-ktM;Khu-zzDjKIhTDEJ&O_0(538+7Qi)+<0QJ-}V!!aVqqDeQH}9*5WG#7oS@1vZ z71DN-*{PV!m4ARyHBZf**+aji-^5?w>dXgSA_15YMfT~ z+Kr4G{+lTm_BmORMO;t)cc5N1H>eqWMz72%on&s9pQUR%nEdcSF@F)Bu+I4%nJD|1 z=%)_c$)(JUDXCf&UyMg)U0Q1`+!2mOv z<)4WLvav%Qi&BT3&g|>j;)~4{mNqX7cf7vENsU_Ph3rjTKU&7#oI?}LnybItw%+~@ z-p@Dxrq5nV{m$suKIW${{Y!KdL4in77FPoAe%&y-9hz{-<=MzAH1L6{#5vWaHs|?S&imlVHlK%fvgga-zvwKQTsO zC={3FD6Z6Y$GOAh@#J+oj<4g!kl^!Kqv`g*Xa3GW;}uL?>*%;6gL`kp_x$22Bah52 zHbXNf%Sv$jeFCa?b>;&?xkf$l;p3m%l4=zwx1T_u4?^+5$A)t?3%v)!mo5&YOP^Q% zhoZat;=JF?{bXJPEAI0~83Yi6oML=J7DgQN}5{Ykw2B%{Kw z$#y{-0!x{PRK1&kn@BnC1sCVr-WB$ehHF`Ci&|IYqMAf2dd|}2297Mmy!aLCW8V^f zdQJ^xUf;9)EB`COh34H>+3lSSlP{?Q`Ulpgo0iLKg>3*SzAx2|aWnC`>-c20iFbj2 zlcjP=_2XmS!~XU=cBy#g`act2*e~VrB}dkLCr@ohJCRlD{yD)mz*wzy<=bJh`a|7p z3Uk`v>98!Iiv}05&!d*w?jbSHkMo8{TlYiiS+y?#Jg=LoTyQ(}s7fcS@JrS@>xaU} z+>g{Cck55K97`={3%o+f!_}O3X`01)@H1VP-|7Blg{z$pcanoQDWgLNQ}&0m<&Tb) zO-AbY-mkPx9RjXKQhZK7>K6tdDk){JvefCgt&YX9w4fDtQwas1|2MI_x2Aqw&VD{X zzxu=H=k~L=f6F=5*SPJ@?W$z0=aa6eF6YbNtMGx5;ofWI;N^aQk4ES-F)-Mz_;cHa zN|h9-nkd+6YG&5=s^)*)cY7cu&$55>PyS<7oD2-td-{FmT74By-pj$j@MA&I6J~l> zkUK8yh>ZMnRy5KmdB*E*P~BW->pNrGw)?XuKhv&_i49(MX5OUEtBLFM<>EHDFfd5C ze$A|Xa?|FwNA@fCP#+Hog*UWG z*uTflVj9lM_GZp*hK{Bn=63eBru0t6j;5w|P8Rmg*Wld(e;YCWYb4@mYUpffZ%3?R zX=@51?r2HO!cHsNiadK!HrkILRf>B`y+f3o+YGPfKo{l|D7I0%%#aTj|p@Z7{58wN_Lo zS6$7eC+EK;lCmso8-@i_jZmfRA|g%zaj>zUKYGQ47=jW~9zDAC?gG<}`HsD(JpNvP zi{nhzfyKqfU^{pMo}~2j^ee$_MRc?y=E335F}PP&@08TQs|cOIvv(Ftc+zriQ*VLI^pRszlho=C23L=G-9$bqzFW#BwNJ1I znS*IvZNcH=KO#2k9(O6~_8R4wOvbB5-ou{6VhXCCIF3j*247vuDc}g=dKi(Kf36{t zI=F%g@AXR&w@EcxB$&Ntjqp49u$58*u6oWbP-Eve2zzK@pFHm3J^2_UXqQcq;)ix7zHyw1n4Yzj03sR+^bF5K*7(cK)QwO#9l3 zQhv8zX}vzXwc@@cQ)9F@cgVmtP?8I%zAYL>6oJ%(N*`g!%x!Gn!@hJA5H27GrmZ{|I@;7Dknn26u5WgM)7Xn z9d2(+Xa5`ID1TgbuN{B(kSK&}hkys;I3I3VKMk`56+m`(Z7t*jw1^#J^Iy>lXaUG+ zEl#p)w3o$A89wSS?PfPd2U#Nm43qZR9vQ%NlQqEPIJLU;$=y2_I;%p#qmNO^kH!mq~ zmJu|a)VD*>h;(~F@K+pyf$`^wK0b?YsNz_BzLGYovEp=b{X*$hcJeh}-Dt3UKt^hd=W#5m=2e{E2N|KmX2={I>a=wQwp8{VM_XL1IeVS9(ItTt ztFX}$?kQ;-*J2A0EpJQga}9yVm%)pyA;NyP!iabgqNBiT|Arm3z)&M47@C7;7-THE zk0KN`g!dyOERxaIcmn^%4?W{=cgN)@pUN5Hl0`K6sM%Vn^=w*^Ks#tgP8+LzCEX*{dj5$CGtwf3YhWn%onzGtx@ex{bvcOfi(ehv?gqK_A+vJC_hu zP0=SdQGG3TKZd+x1tmCzvhmO-9SE)}DduSfI}LQaV~Hs~6Gk74y1d!gUBX;?lli=c z@rPv5Cz`&p*B&3|p-N91$J{xu`j(ZxF@SLK#TB29I4Bb6<%|la0&~HgXEfHo+cK8- z-3KqHqa^@!_M4rTAwe@#8BlRVYhQA$=M#x{&=76Rw!%0KwY*QuEn*&OAu8;i(r45M zf6`t~gvWz|H77M_tU(p=A>aZ3{TZ1ZBw#lx&J1{vg<#Tz;V`%=V$u|8A+I<1F>>0J zFt}deVC$tq#$o0N<$sC}<@bav*i>YF`U1T>JNpg7)4-Od;9x-hvAaDy!ET>KrWI<5 z17RU02|;%EdUVh8*mX$kY(%#%f0C5E-_w(hup41m+z`RV6x(-8d<%+~sVSw^7FvXC zdCyTB#HhkE3JZ<;(;Pk-;_|X^((xiq=*kkKpR_Mtve(%c4{Ix;pNkoK(niFxd2yHTzQEFi?@p0I= z`pzLJ%AB}+o{z($1XC1Bwbqs?ql=EtkAS7jd~X4`>!Ch^zA9g`59w?ec{R%Yw=ssMB=QQIsIyMP z!3k(DK`ko{D6bUBT*2>;)ePd5J*gnjn0n>3)`LEWemm*ST=H{ls`D82q~XB|i$*Qe z`H`q5@&O{DrPd%Yd|eG+|AijZ`z`DT_M<1?oN>d*Rt==k0amn^3A&>j1zVEggiN7@ zHT-LgdLwH4Y8`wIVN5i>7L8Kb3W112#H-_vCP0+8VERxN9#gP5tIA<-oH)W-tQjB< zBVgXv@&3l|V6K&gI4JM{=xr`avgw2G!>^bkc?uQo4<(;>-e#6BEa#KV-ZUkR?7{S2 z<(|aukm=)rhB+loB`D^@%H%C@6%QEcP}NuqEMrR^`>0WNwgH+Gyqy)$Uqw(F0I)G_ z4JCY2*IyNSIat1~UCy91W~1rvZ|5wEcB2r6qYo!wtj(5%BWc0IE`az}P>rf8OP}c_ zLUy)xIKgeSq?zI|1CMhG2m1DCGM4zOaQm;WFSR*A>yg%V{0#vcDY5ewm(w#N8sZFd zajn##Xe=go+XJft0UOIHMx`laYQe_Q?72|$4iRdxxhE;EFUTHs77v~7#n)!4mFY4@ z5T9rgLX=r6=DnzTX{wW3liHd!b|w}U-zwB3W)FEvy8sljm-&jw7A9lCaeziK&JRa(e*s!e?s%(Ydo+BWf94*+)7m{MS5aWB!LMX7ji2j9rU z?b;nZxc{ON<@ZX~n3W_A7YhMju_f9&&S+$zVuY5PkAobmLNZsRv<`3^FIBa!g?<_q z7cBu*-`0Q%B^zBAmK$^+FRB1S-{z8*LAga_Gqq33#BH&Mu03OzSZ@OOJ~8d?j+8N) z`(;hlM8qzjX%zFkAB5E5^3yb)tBe;CfbcNPnO^{eej=8DF^As=752K~q)8Y>8^{>Dhq`)x!- zzM&kX)Z<%{tj4tClovOg10>vhCY@|=%#1r`6MG){#AK+ZeM)D~6q#CI175Q0IRIvN zTn8V4TJQAU!vSXcxH%wwUXzd;v4LoJuDU2Qdfs67??QzB^JjSIhe+^i{o7A~Pe?I0 z$qGEUkGvpD`U0DZe^3LIIbSc4@C=;Kseb7bI0*@Ak&VvG5W z*6-k7bM4e>NJ^~_%MyNAqtn~WR18E011ob&Uk|vVvLVI6e?Z6*f|k_VeB8IEY0rs< zuGZDv9c5k@VM+hMIa$*z?4h`ONtQ~s&y*Q=dmwK=pvOGqBy{>nRIr1x59?pt&W(-T+h^$nTuYu^Oc14^+*%b6KonBAYPOXQ zB#AG$cD@y%-xvr-i~VC^K=rHCvL1%gy*_gzR{v;t9+x<%PyKuP*C;G^WnMLE|-E^iP_T+>Gh4&sPGzP%v%I`G;pd(sY~>f zZ~IT@)Y6s&Gii>fS~-@bs3<(?Tu)pF&D^rup0zR_f`Vw#YZ-3B$lDd zl2cZ!*DYQJRjr5NF?hLm=(Eo}rkSE0;}j3oq7nV*jqnY95gZUZMH+gwWdJ)~?EU zy*A33QfyRuMMj?(BW}w*xrkuEF2t=%8rN<;RP1|UIdL>{y$REb5t&y5{=m$8bZEyK39;k?8GxDoMXuAh~FSD2t5heo|i z!3}asOfs{PFsktn1x2qL_(kfR{BcV!EN&{)<8-CEHB?FVO9_u90z+rysN8W*>hRF<2WBib;s=@`iQF1r1-wa^R~K z!GfmfOBH!{xRs=gdzX_o2WWq%PY(c(st7u1MxwXr4|K$_AB7E9Uc`2A34-T8CF{E+ zFArn%!N4W9Uf^O0{+KF-MeNL!ReEy4f3e%&=~-#-rvE0de22S!U>#SfZpiJe!D$Vn zrSm*ydU@3=r$c!Hu9{gOAOH?laDZj)^r{A1-|I9Q?W@j0)NXN&Y8mbpep!yhJe5nG>}?fMMM`XS+f{mRbYQzos!{` zG(-QIA3FOElf3vLbEk&~d*Ux&)3fnVPbQ08*C*5MP5r=#hLX~p!`SvQoTppeOw3TG zKDkLIPK5LZQ({;OJ~M*yOoR(xM=S^m&p1Z2Ucc-M!CO#A-L+nJ<&e*Uc5XK+d`lth z`W>nc(j(D@FvP_0D4w_#lX$i4 zzpR)>Rk_@`=i?HjtEzCH;&*>@B?0soKt|%k>`Ypo9M~LaXAUhaFkkj>$FR5z`2BBB zaz0;AdQC1)DAR^W^yJ>X7%|TIA{}tZuIMY2QdXEo6YA2nlS7sf)DU6aPUe`c*%qwA!vbCqKlCk zsdYDC;bOS8PdyE>gE&63Dvp5@{CJX{F9NPaGrMfe@S#_Rvd%Z4_C*2ZeU3oY-35}I zZI!3DH5C$J=ms~>XF%2h%0NXwG)iswfIwwK9}LWUGh=WK zNd|Q|ICHwonxtlC%J{Jl=7Y|zxH%(=dI!*|l(A_=^_l^@dm*~9%^4E|i^m>$m)5O_ zPVm}F>nb!eK;e*uAZVHwccT@5F+TfbL4R%CoB^FJNIVjUo+JFWeLjoC{Mw{eS*`0; zo)0IdzsB6KR=3{SACOlISp?lkf5OUS3jJ(%j4k|Pb zNeC?zFgg-;&(>ZBVL(9iK+_rDOHk*tW$uEtMQNfj7Jf)_W1&m|`{xtUNou&)J&nm0 z&A^qRxB-N`)dZ&tCEjnar#C^A!wK-LbJUuDTAxWW=Y9M&Dqrx6woEUpsf%!GgA<&0m} zYZ;Pty{7HA_C>ESEBoWDyn}{1(s2l&L%2-;B`_JHf}6Ut>=lor9mOQd_h$+Nqsz}d zdA&GfZ|5SQKb89% zL6UdI%n{xy5rWDgmcKbRStf=5w@@7GG}M*TG;G9pSC!DWcXb$8m0hMI6f-{jrLshN zvb%aGW|z5)9_Z+a*fq)PeP(MP*4Kiu>EvI2zRRw0WD|paho2( z@--gpB2$PS>?(^R4oCL?S&iO?oMrsZTVD!a zyAPT0M{IkW(O8cnJV&n+vNq@~bdpUqVUCDtnP?Wh}bacwc+|}w#BChRtn9#!{-N0q2A|;T&!toH{zyScnZ{| z8li?)r~&I7I0~^NVy`$xV51J$E%0DVF{LTxH8844fu=2InrXn^%(}!@Uaz-b$4vcsuQe%5##-s;XZ+QjvG3X@ut5ual}bP z*@J)C&dOdggYJpUCMPZ*k)E&sk8dVQJjpE?jtCC!%zZWEvl zqVb^WML`1sAA7XceByusdzp|rB@6~XOQ4j@O(inen+e#GElN?}_E|N9i&{#AX(Y{U z4^|2ES$LgyrWcY5hE9+}HWVO7YP%?5(`-vXnoy{S^n*91iD-kNmW1!(se3dQI3j1< z!){I3IU2SGKdOP1x+)q_6TPQ5m+){L%7nV47=mYUpB%sPd_Of}BZoc+{i3$7^NWp{ z6X9uVkZn{xs~$GwgQID_W$fBYx2Ofx0m3z$L)Ku488L#gp!Tc~9$bDeecgIiN`y9V zG2ROCTvH!3sYe*Mr3L_Shi0frG^qKIS09<4&+8B~<|Uc|)x8#nu@@Yw*4p@`wAdg< z10rj$-CIB#gFc{4%-4zx7~;HUmnEy8pV^%1eGb@ir1tos2n+1>F6wV{29{F0aCMP= z5@|Q0f%9Ja=jk}-O%8<=|06kT9lvJmSoT?h^*vRh^^nnTxg~=?24`L}aH``(jB!G8 zwkbIU>elZQ2{*U6Od<j)g&5#Zfw7@niFWZ zN3&CsC-g8U`;d(C#6_+G1nUL2-Zz!Y9|wRlZ*pe7aecBuG3k}x{?Aawln^qEth^H)^>wBFG&Hseeg6%GK!M4q4zT5oqc<`W zxPWmo2JMtiB;~gR+(9smhdD%t2O_esWr~akP#hE=k`C2x_j-pL8K9WMo1xo zJI-V!4@g__kw9a1T@q3~RHds|QjRO?SMrU}aRCpDQ8x1aRG^c`J7RdtG}re}2akL{=MCk7pxU1h)EoBNt9i zcn*bXG1QTc>xd#x{VN_rgQ#qgv?Ob;0`litubR z8qn_@Z-{=sym=Dssll|8rXvON%NRgI2fm30>HED z*$KQo+sRB~FnQVUCK1(M{KwY8i+YyS>t=q2xdaGkztgT<=_T|N&4rwlX#CL3_N)1 zGF&u;c9vsxg+Q)?pemzX-4vQY?k|_Fq(k{vS<)wS@kQ9b9DeGkxaj_*wi7!hmTZ1?qDcbNyd- zI{m#h+uymle>LWPY&%*Tj!rBuCH|q*zmv~L#S7n58W^e-a6SKOB)&Bsy}ztib2dKabqs$tO~h^V1aJ^1Lw6WHlL zcV$i|>95^xGx3b#5Ax_P_M38mCE_fjC4zWC2ER|R&?KnQHS5oC-|lY$PUfr<*`u^@ zXrnU$vp@ngtTK&<9Eynx-`|a8QGWby9P16$1$4HhW@^mCR1~+N`rT?rXD?hR#Wk9G zj)zl%T9cIc1Rtnyn~!%^yOW))aVw`Jn213GWU(LD_;lpNe*x5OaY46wasMuV+wUxp z)_*3GdLhotK$pZDSpIx8Yy^49W)eW?;L;T8&2AYSg6Dc~DP_cWj^xZUu(BZOFol3D zx-jzohO0<~FFjP#xrcx=m>KU|%Gf35tFWv+6|bn+e*}2i(|YFa#McEX6E~?5+o>d~ zQBci;{X@_=eSu=+0fQv{nB+8F?i%z$7D)+L7%zSZXY{%0duenl%e70B zJi?n<-fzkxsgSa(Ci?6#U3Yt>M&Vkx1U zZ9V4FlF>T|IuM!XUn+87@I5}M$|`Kj1>Vc&#cogj*9$F8pyxC$5k8J61!-@dsrx}EjhF*59?yi7vy2Ls`5P=utyV|-p7})|5Qs+Ryhyy zKZlB$hmo-j6hpV9bB~wiAJrY>hN27;It0DfC2b_^=m{MjP!8Kx?c@|Vx-vf_Q+2oX zPi2hRU!}x1JSZQfA=EI%aU)^?&x=q=ZW?ZbE3z8BBfR#*YTrY6=v~gfa<{%P5d05Y zG=`>`67D{&E!KnUv15-}>sCq_NcP=f)Z98m6eVFG%rUs2UPw@u74P=N>k}0mJ?g~+ z*e;|xerU~GE?Jkp?%E#|W)`#_qh8>I0>7{8?iiFcEfc>CQc~j(OtGy`hZ9YNoZKT9 zn7J!H&HIkAGS09O_j(yX{}J5DBl}N)ezcmRTO~F@XHokb5+b7Ol=hkM1{zM0I=3zZ z(jcj#$-E48wi$>Xoq%2r^iAd*ac{Q{xK$rGxH#h@Vz?}v6b3&+Y(6u%)+yuOUX|b< z90$sQm35H!20Ze!XDH|hf#abotf}ozkGEsHX^OZ^wc`5 zhe~0M58(hEMk^yuH(AO0v>}r%8Pso&4Y$nf>`I*9%d|ek2ZWt8zbN%@-F(NKB*uGK zQz;ll>(rX#RlPjb588-RNYseTWxN?ywXivu163LMV(R|bHf7o(?A?V@ROZN3BzS8@ z4os$`3Bwj1xKLfq%`gT2jgd!9@bVE!H8F`l{j=^d&SSq>azTsaWyMdEjWnbOvF8MH zTZnTY3(!4IU^|F>(ucY`#gb8go?-D%F~h0%xMz1o#00@MKU<8MMU;=!RVFoh74@mt za@Lc8(?IklEGhw~)lchPATMGxbLPiiN&bb+_*iiAj}zP|BN(#rQ-;R-kG%Ja<(5=! z*obw9M@O-N9&{`9K@IdF@2SVbJ!Pku_oLNk+CoM1>Ie0xy}ZrmsLNI3&Kni@k_7pJ z8tmBd3AvVSFVM@=8Y;QBi1hM`3^EiX6p_fAkjdJA<{jvF&woK-H3hsarEd-u81W(L zK}K6V>&KsNaW0@}2fNW#*wy%=UR`%HU;-_r{v?GTbV4F-kjt%?kI^uUE<533_pnM2 z7@AYD@`Evq!g{{nL}zgp`Xu}$c=fAHM+v)MM=xwBW*G!#9&bsJtbfZrEQs|<`#cjZ zmYnCd2(c?n<%u@{e0R7mjxz+g?KZJCAaQ?KkZdOsRoI0^I0Mo%qkG#wu%DVyGL8_jJze?Se&Zd{PTzpYX^qt}3wkW|T z+?&-JqE{G}s{+D-_|A-aG%}X#N+{!1=dYP4X{xmj?7?9xa#|G5WVnRc-jSF_fh)fY zU;5DKhZ6OV`JndD-Gy!Hll#uSKg(RP?MP*4Dj1+jSmc;R7K?(jxls2MNmwpzz3vIO zcj80Op~f$FzUjzha2*7IPeg`OMks5J?84_arz*_T4H1>o>p{B~u!!FV9=r_AUW#ty z=^OLuOL*mviGDZI9&i1NQxFaxQonsPT{9Y!7WzfY$PB7~*cQ^fKul$xNaby4ff-Yw*MTRg6obO-2muM#z)C;#v?U;vvzZ%3t=>ycpTJaOk=67hdN_B zi6Iy^?QMTXP!RKD4r*idDwCbWUUBZg!5)_ZxSeo8-rmuYsPrLj!(_@!Bb?D@=z~CTQtDd+}B}H-`xEE!F+>+A9dndHIto3 z%5!ykC1T5lLuIF+el^%(+TdZZ2h=%KBQU(RSu1bJKvl@Fnks%Wy|F7SF1&YavW8zU z2rtZ-qC{!-FFPI#!yNOv$-E(kbyKM1xtce!`0Cz4Hl?U*`7)$MY&|Yz5Rf>W)(5P| zm!f|f{N3(GT1h>$mgaTF~8c*)neGV4+ z2J)Al-+rGpVOv^&(oL)p6$KrY!!4Y7wXeMR(Knh4<~?3e9?+Waf6OGhPu&&1d|**s zUVh4#zBkpcE~7;qulU~6PGsKw57}bM_-nQKRq=giN~}w!+rJuOM)jtl6N>d63^>Lo zdpcPF0H5*x9>QvWd7>(8_ijgW%+gnj1lvEw2)2AemH8-<@E~^Pl02WnL%cTJL?Cd@Gy9>viSu9rttNmYr8XxABXTA-fViVkZ>) zGv6ZDmUU58lV|&+OYAd4S#u}BPn#NNfM)WsG=1>1uo>y&v6%*%@|=8|EfS5_eusH+%=R(4KLp((T?0J z>=U_DRX1NVRv;Lc<&jEiqr8LojlnTyN|M|B>KQe9eWFVT;?`O>Y=(^}=kw*BGt*s7 zr$@oVA)KkVj&R|zy8D1Pw92F%vpYLA42$k z6$}PU0zW%TXwh}nyYOCk5QYHN?plFuoL{ivl+}Bo0icfK_!s%K)WuuAY@nZHaWa>6 zZZO0%5>m#RpvjzlJi0Y`dGay3Ky0-oRJuxXf|RJQ4=5h9J;F}dv}V{kFYLK?wcVS8 zy(Mbr|A!J;c*Rp?KWDHIIAH&s!%;JZjRzUx&-3e~jqj;%hZj$e7+=J;gu=kKa)94} z4k29GacH5lm4CuO|GN;#^q{Qy7&b)pmY!@nM(^69p?kUqcGRN1F8p0+2jQJMB#*>UpwLGPznqia!owGaR7^`?oH;S^sos zsq)m2u4)j+$3c%yK)SrrZ2{yuufCD!j5|4E^@@AQKF7-xXl!ouAtm?vo*`(8XwZeSM8InoJeJyiGr3EayDjs)MX&j~u*ug<0v0^t-&7m- zyYN6>d+R~O1NL0M$$YUMdQYG>G@XS7(ffyvH{<&H1G(`Tp<0)n!D--XWsY_1iiVs+ zOgdSP%i@d<8L3B2WKLtiL5i`4-$GCCWc!V#57G5?7oKr+Kt};Jz6veO89L8?Ka!?( z>SW)DV698*U&hYzm$Botv`7ALVprv|J1T_V5XE`LaZ+X-A!G*0uk_wC|JccN(KTRnXK{e+%G?q>nZCQZB#bd-pPO3 z?g+dN8ROH%>}fvTgpDga?#R%a=D)dH!RnKl)SBq8cm}Unnpt!4dlJ2oFAbh-LkTvVwz*9Z*8ZWo%xJ)uqL)aq0naQjhHf9I zlff9Ly8Y0Z8yDMK?9G^?n%?^352R5!W3K_x7=AYe9nPWnQm`@lmPOuw#^j3ujcElM zkO4Ce^j7N*%cstXI9P50o~<=^q5V&Kdp1QuxB9P;02*Mu^K11`oqRfCS&Yc%hWz;^3Q4KKT*KFCE-%4-a$4ST|LJL+qD=!ZQ6ZR`3)y-dho@ zRw>pETD{#c@im4aVI|zr?mBiek12HO;$Sg+dl1Wijq#6p>wE>gpB13g+sO@kN&h+ zn9q}?JsajQM$Z!`W!M;9y z+7{!GYxYqGitn%tI6eJ{61l(cDB!H|FZ0+W+(e)xz?K6dbi<^vjA3DflQKOEictOr z?n&}rQs#<(72~qV&C(EA23ab%yHN|+xZ($^2)w(uN$Jq68}xf8N5xru5^>c_YCaF2J zmW0cZLFVddP{uI4jyyJq=*n!|kUp%#-Oh{6X=5$Wvxeja#$P<9gRq}=o5N***|HvM zuuPkqO1;kY7J7gZa(>O`uli=BsnrnVVQOXAal!$7tU*Q!dpXtO*KkGUO>4!7*M(SK~)_ZYYd<1AKRCZp2;TQ>4h|U zIs6(Pr1@n^o+t{Ug{t;=a63yg+^5;~%%yEa$4F|s?Yne6cCKP3ojx2QJmpANJv5ld zmC=m>{)-Gcv$u!-;v;wVtXDl^4$SJk_;$8a-n-kJ(Qi=_u$D$uRSqR1VJ44s)SMkd zbva;AO3uG;-bBEd@2t4VG4O2*vky(U-ytQ!qLSt?qd@Sst__n8-{UMC+N?<%K)F4g zJqq$&-us2yK8wiTK0cX@^%~YJW()?47A<*Asf#<|hqvCjas%GcIO}fLPb%AH4YsvfSCv8~Euk7`Eg`<7;*p1J8h1y1}lIDJWt*f}f65^r)dQ z$RdGXnO9z^glzx=4ZXqim+7XH2sMO{>n6e^mchh(Q$30Zc@5sMak3iWldEP5v?j+g zCM#PX4)P~{^+dFnYh*p^vqVH9#{%*WN~$Huw4-_?KwDc|KZXDh20Xpm>+;Ueif%>m zNh0H6d<$o{H~BV#3SZs!rKbL29U8x1_4wx98fereDeAz!!pTl9BKI2%U}`4H&90BC zD%Ckz*w_M9D+(;AR!1Hy`L-gpCcQ{0;F_xq=61P$U0w8s_KFWC)j>{O(U6N|Lyd#o zV3pa&5&dRYCcP$qAtJh6!KF8{7kn41T9e%NVCVFueHSsQ)W;bwcZ8T<7HhD|%Dym9 z9OVQZVq4luT-p`cL=*7S=zDFA`zNxMG)iuGr{NR|NfQzjSu+Qiabi0@t4tgH-5btF zGI0dWD#{eyykffAs?sNOxVC73Re|Ph!R_FB z_l}TcTZj9s<ELPcfmphoQYfIp~L2hLe3fXs>3hOePi&kF*Y86%! zPiT6jorrLB=EUq5UfRHh=bbWjE)5rqL56?(eCQ1p*v9G~GW%h(r6IaI$42045g;md zO$H?5MxYx?a1-TRzv>(2pBx1~xRbn!qfCDe`f=-~%PopBdXpLHlOV#7uN0d3U}6s*kNgs6GNmgl`U3MfLyE^p>Duh~3LV$#HZOAe zHZfhn71s#0ZDw0S)gbsOlM*1RH^)hy0%9SxmE32HN6ECwn|68R?j8o7#wjDE=Z)_G zwYEpcC+{lV3|u1oy|TnAT64~w9U*HZVE6WAfjXTYf1j&VQ~-~awCz#bCw4%yYpBxD10Dq3uV*|HgW$x&dHM5Q0PSd*f(cOxH;s8n(L{h#?pp zA@aMbeaD5Hy1VXJdQC~w6zvs766fi8!nlN4{PQtt1B)9lMEa?1vFD)P4Ek^%~*a@@IbfkF`?S= z)?=36n(>CK9&vm8B!Hv*xwn7fuiMVvd?RrY0;0vvUA&IHYY`l@$GLIJj~|-pQ<&BP ztQa?TYs7KTVT?*6r&Mj=@MI^FQ+DF0i2L17O>W*O$K3vZSuiIQJ?UVwD+3$6Bw4}4 z*#%24JxuEH3NuRLkZ8VxpJhXWnH^x9%!anL6*j1L#V7R1Z{Ia0?S!RdP?S#o!E;mI zvs9j3z4uk4)soiw+N!)9&MjFmh>i>bGx20WQqPS74yc=j>bg)sOoDLyl!YgC+yHJA z84X;*?Xan>7|L(5fR~Y7aTtk<^9^K&Ri{`zaD?IDtAk4vk;O!7vB-FJUF{h_B^T*j z96-6&{XhbBZPD%bt_ic)VHq`Hblg%0Tcd|pQB9zgn1n7sfz@lBmZ9a$wrrpC|Kkd6(o z=1Y_^+JYO+ee*j|Dm!uxgZ?y~e`jA!M%<{zkLivCFJWDX0uqgf@i5L1k~gnLaaH3% z#&q0a5%TVg7b0Wy<|%7F0I@%XyHu)tqL4_0Rpm()MCkiuHHid#w1BWLkqy`-Fr zO?baqqu#1E!OWAL~brhAc|@<^yadR9A$E z3n^FtCz%(8phZOtJ2}Dld#4Ig_*`e;Q2D;4ibGc=Ea&nzGWq!afr235${EkCjZ0b2 zJ4UNv4;zHuAG)%dL}9H`7IDaL^c6$Qf`v#!Yx%uh%@Tk*+X}$TezZ`b7T-ab|EL!w;A)D2GFrESwWH%a!V15y( zdbACp+cioxcaL`6&vHj&?BoNC^wtU~!!!>^>}e)ZIC^;jb;fdTjny5}hJJ^hem8Ik zRdJn;&|M9HuyA5FT~!os$7N|{WgaFr_XbKuAl&<#Q3VTv(FO(wzreOQnug}%r%<%q zcjWMzj^^ToKuElymb5%+j-ZvjvnHfUx{AU%>42L0wv3*@@dils$Ob5SIjay0FT(rqOMCzg0ps-CUseFU0b)lIyawvl4YHw| zM5QCn?0L&3zMAYnQn9n-m;;IXAeN-*$-GqL5{f`OxXE{Py+|QzSBAS$vZw!nhT|fb zIO~qL%g}i6D?jeiwc&N+p{g| zJ#$InG2D6TY$KJewPG%{iXo^DEfuX)XxAq8cZRDhRoz}6QvfCEhfl-- zzSE&3<*rZ#{`BN+-@IyoxgrxB*0;IF-wPThDYJXr0TsB3T5CJi&I8MZ~VlE@Bl~G^>PaSgDg3aHv zfGMlYbNxZwyNMos?N0CyNsIn-1)PlVJ0)56j0tYkmZ_9^y8tpy#Mj2D)bzB`hd6cV`p%CAtV zq+p9p1xXjtxHk$RYS^*mu=fmp>-6gSm-&JGEx|ehLI+H+`rF8rV&Bhx_)SI+7cQTIr&qjLseLW-Ld?rOn;2I8DGudAm*K&Y<^PC5Y{|Ij(Er zl)ux=WUINkTrwTr_G^N(ihw(8dZa#Xg2+5x>=x9;zx(#%{)%X`?}RcTIQnpBRHN7K z?bZjm45*s$lGt>;_Wi`b9(7tb*3{A)K?+YZ`H5)bXWDQ}qgH3JA5qO|Mp6Ig)Z`Y_ zf}H*oUqC_ZF06ur-CP0n$#Wf%$lvcCcPqn7lO1vE4~NsIpqCpVmT99P@Vy_N)t}V{ z9E_%vm^7kA$FY}PN68*XlVMeEzIu(Fo;`)5rl{Mip?>blg;s8Ste%a`iQ=&Bnwm5) zA}nwO{*4KmwI9A)Q0N=}FHn`rJKs+4&Y#>)+1F0l{S!~z(;idcKv&uVGa?eWu#Y{s zEgI~pf#c69b5=^6OtI4L?^AMwcQ`V`D9@W3ubir!BFSA+Tl&=yBfMXTmAFPg$ix# zR{^bD%3Y$yYb5`CUt29O5d5T3htDevqXf6O%D%!w-#YA$W74#Xe}C#{uflCKfr~cB zGzYvBFE2T-U-ce!wj(;CBU5qQywFn!Y#{MMaCAz_vTl&Fot@o@Gmp&S*S)uoPpfBR zlSpu&L6KV@#_@l>0CO&-hdF9IC@toEOoDf`Vryx8H&Z_fls8<+LhQQ9^xsf8e%WOw zHyO{}K0$~3rr=Z<5AZAm67w-3%_boUBjaX6N*#a|Hm5Jyu7whBu*##~@iujP+i|Bs z{(&vdA`QtxAx*>lw%hAjTI>xS2t=}QBjJC~4MP4o_FHnwTg4|HFC&fD_wEBm0{L4W z?*Ag}Er8He?({O8NhLM1S9@=F1JFH^t0sRL!8Ft64##m`kpIsTf

*?r4-A7( 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 OswuzGP^f%u9`;|A(-;2$ literal 0 HcmV?d00001 From 761d6d4c1492b910f279b302d9436d6d62f8c709 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 10:41:43 +0545 Subject: [PATCH 09/60] docs: update Playwright README for headless run --- tests/govtool-frontend/playwright/README.md | 216 ++++++++++++++------ 1 file changed, 156 insertions(+), 60 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 887f1ab94..c4c5cc9de 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -2,7 +2,7 @@ ## βœ… Prerequisites -Make sure the following are installed on your machine: +Ensure the following tools are installed on your machine: - **Git** - **Node.js** & **npm** @@ -25,15 +25,15 @@ cd tests/govtool-frontend/playwright ### 3. Configure Environment Variables -- Copy the `.env.example` file to `.env`: +- Copy the example file: -```bash -cp .env.example .env -``` + ```bash + cp .env.example .env + ``` -- Update the `.env` file with the appropriate values. +- Update the `.env` file with the appropriate values for your environment. -### 4. Install Dependencies +### 4. Install Project Dependencies ```bash npm install @@ -49,100 +49,196 @@ npx playwright install ## πŸ§ͺ Running Tests -## πŸ”‘ Generate Test Wallets +### πŸ”‘ Generate Test Wallets + +Before each test run, generate fresh test wallets to avoid conflicts: ```bash npm run generate-wallets ``` -⚠️ Run this command before each test run to avoid wallet conflicts during testing. +--- ### πŸ” Run All Tests -```bash -npm run test -``` +- **Headless mode** (no UI): + + ```bash + npm run test + ``` + +- **UI mode**: + + ```bash + npm run test:headless + ``` + +--- ### ▢️ Run Specific Test Suites -1. **Delegation Pillars** +Each test suite can be run in **UI** or **Headless** mode: + +--- - ```bash - npm run test:delegation-pillars - ``` +#### 1. **Delegation Pillars** -2. **Voting Pillars** +- UI Mode: - ```bash - npm run test:voting-pillars - ``` + ```bash + npm run test:delegation-pillars + ``` -3. **Outcomes** +- Headless Mode: - ```bash - npm run test:outcomes - ``` + ```bash + npm run test:headless:delegation-pillars + ``` -4. **Proposal Pillars** +--- - ```bash - npm run test:proposal-pillars - ``` +#### 2. **Voting Pillars** -5. **Proposal Discussion** +- UI Mode: - ```bash - npm run test:proposal-discussion - ``` + ```bash + npm run test:voting-pillars + ``` -6. **Proposal Budget** +- Headless Mode: - ```bash - npm run test:proposal-budget - ``` + ```bash + npm run test:headless:voting-pillars + ``` -7. **Wallet Connect** +--- - ```bash - npm run test:wallet-connect - ``` +#### 3. **Outcomes** -8. **Usersnap Integration** +- UI Mode: - ```bash - npm run test:usersnap - ``` + ```bash + npm run test:outcomes + ``` -9. **Miscellaneous Tests** +- Headless Mode: - ```bash - npm run test:misc - ``` + ```bash + npm run test:headless:outcomes + ``` --- -## πŸ“Š Visualize Allure Report +#### 4. **Proposal Pillars** -To generate and view the Allure report: +_Includes both Proposal Discussion and Budget Discussion_ -```bash -npm run allure:serve -``` +- UI Mode: + + ```bash + npm run test:proposal-pillars + ``` + +- Headless Mode: + + ```bash + npm run test:headless:proposal-pillars + ``` --- -## πŸ–₯️ Tip for VS Code Users (Running Individual Tests) +#### 5. **Proposal Discussion** + +- UI Mode: + + ```bash + npm run test:proposal-discussion + ``` + +- Headless Mode: + + ```bash + npm run test:headless:proposal-discussion + ``` + +--- + +#### 6. **Proposal Budget** + +- UI Mode: + + ```bash + npm run test:proposal-budget + ``` -- Use the terminal to run any specific test suite using the commands above. -- Make sure all test files are recognized in the **Test Explorer**. -- Click the **Play** icon to run tests individually. +- Headless Mode: -![Test Runner Screenshot](image.png) + ```bash + npm run test:headless:proposal-budget + ``` + +--- + +#### 7. **Wallet Connect** + +- UI Mode: + + ```bash + npm run test:wallet-connect + ``` + +- Headless Mode: + + ```bash + npm run test:headless:wallet-connect + ``` + +--- + +#### 8. **Usersnap Integration** + +- UI Mode: + + ```bash + npm run test:usersnap + ``` + +- Headless Mode: + + ```bash + npm run test:headless:usersnap + ``` + +--- + +#### 9. **Miscellaneous Tests** + +- UI Mode: + + ```bash + npm run test:misc + ``` + +- Headless Mode: + + ```bash + npm run test:headless:misc + ``` + +--- + +## πŸ“Š Visualize Allure Report + +To generate and view an Allure test report: + +```bash +npm run allure:serve +``` --- ## πŸ“š Additional Resources -For development and contribution guidelines, refer to: +For contribution guidelines and development tips, refer to: -**`DEVELOPERS_GUIDE.md`** +πŸ“„ **`DEVELOPERS_GUIDE.md`** From e3509a1d91ed2525b12a8cd7a76bb38297012de5 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 12:42:21 +0545 Subject: [PATCH 10/60] chore: update Playwright test command of workflow file to run in headless mode --- .github/workflows/test_integration_playwright.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index ea6406cfe..9199873d8 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -103,7 +103,7 @@ jobs: export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_MAINNET }}" fi - npm test + npm test:headless - name: Upload report uses: actions/upload-artifact@v4 From 94efd03110d1638aa937fd27a4f695b25acd84b4 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 13:23:37 +0545 Subject: [PATCH 11/60] docs: update Playwright README to clarify requirements for each test suite --- tests/govtool-frontend/playwright/README.md | 85 +++++++-------------- 1 file changed, 27 insertions(+), 58 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index c4c5cc9de..42e38aac2 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -60,6 +60,7 @@ npm run generate-wallets --- ### πŸ” Run All Tests +- **Requirements**: Faucet API key and Valid proposal faucet private keys - **Headless mode** (no UI): @@ -77,20 +78,17 @@ npm run generate-wallets ### ▢️ Run Specific Test Suites -Each test suite can be run in **UI** or **Headless** mode: +Each test suite can be run in **UI** or **Headless** mode. --- #### 1. **Delegation Pillars** - -- UI Mode: - +- **Requirements**: Faucet API key +- **UI Mode**: ```bash npm run test:delegation-pillars ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:delegation-pillars ``` @@ -98,15 +96,12 @@ Each test suite can be run in **UI** or **Headless** mode: --- #### 2. **Voting Pillars** - -- UI Mode: - +- **Requirements**: Faucet API key +- **UI Mode**: ```bash npm run test:voting-pillars ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:voting-pillars ``` @@ -114,33 +109,25 @@ Each test suite can be run in **UI** or **Headless** mode: --- #### 3. **Outcomes** - -- UI Mode: - +- **UI Mode**: ```bash npm run test:outcomes ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:outcomes ``` --- -#### 4. **Proposal Pillars** - -_Includes both Proposal Discussion and Budget Discussion_ - -- UI Mode: - +#### 4. **Proposal Pillars** +_Includes both Proposal Discussion and Budget Discussion_ +- **Requirements**: Valid proposal faucet private keys +- **UI Mode**: ```bash npm run test:proposal-pillars ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:proposal-pillars ``` @@ -148,15 +135,12 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 5. **Proposal Discussion** - -- UI Mode: - +- **Requirements**: Valid proposal faucet private keys +- **UI Mode**: ```bash npm run test:proposal-discussion ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:proposal-discussion ``` @@ -164,15 +148,12 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 6. **Proposal Budget** - -- UI Mode: - +- **Requirements**: Valid proposal faucet private keys +- **UI Mode**: ```bash npm run test:proposal-budget ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:proposal-budget ``` @@ -180,15 +161,11 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 7. **Wallet Connect** - -- UI Mode: - +- **UI Mode**: ```bash npm run test:wallet-connect ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:wallet-connect ``` @@ -196,15 +173,11 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 8. **Usersnap Integration** - -- UI Mode: - +- **UI Mode**: ```bash npm run test:usersnap ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:usersnap ``` @@ -212,15 +185,11 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 9. **Miscellaneous Tests** - -- UI Mode: - +- **UI Mode**: ```bash npm run test:misc ``` - -- Headless Mode: - +- **Headless Mode**: ```bash npm run test:headless:misc ``` From 51c0d36d29e83532a300186d04f8c71c493b6316 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 13:54:10 +0545 Subject: [PATCH 12/60] docs: update requirements for Delegation and Voting Pillars test suites in README --- tests/govtool-frontend/playwright/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 42e38aac2..8d6298446 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -83,7 +83,7 @@ Each test suite can be run in **UI** or **Headless** mode. --- #### 1. **Delegation Pillars** -- **Requirements**: Faucet API key +- **Requirements**: Faucet API key and Valid proposal faucet private keys - **UI Mode**: ```bash npm run test:delegation-pillars @@ -96,7 +96,7 @@ Each test suite can be run in **UI** or **Headless** mode. --- #### 2. **Voting Pillars** -- **Requirements**: Faucet API key +- **Requirements**: Faucet API key and Valid proposal faucet private keys - **UI Mode**: ```bash npm run test:voting-pillars From 70bd072cd05b19f8a5b879f6c5ec1ff2021a63bc Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 25 Apr 2025 15:42:09 +0545 Subject: [PATCH 13/60] docs: update directory path in Playwright README for clarity --- tests/govtool-frontend/playwright/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 8d6298446..50aa28170 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -20,7 +20,7 @@ git clone https://github.com/IntersectMBO/govtool ### 2. Navigate to the Playwright Test Directory ```bash -cd tests/govtool-frontend/playwright +cd govtool/tests/govtool-frontend/playwright ``` ### 3. Configure Environment Variables From 1d82da4a614f82db184f677b77977af8878ebda3 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Apr 2025 11:59:44 +0545 Subject: [PATCH 14/60] docs: enhance README with environment setup and API key generation instructions --- tests/govtool-frontend/playwright/README.md | 45 ++++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 50aa28170..6ee454484 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -47,6 +47,39 @@ npx playwright install --- + +## 🌐 Environment Setup + +### HOST URL + +| Environment | URL | +| :---------- | :-- | +| Development | [https://p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr/](https://p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr/) | +| QA | [https://govtool.cardanoapi.io/](https://govtool.cardanoapi.io/) | +| Preview | [https://preview.gov.tools/](https://preview.gov.tools/) | +| Pre-Prod | [https://pre-prod.gov.tools/](https://pre-prod.gov.tools/) | +| Mainnet | [https://gov.tools/](https://gov.tools/) | + +--- + +## πŸ”‘ Generate API Keys + +### Blockfrost API Key + +- To generate a Blockfrost API key (Project ID): + 1. Follow the instructions in the [Blockfrost documentation](https://blockfrost.dev/overview/getting-started). + 2. The **Project ID** you create there serves as your **Blockfrost API Key**. + +### Kuber API Key + +- To generate a Kuber API Key: + 1. Visit [Kuberide](https://kuberide.com/). + 2. Log in using your Google or GitHub account. + 3. Navigate to **API Keys**. + 4. Click to **Generate API Key**. + +--- + ## πŸ§ͺ Running Tests ### πŸ”‘ Generate Test Wallets @@ -60,7 +93,7 @@ npm run generate-wallets --- ### πŸ” Run All Tests -- **Requirements**: Faucet API key and Valid proposal faucet private keys +- **Requirements**: Faucet API key , valid proposal faucet private keys , valid Blockfrost and Kuber API keys - **Headless mode** (no UI): @@ -83,7 +116,7 @@ Each test suite can be run in **UI** or **Headless** mode. --- #### 1. **Delegation Pillars** -- **Requirements**: Faucet API key and Valid proposal faucet private keys +- **Requirements**: Faucet API key, valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash npm run test:delegation-pillars @@ -96,7 +129,7 @@ Each test suite can be run in **UI** or **Headless** mode. --- #### 2. **Voting Pillars** -- **Requirements**: Faucet API key and Valid proposal faucet private keys +- **Requirements**: Faucet API key, valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash npm run test:voting-pillars @@ -122,7 +155,7 @@ Each test suite can be run in **UI** or **Headless** mode. #### 4. **Proposal Pillars** _Includes both Proposal Discussion and Budget Discussion_ -- **Requirements**: Valid proposal faucet private keys +- **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash npm run test:proposal-pillars @@ -135,7 +168,7 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 5. **Proposal Discussion** -- **Requirements**: Valid proposal faucet private keys +- **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash npm run test:proposal-discussion @@ -148,7 +181,7 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 6. **Proposal Budget** -- **Requirements**: Valid proposal faucet private keys +- **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash npm run test:proposal-budget From 39ef2dfc1600b44979c2facbf84b7c1d21050bcf Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 29 Apr 2025 09:24:54 +0545 Subject: [PATCH 15/60] fix: remove file extension for outcome test --- tests/govtool-frontend/playwright/README.md | 32 ++++++++++++------- .../govtool-frontend/playwright/package.json | 4 +-- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 6ee454484..efbd710bd 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -47,18 +47,17 @@ npx playwright install --- - ## 🌐 Environment Setup ### HOST URL -| Environment | URL | -| :---------- | :-- | +| Environment | URL | +| :---------- | :------------------------------------------------------------------------------------------------------------------------- | | Development | [https://p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr/](https://p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr/) | -| QA | [https://govtool.cardanoapi.io/](https://govtool.cardanoapi.io/) | -| Preview | [https://preview.gov.tools/](https://preview.gov.tools/) | -| Pre-Prod | [https://pre-prod.gov.tools/](https://pre-prod.gov.tools/) | -| Mainnet | [https://gov.tools/](https://gov.tools/) | +| QA | [https://govtool.cardanoapi.io/](https://govtool.cardanoapi.io/) | +| Preview | [https://preview.gov.tools/](https://preview.gov.tools/) | +| Pre-Prod | [https://pre-prod.gov.tools/](https://pre-prod.gov.tools/) | +| Mainnet | [https://gov.tools/](https://gov.tools/) | --- @@ -93,6 +92,7 @@ npm run generate-wallets --- ### πŸ” Run All Tests + - **Requirements**: Faucet API key , valid proposal faucet private keys , valid Blockfrost and Kuber API keys - **Headless mode** (no UI): @@ -116,7 +116,8 @@ Each test suite can be run in **UI** or **Headless** mode. --- #### 1. **Delegation Pillars** -- **Requirements**: Faucet API key, valid proposal faucet private keys and valid Blockfrost and Kuber API keys + +- **Requirements**: Faucet API key, valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash npm run test:delegation-pillars @@ -129,6 +130,7 @@ Each test suite can be run in **UI** or **Headless** mode. --- #### 2. **Voting Pillars** + - **Requirements**: Faucet API key, valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash @@ -142,6 +144,7 @@ Each test suite can be run in **UI** or **Headless** mode. --- #### 3. **Outcomes** + - **UI Mode**: ```bash npm run test:outcomes @@ -153,9 +156,11 @@ Each test suite can be run in **UI** or **Headless** mode. --- -#### 4. **Proposal Pillars** -_Includes both Proposal Discussion and Budget Discussion_ -- **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys +#### 4. **Proposal Pillars** + +_Includes both Proposal Discussion and Budget Discussion_ + +- **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash npm run test:proposal-pillars @@ -168,6 +173,7 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 5. **Proposal Discussion** + - **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash @@ -181,6 +187,7 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 6. **Proposal Budget** + - **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys - **UI Mode**: ```bash @@ -194,6 +201,7 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 7. **Wallet Connect** + - **UI Mode**: ```bash npm run test:wallet-connect @@ -206,6 +214,7 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 8. **Usersnap Integration** + - **UI Mode**: ```bash npm run test:usersnap @@ -218,6 +227,7 @@ _Includes both Proposal Discussion and Budget Discussion_ --- #### 9. **Miscellaneous Tests** + - **UI Mode**: ```bash npm run test:misc diff --git a/tests/govtool-frontend/playwright/package.json b/tests/govtool-frontend/playwright/package.json index 3a890eb54..4e2a2e702 100644 --- a/tests/govtool-frontend/playwright/package.json +++ b/tests/govtool-frontend/playwright/package.json @@ -26,7 +26,7 @@ "test": "npx playwright test --ui", "test:delegation-pillars": "npx playwright test delegation dRepRegistration editDRep --ui", "test:voting-pillars": "npx playwright test proposalVisibility proposalFunctionality --ui", - "test:outcomes": "npx playwright test outcomes.spec.ts --ui", + "test:outcomes": "npx playwright test outcomes --ui", "test:proposal-pillars": "npx playwright test proposalDiscussion proposalSubmission proposalBudget --ui", "test:proposal-discussion": "npx playwright test proposalDiscussion proposalSubmission --ui", "test:proposal-budget": "npx playwright test proposalBudget --ui", @@ -36,7 +36,7 @@ "test:headless": "npx playwright test", "test:headless:delegation-pillars": "npx playwright test delegation dRepRegistration editDRep", "test:headless:voting-pillars": "npx playwright test proposalVisibility proposalFunctionality", - "test:headless:outcomes": "npx playwright test outcomes.spec.ts", + "test:headless:outcomes": "npx playwright test outcomes", "test:headless:proposal-pillars": "npx playwright test proposalDiscussion proposalSubmission proposalBudget", "test:headless:proposal-discussion": "npx playwright test proposalDiscussion proposalSubmission", "test:headless:proposal-budget": "npx playwright test proposalBudget", From 0d350836362273dd1fee95eea8a28ff3afbfbdf9 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 29 Apr 2025 11:20:27 +0545 Subject: [PATCH 16/60] fix: test execution in workflow --- .github/workflows/test_integration_playwright.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index 9199873d8..993cd150e 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -103,7 +103,7 @@ jobs: export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_MAINNET }}" fi - npm test:headless + npm run test:headless - name: Upload report uses: actions/upload-artifact@v4 From f6c000ab17c7a8e6ffaa006c199edea41f9710c7 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 30 Apr 2025 12:42:24 +0545 Subject: [PATCH 17/60] fix: correc costing typos and add check for 'Other' contracting content --- .../lib/pages/budgetDiscussionDetailsPage.ts | 13 +++++++++++-- .../lib/pages/budgetDiscussionSubmissionPage.ts | 9 +++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionDetailsPage.ts b/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionDetailsPage.ts index cd781b1ec..babcc07bb 100644 --- a/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionDetailsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionDetailsPage.ts @@ -56,7 +56,10 @@ export default class BudgetDiscussionDetailsPage { readonly proposalContractingContent = this.page.getByTestId( "proposal-contracting" ); - readonly costingAmountContent = this.page.getByTestId("consting-amount"); // BUG typo + readonly proposalContractingOtherContent = this.page.getByTestId( + "other-contract-description" + ); + readonly costingAmountContent = this.page.getByTestId("costing-amount"); readonly costingConversionRateContent = this.page.getByTestId( "costing-conversion-rate" ); @@ -64,7 +67,7 @@ export default class BudgetDiscussionDetailsPage { "costing-preferred-currency" ); readonly costingPreferedCurrencyAmountContent = this.page.getByTestId( - "costing-prefereed-currency-amount" + "costing-preferred-currency-amount" ); readonly costBreakdownContent = this.page.getByTestId("cost-breakdown"); readonly includeAsAuditorContent = @@ -192,6 +195,12 @@ export default class BudgetDiscussionDetailsPage { budgetProposal.proposalDetails.contracting ); + if (budgetProposal.proposalDetails.contracting === "Other") { + await expect(this.proposalContractingOtherContent).toHaveText( + budgetProposal.proposalDetails.otherDescription + ); + } + // costing validation await expect(this.costingAmountContent).toHaveText( `β‚³ ${formatWithThousandSeparator(budgetProposal.costing.adaAmount)}` diff --git a/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts b/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts index 66a0a20c7..b37520f54 100644 --- a/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts @@ -228,6 +228,9 @@ export default class BudgetDiscussionSubmissionPage { readonly contractingContent = this.page.getByTestId( "contracting-type-name-content" ); + readonly contractingOtherContent = this.page.getByTestId( + "other-contract-description" + ); // costing readonly adaAmountContent = this.page.getByTestId("ada-amount-content"); @@ -759,6 +762,12 @@ export default class BudgetDiscussionSubmissionPage { proposalInformations.proposalDetails.contracting ); + if (proposalInformations.proposalDetails.contracting === "Other") { + await expect(this.contractingOtherContent).toHaveText( + proposalInformations.proposalDetails.otherDescription + ); + } + // costing await expect(this.adaAmountContent).toHaveText( `β‚³ ${formatWithThousandSeparator(proposalInformations.costing.adaAmount)}` From 51f4e36c4a295db1e560e12a34a67e71169d9588 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 30 Apr 2025 13:49:29 +0545 Subject: [PATCH 18/60] fix: retry metadata download action if event is not triggered --- .../playwright/lib/forms/dRepForm.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts b/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts index e129edab9..aaceb62be 100644 --- a/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts +++ b/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts @@ -1,4 +1,5 @@ import { downloadMetadata } from "@helpers/metadata"; +import { functionWaitedAssert } from "@helpers/waitedLoop"; import { Download, Page, expect } from "@playwright/test"; import metadataBucketService from "@services/metadataBucketService"; import { IDRepInfo } from "@types"; @@ -118,8 +119,14 @@ export default class DRepForm { await this.form.getByRole("checkbox").click(); await this.registerBtn.click(); - this.metadataDownloadBtn.click(); - const dRepMetadata = await this.downloadVoteMetadata(); + let dRepMetadata: { name: string; data: JSON }; + await functionWaitedAssert( + async () => { + this.metadataDownloadBtn.click(); + dRepMetadata = await this.downloadVoteMetadata(); + }, + { name: "download metadata" } + ); const url = await metadataBucketService.uploadMetadata( dRepMetadata.name, dRepMetadata.data @@ -130,7 +137,9 @@ export default class DRepForm { } async downloadVoteMetadata() { - const download: Download = await this.form.waitForEvent("download"); + const download: Download = await this.form.waitForEvent("download", { + timeout: 20_000, + }); return downloadMetadata(download); } From 8f90ef9f0cb514b21919aa63d5d7952bbeac2c5a Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 30 Apr 2025 14:00:53 +0545 Subject: [PATCH 19/60] refactor: metadata anchor validation --- .../3-drep-registration/editDRep.dRep.spec.ts | 97 ++++++++----------- 1 file changed, 43 insertions(+), 54 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts index 59ee9f0eb..a8de4722b 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts @@ -98,61 +98,50 @@ test.describe("Validation of edit dRep Form", () => { } }); - test("3N_1. Should accept valid metadata anchor on edit dRep", async ({ - page, - }) => { - const editDRepPage = new EditDRepPage(page); - await editDRepPage.goto(); - - const dRepName = "Test_DRep"; - await editDRepPage.nameInput.fill(dRepName); - - await editDRepPage.continueBtn.click(); - await page.getByRole("checkbox").click(); - await editDRepPage.registerBtn.click(); - - for (let i = 0; i < 100; i++) { - await editDRepPage.metadataUrlInput.fill(mockValid.url()); - await expect(page.getByTestId("invalid-url-error")).toBeHidden(); - } - }); - - test("3N_2. Should reject invalid dRep metadata anchor on edit dRep", async ({ - page, - }) => { - const editDRepPage = new EditDRepPage(page); - await editDRepPage.goto(); - - const dRepName = "Test_DRep"; - await editDRepPage.nameInput.fill(dRepName); - - await editDRepPage.continueBtn.click(); - await page.getByRole("checkbox").click(); - await editDRepPage.registerBtn.click(); - - for (let i = 0; i < 100; i++) { - const invalidUrl = mockInvalid.url(false); - await editDRepPage.metadataUrlInput.fill(invalidUrl); - if (invalidUrl.length <= 128) { - await expect(page.getByTestId("invalid-url-error")).toBeVisible(); - } else { - await expect( - page.getByTestId("url-must-be-less-than-128-bytes-error") - ).toBeVisible(); + test.describe("Metadata anchor Validation", () => { + let editDRepPage: EditDRepPage; + test.beforeEach(async ({ page }) => { + editDRepPage = new EditDRepPage(page); + await editDRepPage.goto(); + + const dRepName = faker.person.firstName(); + await editDRepPage.nameInput.fill(dRepName); + + await editDRepPage.continueBtn.click(); + await page.getByRole("checkbox").click(); + await editDRepPage.registerBtn.click(); + }); + test("3N_1. Should accept valid metadata anchor on edit dRep", async ({ + page, + }) => { + for (let i = 0; i < 100; i++) { + await editDRepPage.metadataUrlInput.fill(mockValid.url()); + await expect(page.getByTestId("invalid-url-error")).toBeHidden(); } - } - - const sentenceWithoutSpace = faker.lorem - .sentence(128) - .replace(/[\s.]/g, ""); - const metadataAnchorGreaterThan128Bytes = - faker.internet.url({ appendSlash: true }) + sentenceWithoutSpace; - - await editDRepPage.metadataUrlInput.fill(metadataAnchorGreaterThan128Bytes); - - await expect( - page.getByTestId("url-must-be-less-than-128-bytes-error") - ).toBeVisible(); + }); + + test("3N_2. Should reject invalid dRep metadata anchor on edit dRep", async ({ + page, + }) => { + for (let i = 0; i < 100; i++) { + const invalidUrl = mockInvalid.url(false); + const sentenceWithoutSpace = faker.lorem + .sentence({ min: 128, max: 500 }) + .replace(/[\s.]/g, ""); + const metadataAnchorGreaterThan128Bytes = + faker.internet.url({ appendSlash: true }) + sentenceWithoutSpace; + const checkedUrl = + Math.random() > 0.5 ? invalidUrl : metadataAnchorGreaterThan128Bytes; + await editDRepPage.metadataUrlInput.fill(checkedUrl); + if (checkedUrl.length <= 128) { + await expect(page.getByTestId("invalid-url-error")).toBeVisible(); + } else { + await expect( + page.getByTestId("url-must-be-less-than-128-bytes-error") + ).toBeVisible(); + } + } + }); }); }); From 58b05d5731821f71ae69e04dab078460dd472ea5 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 30 Apr 2025 14:11:58 +0545 Subject: [PATCH 20/60] chore: move image file to docs --- .../govtool-frontend/playwright/DEVELOPERS_GUIDE.md | 6 +++--- tests/govtool-frontend/playwright/README.md | 2 +- .../playwright/{ => docs}/image-1.png | Bin .../playwright/{ => docs}/image-2.png | Bin .../playwright/{ => docs}/image.png | Bin 5 files changed, 4 insertions(+), 4 deletions(-) rename tests/govtool-frontend/playwright/{ => docs}/image-1.png (100%) rename tests/govtool-frontend/playwright/{ => docs}/image-2.png (100%) rename tests/govtool-frontend/playwright/{ => docs}/image.png (100%) diff --git a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md index 2bd5e47f0..2dd660aa9 100644 --- a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md +++ b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md @@ -118,7 +118,7 @@ Sure! Here's a refined and clearer version of your note: - Use the terminal to run specific test suites using the commands provided in the **README.md**. - Ensure all test files are recognized in the **Test Explorer**. -![Test Runner Screenshot](image.png) +![Test Runner Screenshot](/docs/image.png) - Use the **Play** ▢️ icon to run individual tests directly from the UI. @@ -128,12 +128,12 @@ Sure! Here's a refined and clearer version of your note: - Add **Playwright Test for VSCode** extension - ![Playwright Test Screenshot](image-1.png) + ![Playwright Test Screenshot](/docs/image-1.png) 1. **Remove** the `CI` environment variable. 2. **Navigate** to the specific directory where your test is located to run it directly. - ![Directory Navigation Screenshot](image-2.png) + ![Directory Navigation Screenshot](/docs/image-2.png) > **Note:** > diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index efbd710bd..8cfc55cf9 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -253,4 +253,4 @@ npm run allure:serve For contribution guidelines and development tips, refer to: -πŸ“„ **`DEVELOPERS_GUIDE.md`** +πŸ“„ **[DEVELOPERS_GUIDE.md](/DEVELOPERS_GUIDE.md)** diff --git a/tests/govtool-frontend/playwright/image-1.png b/tests/govtool-frontend/playwright/docs/image-1.png similarity index 100% rename from tests/govtool-frontend/playwright/image-1.png rename to tests/govtool-frontend/playwright/docs/image-1.png diff --git a/tests/govtool-frontend/playwright/image-2.png b/tests/govtool-frontend/playwright/docs/image-2.png similarity index 100% rename from tests/govtool-frontend/playwright/image-2.png rename to tests/govtool-frontend/playwright/docs/image-2.png diff --git a/tests/govtool-frontend/playwright/image.png b/tests/govtool-frontend/playwright/docs/image.png similarity index 100% rename from tests/govtool-frontend/playwright/image.png rename to tests/govtool-frontend/playwright/docs/image.png From 23f82adafa0fe8585ebb6f6a0c236daa3ed6e288 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 30 Apr 2025 15:17:38 +0545 Subject: [PATCH 21/60] fix: clarify test description for invalid outcome metadata in disconnect state --- .../playwright/tests/9-outcomes/outcomes.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts index 6e67b8727..2245e5ae3 100644 --- a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts +++ b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts @@ -93,7 +93,7 @@ test.describe("Outcome details", () => { test.describe("Invalid Outcome Metadata", () => { InvalidMetadata.forEach(({ type, reason, url, hash }, index) => { - test(`9H_${index + 1}A: Should display "${type}" message in outcomes when ${reason}`, async ({ + test(`9H_${index + 1}A: Should display "${type}" message in outcomes when ${reason} in disconnect state`, async ({ page, }) => { const outcomeResponse = { From 2afbb2ef5b1911d1f2f3f7d23530c10db6db95e0 Mon Sep 17 00:00:00 2001 From: Sudip Bhattarai Date: Sun, 4 May 2025 18:30:11 +0545 Subject: [PATCH 22/60] Add branch restriction to integration test workflow --- .github/workflows/test_integration_playwright.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index ea6406cfe..ef9c75bee 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -32,6 +32,9 @@ on: workflow_run: workflows: ["Build and deploy GovTool test stack"] types: [completed] + branches: + - test + - infra/test-chores concurrency: group: ${{ github.workflow }}-${{ github.ref }} From 758f4e0511111c7172a0720ca7227cbdc506514b Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 29 Apr 2025 20:59:13 +0545 Subject: [PATCH 23/60] feat: add helper function to check walletBalance and skip if walletBalance is insufficient --- .../playwright/lib/helpers/cardano.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts index ae9528a7b..1d6c34a58 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts @@ -6,6 +6,7 @@ import { allure } from "allure-playwright"; import { bech32 } from "bech32"; import { functionWaitedAssert } from "./waitedLoop"; import { createFile, getFile } from "./file"; +import { faucetWallet } from "@constants/staticWallets"; export function lovelaceToAda(lovelace: number) { if (lovelace === 0) return 0; @@ -55,3 +56,35 @@ export async function skipIfMainnet() { test.skip(); } } + +export async function skipIfBalanceIsInsufficient(limit = 10) { + const balance = await getWalletBalance(faucetWallet.address); + if (balance <= limit) { + await allure.description("Not enough balance to perform this action."); + test.skip(); + } +} + +export async function getWalletBalance(address: string) { + let balance: number = 0; + const faucetWalletBalanceDetails = + (await getFile("faucetWalletBalance.json")) || {}; + await functionWaitedAssert( + async () => { + balance = await kuberService.getBalance(address); + if (faucetWalletBalanceDetails["address"] === address) { + balance = faucetWalletBalanceDetails["balance"]; + } else { + faucetWalletBalanceDetails["balance"] = balance; + faucetWalletBalanceDetails["address"] = faucetWallet.address; + await createFile( + "faucetWalletBalance.json", + faucetWalletBalanceDetails + ); + } + }, + { message: "get balance" } + ); + + return balance; +} From 7b83cb77810dc666d6cc409a7ff61eaf2ffbd013 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 29 Apr 2025 20:59:26 +0545 Subject: [PATCH 24/60] feat: add faucetWalletBalance.json to .gitignore --- tests/govtool-frontend/playwright/.gitignore | 1 + tests/govtool-frontend/playwright/playwright.config.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/.gitignore b/tests/govtool-frontend/playwright/.gitignore index f8c7b5f89..34b3e38d4 100644 --- a/tests/govtool-frontend/playwright/.gitignore +++ b/tests/govtool-frontend/playwright/.gitignore @@ -22,4 +22,5 @@ lib/_mock/registeredDRepCopyWallets.json lib/_mock/wallets.json lib/_mock/proposals.json lib/_mock/protocolParameter.json +lib/_mock/faucetWalletBalance.json ./lock_logs.txt diff --git a/tests/govtool-frontend/playwright/playwright.config.ts b/tests/govtool-frontend/playwright/playwright.config.ts index 457c8d0a4..c6b89152e 100644 --- a/tests/govtool-frontend/playwright/playwright.config.ts +++ b/tests/govtool-frontend/playwright/playwright.config.ts @@ -149,7 +149,7 @@ export default defineConfig({ use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.delegation.spec.ts", dependencies: environments.ci - ? ["adaholder auth setup", "dRep setup", "wallet bootstrap"] + ? ["adaholder auth setup","dRep auth setup", "dRep setup", "wallet bootstrap"] : [], teardown: environments.ci && "cleanup delegation", }, From 0d77e23ec0cc87276d3078b844d4ab1a6898ed00 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 29 Apr 2025 21:01:11 +0545 Subject: [PATCH 25/60] chore: check skipIfBalanceInsufficient for all faucet dependent test --- ...n.drep.spec.ts => delegation.dRep.spec.ts} | 3 +- ...delegationFunctionality.delegation.spec.ts | 3 +- .../dRepRegistration.dRep.spec.ts | 3 +- .../3-drep-registration/editDRep.dRep.spec.ts | 3 +- .../proposalVisibility.dRep.spec.ts | 2 ++ .../proposalFunctionality.dRep.spec.ts | 5 ++-- .../playwright/tests/dRep.setup.ts | 3 +- .../playwright/tests/dRep.teardown.ts | 3 +- .../playwright/tests/delegation.teardown.ts | 3 +- .../playwright/tests/faucet.setup.ts | 28 +++++++++---------- .../playwright/tests/wallet.bootstrap.ts | 3 +- 11 files changed, 35 insertions(+), 24 deletions(-) rename tests/govtool-frontend/playwright/tests/2-delegation/{delegation.drep.spec.ts => delegation.dRep.spec.ts} (96%) diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts similarity index 96% rename from tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts rename to tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts index c712f7ec2..fdfed71f1 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts @@ -3,7 +3,7 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { createNewPageWithWallet } from "@helpers/page"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; @@ -14,6 +14,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(4000); }); test("2N. Should show DRep information on details page", async ({ diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts index 0c5c1e2dd..013763dc4 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts @@ -24,7 +24,7 @@ import { correctDRepDirectoryFormat, } from "@helpers/adaFormat"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; @@ -36,6 +36,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(200); }); test.describe("Delegate to others", () => { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts index f97449614..3b1a648bd 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts @@ -5,7 +5,7 @@ import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; @@ -19,6 +19,7 @@ import { dRep01AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(4000); }); test.describe("Logged in DReps", () => { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts index a8de4722b..7573dda05 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts @@ -4,7 +4,7 @@ import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; import { invalid as mockInvalid, valid as mockValid } from "@mock/index"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import EditDRepPage from "@pages/editDRepPage"; import { expect } from "@playwright/test"; import environments from "@constants/environments"; @@ -13,6 +13,7 @@ import { dRep02AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(4000); }); test.use({ wallet: dRep02Wallet, storageState: dRep02AuthFile }); diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts index b9ceb02a8..ea23ecab1 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts @@ -7,6 +7,7 @@ import { setAllureEpic } from "@helpers/allure"; import { isBootStrapingPhase, lovelaceToAda, + skipIfBalanceIsInsufficient, skipIfMainnet, } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; @@ -27,6 +28,7 @@ import { dRep01AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(4000); }); test.describe("Logged in DRep", () => { diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts index 8a21e99f1..e27473109 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts @@ -5,7 +5,7 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { isBootStrapingPhase, skipIfMainnet } from "@helpers/cardano"; +import { isBootStrapingPhase, skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { encodeCIP129Identifier } from "@helpers/encodeDecode"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; @@ -20,6 +20,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("5. Proposal functionality"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(4000); }); test.describe("Proposal checks", () => { @@ -180,7 +181,7 @@ test.describe("Perform voting", () => { await expect( govActionDetailsPage.currentPage.getByTestId("my-vote").getByText("Yes") - ).toBeVisible(); + ).toBeVisible({ timeout: 60_000 }); govActionDetailsPage = await governanceActionsPage.viewFirstVotedProposal(); await govActionDetailsPage.reVote(); diff --git a/tests/govtool-frontend/playwright/tests/dRep.setup.ts b/tests/govtool-frontend/playwright/tests/dRep.setup.ts index 25792139f..edff84332 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.setup.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.setup.ts @@ -1,7 +1,7 @@ import environments from "@constants/environments"; import { dRepWallets } from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { uploadMetadataAndGetJsonHash } from "@helpers/metadata"; import { generateWallets } from "@helpers/shellyWallet"; import { pollTransaction } from "@helpers/transaction"; @@ -72,6 +72,7 @@ setup("Register DRep of static wallets", async () => { }); setup("Setup temporary DRep wallets", async () => { + await skipIfBalanceIsInsufficient(4000); setup.setTimeout(3 * environments.txTimeOut); const dRepWallets: StaticWallet[] = await generateWallets(DREP_WALLETS_COUNT); diff --git a/tests/govtool-frontend/playwright/tests/dRep.teardown.ts b/tests/govtool-frontend/playwright/tests/dRep.teardown.ts index 0e246b846..af3f5c7f3 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.teardown.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.teardown.ts @@ -4,7 +4,7 @@ import { dRepWallets, } from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { pollTransaction } from "@helpers/transaction"; import { expect } from "@playwright/test"; import { test as cleanup } from "@fixtures/walletExtension"; @@ -17,6 +17,7 @@ cleanup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Cleanup"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(100); }); cleanup("DRep de-registration", async () => { diff --git a/tests/govtool-frontend/playwright/tests/delegation.teardown.ts b/tests/govtool-frontend/playwright/tests/delegation.teardown.ts index f1d4b279b..02d264cce 100644 --- a/tests/govtool-frontend/playwright/tests/delegation.teardown.ts +++ b/tests/govtool-frontend/playwright/tests/delegation.teardown.ts @@ -1,7 +1,7 @@ import environments from "@constants/environments"; import { adaHolderWallets } from "@constants/staticWallets"; import { setAllureStory, setAllureEpic } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { pollTransaction } from "@helpers/transaction"; import { test as cleanup } from "@fixtures/walletExtension"; import kuberService from "@services/kuberService"; @@ -11,6 +11,7 @@ cleanup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Cleanup"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(10); }); cleanup(`Abstain delegation`, async () => { const stakePrivKeys = adaHolderWallets.map((wallet) => wallet.stake.private); diff --git a/tests/govtool-frontend/playwright/tests/faucet.setup.ts b/tests/govtool-frontend/playwright/tests/faucet.setup.ts index 129fc35b7..e6f4a4007 100644 --- a/tests/govtool-frontend/playwright/tests/faucet.setup.ts +++ b/tests/govtool-frontend/playwright/tests/faucet.setup.ts @@ -1,12 +1,10 @@ import environments from "@constants/environments"; import { faucetWallet } from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { getWalletBalance, skipIfMainnet } from "@helpers/cardano"; import { pollTransaction } from "@helpers/transaction"; import { test as setup } from "@fixtures/walletExtension"; import { loadAmountFromFaucet } from "@services/faucetService"; -import kuberService from "@services/kuberService"; -import { functionWaitedAssert } from "@helpers/waitedLoop"; setup.describe.configure({ timeout: environments.txTimeOut }); @@ -17,15 +15,17 @@ setup.beforeEach(async () => { }); setup("Faucet setup", async () => { - let balance: number; - functionWaitedAssert( - async () => { - balance = await kuberService.getBalance(faucetWallet.address); - }, - { message: "get balance" } - ); - - if (balance > 100_000) return; - const res = await loadAmountFromFaucet(faucetWallet.address); - await pollTransaction(res.txid); + const balance = await getWalletBalance(faucetWallet.address); + if (balance > 450_000) return; + if (environments.faucet.apiKey === "" || environments.faucet.apiKey === undefined) { + console.log("Faucet API key is not set"); + console.log("please fund 10_000 Ada to the wallet", faucetWallet.address); + } else { + try { + const res = await loadAmountFromFaucet(faucetWallet.address); + await pollTransaction(res.txid); + } catch (e) { + console.log("Error loading amount from faucet", e); + } + } }); diff --git a/tests/govtool-frontend/playwright/tests/wallet.bootstrap.ts b/tests/govtool-frontend/playwright/tests/wallet.bootstrap.ts index 33321c781..43ea92f00 100644 --- a/tests/govtool-frontend/playwright/tests/wallet.bootstrap.ts +++ b/tests/govtool-frontend/playwright/tests/wallet.bootstrap.ts @@ -1,6 +1,6 @@ import { adaHolderWallets, dRepWallets } from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { pollTransaction } from "@helpers/transaction"; import { expect } from "@playwright/test"; import { test as setup } from "@fixtures/walletExtension"; @@ -13,6 +13,7 @@ setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Wallet bootstrap"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(200); }); setup("Initialize static wallets", async () => { From 54d8fb412c3836517409fee79034a6e95e815f13 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 11:12:46 +0545 Subject: [PATCH 26/60] chore: remove generated/proposal faucet wallet and use wallet from config --- .../govtool-frontend/playwright/.env.example | 12 ++--- .../playwright/lib/constants/environments.ts | 18 ++----- .../lib/constants/proposalFaucetWallet.ts | 22 -------- .../playwright/lib/constants/staticWallets.ts | 50 +++++++++---------- .../playwright/lib/fixtures/proposal.ts | 9 +++- .../playwright/lib/helpers/cardano.ts | 17 +++++-- .../playwright/lib/helpers/crypto.ts | 16 ++---- .../playwright/lib/helpers/index.ts | 13 +++++ .../playwright/lib/helpers/shellyWallet.ts | 23 +++++++++ .../lib/pages/proposalSubmissionPage.ts | 8 +-- .../playwright/lib/services/kuberService.ts | 48 +++++++++++------- .../govtool-frontend/playwright/package.json | 2 +- .../proposalSubmission.ga.spec.ts | 17 +++++-- .../playwright/tests/faucet.setup.ts | 31 ------------ .../playwright/tests/proposal.setup.ts | 15 +++--- 15 files changed, 145 insertions(+), 156 deletions(-) delete mode 100644 tests/govtool-frontend/playwright/lib/constants/proposalFaucetWallet.ts delete mode 100644 tests/govtool-frontend/playwright/tests/faucet.setup.ts diff --git a/tests/govtool-frontend/playwright/.env.example b/tests/govtool-frontend/playwright/.env.example index 91aca845d..d233f6b20 100644 --- a/tests/govtool-frontend/playwright/.env.example +++ b/tests/govtool-frontend/playwright/.env.example @@ -2,10 +2,6 @@ HOST_URL=http://localhost:3000 DOCS_URL=https://docs.gov.tools -// Faucet API key to load fund from faucet -# Faucet -FAUCET_API_KEY= - #Blockfrost BLOCKFROST_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXX @@ -18,11 +14,9 @@ TX_TIMEOUT=240000 # milliseconds # Metadata Bucket METADATA_BUCKET_URL=https://metadata-govtool.cardanoapi.io -FAUCET_ADDRESS=addr_test1vqeux7xwusdju9dvsj8h7mca9aup2k439kfmwy773xxc2hcu7zy99 - -PROPOSAL_FAUCET_PAYMENT_PRIVATE=********************************************** -PROPOSAL_FAUCET_STAKE_PRIVATE=********************************************** -PROPOSAL_FAUCET_DREP_PRIVATE=********************************************** +FAUCET_ADDRESS= +FAUCET_PAYMENT_PRIVATE= +FAUCET_STAKE_PKH= CI=true TEST_WORKERS=6 // Number of workers to run in parallel \ No newline at end of file diff --git a/tests/govtool-frontend/playwright/lib/constants/environments.ts b/tests/govtool-frontend/playwright/lib/constants/environments.ts index 2f0fa2a7a..1882424c6 100644 --- a/tests/govtool-frontend/playwright/lib/constants/environments.ts +++ b/tests/govtool-frontend/playwright/lib/constants/environments.ts @@ -16,10 +16,9 @@ const environments = { networkId: NETWORK === "mainnet" ? 1 : 0, faucet: { apiUrl: `https://faucet.${NETWORK}.world.dev.cardano.org`, - apiKey: process.env.FAUCET_API_KEY || "", - address: - process.env.FAUCET_ADDRESS || - "addr_test1vz0ua2vyk7r4vufmpqh5v44awg8xff26hxlwyrt3uc67maqtql3kl", + address: process.env.FAUCET_ADDRESS, + payment: { private: process.env.FAUCET_PAYMENT_PRIVATE }, + stake: { pkh: process.env.FAUCET_STAKE_PKH }, }, kuber: { apiUrl: `https://${NETWORK}.kuber.cardanoapi.io`, @@ -29,17 +28,6 @@ const environments = { metadataBucketUrl: `${CARDANO_API_METADATA_HOST_URL}/data`, lockInterceptorUrl: `${CARDANO_API_METADATA_HOST_URL}/lock`, ci: process.env.CI, - proposalFaucet: { - payment: { - private: process.env.PROPOSAL_FAUCET_PAYMENT_PRIVATE, - }, - stake: { - private: process.env.PROPOSAL_FAUCET_STAKE_PRIVATE, - }, - dRep: { - private: process.env.PROPOSAL_FAUCET_DREP_PRIVATE, - }, - }, }; export default environments; diff --git a/tests/govtool-frontend/playwright/lib/constants/proposalFaucetWallet.ts b/tests/govtool-frontend/playwright/lib/constants/proposalFaucetWallet.ts deleted file mode 100644 index 44055abf5..000000000 --- a/tests/govtool-frontend/playwright/lib/constants/proposalFaucetWallet.ts +++ /dev/null @@ -1,22 +0,0 @@ -import environments from "@constants/environments"; - -export const proposalFaucetWallet = { - payment: { - private: environments.proposalFaucet.payment.private, - public: "13904f75a8080b61cdfee163c3c22a05b3fa8f4aaa42df084a02f425548f0122", - pkh: "a37077973e85242b117341ccf59d2fb78affe3a05944b089c22583d6", - }, - stake: { - private: environments.proposalFaucet.stake.private, - public: "c2277f37f2fece309bad0d6ec1506e48b2a91f0ff4e7dcaad176891d6364aee3", - pkh: "4e641f833be7026d9948ff6ab61791123166a1c84f58fd472a6b33a5", - }, - dRep: { - private: environments.proposalFaucet.dRep.private, - public: "e24809b52036894376295a724d32d225d98b29da515d87dc0bb1a769e28c0b59", - pkh: "ff3a5ff960ffae3726c80996ebbf0b3ec3992a62ea7c7818908a8cfe", - }, - dRepId: "drep1lua9l7tql7hrwfkgpxtwh0ct8mpej2nzaf78sxys32x0udvl8a5", - address: - "addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd", -}; diff --git a/tests/govtool-frontend/playwright/lib/constants/staticWallets.ts b/tests/govtool-frontend/playwright/lib/constants/staticWallets.ts index 7884a5be8..529551a51 100644 --- a/tests/govtool-frontend/playwright/lib/constants/staticWallets.ts +++ b/tests/govtool-frontend/playwright/lib/constants/staticWallets.ts @@ -1,37 +1,35 @@ const staticWallets: StaticWallet[] = require("../_mock/wallets.json"); import { StaticWallet } from "@types"; -import { proposalFaucetWallet } from "./proposalFaucetWallet"; -export const faucetWallet = staticWallets[0]; -export const dRep01Wallet = staticWallets[1]; -export const dRep02Wallet = staticWallets[2]; -export const dRep03Wallet = staticWallets[3]; +export const dRep01Wallet = staticWallets[0]; +export const dRep02Wallet = staticWallets[1]; +export const dRep03Wallet = staticWallets[2]; -export const adaHolder01Wallet = staticWallets[4]; -export const adaHolder02Wallet = staticWallets[5]; -export const adaHolder03Wallet = staticWallets[6]; -export const adaHolder04Wallet = staticWallets[7]; -export const adaHolder05Wallet = staticWallets[8]; -export const adaHolder06Wallet = staticWallets[9]; +export const adaHolder01Wallet = staticWallets[3]; +export const adaHolder02Wallet = staticWallets[4]; +export const adaHolder03Wallet = staticWallets[5]; +export const adaHolder04Wallet = staticWallets[6]; +export const adaHolder05Wallet = staticWallets[7]; +export const adaHolder06Wallet = staticWallets[8]; // Does not takes part in transaction -export const user01Wallet: StaticWallet = staticWallets[10]; +export const user01Wallet: StaticWallet = staticWallets[9]; // Username is already set -export const proposal01Wallet: StaticWallet = staticWallets[11]; -export const proposal02Wallet: StaticWallet = staticWallets[12]; -export const proposal03Wallet: StaticWallet = staticWallets[13]; -export const proposal04Wallet: StaticWallet = staticWallets[14]; -export const proposal05Wallet: StaticWallet = staticWallets[15]; -export const proposal06Wallet: StaticWallet = staticWallets[16]; -export const proposal07Wallet: StaticWallet = staticWallets[17]; -export const proposal08Wallet: StaticWallet = staticWallets[18]; -export const proposal09Wallet: StaticWallet = staticWallets[19]; +export const proposal01Wallet: StaticWallet = staticWallets[10]; +export const proposal02Wallet: StaticWallet = staticWallets[11]; +export const proposal03Wallet: StaticWallet = staticWallets[12]; +export const proposal04Wallet: StaticWallet = staticWallets[13]; +export const proposal05Wallet: StaticWallet = staticWallets[14]; +export const proposal06Wallet: StaticWallet = staticWallets[15]; +export const proposal07Wallet: StaticWallet = staticWallets[16]; +export const proposal08Wallet: StaticWallet = staticWallets[17]; +export const proposal09Wallet: StaticWallet = staticWallets[18]; -export const budgetProposal01Wallet: StaticWallet = staticWallets[20]; -export const budgetProposal02Wallet: StaticWallet = staticWallets[21]; -export const budgetProposal03Wallet: StaticWallet = staticWallets[22]; -export const budgetProposal04Wallet: StaticWallet = staticWallets[23]; +export const budgetProposal01Wallet: StaticWallet = staticWallets[19]; +export const budgetProposal02Wallet: StaticWallet = staticWallets[20]; +export const budgetProposal03Wallet: StaticWallet = staticWallets[21]; +export const budgetProposal04Wallet: StaticWallet = staticWallets[22]; export const adaHolderWallets = [ adaHolder01Wallet, @@ -64,7 +62,5 @@ export const allStaticWallets = [ ...adaHolderWallets, user01Wallet, ...proposalWallets, - faucetWallet, - proposalFaucetWallet, ...budgetProposalDRepWallets, ]; diff --git a/tests/govtool-frontend/playwright/lib/fixtures/proposal.ts b/tests/govtool-frontend/playwright/lib/fixtures/proposal.ts index 5ae1e4b0d..d65b0cb94 100644 --- a/tests/govtool-frontend/playwright/lib/fixtures/proposal.ts +++ b/tests/govtool-frontend/playwright/lib/fixtures/proposal.ts @@ -1,7 +1,9 @@ import { proposal01AuthFile } from "@constants/auth"; +import environments from "@constants/environments"; import { proposal01Wallet } from "@constants/staticWallets"; import { test as base } from "@fixtures/walletExtension"; import { createNewPageWithWallet } from "@helpers/page"; +import { rewardAddressBech32 } from "@helpers/shellyWallet"; import ProposalDiscussionDetailsPage from "@pages/proposalDiscussionDetailsPage"; import ProposalSubmissionPage from "@pages/proposalSubmissionPage"; @@ -23,8 +25,13 @@ export const test = base.extend({ const proposalCreationPage = new ProposalSubmissionPage(proposalPage); await proposalCreationPage.goto(); + const receiverAddress = rewardAddressBech32( + environments.networkId, + proposal01Wallet.stake.pkh + ); + const proposalId = - await proposalCreationPage.createProposal(proposal01Wallet); + await proposalCreationPage.createProposal(receiverAddress); const proposalDetailsPage = new ProposalDiscussionDetailsPage(proposalPage); diff --git a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts index 1d6c34a58..b8ebf2bd0 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts @@ -1,12 +1,11 @@ import environments from "@constants/environments"; import test from "@playwright/test"; import kuberService from "@services/kuberService"; -import { ProposalType, ProtocolParams } from "@types"; +import { ProposalType } from "@types"; import { allure } from "allure-playwright"; import { bech32 } from "bech32"; import { functionWaitedAssert } from "./waitedLoop"; import { createFile, getFile } from "./file"; -import { faucetWallet } from "@constants/staticWallets"; export function lovelaceToAda(lovelace: number) { if (lovelace === 0) return 0; @@ -57,8 +56,18 @@ export async function skipIfMainnet() { } } +export async function skipIfTemporyWalletIsNotAvailable(fileName: string) { + const wallets = (await getFile(fileName)) || []; + if (wallets.length === 0) { + await allure.description( + `Temporary wallet file "${fileName}" is not available or contains insufficient wallet. Please fund the faucet wallet and run the test again.` + ); + test.skip(); + } +} + export async function skipIfBalanceIsInsufficient(limit = 10) { - const balance = await getWalletBalance(faucetWallet.address); + const balance = await getWalletBalance(environments.faucet.address); if (balance <= limit) { await allure.description("Not enough balance to perform this action."); test.skip(); @@ -76,7 +85,7 @@ export async function getWalletBalance(address: string) { balance = faucetWalletBalanceDetails["balance"]; } else { faucetWalletBalanceDetails["balance"] = balance; - faucetWalletBalanceDetails["address"] = faucetWallet.address; + faucetWalletBalanceDetails["address"] = environments.faucet.address; await createFile( "faucetWalletBalance.json", faucetWalletBalanceDetails diff --git a/tests/govtool-frontend/playwright/lib/helpers/crypto.ts b/tests/govtool-frontend/playwright/lib/helpers/crypto.ts index 1ee98017f..c221c747e 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/crypto.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/crypto.ts @@ -2,6 +2,7 @@ import environments from "../constants/environments"; import { ed25519 as ed } from "@noble/curves/ed25519"; import { bech32 } from "bech32"; import * as blake from "blakejs"; +import { rewardAddressBech32, rewardAddressRawBytes } from "./shellyWallet"; const KEY_HASH_LENGTH = 28; const ADDR_LENGTH = KEY_HASH_LENGTH * 2 + 1; @@ -117,22 +118,13 @@ export class ShelleyWallet { concatenatedArray1.set(this.stakeKey.pkh, KEY_HASH_LENGTH + 1); return concatenatedArray1; } + rewardAddressRawBytes(network: number) { - const rewardAccountPrefix = 0xe0; - const header = network | rewardAccountPrefix; - const result = new Uint8Array(KEY_HASH_LENGTH + 1); - result[0] = header; - result.set(this.stakeKey.pkh, 1); - return result; + return rewardAddressRawBytes(network, this.stakeKey.json().pkh); } rewardAddressBech32(networkId: number): string { - const prefix = networkId == 0 ? "stake" : "stake_test"; - return bech32.encode( - prefix, - bech32.toWords(Buffer.from(this.rewardAddressRawBytes(networkId))), - 200 - ); + return rewardAddressBech32(networkId, this.stakeKey.json().pkh); } dRepIdBech32() { diff --git a/tests/govtool-frontend/playwright/lib/helpers/index.ts b/tests/govtool-frontend/playwright/lib/helpers/index.ts index 1d78b1277..3b5b658eb 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/index.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/index.ts @@ -1,3 +1,4 @@ +import environments from "@constants/environments"; export const parseVotingPowerAndPercentage = ( combinedString: string ): { votingPower: string; percentage: string } => { @@ -14,3 +15,15 @@ export const parseVotingPowerAndPercentage = ( percentage, }; }; + +export const getWalletConfigForFaucet = () => { + return { + payment: { + private: environments.faucet.payment.private || "", + }, + stake: { + pkh: environments.faucet.stake.pkh || "", + }, + address: environments.faucet.address || "", + }; +}; diff --git a/tests/govtool-frontend/playwright/lib/helpers/shellyWallet.ts b/tests/govtool-frontend/playwright/lib/helpers/shellyWallet.ts index 4bf66bd48..aa8001906 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/shellyWallet.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/shellyWallet.ts @@ -2,6 +2,7 @@ import { bech32 } from "bech32"; import { blake2bHex } from "blakejs"; import convertBufferToHex from "./convertBufferToHex"; import { ShelleyWallet } from "./crypto"; +const KEY_HASH_LENGTH = 28; export default function extractDRepFromWallet(wallet: ShelleyWallet) { const dRepPubKey = convertBufferToHex(wallet.dRepKey.public); @@ -13,6 +14,28 @@ export default function extractDRepFromWallet(wallet: ShelleyWallet) { return dRepIdBech32; } +export function rewardAddressRawBytes(network: number, stakePkh: string) { + const stakePkhBytes = Uint8Array.from(Buffer.from(stakePkh, "hex")); + const rewardAccountPrefix = 0xe0; + const header = network | rewardAccountPrefix; + const result = new Uint8Array(KEY_HASH_LENGTH + 1); + result[0] = header; + result.set(stakePkhBytes, 1); + return result; +} + +export function rewardAddressBech32( + networkId: number, + stakePkh: string +): string { + const prefix = networkId == 0 ? "stake" : "stake_test"; + return bech32.encode( + prefix, + bech32.toWords(Buffer.from(rewardAddressRawBytes(networkId, stakePkh))), + 200 + ); +} + export async function generateWallets(num: number) { return await Promise.all( Array.from({ length: num }, () => diff --git a/tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts b/tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts index 9b991580a..0c3d7cc09 100644 --- a/tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts @@ -544,22 +544,18 @@ export default class ProposalSubmissionPage { } async createProposal( - wallet: StaticWallet, + receivingAddress: string, proposalType: ProposalType = Object.values(ProposalType)[ Math.floor(Math.random() * Object.values(ProposalType).length) ] ): Promise { await this.addLinkBtn.click(); - const receivingAddr = ShelleyWallet.fromJson(wallet).rewardAddressBech32( - environments.networkId - ); - const proposalRequest: ProposalCreateRequest = await this.generateValidProposalFormFields({ proposalType: (await isBootStrapingPhase()) ? ProposalType.info : proposalType, - receivingAddress: receivingAddr, + receivingAddress, }); await this.fillupForm(proposalRequest); await this.continueBtn.click(); diff --git a/tests/govtool-frontend/playwright/lib/services/kuberService.ts b/tests/govtool-frontend/playwright/lib/services/kuberService.ts index 9047faecb..206a348de 100644 --- a/tests/govtool-frontend/playwright/lib/services/kuberService.ts +++ b/tests/govtool-frontend/playwright/lib/services/kuberService.ts @@ -1,4 +1,3 @@ -import { faucetWallet } from "@constants/staticWallets"; import { KuberValue, ProtocolParams, @@ -12,7 +11,7 @@ import fetch, { BodyInit, RequestInit } from "node-fetch"; import { cborxEncoder } from "@helpers/encodeDecode"; import { Logger } from "@helpers/logger"; import { blockfrostSubmitTransaction } from "@services/blockfrostService"; -import { proposalFaucetWallet } from "@constants/proposalFaucetWallet"; +import { getWalletConfigForFaucet } from "@helpers/index"; type CertificateType = "registerstake" | "registerdrep" | "deregisterdrep"; @@ -139,8 +138,8 @@ const kuberService = { // register stake and outputs 20A initializeWallets: ( wallets: StaticWallet[], - faucetAddress: string = faucetWallet.address, - faucetStakeKey: string = faucetWallet.payment.private + faucetAddress: string = getWalletConfigForFaucet().address, + faucetStakeKey: string = getWalletConfigForFaucet().payment.private ) => { const kuber = new Kuber(faucetAddress, faucetStakeKey); const outputs = []; @@ -168,8 +167,8 @@ const kuberService = { }, mergeUtXos: (wallets: StaticWallet[]) => { const kuber = new Kuber( - proposalFaucetWallet.address, - proposalFaucetWallet.payment.private + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private ); const selections = wallets.map((wallet) => ({ type: "PaymentSigningKeyShelley_ed25519", @@ -181,12 +180,15 @@ const kuberService = { return kuber.signAndSubmitTx({ inputs, selections, - changeAddress: proposalFaucetWallet.address, + changeAddress: getWalletConfigForFaucet().address, }); }, transferADA: (receiverAddressList: string[], ADA = 20) => { - const kuber = new Kuber(faucetWallet.address, faucetWallet.payment.private); + const kuber = new Kuber( + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private + ); const req = { outputs: receiverAddressList.map((addr) => { return { @@ -200,8 +202,8 @@ const kuberService = { multipleTransferADA: ( outputs: { address: string; value: string | number }[], - addr = faucetWallet.address, - signingKey = faucetWallet.payment.private + addr = getWalletConfigForFaucet().address, + signingKey = getWalletConfigForFaucet().payment.private ) => { const kuber = new Kuber(addr, signingKey); const req = { @@ -212,8 +214,8 @@ const kuberService = { multipleDRepRegistration: (metadataAndWallets: WalletAndAnchorType[]) => { const kuber = new Kuber( - proposalFaucetWallet.address, - proposalFaucetWallet.payment.private + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private ); const req = { certificates: metadataAndWallets.map((metadataAndWallet) => @@ -239,7 +241,10 @@ const kuberService = { pkh: string, metadata: WalletAndAnchorType ) => { - const kuber = new Kuber(faucetWallet.address, faucetWallet.payment.private); + const kuber = new Kuber( + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private + ); const req = { certificates: [Kuber.generateCert("registerdrep", pkh, metadata)], @@ -276,7 +281,10 @@ const kuberService = { }, multipleDRepDeRegistration: (wallets: StaticWallet[]) => { - const kuber = new Kuber(faucetWallet.address, faucetWallet.payment.private); + const kuber = new Kuber( + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private + ); const req = { certificates: wallets.map((wallet) => Kuber.generateCert("deregisterdrep", wallet.stake.pkh) @@ -288,7 +296,7 @@ const kuberService = { cborHex: `5820${wallet.stake.private}`, }; }), - inputs: faucetWallet.address, + inputs: getWalletConfigForFaucet().address, }; return kuber.signAndSubmitTx(req); }, @@ -352,7 +360,10 @@ const kuberService = { }, createGovAction(proposalsCount = 2) { - const kuber = new Kuber(faucetWallet.address, faucetWallet.payment.private); + const kuber = new Kuber( + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private + ); const infoProposal = { deposit: 1000000000, refundAccount: { @@ -429,7 +440,10 @@ const kuberService = { stakePrivKeys: string[], stakePkhs: string[] ): Promise { - const kuber = new Kuber(faucetWallet.address, faucetWallet.payment.private); + const kuber = new Kuber( + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private + ); const selections = stakePrivKeys.map((key) => { return { type: "PaymentSigningKeyShelley_ed25519", diff --git a/tests/govtool-frontend/playwright/package.json b/tests/govtool-frontend/playwright/package.json index 4e2a2e702..80d9a6f40 100644 --- a/tests/govtool-frontend/playwright/package.json +++ b/tests/govtool-frontend/playwright/package.json @@ -44,7 +44,7 @@ "test:headless:usersnap": "npx playwright test userSnap.spec.ts", "test:headless:misc": "npx playwright test miscellaneous", "format": "prettier . --write", - "generate-wallets": "ts-node ./generate_wallets.ts 24" + "generate-wallets": "ts-node ./generate_wallets.ts 23" }, "dependencies": { "@cardanoapi/cardano-test-wallet": "^3.3.1", diff --git a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts index a9ab165f7..8e181bf1f 100644 --- a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts +++ b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts @@ -7,15 +7,20 @@ import { waitForTxConfirmation } from "@helpers/transaction"; import ProposalDiscussionPage from "@pages/proposalDiscussionPage"; import ProposalSubmissionPage from "@pages/proposalSubmissionPage"; import { expect } from "@playwright/test"; -import { skipIfMainnet } from "@helpers/cardano"; +import { + skipIfMainnet, + skipIfTemporyWalletIsNotAvailable, +} from "@helpers/cardano"; import { ProposalType } from "@types"; -import { proposalFaucetWallet } from "@constants/proposalFaucetWallet"; import walletManager from "lib/walletManager"; import { valid } from "@mock/index"; +import { rewardAddressBech32 } from "@helpers/shellyWallet"; +import { getWalletConfigForFaucet } from "@helpers/index"; test.beforeEach(async () => { await setAllureEpic("7. Proposal submission"); await skipIfMainnet(); + await skipIfTemporyWalletIsNotAvailable("proposalSubmissionWallets.json"); }); Object.values(ProposalType).forEach((proposalType, index) => { @@ -43,11 +48,13 @@ Object.values(ProposalType).forEach((proposalType, index) => { await proposalSubmissionPage.proposalCreateBtn.click(); await proposalDiscussionPage.continueBtn.click(); - await proposalSubmissionPage.createProposal( - proposalFaucetWallet, - proposalType + const rewardAddress = rewardAddressBech32( + environments.networkId, + getWalletConfigForFaucet().stake.pkh ); + await proposalSubmissionPage.createProposal(rewardAddress, proposalType); + await userPage.getByTestId("submit-as-GA-button").click(); await userPage.getByTestId("agree-checkbox").click(); diff --git a/tests/govtool-frontend/playwright/tests/faucet.setup.ts b/tests/govtool-frontend/playwright/tests/faucet.setup.ts deleted file mode 100644 index e6f4a4007..000000000 --- a/tests/govtool-frontend/playwright/tests/faucet.setup.ts +++ /dev/null @@ -1,31 +0,0 @@ -import environments from "@constants/environments"; -import { faucetWallet } from "@constants/staticWallets"; -import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { getWalletBalance, skipIfMainnet } from "@helpers/cardano"; -import { pollTransaction } from "@helpers/transaction"; -import { test as setup } from "@fixtures/walletExtension"; -import { loadAmountFromFaucet } from "@services/faucetService"; - -setup.describe.configure({ timeout: environments.txTimeOut }); - -setup.beforeEach(async () => { - await setAllureEpic("Setup"); - await setAllureStory("Faucet"); - await skipIfMainnet(); -}); - -setup("Faucet setup", async () => { - const balance = await getWalletBalance(faucetWallet.address); - if (balance > 450_000) return; - if (environments.faucet.apiKey === "" || environments.faucet.apiKey === undefined) { - console.log("Faucet API key is not set"); - console.log("please fund 10_000 Ada to the wallet", faucetWallet.address); - } else { - try { - const res = await loadAmountFromFaucet(faucetWallet.address); - await pollTransaction(res.txid); - } catch (e) { - console.log("Error loading amount from faucet", e); - } - } -}); diff --git a/tests/govtool-frontend/playwright/tests/proposal.setup.ts b/tests/govtool-frontend/playwright/tests/proposal.setup.ts index 9f905b426..e97f8f2c6 100644 --- a/tests/govtool-frontend/playwright/tests/proposal.setup.ts +++ b/tests/govtool-frontend/playwright/tests/proposal.setup.ts @@ -1,13 +1,13 @@ import environments from "@constants/environments"; -import { proposalFaucetWallet } from "@constants/proposalFaucetWallet"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { generateWallets } from "@helpers/shellyWallet"; import { pollTransaction } from "@helpers/transaction"; import { test as setup } from "@fixtures/walletExtension"; import kuberService from "@services/kuberService"; import walletManager from "lib/walletManager"; import { functionWaitedAssert } from "@helpers/waitedLoop"; +import { getWalletConfigForFaucet } from "@helpers/index"; const PROPOSAL_WALLETS_COUNT = 4; @@ -27,6 +27,9 @@ setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Proposal"); await skipIfMainnet(); + const totalRequiredBalanceForWallets = + govActionDeposit * PROPOSAL_WALLETS_COUNT + 22 * PROPOSAL_WALLETS_COUNT; + await skipIfBalanceIsInsufficient(totalRequiredBalanceForWallets); }); setup("Setup temporary proposal wallets", async () => { @@ -37,8 +40,8 @@ setup("Setup temporary proposal wallets", async () => { // initialize wallets const initializeRes = await kuberService.initializeWallets( [...proposalWallets], - proposalFaucetWallet.address, - proposalFaucetWallet.payment.private + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private ); await pollTransaction(initializeRes.txId, initializeRes.lockInfo); @@ -47,8 +50,8 @@ setup("Setup temporary proposal wallets", async () => { }); const transferRes = await kuberService.multipleTransferADA( amountOutputs, - proposalFaucetWallet.address, - proposalFaucetWallet.payment.private + getWalletConfigForFaucet().address, + getWalletConfigForFaucet().payment.private ); // save to file await walletManager.writeWallets(proposalWallets, "proposalSubmission"); From 844f59aa19e7f9c37dd56437eea80d900238005c Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 11:14:38 +0545 Subject: [PATCH 27/60] chore: balance checks in setup and teardown before setup/teardown --- tests/govtool-frontend/playwright/tests/dRep.setup.ts | 7 ++++++- tests/govtool-frontend/playwright/tests/dRep.teardown.ts | 2 +- .../govtool-frontend/playwright/tests/faucet.teardown.ts | 3 ++- .../playwright/tests/proposal-budget.dRep.setup.ts | 3 ++- .../govtool-frontend/playwright/tests/wallet.bootstrap.ts | 8 ++++---- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/dRep.setup.ts b/tests/govtool-frontend/playwright/tests/dRep.setup.ts index edff84332..2fae68afc 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.setup.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.setup.ts @@ -35,6 +35,8 @@ setup.beforeEach(async () => { }); setup("Register DRep of static wallets", async () => { + const totalRequiredBalanceForDRepSetup = dRepWallets.length * dRepDeposit + 2; + await skipIfBalanceIsInsufficient(totalRequiredBalanceForDRepSetup); setup.setTimeout(environments.txTimeOut); try { @@ -72,7 +74,10 @@ setup("Register DRep of static wallets", async () => { }); setup("Setup temporary DRep wallets", async () => { - await skipIfBalanceIsInsufficient(4000); + const totalRequiredBalanceForDRepSetup = + (DREP_WALLETS_COUNT + REGISTER_DREP_WALLETS_COUNT) * dRepDeposit + + 22 * DREP_WALLETS_COUNT; + await skipIfBalanceIsInsufficient(totalRequiredBalanceForDRepSetup); setup.setTimeout(3 * environments.txTimeOut); const dRepWallets: StaticWallet[] = await generateWallets(DREP_WALLETS_COUNT); diff --git a/tests/govtool-frontend/playwright/tests/dRep.teardown.ts b/tests/govtool-frontend/playwright/tests/dRep.teardown.ts index af3f5c7f3..403da558c 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.teardown.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.teardown.ts @@ -17,7 +17,7 @@ cleanup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Cleanup"); await skipIfMainnet(); - await skipIfBalanceIsInsufficient(100); + await skipIfBalanceIsInsufficient(10); }); cleanup("DRep de-registration", async () => { diff --git a/tests/govtool-frontend/playwright/tests/faucet.teardown.ts b/tests/govtool-frontend/playwright/tests/faucet.teardown.ts index 2a85236ed..40f61dd69 100644 --- a/tests/govtool-frontend/playwright/tests/faucet.teardown.ts +++ b/tests/govtool-frontend/playwright/tests/faucet.teardown.ts @@ -1,7 +1,7 @@ import environments from "@constants/environments"; import { allStaticWallets } from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { pollTransaction } from "@helpers/transaction"; import { expect } from "@playwright/test"; import { test as cleanup } from "@fixtures/walletExtension"; @@ -14,6 +14,7 @@ cleanup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Cleanup"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(10); }); cleanup("Refund faucet", async () => { diff --git a/tests/govtool-frontend/playwright/tests/proposal-budget.dRep.setup.ts b/tests/govtool-frontend/playwright/tests/proposal-budget.dRep.setup.ts index 48137cc4c..0a91e509a 100644 --- a/tests/govtool-frontend/playwright/tests/proposal-budget.dRep.setup.ts +++ b/tests/govtool-frontend/playwright/tests/proposal-budget.dRep.setup.ts @@ -4,7 +4,7 @@ import { dRepWallets, } from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet } from "@helpers/cardano"; +import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; import { uploadMetadataAndGetJsonHash } from "@helpers/metadata"; import { pollTransaction } from "@helpers/transaction"; import { expect } from "@playwright/test"; @@ -16,6 +16,7 @@ setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Register DRep"); await skipIfMainnet(); + await skipIfBalanceIsInsufficient(502 * budgetProposalDRepWallets.length); }); setup("Register DRep of proposal budget static wallets", async () => { diff --git a/tests/govtool-frontend/playwright/tests/wallet.bootstrap.ts b/tests/govtool-frontend/playwright/tests/wallet.bootstrap.ts index 43ea92f00..8557765d6 100644 --- a/tests/govtool-frontend/playwright/tests/wallet.bootstrap.ts +++ b/tests/govtool-frontend/playwright/tests/wallet.bootstrap.ts @@ -7,19 +7,19 @@ import { test as setup } from "@fixtures/walletExtension"; import kuberService from "@services/kuberService"; import environments from "lib/constants/environments"; -setup.describe.configure({ mode: "serial", timeout: environments.txTimeOut }); +const totalWalletsToInitialize = [...adaHolderWallets, ...dRepWallets]; setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Wallet bootstrap"); await skipIfMainnet(); - await skipIfBalanceIsInsufficient(200); + await skipIfBalanceIsInsufficient(22 * totalWalletsToInitialize.length); }); setup("Initialize static wallets", async () => { + setup.setTimeout(environments.txTimeOut); try { - const wallets = [...adaHolderWallets, ...dRepWallets]; - const res = await kuberService.initializeWallets(wallets); + const res = await kuberService.initializeWallets(totalWalletsToInitialize); await pollTransaction(res.txId); } catch (err) { if (err.status === 400 && err.message.includes("StakeKeyRegisteredDELEG")) { From a9ae9b5813f10ec4c17eb1552fb1ac0b4c491933 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 11:15:57 +0545 Subject: [PATCH 28/60] chore: skip temporary wallet dependent tests if it is not available --- .../playwright/playwright.config.ts | 44 +++++++++---------- .../2-delegation/delegation.dRep.spec.ts | 7 ++- ...delegationFunctionality.delegation.spec.ts | 8 +++- .../dRepRegistration.dRep.spec.ts | 8 +++- .../3-drep-registration/editDRep.dRep.spec.ts | 7 ++- .../proposalVisibility.dRep.spec.ts | 3 +- .../proposalFunctionality.dRep.spec.ts | 12 +++-- 7 files changed, 53 insertions(+), 36 deletions(-) diff --git a/tests/govtool-frontend/playwright/playwright.config.ts b/tests/govtool-frontend/playwright/playwright.config.ts index c6b89152e..064d01e9c 100644 --- a/tests/govtool-frontend/playwright/playwright.config.ts +++ b/tests/govtool-frontend/playwright/playwright.config.ts @@ -44,27 +44,18 @@ export default defineConfig({ /* Configure projects for major browsers */ projects: [ { - name: "adaholder auth setup", - testMatch: "**/adaholder.auth.setup.ts", + name: "wallet bootstrap", + testMatch: "**/wallet.bootstrap.ts", + teardown: environments.ci && "cleanup faucet", }, { name: "user auth setup", testMatch: "**/user.auth.setup.ts", }, { - name: "faucet setup", - testMatch: "**/faucet.setup.ts", - teardown: environments.ci && "cleanup faucet", - }, - { - name: "dRep setup", - testMatch: "**/dRep.setup.ts", - dependencies: environments.ci ? ["faucet setup", "wallet bootstrap"] : [], - }, - { - name: "proposal budget dRep setup", - testMatch: "**/proposal-budget.dRep.setup.ts", - teardown: environments.ci && "cleanup faucet", + name: "adaholder auth setup", + testMatch: "**/adaholder.auth.setup.ts", + dependencies: environments.ci ? ["wallet bootstrap"] : [], }, { name: "dRep auth setup", @@ -78,22 +69,29 @@ export default defineConfig({ { name: "proposal budget auth setup", testMatch: "**/proposal-budget.auth.setup.ts", + teardown: environments.ci && "cleanup faucet", + }, + { + name: "dRep setup", + testMatch: "**/dRep.setup.ts", + dependencies: environments.ci ? ["wallet bootstrap"] : [], + teardown: environments.ci && "cleanup dRep", + }, + { + name: "proposal budget dRep setup", + testMatch: "**/proposal-budget.dRep.setup.ts", + teardown: environments.ci && "cleanup dRep", }, { name: "proposal setup", testMatch: "**/proposal.setup.ts", teardown: environments.ci && "cleanup faucet", }, - { - name: "wallet bootstrap", - testMatch: "**/wallet.bootstrap.ts", - dependencies: environments.ci ? ["faucet setup"] : [], - }, { name: "transaction", use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.tx.spec.ts", - dependencies: environments.ci ? ["adaholder auth setup", "wallet bootstrap"] : [], + dependencies: environments.ci ? ["adaholder auth setup"] : [], }, { name: "proposal discussion", @@ -140,7 +138,7 @@ export default defineConfig({ use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.dRep.spec.ts", dependencies: environments.ci - ? ["dRep setup", "dRep auth setup", "wallet bootstrap"] + ? ["dRep auth setup"] : [], teardown: environments.ci && "cleanup dRep", }, @@ -149,7 +147,7 @@ export default defineConfig({ use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.delegation.spec.ts", dependencies: environments.ci - ? ["adaholder auth setup","dRep auth setup", "dRep setup", "wallet bootstrap"] + ? ["adaholder auth setup","dRep auth setup"] : [], teardown: environments.ci && "cleanup delegation", }, diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts index fdfed71f1..614060059 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts @@ -3,7 +3,10 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; +import { + skipIfMainnet, + skipIfTemporyWalletIsNotAvailable, +} from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { createNewPageWithWallet } from "@helpers/page"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; @@ -14,7 +17,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); await skipIfMainnet(); - await skipIfBalanceIsInsufficient(4000); + await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); }); test("2N. Should show DRep information on details page", async ({ diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts index 013763dc4..a5d06def5 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts @@ -24,7 +24,11 @@ import { correctDRepDirectoryFormat, } from "@helpers/adaFormat"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; +import { + skipIfBalanceIsInsufficient, + skipIfMainnet, + skipIfTemporyWalletIsNotAvailable, +} from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; @@ -36,7 +40,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); await skipIfMainnet(); - await skipIfBalanceIsInsufficient(200); + await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); }); test.describe("Delegate to others", () => { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts index 3b1a648bd..76f6610ae 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts @@ -5,7 +5,11 @@ import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; -import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; +import { + skipIfBalanceIsInsufficient, + skipIfMainnet, + skipIfTemporyWalletIsNotAvailable, +} from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; @@ -19,7 +23,7 @@ import { dRep01AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); await skipIfMainnet(); - await skipIfBalanceIsInsufficient(4000); + await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); }); test.describe("Logged in DReps", () => { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts index 7573dda05..245e2587b 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts @@ -4,7 +4,10 @@ import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; import { invalid as mockInvalid, valid as mockValid } from "@mock/index"; -import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; +import { + skipIfMainnet, + skipIfTemporyWalletIsNotAvailable, +} from "@helpers/cardano"; import EditDRepPage from "@pages/editDRepPage"; import { expect } from "@playwright/test"; import environments from "@constants/environments"; @@ -13,7 +16,7 @@ import { dRep02AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); await skipIfMainnet(); - await skipIfBalanceIsInsufficient(4000); + await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); }); test.use({ wallet: dRep02Wallet, storageState: dRep02AuthFile }); diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts index ea23ecab1..882504b06 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts @@ -9,6 +9,7 @@ import { lovelaceToAda, skipIfBalanceIsInsufficient, skipIfMainnet, + skipIfTemporyWalletIsNotAvailable, } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import GovernanceActionsPage from "@pages/governanceActionsPage"; @@ -28,7 +29,7 @@ import { dRep01AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); await skipIfMainnet(); - await skipIfBalanceIsInsufficient(4000); + await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); }); test.describe("Logged in DRep", () => { diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts index e27473109..eabda4488 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts @@ -5,7 +5,12 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { isBootStrapingPhase, skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano"; +import { + isBootStrapingPhase, + skipIfBalanceIsInsufficient, + skipIfMainnet, + skipIfTemporyWalletIsNotAvailable, +} from "@helpers/cardano"; import { encodeCIP129Identifier } from "@helpers/encodeDecode"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; @@ -13,14 +18,13 @@ import GovernanceActionDetailsPage from "@pages/governanceActionDetailsPage"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { Page, expect } from "@playwright/test"; import kuberService from "@services/kuberService"; -import { BootstrapGovernanceActionType, GovernanceActionType } from "@types"; -import { allure } from "allure-playwright"; +import { GovernanceActionType } from "@types"; import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("5. Proposal functionality"); await skipIfMainnet(); - await skipIfBalanceIsInsufficient(4000); + await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); }); test.describe("Proposal checks", () => { From 2833b922de11acec6206303f52b496eea512425d Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 11:40:27 +0545 Subject: [PATCH 29/60] fix: correct calculation of total required balance for temporary DRep wallets setup --- tests/govtool-frontend/playwright/tests/dRep.setup.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/dRep.setup.ts b/tests/govtool-frontend/playwright/tests/dRep.setup.ts index 2fae68afc..75af77c03 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.setup.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.setup.ts @@ -75,8 +75,7 @@ setup("Register DRep of static wallets", async () => { setup("Setup temporary DRep wallets", async () => { const totalRequiredBalanceForDRepSetup = - (DREP_WALLETS_COUNT + REGISTER_DREP_WALLETS_COUNT) * dRepDeposit + - 22 * DREP_WALLETS_COUNT; + (DREP_WALLETS_COUNT + REGISTER_DREP_WALLETS_COUNT) * (dRepDeposit + 22); await skipIfBalanceIsInsufficient(totalRequiredBalanceForDRepSetup); setup.setTimeout(3 * environments.txTimeOut); From 3ba4d5a1f126d70f88a18f1100c176bf221942d0 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 11:40:37 +0545 Subject: [PATCH 30/60] docs: update README to clarify ADA requirements for faucet address in test instructions --- tests/govtool-frontend/playwright/README.md | 204 +++++++++++--------- 1 file changed, 118 insertions(+), 86 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 8cfc55cf9..dfa0fc603 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -93,19 +93,19 @@ npm run generate-wallets ### πŸ” Run All Tests -- **Requirements**: Faucet API key , valid proposal faucet private keys , valid Blockfrost and Kuber API keys +- **Pre-requisite**: Ensure the faucet address holds at least **412,000 ADA**. -- **Headless mode** (no UI): +#### πŸ–₯️ UI Mode - ```bash - npm run test - ``` +```bash +npm run test +``` -- **UI mode**: +#### πŸ§ͺ Headless Mode (No UI) - ```bash - npm run test:headless - ``` +```bash +npm run test:headless +``` --- @@ -117,42 +117,53 @@ Each test suite can be run in **UI** or **Headless** mode. #### 1. **Delegation Pillars** -- **Requirements**: Faucet API key, valid proposal faucet private keys and valid Blockfrost and Kuber API keys -- **UI Mode**: - ```bash - npm run test:delegation-pillars - ``` -- **Headless Mode**: - ```bash - npm run test:headless:delegation-pillars - ``` +- **Pre-requisite**: Ensure the faucet address holds at least **12,000 ADA**. + +#### πŸ–₯️ UI Mode + +```bash +npm run test:delegation-pillars +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:delegation-pillars +``` --- #### 2. **Voting Pillars** -- **Requirements**: Faucet API key, valid proposal faucet private keys and valid Blockfrost and Kuber API keys -- **UI Mode**: - ```bash - npm run test:voting-pillars - ``` -- **Headless Mode**: - ```bash - npm run test:headless:voting-pillars - ``` +- **Pre-requisite**: Ensure the faucet address holds at least **12,000 ADA**. + +#### πŸ–₯️ UI Mode + +```bash +npm run test:voting-pillars +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:voting-pillars +``` --- #### 3. **Outcomes** -- **UI Mode**: - ```bash - npm run test:outcomes - ``` -- **Headless Mode**: - ```bash - npm run test:headless:outcomes - ``` +#### πŸ–₯️ UI Mode + +```bash +npm run test:outcomes +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:outcomes +``` --- @@ -160,82 +171,103 @@ Each test suite can be run in **UI** or **Headless** mode. _Includes both Proposal Discussion and Budget Discussion_ -- **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys -- **UI Mode**: - ```bash - npm run test:proposal-pillars - ``` -- **Headless Mode**: - ```bash - npm run test:headless:proposal-pillars - ``` +- **Pre-requisite**: Ensure the faucet address holds at least **403,000 ADA**. + +#### πŸ–₯️ UI Mode + +```bash +npm run test:proposal-pillars +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:proposal-pillars +``` --- #### 5. **Proposal Discussion** -- **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys -- **UI Mode**: - ```bash - npm run test:proposal-discussion - ``` -- **Headless Mode**: - ```bash - npm run test:headless:proposal-discussion - ``` +- **Pre-requisite**: Ensure the faucet address holds at least **401,000 ADA**. + +#### πŸ–₯️ UI Mode + +```bash +npm run test:proposal-discussion +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:proposal-discussion +``` --- #### 6. **Proposal Budget** -- **Requirements**: Valid proposal faucet private keys and valid Blockfrost and Kuber API keys -- **UI Mode**: - ```bash - npm run test:proposal-budget - ``` -- **Headless Mode**: - ```bash - npm run test:headless:proposal-budget - ``` +- **Pre-requisite**: Ensure the faucet address holds at least **1,000 ADA**. + +#### πŸ–₯️ UI Mode + +```bash +npm run test:proposal-budget +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:proposal-budget +``` --- #### 7. **Wallet Connect** -- **UI Mode**: - ```bash - npm run test:wallet-connect - ``` -- **Headless Mode**: - ```bash - npm run test:headless:wallet-connect - ``` +#### πŸ–₯️ UI Mode + +```bash +npm run test:wallet-connect +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:wallet-connect +``` --- #### 8. **Usersnap Integration** -- **UI Mode**: - ```bash - npm run test:usersnap - ``` -- **Headless Mode**: - ```bash - npm run test:headless:usersnap - ``` +#### πŸ–₯️ UI Mode + +```bash +npm run test:usersnap +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:usersnap +``` --- #### 9. **Miscellaneous Tests** -- **UI Mode**: - ```bash - npm run test:misc - ``` -- **Headless Mode**: - ```bash - npm run test:headless:misc - ``` +#### πŸ–₯️ UI Mode + +```bash +npm run test:misc +``` + +#### πŸ§ͺ Headless Mode (No UI) + +```bash +npm run test:headless:misc +``` --- From 897927893148deaffa6dce9033202c391531cc9a Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 11:47:43 +0545 Subject: [PATCH 31/60] chore: update env variables on integration test workflow --- .github/workflows/test_integration_playwright.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index 61e5f929c..d25ebc09b 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -93,16 +93,12 @@ jobs: # Set API keys based on the network if [[ "${{ env.NETWORK }}" == "preprod" ]]; then - export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_PREPROD }}" export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_PREPROD }}" elif [[ "${{ env.NETWORK }}" == "sanchonet" ]]; then - export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_SANCHONET }}" export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_SANCHONET }}" elif [[ "${{ env.NETWORK }}" == "preview" ]]; then - export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_PREVIEW }}" export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_PREVIEW }}" else - export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_PREVIEW }}" export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_MAINNET }}" fi @@ -123,7 +119,6 @@ jobs: path: tests/govtool-frontend/playwright/lock_logs.txt env: - API_URL: https://${{inputs.deployment || 'govtool.cardanoapi.io' }}/api DOCS_URL: ${{ vars.DOCS_URL }} KUBER_API_KEY: ${{secrets.KUBER_API_KEY}} NETWORK: ${{ inputs.network || vars.NETWORK }} @@ -131,9 +126,8 @@ jobs: CI: ${{vars.CI}} FAUCET_ADDRESS: ${{vars.FAUCET_ADDRESS}} CARDANOAPI_METADATA_URL: ${{vars.CARDANOAPI_METADATA_URL}} - PROPOSAL_FAUCET_PAYMENT_PRIVATE: ${{secrets.PROPOSAL_FAUCET_PAYMENT_PRIVATE}} - PROPOSAL_FAUCET_STAKE_PRIVATE: ${{secrets.PROPOSAL_FAUCET_STAKE_PRIVATE}} - PROPOSAL_FAUCET_DREP_PRIVATE: ${{secrets.PROPOSAL_FAUCET_DREP_PRIVATE}} + FAUCET_PAYMENT_PRIVATE: ${{secrets.FAUCET_PAYMENT_PRIVATE}} + FAUCET_STAKE_PKH: ${{secrets.FAUCET_STAKE_PKH}} publish-report: runs-on: ubuntu-latest From 62b10ef5bbfe40beff6dbad32ff4a699553a6655 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 11:50:20 +0545 Subject: [PATCH 32/60] chore: update .gitignore to remove leading dot from lock_logs.txt entry --- tests/govtool-frontend/playwright/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/.gitignore b/tests/govtool-frontend/playwright/.gitignore index 34b3e38d4..c066977bb 100644 --- a/tests/govtool-frontend/playwright/.gitignore +++ b/tests/govtool-frontend/playwright/.gitignore @@ -23,4 +23,4 @@ lib/_mock/wallets.json lib/_mock/proposals.json lib/_mock/protocolParameter.json lib/_mock/faucetWalletBalance.json -./lock_logs.txt +lock_logs.txt From 0ccbd481f1b6842d130db4d3ecc127c182dfdb8a Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 15:12:17 +0545 Subject: [PATCH 33/60] fix: divide dRepDeposit and govActionDeposite to calculate the required balance --- tests/govtool-frontend/playwright/tests/dRep.setup.ts | 6 ++++-- tests/govtool-frontend/playwright/tests/proposal.setup.ts | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/dRep.setup.ts b/tests/govtool-frontend/playwright/tests/dRep.setup.ts index 75af77c03..afb3c798c 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.setup.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.setup.ts @@ -35,7 +35,8 @@ setup.beforeEach(async () => { }); setup("Register DRep of static wallets", async () => { - const totalRequiredBalanceForDRepSetup = dRepWallets.length * dRepDeposit + 2; + const totalRequiredBalanceForDRepSetup = + dRepWallets.length * (dRepDeposit / 1000000) + 2; await skipIfBalanceIsInsufficient(totalRequiredBalanceForDRepSetup); setup.setTimeout(environments.txTimeOut); @@ -75,7 +76,8 @@ setup("Register DRep of static wallets", async () => { setup("Setup temporary DRep wallets", async () => { const totalRequiredBalanceForDRepSetup = - (DREP_WALLETS_COUNT + REGISTER_DREP_WALLETS_COUNT) * (dRepDeposit + 22); + (DREP_WALLETS_COUNT + REGISTER_DREP_WALLETS_COUNT) * + (dRepDeposit / 1000000 + 22); await skipIfBalanceIsInsufficient(totalRequiredBalanceForDRepSetup); setup.setTimeout(3 * environments.txTimeOut); diff --git a/tests/govtool-frontend/playwright/tests/proposal.setup.ts b/tests/govtool-frontend/playwright/tests/proposal.setup.ts index e97f8f2c6..d9511b483 100644 --- a/tests/govtool-frontend/playwright/tests/proposal.setup.ts +++ b/tests/govtool-frontend/playwright/tests/proposal.setup.ts @@ -28,7 +28,8 @@ setup.beforeEach(async () => { await setAllureStory("Proposal"); await skipIfMainnet(); const totalRequiredBalanceForWallets = - govActionDeposit * PROPOSAL_WALLETS_COUNT + 22 * PROPOSAL_WALLETS_COUNT; + (govActionDeposit / 1000000) * PROPOSAL_WALLETS_COUNT + + 22 * PROPOSAL_WALLETS_COUNT; await skipIfBalanceIsInsufficient(totalRequiredBalanceForWallets); }); From 10a7a0dbac984255a749cfcbac0489d58be78f73 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 1 May 2025 15:12:35 +0545 Subject: [PATCH 34/60] chore: remove unnecessary "/" from host urls --- tests/govtool-frontend/playwright/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index dfa0fc603..0ad7c6351 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -51,13 +51,13 @@ npx playwright install ### HOST URL -| Environment | URL | -| :---------- | :------------------------------------------------------------------------------------------------------------------------- | -| Development | [https://p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr/](https://p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr/) | -| QA | [https://govtool.cardanoapi.io/](https://govtool.cardanoapi.io/) | -| Preview | [https://preview.gov.tools/](https://preview.gov.tools/) | -| Pre-Prod | [https://pre-prod.gov.tools/](https://pre-prod.gov.tools/) | -| Mainnet | [https://gov.tools/](https://gov.tools/) | +| Environment | URL | +| :---------- | :----------------------------------------------------------------------------------------------------------------------- | +| Development | [https://p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr](https://p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr) | +| QA | [https://govtool.cardanoapi.io](https://govtool.cardanoapi.io) | +| Preview | [https://preview.gov.tools](https://preview.gov.tools) | +| Pre-Prod | [https://pre-prod.gov.tools](https://pre-prod.gov.tools) | +| Mainnet | [https://gov.tools](https://gov.tools) | --- From 9e2ba7f0a5d693b05fbedeaedb29ec3d4416b949 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 2 May 2025 10:10:43 +0545 Subject: [PATCH 35/60] refactor: remove unused transaction test configuration from Playwright setup --- tests/govtool-frontend/playwright/playwright.config.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/govtool-frontend/playwright/playwright.config.ts b/tests/govtool-frontend/playwright/playwright.config.ts index 064d01e9c..5f51153e9 100644 --- a/tests/govtool-frontend/playwright/playwright.config.ts +++ b/tests/govtool-frontend/playwright/playwright.config.ts @@ -87,12 +87,6 @@ export default defineConfig({ testMatch: "**/proposal.setup.ts", teardown: environments.ci && "cleanup faucet", }, - { - name: "transaction", - use: { ...devices["Desktop Chrome"] }, - testMatch: "**/*.tx.spec.ts", - dependencies: environments.ci ? ["adaholder auth setup"] : [], - }, { name: "proposal discussion", use: { ...devices["Desktop Chrome"] }, From 3476fc4d00d6359e94b3f23176bfe668cfa1e7d8 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 2 May 2025 10:12:01 +0545 Subject: [PATCH 36/60] chore: check balance from kuber directly --- .../playwright/lib/helpers/cardano.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts index b8ebf2bd0..a2b47a3ff 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts @@ -76,21 +76,9 @@ export async function skipIfBalanceIsInsufficient(limit = 10) { export async function getWalletBalance(address: string) { let balance: number = 0; - const faucetWalletBalanceDetails = - (await getFile("faucetWalletBalance.json")) || {}; await functionWaitedAssert( async () => { balance = await kuberService.getBalance(address); - if (faucetWalletBalanceDetails["address"] === address) { - balance = faucetWalletBalanceDetails["balance"]; - } else { - faucetWalletBalanceDetails["balance"] = balance; - faucetWalletBalanceDetails["address"] = environments.faucet.address; - await createFile( - "faucetWalletBalance.json", - faucetWalletBalanceDetails - ); - } }, { message: "get balance" } ); From 5b086b9380a0bee5df7ff32df221c8cb2f786618 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 2 May 2025 10:12:38 +0545 Subject: [PATCH 37/60] feat: add delete file/folder helper function --- .../playwright/lib/helpers/file.ts | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/helpers/file.ts b/tests/govtool-frontend/playwright/lib/helpers/file.ts index 25fa3239b..5978a6fd2 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/file.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/file.ts @@ -1,12 +1,13 @@ -import { readFile, writeFile } from "fs"; +import { readFile, rm, writeFile } from "fs"; const path = require("path"); -const baseFilePath = path.resolve(__dirname, "../_mock"); +const mockFolderPath = path.resolve(__dirname, "../_mock"); +const basePath = path.join(__dirname, "../.."); export async function createFile(fileName: string, data?: any) { await new Promise((resolve, reject) => writeFile( - `${baseFilePath}/${fileName}`, + `${mockFolderPath}/${fileName}`, JSON.stringify(data, null, 2), (err) => { if (err) { @@ -21,7 +22,7 @@ export async function createFile(fileName: string, data?: any) { export async function getFile(fileName: string): Promise { const data: string = await new Promise((resolve, reject) => - readFile(`${baseFilePath}/${fileName}`, "utf8", (err, data) => { + readFile(`${mockFolderPath}/${fileName}`, "utf8", (err, data) => { if (err) { if (err.code === "ENOENT") { resolve(undefined); @@ -35,3 +36,35 @@ export async function getFile(fileName: string): Promise { ); return data ? JSON.parse(data) : undefined; } + +export async function deleteFile(fileName: string): Promise { + await new Promise((resolve, reject) => + rm(`${mockFolderPath}/${fileName}`, (err) => { + if (err) { + if (err.code === "ENOENT") { + resolve(); + } else { + reject(err); + } + } else { + resolve(); + } + }) + ); +} + +export async function deleteFolder(folderName: string): Promise { + await new Promise((resolve, reject) => + rm(`${basePath}/${folderName}`, { recursive: true,force:true }, (err) => { + if (err) { + if (err.code === "ENOENT") { + resolve(); + } else { + reject(err); + } + } else { + resolve(); + } + }) + ); +} From effa140fd974743cf01d10edb17fa74362d76f38 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 2 May 2025 10:13:44 +0545 Subject: [PATCH 38/60] chore: check copy temporary wallets instead of used temporary wallets --- .../playwright/tests/2-delegation/delegation.dRep.spec.ts | 2 +- .../2-delegation/delegationFunctionality.delegation.spec.ts | 2 +- .../tests/3-drep-registration/dRepRegistration.dRep.spec.ts | 3 +-- .../playwright/tests/3-drep-registration/editDRep.dRep.spec.ts | 2 +- .../4-proposal-visibility/proposalVisibility.dRep.spec.ts | 2 +- .../proposalFunctionality.dRep.spec.ts | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts index 614060059..c7dc4bfea 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.dRep.spec.ts @@ -17,7 +17,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); await skipIfMainnet(); - await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); + await skipIfTemporyWalletIsNotAvailable("registerDRepCopyWallets.json"); }); test("2N. Should show DRep information on details page", async ({ diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts index a5d06def5..2d7a4ac2a 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts @@ -40,7 +40,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); await skipIfMainnet(); - await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); + await skipIfTemporyWalletIsNotAvailable("registerDRepCopyWallets.json"); }); test.describe("Delegate to others", () => { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts index 76f6610ae..91fb769dd 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts @@ -6,7 +6,6 @@ import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; import { - skipIfBalanceIsInsufficient, skipIfMainnet, skipIfTemporyWalletIsNotAvailable, } from "@helpers/cardano"; @@ -23,7 +22,7 @@ import { dRep01AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); await skipIfMainnet(); - await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); + await skipIfTemporyWalletIsNotAvailable("registerDRepCopyWallets.json"); }); test.describe("Logged in DReps", () => { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts index 245e2587b..57a4543b9 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts @@ -16,7 +16,7 @@ import { dRep02AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); await skipIfMainnet(); - await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); + await skipIfTemporyWalletIsNotAvailable("registerDRepCopyWallets.json"); }); test.use({ wallet: dRep02Wallet, storageState: dRep02AuthFile }); diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts index 882504b06..41fbbd06a 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts @@ -29,7 +29,7 @@ import { dRep01AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); await skipIfMainnet(); - await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); + await skipIfTemporyWalletIsNotAvailable("registeredDRepCopyWallets.json"); }); test.describe("Logged in DRep", () => { diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts index eabda4488..c0fb24480 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts @@ -24,7 +24,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("5. Proposal functionality"); await skipIfMainnet(); - await skipIfTemporyWalletIsNotAvailable("registerDRepWallets.json"); + await skipIfTemporyWalletIsNotAvailable("registeredDRepCopyWallets.json"); }); test.describe("Proposal checks", () => { From 7fd7e67dfd5805ea70356fb25278cb395984cd5f Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 2 May 2025 11:16:09 +0545 Subject: [PATCH 39/60] feat: add cleanup artifacts functionality to Playwright tests --- .../playwright/lib/helpers/file.ts | 2 +- .../playwright/playwright.config.ts | 15 ++++++++-- .../tests/generated-artifacts.teardown.ts | 29 +++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 tests/govtool-frontend/playwright/tests/generated-artifacts.teardown.ts diff --git a/tests/govtool-frontend/playwright/lib/helpers/file.ts b/tests/govtool-frontend/playwright/lib/helpers/file.ts index 5978a6fd2..d8145b0a4 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/file.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/file.ts @@ -55,7 +55,7 @@ export async function deleteFile(fileName: string): Promise { export async function deleteFolder(folderName: string): Promise { await new Promise((resolve, reject) => - rm(`${basePath}/${folderName}`, { recursive: true,force:true }, (err) => { + rm(`${basePath}/${folderName}`, { recursive: true, force: true }, (err) => { if (err) { if (err.code === "ENOENT") { resolve(); diff --git a/tests/govtool-frontend/playwright/playwright.config.ts b/tests/govtool-frontend/playwright/playwright.config.ts index 5f51153e9..a1f9c4ed0 100644 --- a/tests/govtool-frontend/playwright/playwright.config.ts +++ b/tests/govtool-frontend/playwright/playwright.config.ts @@ -56,6 +56,7 @@ export default defineConfig({ name: "adaholder auth setup", testMatch: "**/adaholder.auth.setup.ts", dependencies: environments.ci ? ["wallet bootstrap"] : [], + teardown: environments.ci && "cleanup artifacts", }, { name: "dRep auth setup", @@ -94,6 +95,7 @@ export default defineConfig({ dependencies: environments.ci ? ["proposal discussion auth setup"] : [], + teardown: environments.ci && "cleanup artifacts", }, { name: "proposal budget", @@ -103,6 +105,7 @@ export default defineConfig({ ? ["proposal budget auth setup"] : [], testIgnore: ["**/*.dRep.pb.spec.ts"], + teardown: environments.ci && "cleanup artifacts", }, { name: "proposal submission", @@ -111,12 +114,14 @@ export default defineConfig({ dependencies: environments.ci ? ["proposal setup"] : [], + teardown: environments.ci && "cleanup artifacts", }, { name: "loggedin (desktop)", use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.loggedin.spec.ts", dependencies: environments.ci ? ["user auth setup"] : [], + teardown: environments.ci && "cleanup artifacts", }, { name: "proposal budget dRep", @@ -125,7 +130,7 @@ export default defineConfig({ dependencies: environments.ci ? ["proposal budget auth setup","proposal budget dRep setup"] : [], - teardown: environments.ci && "cleanup dRep", + teardown: environments.ci && "cleanup artifacts", }, { name: "dRep", @@ -134,7 +139,7 @@ export default defineConfig({ dependencies: environments.ci ? ["dRep auth setup"] : [], - teardown: environments.ci && "cleanup dRep", + teardown: environments.ci && "cleanup artifacts", }, { name: "delegation", @@ -157,6 +162,7 @@ export default defineConfig({ "**/*.pd.spec.ts", "**/*.pb.spec.ts", ], + teardown: environments.ci && "cleanup artifacts", }, { name: "mobile", @@ -171,6 +177,7 @@ export default defineConfig({ "**/*.pb.spec.ts", "**/walletConnect.spec.ts", ], + teardown: environments.ci && "cleanup artifacts", }, { name: "cleanup delegation", @@ -184,5 +191,9 @@ export default defineConfig({ name: "cleanup faucet", testMatch: "faucet.teardown.ts", }, + { + name: "cleanup artifacts", + testMatch: "generated-artifacts.teardown.ts", + }, ], }); diff --git a/tests/govtool-frontend/playwright/tests/generated-artifacts.teardown.ts b/tests/govtool-frontend/playwright/tests/generated-artifacts.teardown.ts new file mode 100644 index 000000000..5e9b4d1a3 --- /dev/null +++ b/tests/govtool-frontend/playwright/tests/generated-artifacts.teardown.ts @@ -0,0 +1,29 @@ +import environments from "@constants/environments"; +import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { test as cleanup } from "@fixtures/walletExtension"; +import { deleteFile, deleteFolder } from "@helpers/file"; + +cleanup.describe.configure({ timeout: environments.txTimeOut }); +cleanup.beforeEach(async () => { + await setAllureEpic("Setup"); + await setAllureStory("Cleanup"); +}); + +cleanup(`Clean up generated files and folders`, async () => { + const fileToRemove = [ + "registerDRepCopyWallets.json", + "registerDRepWallets.json", + "registeredDRepWallets.json", + "registeredDRepCopyWallets.json", + "protocolParameter.json", + ]; + + for (const fileName of fileToRemove) { + await deleteFile(fileName); + } + + const foldersToRemove = [".auth", ".download"]; + for (const folderName of foldersToRemove) { + await deleteFolder(folderName); + } +}); From fa2c6bfefa35676b72cf7345978304f694af9072 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 2 May 2025 11:18:14 +0545 Subject: [PATCH 40/60] chore: update default deployment option in Playwright integration tests --- .github/workflows/test_integration_playwright.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index d25ebc09b..1417cfb65 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -11,11 +11,12 @@ on: deployment: required: true type: choice - default: "govtool.cardanoapi.io" + default: "p80-z6b8d2f7a-ze34e4cb2-gtw.z937eb260.rustrocks.fr" options: - "sanchogov.tools" - "staging.govtool.byron.network" - "govtool.cardanoapi.io" + - "p80-z6b8d2f7a-ze34e4cb2-gtw.z937eb260.rustrocks.fr" - "preview.gov.tools" - "gov.tools" - "p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr" From bce9288272e013ae91234e67473778116f80e21f Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 2 May 2025 13:11:16 +0545 Subject: [PATCH 41/60] refactor: rename proposal budget config to budget proposal --- .../govtool-frontend/playwright/playwright.config.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/govtool-frontend/playwright/playwright.config.ts b/tests/govtool-frontend/playwright/playwright.config.ts index a1f9c4ed0..cc14955aa 100644 --- a/tests/govtool-frontend/playwright/playwright.config.ts +++ b/tests/govtool-frontend/playwright/playwright.config.ts @@ -68,7 +68,7 @@ export default defineConfig({ testMatch: "**/proposal-discussion.auth.setup.ts", }, { - name: "proposal budget auth setup", + name: "budget proposal auth setup", testMatch: "**/proposal-budget.auth.setup.ts", teardown: environments.ci && "cleanup faucet", }, @@ -79,7 +79,7 @@ export default defineConfig({ teardown: environments.ci && "cleanup dRep", }, { - name: "proposal budget dRep setup", + name: "budget proposal dRep setup", testMatch: "**/proposal-budget.dRep.setup.ts", teardown: environments.ci && "cleanup dRep", }, @@ -98,11 +98,11 @@ export default defineConfig({ teardown: environments.ci && "cleanup artifacts", }, { - name: "proposal budget", + name: "budget proposal", use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.pb.spec.ts", dependencies: environments.ci - ? ["proposal budget auth setup"] + ? ["budget proposal auth setup"] : [], testIgnore: ["**/*.dRep.pb.spec.ts"], teardown: environments.ci && "cleanup artifacts", @@ -124,11 +124,11 @@ export default defineConfig({ teardown: environments.ci && "cleanup artifacts", }, { - name: "proposal budget dRep", + name: "budget proposal dRep", use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.dRep.pb.spec.ts", dependencies: environments.ci - ? ["proposal budget auth setup","proposal budget dRep setup"] + ? ["budget proposal auth setup","budget proposal dRep setup"] : [], teardown: environments.ci && "cleanup artifacts", }, From a89daedead5be33af01e67920dd6d5fc9a18b5ba Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 2 May 2025 13:12:30 +0545 Subject: [PATCH 42/60] chore: add playwright project configuration architecture on developer guide --- .../playwright/DEVELOPERS_GUIDE.md | 95 +- .../playwright/docs/budget-proposal.png | Bin 0 -> 56787 bytes .../playwright/docs/delegation-pillars-1.png | Bin 0 -> 57341 bytes .../playwright/docs/delegation-pillars.png | Bin 0 -> 63447 bytes .../govtool-playwright-project.excalidraw | 5345 +++++++++++++++++ .../playwright/docs/loggedin.png | Bin 0 -> 17012 bytes .../playwright/docs/outcomes-pillars.png | Bin 0 -> 23655 bytes .../playwright/docs/proposal-discussion.png | Bin 0 -> 39565 bytes .../playwright/docs/voting-pillars.png | Bin 0 -> 41346 bytes 9 files changed, 5422 insertions(+), 18 deletions(-) create mode 100644 tests/govtool-frontend/playwright/docs/budget-proposal.png create mode 100644 tests/govtool-frontend/playwright/docs/delegation-pillars-1.png create mode 100644 tests/govtool-frontend/playwright/docs/delegation-pillars.png create mode 100644 tests/govtool-frontend/playwright/docs/govtool-playwright-project.excalidraw create mode 100644 tests/govtool-frontend/playwright/docs/loggedin.png create mode 100644 tests/govtool-frontend/playwright/docs/outcomes-pillars.png create mode 100644 tests/govtool-frontend/playwright/docs/proposal-discussion.png create mode 100644 tests/govtool-frontend/playwright/docs/voting-pillars.png diff --git a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md index 2dd660aa9..e9b52583c 100644 --- a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md +++ b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md @@ -67,28 +67,31 @@ This directory contains all automated test cases, organized by feature area: ### Authentication & Setup Scripts -13. **`auth.setup.ts`** - Sets up authentication for users and adaHolder wallets. +13. **`adaholder.auth.setup.ts`** + Sets up authentication for adaHolder wallets. -14. **`proposal-budget.auth.setup.ts`** +14. **`user.auth.setup.ts`** + Sets up authentication for user wallets. + +15. **`proposal-budget.auth.setup.ts`** Authentication setup for proposal budget wallets. -15. **`proposal-discussion.auth.setup.ts`** +16. **`proposal-discussion.auth.setup.ts`** Authentication setup for proposal discussion wallets. -16. **`dRep.auth.setup.ts`** +17. **`dRep.auth.setup.ts`** Authentication setup for dRep wallets. -17. **`dRep.setup.ts`** +18. **`dRep.setup.ts`** Setup for temporary and static dRep wallet registration. -18. **`proposal-budget.dRep.setup.ts`** +19. **`proposal-budget.dRep.setup.ts`** dRep wallet registration setup for proposal budget tests. -19. **`proposal.setup.ts`** +20. **`proposal.setup.ts`** Setup for proposal submission wallets. -20. **`wallet.bootstrap.ts`** +21. **`wallet.bootstrap.ts`** Initializes adaHolder and dRep wallets with test funds for spendable ADA functionality. --- @@ -98,18 +101,14 @@ This directory contains all automated test cases, organized by feature area: 21. **`delegation.teardown.ts`** Resets delegation status (abstains delegation from delegated wallets). -22. **`faucet.setup.ts`** - Funds the test faucet wallet. - -23. **`faucet.teardown.ts`** - Refunds all unspendable ADA from test wallets back to the proposal faucet. +22. **`faucet.teardown.ts`** + Refunds all unspendable ADA from test wallets back to the faucet wallet. -24. **`dRep.teardown.ts`** +23. **`dRep.teardown.ts`** Handles deregistration of dRep wallets registered during tests or setup. ---- - -Sure! Here's a refined and clearer version of your note: +24. **`generated-artifacts.teardown.ts`** + Remove all artifacts generated during test execution --- @@ -141,3 +140,63 @@ Sure! Here's a refined and clearer version of your note: > - To run tests _with wallet dependency_ and generate **Allure reports**, **do not** remove the `CI` environment variable. --- + +## Govtool Playwright Configuration – Project Behaviors + +This section outlines the core behavioral areas of the Govtool application as captured and tested using Playwright. Visual representations are provided to guide developers in understanding the UI states and interaction flows. + +### 1. Delegation Pillars + +This set of tests covers all key UI and interaction flows related to delegation functionality. + +![Delegation Pillars](/docs/delegation-pillars-1.png) + +--- + +### 2. Voting Pillars + +Covers user voting mechanisms, including interface states and validation of voting logic. + +![Voting Pillars](/docs/voting-pillars.png) + +--- + +### 3. Proposal Pillars + +Proposal functionality is split into two sub-categories, each with distinct test coverage: + +#### i. Proposal Discussion + +Tracks creation, display, and participation in proposal discussions. + +![Proposal Discussion](/docs/proposal-discussion.png) + +#### ii. Budget Proposal + +Tracks creation, display, and participation in budget-related proposals. + +![Budget Proposal](/docs/budget-proposal.png) + +--- + +### 4. Outcomes Pillars + +Tests centered around outcomes from various actions. + +![Outcomes Pillars](/docs/outcomes-pillars.png) + +--- + +### 5. Logged-In State + +Covers all test cases that require the user to be authenticated, and are not included in the delegation, voting, proposal, or outcomes pillars + +![Logged-In State](/docs/loggedin.png) + +--- + +### Overall Architecture + +For a comprehensive view of the project's Playwright architecture, refer to the Excalidraw diagram: + +[Govtool Project Architecture](/docs/govtool-playwright-project.excalidraw) diff --git a/tests/govtool-frontend/playwright/docs/budget-proposal.png b/tests/govtool-frontend/playwright/docs/budget-proposal.png new file mode 100644 index 0000000000000000000000000000000000000000..c77327ef9f4274b9eed7c3596e09e7bad18ad85b GIT binary patch literal 56787 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 literal 0 HcmV?d00001 diff --git a/tests/govtool-frontend/playwright/docs/delegation-pillars-1.png b/tests/govtool-frontend/playwright/docs/delegation-pillars-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f846f3a81817f083fc9082945ff98f4e87a0b7c GIT binary patch literal 57341 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 E#pEPC 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 literal 0 HcmV?d00001 diff --git a/tests/govtool-frontend/playwright/docs/govtool-playwright-project.excalidraw b/tests/govtool-frontend/playwright/docs/govtool-playwright-project.excalidraw new file mode 100644 index 000000000..14f837758 --- /dev/null +++ b/tests/govtool-frontend/playwright/docs/govtool-playwright-project.excalidraw @@ -0,0 +1,5345 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "CvlMGXyYRtgct1OWYV76r", + "type": "text", + "x": 2064.4459823892116, + "y": 39.82988384088645, + "width": 184, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0N", + "roundness": null, + "seed": 1088036333, + "version": 358, + "versionNonce": 1989742531, + "isDeleted": false, + "boundElements": [], + "updated": 1746168602542, + "link": null, + "locked": false, + "text": "proposal pillars", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "proposal pillars", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "dDRRlMFNRVNwapnzIWKAy", + "type": "text", + "x": 237.44018555837454, + "y": 88.8443621151659, + "width": 184, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1I4", + "roundness": null, + "seed": 1802923683, + "version": 206, + "versionNonce": 2065924461, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "Delegation Pillars", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Delegation Pillars", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "miLqnBqtsyQYMh6Y6PG3h", + "type": "rectangle", + "x": 224.31512825309034, + "y": 380.01682399082, + "width": 200.5938568750449, + "height": 39.623477901243405, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "odX7bnXf4mBGTw_RdSAQD", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1I8", + "roundness": { + "type": 3 + }, + "seed": 1472309891, + "version": 105, + "versionNonce": 1332399053, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "DMbQ_xl3pJLv7gXasOBO3", + "type": "text", + "x": 235.45923141281503, + "y": 389.94622609730317, + "width": 175.4403533935547, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "odX7bnXf4mBGTw_RdSAQD", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1IC", + "roundness": null, + "seed": 1688592451, + "version": 69, + "versionNonce": 85576237, + "isDeleted": false, + "boundElements": [ + { + "id": "TgYtXLkdDrMD4TlaxAOmB", + "type": "arrow" + }, + { + "id": "sorhjXoApmDk7n9Lg2pOT", + "type": "arrow" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "Ada holder auth setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Ada holder auth setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "e-Fc_aaTdPq7EZ2Oees5n", + "type": "rectangle", + "x": 381.71459565604323, + "y": 270.2056738247015, + "width": 171.80883157793073, + "height": 39.55555555555556, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mnbVwkhK-Meg5zi1AUvsE", + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1IG", + "roundness": { + "type": 3 + }, + "seed": 421968291, + "version": 216, + "versionNonce": 532938061, + "isDeleted": false, + "boundElements": [ + { + "id": "TgYtXLkdDrMD4TlaxAOmB", + "type": "arrow" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "oTAnJEG6QKYM772RbZImD", + "type": "text", + "x": 402.3164475078951, + "y": 278.74734049136816, + "width": 129.08827209472656, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "mnbVwkhK-Meg5zi1AUvsE", + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1IK", + "roundness": null, + "seed": 60310541, + "version": 194, + "versionNonce": 642829229, + "isDeleted": false, + "boundElements": [ + { + "id": "-S5GYTWWberUKKpLZZ8rE", + "type": "arrow" + }, + { + "id": "60yYoVmbOn5FmAGFXlmSi", + "type": "arrow" + }, + { + "id": "TgYtXLkdDrMD4TlaxAOmB", + "type": "arrow" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "wallet bootstrap", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "wallet bootstrap", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "vxoFRSKeptQ86tOiL0bi5", + "type": "rectangle", + "x": 514.0283032455059, + "y": 355.9226087527971, + "width": 141.15864002317983, + "height": 36.52789369020877, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2QzRgnvDN1lp6itqKLDlU", + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1IO", + "roundness": { + "type": 3 + }, + "seed": 455774915, + "version": 107, + "versionNonce": 289082669, + "isDeleted": false, + "boundElements": [], + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "ZoMuyLXX60DlUN-q0tFCt", + "type": "text", + "x": 537.5547432493693, + "y": 364.59024454369415, + "width": 88.52816772460938, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2QzRgnvDN1lp6itqKLDlU", + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1IS", + "roundness": null, + "seed": 1764851331, + "version": 91, + "versionNonce": 437968781, + "isDeleted": false, + "boundElements": [ + { + "id": "A8rlTiv5S7s_LyeyGsaoX", + "type": "arrow" + }, + { + "id": "60yYoVmbOn5FmAGFXlmSi", + "type": "arrow" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "dRep setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "dRep setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "gk75Snen_OmbCyKd2B8eg", + "type": "rectangle", + "x": 502.5243156150025, + "y": 438.2368658434938, + "width": 164.06596318483605, + "height": 42.719062112278095, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "vl1D-Xx4LLhHe4yqmgBeo", + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1IV", + "roundness": { + "type": 3 + }, + "seed": 1607813197, + "version": 127, + "versionNonce": 842567341, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "lCeTlFWDta38B4V8mCO1s", + "type": "text", + "x": 519.8595871967965, + "y": 448.7618521610116, + "width": 130.83226013183594, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "vl1D-Xx4LLhHe4yqmgBeo", + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1IZ", + "roundness": null, + "seed": 385863661, + "version": 95, + "versionNonce": 317468941, + "isDeleted": false, + "boundElements": [ + { + "id": "A8rlTiv5S7s_LyeyGsaoX", + "type": "arrow" + }, + { + "id": "9G-8YkDnkWAEORl-EBQly", + "type": "arrow" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "dRep auth setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "dRep auth setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "P0Xc-E3knxCB_HjPZPOjR", + "type": "rectangle", + "x": 420.9900160945237, + "y": 575.3325602923127, + "width": 149.57286708841028, + "height": 42.846966702551015, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "oMdNd6vQfldk4yFPkiVGe", + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Id", + "roundness": { + "type": 3 + }, + "seed": 2075914285, + "version": 182, + "versionNonce": 1168724013, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "V0rgVb6enNugjwnPbg4O-", + "type": "text", + "x": 433.23200658096687, + "y": 584.514053157145, + "width": 120.70423889160156, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "oMdNd6vQfldk4yFPkiVGe", + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Ih", + "roundness": null, + "seed": 1776553827, + "version": 68, + "versionNonce": 1305002637, + "isDeleted": false, + "boundElements": [ + { + "id": "sorhjXoApmDk7n9Lg2pOT", + "type": "arrow" + }, + { + "id": "9G-8YkDnkWAEORl-EBQly", + "type": "arrow" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "delegation test", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "delegation test", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "TgYtXLkdDrMD4TlaxAOmB", + "type": "arrow", + "x": 420.61291342642244, + "y": 311.3431219719885, + "width": 72.87935867953507, + "height": 65.83050449568589, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Il", + "roundness": { + "type": 2 + }, + "seed": 410368237, + "version": 163, + "versionNonce": 1692998691, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822401, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -72.87935867953507, + 65.83050449568589 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "oTAnJEG6QKYM772RbZImD", + "focus": 0.2807968911463329, + "gap": 12.59578148062036 + }, + "endBinding": { + "elementId": "DMbQ_xl3pJLv7gXasOBO3", + "focus": -0.0066488631188494265, + "gap": 12.772599629628758 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "A8rlTiv5S7s_LyeyGsaoX", + "type": "arrow", + "x": 569.4564271874694, + "y": 399.8470566729089, + "width": 0.01924710261278051, + "height": 40.155157995407535, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Ip", + "roundness": { + "type": 2 + }, + "seed": 1792879117, + "version": 128, + "versionNonce": 443854691, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822401, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.01924710261278051, + 40.155157995407535 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ZoMuyLXX60DlUN-q0tFCt", + "focus": 0.27898367195830537, + "gap": 15.256812129214723 + }, + "endBinding": { + "elementId": "lCeTlFWDta38B4V8mCO1s", + "focus": -0.2422394583967271, + "gap": 8.759637492695163 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "sorhjXoApmDk7n9Lg2pOT", + "type": "arrow", + "x": 319.54919639807355, + "y": 421.55084198103077, + "width": 163.62114438856423, + "height": 150.72122068967104, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1It", + "roundness": { + "type": 2 + }, + "seed": 2025910285, + "version": 116, + "versionNonce": 371487395, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822401, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 163.62114438856423, + 150.72122068967104 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "DMbQ_xl3pJLv7gXasOBO3", + "focus": 0.27475153550888826, + "gap": 11.604615883727604 + }, + "endBinding": { + "elementId": "V0rgVb6enNugjwnPbg4O-", + "focus": 0.19284142620639874, + "gap": 12.241990486443115 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "9G-8YkDnkWAEORl-EBQly", + "type": "arrow", + "x": 585.4352448838, + "y": 481.0442041075424, + "width": 64.86658659380078, + "height": 95.05348059017297, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1J", + "roundness": { + "type": 2 + }, + "seed": 1666758157, + "version": 140, + "versionNonce": 1621911011, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822401, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -64.86658659380078, + 95.05348059017297 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "lCeTlFWDta38B4V8mCO1s", + "focus": -0.21269961791132033, + "gap": 12.28235194653081 + }, + "endBinding": { + "elementId": "V0rgVb6enNugjwnPbg4O-", + "focus": 0.214611235571392, + "gap": 8.416368459429691 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "gi7zTruRGxEtgR4dgNmcb", + "type": "rectangle", + "x": 393.8081903876237, + "y": 176.71103225216802, + "width": 150.7295078643312, + "height": 36.72597145932943, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1J8", + "roundness": { + "type": 3 + }, + "seed": 1277786989, + "version": 35, + "versionNonce": 1164219181, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "VAeNjPz_VGBEXARgESCkg", + "type": "text", + "x": 408.345554090275, + "y": 185.12740071159766, + "width": 118.65621948242188, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1JG", + "roundness": null, + "seed": 1639567779, + "version": 55, + "versionNonce": 1529062797, + "isDeleted": false, + "boundElements": [ + { + "id": "-S5GYTWWberUKKpLZZ8rE", + "type": "arrow" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "faucet address", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "faucet address", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-S5GYTWWberUKKpLZZ8rE", + "type": "arrow", + "x": 461.58080648363887, + "y": 215.95030700253636, + "width": 0.28886695927292294, + "height": 51.70551302762851, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1JO", + "roundness": { + "type": 2 + }, + "seed": 1762614317, + "version": 195, + "versionNonce": 1707116835, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822402, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.28886695927292294, + 51.70551302762851 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "VAeNjPz_VGBEXARgESCkg", + "focus": 0.10456002546555035, + "gap": 10.822906290938704 + }, + "endBinding": { + "elementId": "oTAnJEG6QKYM772RbZImD", + "focus": -0.07543461752963973, + "gap": 11.091520461203288 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "60yYoVmbOn5FmAGFXlmSi", + "type": "arrow", + "x": 492.0338736029656, + "y": 310.32896683099443, + "width": 81.36376163042473, + "height": 44.181397444477966, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "L-jyFhMZ8kv7GfIoF5lT9", + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1JV", + "roundness": { + "type": 2 + }, + "seed": 1369864653, + "version": 61, + "versionNonce": 873782371, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822402, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 81.36376163042473, + 44.181397444477966 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "oTAnJEG6QKYM772RbZImD", + "focus": 0.1756400079676742, + "gap": 11.581626339626268 + }, + "endBinding": { + "elementId": "ZoMuyLXX60DlUN-q0tFCt", + "focus": 0.45560994725420445, + "gap": 10.079880268221757 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ru9ci3PeM3iHMSCrKzWgX", + "type": "text", + "x": 186.7481648607378, + "y": 765.181716686419, + "width": 75.87639318646666, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Jd", + "roundness": null, + "seed": 909866381, + "version": 108, + "versionNonce": 509736717, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "cleanup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cleanup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "-j6ojWeTe1CO__zRKg-dg", + "type": "rectangle", + "x": 418.8851665997795, + "y": 698.0327322202367, + "width": 153.4203994099983, + "height": 40.0227128895649, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Jl", + "roundness": { + "type": 3 + }, + "seed": 261673197, + "version": 111, + "versionNonce": 445222253, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Q67Rvmmww33eHAdd35aX6" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "Q67Rvmmww33eHAdd35aX6", + "type": "text", + "x": 437.0592487510677, + "y": 708.0440886650191, + "width": 117.07223510742188, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Jt", + "roundness": null, + "seed": 1963946307, + "version": 123, + "versionNonce": 774854605, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "dRep teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "-j6ojWeTe1CO__zRKg-dg", + "originalText": "dRep teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "yHv0FhftPl5_OvxNt9PCT", + "type": "rectangle", + "x": 433.7684634265054, + "y": 827.2742435645272, + "width": 153.4203994099983, + "height": 40.0227128895649, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1K", + "roundness": { + "type": 3 + }, + "seed": 692254179, + "version": 192, + "versionNonce": 862770733, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "MuGC_TNbU8cz2HuN-vjR0" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "MuGC_TNbU8cz2HuN-vjR0", + "type": "text", + "x": 445.54253642252013, + "y": 837.2856000093096, + "width": 129.87225341796875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1K8", + "roundness": null, + "seed": 1976582531, + "version": 211, + "versionNonce": 86739085, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "faucet teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "yHv0FhftPl5_OvxNt9PCT", + "originalText": "faucet teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "E5FXAZGXxjR6l30fQ-6T9", + "type": "rectangle", + "x": 385.2849527926519, + "y": 888.5965079983172, + "width": 271.58096171104995, + "height": 46.129179333120874, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1KG", + "roundness": { + "type": 3 + }, + "seed": 282772205, + "version": 269, + "versionNonce": 1696919277, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Kq9AM2P_uTAiNzWcovxjw" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "Kq9AM2P_uTAiNzWcovxjw", + "type": "text", + "x": 402.33120147044247, + "y": 901.6610976648775, + "width": 237.48846435546875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1KO", + "roundness": null, + "seed": 2143149389, + "version": 323, + "versionNonce": 568494413, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "generated-artificats teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "E5FXAZGXxjR6l30fQ-6T9", + "originalText": "generated-artificats teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "FPbk1GOmx_Ebt756bPyyE", + "type": "text", + "x": 32.61814109661543, + "y": 390.1584635747389, + "width": 55.52848384574423, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1KV", + "roundness": null, + "seed": 516429613, + "version": 85, + "versionNonce": 2092816301, + "isDeleted": false, + "boundElements": null, + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "setup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "XXn_zqgzE5q0NZnVvZWG1", + "type": "rectangle", + "x": 409.1922810956337, + "y": 763.8888247426227, + "width": 190.4201714436612, + "height": 38.06458966656055, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Kd", + "roundness": { + "type": 3 + }, + "seed": 1761302797, + "version": 172, + "versionNonce": 1340103181, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "OumNGiQBfUoK8PP53zIBB" + } + ], + "updated": 1746169822400, + "link": null, + "locked": false + }, + { + "id": "OumNGiQBfUoK8PP53zIBB", + "type": "text", + "x": 425.52220934676114, + "y": 772.9211195759029, + "width": 157.76031494140625, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "R9HOV_orBFW_cODzA2Zv4" + ], + "frameId": null, + "index": "b1Kl", + "roundness": null, + "seed": 1336323949, + "version": 197, + "versionNonce": 1950584941, + "isDeleted": false, + "boundElements": [], + "updated": 1746169822400, + "link": null, + "locked": false, + "text": "delegation teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "XXn_zqgzE5q0NZnVvZWG1", + "originalText": "delegation teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "TXJbok9oerE6PMQmuiuPJ", + "type": "text", + "x": 979.6245134112909, + "y": 98.25984829759815, + "width": 184, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1k4", + "roundness": null, + "seed": 1927046307, + "version": 309, + "versionNonce": 2109131651, + "isDeleted": false, + "boundElements": null, + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "Voting Pillars", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Voting Pillars", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "7tQ_mO365Cxud7q2oW32v", + "type": "rectangle", + "x": 990.3403637550907, + "y": 172.0172340661659, + "width": 150.7295078643312, + "height": 36.72597145932943, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1k8", + "roundness": { + "type": 3 + }, + "seed": 1868093027, + "version": 48, + "versionNonce": 1685611299, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false + }, + { + "id": "4aXQG1W7LKoOh-tLds1fl", + "type": "rectangle", + "x": 990.1297543993147, + "y": 257.84332641677076, + "width": 171.80883157793073, + "height": 39.55555555555556, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "vzZSAdRGKGjDEjJly3oEQ", + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kG", + "roundness": { + "type": 3 + }, + "seed": 699400099, + "version": 196, + "versionNonce": 442894019, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false + }, + { + "id": "PJdjLfb59AKOtsnqQ_H2L", + "type": "text", + "x": 1010.7316062511663, + "y": 266.3849930834374, + "width": 129.08827209472656, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "vzZSAdRGKGjDEjJly3oEQ", + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kK", + "roundness": null, + "seed": 2138444611, + "version": 180, + "versionNonce": 1981691491, + "isDeleted": false, + "boundElements": [ + { + "id": "h49Sm3--TfhdEzCQC8euR", + "type": "arrow" + }, + { + "id": "CTYw_0c1UVE8sworTvVUN", + "type": "arrow" + } + ], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "wallet bootstrap", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "wallet bootstrap", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "x3JR9ynzMVut29y2ifYPo", + "type": "rectangle", + "x": 1012.4444564496487, + "y": 329.8026135451862, + "width": 141.15864002317983, + "height": 36.52789369020877, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "U-8e9Xt4D0jtPYeFILL6P", + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kO", + "roundness": { + "type": 3 + }, + "seed": 345871907, + "version": 166, + "versionNonce": 1158090051, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false + }, + { + "id": "iFBn-T_S-1BEoOY5K5Igs", + "type": "text", + "x": 1035.9708964535118, + "y": 338.47024933608327, + "width": 88.52816772460938, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "U-8e9Xt4D0jtPYeFILL6P", + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kV", + "roundness": null, + "seed": 359455171, + "version": 158, + "versionNonce": 1675259107, + "isDeleted": false, + "boundElements": [ + { + "id": "S2UFdUpBpdtk4ayms7fAZ", + "type": "arrow" + }, + { + "id": "CTYw_0c1UVE8sworTvVUN", + "type": "arrow" + } + ], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "dRep setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "dRep setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nI1025cotBW-8dNC924CN", + "type": "rectangle", + "x": 1002.3903649194351, + "y": 433.52469679931437, + "width": 164.06596318483605, + "height": 42.719062112278095, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "qLBvpBfdUAwUJrFZPTEwz", + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kZ", + "roundness": { + "type": 3 + }, + "seed": 785557859, + "version": 130, + "versionNonce": 363910083, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false + }, + { + "id": "7F6Rl4GURsSPiR6dlVPaF", + "type": "text", + "x": 1019.7256365012292, + "y": 444.04968311683217, + "width": 130.83226013183594, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "qLBvpBfdUAwUJrFZPTEwz", + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kd", + "roundness": null, + "seed": 639468803, + "version": 106, + "versionNonce": 948396899, + "isDeleted": false, + "boundElements": [ + { + "id": "S2UFdUpBpdtk4ayms7fAZ", + "type": "arrow" + }, + { + "id": "JQemIp_qTzagf5VbhGPtC", + "type": "arrow" + } + ], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "dRep auth setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "dRep auth setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5I1_T4i94GCC1DdMd1AOr", + "type": "rectangle", + "x": 1035.0321263511755, + "y": 558.9536438040383, + "width": 122.89105849536713, + "height": 39.53539471405281, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "ERWwGkHTJxihwpOFrtdPP", + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kl", + "roundness": { + "type": 3 + }, + "seed": 315354275, + "version": 246, + "versionNonce": 1644386883, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false + }, + { + "id": "w27wUl3tPZuEyrxUbCG0n", + "type": "text", + "x": 1045.4941468938002, + "y": 568.2593206184393, + "width": 100.07443859847807, + "height": 18.45423270613878, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "ERWwGkHTJxihwpOFrtdPP", + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kp", + "roundness": null, + "seed": 411852867, + "version": 199, + "versionNonce": 365238755, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": " voting test", + "fontSize": 14.763386164911024, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": " voting test", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "S2UFdUpBpdtk4ayms7fAZ", + "type": "arrow", + "x": 1069.6287386884442, + "y": 373.7270614652979, + "width": 0.008652476267116072, + "height": 57.39395156617604, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1kt", + "roundness": { + "type": 2 + }, + "seed": 1458400131, + "version": 214, + "versionNonce": 2015915981, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873977, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.008652476267116072, + 57.39395156617604 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "iFBn-T_S-1BEoOY5K5Igs", + "focus": 0.2395186345368354, + "gap": 15.256812129214609 + }, + "endBinding": { + "elementId": "7F6Rl4GURsSPiR6dlVPaF", + "focus": -0.23732341232010531, + "gap": 12.928670085358249 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "JQemIp_qTzagf5VbhGPtC", + "type": "arrow", + "x": 1080.1137898698794, + "y": 476.33203506336304, + "width": 1.8630364083369386, + "height": 75.89430152210065, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1l", + "roundness": { + "type": 2 + }, + "seed": 1316267715, + "version": 164, + "versionNonce": 243461677, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873977, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.8630364083369386, + 75.89430152210065 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "7F6Rl4GURsSPiR6dlVPaF", + "focus": 0.08490439227720947, + "gap": 12.282351946530866 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ispmq-3yG6-gE0FE4qC2L", + "type": "text", + "x": 1004.8777274577419, + "y": 180.4336025255955, + "width": 118.65621948242188, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1l4", + "roundness": null, + "seed": 794169859, + "version": 79, + "versionNonce": 798924995, + "isDeleted": false, + "boundElements": [ + { + "id": "h49Sm3--TfhdEzCQC8euR", + "type": "arrow" + } + ], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "faucet address", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "faucet address", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "h49Sm3--TfhdEzCQC8euR", + "type": "arrow", + "x": 1066.714892717877, + "y": 212.56882755250876, + "width": 0.8013618030183807, + "height": 38.74661622301787, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1l8", + "roundness": { + "type": 2 + }, + "seed": 1600838051, + "version": 164, + "versionNonce": 1402275565, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873978, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.8013618030183807, + 38.74661622301787 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ispmq-3yG6-gE0FE4qC2L", + "focus": -0.03445460197968729, + "gap": 12.135225026913275 + }, + "endBinding": { + "elementId": "PJdjLfb59AKOtsnqQ_H2L", + "focus": -0.1118284100169315, + "gap": 15.069549307910762 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "CTYw_0c1UVE8sworTvVUN", + "type": "arrow", + "x": 1070.3454000711633, + "y": 296.8687450524696, + "width": 2.501419555597977, + "height": 33.35226074130412, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "wHoHk0vU75VAIToj8Hmpw", + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1lG", + "roundness": { + "type": 2 + }, + "seed": 1448343491, + "version": 102, + "versionNonce": 1879568301, + "isDeleted": false, + "boundElements": null, + "updated": 1746169873978, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.501419555597977, + 33.35226074130412 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "PJdjLfb59AKOtsnqQ_H2L", + "focus": 0.09903835193336152, + "gap": 10.483751969032198 + }, + "endBinding": { + "elementId": "iFBn-T_S-1BEoOY5K5Igs", + "focus": -0.1337240904823293, + "gap": 8.249243542309557 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "lV5XVnDx-8OuL6RMUUiQf", + "type": "rectangle", + "x": 1028.7850612151497, + "y": 725.1853614043058, + "width": 153.4203994099983, + "height": 40.0227128895649, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1lK", + "roundness": { + "type": 3 + }, + "seed": 1350613453, + "version": 171, + "versionNonce": 874686275, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "-tJShMNoGbIm3wylcRmBN" + } + ], + "updated": 1746169873923, + "link": null, + "locked": false + }, + { + "id": "-tJShMNoGbIm3wylcRmBN", + "type": "text", + "x": 1046.959143366438, + "y": 735.1967178490883, + "width": 117.07223510742188, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1lO", + "roundness": null, + "seed": 155318317, + "version": 184, + "versionNonce": 1618134755, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "dRep teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lV5XVnDx-8OuL6RMUUiQf", + "originalText": "dRep teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EbR3n-smuT98cvlWUqam0", + "type": "rectangle", + "x": 1031.2425667968225, + "y": 785.168501898108, + "width": 153.4203994099983, + "height": 40.0227128895649, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1lV", + "roundness": { + "type": 3 + }, + "seed": 669841571, + "version": 197, + "versionNonce": 954069635, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "to7sQSFddknHU2HQbWkdC" + } + ], + "updated": 1746169873923, + "link": null, + "locked": false + }, + { + "id": "to7sQSFddknHU2HQbWkdC", + "type": "text", + "x": 1043.0166397928374, + "y": 795.1798583428905, + "width": 129.87225341796875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1lZ", + "roundness": null, + "seed": 2108419139, + "version": 217, + "versionNonce": 505588259, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "faucet teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "EbR3n-smuT98cvlWUqam0", + "originalText": "faucet teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "lJyjOvo9IyjOXHpibxj58", + "type": "rectangle", + "x": 988.740873789052, + "y": 853.3506387174813, + "width": 271.58096171104995, + "height": 46.129179333120874, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1ld", + "roundness": { + "type": 3 + }, + "seed": 2112945293, + "version": 279, + "versionNonce": 1429171651, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "8SykaZ9XzQtXE8Pb_FANo" + } + ], + "updated": 1746169873923, + "link": null, + "locked": false + }, + { + "id": "8SykaZ9XzQtXE8Pb_FANo", + "type": "text", + "x": 1005.7871224668426, + "y": 866.4152283840417, + "width": 237.48846435546875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1ll", + "roundness": null, + "seed": 219931373, + "version": 334, + "versionNonce": 19053923, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "generated-artificats teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lJyjOvo9IyjOXHpibxj58", + "originalText": "generated-artificats teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "biPPwl6WS0F6UVh7cnD6f", + "type": "text", + "x": 864.1527373880648, + "y": 347.14894807326954, + "width": 55.52848384574423, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1lp", + "roundness": null, + "seed": 1661236675, + "version": 98, + "versionNonce": 1565202691, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "setup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "6C_jkAOfg9yflwsWyzNg7", + "type": "text", + "x": 862.2550867060215, + "y": 771.4766405437758, + "width": 75.87639318646666, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "POq3fEVW9Y8UQCKucsPr3" + ], + "frameId": null, + "index": "b1lt", + "roundness": null, + "seed": 138838467, + "version": 109, + "versionNonce": 925302947, + "isDeleted": false, + "boundElements": [], + "updated": 1746169873923, + "link": null, + "locked": false, + "text": "cleanup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cleanup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "NiDwhOx8Br3IOdX0FiMMv", + "type": "text", + "x": 1664.10903103645, + "y": 177.4145976713013, + "width": 195.97850251567476, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1ltV", + "roundness": null, + "seed": 316472941, + "version": 160, + "versionNonce": 716832899, + "isDeleted": false, + "boundElements": null, + "updated": 1746169783179, + "link": null, + "locked": false, + "text": "proposal discussion (pd)", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "proposal discussion (pd)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "YhPWd2S6d6FML8u1QNGuj", + "type": "rectangle", + "x": 1624.0294208302619, + "y": 344.89797042718277, + "width": 138.94661550209227, + "height": 48.32925756594523, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1lu", + "roundness": { + "type": 3 + }, + "seed": 1947257133, + "version": 130, + "versionNonce": 692096803, + "isDeleted": false, + "boundElements": [ + { + "id": "CMCSzoaBQVXO0DeGkQeET", + "type": "arrow" + } + ], + "updated": 1746168653727, + "link": null, + "locked": false + }, + { + "id": "P_11j4raLqj-mXAO9l4H0", + "type": "text", + "x": 1638.5281981000453, + "y": 359.3967476969663, + "width": 110.46421813964844, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1lv", + "roundness": null, + "seed": 1665698243, + "version": 133, + "versionNonce": 1949149325, + "isDeleted": false, + "boundElements": [ + { + "id": "CMCSzoaBQVXO0DeGkQeET", + "type": "arrow" + } + ], + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "pd auth setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "pd auth setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "qyyN89gtZxJgJpTiwCBIe", + "type": "rectangle", + "x": 1837.8863855595698, + "y": 347.31443330548, + "width": 134.11368974549802, + "height": 41.07986893105351, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1lvV", + "roundness": { + "type": 3 + }, + "seed": 590847661, + "version": 83, + "versionNonce": 1833480899, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "BeldCYz0Nm8ZiZsslh97f" + }, + { + "id": "_zgF5EtzTqQ_AGrixy7CQ", + "type": "arrow" + }, + { + "id": "QH3cFb2CMVKpZ0-8S2EF9", + "type": "arrow" + } + ], + "updated": 1746168653727, + "link": null, + "locked": false + }, + { + "id": "BeldCYz0Nm8ZiZsslh97f", + "type": "text", + "x": 1847.7591255128852, + "y": 357.85436777100676, + "width": 114.36820983886719, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1lw", + "roundness": null, + "seed": 1188071405, + "version": 41, + "versionNonce": 1860374253, + "isDeleted": false, + "boundElements": null, + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "proposal setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "qyyN89gtZxJgJpTiwCBIe", + "originalText": "proposal setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "tO9rMD_2ulIQtNzbOxWBQ", + "type": "rectangle", + "x": 1806.4723681417054, + "y": 493.5104374424645, + "width": 209.02403897271367, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1lx", + "roundness": { + "type": 3 + }, + "seed": 1887276621, + "version": 83, + "versionNonce": 801858147, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "gaMIHa5lkxvqE005CyAaS" + }, + { + "id": "_zgF5EtzTqQ_AGrixy7CQ", + "type": "arrow" + } + ], + "updated": 1746168653727, + "link": null, + "locked": false + }, + { + "id": "gaMIHa5lkxvqE005CyAaS", + "type": "text", + "x": 1814.7841999449568, + "y": 508.5104374424645, + "width": 192.40037536621094, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1lxV", + "roundness": null, + "seed": 1178931427, + "version": 89, + "versionNonce": 249342285, + "isDeleted": false, + "boundElements": null, + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "proposal submission test", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "tO9rMD_2ulIQtNzbOxWBQ", + "originalText": "proposal submission test", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_zgF5EtzTqQ_AGrixy7CQ", + "type": "arrow", + "x": 1897.2558858785217, + "y": 391.4261778232293, + "width": 4.341716051535286, + "height": 97.85939801462325, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1ly", + "roundness": { + "type": 2 + }, + "seed": 338268195, + "version": 128, + "versionNonce": 1503075843, + "isDeleted": false, + "boundElements": null, + "updated": 1746168653727, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 4.341716051535286, + 97.85939801462325 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "qyyN89gtZxJgJpTiwCBIe", + "focus": 0.12848891399372414, + "gap": 3.031875586695776 + }, + "endBinding": { + "elementId": "tO9rMD_2ulIQtNzbOxWBQ", + "focus": -0.07659608544056724, + "gap": 4.224861604611931 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "VXKtb6mSip-Tkv5-hD3BD", + "type": "rectangle", + "x": 1547.9108401638982, + "y": 493.5104374424646, + "width": 217.48165904675378, + "height": 51.9539518833912, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1lz", + "roundness": { + "type": 3 + }, + "seed": 1027349571, + "version": 66, + "versionNonce": 91486125, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Efql8pgMYlg9coT8hnMG2" + }, + { + "id": "CMCSzoaBQVXO0DeGkQeET", + "type": "arrow" + } + ], + "updated": 1746168653727, + "link": null, + "locked": false + }, + { + "id": "Efql8pgMYlg9coT8hnMG2", + "type": "text", + "x": 1561.323483652119, + "y": 509.48741338416016, + "width": 190.6563720703125, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1lzV", + "roundness": null, + "seed": 819594861, + "version": 56, + "versionNonce": 900359587, + "isDeleted": false, + "boundElements": null, + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "proposal discussion test", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VXKtb6mSip-Tkv5-hD3BD", + "originalText": "proposal discussion test", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "CMCSzoaBQVXO0DeGkQeET", + "type": "arrow", + "x": 1685.649224226842, + "y": 395.64369087142535, + "width": 47.12102612679655, + "height": 99.0749780101878, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1m", + "roundness": { + "type": 2 + }, + "seed": 425043811, + "version": 84, + "versionNonce": 483555853, + "isDeleted": false, + "boundElements": null, + "updated": 1746168653727, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -47.12102612679655, + 99.0749780101878 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "P_11j4raLqj-mXAO9l4H0", + "focus": -0.07288464756735433, + "gap": 14 + }, + "endBinding": { + "elementId": "VXKtb6mSip-Tkv5-hD3BD", + "focus": -0.24694287278700527, + "gap": 1.2082314391485625 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "EOhSx1Abcv5hAzneKhpkl", + "type": "rectangle", + "x": 1766.9324541328078, + "y": 762.3667186562892, + "width": 153.4203994099983, + "height": 40.0227128895649, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1m4", + "roundness": { + "type": 3 + }, + "seed": 488048205, + "version": 204, + "versionNonce": 724810051, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ybd-ho0-VX2Q6ioFnR60u" + } + ], + "updated": 1746168653727, + "link": null, + "locked": false + }, + { + "id": "ybd-ho0-VX2Q6ioFnR60u", + "type": "text", + "x": 1778.7065271288227, + "y": 772.3780751010717, + "width": 129.87225341796875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1m8", + "roundness": null, + "seed": 1985655981, + "version": 225, + "versionNonce": 502378605, + "isDeleted": false, + "boundElements": [], + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "faucet teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "EOhSx1Abcv5hAzneKhpkl", + "originalText": "faucet teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "BILraYNko12lPeeUc98kF", + "type": "rectangle", + "x": 1728.4295703025077, + "y": 838.3448283484134, + "width": 271.58096171104995, + "height": 46.129179333120874, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1mG", + "roundness": { + "type": 3 + }, + "seed": 956853229, + "version": 293, + "versionNonce": 932288739, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "boekPdLphSvJve8uKS2BP" + } + ], + "updated": 1746168653727, + "link": null, + "locked": false + }, + { + "id": "boekPdLphSvJve8uKS2BP", + "type": "text", + "x": 1745.4758189802983, + "y": 851.4094180149739, + "width": 237.48846435546875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1mO", + "roundness": null, + "seed": 105801293, + "version": 348, + "versionNonce": 1989876429, + "isDeleted": false, + "boundElements": [], + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "generated-artificats teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "BILraYNko12lPeeUc98kF", + "originalText": "generated-artificats teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "s4-LFG9mAIwpsA1kF-hz4", + "type": "rectangle", + "x": 1824.3851924558735, + "y": 261.48150336659694, + "width": 150.7295078643312, + "height": 36.72597145932943, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "giXqnPxBxedjJ2NkkGdi0", + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1mV", + "roundness": { + "type": 3 + }, + "seed": 1317457379, + "version": 77, + "versionNonce": 676496515, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "e4_ecXdQuVpMPicMl2EDP" + }, + { + "id": "QH3cFb2CMVKpZ0-8S2EF9", + "type": "arrow" + } + ], + "updated": 1746168653727, + "link": null, + "locked": false + }, + { + "id": "e4_ecXdQuVpMPicMl2EDP", + "type": "text", + "x": 1840.421836646828, + "y": 269.84448909626167, + "width": 118.65621948242188, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "giXqnPxBxedjJ2NkkGdi0", + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1mZ", + "roundness": null, + "seed": 1923706563, + "version": 47, + "versionNonce": 526924077, + "isDeleted": false, + "boundElements": null, + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "faucet address", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "s4-LFG9mAIwpsA1kF-hz4", + "originalText": "faucet address", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "QH3cFb2CMVKpZ0-8S2EF9", + "type": "arrow", + "x": 1899.7499463880392, + "y": 301.1700201286413, + "width": 1.066276551619012, + "height": 43.71733861637824, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1md", + "roundness": { + "type": 2 + }, + "seed": 1864381219, + "version": 88, + "versionNonce": 355793955, + "isDeleted": false, + "boundElements": null, + "updated": 1746168653727, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1.066276551619012, + 43.71733861637824 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "s4-LFG9mAIwpsA1kF-hz4", + "focus": -0.006860794725439379, + "gap": 2.9625453027148865 + }, + "endBinding": { + "elementId": "qyyN89gtZxJgJpTiwCBIe", + "focus": -0.10094659153297024, + "gap": 2.4270745604604826 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "_-1mpv1wSnrTiTXV24OYz", + "type": "text", + "x": 1513.6310709029622, + "y": 365.22832420793014, + "width": 55.52848384574423, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1ml", + "roundness": null, + "seed": 889620963, + "version": 107, + "versionNonce": 1103268749, + "isDeleted": false, + "boundElements": [], + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "setup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "XQTB7fQnksYlbSfa-13lj", + "type": "text", + "x": 1596.0093475609597, + "y": 794.3806577235684, + "width": 75.87639318646666, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2mlKkGYjVTYQQCGd8n0do" + ], + "frameId": null, + "index": "b1mt", + "roundness": null, + "seed": 916528077, + "version": 139, + "versionNonce": 438796227, + "isDeleted": false, + "boundElements": [], + "updated": 1746168653727, + "link": null, + "locked": false, + "text": "cleanup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cleanup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "kzdXG96ymh5I68V0UDNP6", + "type": "text", + "x": 3230.519042783522, + "y": 175.27080619859467, + "width": 184, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1o8", + "roundness": null, + "seed": 1273711213, + "version": 448, + "versionNonce": 20735683, + "isDeleted": false, + "boundElements": [], + "updated": 1746169815956, + "link": null, + "locked": false, + "text": "Outcomes Pillars", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Outcomes Pillars", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "58SeZzOFvmfXVlMQUBK5Z", + "type": "rectangle", + "x": 3213.6321925861503, + "y": 290.9382780147972, + "width": 150.7295078643312, + "height": 36.72597145932943, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1oG", + "roundness": { + "type": 3 + }, + "seed": 242370701, + "version": 184, + "versionNonce": 1849223949, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false + }, + { + "id": "NqWsodf2D7hnfWVwDiP4n", + "type": "text", + "x": 3228.1695562888017, + "y": 299.3546464742268, + "width": 124.83224487304688, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tiFckONBsM5N7Kir1IB4o", + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1oO", + "roundness": null, + "seed": 395554541, + "version": 224, + "versionNonce": 1583929411, + "isDeleted": false, + "boundElements": [ + { + "id": "A3t-6R1b4ybkPPwLfgGVI", + "type": "arrow" + } + ], + "updated": 1746168696351, + "link": null, + "locked": false, + "text": "user auth setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "user auth setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "A3t-6R1b4ybkPPwLfgGVI", + "type": "arrow", + "x": 3292.3920272851246, + "y": 331.48987150114004, + "width": 2.534044657287268, + "height": 46.137394379573095, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tiFckONBsM5N7Kir1IB4o", + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1oV", + "roundness": { + "type": 2 + }, + "seed": 410601805, + "version": 691, + "versionNonce": 996278637, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.534044657287268, + 46.137394379573095 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "NqWsodf2D7hnfWVwDiP4n", + "focus": -0.009379699117277164, + "gap": 12.135225026913247 + }, + "endBinding": { + "elementId": "CHUEHAspg1ghHzOMverkM", + "focus": 0.07516920688692041, + "gap": 14.474358830854499 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "si3K1n6qdXgSmAxdgeN_q", + "type": "rectangle", + "x": 3232.933080171182, + "y": 383.719795166736, + "width": 122.89105849536713, + "height": 39.53539471405281, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "qBVL2k53skLSRvF0hhxwq", + "tiFckONBsM5N7Kir1IB4o", + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1od", + "roundness": { + "type": 3 + }, + "seed": 1365963171, + "version": 376, + "versionNonce": 617273315, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false + }, + { + "id": "CHUEHAspg1ghHzOMverkM", + "type": "text", + "x": 3236.9281698268205, + "y": 392.10162471156764, + "width": 110.23675856374139, + "height": 18.45423270613878, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "qBVL2k53skLSRvF0hhxwq", + "tiFckONBsM5N7Kir1IB4o", + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1ol", + "roundness": null, + "seed": 386057539, + "version": 359, + "versionNonce": 64572365, + "isDeleted": false, + "boundElements": [ + { + "id": "A3t-6R1b4ybkPPwLfgGVI", + "type": "arrow" + } + ], + "updated": 1746168696351, + "link": null, + "locked": false, + "text": " outcome test", + "fontSize": 14.763386164911024, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": " outcome test", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "CSusFxcOt7NERZ7Oafcn4", + "type": "text", + "x": 3249.1100932099653, + "y": 257.7881401406984, + "width": 75.75547610469016, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1ot", + "roundness": null, + "seed": 638225155, + "version": 160, + "versionNonce": 973857667, + "isDeleted": false, + "boundElements": null, + "updated": 1746168696351, + "link": null, + "locked": false, + "text": "logged In", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "logged In", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "XPwIk6-SBetz8WbpLDdA6", + "type": "rectangle", + "x": 3432.4840903981712, + "y": 287.9081953404193, + "width": 122.89105849536713, + "height": 39.53539471405281, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "oZ50807NykyXBySxbrDcI", + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1p", + "roundness": { + "type": 3 + }, + "seed": 964113379, + "version": 383, + "versionNonce": 666389037, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false + }, + { + "id": "pcrI_LSYT2cU1KlODWpo9", + "type": "text", + "x": 3436.4791800538105, + "y": 296.290024885251, + "width": 110.23675856374139, + "height": 18.45423270613878, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "oZ50807NykyXBySxbrDcI", + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1pG", + "roundness": null, + "seed": 818724739, + "version": 364, + "versionNonce": 107641635, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false, + "text": " outcome test", + "fontSize": 14.763386164911024, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": " outcome test", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "QIaU0iSK0nlWOb7ze8ebu", + "type": "text", + "x": 3442.194172549969, + "y": 254.25507102768418, + "width": 95.1562687656472, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1pV", + "roundness": null, + "seed": 2199011, + "version": 193, + "versionNonce": 1206418573, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false, + "text": "logged out", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "logged out", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "i2KykArUmkMsha5i8gRGI", + "type": "text", + "x": 3095.2683195083855, + "y": 296.3544220942838, + "width": 55.52848384574423, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "CCt5NF_oIQHnQU1PdUqCS", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1pl", + "roundness": null, + "seed": 605698819, + "version": 211, + "versionNonce": 1716854467, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false, + "text": "setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "setup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "54NxMecq228W2FDLxdSuT", + "type": "rectangle", + "x": 3243.694058472553, + "y": 488.2377495290043, + "width": 271.58096171104995, + "height": 46.129179333120874, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1q", + "roundness": { + "type": 3 + }, + "seed": 1843131789, + "version": 424, + "versionNonce": 740516589, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "HXkAcZ71bmZ99j2vEF_14" + } + ], + "updated": 1746168696351, + "link": null, + "locked": false + }, + { + "id": "HXkAcZ71bmZ99j2vEF_14", + "type": "text", + "x": 3260.7403071503436, + "y": 501.30233919556474, + "width": 237.48846435546875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1qV", + "roundness": null, + "seed": 390052845, + "version": 480, + "versionNonce": 610946659, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false, + "text": "generated-artificats teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "54NxMecq228W2FDLxdSuT", + "originalText": "generated-artificats teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "isviwU-RNd0xjrcgpAxNT", + "type": "text", + "x": 3083.6545039660355, + "y": 505.48436901343734, + "width": 75.87639318646666, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "SvaRuvs-ENljSYhvlQqtF", + "HzwBUTQ1h_5FpRq4CNGPr" + ], + "frameId": null, + "index": "b1r", + "roundness": null, + "seed": 1816246317, + "version": 157, + "versionNonce": 1460963501, + "isDeleted": false, + "boundElements": [], + "updated": 1746168696351, + "link": null, + "locked": false, + "text": "cleanup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cleanup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "0cE2zRMYHKnU0njGNhdsh", + "type": "rectangle", + "x": 3839.220257169134, + "y": 235.70184124487358, + "width": 150.7295078643312, + "height": 36.72597145932943, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b1s", + "roundness": { + "type": 3 + }, + "seed": 530661571, + "version": 190, + "versionNonce": 457691181, + "isDeleted": false, + "boundElements": [], + "updated": 1746168699215, + "link": null, + "locked": false + }, + { + "id": "xYJSU0wf-fmDsry4MRfBO", + "type": "text", + "x": 3853.7576208717855, + "y": 244.11820970430315, + "width": 124.83224487304688, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "qqot1-WRhj3tS5SqWMmGt", + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b1t", + "roundness": null, + "seed": 1675767907, + "version": 232, + "versionNonce": 2046711075, + "isDeleted": false, + "boundElements": [ + { + "id": "uQ7SqGGCOwLZ32FcqudrZ", + "type": "arrow" + } + ], + "updated": 1746168699215, + "link": null, + "locked": false, + "text": "user auth setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "user auth setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "uQ7SqGGCOwLZ32FcqudrZ", + "type": "arrow", + "x": 3918.159410413129, + "y": 276.25343473121643, + "width": 2.867185752304067, + "height": 47.439916126801705, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "qqot1-WRhj3tS5SqWMmGt", + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b1u", + "roundness": { + "type": 2 + }, + "seed": 1034169347, + "version": 728, + "versionNonce": 1805075085, + "isDeleted": false, + "boundElements": [], + "updated": 1746168699215, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.867185752304067, + 47.439916126801705 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "xYJSU0wf-fmDsry4MRfBO", + "focus": -0.01028003073454243, + "gap": 12.135225026913304 + }, + "endBinding": { + "elementId": "dxodlUn8yWkRuWBQNOEj4", + "focus": 0.07495498326987578, + "gap": 14.474358830854499 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "aMTxmmttzsa94u5d208cz", + "type": "rectangle", + "x": 3857.8698838805517, + "y": 328.4833583968124, + "width": 122.89105849536713, + "height": 39.53539471405281, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "g8fHZZ646W-6jcCdIUW_b", + "qqot1-WRhj3tS5SqWMmGt", + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b1v", + "roundness": { + "type": 3 + }, + "seed": 1894101923, + "version": 383, + "versionNonce": 777894083, + "isDeleted": false, + "boundElements": [], + "updated": 1746168699215, + "link": null, + "locked": false + }, + { + "id": "dxodlUn8yWkRuWBQNOEj4", + "type": "text", + "x": 3863.1674952834187, + "y": 338.1677096888726, + "width": 110.23675856374139, + "height": 18.45423270613878, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "g8fHZZ646W-6jcCdIUW_b", + "qqot1-WRhj3tS5SqWMmGt", + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b1w", + "roundness": null, + "seed": 1037387587, + "version": 381, + "versionNonce": 973695213, + "isDeleted": false, + "boundElements": [ + { + "id": "uQ7SqGGCOwLZ32FcqudrZ", + "type": "arrow" + } + ], + "updated": 1746168699215, + "link": null, + "locked": false, + "text": " login tests", + "fontSize": 14.763386164911024, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": " login tests", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "FDOINi3I8XMgSJufivRW_", + "type": "text", + "x": 3819.6244967713324, + "y": 176.63468641942583, + "width": 75.75547610469016, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b1x", + "roundness": null, + "seed": 1523672803, + "version": 180, + "versionNonce": 1111456227, + "isDeleted": false, + "boundElements": [], + "updated": 1746169818030, + "link": null, + "locked": false, + "text": "logged In", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "logged In", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "BnGhjCppl1cHwFb3CTDy5", + "type": "text", + "x": 3735.273357917632, + "y": 246.9323189977893, + "width": 55.52848384574423, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b1y", + "roundness": null, + "seed": 1865844995, + "version": 183, + "versionNonce": 405259085, + "isDeleted": false, + "boundElements": [], + "updated": 1746168699215, + "link": null, + "locked": false, + "text": "setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "setup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "jQLcnNto4b8Mt4FQX3aum", + "type": "rectangle", + "x": 3801.921991568134, + "y": 444.9641500483233, + "width": 271.58096171104995, + "height": 46.129179333120874, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b1z", + "roundness": { + "type": 3 + }, + "seed": 844261667, + "version": 397, + "versionNonce": 832742403, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "xIIXM43V7F6oJB4lH2gaO" + } + ], + "updated": 1746168699215, + "link": null, + "locked": false + }, + { + "id": "xIIXM43V7F6oJB4lH2gaO", + "type": "text", + "x": 3818.968240245925, + "y": 458.0287397148837, + "width": 237.48846435546875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b20", + "roundness": null, + "seed": 1796164803, + "version": 453, + "versionNonce": 709611949, + "isDeleted": false, + "boundElements": [], + "updated": 1746168699215, + "link": null, + "locked": false, + "text": "generated-artificats teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "jQLcnNto4b8Mt4FQX3aum", + "originalText": "generated-artificats teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xNKIDfNaGQOkbYam-QJ0x", + "type": "text", + "x": 3674.7147182253625, + "y": 459.4820410168388, + "width": 75.87639318646666, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "MIyCRLhk9HfAXL03otIJ-", + "hdn_kkkf98IHo6WKbldVl" + ], + "frameId": null, + "index": "b21", + "roundness": null, + "seed": 1724371949, + "version": 164, + "versionNonce": 1314204579, + "isDeleted": false, + "boundElements": [], + "updated": 1746168699215, + "link": null, + "locked": false, + "text": "cleanup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cleanup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "grZR6Q4vsACDPx8hwHGeK", + "type": "text", + "x": 2409.447774343792, + "y": 138.85009278244098, + "width": 164.6665260415598, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b22", + "roundness": null, + "seed": 37657635, + "version": 404, + "versionNonce": 1097142765, + "isDeleted": false, + "boundElements": null, + "updated": 1746169808942, + "link": null, + "locked": false, + "text": "budget proposal (bp)", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "budget proposal (bp)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "hYw-tp47epS5USubP9Gze", + "type": "rectangle", + "x": 2170.0821386944867, + "y": 328.2785813398106, + "width": 138.94661550209227, + "height": 48.32925756594523, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b23", + "roundness": { + "type": 3 + }, + "seed": 1411947245, + "version": 153, + "versionNonce": 235733507, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "jdekUTG06faselj8VXoR_", + "type": "text", + "x": 2184.58091596427, + "y": 342.77735860959416, + "width": 109.66421508789062, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b24", + "roundness": null, + "seed": 1267774797, + "version": 170, + "versionNonce": 700696995, + "isDeleted": false, + "boundElements": [ + { + "id": "X1_WP81tKQ_Hu1MN93EyV", + "type": "arrow" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "bp auth setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "bp auth setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "j_fEvEaOO_qWKeusnj_in", + "type": "rectangle", + "x": 2383.9391034237947, + "y": 330.69504421810785, + "width": 134.11368974549802, + "height": 41.07986893105351, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b25", + "roundness": { + "type": 3 + }, + "seed": 667321261, + "version": 107, + "versionNonce": 2007104739, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "OGCvqAVL0jQzZD0Krk-sM" + }, + { + "id": "o8obZnO-jo7jsvMQrrjxO", + "type": "arrow" + }, + { + "id": "x0Z6jpE1ob9KqrfA97xHZ", + "type": "arrow" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "OGCvqAVL0jQzZD0Krk-sM", + "type": "text", + "x": 2394.795844536778, + "y": 341.2349786836346, + "width": 112.40020751953125, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b26", + "roundness": null, + "seed": 1827898893, + "version": 80, + "versionNonce": 1354131587, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "bp dRep setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "j_fEvEaOO_qWKeusnj_in", + "originalText": "bp dRep setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "r4AwpuDLlQVcldG57lpZy", + "type": "rectangle", + "x": 2288.3030813821206, + "y": 457.4646218550605, + "width": 139.63679005107127, + "height": 37.802224930953116, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b27", + "roundness": { + "type": 3 + }, + "seed": 1290004877, + "version": 146, + "versionNonce": 604435299, + "isDeleted": false, + "boundElements": null, + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "ggYMmo36CAAxYBUjczP0a", + "type": "text", + "x": 2306.046982880323, + "y": 466.72230959325304, + "width": 103.88819885253906, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b28", + "roundness": null, + "seed": 1649828877, + "version": 113, + "versionNonce": 1111002883, + "isDeleted": false, + "boundElements": [ + { + "id": "X1_WP81tKQ_Hu1MN93EyV", + "type": "arrow" + }, + { + "id": "o8obZnO-jo7jsvMQrrjxO", + "type": "arrow" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "bp dRep test", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "bp dRep test", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "X1_WP81tKQ_Hu1MN93EyV", + "type": "arrow", + "x": 2256.6726482766294, + "y": 376.4598541458753, + "width": 97.97719522920488, + "height": 77.91887179645431, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b29", + "roundness": { + "type": 2 + }, + "seed": 2100046403, + "version": 148, + "versionNonce": 1169748877, + "isDeleted": false, + "boundElements": null, + "updated": 1746169803294, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 97.97719522920488, + 77.91887179645431 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "jdekUTG06faselj8VXoR_", + "focus": 0.18572956386144696, + "gap": 13.682495536281124 + }, + "endBinding": { + "elementId": "ggYMmo36CAAxYBUjczP0a", + "focus": 0.3836762073785214, + "gap": 12.34358365092345 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "o8obZnO-jo7jsvMQrrjxO", + "type": "arrow", + "x": 2452.627038735039, + "y": 372.6024842549617, + "width": 63.26086621098284, + "height": 84.09066362191606, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2A", + "roundness": { + "type": 2 + }, + "seed": 593698349, + "version": 149, + "versionNonce": 676410445, + "isDeleted": false, + "boundElements": null, + "updated": 1746169803294, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -63.26086621098284, + 84.09066362191606 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "j_fEvEaOO_qWKeusnj_in", + "focus": -0.21459171606928162, + "gap": 1 + }, + "endBinding": { + "elementId": "ggYMmo36CAAxYBUjczP0a", + "focus": 0.27422386923048003, + "gap": 10.029161716375256 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "VDNHFKvtn-Nee4_My9XC7", + "type": "rectangle", + "x": 2730.743899227114, + "y": 330.97220406032676, + "width": 138.94661550209227, + "height": 48.32925756594523, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2B", + "roundness": { + "type": 3 + }, + "seed": 202923683, + "version": 254, + "versionNonce": 1439681827, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "lqCQEGtbvsRF_m5PPK-P0", + "type": "text", + "x": 2746.738239535255, + "y": 343.97541829175424, + "width": 109.66421508789062, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2C", + "roundness": null, + "seed": 1400541763, + "version": 241, + "versionNonce": 20984003, + "isDeleted": false, + "boundElements": [ + { + "id": "UTt5t8OQ8PmyzHhSoqv8V", + "type": "arrow" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "bp auth setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "bp auth setup", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "hAisnjwZ52kf_Lr-FilcI", + "type": "rectangle", + "x": 2751.7532444216117, + "y": 451.18486634544087, + "width": 91.77877282368075, + "height": 37.802224930953116, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zIMOfZFQX0LgxiXXm_CHk", + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2D", + "roundness": { + "type": 3 + }, + "seed": 1012823331, + "version": 237, + "versionNonce": 407313411, + "isDeleted": false, + "boundElements": [ + { + "id": "UTt5t8OQ8PmyzHhSoqv8V", + "type": "arrow" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "XpsvOh3hJ60zR1JTEhk7m", + "type": "text", + "x": 2770.2449274389924, + "y": 458.94699104527746, + "width": 58.848114013671875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "zIMOfZFQX0LgxiXXm_CHk", + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2E", + "roundness": null, + "seed": 1874450627, + "version": 211, + "versionNonce": 1504355235, + "isDeleted": false, + "boundElements": [ + { + "id": "UTt5t8OQ8PmyzHhSoqv8V", + "type": "arrow" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "bp test", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "bp test", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "UTt5t8OQ8PmyzHhSoqv8V", + "type": "arrow", + "x": 2795.416634415546, + "y": 377.6579138280354, + "width": 3.1908995413177763, + "height": 65.20658597042865, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2F", + "roundness": { + "type": 2 + }, + "seed": 1428670563, + "version": 342, + "versionNonce": 81806605, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803294, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 3.1908995413177763, + 65.20658597042865 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "lqCQEGtbvsRF_m5PPK-P0", + "focus": 0.13218416757723603, + "gap": 13.68249553628118 + }, + "endBinding": { + "elementId": "XpsvOh3hJ60zR1JTEhk7m", + "focus": 0.007184146762296291, + "gap": 14 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "xig5rFD7NQcmntkuGwa1e", + "type": "rectangle", + "x": 2310.871988786348, + "y": 706.0806334242295, + "width": 153.4203994099983, + "height": 40.0227128895649, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2G", + "roundness": { + "type": 3 + }, + "seed": 1384573933, + "version": 167, + "versionNonce": 1746109059, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "GIU3TPyffKmc6HPlYg5oS" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "GIU3TPyffKmc6HPlYg5oS", + "type": "text", + "x": 2329.046070937636, + "y": 716.091989869012, + "width": 117.07223510742188, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2H", + "roundness": null, + "seed": 1811736141, + "version": 179, + "versionNonce": 1881553443, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "dRep teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "xig5rFD7NQcmntkuGwa1e", + "originalText": "dRep teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ia59gXjFYbXUJOAVFJO6n", + "type": "rectangle", + "x": 2312.6263342462908, + "y": 769.6773879346026, + "width": 153.4203994099983, + "height": 40.0227128895649, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2I", + "roundness": { + "type": 3 + }, + "seed": 763663533, + "version": 216, + "versionNonce": 1078001091, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "QJZxZ_DZwfIZ7yBp_e_-p" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "QJZxZ_DZwfIZ7yBp_e_-p", + "type": "text", + "x": 2324.4004072423054, + "y": 779.6887443793851, + "width": 129.87225341796875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2J", + "roundness": null, + "seed": 315062029, + "version": 235, + "versionNonce": 864177507, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "faucet teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ia59gXjFYbXUJOAVFJO6n", + "originalText": "faucet teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8DjzXoxZEcYmGbEdKROhT", + "type": "rectangle", + "x": 2720.29771537001, + "y": 726.999504556808, + "width": 153.4203994099983, + "height": 40.0227128895649, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2K", + "roundness": { + "type": 3 + }, + "seed": 195068141, + "version": 237, + "versionNonce": 1027123459, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "YychXriIHwb62q6NCNf-r" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "YychXriIHwb62q6NCNf-r", + "type": "text", + "x": 2732.0717883660245, + "y": 737.0108610015905, + "width": 129.87225341796875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2L", + "roundness": null, + "seed": 1461443405, + "version": 256, + "versionNonce": 1659015331, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "faucet teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "8DjzXoxZEcYmGbEdKROhT", + "originalText": "faucet teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "eWbV3macjLqy575dbxhHt", + "type": "rectangle", + "x": 2284.6434614866216, + "y": 846.916567068751, + "width": 271.58096171104995, + "height": 46.129179333120874, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2M", + "roundness": { + "type": 3 + }, + "seed": 1427259597, + "version": 303, + "versionNonce": 1982760003, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "xeeZ2IPqQG_Z6VDe6sq6W" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "xeeZ2IPqQG_Z6VDe6sq6W", + "type": "text", + "x": 2301.689710164412, + "y": 859.9811567353114, + "width": 237.48846435546875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2N", + "roundness": null, + "seed": 806002477, + "version": 358, + "versionNonce": 251331555, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "generated-artificats teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "eWbV3macjLqy575dbxhHt", + "originalText": "generated-artificats teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4VXnn8NRUKdeb4dhwWC5J", + "type": "rectangle", + "x": 2676.9512539093175, + "y": 802.2938797789657, + "width": 271.58096171104995, + "height": 46.129179333120874, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2O", + "roundness": { + "type": 3 + }, + "seed": 1313268269, + "version": 315, + "versionNonce": 1163300739, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "I6lSerTgWjyocB07BbBhv" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "I6lSerTgWjyocB07BbBhv", + "type": "text", + "x": 2693.997502587108, + "y": 815.3584694455261, + "width": 237.48846435546875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2P", + "roundness": null, + "seed": 1357124749, + "version": 370, + "versionNonce": 729786147, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "generated-artificats teardown", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4VXnn8NRUKdeb4dhwWC5J", + "originalText": "generated-artificats teardown", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "LLnHHzrwXuEXwuCjPcq6e", + "type": "rectangle", + "x": 2349.613306322139, + "y": 251.4828671685105, + "width": 150.7295078643312, + "height": 36.72597145932943, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "xA_DO_xatZPamK7Z9L8y6", + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2Q", + "roundness": { + "type": 3 + }, + "seed": 1640800781, + "version": 112, + "versionNonce": 132434627, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "_sQWi_ea0S7RlChwSalGD" + }, + { + "id": "x0Z6jpE1ob9KqrfA97xHZ", + "type": "arrow" + } + ], + "updated": 1746169803257, + "link": null, + "locked": false + }, + { + "id": "_sQWi_ea0S7RlChwSalGD", + "type": "text", + "x": 2365.6499505130937, + "y": 259.8458528981752, + "width": 118.65621948242188, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "xA_DO_xatZPamK7Z9L8y6", + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2R", + "roundness": null, + "seed": 291952749, + "version": 82, + "versionNonce": 1327790691, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "faucet address", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "LLnHHzrwXuEXwuCjPcq6e", + "originalText": "faucet address", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "x0Z6jpE1ob9KqrfA97xHZ", + "type": "arrow", + "x": 2427.110613357543, + "y": 292.2376604821738, + "width": 0, + "height": 36.25340275504533, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2S", + "roundness": { + "type": 2 + }, + "seed": 115320259, + "version": 137, + "versionNonce": 1207051725, + "isDeleted": false, + "boundElements": null, + "updated": 1746169803294, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 36.25340275504533 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "LLnHHzrwXuEXwuCjPcq6e", + "focus": -0.02829642494630742, + "gap": 4.0288218543338985 + }, + "endBinding": { + "elementId": "j_fEvEaOO_qWKeusnj_in", + "focus": -0.35619532926618896, + "gap": 2.20398098088873 + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "H28t1CDnBrzfp3Tp6r8AJ", + "type": "text", + "x": 2170.708002934, + "y": 776.7657526323427, + "width": 75.87639318646666, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "s3d4504aVRdrVEh_kZu36", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2T", + "roundness": null, + "seed": 581624845, + "version": 156, + "versionNonce": 1795412291, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "cleanup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cleanup", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "dfF6dEnKeHq720gN3wXVP", + "type": "text", + "x": 2066.208105548032, + "y": 344.86880922719814, + "width": 55.52848384574423, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "u9yQsMVOjO06m2WHAxtx5", + "-MOQYEtto9t548L5iwlA8" + ], + "frameId": null, + "index": "b2U", + "roundness": null, + "seed": 570612781, + "version": 157, + "versionNonce": 899592419, + "isDeleted": false, + "boundElements": [], + "updated": 1746169803257, + "link": null, + "locked": false, + "text": "setup", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "setup", + "autoResize": false, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/tests/govtool-frontend/playwright/docs/loggedin.png b/tests/govtool-frontend/playwright/docs/loggedin.png new file mode 100644 index 0000000000000000000000000000000000000000..37d20f51e3bb5750b343277134f77b70a6349341 GIT binary patch literal 17012 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 literal 0 HcmV?d00001 diff --git a/tests/govtool-frontend/playwright/docs/outcomes-pillars.png b/tests/govtool-frontend/playwright/docs/outcomes-pillars.png new file mode 100644 index 0000000000000000000000000000000000000000..85060c9f388c9f636eca396f3bec84ba7f5bec69 GIT binary patch literal 23655 zcmeEu^;?xo8!ja-q}HN4rKD9lC8ZUWZbZ7fLqL!Q=@Mz_?rtdo=?>}c=FHmrJKqoI z{0rZ8v9Il__nmjb84nYO)9LHv^fd3)d zD@%(Z6c3SYAs|p8$Vj|;@1nDp`smM`#B5+XfwS}127zxY`#N()yj>b|+93_*O#Az9 zQdZcqT{1*%_q>a*?p^yD=I1{;S2QH9rP;g9?9<02n$z2hJnwTN<}~Ppyn`Xap#S{! zviP#$>u%1^GbWf1=%JuM1xYi<+hV^U??M zx{&KJxO|e>(uAgURY6JfOmW>h390*T**w>Tmc7EP{ugqK&zRgMzqmf+L)Kz_I{8az z3%r6wlhIP_hxnX+G365dX!g}He zGYN*_iM2b@6s}q5&Wld7mc`)*%{M~<9jY3pbPcDYa=4S3$daNcr{WYz$d>e?yp`6A z&G?$WYOASXoZUp2Rd{9hOP{fKn=Tg2^U`Qi8ha?*r&664_>@(9$ep!j9mW(aH&UIe znQ{_-tlmV3+)o|;sF^ZA*EGw|<`))O@<9#_>ZXklT(KKZ_qxtMDV@~y_S~5)(S^PF z89@_Cg6KMtpYdL@3P*4C?ZHBmfTB2x)10mJ%|^QS98v@VyeINm_Jhunt(#4)o6h3G zUJUV8aaX=WQ*q~IyWGeEPKf8-8nt~HUeSg$&NDiWl76@Iq0(iw&qI%_x-vJi>9*)d(z$o&kJpag+-5(u$$e1 z7sC!`ktfZo;R3rLcxpzZDd)*+emyIw9lluf_Fg7Hgyn&Vt4CGie<_5-km?W(2Ef&- z0v2((mWVlco-oZb83uI9uH zjDhKA;*2fOPjmatH&z|1McL5$ZkzU-E_624aDjc^hRq)#TCZ;-#j$Lq2&J$|dp{+a z(mOv1B=`|Ng3pD7#lJ~4YZR|-W~!{v6TPpuTgUy-Jtc5^*fD=H|BMFu4D@0iEul@r z!{sXW#`21#(CKe+?hy&x4||yGzg@PnT!S$cn%vIH zZ}uBX-pxb$<20?NkD|k6QQPx#)3yZ%-b#~?lea8--KfX2Y4cDJG zfh+cfU=VbGXVD`+49hbc+oeDPl|b9!Ed#$`!7e)KF^4QF7TMHR{aOO24Sj;1U((Fy z*SdCnbg5|(IeykHcN4CC*ut0Jg}@V>gI;;B@V3>UH<{ry>e^B(m&}YjHBj zQMU-(-}!WAqk4mT7D*cP8?1&7H(2wYFNRwvMiX~B{=<%5^OCp=I; zuA(_z)@qU!ZksQ zFe<_-{8p8ev?r+X(ceYy2gml$J&m(g4a6e>{cH^bke#vkvTl-o@~>}bHP%-2 zyH-ud!WKOAxgp6!M&1UU zQtddQo;$`Ail5$c*p6OI38r5Yxzm)sqL1gR6war`E%$B$N1eFyxF~oS&wjk9blj_& z>u<*@*ims<4sjx>au8dgKnmUZ2y#XRjw_P?y z&`JDCw2%)wlV-bbc?+z^vw=1H&MmkKOPpNXmej@mWmh*rwBeg3B;Al6UE41FYVZUN z!xz)WlnsC5G|57UjZ;QE0~zi1>eiF`CGnq~v2VR^GvDB>H=)+x04qhUIZc+!rT?_2 z>vn!_%470D$&*?_F~x^tmc_52Yz`@j&VGAicwcd9ZMAHQHK#TjDwZtEW{D z-{fb`z^{uOn_-CClAF_oc{E6_)F4>;U!(rPwo8S;+5>sii!OgN>A!2w#Us!ceA~#u zPUIgleKcrwU`MSa0UZ&y$z0Gloq-JcAR^D5bXJZK3e)a>Wt8fw*Shh(+2bL6vH|17 zKyK8Z8Psg-WuR3KfFoWpBA%;qIpXwies8 zG1Sd=xpWtuPA?zc_8dg~gdnrm-I?kI4PJ3yrrODnK#2m_7P;pg#y%9G8*YLX#*PV5 z7pjBtSR$^y|LtpWD0%B@b|mUD9SaeX%aAaQ&0*W)*{VsM**^3y>DcM3ceqWAtbf8T z!lHVTN1^sK%wVzL2aClfEs@?0jFa23sCvfCX*qyUWfyVf^I=qsWGD2+6B<8b$)P_R zQJFgU)OLcUCi?n4JE!cMjLvWEhSrSGVpscAp9$}hompk}&=9$t`+tHNc9I+|evDDj zf)JJ@3A5I%MYA<3HREF^@01gVKworYNFk9P1yQy74a4{-OqmD84WFjib`vWu9m>iO zMp8;a3eK`CBfNT?^5ZFa27^eT-Q67*`nHX>+{vzGfi0AeF<@eAkY^NJ8Fnpwk;6y7 z`kYUalrhMkjG(P!q;a>0QNJ(NLxIuvlx7^#5Uh9D^|KOAVtTS8CDMVh-u=B+qYpt3 zdFi^GY*pW9iOS5n7Jd{75{Q#1L8J6{T_NI^YI8?wM`C;n2XDeBf+M3^x@omNj=JVm z{WFe6`y5vTMzQ=qo2$Bi3%TXmC|yRwuB>z!UerY|YhLn0pVJo<>)!tuiupu`!&R5v zU{{Y`I+RoV2AZOghW@bpg>v^7bBV(bg>YgeQffMl$Sggd)_6RGhUyrC^ckx0C7zb$ z*fBy%)luPNR$W?A$*-zKq~$i z`PT!I+Gz6@FRT{{j46RshL7bT`g3iDwP2H|i@$V?5Yh<8w^MhT*SA%RMWNEax|us6 zWv%8$W4P^u519dzI?=j0I+R1_mWKvQ&Z#jq>kYCLOjl0Z?3kZv+aa*!h0PbgbPA6G zVOZS4)DuBiI<(6c3$Y5GK`eagl+g?#Sm|bu-b$@aYM2*=|GrH3zTawe^^)&6(28i* zE>!lsFJrZqc$%7Y|A;3P-%yHL`IVbr_1jHmR0NCQ@XPqDR$s3ehK)MQ_N`FZmF+{n z_O7K5d*HQnxH(L$OuzYoC)!P z{y5W7GOdAR<2=!Eo_Cbq=FHGI9<%s$+$AC{=MtO3akZQG_^)JdhzL55SZ@vs<)^NY zE@pZ>#k|-<(^Fg4<9z?`(~rVAls_dJ5o`#RGl7LuX9vpEsQEx)`S6)QXRdE-HI|k{ z*jsUdn0lp1*Wbcbk;FQ|1Tn)wSlpjC98-Pwe%+Q+r)!(1s0~G&>Ux#bB`?TuRMkVr zar}doy~@kml#jobyUJgPn6*O5ss6S(uQhrO5iiqKDp7MSQSKd2w&k_{rozBNuI2D* zeEntf@muUsq>-|t4VrEV3y!?QESbk|IFN{6oFj2;+*T~fT;~`{P@#h^P$vrTt41tq z0!ywoV@g-N!YhlHVvNvuvxcN;SQrPDJmlL$8+N(?-4}9vRum!_70LlRI=7C^DJMhw zrpuzsSARWE>Xgu0_mU_ZPMV-)DE_gXZTJ!T zm0mZrMrqMSl1ZS0iHOpIpVoNLTvi4b>UUuZQ6?mUO3-jL6CulHH(_x+)zvOK4CR%I z`wH;~fQEe3B)=#a0zH?2$fcJ^ava$m{W(;DWfg9)qutRQyUgHqrbzc)8WnEZ&k<1* zQ4n$N23d$FvI*0(t5)S5J5X;9Y4!IFQFu0Zkf>LoPYfXCgA}XR&OI-j1}_FOMfZQ z(3zn8rhl;F3W ze<1}A1M0&$`{8Mj5$aEB*@uPkZ|51ryaUrQ1*@>04vFRs1`@W&Z7Ce}pSPp4Pp!o$ zQAp&1ZCpvyFpO*WumiisC{CR|h`XjC3TMYD!l#%WK8G=(wE%t>s+Q=SpN=WbR*oso ziYgQdoc#yBw-FOdli5o2v)vxFJn$>Zu{SyN7bi{xJe@F&dM^Z@$-hyNY8KoI&i3bL zb-b>O;K*<0x8DrA>%-l}?2y2L1)vE6$N}1|Qhl>Qyztruq+yoT)1L||;?7g(%dD`S zwYlh!eobbhD37Da`DmR{e<3q~yk+Dwx7)qDKC2*io*Tgu*e#7KyD;zsXl+K8x#&;% zPL3^gupIUnZN;W{j{)GAj#bs!;$9XypE9J?-iHG! zNdon(=|Ph`uV6>OH7GwsMk(0PJsaTAe(5 zA-V*BR8?-8+b^qzz3T9Z$d+aRe&Imcwr=_nfm*B6yyIlfTIKY#=US9Bi677X7Ypv^v(_!sfMzni*{ewxI_{;FA~Bz{?Fq{!nxx#v?@S=OG|3EG z-@XAk)cgZr6BHW&(AOgMOf)a9vxxnmV(WeB3~;T%?C*W#rxSY=h}tdGNUlSZci;!r zQwAZ^AQpsiGOgz8r}t_W7ru4XWFU_8u`;w;ZG+C8be;SL2%lEyp$tRnAGh;eQ#fe^ zTG&dTVk1VYDsVAp?_7BVAa$8}Nz;Vz-RV0xez*8S?oK`rdWL->#1VWN`G?!D5>rH;Z>s-100_L2cnyb5h}YBefoH$ zM_jrzUek(C72lGEAsi+ibhDWmQ4Q#`sf;faGtVQ02m7eX6k~F>&G>wOtnC~=Q42l# zek(R(H&w4kk49$Gig*q#*FeT$lo3E+C-${fQRwW?e#LUf7lGw#khP}Ryi*iBk`Ms% zD|I8R_3o&Lk_~TQLvX?WjWwWVxNVk1;e?aL`LuBj9K;<)df#6eU(gUxPXE9JW1CEU z?=r5cWg8&yrTlukpkdG&P%?!@0Onau@=GC(fL6LO#+gRnLzNjSDLf}`YgfbVM;<8~ zxtuf)aQ2Wn!NClO8*=wO7IKirkDBDMa^W({HivipEvi|NT?_t$@scd(ySH4X}w>1o?*Ug2%z)4|1FA+C1 z!7M@%+m{NFo1sFj1yZF<{tui_Ii8hkf%KGuyoxnW^rh}aKYL5SP`lRHEXKJRC-%EWiw0whu^K*jt#x@q3`t_%Z>M;HeQhESD#>K1X*R}4>w znmP;>=j4=xud*6Yy>Yv{UDle#E)VmJQyoQcl0U9uDSPu}dsUQ{@W!XQ z*M${={AQXgz9!9BJDwog>}dv(p06hu)}N?nmEKQhyMc(V9Tw}GbVXocb9vFI#HZ2w zp&TvjQP87k$;T0oupgJm&^@3)-*!SH62ra_*;pKlL9Q-3ag}ztb(a+sUktt^7lmNc zo?0N#_Jm1)btd=3C0RB$!(P`LvG-s8V4@;kkfgC& zQezA&+WY{}k<_X-1NR;v@7xtpx;^ZZw3}ppbwYZ;%*N+3JhNGF-EjPK(3S2UOvZ!i z;lSXjVjSAZUqGAbL`MT1oU}cm{WF)4P0cFiC)n+W{{R|?5>tYVw15>6KL;Xm|G-4Q z0-FLez=kp8r4F8eNfY5WNEX&JLB#gnMzw%Br))n?`Lty6@e#4@0ELfujc0|8nPi4Y z$WP6(N)@3QG{fPr4tjo!s6xVE#|i1zdj+yoNhR)p=}!3)96P+&yyUr}UO|f&kvvHj z7+sQyy|!?K#PQtaV_?@~>?gyB$S4N^r6T%w#o7(^r4QA!Ry*8TS7G8wQZ!I$gbu=y zXY&aJLe?XagpLa?6DJL}o|s4O!Hz+hIo!_Bp!FTdNE!0CFc$yW%eTnfou!B&!@c@2 z91J?$3!qxm_f$=N`+O)Ba#49#k+p_|7W)orZx`xMaiuAV5)Eyo>KyC*&8!-TNxB}| zJ}R9N{in!~1Tbz^DH&!aw7#Pre zHlBHhcN+?03=%GYnX^COqF-F+IlRnRD#H_tvsix%^R+{PJVY}KgS|zYEvY62=6XCV zeG`P&bMy`IO8W=zF4o1(D~W1H01b-_iwpDKpiaus{UD;}d{5{gG{r;0X0#Ubs5`@r;2?EHU^$5?VpW;h{08#0wD=?m|DLkO`qXKAsi$a6Y?Ig zFsiy7VJi{J^ZotCdKFMe6aFe%SgtVU%_wIbEx7)E;Cpf$Uo9X>ZMeCN*U6%MD;b*u zN);p+C_V7C@*VtJW{e-AfI5W^z>_9|dVDV%;@_Qe0dBKINKmUcc-AD$f58?_q%Fu4 zL$M>182$lnR7g1Hga4J&c)^2pKYl%k`=57$tJeROy?h`aQ^4(3k+ar=|MO0#hW$Sx z+yASxwc=g^E_O~t?ja4NVDlT<-XU6cNNJ{3FIK{tE<7FNZ(Cw&wp(cFCeGfB@%@uH z(jY-v0d1Hfx(GBIE?ur?(Aax&e7F1gBF&nwlShu7XsUHj0x^hjX7A0;y0t5!>0y8I`bU9!;xlXxM=(vG;1zPT5KtkW0T_jF3Rc zIA7)^hy@~7rcs=?P)4m2L^Ip;T}U27qT6ZF2)`!zhak51L>>bfSqqXl^sc;t?ih+y z{xT=O4`|NXa`|c>(!8#>ri$eX4Pje8jEDp(f=@eVGy`SmlNi5>e)CbvbTRzwn(cZj zA~vE`)wq4Tz#}XsgRQQ#I!cDKb2}7}a~hhO@6QUeAc%dsoSgGgA{JGt)qQG!figA! z%r-|m7qhHp53kW@Rwy0ngU0*)si zTqk5YG9RT0w>hWQDZLNAig4C0dR_RLa(}|nCjcM2*Zt42pGJ@Huxfk5q3cQQBj#Z; zk3|oc_XepCBcFu!CQH&g`5(mRXDF`8f65fLPE^aQq9^+3mPY#{iSHYaR)ctme)7PZ ze*C(eRuD3Lof#oq4l=f}oHV!XLurO33YRka+xbnbH6PBrEhgMUbd_iYZYEv+nDOy) zALDXlv-bu_UJ430l4xRuWwiiB=?d%=R^W*L_T9p5MQ-0#%`4}uju1LePykB@HxL0{ zs=QSkI!}A*PW?^eirqN1bJna2?{d4KL~Gj|XnW>ef0bLLDrO%*_Am{ST5F(O*1_Q; zS5-^g#@1)p4oCqy;eaDabaTl8jcNkV63Hxd2c)3eR@*=+Eie0O=iqcYeMjb4P+a_R zu%a2T?|VRlt%m0##rKsrS)XdWK>}9YOA|7s?L2P;KDSnwKW+Kh_J6$qVP73n%1A=h zPV#;OG-E30dV`Tt^K3Xj8A$pFJjZ4Uq_U{%t1{Ix8ovO)`xtV0Ov z6g#8YastUTW#PYvzp6a|;O#WXH8}+^o)JJtHG?n5wpOoMUpZ$3^%Wu5GmgaQB zY4ru0(h7)QVGS>(uEte$_mn>qYCA;Pe}wLf++TK>&c`ST6HiLyTHaTc+q!cnt*fuz z84L=7ZH63E2Pj8-<^60se-JxUN~v5M>o(G6xffgvXMwyvYnLWS2J7=+@Q604%o z2jH&Y#Z?fDHpRrctc!qq#w4?D7$lyC7v2ONGW3a^o~WHd7jt7x1BM{?ubOvWoL>k0 zwORuIk_eKZL5IS#vSMN8Mm1fxt!%5}xH!vUTu#EziG>xC%t;apYSHz>yE*zwMoqo3bgta zw#hGV`vg-BzB28CTRNd1uSSSa=&IvJ92zLN*HWs<_mG&g0Bv>8Y=LpiZN+6b-rwxEGgRu}*Esy!mQ9 zIn}sL>y!R7V-Na0+CWx5iBPq6TcTVU@oATL7J+Tz8Q~_>IFgraZVz;p?`V5u3Li4# z7oF%nx zTyFkB!BR`W?DdTOa08Jo1`nEwVnGJO}_pw~xVpd0VsDU2WSh0td-ZQfw2=(rkfOkWP#6RA`_rVS8Q zb`~NPxwGck`NBMk{uy__d#AG_oInBwqst17q$w|qn6vk9J&LOvPJDrvLW(jjAkuPw zT>#Tz=n~HgdvBC|CtlbB95Bkce~1?tFP;s}{Rm;(ZZx~U2cw~_NH!dMzTCA+TmiEO zIi?+I4_q!f7ainX4Gr$t9G^+g(n;Z;k>yQ+3UB;gFlozJvQK!Yh8{ilI1y^T2($WB z$VMW`n;dZIgN$XP!-|fgPh7~+P9LMlpO5YxPtXWGo)I-}Gt@VrMuIGsxg1VQ;3}*U zSW5WLRbqdBpYIMBN{#y#sNZ!kVlZVw#+;gjzf-HNSQv$l2JM2s)ut$nT;hB zLWmAK8UKPKR}#z>aTE+|^IRenB%mP}GJDh!drK90(PE-gUQjFJ(aazOxaW>omF54FkfL!Z_ZXYE z;%(veB5a{zLdhtHVIqhVsb83yo8K;iBi+`GBOGmUg^Y7ioe(BDA#op(+v|+ijVC@J zO`rIpu%xhwC~bh*KUnZ(hV>IZqvGHtTq_2NfinuXO=@Ryl*HkwS%0+`_bxduWf02A z6=8iV*bj!3h>7*B$k(8lqX)teKV)Piu2M7E)g# z?&V-thExS|vF_LH$Omy{h!&R2JIxNN-?AjRykSwcpc1d_b1aPs|0uM;f#%8`z^T3| zsKe7`-DK=n+RCBFlJlnr>6LPNSI7ax^~Q!)3UShS`6IP-XJV*4o|umoskw~x>Q`Om zyAWoQqr${FiMLRgF2}d2k3nStYPdsmr zI)Q!DOgHI1(>9ss=?FQqp!)H^$O_NI<<&6KXVt;>Uw$j-Av_nvdyJm1LU?k5rChKP zu~@zlJ#~T3jY0S+9);jh5M1zt)DFva53>Y2GSRm9@FaB@H;LP*;~r_iB-Sxdlha>F z@YZ=l@LyElz6z~-tS-$oM=GJlkpXX&Xm@#h%ReXO_>Q~pN4ozT} z_v#)MLEq)U#wj<#vc-_1;3@RJ!Ow>^J`r@qsC)Vd@rQ8BQJ{VGoSoc;BaIUgwu~~{ z+p-0)Bd3(9X+S@A#@rI36D?rzS+(EYYmCo?j=24KD_!UD;)E!WsCA*B4MFtKQ!T1q zP0iH%WyxMw{Tx>lOkQ&%*;;s#jGGLmt#{P*`+S6H>LwuhUQcgX{i%APhsa;`2c8wv zV8>`z-7TVtUX$z3H-5IpY^C9D(m$ijFYRUYamtufAtAVDM-V=Djtqr_QM#YuxEOlN9xXaaTG?4`*l9ze8dq zDIZ>ix>kM-KtXSD=%IGhw}l~fzR=4!6lh__#EC5X>OzlI_G#ImOgTS7l*Ay+Mc&`Avy^{PkBF5+{{5~gXmKt^t48& z#b(b`M4uz+qyRE@DQZ-S=x-q{1bzXJ<MQqDqoPC_RdYT~-%UIurCzmftShwk1nGVLMGVd6ZtEHb#ko zA!tEhb|oR0nOG5|`l4De zQ9()nly8q=cr!Y38Oeqs2e-x)6uB8F!@t6 z-4Dv`{-P`V0+USU@aIrIB*}}ZL>^)8Mx{ml?DJqa02S*(V9=0y7Gl2~Wc!zgk#3p2 z>^?%7Rb)TXzbL$q%~!q=k50}-jrS1g(BS;|@g&)1 z$@guW6c3A2qrv61-}h+g3(`FfjJ%LrD!-vRBIbKeQe|9;wo9zfgw}ri#FWQQheq}c zci&r1W9lJCH-w~g`oo-V4sr&m4#jI*wRvhicS-tVb`$DIzi5Jcy7p&l=Uvs!oa1Jq z1JzWwu`@o1ExF8Ou|x99Lt?wq+Y`#7f;msG-nAF`XG3WlMg9GSp6oG>fJhWx_TqjU z?L|E)SDTQFKgvkN>@u`Abw_&d674t07W9)H(%?-WJLgmv_KgTH<#W8^x6jqx^RyC@ zQ=a`|9g2FPp;9588V2*5WKWJff*t$vV1cJPglXZjdnidv6IC@*#vgqV^lcvMN2O-P z(^7*1y}Zs^D347Xcw90Kf1D&MQ8|l5C89nTOSD*8E+Yf6Sh8wi8xGD)D3j3U( zRA90tzGZ>?b>Rc;#$qjFS+O&BfPGpge@fYtpV`;c5#Iv~w!)0Y=of5+T2?h@c!~XR zc5;-aFm%4h>8deH4Do+9#QPX?>OS!bOYWt3xfY?~1*sMFn38k$#Jrj`!IWGM7YZp(b;_p` zeY{(FBxn-ePn){mIo3kn)3sV1)}}*Po`?w)N7m@lFHbYhw``MYLkCrx^H$IUaENCL!0 z^mTkbjo>Oig8K~}qt-00{&Lj_CFkGePghxn`P~f@rU|b4{w~s`P6z(fZ-XATcN%mx zK!3ClL**Hge!n@ebw!q1aKxpmsgo7yeo4DeSi>u2Fu#t7zIDt}D9_Q zM^bG0nsw))``Ps^t6vzb;~=fTU&+Vuo9ltMX(RWa|l zHLJ~Fgd3VfI;Rm^U%|fo^KDnxwh1BC0}Jy9*TU3W;YT7VxU4c_OUH$?B3`emsjkTw zb-2-k+8thD8EKMe*PGCxAy#K+ST>uyblyu|kxc&fs_263jE=R6OtWa{X}3qTVRW^C zdCyhd(4vH#tXy=M(LI^#ggWWG=*&BkU(11pE3s@ef32=ZhcESmMwQ*0Z}VDzS+_DfJJgl^bhhfL z$vKmLpBxg~9Fp8(yV!H~ye~9CnEcMt-rc45m@$7>4K~qiF75B(w~Awg%0pQQHLqYI03wtX)oc7Huv5m=tBV;OuCa zY^nXHGQV{<;4##^<3=JlK)DN4f~dw-8?T;_3gV zSqpk7^0?1_qUv5lnGGQi7d#LqFlq7lD=~zKJ_oJ+nBwpaT-_Be9$>&s5D_0{JCA|z zpcxPKCBp$qh0UAs>|NNQfhXLAAw_EWtqJv~B)Ci>J&>qR5A$qYsh7Iy(-zAH(UH%@ zQ6#>5fva9mZ^^^*f?I+8#2RNODRN5>2K9Xa^3cS4s4oF%Kn+?w;d8xCt$!5DQUPk*ilZCCtQhTK&v#AL=EQM*6R&kftnw5{=@BR zFr45QND?2Ykz^p7JVkJk20YbY(EnWQ65l1kMOcxF`h!HVz%T51^R|__(ZJU#_}I*1 zA^zaEY;rXF zJVmY@#9~Fdf1h1SC|^i^#{ff`69CD2jZh|K<62~5nomD*-_Z8?aqbk!2Vnn+Bm~!K z49&WZLPN5kp`FtnYB(2(nFggiQJpDJUdaQ@;ZBa9Fq%j{@Vx=dU=qCNzGi;AE#i@K z;`7&05s}i`mW00Rpxb!T%Zh=i(!U+HZnwZC5~HqI$n2@Z;jmo{#{Ll)dj(9`>qMW$ zGi|mxZP3oUqhG4Ig3zCeD0aY^n3~!4UbXyH>z9V$whoU+a2%~n!Jj^<}CCXK?6f|$?u9+{b{X)NDHL11}z$0pd z;dIm=lc9+W70m}yatCqy-l9`rWWhg$V07@{$ApBH=4`A%tjH+BCVpkLIon2Y?z}GEII)`uHdFIQ`(1=W(;in%%mAKZj62pJYB#{ z`4lN1^m}gjd;G7hy(qVz$`_j4HCw#y=CEu8_hnl=Spz}CX`sNaJ>dbS1hlo`yw2R4 zPpEtx=@34z|NG$SJ{QHFa`;HY_X+s{G?DnAKMOq(lm79G z(L{QKtKLSGxq-{TTLl*nmyq+;|Mh&XrGr6uFihE@h(`q)x7$7lke}n z?pDPopU{5I_#5FqtN<79OT3XnZJVI(; z^dQ7vRc^Di8+-D>Gv7w~L3dxEJ4D2zht^cc{oKJDJ}g<%An+*U#{VE7KG;WLzR!5~ zLc(YA=P`u?SRs5JK;Mro=V_2owVLxb@sJmxDh;}u+m17wRmM;dIyb3!q^p?l7rFg9 zo0b-o?TIiy=Kp}^#Qf=N@mmz|tTdr^fj4T;{&+=!ax^_@4o=1R6V;950rdY-;L{d4$#wT6V|%nEbhJs5KsP4u-hK8{^5e-==%{ z+0MJGWTX*F)~&^smd2f1%rdt>2H;)<$diBXrA0$r?~VN;QhFPP9@GlH48o;yVMFZ< z48)emn8~$Vnh(d)t8V9tW2n}s(pMdo! zd00)AQM{FXWkxOTU~74d{7Jxud&+pjf2X=+p=;&i0}Z-#6uc+H8?`@Gi{SSYve)Ls zK~;5m`7o9t9YL`_ZGKMw^5hZg6+=D+K_Xajdovfin{OUz8O(RTGHJ`M+G%+d=@={q zb}B-Hgo??&!r(Kw6ok%N8L0r+@afO7-z5jF9)LA(7u1lIT)A#-hFE`0pd)%sPJ@IG zUrM=V#PqJWa-Am!WlbD_^x)V+Pz8wQ>Hz6XLQAI`Y`_WK0BhYYa5om_=Z{SG$rhT6 z<$jj@jtkZWdI?R)$G3%mT67gSY(<`J&m0M%0RoVS!5#R`46x`ZzkBD25)kurf-7UJ z?VrL=6L#Ot0;$1d1eXKC-tYK|dVdY>^Z`sm_!Tb+P8X%-lH40U+- zYge%v06(n#+BpDUr4)EPf0GM_v=d*Zg0OE^OUFFX|h7DP)>KVrKf z1o*aYt~B?3K6t(7d{xc#CsI=9Ia_mzdSB$nGjMrt2(Du7!j(MW<@->`V0u$94sLZY z^N3JO56A@({c`M8f0Uho@xR`j!r}KTxc{)udyG=~QE3VgA}oNGQ#{j>_m;k_*!9^a z3TzWzY>PHxhh!Rj#*pq|0Ir{iNy@X^mx>P#-6IeQ`fkHS-sOzDBJGTxV ze?ub94j2@tK^2-Y+>eAw&i@B)yqWd7*|P-1{>%2J?110wE&Yw4K6KU~gmoR%3ta<( z)f(KSJQY+iDlRzzTclc99 zF;53HL8DpwVWIh9S+>$vr0TN?O@X#6Lc#7A&U5)6d#)AWqT)ed+Hu2eoN)Qc7K=t^GkMW4JPs}yz>5YqeA7XB z+di{cS7zw*ud{sNz1Wn(b5^y>sLsLx_8c?>S~jl)R)T0#oI~U9fxIGscrcb5u{^i{ zdJeAa@%bLiR29H0nG~N=dY-<$0iscgvyzK2NnG(uyx18fq4Dhi?Bs0|0SX~0={i3( zp!8jZo3cvkAO4f?=E;Kro&IM)xsV2Chh-n7YrR-tZh!7_s7GkWa3MRDB*?6PLi{PA z&2_T*FbGDi*ZA>?BhKhO+$4G74s@gjsJm&K0R7X@FXXH{#SO)9%iR#OR3Rt_^qdTY z*CYqT1f!7NXCm}rs_gkFp?DZrwYxxX8k(i& zUqYAa4rWN(Z1jFY6A|?s6s~?q6#@CfqE5Y@B0LY{FIC@H(J&a4Dg^@E92$kb8TadX zFeXFDonv#rak2+DkMg3HH3Nyy0tkSP%U1rzerWVIdEp}WF7XlconglE3yFgJpgwz5 z@SRwj%ZU9Tm+E5;|80<}IwOTRN2rF@c>j%6odMyrVb=tgt#HllS|JzkVmQak@YGTN zO;dCV)&+qDkviMsKM+<5-XE_inlihF3Et-e~V19C0vgjrS z!lnhN6?W|Ir*PkmQY$<&n`T*zHPf5`4^<&7#%H0cVSq^@C@faFrh`TY!gOY$K($0M zIeqF)w-ggf)FE$sXQrY{hkqwiyp~-sE`vWMOqvSDw*B-VOjSlWg@gZ5M44`j*ZzSx z7GGy?2Uzbe_8)>sGA{lp#dL?0i032LD5S^;!?9usWVC+2FM;oSEnITIlUhEUYINT$ zTLUZEBz9ImTsT!xk%jK zECd8HH2ApyBhocbC-@o@$Ft+$**!)T+ZtLH)5Mu_SIAScu=v-@4=!^-qXe23%P5oX z^Jh98>C*Eqcc8F#{PhRwdy7s3`($>P4af=*(pQIq12dVc=wxn~$NLp8;F4oD#*Y9p zZlrzmz(-M!#cqkXWbC#^;(xp@Bu$m!Z|Mb_r6k22_n8p7!F*1!@pXCQsXzG+o_|8> zZdlyrjuhQQ*yx`tNdQ>bjyG%a4@`yX$8*+q%DJF=t0Y@Uz*~Z9!~Y&d7QSK8X@HXk z=Iz!j8}wd&r75$T<=AZJgXfoRRDlx#EKOD~Upi$}@t7rS%`atyrOhORNi5>n2Pq`>d74+st6*$M(bjj7EEy??Y5?F zY`~i|1F=rvIyRfm;eHbvB8mVW2N6S=BAKylXf-eHAf~gP*RUv!8~!_2ix2krNcUHo z3jT3aZ!(j2{d)P&51!3|G{cb*tQE;p>N_DsZZ(lC-;Ik-MCg7P4k#ra zE91fQt!wbv&T3ADGSw1KB9nD0(g21^2IW!j()T=>HjpDd7I0YR5xjO{MsvDcCEk1W z@^*0JiSLHF$9VDtJV{EcD<-0bo;COCR=h}w%$H3-fq2sXAu?#*OkL6s&(=s~1>I;7 zCcUiDu_CP3>JzT}2?^oHAlnfzR5{-!ugc188UGC@e*W?Ghn&Ad`3_>NJvp3_HhEQ@ zsbg?!*#{N=nz@bp7sH(qv<)qpk_~s}wB7v_W=;|bBB8`s?E!_L{@_z5(DaC@JeKJM4L|NnBu$+;H%HiFukFl#U;YMde1)A( z@^7a8=HKkK{Q5tc`b#kAzdLff|IO6@ciaDU@;?#wzmWR>Cr~;*61+ag;$1Y^yP{~R z;Rs8;K&%8{Y)xKBsw|0e@>F>I9UVmy%+xc+z+|GdvPvh|QS)eL1 zs{@R*Q;;QYbk=!4+~aKBV%Gsk&jmZ|7Tgg}6I%gPT#hf66@zcy8xc@$v1jqMm=(}W z`bff(ak-9S2C2(vxjByX|8Q}y(yTT?D)U@3g zP@Uu>`vEL)zz3Zdp0L{HVH97$ zg)N{t>WFD1`uvm%5* z$j5lmwBre!o!y}qRl5&pr3Eq3U*5!_!g;4ElwQq^bi-zy+5U2F!ld;Ao7G^-YP7h{xcE)6CDi18aIV zNPph9Id-(jGhr)51C}`1tINE!v;H=rV#^BH_N%~=BwXV%ZJBJ~1fH^a0BiCmH1o?f zZjOKfaTZt`twC{D&WmSoqhABuzX?Cr1;C`2*@F-FHzh9!02JM#0?=t>QrkI|9FFyX z7i|i-NOi2aECq%i^1gJ|TZ(^2Cj@b zcxxe0@W^KT}8mbKrKXC$eT{9p# zSB2j!A`fAqs)alP3rsx;vcrLUlnSJe6@l^syQtI6$psq;VF03<&3 zDcSN9c&HKpPqp*MHH&`8-dzGOs6_`RkHZcc(jNMVzh%w5Q&y>S_UhQCKj9ciX#c2a zm}bBHx%*!FpOy?fTJMx3)W%z@Ps^ozkm14z|J$Vy&XohI13;FldS1AZVy`$0!0H|V zmK>d+xGSzafIuV9>J(t=FHsfrbMCet-vYju$NlUAohx7z9edz4 z@725I{Z91*0NC)39#vIl&XnoM_pO3jnH4EE=guHlHGo62c<nOhYjmqpHopry&z(3~z6Yn&Oo6D= z7evC>cva~7kr~@sM1H)2KDPpXtW}gW1@TP6&n9B}-{C1|@05g$;08%ehX&_^eU#st zTP)q+*pKp)pNA$_Sk!#L4$S|yQ04JRE&!rEu3eDblVOpA#&-DORNJo`0Y*>dzLpoh zTB`;%W%W1VPT>INl5ac!U)8>j#G5J3Cb*%}_c4VDz)@1U<{p3&2<)ZugV(5%yKQC+ zLDfLGk*4AMj{*Y5gQ58J3K(K5LFvG}r3Ovswp^9hr6I>tI0S^-jt#2;WYw4~);65w z^|-Wgwv_M&r|eV$C$PuUl161ZINy|eW&sZWdfupTe`wv3ff=|;U@WNssH!? zsp8z@nQs3-UOA1CE$&%4A426Y=R?b3Mo7}(&d41@4iVOh_`UK<>+8pql() zotL5lcA|K_r_h#7wjWBMS+`XDf#T#FD_Sv%Zg?BpXV?rDn9b`!^>8@Hf$6syy3q=M(K(R|q&FBPdy8 zzBqweK6?y`mvFtB`!1sSusr;f{Z#JA)IoDz1fYsFF^3)~2cMtI&;&qJuU{+ml8r}T z^w_r84!4E;-ADs3?}3%OyW-Fem)T**C6Mf*#FO{LV@hr<#D57Wf@7aI%WhRyuvnyO zpq_f}_Vc`}Qzc>OHP4GVBCBjy&x^}ra!ZXb4a@rMLAch68NUbpnc%3HHh_5!z;kls z?CZ^n-aJW;S+BT)zFX7)a!kw}%S&_g*flOp&Il+?!#xrk65R7}^;%k1dmlIL20cp0 z1u_T-`O$TTap)QV{)KTwm5-ZfI_*yB2Srz+^Pq)NOq0xKVwDA=Q zniLj42UiFd)5EBt{-;FftN&T>lfF3DM2P0NfmhN~O<-^p6}8o!(2XF3!>e?LSBn{? zO|SAa>k89L*uudlKvn1>RXGF#QlZS?RAmnmZPHBQnY^y740N`a`#R|Cu?UJyV@45y zJC8vk-OyIHuKi#Co|`S_=!DKvHEL;vPgG>Kf)!W!&Ut!c9&Soc8{i^!vM51YpDNi3 zOFsWO{dW3*WfAgfJ;Q0jdTfuCGKiK+v>V!SK9ikBNasvLJ(T7Ph$vNyY~&JP`vv5l zZhr-${6yXn`b9e9hi{vdh%P6qGXAywW*=%jKT>s|V)$5hOienxEv1c&tm<~C+4{m` zPmFvD*M4sPagpPrMBjV(gg7h)iR+WJ^)JIUyvq{Fxkf-0h4pf=Q*^AXA~(( zklT_4bO=;vheJh(95)nvcpxnk;OON@W++&Wy`q?=h?;$WU!RA3s3ZMUDy8VZ;CF8d z7CBYb0GXM01vJ~67vIIyT%>wdGH$so5y1TSkmcrCx^65i3Q)Y36 z@!aS2BHt1@kGMw^-P_E(mR|E0tjZrBJY{I0_9)NJkf~)H3eCj#zU0S zdMuMKb70T;qy-cL$1(6OGxw(ITIH`cTg($u8!I^&zEFQV9t;~K$O6~*k zM(?;m;j@x}KRY9#&Sio^rUYDFv%K;S{iW5(Nfno$B$c9vUy}RH3v4#W5qT=Ts5G2%R>BflPs0L(=okfDZ8mW5N$t zgzjlFj_qTju-haczqaYz_vuegAbO!SNC>BC#1ywHboCZr4HqZ*oP$(s7mx}jXD$F& zd*t`JTFcDN{vRLux?K^9O&U#MpP^-)g$D5q*p|2x2e~RsdcAvE=6hq&Ve9R0Ip_IN z#vk@~pZ~P`UF+IqA%6DJYl71HA{qVJntTdz9Dx&gwPng=w@YFy61iz(S+5BuYwbAR z>lPKg!tOHf{QP!}utmVk6Fuyq*31LH@AP{2>RC&&U(fRg0%eMaS__+3Sx&AiV6Q-oFy|enfj|qvPqu0(-Qdbf&RVuY8gIPi>U!+%vdgp_;&%cWEYs z)s}biJD*`Re{C+(C*W#9G1YkrPbVL^PH>3|kSdRF)(^xwQm@Gnk!+(IbON{hMa_;)4(- z2!922zmB&a!MCYKS#qhmTTM-u6k^XW-R^hG`TC#wmVuAh( z=dqkEc7&olq_wu6S{nKeH5&Tl6r%DQhB?&9rJl{iUjoOjUOR?rmu}~AF=`i2rU<@d zvjo*m5FIvWeTvwd`$R9C3P~bAyjx#$a;*h9wQi7{T6%!8ZMD8Zz+u&wa!qZRZa1ORjsf>hvH1_jowY1Zdy{Ko!rI|XqhsBCD%se zo#gEb(R=iTn|U0fKX!LnjQC}AWWq=vY7O-Zx&Z6b+PL_z)onOhpNR-*&+#88NX408 z9O{|2wXD-A*x|2VQ2g@@w)wBX51Ux^r+YC~m>x`fRRW z7cc;y)b$e%F>>GQeQn`wJME@wE39>;XuurQ&xEWfg;O~4789mFG1=)oR+Kw%pKl#+ z+?{CWEr0B$6ltjKmYqwT_?8~4qx%L6VLgF8Y8y0E?u?LEl(u#D( zcm8F_s>0P-&C8CGi0rFyao>loy3OIS^5^Q*ukKIi*LH+d z{K$wm}5_AqiSO?cp}v>;HB7(DT%pXOC5)_+JBtK6?MD3#1vF zO-_-f?A~`BclJnRnEiT<8ahed(w5$-cQlwMzAd&I#OHKH*#*@pOaw%dVQ-#HORpN{ zpmD&}27aypE@s9>rw7dB&v?riwR9;7bq455>1rAeo|$iI+|Ih4PXmJLq7J$W?>GE$L-pVD z1Hm|^v@#6*#ld%kEl~mz*QwN+egBzn3dWCL53v7fQAiS@w#?YN3~m3=pXOFKe*4d6lHPBzcH-h;IQB*$;mwSG~URDjXP=oy-NK+&68M2HY}$VIgrT8 zs+}K8^VWi>k3us_WtFx-PBS`-L`j)FK_!ep8@`5;{ovn6eK}@*_;mX)t9QR;(7&ho zXeQUgX!-s!W_!l|WXitc(CE17c%nw);^2omVGJD|MNB@j0?U&3y%-{=NI5-y#M)`nlq0x{~m9}>wn)8i4H{MYyPRP`uF{y1t>MF z`-#`ve;dlv1TS9-HM~sz_iFHA6xX+YUiN=G@e+}TvU&Z{(cv~!O?&~>e7@EMsN}_}dPMH|5~n8DK@!^7 z>vv@v1&6A?!vC;j=VCjc z)tZ1@;y^?1`7g^(-lu>2@8PCnGEXzf=i%kkdm}b@9D!B`_`j$nP=HT>cv%V6HE&S!(iK6%Qf?~HD=Yr=! z%x$bn-p&y;R~Wa>_3KD6aH0#@Ld~A^h;{^A?&t0Vk^7n;q-JvR{9CUswmbcfr*G6x zKc8GNW`4fbvjBeQT#6TP2_msuTC)BT>I!t&ymI!-)62ce`EYu&Pj-y^4>l@0&DzXb zcUiK9{Pr_v8Ma!^wp_YtbVIwZ8#pW^Mlk!|!+^OZ_k0x@AfS|I2i8faMo)G9tPPL6 zYh-ss_bKCao!sX8vEH=MH0j%)HmX;Qb0z(}J-43a(sQDMzv?9{mbWY=K7#x$ZCr?U z9d^oXtZ2PF)$5tPJZh*MK^t`29NlO=>86s4SqibwIxGLQ)f9E6m+b$W_vvb%&};QG zGVz@@*<;Py44!Z1&-Vw(2^rlr?yZ;BaFEt7zKCFOLwRmg^>XZO*Sh`Lj2;9tGfy6H z@^IXD|7&MEAv43DbnBcQaKiNV(VGg689wV4-vS%)XYm(Q~ zN*?5st4?eoo|^;*9M$A9qMukMH%`l{w1J7Cub=flD;JNVW66t`{K4(9&N&sb^KtcE zX2-Lf{j8m0-DV!ls;YBzKxeZA<(a@XX8)+J?q{8#F-s67l?F1Fw({2t&bFLec&oWr z=gaqCaJp|@p}hXn9%C<)e(2km(QwlH_pDo%ihqo#J)ZH2pm)Xyw)EU}oTzpA`#Uuv z)44@#qjB+->u{!H{jUz@tCL+$t9)Axo;1)8S2N) zVsW>eHvNF*c2(*?=q9e2DeZSnH*SZzk^ZO&CAKjHKd~5=4hB4^@=W zZKpSDU;dE;vu?BKvdf0de z#+gMSkFWWslp$a@=4t5PKbicOUy;3bIc_n3I=kEszAHwgHg8zE1_$&$n4y$M*>}{% z12{Td)$k+_09S=Qn!x^$sV7PCNZ|y{0I~GB`AOqq8NBr-Y~c&o*5VPd(?u z7B?F|r8iPALzgH~go+rv(n?CXGFbk@vxZ5hPdgvf{dfkz+2y*9_w8qPv&U8l)gkA1 z0?5AqP6%`8+Z25swQB7uX{3g;xU{qHBK;z?se_nzK#Ls1R%zm<*hW)_mqWefb-vrX z=r^8QUnnU;^CKCp&pn!3J)zy;?*`62IrTBHKbU7Nq+k0lKbVE({vEJ3`zv6l?ul86 zAo`(ZRu&#tt6EHnD=+&p_Q}Y*%G__z;U*z9-d{h|9^CS#O2eeNr|0Q&{uW7}cIhM? z9CzkSi&cu!;X7+r$sk$beyc=Q(Rti*+V_aVpB&-u1Wi5`=ysR%OKG92qP8=K(bUp8bCvK2uB5ue;bUq+Pkfj6N#&Tm{*^t>U8k!Dvwy#x zICtUlt}XRg?{&wtLBIBA=-j4y4!@T5qpc*sWvh1Yaxb-&fm6nC4LNa|(tu$<-_N~@ zO*kz*|5P<6d9<{PHsQn|h$z+)AOw9cz&6Rr*-=s?!h;Czyq2?XbVGPwaQM8^`!l>!zgvv@+Y;Esdm7an-g8>)oPjTmiRu;XX)RPsn{)gCsNf$wf5!u zF9MqNvYh5?1k6#f6`MDPKq%Y}HonfF{3r+#sKC|=z-O?{< z^?Ww#-khM$PR?H`CBc$uravy{&>w$(l7LW-UJBt1Jf2UtiOg)9{%Y~XLgp{Hc|6K0 za^d}PeeX}L!~*3BBk$9Rw*K6{LO(5MQGS`Uowhg9nJ&)Hq?l;x5jMOf-u056&v3SJ zVB0XuLYfCzL?;%*%O2u}vnu@?i;I74reB%tad^h(b|%kOu|xUAg;hFgTj{R_%SAm4 zq}ruNI;fNqBs~ZY^n`UW%f?657fF0%+8u7P3=}0MCx%!TAAnU5_ePIT6p$Uny|y`f zd=Yw7DG{<0%8pywr8q|;d%|k9daZ0#V%tldS|L&k7uDT zRiLd*%|u_6Hl`2VZzgRkY=ibc$1i!nk^Q3eY+6u5@Z$?gx>Cs}K}pUN5R*i;c6a%` z_K|O^UK_TH^$Iw13h&RC!54g=9#Brgk>=1xe{5_^w@J^kVTMG)LVPF`wb{jSptSHp zMdP209sa-H@0#K7ysMPuq>O31OT2aA-Ugq&fpQj}`^rL*0Heo^hfi_GjUA;0 zKEc-}>zI@0_tu=^$@>~vf#BOYr*PFGlJ?emISY(EDWm2g0s5oTT(?-AkdV~{{?%);QR5f>sO-#S<2Q3GMx-8Cd z){9fHSt5hY(x=i_s@Ny*7n&YXg>ucXg|gu`V&u&erALUk;Kf!|H%C+TaAw|E>pUp# z;>m(#N%$o}S)>CxliKR>sl)=vOLAGfVKz&*sOx1UPuj_ejUdS&8!jsRwWechxKvs@ zKFO@pk^GhJVmf$2L8s;KAEiL)C-v?pod(xC*Ek(4ca(XYAG!NXBGiROl_6K)=2gl0 zS}oAV%Wx1H^m2_x5dEx6Vka9f2@1zGUR5(Q* zkC%_BRC-o@H)4)IF+aV}#Vg;^Sg>LxzpGJa!^bViJE9yUu6a`+Y z);2k&{HKvvfF8iRsO##uzyiDF6a21 z7HhX2AL{7EiGmE3pVwEBf9(3VpVtUE@=&z2`E+2rcp%yeeZJlq8yGH37q*ss6P3-e zjF9@`rBxBl_z4y*6F?sEVJ{762)?4m=f9J6%ZXcZ);^$CV5v92_VHkETaqyEi52iW zJ&58EI(aW8KQZm-#*?V{3sJDK7b9?UDZ_NUsLmJ4K9Hy}ZeP*-j+!>)XLGC%4a`!b zK?R0lc>vk=9{W^47}V|`bE}@Hq_kSuQ8(gOdxd8h1?(UfdA;SZ%y~qCiwn*(BUaV| zMGD*tLQ)(}JsWIO9zq5g!&oS=xP{i4SYLz(bFfn2R>Y~J}e=;y@u`w6NU=6g0d z`-&;7DN;>dw)w22EGZEBjwPPJ9qrdiW<%vG3`0808r7Fm!@h3x*6TyyM66BWbU%Tn zlInj5dC1mwMDu~n6&4+u?{Q5yF%aC@1KSzMgAGV^Y7A!%FV2^xnDJ<7U|y4b6H4G1 zN=w8+n0~p{5Gx4dfRV)DK!O@W??d_5lxWcv0?c4EZcqvsW^cuSG+Eealt#@J<}u!* zg|wI+Da`^?q73OmvcSXVl}<(~{ApfEp02onwF>`boh#vh+3lGJRD|@|H?d`|OpPc^ z02o8;OHLW$0cxs zcH|LqO~07+Gi^Q`y~ZE#_e&>`!SsM5T!ms^&2Q8UlJS-|nzfG5_xWM7b@z~ps-Bx{ zeXZK>X3zhKcH$B;P_&$M^M{k(9XA;8Nx6SKX>_Rhh(2LTwpaiHa+abvb3Ew-Bxct4~c`J zhn*kZ=iGetV5_n6msO^!{+~&}2?EE0BrZOPlbL@w2n_qlJ|mwXV4}G59L#DH^d8EV zR&iyks+VaVq|Dat@0W8DQTH}$e-wj0eMCR*S2ZKGSj>FWDVw1FdyF<@$Og_r+Jf4J3IF;|yoi=!lh3|K;AZm5_{ zg$Qc7vw}wdBB6#^8no?!c^W1nd4$C5XK#}LsG)YU6Cq`&Z_q?@9&mLW@cjpntmg;< z!ut1sY>Adub`VcjudW|sIbJ7NO~!HnRdDvzZ2t_Tn;wqnlE>U`vN`!R=s&6}wkayH z_nB=T0LGYtkj4bZhUvQ)pw6;>S7Q^i`B4LB(uOIwM+asY&^PiLzyRBR*GvbdDklgC zC<|i&D}b71xyPHwI(N{&Go6}j+jPFkea<-pTX$O5{C3kyLFM`0mk0n3Ef)NPS;-|& z=AHzT08PP6K(?O0@l|wI{L(+i>rZ;)GT<-doZ0SLo+tAWomkRwH0j)WZ+EY!jZ^Ax zU(~ws*~AzD`s93mwlj@Z`_E3}|3H<-u$_0J&D@uMqfe~Ac7)#-5^Ftp%TF3fyVg;t zjKgNzNh(V6X}iTIE#UI6`P||^PzlKGu$TJ*3MJe&KUxTlX zwMJPZ7~o7k8&y$4`~bC8PPu*QzLMJQqM8T$$o*tutmW>m&)!Es$vO<5eH}?9HE_O( z*4SvHp%cK9fZ;(7u(6i`4d3mSi5v(pHsgo%(xXS67 zMX@g&5m3z&O6~-ClG^sf(wXM^9YsB@vj}EqdG_IL3b7)i$KytTh!zV!FUiNVSJ=PX zi_xz%c<`B!A3y035Wdv3TQj(3B=ukuMS1T%3mrIE{lUqx+t9q}I8P{bB6HHO+X8PE zLay~sQV=m?7)r{U?EYc88TRFLM*yDE`u+t)8Cz0%byrV7(L5*1cZQDyfFrXubkE zK2|pHivQzM;ylpdQ3%#HF;G z(Nt$XGy6GQauk%4jtxd9Ki^Bz9B)zH1VGi@P=4{7b;0ki_@Pj*>I)eR^lY&#>OLzU zpg<8hd_T$<1=s}=lBJAkCXTYVeK~#q2vhse2aPU@wvC@C=<>EBfDfjC=S z`i#a&n!;{l&y!)S5L^jksp?-&Rz`m+?V!BoTbG#Ykui`Kh@GtyVh&eAq&V4f)-yHF z?=i*)Bni^l-ck8n!(=mQc`XcFbvqr`28YSk+5Th5PQistp6 zq3}BXG|Sjc9_1K@Ef@$Y+W+=ovCiSE%U$`2yQ~3nH!VA^g+~UV zt6acwqSzir!TQS(OuFg1o#hVLYftk5bz8)jb8w_bCK-Cm?|?Jcdy1E{h|IYo0>D--__$gl zI7S{YiG+U2o)ag#-Ju=C8FX>1#woebWKHu@gC#)LJc%iu5`~S1^5#0?qt`s0#*a+D zW3#k7Ye1uM#PI?;`StWs8G2Te3XB@SVzmz!hpcvG%Y9eE9Mf48lTx| zY%8=`9mpf;K4>^MTyMAa_bunBvuzcvvM5vlx~sH2in%R28$uAJ$x@wrg42a}W!=%K z`mN6My55LTRl?4Ffpj-V<;Fgkjhu~u5|ig#(0mXfQ`(6{5^ISQR7Sb9t?!yl$0#(( z?0s3H@niyrHHWF;`RnvorV6NeMpFoTWjrjy5vJzXH7T71)Q z8@jZw9Lf|OW>N@v-a2X19%&V@n=@-|ZaV|JL7A#38dW5+6pohcMpohv^B5LKKK!S| zWDU|(F6i1`#)O7RTHg?m!{On>vDmZnwPGNb7nykRslDBA%GxD0Xku#dY?Ao1f?`fq zPJ6u@;De>m$UH^lW4~F?(jmT5ULdV?<&3eVN|pc!=3P&qT41^oq!STePk(?Ui7EPv z)zMr*IGQV%@^DmFx*bTSSrU-`JP;MWcmAlQdqx9s_xA9Wq|6 z*IYyNZhi^}ll>d5Av4BrD4Z;WY3X!t2WWkYNT7(*S(Z_9Gn0OnW90oSLU(R>#?KJP z5|EZANZ*|L`&PDHZI~DLl>F(+5|@=0<12GDkQy}~5mclGLhY3DM&3v}$ljM~zZa&T z;WMYeZYmv!2pDc)J4r)llPzl@Nv3oLKv#>d1s&0_ZrWYAXtW0B&z^bzt<;vfyV78M z@p@#FX`GyGSEkfho8R)8<7ra=hZ5;Lzvxh7pQJIMfnKu2bG$lgHK3ohm0c5=C)uk} zXxke4>;$nYo+WqV*GX5-s#~7EJnU=w^(a9@G-iSc-2Bl{?He(V(deP-0!tNS9e z_UuE$acl&r?1^XHlE>~XOIYRdH(VKil9FnUjZX{Fp)KFN-e6BmD+&~+_URu*;f?7D zWqH|s2d5Y;Bsq`+(1WU6->4K-lq}{Li@kInl#NJoZFSrpBOiBbjcQ}tRRUCoJ!mjb zPhOTlp^_L&J=}mE{QT?wo3c!VX|3;9BkX0r0b${B?r5RU1M8Xn&wAPr1R>!k2d>$# z7@Wcn3GCk@Oa=UBZh-r`T<0juocDJF(H)NDB*+5-ba1Q3TB}lnLeB=Z5!m z{?fum{NohBWUAlMgXA?dh%zGxJ5+Bl)Sr_r+I4CPLxz)+ZrJ9+u+Ye~__us?sD8$X z0#<0zGJ!E*C1qH$uCbRVU8Xj+>%THT6JsNmD-|?scxjnZ{!ir^3y6xaTnax{q=1J9 zt^gf%z)tngFmT!Jl#OP_=+K#TuL$h-D*&7((mz!rg8n~zKdyYojvo3Jr@ZV4pOqiB zx!82D>;rAWJZcH?34*23*ygH<{t=+oEEpi%eH3U;rWK`5zwZFKg<0H|y81g90cuDk zrNstYL|~y5h{j5>EjKc}UoRPcy#5Oh428TB^BB82 zMzG4a@fiF~$E^OOHi<&Dg@W?ZjGwpVWs^!B4X|yg$g+4r?=v=wC!_Qns=9-F?~FAV zaKqQ^4GcK2OV0U^a5poQ_3>@DKm_FurU|k|L$xJ9ch+om4cM{QSVL4!yErKF#xppm zU|k3nE^J9L=gVHW9bj&cJJm+DKv&v6!&K^j4=EuF#}J%8i>6D-b%9mj{aE~(Fzi88 zM1Wh*;7MA2hoUM8C16r@^N67~B|20F=G}^&shgB5wb)NnR7S?Tl;kV)Y!6Wb$-Zg- zPa=6Bm-i#(Asn{K7kYGc{5bH2F4otf^{2WT8-oh!fwu^?yzTRisNE+LY5mIh@<~9r z2^AT5CZQR1dCRGt)E^P}gqKw@>hq7=fC+;o zT!m`kuqpDh!S7l0nWsGx{i4SUwhynZ3bV-SBN)annAu&+vCJ`JM=PgUCGg_so7D5O{0Z(W|FvIA zavsHlk7WxFUzGWZsT6ZFiOI`KH8%zyyLe9kZDih?GhnILZuR81BoVSoI)H^Pc9gKI z-e7n&RLPg!nKZSo!s%1;=r(d{(C=dEN7<#$so$rQw0_>CF6J>7g3P`9MTmT5iKf9O z9*R?_?*3$=brh~MD9ZkPGZfKmKzG-2cm+>;)5(@*Vmv!c*9boqk^g-9#VCOwZms`l z9rx|(j7$%kulCtXv4-2Eyc>Wg)Ok`>;4dTy-ieXc4;*;{0Gi#*d+o40caI6D;>mj@s3LU0#>aZ!s+UWe#S(Aqf0Ei7^!sZKY?K*z zc5m$z-={*&gx+tt1sZl8RCTg=GiL9w#Cn%h27p8|5f~5Vwg)MCU9Fv0A5b-jR7s|& zT7t%6OO9NyjLx0Ad+`}5r_qS~2O9M^?>TqS=5Cc{xXF9_Q@o50eW%wKI6me;55yu8tS3Ak)y~_3lwoS{Dcy%nvttyG_SDgt*k&cpp#}tqT`&=J#AQmuJ`aaPXGd zdS^$!(M7sjA7U*$JANUDV^3Spy6=1}C?AYRt{-NVwLW)k{@wBL_ev-Gkk57pBi>&H7h$q^H210tnfD? zmHwv}Yq~Y8zF7JNs{g{idr7$i@6^O}>L+?y-jjysz zPfz0Tr?zG{7TGa=c`z4<*D(u7*UnphKU==T^wM}kg4&}~Zg{lEHFblHZ?>CtV`RWc z@n;{}6_TBAvr7s+K{Uz`nYNg^vA=Qlwr_QBww4Q0$4)6fo z!+K>dWVUw84^*;UI$)+?xWxZBrT%g2VCjaF;45BM__!SwZ1?Caeg2|}jAd~3!hg*U z-)gnH3=b{1~5-V+F{B*p*{ z+pCrPK^#`<-On_1KPt2d-{@t>kjD)eKtHI)&HBlO8lPFe7;nKg z&&4A1Rb;N1cyODm`v&2nPl?5(h2P2v-7XT=!gR7ypK_=R6;-R;d|RuGIMh)ddm}62l9k zRL&evgzxE(Tr#kVV;mX#m}Lomvbhgx=fOdd4V)Al=Q-oC|3e*bi{}a2^0l7tnI_0z zPv^47QuwaNg?TFV?nUH=Hf$lkIWirFMeV?e=H6Vr;6qFA)M%RZGxuz2Ss@|H(KVs< z{5OAG?*nG9rGy|+NTo!HbNx!%Qq{I#F9Q{)$5B&XjE->Yd;Wa_8Td`lp|lf91mJ_t z)N6*q$5YP~cQJrA63A`cophku22APELfz|TV1?@SWHdH11UspdQ*t+|60BX%X+39- zqTIE^e@YSELS8KXs3oPVw|=YIhuJIFZ^dm}fKq{^U=Qvqj6~&6tw-IWoSrGWWF1tL z?N^lKo3>b5G?xSeQm=ed-vnOul-v`rl7V{_JM%; z=GRU!Z1rh`kmvG$$t0k?+2w|pe+L74K3f=0H;U1z&@s^MpvH`S92o*n=t`jQ5?1tX zsheJcps5hcZpPwwMP>;>le+8vV6R3159wV)EK0H1VcD<8D`^xNS4028ZisncT5#~h zIvu?#vxjZzEw`JGUwN4GA7F{?+*RoS?OY6rO(f;SSLJw_?5=%TV=RU21RZNX5hiej ze&H!8g#&6g+eLHzQ2E$BZ05O41=Z7vzhkSX#!nan&Ubg|+JAKO^{$q{UuO_E^IM;`Uljzk{N#D8olS8oGPJhr7;Eg~hcPwT{&*KA z1)Ra)V3oyLw1BbxC=*}n@RXI_qf}&|%r%(U19c4Zl)TT#dlZt{-(*Z3SmNBB@MH-n zUV0%VWMx6(pN63pf2xk&w7 zo+{#e5+;9+$7r-lb*izqEra+jq;eQIN?nX>^25xYM=(CuV<@6vE9KEL3p5d$HjQA+ z(d6?mbF*a0H!kHvVNN3y&0dN9Nvka;DOid+OTo>!OGP`9@tJuLh9`_iw`GnY@)Vd$ z8h(s-lYv6Eix)X4ogqgdyX`gTgD?;6!V>bv4%rnJ|8ZqgHye)+*EcKuFB`c&Tp5jh z$ro#^N#AGzl@%3gw}mLqp5-u`bKsB^#+KBo0_vD0yOw(7j({`IE`@kO!rV;FncVc* z=@)P=-E(Cuv4(QUW>{Y%?*SC=;>n)U?!!oT43PuPUaTQF*s1~+J@Q&PtJ?PKdzpMf zv6eket|TpkaY)`Q)fegPn1gPo-@94+n7yg}^Q08O^wW+3x-GC4*A{<Nkz+jvQd(HD5oG%>v8k;%Pm8A z2VOod9)Ul668f|CjuUHCsG8*hjY&sdxorh4Kk*E;I339Z!_AP0KR>nAU;a(9A$Pq| zI-t)PUEp^=3Mxfo6ib^Vx{&NYbgRm52kWq%>+9HmXqG5HV5Td_% zwJRGw!y(7xOlIWuJNY}FGzs3>y65HaQeR;tk&MNHs&vuL*=QF}28;^#$IVP>DU*(e zCkrjhPv$?)KVhvW7$krVLMQDbIpC1o7WJ#HhwW?4sEktaF4Fd-0Xk1Uith|*KQDVa zu=z=2bK12wW`#bgN|be(GqcQV z@BU1je&Km^5P>} zDj1b-6~4cD7m-nI(p*BW)r`9!(Yn)g2(z!OK^2$XykFCY0njE>h9{rA8}jwc5< z=ho@f&H$7fBo^%w9tE*=uymVwEmDQJFOB3pUwK?#pOPr3x(@`*$1!D|l<8M0gq8G|U z#1LHW7u8*P{n0UJ!zqNuBvaAQ1VNW1(f4AB%v5;1G*J94Ewp*xh}cMA_&r(o1Wp-! z2c62nSWnr=od7xN5;^p9m!6Vf(z(z5@g{x7Nr-$=;AV!_$L;LQSr(8Bh6}M)F-B_b$L^G%=KD7NP=X7}s*XX5 zJ(ZTSEiZ98Pv(_}P=Q3Q%&25oypQJ}3fivSIi*LqF+>b&p>tO7o;Tk&_5L{hW+n0T z-+8q=RVa5sC+zu6Ng!0%04e?=mi|1aDgF{5Z*{)gdhtUoOWz-Iu_6;+*zkl;dn+wA z(61deDT{{aUL1!+hay7A$#3E@Q;GA^VIFe3MA8s%bM0%WrD*Jz&Qa#5yi)ORByhbY z6j;?{<}t98HuK3U-VDdA;x%p1XrDwGCe7qmr$u%5q_i3SHqBbxIO zi3W)*G_`72Sy8p7H|8u+CJINH0EWRStB4m&5Y`jaq^286tE6+G+i-~!qD|stx`vi0 zEiifXz=nU*!lf&-GjCd53wfYWrkf!BR1Hzpkl6GzJ4d^Vtvx;j*(D%I&;@nfB8svO z+oa%FGG(qZt`)~*cy6Jvj{_`@O8d+SFx|+xAt!E-9hvGx$X%t=pF)X%BnWVIx_4Nx znZwskn)+GDwQ05(Q&6-A?Q}G}1&yv=?`UX#&%Ls|qKP92fjW8BbA>0k_$_d=ghP&z zQMyGF$FY>uwt<#7YqieP+kpxP_Ygs%92BCR%77}Oju7x2G8Yy8+uNFj)V`qHXU&!7 z%_+ba?&<6~Lk~FINt5!n(Fgq(BsY@;N(tZV|J-a^vfCV>nEH7HV1&-4zZa+@wl!~Kit<3k{2h*;qFIP-0!?IrKzHgP0V z!xW}(tQ&j7qh0rkPs@W9EDfMEgQ*2}k3&mRof*{)x`@FwkEe>xw#XBlzHh~176PEO zb9ykbRho55+mX*DP9ENzEqd$C#Z*D}TQ2o%6HI>k9TVy#3}q+ip2y)hX>qhPeNA+F1Y)sX+3}7ac6+WvA~?6iqw~Ob!_@S{dbhdJ1#ezn@JlO1550j4wgF$daQ@ z$Ja4@*C;zgj|TSl;A6tiP#oUZxAD>{>|a7%e+%DXG8LeDC;ISnn02f=^;s!tkI2}k zs>4`1;e}C#D=Xaa%JQ1`=!AHCX9lh2VW{-;CbECF?&o=VK*0@Hm_8HwEX8=Ezc@Ug z=D75M2wvyw$6-i@AINYQ2KNH458T%$74n$X8$DEDq;3tPHOAgI@>*1Bi5ix-Z-+r$#>4f+OKLxD^9Aq4@ZyBg7 zwcz~Eh2OtQh&jBlNVrc*Y)5Swix@PXhMsIEyq}_8`5!&`G}7t^*?!!Um*m^<+@r+&{jBioBTQa&ekfA-ACV@{pW6t)9OyTlpxPoUiuN3r+szb)yP3uD?KO z7k7{WH#R!dLG?~`G+4Lr(b!&97C(pHLB_aD% zZLRW<^anVF-$#bB z*fmrktDw^L_=kVUs6M#M$ZYdx;}}B|6UN?Vb`bxJ2j3m8u$iwE9m-_lWt#&%KrGqb zu-74nV9*24@dD`gwaGJ&hKc26`D-zEA3!iEzghWzrFRpLM1oH$^lZH0jt-T~^Liu+ z-9c3L?=H&!9q-Ec86ypcbs=|3>5jGe&z{@AMC8-62ISttB~#B3G!G}lSlF}jq6s09 zcr!N=1&-m$N+pxz`k-}&KY;E0w|H5gQ`FC+k)_onh7xYb}s`lC{e+Jgkv+&@12I9f3VfN z!9QiU&`6QV%VayhJ%p#H*4qIqOJ2}t4OcueJwN%5K%8bjUodC!6u_m4G7*PTEOXl= zv>q5F%)3 z@YDR7XDAa4)N^atHs-vH(;0LA<+kd-59jg*Ey<4q?zU)p8~ZiBpwhBvo^1}6o1x4s z+lnS2fINAhNz2`RzOFIN`Ez)3hM$cxMz|H%2KZ8 zN1A@}vdlvmOJ5K&v2k_mSd%}Ptg|pg{;#9KrbBPa>br5t_C%mYI&Oun`jId>MNVrA z)4)iDJ(DxOr0-(~Q?s9_$pTR$DOuydDeBUqApz{>gbV{vF-sl`jM zM0O5Sw^g;V72zih;$D>E;@tMaPdGa8c;FfK zXM6_bH&`Fl=zR#MLLp4CX1Qb?^zNfl(lzqvPy)IK$L|*Uv%n*%41waoVlV8Uv~pl$ zrEj999^73GC#}caFhp{yY!p-b1K-5aMeWdWg02t&P@_V%S5)17FAPcx=If={Wr@TC z{hN411~0h)UvEx*bj4+Eir{jO?Qx>9HHqTFF=l&vyAu}FbZ z=DCAV`Atwcm!ELE4{wWU>kn;}5bsk%1c}26m))_BV`Hhs@V(j}Ty}3!wD>yvd@4Bn z5NDCXhMUB*D`B8II}WC|C;a}WU{EGcFBGFOo11sJZbo@tZTM`%=~0Q|9I*VQ-%EU= zE_=8kih4-{3mMv<2_l-4M=i5@dJao-H9vu{vB%3nPy>Sh`~LzAauf1a-LbJF0O2RR zk!8ed&`iXX^E%tBG#+Zj3LXq`iU5;5cJ#JBYlO&^$hIW^XTM$}u#~dn=4j_UsmDJ= zij>rVskPkZ)6c{ZJr1|A1(Vyshn9sTVZA$!1h3SO#gqQHU&k(gw(6rNQ4}$4y;%$n z)q*iJ;JKA{$sJJYg+A!kgCY4L2BiLO&r4TssX+XwYz~nWE*q05zc-~*pv2UlUOGY3 z6VrAbk2x09!yFCt&#Wj>lO))q%_w1r&nI<4A5ln2*u_#Qv|HD!_0@D9z7hq_QX)Ul zg=bq5^CcVIpqY$vZyM)AgeUab;fD3gOjQ;y3W`$@pa-A|1p?IWQPPc|_U?+$$#%ro zQl+1Q5b-lDIadXr%&fdg3WEEU`{7QZ-S~jMa$d6Zgw-6EN64$pAEMYYtcUF_@bn{2 z$UT$5-D_@d(>sFMheW~D&aUwIy+Py;|0z-Uopb{?Xl`Cr;{9ge>qD{)PMW~|Mzk3zp2}7&&q+8~HocZm! zg8GPd`1VN#v&6L3WkZ^x5cx7aOfR&-cWehOH^*hR{8ln)geIa`bZ0eg-k!{Qrj1;3 z$c`Q>8;OzD78n1pKu~x3lA|qCsSt!QH~i*LDzGDjjv6yFFofru^Gb{FoW0<*x3Rr+ zo11NUD`MF4@y|Qd=Mf>AiW|mII9_ylUo`!XwMQ(WTqMK7Whfi9R1h$|qvnpbdrXD< zl;X>Nr6*uHA9A+cFr+-k^pv7#@6R|0KSo;EXRM)1M`EyZQTOIfsx&Y7mV3;&yMxyY zK3sxnKWx|?H%P+}`4d@ftlZLou(7rEeOT4=kni{`V4Vsc8hDWO_>(LN0&^Pq2%a!! z_h#a#_6UvwpZvOU4MfF+pGBDycA@t_3uIRPvss}tb~{r^Rg3&(((pAR- zfs`}-qqA1p9HUu3keya&@(k^gR$k0_} z@RgTs7F50^DAcU^yx8{ZVZ~`+cd8oP1?2w~`h!V!;tkvcFfQj$Z;8g}|I<)Pyw-=K;j7!_xT z31a)0PM73O-p*4Fu!)A@qfC~diDNj<((BJ=Rgsk@ZAo+J&d;hM^$=>9`9q`4V2&6o zD-G0p9*(Lx;)03#`XhKC&I}~y_bATN5_i@{o{0aTgwvg$@5zDWHUE-OXHh&NQ*xu7 zEltr1BAn7T4%?Zk*&Om_(TBs%v*H@+TAJe_*Dn^<$5rnPgF}(6+aPY>$sGZc+D{bV zjA_|>Ol~kq3`0U3#E_ctm=NtKXb&tj_uEa#VU%mUvx62prxC`DN-on~0zh`O^;bgb?lVViwisq4s{LUvSvZIB9zv^SztH z{i9>qekJ+-&(&{fA%Bk5KeT;9Y;1Rkto5OM=O$SHi8n%vTNpgB*Q3Dl64z(zqjjvR znSGTJ(lc;)d_eFB9P8$a#$}MCu|Rz`0{uZtX9?RX?GjH_yVHYJa3IA==zQ54MMKJ< z!wbHChF{6uERjeQ27 zN14Toik9%?2S5@IVz26|uit$P2A022`qWAZSs6U;_T|jXM zIBM`tPCGiG%?wvPKR2x0npqS1^GEqZdz}&#%a4QNMGIz6CCzVr`vSGmX$ipU!V@HN zodrG|%-Xy=R}%L&!>TY0)c&IzPSf9CC~)`zQbbhdELvMHU^IEzWO2wn4uPR?AgeBK zkH%Op&=392A`tm4^^D42hP%|QxN)j}P!8B8=S$NPKNn7rPJt4kEmTmuN~?`l^0Fy^ zZYqOK^srrTRt0Db<523hpWe`CCDJxmwGMuL<3cczIO+8iJm=eQAEun|+54RZ|JOD+ z47p&q(gV17553)ef10p|(x#8i_HU8=B3Gq;z zh|s^6siB`TgO;Wp0RAf{(ZUNw{0{#TJ9{Q)M{8G11yIgx`M_w^Wf`pqD zbrdjLY1H;6#F9rqo?zSc`RmapwWIALvc&Rrj?iI`W_RjxRc7af9cnq)?~Kt2BGG&F9zqDw6E#|t(T(1sM~M(MB)W(aolznL2_bqXI#Gg% zb5Gv)_dDlrIP2XjYwxvV%slfvcm3Yi^||IQy6$(lUC-HdQ?^&~&P`Uj?D2l}HIS=Z zLlkt183+Xx4Ja6`->I}!+%BGX)Xqw9tCrs{Y3q6Ns5t4^pyO4QV7w8ZIBml&)0>Ns zhls}M6g+I3f(19{`wtOVh@kGNE-`1Eq9$+A5xKw=`TWEnZi8 z^A9#`dWVy$hs&W=_V&MLybWI1UDDlkqxCoRBmX#2%4j$}^xF8a|NB_}xeveZc!wJ^ z@z+eE=-N0wgMHVlGFtW@78VpqPa2N`=!M=mxe2XNEs5CeDkE4V$>*OAdedI@jZFa}n%k6V`=I|$mREp!%RTzzzpm#S zKyJmUw_`L>{hQMx8J)DhyD`6Au^<6ObagtH4`p8wMry`E@VbA0q_5a+50RC7>6bC? z&k`~bVF;_$$f~mv27Qrwz?{UlVa$7+m)ukvdJG5AqI{IXc2_NpIWe1f!G2&SP(&ZfT>w4^*^v ztdDolV8L>SUEk|~=Y2D;`@JNaY~z|8KFUQ&p(CB>!C1(t_Ok_{O3(h?9y@H}R>UJxjTdZ(>f0r#$+ZdoU;R7>?G7c|Qhx^^cl`5ljWNPcpvKVr#R= zdKOv(w?6v&VN8`VvLw?&iphKY9>;z}lH7#@a@g5|GEw$)>Hx@Ro~^DKm4pJ=6ko8r z3m`Yq`Mr?L3j`pe9Y6Lmb-HH9Bca8A>H_d@I%#M5*I4Umg&VI!f}0Ne7<+Jt1(HL; zMa!42uNJN&f%%X_09fNVDu2`v6!XPE67B6<6!p4ATWHEJKyBckh>OXwgX0$gYoKuJ z;d3_<`&@5h6M(8xv#>BC0tUFhMOZNe{41nXP8D14CKp{m5@5CkX9%qyMYUa=nu%Rf4;R(NaVJL+?2*^%)SW@iGPf zUJ}V$E{wm)z*Ft@3u8^?$y(0~*lT)cX_ulBmFm{0{Z+JiyQ(D$gTJ}ikQaRM6T^{; z#89N>T=##T#r(tRB#wyBc^M*CQ`EXK(x?o};B($z_YlVs&3UvKKuXfsLdV5KwZH2k zMxs+Y((8onrc6&}HbTAc-ou0c8h)Y)Uy7jAB?RQ32cawfM>AG!KPG162X4M6E%c}Q z4=Go1wl6=q|C|HkAQizSu#+{Y`{p#Q14ztMl7|8?j?M^A@Ys8gfM%n;257)eSH10S zEd=bh_3Sn-%o{RuxBO;Y_^tXIoK#T)F$0;lxj}KFsQs4&vw-@?V=A;a(2t9i&8gvU zCL2z^u{F@euE9wYJZHXPNGjwWD&Op$s=3z?q7A!^$>N*8*JD&Zkiq+J9nAGg8W>YA zD|oAA|7pE)7lE2EHaGM^j=zVQsAOKy>5nC#(c+)x=B`>Punk>C0c&J14N%}(Gxp^h z7kkc`c$KS_f+yO1W!@9|Y4IGiYT@bXJGHyGBVZsXb^o6BA!rKM;GO=QayL*=vibmR z+W~;U30AF6b?B5!?sx&#S~Rei3F%fKa|zMXfb+Lv7c0?s6*OV=pttQY*UlrKA8YiK zytNbl)*-8wiagG;DW3Z@Pr&pfnw^?19Ii-zS8B!e|fX&?J0b3bPUji>_6& zJzEw;0&4lG_u99Vf$$i^c|+CVwxt_xStW1gj{Ja{#YVQ{^h34ItQvQrEv-oK$DhDc z2?dsj$BSJ;sVtxu@u*u|e9gq?Vv`ap^`Mv><)vmG&k~?#Gd*+#ypkoL7|P2+&=-5e zfB1+!Y3A03yphtSVnS7^7Qp!N2kHfMDBHw+h0}}$XqpU{i!C1kkr?G<#fR??QSxp9 zGc$PDoKsS&(7TME3Iiz2e4nqq=9pa5%M&t4bo)VpzH-vsI3s}Y)m}sH@)ay z+u1x%O*6i@c*Enz(Ni-(cDpQ_Y3`}fno;M+MVCWoXd=1nS-S5VhikK}TCYzg6CuDd z5FUINu9wF>ojLm{*F{hGR<&l`*)_(xiqG6#dgqYn&UrWLua?qkjfsX04oV>iqt9u2 zXm9phJ%CGKTE#{yOzH~AP?OAm5TV3Z5W5(KCS``X=O^SY5U$d1|AVE4{&e+LPClfe zwY{z8#c?oAsZCe(&1V2J4psT+FlCofFxBVOkH}r3{q-_xWNpQF{HnmjwF#Z6UkE3N z3Op2O2YAAG7J6mIph~lu*MUc$cz7&8^XrRbn}-f=aZ<}V7vIZ+u;6o9aQRBzPJ@$) zlLX1=2d2eIC*y&!@g>jhFe*2Xy^7b1q z)S{pje(rvS@#-F|i+4zVPl`^Aej_VVK)HEWHs;ooQ5(+m(~h6+po8q&aBpSkO8qSU zM}#oKqhxSXI|wZfef>SUax=e=Z#RY`F(#aF)^C&C7$a+2K@4;bhUdA2N-Uw4&RVm_ zo~w-c*OSVr>~<=TL?kJ&8DtC6!6-l9XI1Gk48^j(6~=$v&+#pLnoL(TBB7%_T8D+S zZ9MDolSzkBe-}OpK6kJ-&<&WAIn#a!A^mDURha)zHFrOazI+u7*V4M{G9kN{C&$l% z=P!uvT%{e+Gfolc+49*^cM}F{PbV;Hm?z6WW*_}6dA;GMnI@RFq9%8gVq$b;ePqk@ zCd9XV1rR0axYg$8;jevLSC~f*8ouHKQATtz+^6?0wmgkLp%jGm7mls*n7C6GZp{j~ z83!by#rd8WgjcwFG`nv|BxoE12Gjp0bcU-4y={OO448h)Raly~R4xl*GQWQ zBfHbZS!OJCD-DjTrTHg8gVH0E&B|NBrX+UjF5TigZABSJ;YDn_cnB?XITU?2C6Mm+ zrb!b&y+l^o)MrpGzqv}Jg2`2CjRkiKtIXS(d=>X=5jnA0B&3yVpi)aG6>%Wk;d zy#Sz`jr3r%&F?hBR@*{%s<3Wle02&{oeNVqo@!uwx z84EEh`V8=bmz&RRdxuw5UjJLqYRU2LMNdfBlG#uw4kIG?^Xwz+1)8t3v(A9Fxbr(b zF@b^8XW&()<<2>7P-OV_rcTyEfXgoexXZFJ4uaW*0oF7Py0f1Bh&X0fSa^N&}U@dL}3 zL*%5D*dlZh(Ft9zpeec$o_3M1PhX{dCgmKw+gm&($a?g+C9Es93y-}szvphG!cv!& zm95z#vE^^2SAiaeg@He4-!^y)_29dHQkDUONKwSw^>ky85YmG!n* znaJ4t!YIX-0d{$On(3~;Po{Hv+diET=B~cXjl(*~2rb)Za#w%PsFP-9!UE?YBaZL^cAyxd*td61o{ki25<5 zGGQStMUuW_($vO}5>|Grhqjal#=@q;PuRkm6Gh^o*+^O$Mg$FqOxn+hyXKSH5(&?c zJSLU28ZJe`pXzuzS0WuA*D7Ay&yZE~QcBMgU+@OqdMaMLI9s2!Xo~)Zr6(gmXxWrX z;2lXYOFl2qWHKd8%I2ib+f);z4EVVtx|^VYUwewngdgT{vU$<||^=~TK; z6Fd?+3`+`sIf7MPT<~-qC7tn61rB{WYQSy)_e*EjT^0Kh!!b#6qRQA9Q>i<-9Vaqg z#y{y88X1}MK2c$heoT6ehBCkCDpr@PeEe(_kGr(?dI0@A^>J9i{HNUhyNcQ9yEXeG z;bAk+QABvdJ@Q62Z0MlG7GgY|(kCaO4E>)&9l{=5_GBEra?vkJt20<%+VY~K#AOM$ zTpkP`a>_kj!f_>=+Cmq4vwGM0*OP%60IG&B-KwV{u;^&5qTKS4lO=dr>gy>4mnRQ_ z@Avn)61w1^!bL+x4{u4n zKl|MISz$c%>;3zu4%34liDUQ zaB+xPr}Q~7`^3mit#Ce3vd7Vx;gU%bsEeDr(`zB@^X386`pf%=Xsx?*^xMsucw_?E z0p!64#lb`L2_KH{h3WY99ZJE+t-e<7CeR|31Vu2_Zx$`r(W?gZy)si6Narss3@4|Du zaGyqhahsj2PE`y=J7~3{_1OG!J%xf0Y`n zNN?VQJEGj#et!Rot&-{E4fU%SNb7?+^YgZK>56T`MR<5nB$E?H157~eP{qNakML

Vq@MaI-NO&B9G7LYnfG-F}1~-b;HNZsT08eE8yAtSrj-@WD5^7068o zUUJtu-B2@`HfUE|3>~UII&WUtYUKUDiJ*&EC2`S;Iu)i(C*fXu^bB7j{dQbdR}w*V zS8DV}LSo3+{c!#h2iCy2DQr}?cP00S+J~#wb}FO1bhR%;D9L?_UysS{^xgf$rT`DY zw}99=cLychsIhMhPL7zok84n!_H3-W=j7#nP1U{;khV3p`^s1N1H`>vbF$wN{~ z0t;Okl23QO*hHG}$q-hW!P?g6e)?aq)?&phu0pMH(lzqz1L}&V-g1|3A=0DnWqvy1 zF;Hs|CLcml(dB3e;L|_&s1sULAx$YZ!y@pJ{28(?O+s^xYhUQv-rPl2u0wsMnQR|Q zEGyGaNHA#K`ZFWWf1QyN7UQZSnZ(Bq+azxyAkb;*b5|>f_~8aGAelK+ClItxzEqPe zqu@v}-=8x{sACB~Sh7%tEfegM9x{{A?3P;IQV=y^)26Vmep~Q**=2*?PO)zW|V_ttwqbbjvGDAFIQT6y%=Skn- z4+QER46rAxq>E=XQ;evwt>;edFF#Pb{`5jp1PpUwtmPw;GfIYSUv$hERx~<;`a{Er z+cR-v{Y4}$9U$s7P^WE9%jy@M5>To~)(P)*D<5;}DNz755UE)xa!vKcRH6-8_9TH0 ztc(a-B`~|<%m3v9Rb%<@%QheH9!d zfK6+NDX*XL=>ay3{aC|$rBZK@w#m2J9^iz-crIQ&aB4w4P*tC^ z2zW`tQW|}zKr8vC$r87C@+H!H5P{-@@kk-le>8x)sJ2{&Aj%bjBu-R$Dqb+hlQMea zCFZC@DX_9};PTt!x_3&vz&2I$GvKHz6&dVimZPu3Jbx{4jM((Os_TXtcwmFY zZa=))^tDntyQEztsji3~Fq1ekV!jZ#Y!dgY;GL(lGJ<+Ik}x*aXguFa3zRaz-?_ib z*8pdRH?Z-^B9PlZ-HLeMUYkF=Zdbk*{G|&`h{kdw6v^}n_`*+}29!s78@1_AD6I|_ z8F3{`XXWj4MWwg7up9Qig|+y=*@GO)a^lgh!0vyno6qMV50uAGx0%6VHaVfpwh9gI zi(d#JuGxgqF{9qaL>$xa!wLAFCuT@$0esZ~&C!-^N+uQ`C+w?7g$m;XonNNTfJTz< zAZ+M&=a1zl$L*95#-jTTcLX{#A*r2Qdu1_d?FMk{yPHoc41DXWjNr+qyzxzJpIvE* zqo`U33JVr+zYn@buW4D$Li`Wm`i-DqZA?x=`jNhW?t?(}9>kwnW^f%0A%~&pIQ0Vk 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 literal 0 HcmV?d00001 diff --git a/tests/govtool-frontend/playwright/docs/voting-pillars.png b/tests/govtool-frontend/playwright/docs/voting-pillars.png new file mode 100644 index 0000000000000000000000000000000000000000..719acf56f84ca619e8ff8fb2109e3ce5913e960b GIT binary patch literal 41346 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 w`7jp$qrs-1D$GwB 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 z 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 Date: Fri, 2 May 2025 14:38:20 +0545 Subject: [PATCH 43/60] refactor: dRep registration tests to use generated valid and invalid DRep info --- .../playwright/lib/forms/dRepForm.ts | 28 ++++++----- .../playwright/lib/helpers/dRep.ts | 50 +++++++++++++++++++ .../dRepRegistration.loggedin.spec.ts | 47 ++--------------- .../3-drep-registration/editDRep.dRep.spec.ts | 45 ++--------------- 4 files changed, 75 insertions(+), 95 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts b/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts index aaceb62be..86a644de1 100644 --- a/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts +++ b/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts @@ -169,7 +169,9 @@ export default class DRepForm { for (const err of formErrors.dRepName) { await expect(this.form.getByTestId(err)).toBeHidden(); } - const objectivesInputText = await this.objectivesInput.textContent(); + const objectivesInputText = await this.objectivesInput.textContent({ + timeout: 60_000, + }); const motivationsInputText = await this.motivationsInput.textContent(); const qualificationsInputText = await this.qualificationsInput.textContent(); @@ -183,21 +185,21 @@ export default class DRepForm { .getByTestId(formErrors.paymentAddress) .isVisible(); - expect(await this.objectivesInput.textContent({ timeout: 60_000 }), { + expect(objectivesInputText, { message: objectivesInputText !== dRepInfo.objectives && - `${dRepInfo.objectives} is not equal to ${await this.objectivesInput.textContent()}`, + `${dRepInfo.objectives} is not equal to ${objectivesInputText}`, }).toEqual(dRepInfo.objectives); - expect(await this.motivationsInput.textContent(), { + expect(motivationsInputText, { message: motivationsInputText !== dRepInfo.motivations && - `${dRepInfo.motivations} is not equal to ${await this.motivationsInput.textContent()}`, + `${dRepInfo.motivations} is not equal to ${motivationsInputText}`, }).toEqual(dRepInfo.motivations); - expect(await this.qualificationsInput.textContent(), { + expect(qualificationsInputText, { message: qualificationsInputText !== dRepInfo.qualifications && - `${dRepInfo.qualifications} is not equal to ${await this.qualificationsInput.textContent()}`, + `${dRepInfo.qualifications} is not equal to ${qualificationsInputText}`, }).toEqual(dRepInfo.qualifications); await expect(this.form.getByTestId(formErrors.links.url), { @@ -266,20 +268,20 @@ export default class DRepForm { `${dRepInfo.paymentAddress} is a valid paymentAddress`, }).toBeVisible({ timeout: 60_000 }); - expect(await this.objectivesInput.textContent(), { + expect(objectivesInputText, { message: objectivesInputText === dRepInfo.objectives && - `${dRepInfo.objectives} is equal to ${await this.objectivesInput.textContent()}`, + `${dRepInfo.objectives} is equal to ${objectivesInputText}`, }).not.toEqual(dRepInfo.objectives); - expect(await this.motivationsInput.textContent(), { + expect(motivationsInputText, { message: motivationsInputText === dRepInfo.motivations && - `${dRepInfo.motivations} is equal to ${await this.motivationsInput.textContent()}`, + `${dRepInfo.motivations} is equal to ${motivationsInputText}`, }).not.toEqual(dRepInfo.qualifications); - expect(await this.qualificationsInput.textContent(), { + expect(qualificationsInputText, { message: qualificationsInputText === dRepInfo.qualifications && - `${dRepInfo.qualifications} is equal to ${await this.qualificationsInput.textContent()}`, + `${dRepInfo.qualifications} is equal to ${qualificationsInputText}`, }).not.toEqual(dRepInfo.qualifications); await expect(this.form.getByTestId(formErrors.links.url), { diff --git a/tests/govtool-frontend/playwright/lib/helpers/dRep.ts b/tests/govtool-frontend/playwright/lib/helpers/dRep.ts index 40d9e694d..8572e217f 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/dRep.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/dRep.ts @@ -4,6 +4,10 @@ import { IDRep } from "@types"; import { bech32 } from "bech32"; import * as crypto from "crypto"; import { functionWaitedAssert } from "./waitedLoop"; +import { invalid as mockInvalid, valid as mockValid } from "@mock/index"; +import { faker } from "@faker-js/faker"; +import { ShelleyWallet } from "./crypto"; +import environments from "@constants/environments"; export async function fetchFirstActiveDRepDetails(page: Page) { let dRepGivenName: string; @@ -126,3 +130,49 @@ export function convertDRep( cip129DRep = drepIdFromHex("drep", cip129DrepHex); return { cip129: cip129DRep, cip105: cip105DRep }; } + +export async function generateValidDRepInfo() { + return { + name: mockValid.name(), + objectives: faker.lorem.paragraph(2), + motivations: faker.lorem.paragraph(2), + qualifications: faker.lorem.paragraph(2), + paymentAddress: (await ShelleyWallet.generate()).addressBech32( + environments.networkId + ), + linksReferenceLinks: [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ], + identityReferenceLinks: [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ], + }; +} + +export function generateInvalidDRepInfo() { + return { + name: mockInvalid.name(), + objectives: faker.lorem.paragraph(40), + motivations: faker.lorem.paragraph(40), + qualifications: faker.lorem.paragraph(40), + paymentAddress: faker.string.alphanumeric(45), + linksReferenceLinks: [ + { + url: mockInvalid.url(), + description: faker.lorem.paragraph(40), + }, + ], + identityReferenceLinks: [ + { + url: mockInvalid.url(), + description: faker.lorem.paragraph(40), + }, + ], + }; +} diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts index 35e20f006..554e63cd3 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts @@ -2,13 +2,12 @@ import { user01Wallet } from "@constants/staticWallets"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { ShelleyWallet } from "@helpers/crypto"; import { invalid as mockInvalid, valid as mockValid } from "@mock/index"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; import { expect } from "@playwright/test"; -import environments from "@constants/environments"; import { user01AuthFile } from "@constants/auth"; import EditDRepPage from "@pages/editDRepPage"; +import { generateInvalidDRepInfo, generateValidDRepInfo } from "@helpers/dRep"; test.use({ storageState: user01AuthFile, @@ -62,27 +61,8 @@ test.describe("Validation of dRep Registration Form", () => { await expect(page.getByTestId("alert-success")).not.toBeVisible(); for (let i = 0; i < 100; i++) { - await dRepRegistrationPage.validateForm({ - name: mockValid.name(), - objectives: faker.lorem.paragraph(2), - motivations: faker.lorem.paragraph(2), - qualifications: faker.lorem.paragraph(2), - paymentAddress: (await ShelleyWallet.generate()).addressBech32( - environments.networkId - ), - linksReferenceLinks: [ - { - url: faker.internet.url(), - description: faker.internet.displayName(), - }, - ], - identityReferenceLinks: [ - { - url: faker.internet.url(), - description: faker.internet.displayName(), - }, - ], - }); + const validDRepInfo = await generateValidDRepInfo(); + await dRepRegistrationPage.validateForm(validDRepInfo); } for (let i = 0; i < 6; i++) { @@ -107,25 +87,8 @@ test.describe("Validation of dRep Registration Form", () => { await expect(page.getByTestId("alert-success")).not.toBeVisible(); for (let i = 0; i < 100; i++) { - await dRepRegistrationPage.inValidateForm({ - name: mockInvalid.name(), - objectives: faker.lorem.paragraph(40), - motivations: faker.lorem.paragraph(40), - qualifications: faker.lorem.paragraph(40), - paymentAddress: faker.string.alphanumeric(45), - linksReferenceLinks: [ - { - url: mockInvalid.url(), - description: faker.lorem.paragraph(20), - }, - ], - identityReferenceLinks: [ - { - url: mockInvalid.url(), - description: faker.lorem.paragraph(20), - }, - ], - }); + const invalidDRepInfo = generateInvalidDRepInfo(); + await dRepRegistrationPage.inValidateForm(invalidDRepInfo); } }); diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts index 57a4543b9..782df6ada 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts @@ -12,6 +12,7 @@ import EditDRepPage from "@pages/editDRepPage"; import { expect } from "@playwright/test"; import environments from "@constants/environments"; import { dRep02AuthFile } from "@constants/auth"; +import { generateInvalidDRepInfo, generateValidDRepInfo } from "@helpers/dRep"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); @@ -32,27 +33,8 @@ test.describe("Validation of edit dRep Form", () => { await expect(page.getByTestId("alert-success")).not.toBeVisible(); for (let i = 0; i < 100; i++) { - await editDRepPage.validateForm({ - name: mockValid.name(), - objectives: faker.lorem.paragraph(2), - motivations: faker.lorem.paragraph(2), - qualifications: faker.lorem.paragraph(2), - paymentAddress: (await ShelleyWallet.generate()).addressBech32( - environments.networkId - ), - linksReferenceLinks: [ - { - url: faker.internet.url(), - description: faker.internet.displayName(), - }, - ], - identityReferenceLinks: [ - { - url: faker.internet.url(), - description: faker.internet.displayName(), - }, - ], - }); + const validDRepInfo = await generateValidDRepInfo(); + await editDRepPage.validateForm(validDRepInfo); } for (let i = 0; i < 6; i++) { @@ -80,25 +62,8 @@ test.describe("Validation of edit dRep Form", () => { await expect(page.getByTestId("alert-success")).not.toBeVisible(); for (let i = 0; i < 100; i++) { - await editDRepPage.inValidateForm({ - name: mockInvalid.name(), - objectives: faker.lorem.paragraph(40), - motivations: faker.lorem.paragraph(40), - qualifications: faker.lorem.paragraph(40), - paymentAddress: faker.string.alphanumeric(45), - linksReferenceLinks: [ - { - url: mockInvalid.url(), - description: faker.lorem.paragraph(40), - }, - ], - identityReferenceLinks: [ - { - url: mockInvalid.url(), - description: faker.lorem.paragraph(40), - }, - ], - }); + const invalidDRepInfo = generateInvalidDRepInfo(); + await editDRepPage.inValidateForm(invalidDRepInfo); } }); From 3d5060dfaf1cbc449caf9e234173810a69c6861b Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 10:52:17 +0545 Subject: [PATCH 44/60] fix: update delegation pillars image reference and replace outdated file --- .../playwright/DEVELOPERS_GUIDE.md | 2 +- .../playwright/docs/delegation-pillars-1.png | Bin 57341 -> 0 bytes .../playwright/docs/delegation-pillars.png | Bin 63447 -> 57341 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 tests/govtool-frontend/playwright/docs/delegation-pillars-1.png diff --git a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md index e9b52583c..9d4f0039e 100644 --- a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md +++ b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md @@ -149,7 +149,7 @@ This section outlines the core behavioral areas of the Govtool application as ca This set of tests covers all key UI and interaction flows related to delegation functionality. -![Delegation Pillars](/docs/delegation-pillars-1.png) +![Delegation Pillars](/docs/delegation-pillars.png) --- diff --git a/tests/govtool-frontend/playwright/docs/delegation-pillars-1.png b/tests/govtool-frontend/playwright/docs/delegation-pillars-1.png deleted file mode 100644 index 9f846f3a81817f083fc9082945ff98f4e87a0b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57341 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 E#pEPC zgg6y|&k0H3-8>cML)DGr%zalAixq_%?c`=E4ZEfU=*UvUQ+P{XFQ+$kJ%O9f zL{)L>C@(aKw+3f>?yfY^gzTB=dQA`XR87Px1oUBKXH-lseA~I~1k&ydhw@IaPx$CQ zgUTI^XofsPTJ*p%C&b)c(ALrR{^cRhY*2Lf4_dVg2Y#6Yjfa}u+ms!4JWOX0yoXKt zOHJq54Tl4-vkS}hFBM3m_jzfGzgpC^J0wJ~Rm<{CW#TL4Jdfw;>1WqqU9Sqt(lJLF zM(NVjP^GhvGtQim@ix`a%F`^ivCZ&9_DBA9m2?8CH0$+DOf`$& zk>zIwF{1-(s4)15AuJ*{YC;-SP0!7e;3QFS6KpEDO zEeT&_Y3}Put{SWc&yGv=-F=AvUpCnKwK$r+SinVBMNxd`G7pIDKVt-R=;DWip(A@~R=|XQ_yYnqK+nt5*(dV%k8lZn zgd%#!-YE7zClI~PZ3dHU$gV|_-r>2B z_(#v`kI#0#l=*Q-EhceuyWz~w2JvK-in5NoqP_3ICU9Hz^>!2~lE9}(Tzl6o1gFG* zAe4S%7;z38XaYK*aOU-`y!rVwl$t9T_KsaxBj8oSorTC!SJ!PD{Y6xgg*Ag-xnIj> zNt<0AJST)Ax9i-W@C$0pgU^X%$C;SqY2N2c21_7P=K3*s?kl_K?Yc`k?yPfu!aySZ z8~|$iS37!+t^PQQ-O#(}9ri5;UE)*0`olYfaxUI;^GM1udze~_d{w_dE#L!F=|^3g zt21<5al<#B0uz5lZ?@!gpmGhStOMa3d4Y1*8ewM_96L43iB&^7P&6xyDguDLIfg-` zaXg}>*uXYbN1b&zczg?|dJ>S&cNV8^e+U_G-LYLIYpkE4sifzIKsR_d3$}3~47Q@~ zmtJ$yfI&R7##M$Ks`XEfJ>L%(bL@UQ54Cf{Y3F2v&_L%oj}$$VEn$w zbPb#|Yt0d>ecJRODds~OZ~_$tCEYJmYLlUWLt|((h`*_S^mH8a9i-Rz@T6y9f_2K# zI~V-IeO7#WdcTir;Es0d{1X3U{NQ3xsk$LSlHNqbO`?Z~;IUv_H47nnkJqChPg z43b5VS#%kQ$jSL@--{hHY+PDArolv=6Zv)b{Q&$xGzbDW`kElpySt|mTpPK0j=2@g zC3=SzO}e7;y3!Nig@nDope|+-43wkJ(dgdOKyFe*2Bq1vWrfWBx)%;Ai0F2+gK5Aa z*kKx{cL)f&PH=7H!oNL%NBlteykg+s1Zz)UMRsxqDv#>yF4KmE?<* z@P$kH^&fm7cjFk_gY%P`L#)sodnDgLPzrLxaPIyFj>z24empESa8yMp?iv(JW|2r= zSdV!1OX-!07ktzL%iYl|Hy>pxI3o56jOfGrKvg@|iQ;YP=H-rc(NREUP>HioP&<`df*~ZUd}4CXS3{*^3kD-mOBaJ2UBEh-N{c+%{35kTS&P%PLl#4PjcsJ60`GBNgwrBCRNGG9_ zQ>N*G@dtYU*6R7_gNpVyxP-)VNu#mIP?#OG*Qcz(nDdzaD=+a^d=W$gv30qnT`@*^ z;ng;AuH`NTuh%r%+dO~WTg%@#O*J%d{$XRT?BaT=od-(-pN~4mEjzJ${7F+QGVyXx z-THvtRp_QQN)e;Mhw->%IY!R`pS|G|OwrGAp9Zqg`BlxrFR&>5ldd_QRW``1nufBL zp8?!rYV1~Y&K=+YUX`FOnOgns?F4(e&74+UFWWM zuR9)CFQ@I-C*H_Cx$E)9%a7ZE^~S@B1gu*^T6+zY{B!Po?0s#atkMBvbv31Ysgzov zAM*OM;>f>GKw;1BEk3z>RDBhEWdsnSHivv#Lzq!|k?)%G$Ec`Hsaj14UYIyAYJ*n2 zsJU+6{;bIApm|P-c@m%jQHcE#{hT#bjF}!0!b9Zp7XLBoIRH4&sN)z(X#OT5J9b4w z1U)hO&h(}TkUjCUa!U&=TY$aAdjs#iBK13OTy-s%Am}SQ-G4Ii(#gx@6MkwrJXM~0 zN*Yd{jYm@wcjCgW+n*m4y0vw@ydq1~@giF78R^>Rkq8m(<&%h)<^jlzVzFCJ}IHh61dDSBNQ$@vA_7;m^_Lg??s zw@oRF>6VB1e~l?oFM6a9$nD|%bP(@h`TPW!bjLFWAl^^75oPpheNXH?1Wd36_WVT5 zh+gou;lWi3vML*1Gw#ZImf{Khk>aGP$>~X(lK+4`zNX`TcfsXT$j^B7`R&V5>*183 zbZMuqwt=cNo0?|>7|Y~WnR~(Ax}!~UvqWvjX=*4rlGVy`u793G$gBbU!EunE=*<0W zc0qLdz4!AE&isz2^oa$|Di5&&&P;6U^Tf}XZ^PO89-Nyc$qBW0&*REsHzrHSa|Ahw zon*}xvkqQv2Zl%2x8~qfj0ssL*mfYc26mo$pJl-A1%ANuMk)v-eLFVjiv^!B5c11a ziAkL_8T85MhKucz+xU=%IbvYS8L}B00f*URHQX(2zeH?s*F#C^ll*TTKFx*m3a(=B zdG!54kIf!8wXT8_H?p62X5Kr$c-PG%R0TjdNzwY5>dGoVn`|VK^R7+hKCL$)+SXx;A!m=)0L2yI;V9)d+hs zuH=`yOly&5GvKNJ1m^#DNg>RsTNh;ATXmic8T4Q7_j2*Fb+qc$246%Dpd#;Nrtfv> zwHKH%W|!h`xCIm(Nd&YcRmefhk<{2Mh)7vuH_N4OW)TY=-^vo~$b7eju6qrqN_J*h z)Z3ISPLQ=udK`%IKWYX1$))(cmkPV>3EeucN8pi_6rAEQF@`A>msz$j5m6Q#b=zca zdU70|?}=kyOW~oiMNwFCo671vkc29FUpao7D0BO@^D*z$&_kcL+6|&0wl#ahIF8_S zlB(rx)kg{OWxMmNgv^WeElb& zi{+g%X6kkH^s9$(Wz7Ts9_id+?4UDm;B5GW(=f7pWT*OXnEPr`>)2gQad9u zTVpdq12Z8q>pZf(*}tXCLFssSo;jI&dY8Vk)b-+5yuTgxvKgBb*0W#ptPJzhnn_za z;R;j>I#84H8y-wN4d215250Fv7vN-Ne?!DFFJkK~et7?L-Q2fTO?{4LNh;@m1BOUp z9{@h%s8|Eed&z_Ivw)GVm>!zn(PP(Ks1{&7uXZOO}CC$rNi*lJ|W_^F1`Co zzmY-8eELSMD=1WRP>ESqQlQK?abU8awp=FE-`QnXv!&1tD7|0RwK4M-CD}?(zx1uw zY-|**=b~-WZ8dkyrC#vaXS&PobK9qnMERV9XN5ust4}({9d^+gKh2fVkVA3BnMY?8 z&G9=W4tS|->CM>b-x`X@p^De-&YAE$nIiekD|9ILn9eKds{~ydtaBZ|XxS~zJ#BiN zS&I>8CX;8YvVY`B$!yWPaAzo7TBPZP3+GfOgOzZF`%{&+?Q$prMx-#cogZVMzqLA4 zdirqKTATDniVW4je)*-c+79Us*g%+p0t(`8JJj;}S6;TKV5!2>IAB&5*^~rTW@hcqpOI zQaZsp%6D+C+oe5qHo3G=vGt|kqa=FONr(tzoy#Z68|mrrupWs*>o9f)t3qMXa+>De z5Ed=eGfcNhuZb~+xVt&uEx_~tu&A`9?bBeEQMEWXwgI`n)d= zFh-k6l@HxfkMGK20`-y=^jMX6DVm(KU#5z~TsOef0cVQop?QrtP_aD#}8)cX0iQKh~ z)=a+2YAdF|n#pA$k*1@Tjom$F5I}f_Rre4g{KVqGCjC*i$tJg$PFAZrapBZ`kA-}5 z7vs$JrE~ctMU0qt^77(yF^U}Z+%HVeQ_qtp`S;SYCg+ri*VLUTzJ#SdVY_qROnaZ4 z+UeuKKL6|)ERMN2%IryEOg*w;vz;|H4RRCCO%t zbv*j!k-mfRe6qTOH8CR!Ue@iYI zuO3d~e)l>}Wx=PCcQ&nbzhemoudf(xh{35eSngNLjhwtRdFk3AXNlE=YCOItO7S|l zlce1vu`%4<+lkp*l@_yZ-nC%W6uXa$C8^C1r+UZnH5%6Qk5>Kkn&0Vf0?;unUCUC1 zsHl=8NfXQ2{DU?{4|ePGI55h|LTw-~_e8P3ZqkgCz0P)>(Vf}rs{(0HbPXyz4z!7# z6_A|Zq61zDI;pC(?=dn_(aS<#d7rb$B<426VRWy*j#d`T-lfl9aCAWqr+SWD6+UcBRxO)idK@nl z8PH%Ie2L3^C%bhwv)N6ZP>;3jqHMK8jCUYRrBkrU`iRX{cT!1#*| zJ;#--&iy`NbTI2;OB7%?z6tOL*~?^vd?pcJv5rh5BI%b%mrY95#p)ALAE-R6-@(zM zZ>b;Xicp;)peKNP!~M%+o7?V82KlyPT)&K*`YzL%bgVFnt+B2~u<4GQM{c$meatV# zNIHHWrqrZoc?OIh^c-NMn`oa=F}VIg_Be|`abeeA2y435%IdRs*Px+Y9#vnKb1Hx_ zbU&@fn7u@mb~4}d&x0HtODgl@1Bq0_AhQ|I&&|?7hifo%+hb{0tdw2sMdBJimy|#} z4O${>p~&ttM?xb;&zBotvt%8%G0SlG3Zwj3D;t_-LHd=~QhZuI@{?svH zx5L0XX+PgK*Iv!tPf} zUDX*j3t#EEP{%j*Eu@n@x)az;pS1I=u09pE(Pi`$2S;+T&}zE%MItkngqXI7P9tUU z`L9Gzo{^TUieC51FFMqU4$F)X5MowEDMBAQ>ifAadTV@mRV6}g7u#md(KO*L=MrEQ zTq+=MSz3TtpG76s3v2p@_IpK*Qxb$VRk(h-=pVcpZF~4OPB*)a9~{3eGj{h_g?F;O z=K1#G=}0`wb4zR@0CGpPRCfEf@4fEkk$2S$JwsA-n3&IOq{|v>FCD#HyDpYOeT^8w z^N*iq9DAg}op{gL(+q96Pp{P4otxdZuiKkCZ)oN3Gj~z4Rs)1-mkKHMCcz*|QRc1^ zrEdK24tQ6ZlON2H`GK2y1O##Ij=pZDHbTz$=^1m?h~Y(+h49h?k*3i}>wm%QSBuPZ zY$K<~8wO3~j=yE%*2!l!4t6+E4%T;kxaaBCaVYTu%?{Bwu3g6sHyr9}ol0xYVQ@V2 zEdB6zm5GCA2Yvv^zVI-Rej{KAY#;&t67+^^+^;!D$1|&6_)TyRq>P)q?xo*6!zRql zuFA@@G^sd-CyC@cC!7s%YvHq>PVdYpy@x&q0!gQD37(K*;bKUwzL!sOw# zrWb(`ZuL2{HLov@slDn!w&(p7^brCX>;0wneP4pxaYPzIWC?^=#h^4z1e_uz%vNY^ z{BQT6a6aEqWNK&`l*q3nfp|H-38$p#;2=PnbjDE_WS(AbDAArZ9yx8`T;6lt?SB>~ zw<{~CN`-L@h(D~rs|ba%RjIJ)ZrgU&5}-ARwE^n1H7D+@2S9PG2#Tuf@_xgDipw|3zf^{(SjY%&0W2jq}I*Q__ErN$vuDli( z05iIQG6+6b*7{0mgildIQ~j-bZC^8yD9GUfDPDa*$F%LuLAlwRf-&5QPli7~!odNA zdeT{YZ@GrqYFxgsfNZX)j>}97ch)YmMjRgKp}?5ff?^ecJt$9O5%j>idhC%%WdAf++s!pQO&UJfH6+j8w_)2@(s2L59Z1tTPR!IN2-(83pM8Oa$ z(rI8|5cS@#uY05nyjf!aH+Wc_h`2~yt+8(}1tYYh4rpPVH?y4LtYd^fgLz>Hekk?o ztjC}YtkhWP5yV4t8-rf+ZLud{vq$(8o%A2WdpXx2VP~9$R*BE=!Jp4~4*_MQZLF}c zu$*xGpw&@jmBfxs^t}MTB?7KC=yCWOScy@Q7mhhZY@{JmT~HZ5QUHtNhI}!*KJ&z~ zW%&9VQ~D3t?sMBG6$*~M$xd5Khu~@#oH;zlT=68b>R(n9 zJ`|wWXLEpsMAxxv?%doAy4Es6sSqRkh$@PSQXEb-t@=6f6mTpSm3OOCMtkFad^;PY zEcVPomz)PO<*xgPKj#S3f<)R*R_(lHB*6u1*S*a8QhFSU?HvJLGX&<}pk%I}z?LaQ zuhT)q9{}+*gz;-GX97<)@%(S(h?jutPnfnHS~<%72@xIhTQ4fsau+1=4MB`~k;BR2 zAHc`hmVY{cw-Q>>=k+h%nk%#C709BZF{PG)`3f#k*=Q;wk${nACNPdcs#_c*yEi`a z6jELaweG`&qF}M=5?pR5P-9DDPG#6ggmm|U<+0lcV&O%J>Up=yK4L@IJGa*7W7^+e z?Hhww-cgJkH5e=^PkV4F2EbvWh|`^)fuN(9p783fEV2gYzS8&F?FCE!1l!BOjq?uy zBP7ENOA`sG=i3g{OE{ie5RnEdqkT~gf;_6raOX*eIGT}g;E|HLp%(L1Xuasu8(*#4 zB(3?1HJIomJ8^y$&BabD6ulDF+t!sgk)Dr8y5>F-9V8zVnk^;Jlq4)zQ;s>XnGpK8 z`02EbRvzHbq{`$@T*bJBi|ll>FjT|adyhlE`uDi+0`o3T9S6LNVUkexeC)cFtnhN= zrh6(!+FVIXm-cuJNcq1weBhk^=w*Flq#QKYs`!?Xe-IwF z_7xmoMXF=0V7%c2yA>JX-==U~cNM+;g*~k=_5=S}K$c=icC%m3A(uQ~xLis;J9J(( zHlMa4K zY9VgYXw1OH_^s+bx#A%)8X2LbZ_?NQZF|qr5}FvKi-%Ck*tbQN79P z^REbe^Nk00wTO4sk-)FmXoUP2CUy^;zKAexEMI^Tr-8h{C`(uK7Y}L%bj!1u(UFG> z+3ghS`Kt?&5$z8-iUc(QW3+iztmDkL-z&~h#a~3%myEa%aZ~*h#G;Jq*p?2Rzi zAF9i&>=>vrK5X;xD<;5?eO@H(?lL$eD@5O!KPrLC^4LGvTc1{@c%E<)3}tuE*VB@O z-;m3S!L&B70KZwi)fdQ5@yBsDIke_O z>}8LWZy_XR@Hs71+e&$&uIng$41Z0Ou|3X^`WLAcD?qw+#$+L>9LFR-0YhWaJtxRF z=aq?9utX9QPK}&}(;44UL0~Ru8N#Vzhzo02QjKbx>E7SpyNY6Yamiw%Y~Esw2?N^t z!hup4OTXngC*nZgE83Gp*vA7tJdEHQGvrsv8}`+AOB;)6b~aVeNgzfdF0eJP+0GGX zKjxA8EHyS^9yCL%Obyl5dxLoykm2}M_yfkg(bzaY5-*vH1piIixR)3ccH1Vo#s{Fa zZg@(*&)Va>L;V)A&S$f_^oxRVwcN6?D^aRZMBhz@+*Y3X;}TXfCascL>q?@>_YnbI zV7X-WUy}iq9(W$o_ugwF5iSN|vz&wVtyN%)eg1Y1cYiLx%uab?n%=C6T+s$?!`tg^ zTRL&aFiL*g=Cu$cY@U92E)?f=(@O?puF?$n$dQp?F;hERY|3jwW}2RGzuq-YPQ#L$ z2gMipPJ~R~=(02llMpe~B9r#EY!%PvOcn|fv$k}cR8&tNUnji8w!l2*!Z;K00xol| z=^SO!7vSRL(ek50JtBe;*lfh3Z8IC^*L&Z`c&>i8G^2u%IE~S_l?6XRQ7qnpEzeYD zQ28*de#(+PCkeCXl4@L;>Brwchmxzrf-DK)+t@K)`o6s|A3AVnIpp6i5sA!dCAR7F z*&25sM=Pr#_%wS(~S&8EbdtQ8?a9KTL@{4 z7u%rXix+53@5$;4xce6ceq#xo6aQha!21Vn7ZX|pr^Q`Tp>t3;<2L;`c`$ za~|Xo3c+6>ejh|O{8#!ZD!04v*-i1Vf>_`KW-L{cUR8sgz;Zv`MD)I7irrL5#M3Zo zZWjE9ATXU|^YwsE;%{*!J_1`k|;&Qd?vM;r%px!)&-<`6pF>!qawtRabd2H39S-^X#V3W$ z2X=p`)n_lfQ|ODG3;pAD#bShKZB}${tj9WYZV2|sXz4c`T;xoRAomR4`uHnA$>|9$ z)wcADPJVG`x6u5@$lYmSknoqcYes0oT?mdZgxxtdP&ayCWh1_saBQ#yWL`Ch@I zCHM*M@jr)*XZ{@QW$4vP2GUQL{qq8++a9>!{#HHEPXOmF#EAKL)AS;J4?y*V&J3`f zY&!=;{(I#kuuZ^XQsB=616`cQfdBN5T?qQ43(PVAds#n`?s53@%@6_=0#ID9(j%jP zUpcIf$W{llS?EiQzGp-);3!pjPxjC|VEQXBfje^4>!q?a{cX{q{BHyP=irVc!Ikc3 zdGiJRMxldZi*V1~bM;F8?-f6I<#Nuht*G(;vmp0?qxFBXL=pGJ=0J6Ed%LsOUwdWw zO<6VgfyByMvXswy>Ot`lpJNW7(%qOcOXnF5GGmPpw6Gcmg?QBWUH5)kcp4tr{mpc6 z%=3Cp2%Es^yV*}?zdV1`elh#`3$6ET)fIbs;+}X^CHGIF=9&j|6*S=5Y%%iKgbre1 zyHEFi$tXnKM+BzLhMVQFb^@!~U=F6O>0!tKXhRiYEN5CQP$A3JJ+bZX)o2zw%O@Xx z|E#LEG4KAo^g!Dx{Y3D?94k#IG~44&=7ub;n9X>!Whu_Ljv>Cq(%1ZTUZ{uO9m!u5 zu~6<68=piUd_do!ZmVj7e2h4EuT= zB(xHF(7$ak*9RIar6pRG7C%V|%-|OM(W{;k4sK7|xg36S-okItd%Zdo;nudJ)V$03 zMbxzxxHHber5W@#RPz|?xB&uZ!Nq7}PY}Aej(`IBkN2XKXhizk=G$9>xxuddZ^N>U zKqj3yKX@!+qQ4R-hn$S#yZ!j#55&0&`O%8UNdWlmMyryK=n%i)psyw)py?kbd>P#z z^6-&QrQjbfa1Z7bfDatH*AUS|-F-mGlWxI#8JJT$q-W@ckXXjg7Y0BL;HP=*(Y`Y7 zT?uFkZ}%byc}iuwT)Ca1&GLQM)Y_ggYhik~~a*vQNFe5pa68XsEb@Qaie z=mQ;aG<4d}FZ9NHr^RnDOcwDZJte)S@1xg*;MTIwi$Q^}!1vx^uJF<3|0lHyR{7v+ z+n(SI7VE4iRI&~!l_atpB7H!65(AyE@@FvEiF)@w;c6nEWx%h*J`3ASdH4Sndc6lt z7!t0ld=H`v*Z05!mVC1YHxa&yJBvJ~2KY4wNn;;X6p=TU8dOqF?U^lHM+r@vhsLP3(_2ow}HM1UdzFOCLTAs>wDrBwzBe5O0*y2DBTHIb{|c)K`H0Fi{~G%M4;O{lsu>yL;jJ?uWPBMPPL zOk9u!)G|@4|Hy}k#(5}THnF?rftL;q*=`}@Au=?E8d@m8!tCBzy2H@MkEnb0dOCgc z=I7gzUf(7@*edh92~$!)xhQ4L#Q6Hf`V|3SUgey=d9U+7yVS~z3x&SN2cQ4?@U;;C z6im68@*ejuJS;sgs|Ds&j!>d{hooiLg-k;;yh<1dU;iCZd7+VGWoY-XrbRum5btzHb>lj`lm ze>|yk0Q3TsH8rU8G{iF{8KuTVBYK6G7FcaNu9(0J6kL1o$@r~++2e%{6X~G5Iq2`lfv;=kH=OoO^yUs8k7XW8W zJ6%3*mGA!zYMyibHINDQ$?M3=e(gkL;)c|M6k7Vjrbf}EqL;^(Ds<(fsyjwr^dmq) zc%xcm?gCu0(Y$sfLK`%h5$)=vJoPVeTNQ7oNH)t`i1ksTWGUa%<>=Wu1Ay817FmR! zf=Dq+N!cVIV@ZK6?Z4-f!-e{UJ0}F!X17)$M~_#Ns46%@(ZLm_W=e?M-U}{K5t+R5 zcj!n6Tu1RIkv@lyefw)okft>}7sH@u+g_u?oHS4xhYR!qa=oOquvrw*`JPo&zG%(+ z&_XSPuQ@VzQFIl*v#geJgJZo(&Hzf-mhX=m9@}UpN(v=8a^2YjHTl@kJkSHEtGNEv zB);>oNfi$3kdRr|Q6p1g^g4vX)IS%y)qLXp$x8=m$O9_eP%SGF`!GtV92BBbYg2HI z#aCyFf_YmXFD-q{$70$$7en4Trei8*NcXVBzXysAV zwFlVqY#;E{3awZiqaN=&Vm>!Wz|Ko7I2o3C0HEu8sS$2fe)~I%{W>S{%q0GA6^EkA zB=QcDw>oin3pjCf_CZG38%ufCZOol;75u)z|1rvRP_)nyAl>*UVdETW9F*duOliRr za{)wUY#NGrS^}Z1NRwVZX|Wf;cPY@x6k>fT)^w7k15MD>mc)ZQ3%8_K==JBmH-CIe zWa5zfLF|`SFnsL5L}W2v0vjp=U4wk`+iZDeb&(wte4Wxl*gVw%pMAC8C{hI{`I#13 zDxi%VO32$qTj{&dPFXR0sWUsaHF^f|ilVkf1^~x1S?~znydiE0Cmtlnx*L##62G4EnO<|zX7Z( zk<`!AXDR#v?AQ|@uEO?*ti7zCUL^e#EyS(6QW3xw8Y`7;~j zrJR@w^rtv^Znq<1XIuv{ZDd<^g{{1k~7#9}W z^1{}}mQQmeTwlh~U0<#c=NNmJd&6dhH%WP&l9JJ0+Ut>l_%n7*=0cdHA5lG%d_|%`4bVJvem@B1q@o`;U z+KsKBMi%#h5RgLH%T~%K@4D8pg(vwPkPZd*h3y57v~!?G(N|?2suyLm-|r=*POgQz zR*E(LdmgP@D|r&_?n!*+XB6LLC#@Cm`||j~hF|2#EiW)i`i!HD5r@Lh zCqAfZk7$gLay`@>yidWhJ47e94K$DTyW~ByMxKZZ(9;Vqgk+XD-)gE>dBo{U)9O-j z^q<&evNoietB_5_GIGu@7hVzz`3+NzW&FvEiKn@ZI7=B2cr*aDoog% zF8x@tNVVX@URgai>fcK|y^$2&Qu8rhcg0CHYyB^5qCRdeh`nm+w9ro7eB>l>7{5V_ zbNrQW*-wYBd4_#+k)t0YR5$xxT+%stBW1^EEU&2iK`lH+(oT)^7`s7y_1n&ZzJ6iq zIK${|-Qkm`nS7%&D}GRQX(<>peLndRYBoa7zKe|9*3HH1Nn!TWKJ90~eyZz)uXr>eo3!FvdwKI3;0QYPRIb)Z=DYl6Tmhnm7w`{Hd1NF@9!tk-?p?{(_pg z5t4e();;6gyHv{z0&ax9TO+a8Z@@M4GIwL=)D{{d^ULMt4ilyJXX|(n2IoZT7*eAh z#6Ct2&8vNjV#%xV?j(e#JlvNjHp6TtmS?I`gy&u+zHn`mow>Af-DR#JW_M@j5-rUu zab$?Sx^H>3PNR;i#g)`%^HVxBpL&b(IbE`qSG^ZMHum!ckG`{=kuk)?X$or7owjrs zTOOpxxYe6#oui29bJ_9Li^@yeeW5b92-aDWRc{1I?vytp6AHP$3dle2KdwjJOHDwM zTT{1EF~fPk9VUA|Xi@V@i!Z{Z^@v;YEr{8TM#>YfRrg zS*p&wRJVlQCf$941FlYCN1KI}?iZsa ztP^*8_YH`4hRiClYds+io!P>eCUl~aMY3K-WZ$!$_^EfsQ9my~jD55%wN2xI$ii!$ zQIs5+9C<0!zSsEJ5c0`0-B=snvSON3)V#gneJd}wb+5>-&c`-QkpEyONcTyXU(Gw4#Yj{LK%M3kdd6VtvWHIrZOcGdM1g}rr`dQIJSB&)Do zk)SG56Xtb@*PHi$K5w$w(etx0F|!?iYKKjuIZMu_3a->cK;zo%zgaKdM3rF>*d3{?JiEC~FQLsaCPH{3C#2eCH0m-ny2D(E~vj>?8=6xv%4pc@R z;)?j;O1G1luJ$o@n!?bzE&`@=cW+D*9pG_6O4pCleNfCg_od{jE;OqNT{*aInys-d z+6Gt-QV1oQE;eRDwcfZ9{_Fbpcj~6yd#g{gn)vV7+!QCOgHpC`tj>cj&Q6wGXKomN+)>Fp()in>~D*70C9?@t%} zH@=I#a=)0XhWrT2)8F>@}}rS0B_r0kj1J8RtPZO?X|P2@PCgw(e3&U z`!Z4t^?HJ%vSgC>eS;*_1ZIlGTzE{OA~@@#R{GYih{|(U+*j39>d?~|zaxTL#2sDy zAng&d@{3Tx^}$SvsTx1eQv#7To)t7NcoP{M9z4PW^47g!y(<|j!RTe`03)U`J?HwP z@*SBME@tS|F&~2d4T;WD-ts5%0U|{b2&JDFci>_*zBl&bWV9IRJGS;iB0`3`K38S1@V)pHn3{Zs@r9Kci~GbMecDjYB!>4!=rgtKAd_O@IBq*Yzyxjr;Sihqk3PCEt37gg!2Q z>tCcCR4}RPG1}pkV4>`CV(Z`ji#J(cpHuw#Gq`55A}%px_O+n(n|#rP3-_9C{+tZn zJn(Gg{@XR3{GU8_mHC;s+|w<$&49t7ntT8Mz?!B2YdQ@FAxjZ-N+83?7+}o?n?J23 zdO`e^6M&dJOpi4G`4#cQ2JnhZ#}$?TU`-wbYw|t*Ko4a=_#>Q3fHnV4*+4G<>XlWy azN!9RTF!hD1fFK|?l5=cwu*o)2kem^f93&%3Rx*g> z(0~NVSp@Oa@_wHC-Di(;#{LKP7l#y!S`}u^s`;B&tw?Q6WfCG*uiT^t-d z3=YmEbJ!J767o10{ELI@rmHN6Q#L@qj)TL5qpEQ40m^i<<#Gz^*kr4}b9m0ZDnq7v zV`r~$o=>w3Ax#n%!wcJV8DukTD$cKPCh=jKFwKRt`PKf^^4j&(?bNdEvL7D?J+_1; zMjt9~7d4(4#AeW9yKe@b3r?^y;S#FI;*rM%;j<1A1j8vYrZ@lo@K5=B7$>bAeBa~W zXPAO>tPfeBr~mVZZ&YQ64JqOY{#yws=A>=8^50*BCvC~Kg}x~)`mB*m=sPC^XeF?d?yB z?YtZM)%^iyThvMn9$%e%n8V%Sgs-@8314OgU62QyP0xp!cuukjl$DC%zniptP9g#$mHznzwS*CE>p{dm&iH(n z0vbJkGHoFrZ7zN{-o4syWRk1&JVSg8{T$JVv{Txyd5{zq+g`HX^C;_pkBRYdas# z95c4j6q+l-_~7uf5d7;kxDTZ_H2xK%fQjsL^Xr?bCNIlxeYJt?$>YNzpH z=Be-*1Abx+-`wt|cT?D*atNi;hY{TLb58Nw|4e7;d^BbdE_E_gYNL6oRI=Jh>&p)YWn}0*zUp9`c0SOR#ln^8 z1${7e^8sf9pwZV(ro2}(sZD*i-aAj2hj+?R8wpSI)J{CbPCK=&ZY5iqDU?2U%S~zYs|a)q~Pk3Fw_=f1VBo zGDaKx3>PS1W{j2G?^%mH2iDgH=7r&p<~y9Wc>R766i+vuQ?oNLQW9&^ELLa*Fn~3( zm9w2K8I>hH%DnpP+?pvJ0GGg)G@_gT&L3+LqKNo4L*rgV#dikQm=loA*v9DUs zpVg=qI;>=R%?WJPjCLJ3Kx^rX9Pkj=)x-yNDP$?L+y=xepL!1E+>^4)RY6w><2}#2 zvH$(bh^EZ%Lz=nH#Bk+u7-o@Lt~m*lm(xjYCfO&@POPJlu%z0q*L^H>&TwyRTWNq9 zkA9GsamE&t9>iNWbK8gJ&(Cg|uy`ffTi5HMp>V;V-xN<;Hm<*p_BU8c9BqoI*xNF1rF z&tDtm?Ts5{bn;n#pAno@Bu=xXb#t^WPJw^U=JSW9o<{SA9dPPC38_$>E8RRr?FE4H zaNq3)jz00#44o8mX$McW+*zS(xmMp~aml=ck3>3HbNxF=U+jKm>ESGSn?!ooexkw< zEi`Rk-6@xRAtcvL$@6gAKeFg0Nz)E6YUi`9x^9Q0id%oQykAVZa5)_Gi_Uilmo%)T znfJso|4!AFJZ?FeiypuFaQ{Jpna9{e!2;4E2Co^xsK@p(DgLXOUSS)7!I!TOHBCA# zW&wxFiU&OKWx|@Ek8{2|3}wyxUpOz`NmYIarVw-LvfOCm(n%$Chee@r+|*Z5M;3cI zSGQU34_Nw7QRx{fw5M*A<_q7`ED}_G2CUS(EJ?dVuN!d^T_JM$85#73vS^u#-1PVP z!C-qBog)^Xsh&Fi_h8_~oiYX|b~`o9DWdsCy4yD+yHYV3eC`m2fTP-FW`%{@CuZl1 z)Pk**Rg0+}iIyK{-o3v+4O|I_PIL7q(bZ>kA!NaUz?j3!Km6ia@zka7=-PS<9E_VF z!SyCrNm0aGX37RrPIi{Bv2RwKBKj=1DUA5_ViSSQY5<#cJQF`lAX|v0XKt54o4@Z0 z2ojz5bE`iXkZ3;~)w)TV+k=Ny9&_1$xm7#uh@G-4XBecfY_L%k4MaR5%&olg0>l zEn$}_tAwS!cjT6eu%$}1Y06o!pXdkx-xMyGO*V+w>Y&gfF3NDdZz2Ee?%c<(hVx}j z+eRl;^1?pP2Cy&nG;dtKi3iVpAu2o>74x=6No*-so%#6wG!qKG>&!AP`2Llt&n=?n z!1JY>f}J?85ibPf4lBriY1$A(JSk&FGxsGM*}gUWE;VV9*jXn1bK!aYO?J0W>E3;U z-RNQEn=RWOzJDG295^1dh_DXf;lXIoH(7Gi-aI9G8zL6TBsYv&hgoR~k3G;SC}1J) zpbTLT_1=RmnzvsKoA@ZNdO?eQ{LYdN&YTy8n<`I!dl^Cgy3`(}16PX}nxp;AoOX*iPtdHEv#rUiUw9lpO1TPC z^j2G_J!7w9Bu46Z!nx~)RfooaUJU0S4hxB1o@#|k6DMP^5#)=Wc(tCHEQi0U`qs6H z3R=w$yx=qhb9*56pwOX$(DRv$29cHZMB3hh+9%4q1f>`*t<%pwZ1B;~#gQiU@VAtq z5l(3CO;~1iILGg^!&INr9T)OASz%~ZT?MNOCl}fFG9uXir#J~_l~{}BDQPT&DOd9g z`S5EPIT%0P)8|FuJS~SKIup!S^yGucezCuD*sSc{-n*UUKBB6FBHJ!tZd>E0W6@$% z{iPJ~+5suXh*jBM_)%QWD1}0I?d?94_702lB$qAWkIWKkO)@YQm%be<;OE3Eb#L`_ zHJfzl#T`va;+?4!WXxoB-LvlvD9JzPt1`+i%15`e20Exe`K}kfQp!ae906Yzwehx& zS$EI5O5CdjQz4brT|!+sB2q%i7}5CqWM0NI^PA42-!V@*0w!KI93+NeV68~fvT$3H z_?TB>gtl!P5z2C7QQbbgKcGQK21mDzdw9G|K~I>`QPe~_^00V*e|-G5u!`Fl0TFXs zTC;5}=~IiDtk?R|M&#@$@<}a$P#d`0dy!sEUzMuwBq0LR39HwJqfqM1hs(puhEW>3 zPk*n<{E5ucmMfW@QHn9|WjKCQ5F#qPPrApms92z5qM78aFNWQ-kRp}b{is#aVF+V) z#fSI8n7fqlt6NBOj~}>qH0~bW-g!wd^=k4nheZ=Z$E3%&$#^+8ek}VRUF)V1ky{+` zyvc@6MZT3G!fvAt$n|J`KDm6qkvE!3|l*rY)Z>xn5eq;E%a4FTOP}UHz!w1 z2-IZp95`~U?VAWQWH~69v@m%IsvMa@VQ}B+#?T>-Id;hh%ay}DTkWGMB*^2gsK-(Y zxTg2tm5=JFaE^SW8#BD>R;b?-MRUxF zyKYsHkWw>BC^&N|G1sWSp~9*lFAlZ%m>+%=;%a%T$zBv2=VuG!m#jp8u0BmgDG)jt z_{gQw$<@yBM#8B18`tvoBKgt#XQMrW%je*%%jWn=&xQ`o*llr=&#D|hB$Vqf`5~fF z<{V2Z$QDdT_%mMaV?PdNS0roI{+gX<%#8JrnMh!AI^{lHg9v+?b>3R)_TUoPS^GyM z8&mKAYmW7%dQ;;&JTj*F*u3O9+C?H}^f(Mxr@`cE7OSM1-)Ul^@|%Pqj)#@#YPk6_ z8_On{e?;ptyZ{!`P5I&C*M{KDSb7P$mcz~rGOdVfM0%X|=Jd_kV@BVm!@6VN{jir` z79jYga_XC8{_Vkogni+?UxG#UF86;(Y&a-N77`&>?!8HqgG<)c+%IQO>RQ$q86ONd zuFkSqjI{7g``~)N+K%PLfR7>F+-Fb|Oqt7?18>9zzZ*So!Dc7Dz*fqgRg2Nbc*pWi!y`2>keZ(eF*hNSF@XGY2IVVL@)bn#DJ~o@?nXa?iC-q2anyh{>F`8)xajne=9aoHXTOBr6h#) zE?{PbO_MK{yjKLXEXF0a51Bqj9s= zALo0!aCQ!k%2|@!D;pP%M4A`OA{!3#UHYZbQJ#|TQB=30R55hd9r?&!T<@s)LK}k! z9$*5-Ml8`tM7XTUUezlqk7roB`=dC*ePGG)A%R;1tA|TIIk{d#o3$5o0DATp$v)h?P33FZ-ay; z8vN})k!^666!X2{paNT3_~+L{k}*T<{{*ujz#{?C1h$vI^@T65u7g^qFlLpuIvW{S zn+`AhTY)_0yg~#BdNMy}RQ$Jq+*%4WZX;D9@81$m22irDzJmTcwopJWy8&8fJU9dY zpOSTO2vD=S&B61}D1Z?((vlsX@L7rB{I}%3GBB09iQ?waoBy_R$OlBF-|l!R{9B@Z z7nF>o_7MV)`cGGazd?axRs-Vxza=AZZK31=3r)lSJc3JDlLZFksEieaLbFXf< z?JB94Cb^fYB>V6yg=crg&Q1bIjJiL)$G0pUKgcqk`#l!SR3~p+`D5eAww$+qAtbnU z)!!|CI%MmO0PsPff}s@gz~cskih5EJW$`Rs(}Na4ny@JZyj~@`C@I z-3g$+fI@#0uh}vFi|yO~?Zt`$*BI^!5#PAY>cddp_~YHrQTAXST*dtH=fJN8Ut^Xv z`~|`%p}q;`WBcygWU;Nkx15%Sh`K!ub0&~nw9yVXtvG<=%HhL9(d-F*_!LW0W zd<`Re-;JpojS7P55Wf4)R3*75n87~Q@ z#PqWm4+KzQzSpEzLwnqiJkD^>D__LrtFKHvABimlU24mZm8NA+wMdW~Rs5Ic ztUw!#H+2JWPsRZN0mQZe;u_vaDK4qH|B?Ii%&&cwT8j~J;zfN;aoNorK1vLOh59QN zTtat_;6ut-C55E{i5+_Bv(0Ln0A3$8(^fzvnO}f7lQ(tSXQPxFBAd>~lUCsXqI~#~ zG9UQIKPBMTdONAiIa!wXO6qQP_U{rlH@g+4$)a{4H~KR^0 z1IB^m%%;~~Q82Zhq>Fv6KA6XMW|R@Q1lAztP7MKM7!GW4wMsS?y_xUFO(me{(;Q$W zrwyZDwC7_6W+Z>n2C(&ZHU1W%nOq7@F>?sg{H5J5PXWzc#DY+f2;k_z6x(-i-^B<5 zXjRd}5{AdzIPFKv!TaKdwAS$dCi!< zaVOFm&=PQQjIbD0wR3ws6{~`jy$#2_RL9h7*7kw*xi_Z~x)E=%ui@@aZ}7Ncgg-o|cq{*zU(mOWw#B@fBya z!h|z`#bcfZhBJ6Z6azhfMl>w|(s%;<1GFP|og3x|34*P4BSc(pn?d0Emt9 z)=seaw2J`P#ioQv1dFSo6a(pKG^& zv)}UoTT*Ak*t8)j*5sFBPGt*O9>!bHfUDA6HTP=Py$&|JCTtj88wBN7{g>mFyRf^c z#Zv|Csya4Pd3@ICtqj*Mw}ySy{&5j$e+e>ar_u5g~fm!RG$~pvK@u zx|9WsVuY1c{h_@1Ko^}8J(T03NwAcLolDZ?#d|kuA+sLzPQS{lY_4@%fxIwFu%rUQ z_zM#)VW7T9vsJ|X+V85qB3WSib$GzL4kdvTbGfq%SpO}bTQ(@>$uQSh%C7a zeT^BW9a)%^kQ z_jdVU?<~Duka(@`+DhB0kYv%a07$H1bj}07`W;>h=Wv_#7{@$KQKI>^-Lw;fw5VIS z_aH`SL}jlT+JN^APSb`=y*mgQ3!Z;O%9*Vf`amq2D#CQV2)%Cdf0a-|0On)t0 z%0?|sjjw@qWlEEedBayA)wr0#iH8Q zVH5UCXt^T(l}EjWSV3Btw|2YwBeer1GA3!PrP z#UF7(@+n+f?yDdpqYyp=vrY%?oT37yFGWJMN=lNSBKpQ+=sa8(bv$7VFSmI1sSl(M z>04~jafGU)GT2AWiIj0nQPwy8cJK9(veK)sUEg8%j*F1m7xcA55x`3#ge4=PEC;fO z#)*MZKj8NDED1Ec=9}5juL&#t&=@Mg9yFb zVcE&=pW*TCk&ZnJnAZtXE$+5BNiBSy)427|qRUUJELTDW3MWEqa90vKZZA^Chcna@ zTG!m7rDL0Tw8~8@(VJDKgh#$6hvyxkBpCuG&!TU>n1?SnfhP9GoajC&Vc=^#8dv(a z^snPWy>}(>A}YAL7ri?+LWgp(NeYi$>}_EtL>6RO5w9VPN!0$8Oc^HC)+Mwee_`>? zUTJgBhwJtF7WtE#imqI6GuRB2#|@j_vt@YzNA=-WhH>TxcB#jbC>SnDDH@WqC|58` z2ObrhDLPqvDOVp`KncO~VV2G4$)a&6TZoyH|7lU256>)l?x%z=NSBhhqk4}RQ`BGZ z!;NbM8w9h8S+5KYyg0~4DvCblI$%0GJJuFDer0HNv)p>q{;csX*bJ}2n4WS{+E`?F zSw3YEjSWfgnFhNELwk4nvh9Dh03|hhU3C0VT1@6Gk&+*a`d&r6d_+VkF>+kOR3cWM zzWRuaWG~~0GV!MBHfQMFb(&gsIUW{EcqF=Z&oJR6q9|EpSb;*ZT)>akA)@Pph>%lF z;2=LWIE^%Hez%8CBj;$@Va0rQZhl->enPL4W6F&Evc6PObWolP(^pAl5NXQ>gQ)+i z#fxj{MBb_Pb@|qt0`1qF#iP1#Lk@(XymGi>-ZIs z-VUpM&|4JnB9v;Ym{0oHgCz;$xO)?QDKXx)rQlwZBOn zU#NX9;6#@nDqu?NO|J6rG^z`81W7A)=lpaf`{c%-PZ&iqm$#QUd%+$q&dQW zCJ^Ua^F-!myoPG^ffW?B?|zScqK=n9lIBnOSPH*sgQkq)LJFjL1x1s)gcINGwOBT8 z_`G>JQQOhrwU6|eBs)Ad-R;vU?=;QebN$w3?BVit@Md~kw=tx zZC+)Hr;9$ck+^ciQ4zNM4xFekcbU0=PiO0=XLQyK?(gz;qs992al6cPN$;aRe-Nt) zllCH;-I1T3I4+t{cpKaVfX?=y2?dRGKl6~;y~+6{yGZ_bpKmR!X*?K1)TYUInX+k{ z0^;-Esg9GS!n3)`Qry!b$r=YS)en+e|A4tE^&pM6Hc+tChLwQu*OK~=kiVlQ8VuMN zS6CqxX4apf{?|ERQwLVIu~5@lhm=6&ASzmm0a}ht>w`uys4=quL{0dMcy*S7oWDJZ zl`<5bG6i3U%L+A)KZ$-Kp>6;OlV?(cNeNUw0I=DnA6--1F_3T6hBxK^B~d^YQt-p( z*yivpyGDq8oe7Y@Oe9%)4MXp}`wBGB&0*uq6riIMrWY~L(97b91Cq5u{B@gkR|aH> z_%B0c^z_aOHkfvvQ43fm# zqZ9NU$5VwMMli8Oz2b#TL=TLh#8_2X@hm9astsED%i?6qz)uZ}HFpRPAr*_@|Di#$ zLKjOn|G=8IYK?#PI|YoQ!jJ#1cF=G9|3kl9&t`YpZh~aKGdOYlu(78vl2XYD2PviK zdw=oX-6+tt{J!<4L<#^XG9ksN{#Iz60g7G1j+ugOK}$`k|1kg^@PCG9n$&tsU_9|| zw7>nQ-TwwfYc_v*FPP>Sj@`5QKhl61bjYQ|)YV+I7si#sl(KK5{;BB!sNnVD`vX46 zl%6g%xkGQwQ~?tlsqdko2yiq{2vr8e7jOx`Y6KOvfV6b$+R;xR1!Sr8kE|C2_j97b zT5sx^;Cl$oB?s9;B)=rf?s)5k$JqC;2->1F+jqMlu<*jWHqI2B45qr4`28i-zZ1`h zPll-}E^D-v&4cSi7R7UP0s0>N3(VAp)%WN8}?84An+$Wt;S8f zFpQtS)Pm@!yZfrXZz)c%8xc7tAR$O|jiru%ER7bo84Z)cM+!S3&GH0Wj)&w)k5Z{` zc@wHE6hR|N^-uM8@ldqz*of9I-(FdlP)+eMz&LnIa*l0t4vnGU^M$D9Sw!&~nf2sXOJxJ9zF27zxkLj>i<=6vI_q`Z(zg`9HvX<7M~h^?fLdBbBZ` znX={#-=+cYi4iQk`jX_~|nB zA)&ymuTA|vJ?M`c+Q#6Ysu=N9Idz$TN1L6q@HFqX?ZKZ@eky2vZ)F+76+8g^+9_ZFuTqttqeww-h3+QpTUjA!GmKXtl+~c2bIBF)!_&) zM$o3!$*)wb_g4KbJ8%mkxbIB<@s7SQZDM&HVpHX`-1Xy$ zPdXBbV1n;#{dflrojY4FW!_3r?s{1>{$qCv(2sQ3cp0?iE^FWjcF4$8)c(L9v7Db& zzWU`p9{Im38}d%;_+)bSHxt{+9$YC3{Cz_*b3WVci>G}tTKK#vmxNJrBK@VKfIEZT z1EFuYpXL8fR3c6%!}5?^@?SnW;0qMjhE#3&(vS80eV;|6#jwKt*KAwikr6c> zq+n!DCZ>`=&)E=h_z1HhKXD57lGW%|i{4GQMn%fZS<6erXa=$vp!HHwPgLoDny=|o zH)a~0S1E#s{ku`Q;`s?ydl2`xTrrNB$30^T3ZlR3Zarw4Le#z8@R$-ai?lO;ozE<__;3qM5jSi zRM)Yy*8|A1TgaKbUic}cX$kGg-MSs@UYf9a3f4T8_qzdJ0>}uMra~bTmLx2w$ev4= zd^=@u2NpM951fea^HJjZ%bR+`hO+r$Y+yE;2n+nW0CyGM1oD?zlJ+s`G%(LYE1&&c zqq=6|r*ff+x?l?p*xvfJ*iXIyqFfSp0Ll{^8t>)!_GDwn8+DhB0#3ivU0Rqdgd}*F zx2~yg@&u`0ctU#{lMJ4!Py#}KSqgUt=&veHSJJ~l{35A-`!lOKM)(`7x?jXt421Rv z&xe(@AlPDP`?j#Heko=;VUK>f2tUDEsHjq+?3yCdYhv;tG(#+LB1e3`E?(5l`PfZZ zraL^v#m_VUo@8(hh>+C80L%ID`ZoYW;h-|9KH>4l9@*`|W`VywQq03{w1KQX&;1Ahp*>TCCy)^HvyvkJf=<&L|N|cC;5^(abC{*$)*RbmwWlel> zUZ=~6T497783I1PuN&J}LK@Yt4xd1(P%;D1$vqncB*K|p^#>9kbASs84IaBF8d~Ru z{*W#ozBDQ72H_`wCa^(Gv}J}D-_uT#3y9u5bp3IUMLarJ4^%)Y?sO(2X|%%M|!#h&=K!cism4fpM*9atj#K3#!Gw zMCYG?(F)AO0cnr{(1T&V73o6W|T>UvWO3e57 znRi}+v(`)5YK5g%kbB>S)NLievRV?RLAIhD096V;kP%69*8+lHh_qjMmjVW8THyEL zXgDA{{9zcq{~vbw_Fs0{z4s5h6aaK;jGm64qahBWT-n_LyPpVLjB_Nm>k;Zg!wQv+ z>3$txaQ*8KCbTmH(VuU9c?6`W?LeAK)shK`aSef{&o`z>*AJ*{V^7oR!^2-5mk0jl zUXhRn5K*d|4NOiWOx8U6F9=wdJ51c+1%6rCfs#(BM?3-T_?xZUz_}1Rg$aC{uxTVU-k^B=h%U z`qAQH5y~AS03gwUsrVp^B}^IybMK+Gjr~M$lit+(d(xVNLJnCT+hJN3*=_f=p^9!s z-wsJ-G+C~_T+;)CB~=Ayb)Zevd9W|>v}!Kw2?Vs-YeqHcU^o3x0l>JH=*fJnvb-&8x`js7DfAybORCpj z8Kj>;BsL(3s@<@ai4|SO(GwjKM957!8E;WV6PT(J3L-%3D zOLFlcDZt>keMsO%5a5+1j^BZD2qXra2VeEHI)5|3%PGLdDtcTw|&sam*3b7w=@>!mT-wY5Vy1(*y57q&ceo~Ces8q}s^SD_r za`Olp383l?xNUF|7WDi^F3@9^vNV?qx8HObkR+=Hf@POMG1#MkaB8`~x*5E9hwub# z>F+P~@?cgw>K%MCsR#6KeQ@#RSrF$_@OlPDbv>Q#o&<*q6P27tdGSNsESEl^IhoZp zdMNp)K$?Q?=A#JM$3&&jT}nN5_+N!^Ug5$e!3daK#0wyFHV5?fTDIT5D$|3Ecd78# zS9vOADN|tgI@r5M$ugRyfh7IJP?(Uj%j#;T58a%0TOH~~q5xu?%!vc*($)YIm2`kc zJbdFAILug6)#jv#Tlfe$?(dARpTl3n)Ho#q2gLy(MNag$6HYFmI!LlPG&>88ypHOfuV8E5&yIMu%6I=L1`W7grG zN|d-mCOBzMOdfl9fGvWMP{^*A!Ik#&y1c?;&&g-On0Igy7(1F|@sidJywJxj%au!B z_-v=a_T|qx+oHo{Keek^QxDRg`rbOkJOS2y^3;&BoGnYK>)i}x`mV@RP6rFk9;(54 zuy;{hwsPWq$h7nb!P@VQE++isRPpJ`aC$^IC2nYap9oqYkK9}sOnFx~qpRcbUN}k{ zZh;=%lYOmJwg6$mQ=sj!18IwPpO{bSk+3j|%@hLD$*;DhsgG6V&Ohh(dfRBJD+pw1 z;vre@&AbJP;l{ntd4dKRp*!lshA0a0d*Jji z4HG(;9PQ<6vi}L(Y<`M3K<=03Y6#g=n0#u;43=A&eRjE6G|56#A7j}%?nI`@Yga{z zt}^NBY9bhwh%`|5iM`P8?Mh7FazTDFCy%7%V*c>gRCO$cf z$aK$ld2R9^nr#Uo*PCO(?T<&4Zm8XBch_<%IO+QZp(yC!!bNp{NIY>g3mp#KIPt+K$k%z&(sk$drCd+w-eBVSS;8^u5{DCLcvj zp8gT@AypLg*| zij+_wJL6%&sm7Ws&~*bK?KMmh5ht(Bk^;*fC7n}5Gg5s;HB1=C54n+}(M6woe*YMu2J-^KwVVzRp zJ62t#GqUu|z8`T36mV5?Nm$^Hs~K*ZkPbS(?s{?o!wW$1httzWh<1Cv=_Q#)dw<^m zK_5By$zD{K>-69xIAk-ZFiBwx)?(o$1X3(K4j29GGY=?Z#TFylGrxF>MHon?fK!qq zPtWIRg#O^;4e={G%#89}xqCT|RiD{)HeZLK5cDs) zPRpyLdKrBuEU!|m)|nlOhggC&$uVg)@9}qu5Sn_G>eb2yLL%wTmA?#xuJztvBaZ4CsH@}#Qn33}uy_DIC@#6x>|%&KmB z?=Eju;eI-(L?-zdy5PbjiZ`i|cqFzGHWuT`5=ZsI-DX%{^U2jYOkU-}6;~gyWKJNM z3S*+5tnmidxc02zbaHuB56_JA-JF!NliYr2-IuM7ad@eBXCPckybfKcx8$QBG<7!{ zL?!>p7$%S}Tur-g+Z;2QOcj?DQmCu_@Io4#_0rnP8284Bu=={y!jfCIEH!hjg>)}A zS%E`);GubREDp{fDCy2eNgAIfDjL+rg7YdLthiQzHr2u3tW2(pTq&zV;ge-73vPp0 zs53p|jx8++3`d8iDxo0g9Jb)lv6M)1)ly2)=VBi@yP5TiVxTNT4Y8_kY#=pGf_xo# zn5%7nOr<*mPMDqVF?S%r;VuQ#c@)n_3Fz(*=TaO^%^_I{= zl-fXG#p!aRnqXP-*yV(@orx=##4O4oa77Od z2dhBFlSA*e&U&VVh}ELlP3|y_M*r(kU5>4Ik6VFdAK{a+UFC0fUS42)(b+^#8QWQ{ zS~s9FJW-nLH49ZB7h&8Q*RC=Rq~iW%&cWqTHQfk3q4~;>VLuk$-lCP5sON(awX7L_ zRmiYLQ?E;DfuFLy@-qpoWS78h*NHL;%eU5>_}q3W4GoG$GndcJyaqmYhA8zVbaWBh6D zXqY;gSe zfBY}KxW*KRpKtubJxI{F8ExN_mV2aIH-W=Ot2u1Qf)sxUjl>wNpc}8TFlJmCfzQ>6 zBzlBkIh(!?ZbQoAev=*8+A(CDhvcZ=Dm_`D#~UbAw7gx^GG~T89m2=<83;%jXZUe@ zmbe;H1vT=j`4EaotI5$Z@T7?X6QNSw*L9ZsI_I}Zr!l{8C9AgG32ihMa|pMERu2Vs z>OJHXEa9L^9RZQ(ir;cMMjwzZi-Hcn3#gmj%GdyGn;1!gDwAdMcK+!NSooEjSH~|a z@qZ*I;9}HENh=yMOftcd7ZJOxhJ=?W#!hm}FF3lHzs*VW{^CQmlWc?8pUdfd<6)eOvS8tRzfEgcIg{x<^_%*PaW z{KQ=?lTW}iGI_$dr_rcTxH}6Y9*rc zf`rP=-_h?JzC-fj?EVbk0EgJ{6Q0z_HL4Mt?mx3UV1S36n?AD1L?c_MCfJlmTt*H4 z%T9*~@kjJbDPLqh>EAYz=km){xe~9^tFOi35?QglQ@am5LvpwNzyr_^ays4(I zQpC8psET8!URLzIVM9h^aXrwHcEW-mx^g2Tgzn_QbNdXB5OXS_Nb!lh0+lNdCVl?+*Z+wmeC@8lAnh zabX24rL5;a8x}&YDq#%%;;?)7R%hLu?QDTHQHBauLM4EJ=*e3V?FhYyvq7o7fWCQ1QgDsUDre$U-6N^ zQ{=|a71Y_yA4RenQ|fKeNbPhsM^IuqYoe=xqqv)bLzOQdMjV-2@6+bZ@S?5I12>qJ zHPPVqnXg&zjvYbpSLOEyXFd)f_2&WKDUNNtyS9`w=X#HTg!Yi4oF}ly$C{3zY50H& zgCRfk1H)%WNL;`K8jggO+3}~(T+eE2a*trLdp-0y>Xp$|nm0McW98+4{^09gSO>bQ z9xN1D_dU<^hm2e`h}ZQBDdS@=X_js)QL*j&)_jf3cu9laj&JU00kR*_qi_EboM=+i zx*#fE${NR|0Z-F}gXq>;8V6`wT*@hXO@-ECbB5p`1!mOXJl8Uyzgl z^Q?%25gn&6L}5dHrE|_g;%mQR+h>4#yr{Y%5M&$T0x~Q|ll_<2r^Gq-ZzM8GrFB?V z*YfEKc@B6i-3KfDI{Zyt9Gm|zH;u7H$~DHYuVKqN`#wLO$ct78bs+Bt+kCTJkLtQY zy!;lt=mh>|+%2VT+>v3#e_UmbyX^3G!s1ZLE^^MTuJs$aO19SLr4+BbV6LCFW)A*W z3-JEf9c0^cfWox9sC>&cfn#LX{4>TRZe7nMo3U76olaC(TxG2Ybn({6CkB)TkIY$VvtHt|rE zkagJli@YkyM3_xcv#lbMZb6~|G-DQjguwZk^rJ5>3IZ!8g%h(KCjQB?5?6~Md2YqX zeeTe|>OgR>TWZt?lAi)C>$_Z{`#F#1Y@{%kh3iLw%}2=xo#%Y1a3?ZY&Ajs<}t0#2V90^Ht?OF&PyYq@s@BzII0^>c=<$O8EvyYxtzJ-A`E1W9ngRv0P(z#!?@ z2ccs8O*fkJD#_Sg$bqGblF2eHYII1Xa21@&ZWl8#M|LvHhaEDxChj=a8>Q8CS$;1X zyMsh8g4^5lpoUmTN!d9w3vT&V-tG}UWL1Zd}Kt9Da!J( zrFr&JrwwS}u6O;1948I9rRiEdDYxe7rCO5&axYy96|W7-R*TC>C*y5mAojKhWyw;M zt{_o<_3Jig$MW1{!k>T9d*cAW}X*;-MP45U0#_ot3KZ(~hea1 z%^PxE@;LlUkb==L_0K5RWrSH=MCV~d9V;dDt%kMS8dWAzyrb6&%YxVanF`3B-su<8 zldbrBS01o6jQRA-Di;8pFGpEq0q$4ew|97n9KcoA3`6&7fHTlK$_(#U63Xfqqfm2z zL65rexV<5cT{@Kns>r{${*w)#Mpl3?O?2aB{fn7b_i6ud?x)&UefGJCsmK7g*V{q9 zV(y^s*((zf{iMIQ2b~~D7}TpsZ9-`YG87Xhw#B9TZY16}gi$ikqnI*9#R%g?9gSF?V)cugl!yyJlECbL-KcB2=A@; z<4XL9EEzO2#(5u7;RTJyWkZ;}53@|)Hq#>9@g0(#&w+m`R?_U0T#}FQT^Y-sh;c_KFc7`nc3FF6Kz#?Ubb>EQo<`UHHQAso`66II(A z-Y^#*Q9*;2 zL8(gTP!-7iR~>NufC&MXRu?;iyr7TZ!1qJve;wbkiwy~718wORGPoyx{bYv`56?E0*%fs%9NmmhXpB@KY{RA z0w!cP*s^J~4W@@CppXVl#vjUzf}PTt-fMmi>4p2e6ezdAjR(QL4BFEu6lW25YyG@A zxdY6!ZRqd_++)K5Uivb&q%(8q?o+}+_AH%!B6xUT z{36Y}d>KfvY{NQV>B_IVQVT@vN6WkvMqTos8>K<=sD1@3ehEiW^hsQl>qX38F)Io5 z>6k;Y{jV9|h6dB|A0QG}BIU_?)L~Z)2-(8|1|Zs7^TG4GM;EaDt2aj*$B3CW(VC@C zP2LatTONlzBw)K?6|Zf7{?COMrO9Of2MQitv0XCqch3fuBwwJd2Z6|Zf}qU~OkV8t z@xpKU8Nn;Y2V~!r-oQlypz8<0H~irjTgBKt){-nDvp0E`)R*KomW`|UB!l~2eGrd{ z6CS>_&+*x=z#r_e!`wX$0w0T2Qcfc|vLY@^pu7W*tFt>ZR1}1A-D?@-o*bNEMCWKi zh2)Z+W&@&rJIfbjE*1HCI%P_2!N+XkJ?RM#pX1z&JMXQ&pM3Gd=7>?*?1)h<#fqtP z?xOf;wx{7zs@->S8$X4oPm}62xVzPnV-kPnVu}`W%JsLJzqB4%@x5Iun)CL39Dr|> zG^%2qTEY7?Dul*$3C6sXi8xe`hq2fIA$r7|7m+a+T?nzu@oqb5H_LTbO1L0uy^3l8 z#vP^dM$*#%f!5L((vOxgu-R=hb;3Y?0UNLIQin`leqr&}v&SnTvTTws1k^DBdqL!; zuXRq<=UA8>(Y#ocsTEK^>vP&-h1;-D`uXuFu-O}zxmaG_|FN9QMyY9rvW7_WIbYaa zpDLfmYbuN^!TMxxN-{K%-wwV{I|hFxl8(`F#2YJH+Vrq{^Fiv^;o*_{9fR;E`8{D> z9xq#T^dc{79C1WIZ%+h^hgq=vU%TH89 zbh4oRCKCml>X3FlE22bL>kkBP^2(@m2c5po`P%B=e-41~H@6qM6g?~9Of;jf2YB95 z?3}AP@Nmq#H%tmlWKKN$-@|O1yoF1uosQG9b`hZZ2&x4?9Gh~x- zwJt3rfh$>}&XPU8Bq3!?vvbv(#peT&lQhQ!KHlW6!FwwgQS+WMaOvzyrPEUm$KM^V zXO`)76?9j^ieA36VN9LaP9Ax?|Dh7>7SmNRW+*(HrmNd5goEER5xOWGO>Mk~FjnTJ zv)t2H%0<4kZy#93%4dC%gR4EFo2IBt2G@J4w$xPe1b0q~@+!ApdjR$tN1}0O@KB|J zWpJ`VHHQlSP^30w{|{#PvpA+Sf5HS&NQY@|tp<`24~B-R0P;5_DI%2PT0x9+!}yeU zN(G&`84(j{Nn-blVFf3zfnVqVe&LUkOu6ND3I7xDwJh2Fj#UOcZi!dTtMfd#aVL^n z}n(P?XI1(){TXG*|+5yG)Xjvki)vbQ(&&z5;DxTGr`3!8g zAE&=glN%+@J|W4>tJF~Pm~bWQ2{2ssuG5bhlTai4${yGJBr0{PnHq#BEcO|Q||b^pFCNsjX=>LD#_!&_rgGAu|G_P zcDsIo0ZN;hgYz0GGFHm-lhxF(^+G=hMWoxLRVV_%%vdb-fT{e^;jwc_uyjq%zW9!J zf3=a!@5%p%z4!j7I{g2~BjuPmRyt%ILI~M8Bzv!h72+g&OUFnlds9M$$S8zJc4f;Z zTe32;XJ~yMPu*Vc*Zcb~d~fd`CC_oK=XKp5_d#BGu|>k8D{7m{^pAe!v+^K^;KVq& z9We?hMzy*2zTE^q;QCS5jm$YSZf3&tI|g0xQKn_N-%#R##v9= zjn&PbHf|kx(r9vRd1v?UTv0|U_A^$%;q>LD9Zzh}NsctPXC`kvu5sNeB6a57>-bdt zR$0s+jtU$4GO!~woLDNkNH(j%&QL$Q!xfD9Vfn#{0Z}Y1d!&IR%iAw{5m{WWU3Y5= z9^3{UTcgmUi@z6j5lxX(UJ>&7m18S^B0ovt_<-yT3b6rGoO%0wmd$^UV_mHVwtQvZ zV>JceUIAGbRXy-mdSCHfJv|R}Qd1`I>N?yj4tn1t)n%QpnZO1a8(re5x1pVmyC*?* zlZMMAF0-mQK6J#16<2rn0NQeNjIU4ZXi1HudV z%HvQ_qN3=BD0hUraa)1N7f;~*uT83*1d;`|KkFgpwa)5BZ@Q{itMZ?3nB3lk@-vzy z_|CYS>fS(+|IQ;zLr{F(S6zXVkK@4OSJ4lJ6(`d`aO3n$6@y#aHxMfyWt_QMuha%s1?X?@S4g}c0)t_${pquZ$@Jf8H^B1}m7xI=; zFigc=+}Oez`&krf>A^G6GOr8UFC~F)%5(~hrd*bApql;gbz6Nq;k^<6yOP1Bkv7BN z&nb1qn4>ovKGdEbHLR$7H}suM{~gd(nq5+Ifu?8vnKvtvc8?Q-j})ngEi0o6tM{yl z$L?*ivPk)~eUlWII`8coeKmLZdjF^l{`SQ599TZ_Z|o0xUs0!3z`kQb3&{xro;^2CZ!J5~e6)v9ctIK-UHGKYjR1L_ML4!GA^eZ^t@OV*M_B1a zxUQ4*s=bk6wSBeUX7~(@#eQ}OIh|3Ih5DGoS6W`y0RM<)#D=K`G@kkkpwROb>CT;) zJ%AmpxDP9VcOTImvQQl$qC<_}<89N)L#M!U(y3T@nIX5L(hPX>CYxd>PgU*?SEX4SvWe?*7RTt{vnI_h-QO z1&KXPtD=~}UcHy#?5B;O7@Gxnv(wJAYw!QcfuYYSQ2pk5OA>REP|$6x6asOcZ2vvjlr_Yu zvYv9euz0eF)z5C$^$((HnRWy*AvvP=>3GkD=~Zhm4b7OIdy;p21&+s&@4tHXYZDbM zfEuz-lq6w_V6flv_j1<`5SiJK(-u+KBvho&v3LzzPEAJ$t)8-h16S0*vYk%N2OCz8 zOL?0YBu@@I!Z9|Yd=ED9Gy6(-RN_p)na5r87WU(h@k@@+DHFbq3%}rGdo4b9^yFac zyt_rh`rQqv=(^wbc}?<3HN&|#2}kKS6-U{XNW_+zAn1Ln6-q|rt8z9^?Q#~3KR#+b zNy}y%s^PDybxoq~@w%*!*5tGBf~z0UQ#l!CsfdoB1QIJbVD1+2^OIh6$2Kz19YnJ>7<{l)k5LA z^$pAKjk+fSYAn!lq1@zF>q#4OGdU5>R1<%GuCakLS5S(y5*409rwcaKh%8v(+Kv7b z^$v|_)kw)$0t4DY>`$;-CEPqym8$zJ)d^;WkRSY#ceWdB$ba{H!A{udYV;k3jWU?S zE!|}9*q`Y zbcQakOOqNl`dTZdzHxTWKu?I_UT!ztE(5d3#`hchQTLTAE&>s&cejK8S%3NuDBNBw z!(Ai(#-sPncD5n>gsa@=AwV$ph%Q&I9EF4G3-S%{rwX$W@cUTscF@GFyYh4Vk#7;l zx|OVFj;6}>o#fAq6_QtkL)|p5K!GFi%PB z0An#MGonVHT#AoPz9By_9D`R4&BW(u-20UXw7NJB$3XO&xI)t1 zw_I9$nK#abo>nME2?nauvY<3-{6?C6S*IQ{Wfcc~m1gag00LYiON-~jmJ2lQVvVhU z|9zPmQGEP{6*xRsHlF5ivIWv8>;p+K!l5viBXB|J=RWb}nySUpAb<2s;2%5Gd*q-w z`Md@uan?Iw@qc=MWm9W>C&7H5^15S5Q>H3ybm*0u`nTkJlm1YIREgoQPw##Oy3{h& zR66yksvFguyH+ozO055kIJMD4xhg+4l&A?V#x5ha0VnPVx@GcWs`bLvNUjF7$@vAp-PMoU8`aO?re>lnI_mF+|;Zr?Ii_F07_2$W!YNny< z+?q)j$P5C{R2q$&jdAtxA`0^%Ue*hBt^B66_i7}gFMQ8i2TKg4xQ8f38rO$`cOoBC zzqYP%4y3&t%20ICycQg7*(Wz5sTRNWbj zNm-?Fv5s#aN=ECiJX-=iJ--#ZDRFdNcKtpJN~$>!m;}m1PV{QAt#C zPR)lJUtB)hw3HuT(|5*?&uR!Lo)?1i(E$YWjlqwnT(Ideflu?D8oPW@S#$#*g9|8h zc|7WaQ6FzAMmPCt5>Zd63_dEqJM9DfT#9KMQHiO82gaL@Kjv#6sgkSSYu*~}Ldush z+CRB5`wwO`c^K+q6$9sEPMnjI+Ap4QX4E}uVa3uC!hDCuPcJuIzixT&{@nGNknvM= zXQwoSglOvsYJn|^irM1kXazezyYq}33^fAujOXQ|VKcvHYELs+jj^!^m4 zIV*bdL#dJ)4f;a}c1T$Iu2|jhhWti$*VoEbG*Rfunnl0Lt-2{6)$8j`I(tv`csPUg zcqC2kUhSrhzv&pxzaGhvX1h2SB`hdujk?%;qngG2C|SVyi+_SEv~&rUS|oJyt`9?E z>u1#RlGiVIJl9niVhQ}0lx0k2e4(2?v=k|LIRmR-UF>BMfa=2oA68n3{IVWE@a%Y{<| zTqeXr^qej2>Qad~{Xi*6icohF{`wQ;C@oIO@ub{5iu8mRJX~&_QR3+he!G@7xOdxO zA&==1rOD_!I}{%}Ul{>GW#X#t3bU!adWojLe~ub?@=sel{RFdeZXxH%QTO zIB&n=b>&M94)=>SC#dCSQEu#%m$MXNPwYPSRgR`(D}QP5_=LQ#XWARI?PUy6E4~7w=IFButXVq3m^eXww=}G|>QNO>%RD=3?lG zBVLZMxiKnod_sDnpP=ELNg)|fQ)Ey=C26E*pTtN>xaK{utyC6gALq}TOsd3Xo-pEkLZcXJl*tl`t9cvh*hpI+w$DxKDIPFa;v1HOD{OWH*z>HpdZs~_VTc5J8Miv%qJ`b?Yz-> zEz@`AfVS@Lh+?l%_rQ0NyC8UaGJmj;XgeF7oQic%G2p~K7cF<6Y(ICGX){Q1FR1w> zN;fO7fN{1V`GojtjrzIyi2Q5jH2X>fCz=F5y^ZYfkcKnBf>>}_po+P`DqI(vFDr8F z1b);YC(SD6R$>0>-<)~-*X8Na3MxHi4iN(3?rPa>tK#YxsLXMjB}V)|79#DvjkTzlx^FHzqH5wjX8nzov0vl04`nDto*Ia*DkEQ)YISRUuJgk zN45M=n>XVrG>^+H8E7PxGv`yrwsVJs;Mm+BInvrP25bkZRV0U7r;vQox=%IR_V?yc zSQ(K|){^=f`rWwQF$>nCRL1|3hN325s>bV|~GfwRa^ifV9I2^64BuQFQN4`WGbMjy7@T$FH#sAFRhQ$9`iAz0bz zx~{c-F+w63-%iW9A@FD?T-s0xyLR+PyCzJv{br^kC5zT&OR(O0H=izS0#Ds z?e=>a4{ias;^-OCSP@cpYC4t$@2E7H8&b#QN(RNRt?ZcGV-~aRapiyQg_D@|nc?w{ zd};j4U@{_G>GEY*0gXU7J^U$|*PF)SKU{$FWclon?9P5S0$Ev<{3iLLol6SY1^XM& z&K)md3>Bu@T|#kfs9B5uwQZAm?etzaVc#5I?wl1zP)MKi!&gehFvICEY056`^^xK z`I5bKl;80^)X+4Oajy}JsTA1XXFQPq#I3x(-!%1&BVd!3{p>^6g5B7_2_@`)Dd^%t zkDWhuzB;o+zS$Mr_dnQ z&ttR;1Y*7z`tGBws*0VbUEEI&2apVp(Z%4cKW9kxN`V%xiCOvUT2mzx&|XS{M4>c) zz@Fi{y%{TCN%q3?(Wg+N%(&|u1lsQAAy#&^HWM!Nvbt0R#Ni z*sFKC&eKOd!)qFH2E68s4a8d;<>#|k7?C}WJR%)s$NbE*!H^HbcmMgm(Z}giFspDW zQdqdX4sqa1bPRdRg#hm)l2I*oZ!{PI4W+R(YxJrSMRtq1ls@-4W&S@;t3%9JX+CAd zBYXmUILRjMUSyxOSF)mw8%IssfjadTmJbtQcf^Jp1mHUIQ^Qh#V7D)SsxV+>(1WI1}K9@Dc_60O5#ZO zCVnH`fW>tZTwy2?OcxE(J4DD z{glpcNz7{>6rS>6R!euishJfp8+{f-sxa;WuLs7JQea$ZCNi~cR6D`geiCP~N+2&a z&-TIT!{0K*QdG6pDY?27UH$3n(vstl^DZSW;Kfle+3*pO76g9uJz{mKc*y~^&@+FN zNAQxg3);eGp10Nob=K+p+{_%jQnPZ4sZ4{>J|YSMLBxid%#I??E?eJaC&U;x*9QMToP*$k1(0oLwSvm40~C# zd)Ga7P}a(LQ30!TXn^Nr6=a0xo&5}tG=I|HI)?Z8<8FAwHO`4Awp{jmjO!J#@-L1$ zz%sNYg%Ko^Cv%Haen7ZhMEqFRkctfIW>JGr%{X%VHstmS&_j&%lxEUl^iOYX?D!eq z;pRH|#gjN;qS@qxA_$7Va8V~%_w=O{ds2Y#^8G-5wrL*SIUJE!f||0(+qB<6mH})ca^jKP zme1t9Wma<0y_GP0KblzdJ=6S{zz`(wwUle3`%PbrvB|zm5#B@wM%u6!oo5pX5bFmM zJq?ez#etPtEi1x6lbg@9bwCs8`f*&Je3+Cf5Ygh_dEB@5m`lt?70Oy$82jBO?VOpX#AHQ zSD&_(Yls=d$$liE3p91E{;;~t9KmQjQ0@%#&SquRP zC&V%MU;XKS=x;r{Jy>oI60}XV!^{XM=Z^zqO#Rwc;IVXSBuwvHK<9l3Q?}!pz~H#4 zK5DCtCp{2i4@40S-4vM8hadR^w!|Tz|8$aK0vy&K(o@9i!Gnu62kft`0$zDYAO#93 zkjKuHi+~2U-qq%RG_W9N^g}QBlI?KGE(|iM_c+B_9kas<$7Z zCUX(5ep`4O%M;-E*1oj9AJ_)2Mqo#lsfO?%X0{Oq3okpoNvkk$PL$ThkqiffBm=-F zTOg7lu?%2s_7;v415}i+pm!DuECJP_)aAH-sRl~XK+Y>Ku^2xlE7GNUn94yvq_4>P9zwFIVDG3S=LZ4i&0k+jUAdasXr5k8rWVU!SM{R0AG-y%9dZeF;H?+7;aT+w~^R zzyp z$MT0yDwg*^n!%3c-tBnbXmODo!$=kPwyx!9Mb6E zZDU$^T(~o>vJ#()}l?}Eqt8es>4-xst~pi-HYk#g&)oxRSp%4Y!h>N6P> zKNz;sZF-zYK=PAdO3LkO{uSF4LD!~6@Wd&IH!BTq`o6VdRoX&e{9{bd?;MQVW<}M* zJh|=>O^=Er)lf@Tm5XOH9-;YM)2vG}hv;kP_d(#?T*+a?r&fiivTL@wm|Kb*W8@BO z>7Sxh1BF(Aa~JBJgUIv?DF1?ll^K!Et|K8I6HKnunRF%Z!723fbxjvi&>KW{(IJ)) zpH)B1Uma>`%ktM?cj*n?`-lzw!2Xp{fS)zK2eB z(^AMp3F2H)g~0TbKthN%$`HyK4n%YMxa{CW>LS*k=W=!tX)U>{(s`>_Z%U4bKac~U zS<0f>2Usu-NM(}O=cm1T#d+Pih68^7GQRptH?Vt*P&P|q3wLd%NFkBIe>lFOnVt~! zfEV{s_@=)Yf!&?&nnFSD((&@yS5{cZ0H<|VXswE)KGl2}(!kC~$ojS&bH6)(l}#w- z&qdlTX&thn)M8_BP^ln82$GvthV)t$7>Kailr8@H`GIU zK<$r|T--phn7y7x7*fOs4{iwPcP;B%&4;S=R7p6(mb32q|@^vTInO5C3)t_oCw)tl}t?7|y37 z(XDL}|BOC;Qd~Jz7I9I$TZTj_gnuZzi*A|bt_31q=7KUHq}=al);R0w^*fe2(p~)v zRVH{cA6JT4)MOz=msGZ?o9?O`=g${~oq5XZoMArFs@yn6h8+d(SDNmNz*4OTEE=p8 z)-yO=+pa1}ae7`R93ZmwGy|h4^&F00Z6%G(1WVGs|M1kod6#{%ACI{|WSyJC<2uWM zxzuu5B?khY7TlCRa2V0t3=}6byZq}x?su^Jh&sj+I_UTub$1d>WYu|}>YYo$6}|s+ z(2EbduP8iy_2z2msZC5<$_tKGDe6mMG+8b+F}1S$T(Zf*dV&u^@aPhP2%qz%1(AC- zE~+eUO3Nv+VjQmJRP|#?J7+m1+89{Q-&FJKqvCwTqD#WTs`)CH>5@1;CoAy_kWrqPIBoglcNOGC%&Fbw@K$YP!E+sChN+9N}{nxVt-R$HKz2Ka!Qq*dZkLG3kWYr&8*%62dlYoi$H0MTFva zk-lK(AtrB0mG_dDe8!29`9Ob;Be0?yPy3s(o}dmFq~%3HbD7a7mU&|qHLI4V7A5eW zd#Qkzc@W!4BK-c%GapFBf@laS!>z-EcS(=~#$C_rZuw-}En7}H`24~dFe(GB3Y_P@ z+$FoIjFqH5diR&tBk;?y!I_=G{^60K2l=r1(@?PI}t12UVA1(3ZGNE6L*2eQk@h3bO{&p#PFis zxt(iohJ3HHIykDZEqVl}|K9N8$D~+N{XEP?JOTsY=(>id{oq&6X3itJ<*k<*)oPZGXCM$2#3TJvL@E9C8mi9xdC0 zPl~LWyUsoLm$1b%qfSH8FfzdLE4p*aq|7{@tmTvR8Ijm`hHwf^)%7Q_HxsRqixp#1 z#`{aW;X#H~C9PUL+U0WL?|%2w!(ApC>?N$={>->q^yl;ofuy@Ls5pO?! zbYu8@qEAiB+qqODN+p3Dke|Qh{aJ-{i3D6F?u1`?WASYXqGiz79mKm_*%R~e2j@6) z&v$~D355h=QQe>Xn1};sSM$S8R%O2`z1cs1)z?^!UCC0LL;qg5)a)P_uHk1WR}kMl z`F^s!;g303uluxUwS@T{M>VrdYX<*U;m!3atz?Ml*WN`~ZHh?9etpf7e0k*c9hXbV z-@s`xiLL!_QSFcWiTS*L|B}9tB;w;FV<+ZRCbARRo`|6Fp<9$?S4-rqJr>JZt439; zv8LpckV!8RPR_}mdH?a>zq0Swu1hBRuBCnP?OK(tUh}Tq)NsGk)gii;JnOgXot9j} zjWnGg$K>4s!H0-+GpY!q*$Zkta8~!LoW&R-p=MAGOmPgsP0xdY(Lvd*i z*^85}n2$bHS$N3JBkZ@gUV)Cp=5FHd6wfxCd*%&p0oq~5ku}LSRlX`(2M{-zbY97T z+TBt9N&O#$XS>~xGE07YWE?}<-W_@J${S^Iv}j=gv&=RW2PhZC*-VgCOGv(u_>nljhiw&TEa_iY^ z*g;r}mE=2t0&Ztp2E0ErQcy1(NL8a*7AY!I&eSR3#Rbe(+dzxz>tCjWjH}o1h8GM| zC7vKx*d0t{c|JG(I8($XL*g)jVHu{6b^7zwQlX&i+MVoi4=9EF_+|SH8R!ZqS3%~q z(?zERNQ$B))b1CHRhG}5H~EBQ5=~V0o=3(-5bb*1cZH2nf(o&p_s9N)LZMRuZ%cp= zAGN*$IA^SUH5p;$Mzu{w^-oCwv%-Btv1<->W!I43tir7;v2Q;{LeqPcQOg_%egi8| zfxj$vhqh+*WCV-bQ=uyvC!y^MWL)mP?CR4KyJqvc4790$labg5W&OB%GQ4Vu8Lo_| z-3#Vw><)Fm3V?Gu$jXoZb%>LnfUEn;=ucdUaM1<)7w-#g%caK$!_w^K;;Yn>;B0ZHHNZnB}6q zE&$b|Te&+(hmrGSxC*ei8G0i4$#M6a(3(~Kg|-E&<93xuYd%5COGRVEKRJ+^s??NT zI4|(!)D|e$BfUN8|NS`((;)0>D|O%P1eTe`-+fQMLm~Fsoz*gczGCIu$zE*jAYw6> z4O{8o_FlF|RZq7D69>R(B3V-vF>}iR4e)&E($@}M2eQpiUh$ijUj)rY_*hz8p<2_C zm4&=`j{&i{%&@_D!g7bH#aU^mqnJY5zr)3QN7-+z&T5=)X2(q>MLHx`terJs*SF7RYRQV{LN6y#qw?y2P$v^ zee$jr>5JG8f1fR>5*{fK=!mRd9*2c>ASsu#;EEXIr2z@#=^k9(FQXSd7hDx2im z3dFy5`e#sU1{tagC`A8xW?-1TYc0H@JY#V1{56r zRG2-$)8cKl=UBC#0c+M)&xALx=3033n~p#)XkKUoDUv>pK9;73iS2zR#Of8*rd4mp z+s9KfOFBxk4nuLPQsq}xu&l%rRZX!K{m=!2ZbH7gaEb2NU8EVoq6X%|!7=#y>~!S! zfFPH=^hFeM^Qu(9!*5ftJ1M~|y)bumQN7nFA-PWn=~y$U@EH9fR%=;edU7u9HiIwB zQMbXeLko^XWHGejnJD%w@ynm6$}IUVn)mzgf|2)!s2N44P%6U)tUe3RtuB-dXn?uQ zHJ<}9FsXr@9Vqq8$*cutBcjUT1u!wBk(z7e448ng#cML;zO;E<0bDGqQ5Xh9?_hI%PaY@BOwd^~g<>X7p)?Z_ZfV?PQ5tmBB?{j-7De4(xleGl;?i@IR> zemD4Z`r+7zJ+`BBeC3Yy_Cl||Fy@JKw56nMw(WAxh*tsf&=->AX``cpjl7*h_|5l9KR@|!G&t6;sJsx0os z4UZIixzp00ht4FGNuz{bST5$QALyYj^)8%8hCh42YxdZky6>-im`j*@$A-=@$zka` z6C#4MtF0x=Ga~L@xA3_MyRby|zJJ2>}Bt-hgaR!@?wjBOh)8yoQ1T=?(71VUaN2PF*toX9|8H z;)DDU^|j8i;jd?sJR@mTH?~hc(dnixTdFF(HPI`ExNi$crz49j2!?4tI0P@`gCTM= z&(yF?K?=@=@a0wUBaD8MLR&G{^$tNf*Gi zN29n%I7Pj(x~5hCXElFr9#wP}b$0U33+ooYSrKj|C>q*XpNCrbNd&WOW*?evq^iQUEv zFNO)(;JCssdlw^gICghXFI;yPdb9AnkX5e4$l6NZrJbT;AB1P9iK^W?)qnLtWUkjc z&q7kE@7$XI;Q|ce?|d)BTwIHQIdJ>m900BIRA4UE^8^jrYriIb*4ck&um6-fW|Y!x zR83JOAz-$oUZ_w}>%e%k>G&(#g5f|rFn>Z;{51KMOJ9FUd$W-(ah#IGtkA38dSz7q))8F51hY-weUx@?l!*0~#GteNC4p%^ zW!^I`c=G%o?>uTYAI%*x(SXi17)LV8U~*gY#5Q6%1-zLbb=JCExBFp)Qp5|rA0Cgd z|2{l0l<;7seCSU;V(+}N-|usH7v9(-nQ>-Ab~9QlUEhhTJI6gQq{pp$&{htIRx~Zy z#>uB4&(v22WmjY=RwI7J=J{o{$I=<9dCoq7y38IR}Ohs)6edGf^Q zQ=+$0H(r>1x=ZDr(S7_V_p^^udd$Y(w|9Pl!!s#mTVp1>|bk9D4j1D(%Eu zCTAT`zy+mms(#acF$&tYJB|?%1ge~UALy-@i2IzDWk2D0|TN8r_tUU-xJz{ZhYA%K$Iz3dKn3%8dp=8V}VXoIH5{{C+y&(c1hle{IqTPp@f4U^lm5Ifgh6xs)LzMyCFN9!7RFK5gB=yAtOkk&= z;75k|{3bb-kC@yVm6!Ntr$ieypXTcf+Aaon2NPYqGcSdUTCb6mmCWI|lqT7vkAkxA zHKUtx%Jn34S~N%|UkDQ8MVAMaL#btGJw*P~b>(8WhI$4fRI;om{cBtewvisgBt&d#Ovc7^J*ZnMP3yo=?vMg$w%Kj8`^gC1WuToUZQ5QZ4}HMrdtqiRZ6>|V72{I`%$5Z zNZ3X!PbCypgF&|~CD{cquM6|70$)W6wc?iyMIRz<3Ud^l5)4L$wK)M@Gz3E{5CM zOzbtKlctQlwC!+8W}Jx4EOBi_itTC{9w^E=*EJYcvXL0^vxwm=8uefa2~>~*6Nq~7 z6lJ>?oYxr9wuX4Ie)xGC)HQ*mY<|LsUkFquWh|cuF_H(~?APW*N;2cAmqG~;o<{NO zx6Q?$#<+G71}~fbixcNJH=^YZ7S@3}L0S{|avY>+Q*iAQhoB!D8lfaK#cXhK{;J!E za%uG1lVRy2+NiP1 z2n)fe=zaV^j*k|Mj1Je&`l>-l1)BVt!EyV`$0k6G!+UlrDk+4_ar3OJ_WsM@+^tL# zEg9fCRgAtumeFXgo`PHvGHiWsD0R(4lo|;G>s!QPVbkhS8?tqfdR!w7f#{)#bu{JQ zKN~UkB30}3La0P=F^TSAmlN$B4eSr??epf~87;D{T?wFTJ)*j+Lu@G!Sq*El2M8Vz ziL2naYXg-fB8^vYhCnw|Dp8nl8dR94=XufyR(?6x{0v9~q@iSb&n_BmzWx6DtNdm? zp?ap0Q2ErG@#5A-)(s3>&R(snjU~>t_wt2RROS9dREox9V6caa(QiTkLB% zo)BWQZelQ`MA#>kDM*w_=t@cdspnzu;@yGIp`v@{fjih{L_8lvIFh;PAes^*uSSeg z$a^L-(QXGYod0TWg&Q^IfCQKWNx0M(o=%>1Y#Vh4!Q!z-%x_pfntC6qa`4cWR6{+f zrDq))!Q##eSMPA5wsBJ5$0QMaW~|DBd+RPjmAOnD-=nR3)mWv^ikC5>td%2l`t}C8=F(7X0;S0uCwRSoSkiRf=&tW z__}DK*v!iz+fZ)xc#f0fjV$U)|HrUA%lHSsODGmEM=RWN91dsV z4y5KenD$mWIispYd#k0iwVUSY_=5(c1-c@vlO95BS+L|L1$*+e0LS_UlNi1f=gIp~ zD2q?PDL7qmHa=CeCjF(b;W`g#{B_lu3P%lv8xp4W%2QTHCEVPKYrbJ@Nffw9srO%_jCBTgL( zTfiZUNV`zuZTFC>n?t3owxL~Z*at>KSjr9FvZi2)8e5cx207Y;pGtu)PR*RnauxKk zr8WhqOSn6J!SdV%5qmF$$h}k7*=X$6zt%nF}ybqmr*UKX?T-^oSxnH_5Hk zGDKVPAzyg&M<8{VBBbteNu+5L&VZe6CS{Qx1BJP=*UcIA(lW#@_P0mu0I@Run!(_| z^JAJe^Hs*EW!hV!7$H!jgeg>;_~H*)k;vpmj8itp-^)JFHGsy57>dYs%R?Q z$3E#xh`qXDo=9TW-U)CVOXcZ9l>c17t8kT2j~n7Yu6vxbx^SYTO0-w{2_VX%P%Zf0 zk?;ihU$!yA{dkkFJS~ImKoqkl5d;a*tvkA~WF< zW+J}+vbD;7TW;&)_F`!#C`lw*I&%+C4BP=Gy$hOk{E70b59iLghA;8mDXWysv+X$j zk_vgyh3mv`_iX~{HYBJ$yFKRPU2l5RDZ&Y~DFPOzh=Wg$8;OCG{+eEk zwv#65m8G|5I*EF1`6K})shn3`LT>dqT7I-5mePag_F_)n_VKBbTRd|0aqh4eY+NtP z9)|GQF>C!&+SH^?7sK&D&ud@X=oyy z`Z!qL#Rc!PKO=I!r9`a%%2`F4h%D6@>MWJ0?GvrUP>Y@YVdxHWY zb&Z@(m8Mn3nJd1qy_4JBJ*+qOkAExe zc1zygQ1flJ*1a`nLWT6No3n)nA}5}`(Gm>A{5Hlf`55v$e&d`Lr@6A`!mQ; z`1jvVK{Z`e{!RFQex_aUg1`E|2l~Gj`oA&6^?$SM|8MJ%CprM}_sM2jiRDoAS+;G= zQTZ-$p~ob}K7D0vKC0a1_jjbibC3FT0IY}seKhi)f6Yn0-;bBYw?wb>H&1Zp3F$vp z=Cyu#8KZXkhFW2)*1gpw8;A^FIpyTCQ3+NlcaDUuVje))z}#3b@@Z~OIAXN|wyWU^ zaTl?a2b)?6A59aQf=%N3nXlB&lOEJelp6D7qus6-IoEcVyu4VFzTDZTvQ~wAG)P|W z24BBRM9H_0mA!);t=eBJhdfViGIm;|=Crq&3&;j5(Z{!NmNIn5VZN9Uw_#;{wiot- zj_UsgM&sK-l&?b)tooKWWG&59AAPd=~wTzHAbHiEFAgF&5IppVLd&H6|jMC&Rx_QSuQEyTGgm zBBJN{Z?Vf)`0TAum7HG_fPK~g29Q(DLCzMaW0C2P zN$X-K?ZhO@k9?3812lsuQyW=$7LF4mB&-`V#F@RE0X1YVK9hPGR5t_mr0W~r>?bvf ze6S#%Qr`Ay@pER23;wUh&VQiKlqf0@+!MY1%C;l0P2=$C-{nQrTpPKO*GLmKw<4Ir{EgqK`s-KCj~AbZf8+Pu47G?brN!pd>+@JkR- zaVY?=-y!ZHLa#3G;uYsf`nCMOmuR75_iSAq%#0bW1c5{Y2qu`jF8=++ngf0`{z*VT zZcw7r{=AWza(WWPB_~}L0={aAc7ApgbwV(xT|TCsBmZjy_CP)#^nZ^38`oq;>}-k` zG9#M#$-!Ou3z7sD62xed=R~{-x|f)G?>6p4fu>7_S5&>VSf(@2|4o6r#bl zIjYD0F2LJM$zxea%Y8ztrO=0W*9GRQFh!(-t?arGL_ zI-MpkfE`EIeaSU&+af~}?J3_)0D3YNij77g&QJu%nyZHpttD5W_Xin}Xyp zyLMcRx)_4L0|Gm8K1h73*gzo8i> z-z&6@BtZ$hY2~y;EWD6JvIbC3ut7{x*4`mB!@~R*G$%nwq7>rrsn5mn#6HDS=boj=3w50*D1Iz50_YmaX$&=m`6k; z#9sl&tN$k~xtjpSFam?hMvRsEa}Q6*g_?JRxV<+zI zDOP~Q;poJe1`?+e)){tS7nYurXWl0ts7} z{!lV5%5X0GFz%(fjgz@5aeMOtb4b_#mfJj&2=E5(w%=$8mj`% zU^m|CBb(l5${DC$0-W$e^s`ig5D(>g6YGSlR&|^T*5LfM1}+BOG(iXqM1SG!u}jTo zV%5(ibN$%^$xI}vA~x3l*9=<-xPnQqHr4@}J3SAGfboseP9)5&g6=06L6N}wc~~_}c{`X@hsj*6p}hdcN&W%^G;9Ff8(O6;F~YU{9`Hz;&zD^LFJ8>; z;hEk-EP-Tt+XA>w(uzb2uQ&*_Lq-&R({O++ssq$zxahF@bDI{wzZ+Hxcq#F<9OuJ$ zd^A?WhBqq|kLDqBzKb*V-N^-rmn1{rX?k2}HsWtbt`73s6y?kzZgZpcXl=n1drTZ&?lm^;Xe^ z3@fENl{7J0yo%Vv06B%ydL{w87C+{4+j*p@#!gx?61<`fH4@edwK>{NaX zPG%DBjhEFg^1rUI8t(cDw^+#(i}hgrydT^Bx~fxZ9PiL4IGHVV;4$1*KdOwg6V{C; zVEyiWh_qL8mTlkNk-$o{UuYKBv@Nr)#o+1Q&}M)>1=&07Da>n;aud0TMC;^077JL4 z$y!?Do)DG@azRhoKtUsH)fjr;@I(x2P&d-%NkzuKMv@Y&plIy%*oWmvcCg8-Sr{g9 zi`!+yk(>7dRBr~|9JNxS`g(B$A@pmM>RvY}c&4DbM0O9x?M$!23v!ye++y{xdGrAo zFuEaDdzpEi{4wAx@FU%Fj33xPa>p=-`+#30o7AVL)fHROx0*acL+kO%D2x!76`4p| z_eK)O{XUhG?zCwC|JUA|#zWb@apOW7C1#L)nHjQ`EwU$MD@y1NDQltZYeOO$jD1O# zh)`)!mZZffjXhf^NwQ~23Z;Ur_Jd+t}6o0+-J>$=YCIKIbsp={GS zCvA`A*hV<1<@njn@G5^Wo)pGcGCd&Y-g`Qumb)$ z)lkPpX-Yk)KoTqk%fPI+lxySsv^vrTTpUVYGzsxLKmEo|X4fe{yqF{}5NAuTyXK3ar( zJE8E>Rt<_ZSw`j6(We9#*isUoTp{`3u8b#$gwDN~58k|-osiRsdqL7*{ko2Tc}EXw zV*0p2gIxD!iwFWCQ2&!de4%d{b9^`msMpaKw$Xh>_%j$` ze>YX91bc8BYFm`UNPHU2F7i1_u-irJe7JE#FqrY_7sNQ|E2p+nruI=Cw**#j_e*jg z5+Q0np6`a@Byirmp0^5Le`bqOi-I9F1hcnZz|mEu9lN$&^-{Zb0+*TKEMa)gwD(I} zV{6 z%d7DB-(9;zTM3O$%stWKa{WbyxWK!6TX{{EQDBp*dn_YWNt=|7cqQaz8dEk{`xY$ zG94dVSWbOV0@LRKw`{bHc4Kd)ftsdYcat!8@*M)VmozVe&nAlGfeH7|aQamcBS;$F zVQ5_%Lh;Vhyb+cA?9JepZuAQLNB2sPX0XGP#nk=&k{jP#L5SWe{!q~Lj@HdX<$Hwj zaKU~}kP&FrR6Ry#WGXYyG2VEualrWqS9IC@cF#CRv3TGm$2|_brByV;W E#pEPC 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 From 8f3b80367f29f5b46df1c97aea3ef3e2706f6f5e Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 10:57:01 +0545 Subject: [PATCH 45/60] refactor: remove unused skipIfBalanceIsInsufficient import --- .../2-delegation/delegationFunctionality.delegation.spec.ts | 1 - .../tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts | 1 - .../5-proposal-functionality/proposalFunctionality.dRep.spec.ts | 1 - 3 files changed, 3 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts index 2d7a4ac2a..573ffa93b 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts @@ -25,7 +25,6 @@ import { } from "@helpers/adaFormat"; import { setAllureEpic } from "@helpers/allure"; import { - skipIfBalanceIsInsufficient, skipIfMainnet, skipIfTemporyWalletIsNotAvailable, } from "@helpers/cardano"; diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts index 41fbbd06a..fd75c0b1d 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts @@ -7,7 +7,6 @@ import { setAllureEpic } from "@helpers/allure"; import { isBootStrapingPhase, lovelaceToAda, - skipIfBalanceIsInsufficient, skipIfMainnet, skipIfTemporyWalletIsNotAvailable, } from "@helpers/cardano"; diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts index c0fb24480..eb805f417 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts @@ -7,7 +7,6 @@ import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { isBootStrapingPhase, - skipIfBalanceIsInsufficient, skipIfMainnet, skipIfTemporyWalletIsNotAvailable, } from "@helpers/cardano"; From 3727bd33eb826d1c4e4940bba6baf462b10769ab Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 13:38:35 +0545 Subject: [PATCH 46/60] cleanup: remove unnecessary cardano-test-wallet directory --- tests/cardano-test-wallet/index.js | 2 - .../cardano-test-wallet/index.js.LICENSE.txt | 23 - tests/cardano-test-wallet/types.d.ts | 55 -- .../govtool-frontend/playwright/lock_logs.txt | 525 ++++++++++++++++++ 4 files changed, 525 insertions(+), 80 deletions(-) delete mode 100644 tests/cardano-test-wallet/index.js delete mode 100644 tests/cardano-test-wallet/index.js.LICENSE.txt delete mode 100644 tests/cardano-test-wallet/types.d.ts create mode 100644 tests/govtool-frontend/playwright/lock_logs.txt diff --git a/tests/cardano-test-wallet/index.js b/tests/cardano-test-wallet/index.js deleted file mode 100644 index 0221c9741..000000000 --- a/tests/cardano-test-wallet/index.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see index.js.LICENSE.txt */ -(()=>{var t={422:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.validateBasic=e.wNAF=void 0;const n=r(967),o=r(484),i=BigInt(0),s=BigInt(1);e.wNAF=function(t,e){const r=(t,e)=>{const r=e.negate();return t?r:e},n=t=>({windows:Math.ceil(e/t)+1,windowSize:2**(t-1)});return{constTimeNegate:r,unsafeLadder(e,r){let n=t.ZERO,o=e;for(;r>i;)r&s&&(n=n.add(o)),o=o.double(),r>>=s;return n},precomputeWindow(t,e){const{windows:r,windowSize:o}=n(e),i=[];let s=t,a=s;for(let t=0;t>=d,n>f&&(n-=h,i+=s);const a=e,p=e+Math.abs(n)-1,y=t%2!=0,g=n<0;0===n?c=c.add(r(y,o[a])):u=u.add(r(g,o[p]))}return{p:u,f:c}},wNAFCached(t,e,r,n){const o=t._WINDOW_SIZE||1;let i=e.get(t);return i||(i=this.precomputeWindow(t,o),1!==o&&e.set(t,n(i))),this.wNAF(o,i,r)}}},e.validateBasic=function(t){return(0,n.validateField)(t.Fp),(0,o.validateObject)(t,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...(0,n.nLength)(t.n,t.nBitLength),...t,p:t.Fp.ORDER})}},377:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.twistedEdwards=void 0;const n=r(967),o=r(484),i=r(484),s=r(422),a=BigInt(0),f=BigInt(1),u=BigInt(2),c=BigInt(8),l={zip215:!0};e.twistedEdwards=function(t){const e=function(t){const e=(0,s.validateBasic)(t);return o.validateObject(t,{hash:"function",a:"bigint",d:"bigint",randomBytes:"function"},{adjustScalarBytes:"function",domain:"function",uvRatio:"function",mapToCurve:"function"}),Object.freeze({...e})}(t),{Fp:r,n:h,prehash:d,hash:p,randomBytes:y,nByteLength:g,h:b}=e,w=u<{try{return{isValid:!0,value:r.sqrt(t*r.inv(e))}}catch(t){return{isValid:!1,value:a}}}),B=e.adjustScalarBytes||(t=>t),x=e.domain||((t,e,r)=>{if(e.length||r)throw new Error("Contexts/pre-hash are not supported");return t}),v=t=>"bigint"==typeof t&&av(t)&&v(e)&&tt===a||A(t,w);function S(t,e){if(A(t,e))return t;throw new Error(`Expected valid scalar < ${e}, got ${typeof t} ${t}`)}function U(t){return t===a?t:S(t,h)}const O=new Map;function T(t){if(!(t instanceof k))throw new Error("ExtendedPoint expected")}class k{constructor(t,e,r,n){if(this.ex=t,this.ey=e,this.ez=r,this.et=n,!I(t))throw new Error("x required");if(!I(e))throw new Error("y required");if(!I(r))throw new Error("z required");if(!I(n))throw new Error("t required")}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static fromAffine(t){if(t instanceof k)throw new Error("extended point not allowed");const{x:e,y:r}=t||{};if(!I(e)||!I(r))throw new Error("invalid affine point");return new k(e,r,f,m(e*r))}static normalizeZ(t){const e=r.invertBatch(t.map((t=>t.ez)));return t.map(((t,r)=>t.toAffine(e[r]))).map(k.fromAffine)}_setWindowSize(t){this._WINDOW_SIZE=t,O.delete(this)}assertValidity(){const{a:t,d:r}=e;if(this.is0())throw new Error("bad point: ZERO");const{ex:n,ey:o,ez:i,et:s}=this,a=m(n*n),f=m(o*o),u=m(i*i),c=m(u*u),l=m(a*t);if(m(u*m(l+f))!==m(c+m(r*m(a*f))))throw new Error("bad point: equation left != right (1)");if(m(n*o)!==m(i*s))throw new Error("bad point: equation left != right (2)")}equals(t){T(t);const{ex:e,ey:r,ez:n}=this,{ex:o,ey:i,ez:s}=t,a=m(e*s),f=m(o*n),u=m(r*s),c=m(i*n);return a===f&&u===c}is0(){return this.equals(k.ZERO)}negate(){return new k(m(-this.ex),this.ey,this.ez,m(-this.et))}double(){const{a:t}=e,{ex:r,ey:n,ez:o}=this,i=m(r*r),s=m(n*n),a=m(u*m(o*o)),f=m(t*i),c=r+n,l=m(m(c*c)-i-s),h=f+s,d=h-a,p=f-s,y=m(l*d),g=m(h*p),b=m(l*p),w=m(d*h);return new k(y,g,w,b)}add(t){T(t);const{a:r,d:n}=e,{ex:o,ey:i,ez:s,et:f}=this,{ex:c,ey:l,ez:h,et:d}=t;if(r===BigInt(-1)){const t=m((i-o)*(l+c)),e=m((i+o)*(l-c)),r=m(e-t);if(r===a)return this.double();const n=m(s*u*d),p=m(f*u*h),y=p+n,g=e+t,b=p-n,w=m(y*r),E=m(g*b),B=m(y*b),x=m(r*g);return new k(w,E,x,B)}const p=m(o*c),y=m(i*l),g=m(f*n*d),b=m(s*h),w=m((o+i)*(c+l)-p-y),E=b-g,B=b+g,x=m(y-r*p),v=m(w*E),A=m(B*x),I=m(w*x),S=m(E*B);return new k(v,A,S,I)}subtract(t){return this.add(t.negate())}wNAF(t){return _.wNAFCached(this,O,t,k.normalizeZ)}multiply(t){const{p:e,f:r}=this.wNAF(S(t,h));return k.normalizeZ([e,r])[0]}multiplyUnsafe(t){let e=U(t);return e===a?R:this.equals(R)||e===f?this:this.equals(L)?this.wNAF(e).p:_.unsafeLadder(this,e)}isSmallOrder(){return this.multiplyUnsafe(b).is0()}isTorsionFree(){return _.unsafeLadder(this,h).is0()}toAffine(t){const{ex:e,ey:n,ez:o}=this,i=this.is0();null==t&&(t=i?c:r.inv(o));const s=m(e*t),u=m(n*t),l=m(o*t);if(i)return{x:a,y:f};if(l!==f)throw new Error("invZ was invalid");return{x:s,y:u}}clearCofactor(){const{h:t}=e;return t===f?this:this.multiplyUnsafe(t)}static fromHex(t,n=!1){const{d:s,a:u}=e,c=r.BYTES,l=(t=(0,i.ensureBytes)("pointHex",t,c)).slice(),h=t[c-1];l[c-1]=-129&h;const d=o.bytesToNumberLE(l);d===a||S(d,n?w:r.ORDER);const p=m(d*d),y=m(p-f),g=m(s*p-u);let{isValid:b,value:B}=E(y,g);if(!b)throw new Error("Point.fromHex: invalid y coordinate");const x=(B&f)===f,v=0!=(128&h);if(!n&&B===a&&v)throw new Error("Point.fromHex: x=0 and x_0=1");return v!==x&&(B=m(-B)),k.fromAffine({x:B,y:d})}static fromPrivateKey(t){return j(t).point}toRawBytes(){const{x:t,y:e}=this.toAffine(),n=o.numberToBytesLE(e,r.BYTES);return n[n.length-1]|=t&f?128:0,n}toHex(){return o.bytesToHex(this.toRawBytes())}}k.BASE=new k(e.Gx,e.Gy,f,m(e.Gx*e.Gy)),k.ZERO=new k(a,f,f,a);const{BASE:L,ZERO:R}=k,_=(0,s.wNAF)(k,8*g);function M(t){return(0,n.mod)(t,h)}function C(t){return M(o.bytesToNumberLE(t))}function j(t){const e=g;t=(0,i.ensureBytes)("private key",t,e);const r=(0,i.ensureBytes)("hashed private key",p(t),2*e),n=B(r.slice(0,e)),o=r.slice(e,2*e),s=C(n),a=L.multiply(s),f=a.toRawBytes();return{head:n,prefix:o,scalar:s,point:a,pointBytes:f}}function N(t=new Uint8Array,...e){const r=o.concatBytes(...e);return C(p(x(r,(0,i.ensureBytes)("context",t),!!d)))}const P=l;return L._setWindowSize(8),{CURVE:e,getPublicKey:function(t){return j(t).pointBytes},sign:function(t,e,n={}){t=(0,i.ensureBytes)("message",t),d&&(t=d(t));const{prefix:s,scalar:a,pointBytes:f}=j(e),u=N(n.context,s,t),c=L.multiply(u).toRawBytes(),l=M(u+N(n.context,c,f,t)*a);U(l);const h=o.concatBytes(c,o.numberToBytesLE(l,r.BYTES));return(0,i.ensureBytes)("result",h,2*g)},verify:function(t,e,n,s=P){const{context:a,zip215:f}=s,u=r.BYTES;t=(0,i.ensureBytes)("signature",t,2*u),e=(0,i.ensureBytes)("message",e),d&&(e=d(e));const c=o.bytesToNumberLE(t.slice(u,2*u));let l,h,p;try{l=k.fromHex(n,f),h=k.fromHex(t.slice(0,u),f),p=L.multiplyUnsafe(c)}catch(t){return!1}if(!f&&l.isSmallOrder())return!1;const y=N(a,h.toRawBytes(),l.toRawBytes(),e);return h.add(l.multiplyUnsafe(y)).subtract(p).clearCofactor().equals(k.ZERO)},ExtendedPoint:k,utils:{getExtendedPublicKey:j,randomPrivateKey:()=>y(r.BYTES),precompute:(t=8,e=k.BASE)=>(e._setWindowSize(t),e.multiply(BigInt(3)),e)}}}},761:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createHasher=e.isogenyMap=e.hash_to_field=e.expand_message_xof=e.expand_message_xmd=void 0;const n=r(967),o=r(484),i=o.bytesToNumberBE;function s(t,e){if(t<0||t>=1<<8*e)throw new Error(`bad I2OSP call: value=${t} length=${e}`);const r=Array.from({length:e}).fill(0);for(let n=e-1;n>=0;n--)r[n]=255&t,t>>>=8;return new Uint8Array(r)}function a(t,e){const r=new Uint8Array(t.length);for(let n=0;n255&&(e=n((0,o.concatBytes)((0,o.utf8ToBytes)("H2C-OVERSIZE-DST-"),e)));const{outputLen:i,blockLen:c}=n,l=Math.ceil(r/i);if(l>255)throw new Error("Invalid xmd length");const h=(0,o.concatBytes)(e,s(e.length,1)),d=s(0,c),p=s(r,2),y=new Array(l),g=n((0,o.concatBytes)(d,t,p,s(0,1),h));y[0]=n((0,o.concatBytes)(g,s(1,1),h));for(let t=1;t<=l;t++){const e=[a(g,y[t-1]),s(t+1,1),h];y[t]=n((0,o.concatBytes)(...e))}return(0,o.concatBytes)(...y).slice(0,r)}function l(t,e,r,n,i){if(f(t),f(e),u(r),e.length>255){const t=Math.ceil(2*n/8);e=i.create({dkLen:t}).update((0,o.utf8ToBytes)("H2C-OVERSIZE-DST-")).update(e).digest()}if(r>65535||e.length>255)throw new Error("expand_message_xof: invalid lenInBytes");return i.create({dkLen:r}).update(t).update(s(r,2)).update(e).update(s(e.length,1)).digest()}function h(t,e,r){(0,o.validateObject)(r,{DST:"stringOrUint8Array",p:"bigint",m:"isSafeInteger",k:"isSafeInteger",hash:"hash"});const{p:s,k:a,m:h,hash:d,expand:p,DST:y}=r;f(t),u(e);const g=function(t){if((0,o.isBytes)(t))return t;if("string"==typeof t)return(0,o.utf8ToBytes)(t);throw new Error("DST must be Uint8Array or string")}(y),b=s.toString(2).length,w=Math.ceil((b+a)/8),m=e*h*w;let E;if("xmd"===p)E=c(t,g,m,d);else if("xof"===p)E=l(t,g,m,a,d);else{if("_internal_pass"!==p)throw new Error('expand must be "xmd" or "xof"');E=t}const B=new Array(e);for(let t=0;tArray.from(t).reverse()));return(e,n)=>{const[o,i,s,a]=r.map((r=>r.reduce(((r,n)=>t.add(t.mul(r,e),n)))));return e=t.div(o,i),n=t.mul(n,t.div(s,a)),{x:e,y:n}}},e.createHasher=function(t,e,r){if("function"!=typeof e)throw new Error("mapToCurve() must be defined");return{hashToCurve(n,o){const i=h(n,2,{...r,DST:r.DST,...o}),s=t.fromAffine(e(i[0])),a=t.fromAffine(e(i[1])),f=s.add(a).clearCofactor();return f.assertValidity(),f},encodeToCurve(n,o){const i=h(n,1,{...r,DST:r.encodeDST,...o}),s=t.fromAffine(e(i[0])).clearCofactor();return s.assertValidity(),s}}}},967:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mapHashToField=e.getMinHashLength=e.getFieldBytesLength=e.hashToPrivateScalar=e.FpSqrtEven=e.FpSqrtOdd=e.Field=e.nLength=e.FpIsSquare=e.FpDiv=e.FpInvertBatch=e.FpPow=e.validateField=e.isNegativeLE=e.FpSqrt=e.tonelliShanks=e.invert=e.pow2=e.pow=e.mod=void 0;const n=r(484),o=BigInt(0),i=BigInt(1),s=BigInt(2),a=BigInt(3),f=BigInt(4),u=BigInt(5),c=BigInt(8);function l(t,e){const r=t%e;return r>=o?r:e+r}function h(t,e,r){if(r<=o||e 0");if(r===i)return o;let n=i;for(;e>o;)e&i&&(n=n*t%r),t=t*t%r,e>>=i;return n}function d(t,e){if(t===o||e<=o)throw new Error(`invert: expected positive integers, got n=${t} mod=${e}`);let r=l(t,e),n=e,s=o,a=i,f=i,u=o;for(;r!==o;){const t=n/r,e=n%r,o=s-f*t,i=a-u*t;n=r,r=e,s=f,a=u,f=o,u=i}if(n!==i)throw new Error("invert: does not exist");return l(s,e)}function p(t){const e=(t-i)/s;let r,n,a;for(r=t-i,n=0;r%s===o;r/=s,n++);for(a=s;ao;)n*=n,n%=r;return n},e.invert=d,e.tonelliShanks=p,e.FpSqrt=y,e.isNegativeLE=(t,e)=>(l(t,e)&i)===i;const g=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function b(t,e,r){if(r 0");if(r===o)return t.ONE;if(r===i)return e;let n=t.ONE,s=e;for(;r>o;)r&i&&(n=t.mul(n,s)),s=t.sqr(s),r>>=i;return n}function w(t,e){const r=new Array(e.length),n=e.reduce(((e,n,o)=>t.is0(n)?e:(r[o]=e,t.mul(e,n))),t.ONE),o=t.inv(n);return e.reduceRight(((e,n,o)=>t.is0(n)?e:(r[o]=t.mul(e,r[o]),t.mul(e,n))),o),r}function m(t,e){const r=void 0!==e?e:t.toString(2).length;return{nBitLength:r,nByteLength:Math.ceil(r/8)}}function E(t){if("bigint"!=typeof t)throw new Error("field order must be bigint");const e=t.toString(2).length;return Math.ceil(e/8)}function B(t){const e=E(t);return e+Math.ceil(e/2)}e.validateField=function(t){const e=g.reduce(((t,e)=>(t[e]="function",t)),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"});return(0,n.validateObject)(t,e)},e.FpPow=b,e.FpInvertBatch=w,e.FpDiv=function(t,e,r){return t.mul(e,"bigint"==typeof r?d(r,t.ORDER):t.inv(r))},e.FpIsSquare=function(t){const e=(t.ORDER-i)/s;return r=>{const n=t.pow(r,e);return t.eql(n,t.ZERO)||t.eql(n,t.ONE)}},e.nLength=m,e.Field=function(t,e,r=!1,s={}){if(t<=o)throw new Error(`Expected Field ORDER > 0, got ${t}`);const{nBitLength:a,nByteLength:f}=m(t,e);if(f>2048)throw new Error("Field lengths over 2048 bytes are not supported");const u=y(t),c=Object.freeze({ORDER:t,BITS:a,BYTES:f,MASK:(0,n.bitMask)(a),ZERO:o,ONE:i,create:e=>l(e,t),isValid:e=>{if("bigint"!=typeof e)throw new Error("Invalid field element: expected bigint, got "+typeof e);return o<=e&&et===o,isOdd:t=>(t&i)===i,neg:e=>l(-e,t),eql:(t,e)=>t===e,sqr:e=>l(e*e,t),add:(e,r)=>l(e+r,t),sub:(e,r)=>l(e-r,t),mul:(e,r)=>l(e*r,t),pow:(t,e)=>b(c,t,e),div:(e,r)=>l(e*d(r,t),t),sqrN:t=>t*t,addN:(t,e)=>t+e,subN:(t,e)=>t-e,mulN:(t,e)=>t*e,inv:e=>d(e,t),sqrt:s.sqrt||(t=>u(c,t)),invertBatch:t=>w(c,t),cmov:(t,e,r)=>r?e:t,toBytes:t=>r?(0,n.numberToBytesLE)(t,f):(0,n.numberToBytesBE)(t,f),fromBytes:t=>{if(t.length!==f)throw new Error(`Fp.fromBytes: expected ${f}, got ${t.length}`);return r?(0,n.bytesToNumberLE)(t):(0,n.bytesToNumberBE)(t)}});return Object.freeze(c)},e.FpSqrtOdd=function(t,e){if(!t.isOdd)throw new Error("Field doesn't have isOdd");const r=t.sqrt(e);return t.isOdd(r)?r:t.neg(r)},e.FpSqrtEven=function(t,e){if(!t.isOdd)throw new Error("Field doesn't have isOdd");const r=t.sqrt(e);return t.isOdd(r)?t.neg(r):r},e.hashToPrivateScalar=function(t,e,r=!1){const o=(t=(0,n.ensureBytes)("privateHash",t)).length,s=m(e).nByteLength+8;if(s<24||o1024)throw new Error(`hashToPrivateScalar: expected ${s}-1024 bytes of input, got ${o}`);return l(r?(0,n.bytesToNumberLE)(t):(0,n.bytesToNumberBE)(t),e-i)+i},e.getFieldBytesLength=E,e.getMinHashLength=B,e.mapHashToField=function(t,e,r=!1){const o=t.length,s=E(e),a=B(e);if(o<16||o1024)throw new Error(`expected ${a}-1024 bytes of input, got ${o}`);const f=l(r?(0,n.bytesToNumberBE)(t):(0,n.bytesToNumberLE)(t),e-i)+i;return r?(0,n.numberToBytesLE)(f,s):(0,n.numberToBytesBE)(f,s)}},854:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.montgomery=void 0;const n=r(967),o=r(484),i=BigInt(0),s=BigInt(1);e.montgomery=function(t){const e=(r=t,(0,o.validateObject)(r,{a:"bigint"},{montgomeryBits:"isSafeInteger",nByteLength:"isSafeInteger",adjustScalarBytes:"function",domain:"function",powPminus2:"function",Gu:"bigint"}),Object.freeze({...r}));var r;const{P:a}=e,f=t=>(0,n.mod)(t,a),u=e.montgomeryBits,c=Math.ceil(u/8),l=e.nByteLength,h=e.adjustScalarBytes||(t=>t),d=e.powPminus2||(t=>(0,n.pow)(t,a-BigInt(2),a));function p(t,e,r){const n=f(t*(e-r));return[e=f(e-n),r=f(r+n)]}function y(t){if("bigint"==typeof t&&i<=t&&t=i;t--){const e=n>>t&s;w^=e,a=p(w,c,h),c=a[0],h=a[1],a=p(w,l,b),l=a[0],b=a[1],w=e;const r=c+l,i=f(r*r),u=c-l,d=f(u*u),y=i-d,m=h+b,E=f((h-b)*r),B=f(m*u),x=E+B,v=E-B;h=f(x*x),b=f(o*f(v*v)),c=f(i*d),l=f(y*(i+f(g*y)))}a=p(w,c,h),c=a[0],h=a[1],a=p(w,l,b),l=a[0],b=a[1];const m=d(l);return f(c*m)}(r,function(t){const e=(0,o.ensureBytes)("scalar",t),r=e.length;if(r!==c&&r!==l)throw new Error(`Expected ${c} or ${l} bytes, got ${r}`);return(0,o.bytesToNumberLE)(h(e))}(t));if(n===i)throw new Error("Invalid private or public key received");return b(n)}const m=b(e.Gu);function E(t){return w(t,m)}return{scalarMult:w,scalarMultBase:E,getSharedSecret:(t,e)=>w(t,e),getPublicKey:t=>E(t),utils:{randomPrivateKey:()=>e.randomBytes(e.nByteLength)},GuBytes:m}}},484:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.validateObject=e.createHmacDrbg=e.bitMask=e.bitSet=e.bitGet=e.bitLen=e.utf8ToBytes=e.equalBytes=e.concatBytes=e.ensureBytes=e.numberToVarBytesBE=e.numberToBytesLE=e.numberToBytesBE=e.bytesToNumberLE=e.bytesToNumberBE=e.hexToBytes=e.hexToNumber=e.numberToHexUnpadded=e.bytesToHex=e.isBytes=void 0;const r=BigInt(0),n=BigInt(1),o=BigInt(2);function i(t){return t instanceof Uint8Array||null!=t&&"object"==typeof t&&"Uint8Array"===t.constructor.name}e.isBytes=i;const s=Array.from({length:256},((t,e)=>e.toString(16).padStart(2,"0")));function a(t){if(!i(t))throw new Error("Uint8Array expected");let e="";for(let r=0;r=c._0&&t<=c._9?t-c._0:t>=c._A&&t<=c._F?t-(c._A-10):t>=c._a&&t<=c._f?t-(c._a-10):void 0}function h(t){if("string"!=typeof t)throw new Error("hex string expected, got "+typeof t);const e=t.length,r=e/2;if(e%2)throw new Error("padded hex string expected, got unpadded hex of length "+e);const n=new Uint8Array(r);for(let e=0,o=0;er;t>>=n,e+=1);return e},e.bitGet=function(t,e){return t>>BigInt(e)&n},e.bitSet=(t,e,o)=>t|(o?n:r)<(o<new Uint8Array(t),g=t=>Uint8Array.from(t);e.createHmacDrbg=function(t,e,r){if("number"!=typeof t||t<2)throw new Error("hashLen must be a number");if("number"!=typeof e||e<2)throw new Error("qByteLen must be a number");if("function"!=typeof r)throw new Error("hmacFn must be a function");let n=y(t),o=y(t),i=0;const s=()=>{n.fill(1),o.fill(0),i=0},a=(...t)=>r(o,n,...t),f=(t=y())=>{o=a(g([0]),t),n=a(),0!==t.length&&(o=a(g([1]),t),n=a())},u=()=>{if(i++>=1e3)throw new Error("drbg: tried 1000 values");let t=0;const r=[];for(;t{let r;for(s(),f(t);!(r=e(u()));)f();return s(),r}};const b={bigint:t=>"bigint"==typeof t,function:t=>"function"==typeof t,boolean:t=>"boolean"==typeof t,string:t=>"string"==typeof t,stringOrUint8Array:t=>"string"==typeof t||i(t),isSafeInteger:t=>Number.isSafeInteger(t),array:t=>Array.isArray(t),field:(t,e)=>e.Fp.isValid(t),hash:t=>"function"==typeof t&&Number.isSafeInteger(t.outputLen)};e.validateObject=function(t,e,r={}){const n=(e,r,n)=>{const o=b[r];if("function"!=typeof o)throw new Error(`Invalid validator "${r}", expected function`);const i=t[e];if(!(n&&void 0===i||o(i,t)))throw new Error(`Invalid param ${String(e)}=${i} (${typeof i}), expected ${r}`)};for(const[t,r]of Object.entries(e))n(t,r,!1);for(const[t,e]of Object.entries(r))n(t,e,!0);return t}},459:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hash_to_ristretto255=e.hashToRistretto255=e.RistrettoPoint=e.encodeToCurve=e.hashToCurve=e.edwardsToMontgomeryPriv=e.edwardsToMontgomery=e.edwardsToMontgomeryPub=e.x25519=e.ed25519ph=e.ed25519ctx=e.ed25519=e.ED25519_TORSION_SUBGROUP=void 0;const n=r(102),o=r(175),i=r(377),s=r(854),a=r(967),f=r(484),u=r(761),c=BigInt("57896044618658097711785492504343953926634992332820282019728792003956564819949"),l=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752"),h=BigInt(0),d=BigInt(1),p=BigInt(2),y=BigInt(5),g=BigInt(10),b=BigInt(20),w=BigInt(40),m=BigInt(80);function E(t){const e=c,r=t*t%e*t%e,n=(0,a.pow2)(r,p,e)*r%e,o=(0,a.pow2)(n,d,e)*t%e,i=(0,a.pow2)(o,y,e)*o%e,s=(0,a.pow2)(i,g,e)*i%e,f=(0,a.pow2)(s,b,e)*s%e,u=(0,a.pow2)(f,w,e)*f%e,l=(0,a.pow2)(u,m,e)*u%e,h=(0,a.pow2)(l,m,e)*u%e,E=(0,a.pow2)(h,g,e)*i%e;return{pow_p_5_8:(0,a.pow2)(E,p,e)*t%e,b2:r}}function B(t){return t[0]&=248,t[31]&=127,t[31]|=64,t}function x(t,e){const r=c,n=(0,a.mod)(e*e*e,r),o=E(t*(0,a.mod)(n*n*e,r)).pow_p_5_8;let i=(0,a.mod)(t*n*o,r);const s=(0,a.mod)(e*i*i,r),f=i,u=(0,a.mod)(i*l,r),h=s===t,d=s===(0,a.mod)(-t,r),p=s===(0,a.mod)(-t*l,r);return h&&(i=f),(d||p)&&(i=u),(0,a.isNegativeLE)(i,r)&&(i=(0,a.mod)(-i,r)),{isValid:h||d,value:i}}e.ED25519_TORSION_SUBGROUP=["0100000000000000000000000000000000000000000000000000000000000000","c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a","0000000000000000000000000000000000000000000000000000000000000080","26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05","ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f","26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85","0000000000000000000000000000000000000000000000000000000000000000","c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa"];const v=(0,a.Field)(c,void 0,!0),A={a:BigInt(-1),d:BigInt("37095705934669439343138083508754565189542113879843219016388785533085940283555"),Fp:v,n:BigInt("7237005577332262213973186563042994240857116359379907606001950938285454250989"),h:BigInt(8),Gx:BigInt("15112221349535400772501151409588531511454012693041857206046113283949847762202"),Gy:BigInt("46316835694926478169428394003475163141307993866256225615783033603165251855960"),hash:n.sha512,randomBytes:o.randomBytes,adjustScalarBytes:B,uvRatio:x};function I(t,e,r){if(e.length>255)throw new Error("Context is too big");return(0,o.concatBytes)((0,o.utf8ToBytes)("SigEd25519 no Ed25519 collisions"),new Uint8Array([r?1:0,e.length]),e,t)}function S(t){const{y:r}=e.ed25519.ExtendedPoint.fromHex(t),n=BigInt(1);return v.toBytes(v.create((n+r)*v.inv(n-r)))}e.ed25519=(0,i.twistedEdwards)(A),e.ed25519ctx=(0,i.twistedEdwards)({...A,domain:I}),e.ed25519ph=(0,i.twistedEdwards)({...A,domain:I,prehash:n.sha512}),e.x25519=(0,s.montgomery)({P:c,a:BigInt(486662),montgomeryBits:255,nByteLength:32,Gu:BigInt(9),powPminus2:t=>{const e=c,{pow_p_5_8:r,b2:n}=E(t);return(0,a.mod)((0,a.pow2)(r,BigInt(3),e)*n,e)},adjustScalarBytes:B,randomBytes:o.randomBytes}),e.edwardsToMontgomeryPub=S,e.edwardsToMontgomery=S,e.edwardsToMontgomeryPriv=function(t){const e=A.hash(t.subarray(0,32));return A.adjustScalarBytes(e).subarray(0,32)};const U=(v.ORDER+BigInt(3))/BigInt(8),O=v.pow(p,U),T=v.sqrt(v.neg(v.ONE)),k=(v.ORDER-BigInt(5))/BigInt(8),L=BigInt(486662),R=(0,a.FpSqrtEven)(v,v.neg(BigInt(486664)));const _=(()=>(0,u.createHasher)(e.ed25519.ExtendedPoint,(t=>function(t){const{xMn:e,xMd:r,yMn:n,yMd:o}=function(t){let e=v.sqr(t);e=v.mul(e,p);let r=v.add(e,v.ONE),n=v.neg(L),o=v.sqr(r),i=v.mul(o,r),s=v.mul(e,L);s=v.mul(s,n),s=v.add(s,o),s=v.mul(s,n);let a=v.sqr(i);o=v.sqr(a),a=v.mul(a,i),a=v.mul(a,s),o=v.mul(o,a);let f=v.pow(o,k);f=v.mul(f,a);let u=v.mul(f,T);o=v.sqr(f),o=v.mul(o,i);let c=v.eql(o,s),l=v.cmov(u,f,c),h=v.mul(n,e),y=v.mul(f,t);y=v.mul(y,O);let g=v.mul(y,T),b=v.mul(s,e);o=v.sqr(y),o=v.mul(o,i);let w=v.eql(o,b),m=v.cmov(g,y,w);o=v.sqr(l),o=v.mul(o,i);let E=v.eql(o,s),B=v.cmov(h,n,E),x=v.cmov(m,l,E),A=v.isOdd(x);return x=v.cmov(x,v.neg(x),E!==A),{xMn:B,xMd:r,yMn:x,yMd:d}}(t);let i=v.mul(e,o);i=v.mul(i,R);let s=v.mul(r,n),a=v.sub(e,r),f=v.add(e,r),u=v.mul(s,f),c=v.eql(u,v.ZERO);i=v.cmov(i,v.ZERO,c),s=v.cmov(s,v.ONE,c),a=v.cmov(a,v.ONE,c),f=v.cmov(f,v.ONE,c);const l=v.invertBatch([s,f]);return{x:v.mul(i,l[0]),y:v.mul(a,l[1])}}(t[0])),{DST:"edwards25519_XMD:SHA-512_ELL2_RO_",encodeDST:"edwards25519_XMD:SHA-512_ELL2_NU_",p:v.ORDER,m:1,k:128,expand:"xmd",hash:n.sha512}))();function M(t){if(!(t instanceof $))throw new Error("RistrettoPoint expected")}e.hashToCurve=_.hashToCurve,e.encodeToCurve=_.encodeToCurve;const C=l,j=BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235"),N=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),P=BigInt("1159843021668779879193775521855586647937357759715417654439879720876111806838"),F=BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952"),H=t=>x(d,t),D=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),V=t=>e.ed25519.CURVE.Fp.create((0,f.bytesToNumberLE)(t)&D);function q(t){const{d:r}=e.ed25519.CURVE,n=e.ed25519.CURVE.Fp.ORDER,o=e.ed25519.CURVE.Fp.create,i=o(C*t*t),s=o((i+d)*P);let f=BigInt(-1);const u=o((f-r*i)*o(i+r));let{isValid:c,value:l}=x(s,u),h=o(l*t);(0,a.isNegativeLE)(h,n)||(h=o(-h)),c||(l=h),c||(f=i);const p=o(f*(i-d)*F-u),y=l*l,g=o((l+l)*u),b=o(p*j),w=o(d-y),m=o(d+y);return new e.ed25519.ExtendedPoint(o(g*m),o(w*b),o(b*m),o(g*w))}class ${constructor(t){this.ep=t}static fromAffine(t){return new $(e.ed25519.ExtendedPoint.fromAffine(t))}static hashToCurve(t){t=(0,f.ensureBytes)("ristrettoHash",t,64);const e=q(V(t.slice(0,32))),r=q(V(t.slice(32,64)));return new $(e.add(r))}static fromHex(t){t=(0,f.ensureBytes)("ristrettoHex",t,32);const{a:r,d:n}=e.ed25519.CURVE,o=e.ed25519.CURVE.Fp.ORDER,i=e.ed25519.CURVE.Fp.create,s="RistrettoPoint.fromHex: the hex is not valid encoding of RistrettoPoint",u=V(t);if(!(0,f.equalBytes)((0,f.numberToBytesLE)(u,32),t)||(0,a.isNegativeLE)(u,o))throw new Error(s);const c=i(u*u),l=i(d+r*c),p=i(d-r*c),y=i(l*l),g=i(p*p),b=i(r*n*y-g),{isValid:w,value:m}=H(i(b*g)),E=i(m*p),B=i(m*E*b);let x=i((u+u)*E);(0,a.isNegativeLE)(x,o)&&(x=i(-x));const v=i(l*B),A=i(x*v);if(!w||(0,a.isNegativeLE)(A,o)||v===h)throw new Error(s);return new $(new e.ed25519.ExtendedPoint(x,v,d,A))}toRawBytes(){let{ex:t,ey:r,ez:n,et:o}=this.ep;const i=e.ed25519.CURVE.Fp.ORDER,s=e.ed25519.CURVE.Fp.create,u=s(s(n+r)*s(n-r)),c=s(t*r),l=s(c*c),{value:h}=H(s(u*l)),d=s(h*u),p=s(h*c),y=s(d*p*o);let g;if((0,a.isNegativeLE)(o*y,i)){let e=s(r*C),n=s(t*C);t=e,r=n,g=s(d*N)}else g=p;(0,a.isNegativeLE)(t*y,i)&&(r=s(-r));let b=s((n-r)*g);return(0,a.isNegativeLE)(b,i)&&(b=s(-b)),(0,f.numberToBytesLE)(b,32)}toHex(){return(0,f.bytesToHex)(this.toRawBytes())}toString(){return this.toHex()}equals(t){M(t);const{ex:r,ey:n}=this.ep,{ex:o,ey:i}=t.ep,s=e.ed25519.CURVE.Fp.create,a=s(r*i)===s(n*o),f=s(n*i)===s(r*o);return a||f}add(t){return M(t),new $(this.ep.add(t.ep))}subtract(t){return M(t),new $(this.ep.subtract(t.ep))}multiply(t){return new $(this.ep.multiply(t))}multiplyUnsafe(t){return new $(this.ep.multiplyUnsafe(t))}double(){return new $(this.ep.double())}negate(){return new $(this.ep.negate())}}e.RistrettoPoint=($.BASE||($.BASE=new $(e.ed25519.ExtendedPoint.BASE)),$.ZERO||($.ZERO=new $(e.ed25519.ExtendedPoint.ZERO)),$),e.hashToRistretto255=(t,e)=>{const r=e.DST,i="string"==typeof r?(0,o.utf8ToBytes)(r):r,s=(0,u.expand_message_xmd)(t,i,64,n.sha512);return $.hashToCurve(s)},e.hash_to_ristretto255=e.hashToRistretto255},557:(t,e)=>{"use strict";function r(t){if(!Number.isSafeInteger(t)||t<0)throw new Error(`Wrong positive integer: ${t}`)}function n(t){if("boolean"!=typeof t)throw new Error(`Expected boolean, not ${t}`)}function o(t,...e){if(!((r=t)instanceof Uint8Array||null!=r&&"object"==typeof r&&"Uint8Array"===r.constructor.name))throw new Error("Expected Uint8Array");var r;if(e.length>0&&!e.includes(t.length))throw new Error(`Expected Uint8Array of length ${e}, not of length=${t.length}`)}function i(t){if("function"!=typeof t||"function"!=typeof t.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");r(t.outputLen),r(t.blockLen)}function s(t,e=!0){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function a(t,e){o(t);const r=e.outputLen;if(t.length{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SHA2=void 0;const n=r(557),o=r(175);class i extends o.Hash{constructor(t,e,r,n){super(),this.blockLen=t,this.outputLen=e,this.padOffset=r,this.isLE=n,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(t),this.view=(0,o.createView)(this.buffer)}update(t){(0,n.exists)(this);const{view:e,buffer:r,blockLen:i}=this,s=(t=(0,o.toBytes)(t)).length;for(let n=0;ni-a&&(this.process(r,0),a=0);for(let t=a;t>o&i),a=Number(r&i),f=n?4:0,u=n?0:4;t.setUint32(e+f,s,n),t.setUint32(e+u,a,n)}(r,i-8,BigInt(8*this.length),s),this.process(r,0);const f=(0,o.createView)(t),u=this.outputLen;if(u%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const c=u/4,l=this.get();if(c>l.length)throw new Error("_sha2: outputLen bigger than state");for(let t=0;t{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.add5L=e.add5H=e.add4H=e.add4L=e.add3H=e.add3L=e.add=e.rotlBL=e.rotlBH=e.rotlSL=e.rotlSH=e.rotr32L=e.rotr32H=e.rotrBL=e.rotrBH=e.rotrSL=e.rotrSH=e.shrSL=e.shrSH=e.toBig=e.split=e.fromBig=void 0;const r=BigInt(2**32-1),n=BigInt(32);function o(t,e=!1){return e?{h:Number(t&r),l:Number(t>>n&r)}:{h:0|Number(t>>n&r),l:0|Number(t&r)}}function i(t,e=!1){let r=new Uint32Array(t.length),n=new Uint32Array(t.length);for(let i=0;iBigInt(t>>>0)<>>0);e.toBig=s;const a=(t,e,r)=>t>>>r;e.shrSH=a;const f=(t,e,r)=>t<<32-r|e>>>r;e.shrSL=f;const u=(t,e,r)=>t>>>r|e<<32-r;e.rotrSH=u;const c=(t,e,r)=>t<<32-r|e>>>r;e.rotrSL=c;const l=(t,e,r)=>t<<64-r|e>>>r-32;e.rotrBH=l;const h=(t,e,r)=>t>>>r-32|e<<64-r;e.rotrBL=h;const d=(t,e)=>e;e.rotr32H=d;const p=(t,e)=>t;e.rotr32L=p;const y=(t,e,r)=>t<>>32-r;e.rotlSH=y;const g=(t,e,r)=>e<>>32-r;e.rotlSL=g;const b=(t,e,r)=>e<>>64-r;e.rotlBH=b;const w=(t,e,r)=>t<>>64-r;function m(t,e,r,n){const o=(e>>>0)+(n>>>0);return{h:t+r+(o/2**32|0)|0,l:0|o}}e.rotlBL=w,e.add=m;const E=(t,e,r)=>(t>>>0)+(e>>>0)+(r>>>0);e.add3L=E;const B=(t,e,r,n)=>e+r+n+(t/2**32|0)|0;e.add3H=B;const x=(t,e,r,n)=>(t>>>0)+(e>>>0)+(r>>>0)+(n>>>0);e.add4L=x;const v=(t,e,r,n,o)=>e+r+n+o+(t/2**32|0)|0;e.add4H=v;const A=(t,e,r,n,o)=>(t>>>0)+(e>>>0)+(r>>>0)+(n>>>0)+(o>>>0);e.add5L=A;const I=(t,e,r,n,o,i)=>e+r+n+o+i+(t/2**32|0)|0;e.add5H=I;const S={fromBig:o,split:i,toBig:s,shrSH:a,shrSL:f,rotrSH:u,rotrSL:c,rotrBH:l,rotrBL:h,rotr32H:d,rotr32L:p,rotlSH:y,rotlSL:g,rotlBH:b,rotlBL:w,add:m,add3L:E,add3H:B,add4L:x,add4H:v,add5H:I,add5L:A};e.default=S},145:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.crypto=void 0,e.crypto="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0},102:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sha384=e.sha512_256=e.sha512_224=e.sha512=e.SHA512=void 0;const n=r(915),o=r(318),i=r(175),[s,a]=(()=>o.default.split(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242","0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc68b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5defb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0xeada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c100d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map((t=>BigInt(t)))))(),f=new Uint32Array(80),u=new Uint32Array(80);class c extends n.SHA2{constructor(){super(128,64,16,!1),this.Ah=1779033703,this.Al=-205731576,this.Bh=-1150833019,this.Bl=-2067093701,this.Ch=1013904242,this.Cl=-23791573,this.Dh=-1521486534,this.Dl=1595750129,this.Eh=1359893119,this.El=-1377402159,this.Fh=-1694144372,this.Fl=725511199,this.Gh=528734635,this.Gl=-79577749,this.Hh=1541459225,this.Hl=327033209}get(){const{Ah:t,Al:e,Bh:r,Bl:n,Ch:o,Cl:i,Dh:s,Dl:a,Eh:f,El:u,Fh:c,Fl:l,Gh:h,Gl:d,Hh:p,Hl:y}=this;return[t,e,r,n,o,i,s,a,f,u,c,l,h,d,p,y]}set(t,e,r,n,o,i,s,a,f,u,c,l,h,d,p,y){this.Ah=0|t,this.Al=0|e,this.Bh=0|r,this.Bl=0|n,this.Ch=0|o,this.Cl=0|i,this.Dh=0|s,this.Dl=0|a,this.Eh=0|f,this.El=0|u,this.Fh=0|c,this.Fl=0|l,this.Gh=0|h,this.Gl=0|d,this.Hh=0|p,this.Hl=0|y}process(t,e){for(let r=0;r<16;r++,e+=4)f[r]=t.getUint32(e),u[r]=t.getUint32(e+=4);for(let t=16;t<80;t++){const e=0|f[t-15],r=0|u[t-15],n=o.default.rotrSH(e,r,1)^o.default.rotrSH(e,r,8)^o.default.shrSH(e,r,7),i=o.default.rotrSL(e,r,1)^o.default.rotrSL(e,r,8)^o.default.shrSL(e,r,7),s=0|f[t-2],a=0|u[t-2],c=o.default.rotrSH(s,a,19)^o.default.rotrBH(s,a,61)^o.default.shrSH(s,a,6),l=o.default.rotrSL(s,a,19)^o.default.rotrBL(s,a,61)^o.default.shrSL(s,a,6),h=o.default.add4L(i,l,u[t-7],u[t-16]),d=o.default.add4H(h,n,c,f[t-7],f[t-16]);f[t]=0|d,u[t]=0|h}let{Ah:r,Al:n,Bh:i,Bl:c,Ch:l,Cl:h,Dh:d,Dl:p,Eh:y,El:g,Fh:b,Fl:w,Gh:m,Gl:E,Hh:B,Hl:x}=this;for(let t=0;t<80;t++){const e=o.default.rotrSH(y,g,14)^o.default.rotrSH(y,g,18)^o.default.rotrBH(y,g,41),v=o.default.rotrSL(y,g,14)^o.default.rotrSL(y,g,18)^o.default.rotrBL(y,g,41),A=y&b^~y&m,I=g&w^~g&E,S=o.default.add5L(x,v,I,a[t],u[t]),U=o.default.add5H(S,B,e,A,s[t],f[t]),O=0|S,T=o.default.rotrSH(r,n,28)^o.default.rotrBH(r,n,34)^o.default.rotrBH(r,n,39),k=o.default.rotrSL(r,n,28)^o.default.rotrBL(r,n,34)^o.default.rotrBL(r,n,39),L=r&i^r&l^i&l,R=n&c^n&h^c&h;B=0|m,x=0|E,m=0|b,E=0|w,b=0|y,w=0|g,({h:y,l:g}=o.default.add(0|d,0|p,0|U,0|O)),d=0|l,p=0|h,l=0|i,h=0|c,i=0|r,c=0|n;const _=o.default.add3L(O,k,R);r=o.default.add3H(_,U,T,L),n=0|_}({h:r,l:n}=o.default.add(0|this.Ah,0|this.Al,0|r,0|n)),({h:i,l:c}=o.default.add(0|this.Bh,0|this.Bl,0|i,0|c)),({h:l,l:h}=o.default.add(0|this.Ch,0|this.Cl,0|l,0|h)),({h:d,l:p}=o.default.add(0|this.Dh,0|this.Dl,0|d,0|p)),({h:y,l:g}=o.default.add(0|this.Eh,0|this.El,0|y,0|g)),({h:b,l:w}=o.default.add(0|this.Fh,0|this.Fl,0|b,0|w)),({h:m,l:E}=o.default.add(0|this.Gh,0|this.Gl,0|m,0|E)),({h:B,l:x}=o.default.add(0|this.Hh,0|this.Hl,0|B,0|x)),this.set(r,n,i,c,l,h,d,p,y,g,b,w,m,E,B,x)}roundClean(){f.fill(0),u.fill(0)}destroy(){this.buffer.fill(0),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)}}e.SHA512=c;class l extends c{constructor(){super(),this.Ah=-1942145080,this.Al=424955298,this.Bh=1944164710,this.Bl=-1982016298,this.Ch=502970286,this.Cl=855612546,this.Dh=1738396948,this.Dl=1479516111,this.Eh=258812777,this.El=2077511080,this.Fh=2011393907,this.Fl=79989058,this.Gh=1067287976,this.Gl=1780299464,this.Hh=286451373,this.Hl=-1848208735,this.outputLen=28}}class h extends c{constructor(){super(),this.Ah=573645204,this.Al=-64227540,this.Bh=-1621794909,this.Bl=-934517566,this.Ch=596883563,this.Cl=1867755857,this.Dh=-1774684391,this.Dl=1497426621,this.Eh=-1775747358,this.El=-1467023389,this.Fh=-1101128155,this.Fl=1401305490,this.Gh=721525244,this.Gl=746961066,this.Hh=246885852,this.Hl=-2117784414,this.outputLen=32}}class d extends c{constructor(){super(),this.Ah=-876896931,this.Al=-1056596264,this.Bh=1654270250,this.Bl=914150663,this.Ch=-1856437926,this.Cl=812702999,this.Dh=355462360,this.Dl=-150054599,this.Eh=1731405415,this.El=-4191439,this.Fh=-1900787065,this.Fl=1750603025,this.Gh=-619958771,this.Gl=1694076839,this.Hh=1203062813,this.Hl=-1090891868,this.outputLen=48}}e.sha512=(0,i.wrapConstructor)((()=>new c)),e.sha512_224=(0,i.wrapConstructor)((()=>new l)),e.sha512_256=(0,i.wrapConstructor)((()=>new h)),e.sha384=(0,i.wrapConstructor)((()=>new d))},175:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.randomBytes=e.wrapXOFConstructorWithOpts=e.wrapConstructorWithOpts=e.wrapConstructor=e.checkOpts=e.Hash=e.concatBytes=e.toBytes=e.utf8ToBytes=e.asyncLoop=e.nextTick=e.hexToBytes=e.bytesToHex=e.isLE=e.rotr=e.createView=e.u32=e.u8=void 0;const n=r(145);function o(t){return t instanceof Uint8Array||null!=t&&"object"==typeof t&&"Uint8Array"===t.constructor.name}if(e.u8=t=>new Uint8Array(t.buffer,t.byteOffset,t.byteLength),e.u32=t=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4)),e.createView=t=>new DataView(t.buffer,t.byteOffset,t.byteLength),e.rotr=(t,e)=>t<<32-e|t>>>e,e.isLE=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0],!e.isLE)throw new Error("Non little-endian hardware is not supported");const i=Array.from({length:256},((t,e)=>e.toString(16).padStart(2,"0")));e.bytesToHex=function(t){if(!o(t))throw new Error("Uint8Array expected");let e="";for(let r=0;r=s&&t<=a?t-s:t>=f&&t<=u?t-(f-10):t>=c&&t<=l?t-(c-10):void 0}function d(t){if("string"!=typeof t)throw new Error("utf8ToBytes expected string, got "+typeof t);return new Uint8Array((new TextEncoder).encode(t))}function p(t){if("string"==typeof t&&(t=d(t)),!o(t))throw new Error("expected Uint8Array, got "+typeof t);return t}e.hexToBytes=function(t){if("string"!=typeof t)throw new Error("hex string expected, got "+typeof t);const e=t.length,r=e/2;if(e%2)throw new Error("padded hex string expected, got unpadded hex of length "+e);const n=new Uint8Array(r);for(let e=0,o=0;e{},e.asyncLoop=async function(t,r,n){let o=Date.now();for(let i=0;i=0&&tt().update(p(e)).digest(),r=t();return e.outputLen=r.outputLen,e.blockLen=r.blockLen,e.create=()=>t(),e},e.wrapConstructorWithOpts=function(t){const e=(e,r)=>t(r).update(p(e)).digest(),r=t({});return e.outputLen=r.outputLen,e.blockLen=r.blockLen,e.create=e=>t(e),e},e.wrapXOFConstructorWithOpts=function(t){const e=(e,r)=>t(r).update(p(e)).digest(),r=t({});return e.outputLen=r.outputLen,e.blockLen=r.blockLen,e.create=e=>t(e),e},e.randomBytes=function(t=32){if(n.crypto&&"function"==typeof n.crypto.getRandomValues)return n.crypto.getRandomValues(new Uint8Array(t));throw new Error("crypto.getRandomValues must be defined")}},526:(t,e)=>{"use strict";e.byteLength=function(t){var e=a(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){var e,r,i=a(t),s=i[0],f=i[1],u=new o(function(t,e,r){return 3*(e+r)/4-r}(0,s,f)),c=0,l=f>0?s-4:s;for(r=0;r>16&255,u[c++]=e>>8&255,u[c++]=255&e;return 2===f&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,u[c++]=255&e),1===f&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,u[c++]=e>>8&255,u[c++]=255&e),u},e.fromByteArray=function(t){for(var e,n=t.length,o=n%3,i=[],s=16383,a=0,u=n-o;au?u:a+s));return 1===o?(e=t[n-1],i.push(r[e>>2]+r[e<<4&63]+"==")):2===o&&(e=(t[n-2]<<8)+t[n-1],i.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"=")),i.join("")};for(var r=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0;s<64;++s)r[s]=i[s],n[i.charCodeAt(s)]=s;function a(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function f(t,e,n){for(var o,i,s=[],a=e;a>18&63]+r[i>>12&63]+r[i>>6&63]+r[63&i]);return s.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},343:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.bech32m=e.bech32=void 0;const r="qpzry9x8gf2tvdw0s3jn54khce6mua7l",n={};for(let t=0;t<32;t++){const e=r.charAt(t);n[e]=t}function o(t){const e=t>>25;return(33554431&t)<<5^996825010&-(e>>0&1)^642813549&-(e>>1&1)^513874426&-(e>>2&1)^1027748829&-(e>>3&1)^705979059&-(e>>4&1)}function i(t){let e=1;for(let r=0;r126)return"Invalid prefix ("+t+")";e=o(e)^n>>5}e=o(e);for(let r=0;r=r;)i-=r,a.push(o>>i&s);if(n)i>0&&a.push(o<=e)return"Excess padding";if(o<r)return"Exceeds length limit";const s=t.toLowerCase(),a=t.toUpperCase();if(t!==s&&t!==a)return"Mixed-case string "+t;const f=(t=s).lastIndexOf("1");if(-1===f)return"No separator character for "+t;if(0===f)return"Missing prefix for "+t;const u=t.slice(0,f),c=t.slice(f+1);if(c.length<6)return"Data too short";let l=i(u);if("string"==typeof l)return l;const h=[];for(let t=0;t=c.length||h.push(r)}return l!==e?"Invalid checksum for "+t:{prefix:u,words:h}}return e="bech32"===t?1:734539939,{decodeUnsafe:function(t,e){const r=s(t,e);if("object"==typeof r)return r},decode:function(t,e){const r=s(t,e);if("object"==typeof r)return r;throw new Error(r)},encode:function(t,n,s){if(s=s||90,t.length+7+n.length>s)throw new TypeError("Exceeds length limit");let a=i(t=t.toLowerCase());if("string"==typeof a)throw new Error(a);let f=t+"1";for(let t=0;t>5!=0)throw new Error("Non 5-bit word");a=o(a)^e,f+=r.charAt(e)}for(let t=0;t<6;++t)a=o(a);a^=e;for(let t=0;t<6;++t)f+=r.charAt(a>>5*(5-t)&31);return f},toWords:a,fromWordsUnsafe:f,fromWords:u}}e.bech32=c("bech32"),e.bech32m=c("bech32m")},156:(t,e,r)=>{const n=r(829);function o(t,e,r){const n=t[e]+t[r];let o=t[e+1]+t[r+1];n>=4294967296&&o++,t[e]=n,t[e+1]=o}function i(t,e,r,n){let o=t[e]+r;r<0&&(o+=4294967296);let i=t[e+1]+n;o>=4294967296&&i++,t[e]=o,t[e+1]=i}function s(t,e){return t[e]^t[e+1]<<8^t[e+2]<<16^t[e+3]<<24}function a(t,e,r,n,s,a){const f=l[s],u=l[s+1],h=l[a],d=l[a+1];o(c,t,e),i(c,t,f,u);let p=c[n]^c[t],y=c[n+1]^c[t+1];c[n]=y,c[n+1]=p,o(c,r,n),p=c[e]^c[r],y=c[e+1]^c[r+1],c[e]=p>>>24^y<<8,c[e+1]=y>>>24^p<<8,o(c,t,e),i(c,t,h,d),p=c[n]^c[t],y=c[n+1]^c[t+1],c[n]=p>>>16^y<<16,c[n+1]=y>>>16^p<<16,o(c,r,n),p=c[e]^c[r],y=c[e+1]^c[r+1],c[e]=y>>>31^p<<1,c[e+1]=p>>>31^y<<1}const f=new Uint32Array([4089235720,1779033703,2227873595,3144134277,4271175723,1013904242,1595750129,2773480762,2917565137,1359893119,725511199,2600822924,4215389547,528734635,327033209,1541459225]),u=new Uint8Array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3,11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4,7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8,9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13,2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9,12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11,13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10,6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5,10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3].map((function(t){return 2*t}))),c=new Uint32Array(32),l=new Uint32Array(32);function h(t,e){let r=0;for(r=0;r<16;r++)c[r]=t.h[r],c[r+16]=f[r];for(c[24]=c[24]^t.t,c[25]=c[25]^t.t/4294967296,e&&(c[28]=~c[28],c[29]=~c[29]),r=0;r<32;r++)l[r]=s(t.b,4*r);for(r=0;r<12;r++)a(0,8,16,24,u[16*r+0],u[16*r+1]),a(2,10,18,26,u[16*r+2],u[16*r+3]),a(4,12,20,28,u[16*r+4],u[16*r+5]),a(6,14,22,30,u[16*r+6],u[16*r+7]),a(0,10,20,30,u[16*r+8],u[16*r+9]),a(2,12,22,24,u[16*r+10],u[16*r+11]),a(4,14,16,26,u[16*r+12],u[16*r+13]),a(6,8,18,28,u[16*r+14],u[16*r+15]);for(r=0;r<16;r++)t.h[r]=t.h[r]^c[r]^c[r+16]}const d=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);function p(t,e,r,n){if(0===t||t>64)throw new Error("Illegal output length, expected 0 < length <= 64");if(e&&e.length>64)throw new Error("Illegal key, expected Uint8Array with 0 < length <= 64");if(r&&16!==r.length)throw new Error("Illegal salt, expected Uint8Array with length is 16");if(n&&16!==n.length)throw new Error("Illegal personal, expected Uint8Array with length is 16");const o={b:new Uint8Array(128),h:new Uint32Array(16),t:0,c:0,outlen:t};d.fill(0),d[0]=t,e&&(d[1]=e.length),d[2]=1,d[3]=1,r&&d.set(r,32),n&&d.set(n,48);for(let t=0;t<16;t++)o.h[t]=f[t]^s(d,4*t);return e&&(y(o,e),o.c=128),o}function y(t,e){for(let r=0;r>2]>>8*(3&r);return e}function b(t,e,r,o,i){r=r||64,t=n.normalizeInput(t),o&&(o=n.normalizeInput(o)),i&&(i=n.normalizeInput(i));const s=p(r,e,o,i);return y(s,t),g(s)}t.exports={blake2b:b,blake2bHex:function(t,e,r,o,i){const s=b(t,e,r,o,i);return n.toHex(s)},blake2bInit:p,blake2bUpdate:y,blake2bFinal:g}},843:(t,e,r)=>{const n=r(829);function o(t,e){return t[e]^t[e+1]<<8^t[e+2]<<16^t[e+3]<<24}function i(t,e,r,n,o,i){u[t]=u[t]+u[e]+o,u[n]=s(u[n]^u[t],16),u[r]=u[r]+u[n],u[e]=s(u[e]^u[r],12),u[t]=u[t]+u[e]+i,u[n]=s(u[n]^u[t],8),u[r]=u[r]+u[n],u[e]=s(u[e]^u[r],7)}function s(t,e){return t>>>e^t<<32-e}const a=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),f=new Uint8Array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,10,4,8,9,15,13,6,1,12,0,2,11,7,5,3,11,8,12,0,5,2,15,13,10,14,3,6,7,1,9,4,7,9,3,1,13,12,11,14,2,6,5,10,4,0,15,8,9,0,5,7,2,4,10,15,14,1,11,12,6,8,3,13,2,12,6,10,0,11,8,3,4,13,7,5,15,14,1,9,12,5,1,15,14,13,4,10,0,7,6,3,9,2,8,11,13,11,7,14,12,1,3,9,5,0,15,4,8,6,2,10,6,15,14,9,11,3,0,8,12,2,13,7,1,4,10,5,10,2,8,4,7,6,1,5,15,11,9,14,3,12,13,0]),u=new Uint32Array(16),c=new Uint32Array(16);function l(t,e){let r=0;for(r=0;r<8;r++)u[r]=t.h[r],u[r+8]=a[r];for(u[12]^=t.t,u[13]^=t.t/4294967296,e&&(u[14]=~u[14]),r=0;r<16;r++)c[r]=o(t.b,4*r);for(r=0;r<10;r++)i(0,4,8,12,c[f[16*r+0]],c[f[16*r+1]]),i(1,5,9,13,c[f[16*r+2]],c[f[16*r+3]]),i(2,6,10,14,c[f[16*r+4]],c[f[16*r+5]]),i(3,7,11,15,c[f[16*r+6]],c[f[16*r+7]]),i(0,5,10,15,c[f[16*r+8]],c[f[16*r+9]]),i(1,6,11,12,c[f[16*r+10]],c[f[16*r+11]]),i(2,7,8,13,c[f[16*r+12]],c[f[16*r+13]]),i(3,4,9,14,c[f[16*r+14]],c[f[16*r+15]]);for(r=0;r<8;r++)t.h[r]^=u[r]^u[r+8]}function h(t,e){if(!(t>0&&t<=32))throw new Error("Incorrect output length, should be in [1, 32]");const r=e?e.length:0;if(e&&!(r>0&&r<=32))throw new Error("Incorrect key length, should be in [1, 32]");const n={h:new Uint32Array(a),b:new Uint8Array(64),c:0,t:0,outlen:t};return n.h[0]^=16842752^r<<8^t,r>0&&(d(n,e),n.c=64),n}function d(t,e){for(let r=0;r>2]>>8*(3&r)&255;return e}function y(t,e,r){r=r||32,t=n.normalizeInput(t);const o=h(r,e);return d(o,t),p(o)}t.exports={blake2s:y,blake2sHex:function(t,e,r){const o=y(t,e,r);return n.toHex(o)},blake2sInit:h,blake2sUpdate:d,blake2sFinal:p}},493:(t,e,r)=>{const n=r(156),o=r(843);t.exports={blake2b:n.blake2b,blake2bHex:n.blake2bHex,blake2bInit:n.blake2bInit,blake2bUpdate:n.blake2bUpdate,blake2bFinal:n.blake2bFinal,blake2s:o.blake2s,blake2sHex:o.blake2sHex,blake2sInit:o.blake2sInit,blake2sUpdate:o.blake2sUpdate,blake2sFinal:o.blake2sFinal}},829:t=>{function e(t){return(4294967296+t).toString(16).substring(1)}t.exports={normalizeInput:function(t){let e;if(t instanceof Uint8Array)e=t;else{if("string"!=typeof t)throw new Error("Input must be an string, Buffer or Uint8Array");e=(new TextEncoder).encode(t)}return e},toHex:function(t){return Array.prototype.map.call(t,(function(t){return(t<16?"0":"")+t.toString(16)})).join("")},debugPrint:function(t,r,n){let o="\n"+t+" = ";for(let i=0;i{"use strict";const n=r(526),o=r(251),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.Buffer=f,e.SlowBuffer=function(t){return+t!=t&&(t=0),f.alloc(+t)},e.INSPECT_MAX_BYTES=50;const s=2147483647;function a(t){if(t>s)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,f.prototype),e}function f(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return l(t)}return u(t,e,r)}function u(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!f.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|y(t,e);let n=a(r);const o=n.write(t,e);return o!==r&&(n=n.slice(0,o)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(Z(t,Uint8Array)){const e=new Uint8Array(t);return d(e.buffer,e.byteOffset,e.byteLength)}return h(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(Z(t,ArrayBuffer)||t&&Z(t.buffer,ArrayBuffer))return d(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(Z(t,SharedArrayBuffer)||t&&Z(t.buffer,SharedArrayBuffer)))return d(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return f.from(n,e,r);const o=function(t){if(f.isBuffer(t)){const e=0|p(t.length),r=a(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||J(t.length)?a(0):h(t):"Buffer"===t.type&&Array.isArray(t.data)?h(t.data):void 0}(t);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return f.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function l(t){return c(t),a(t<0?0:0|p(t))}function h(t){const e=t.length<0?0:0|p(t.length),r=a(e);for(let n=0;n=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|t}function y(t,e){if(f.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||Z(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return W(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return z(t).length;default:if(o)return n?-1:W(t).length;e=(""+e).toLowerCase(),o=!0}}function g(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return k(this,e,r);case"utf8":case"utf-8":return S(this,e,r);case"ascii":return O(this,e,r);case"latin1":case"binary":return T(this,e,r);case"base64":return I(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function b(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function w(t,e,r,n,o){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),J(r=+r)&&(r=o?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(o)return-1;r=t.length-1}else if(r<0){if(!o)return-1;r=0}if("string"==typeof e&&(e=f.from(e,n)),f.isBuffer(e))return 0===e.length?-1:m(t,e,r,n,o);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):m(t,[e],r,n,o);throw new TypeError("val must be string, number or Buffer")}function m(t,e,r,n,o){let i,s=1,a=t.length,f=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,f/=2,r/=2}function u(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(o){let n=-1;for(i=r;ia&&(r=a-f),i=r;i>=0;i--){let r=!0;for(let n=0;no&&(n=o):n=o;const i=e.length;let s;for(n>i/2&&(n=i/2),s=0;s>8,o=r%256,i.push(o),i.push(n);return i}(e,t.length-r),t,r,n)}function I(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function S(t,e,r){r=Math.min(t.length,r);const n=[];let o=e;for(;o239?4:e>223?3:e>191?2:1;if(o+s<=r){let r,n,a,f;switch(s){case 1:e<128&&(i=e);break;case 2:r=t[o+1],128==(192&r)&&(f=(31&e)<<6|63&r,f>127&&(i=f));break;case 3:r=t[o+1],n=t[o+2],128==(192&r)&&128==(192&n)&&(f=(15&e)<<12|(63&r)<<6|63&n,f>2047&&(f<55296||f>57343)&&(i=f));break;case 4:r=t[o+1],n=t[o+2],a=t[o+3],128==(192&r)&&128==(192&n)&&128==(192&a)&&(f=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&a,f>65535&&f<1114112&&(i=f))}}null===i?(i=65533,s=1):i>65535&&(i-=65536,n.push(i>>>10&1023|55296),i=56320|1023&i),n.push(i),o+=s}return function(t){const e=t.length;if(e<=U)return String.fromCharCode.apply(String,t);let r="",n=0;for(;nn.length?(f.isBuffer(e)||(e=f.from(e)),e.copy(n,o)):Uint8Array.prototype.set.call(n,e,o);else{if(!f.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(n,o)}o+=e.length}return n},f.byteLength=y,f.prototype._isBuffer=!0,f.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;er&&(t+=" ... "),""},i&&(f.prototype[i]=f.prototype.inspect),f.prototype.compare=function(t,e,r,n,o){if(Z(t,Uint8Array)&&(t=f.from(t,t.offset,t.byteLength)),!f.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),e<0||r>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&e>=r)return 0;if(n>=o)return-1;if(e>=r)return 1;if(this===t)return 0;let i=(o>>>=0)-(n>>>=0),s=(r>>>=0)-(e>>>=0);const a=Math.min(i,s),u=this.slice(n,o),c=t.slice(e,r);for(let t=0;t>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const o=this.length-e;if((void 0===r||r>o)&&(r=o),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let i=!1;for(;;)switch(n){case"hex":return E(this,t,e,r);case"utf8":case"utf-8":return B(this,t,e,r);case"ascii":case"latin1":case"binary":return x(this,t,e,r);case"base64":return v(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return A(this,t,e,r);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const U=4096;function O(t,e,r){let n="";r=Math.min(t.length,r);for(let o=e;on)&&(r=n);let o="";for(let n=e;nr)throw new RangeError("Trying to access beyond buffer length")}function _(t,e,r,n,o,i){if(!f.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}function M(t,e,r,n,o){V(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r++]=i,i>>=8,t[r++]=i,i>>=8,t[r++]=i,i>>=8,t[r++]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,r}function C(t,e,r,n,o){V(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r+7]=i,i>>=8,t[r+6]=i,i>>=8,t[r+5]=i,i>>=8,t[r+4]=i;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=s,s>>=8,t[r+2]=s,s>>=8,t[r+1]=s,s>>=8,t[r]=s,r+8}function j(t,e,r,n,o,i){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function N(t,e,r,n,i){return e=+e,r>>>=0,i||j(t,0,r,4),o.write(t,e,r,n,23,4),r+4}function P(t,e,r,n,i){return e=+e,r>>>=0,i||j(t,0,r,8),o.write(t,e,r,n,52,8),r+8}f.prototype.slice=function(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],o=1,i=0;for(;++i>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t+--e],o=1;for(;e>0&&(o*=256);)n+=this[t+--e]*o;return n},f.prototype.readUint8=f.prototype.readUInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),this[t]},f.prototype.readUint16LE=f.prototype.readUInt16LE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]|this[t+1]<<8},f.prototype.readUint16BE=f.prototype.readUInt16BE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]<<8|this[t+1]},f.prototype.readUint32LE=f.prototype.readUInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},f.prototype.readUint32BE=f.prototype.readUInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},f.prototype.readBigUInt64LE=X((function(t){q(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||$(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,o=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(o)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||$(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],o=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],o=1,i=0;for(;++i=o&&(n-=Math.pow(2,8*e)),n},f.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=e,o=1,i=this[t+--n];for(;n>0&&(o*=256);)i+=this[t+--n]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},f.prototype.readInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},f.prototype.readInt16LE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},f.prototype.readInt16BE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},f.prototype.readInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},f.prototype.readInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},f.prototype.readBigInt64LE=X((function(t){q(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||$(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||$(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<>>=0,e||R(t,4,this.length),o.read(this,t,!0,23,4)},f.prototype.readFloatBE=function(t,e){return t>>>=0,e||R(t,4,this.length),o.read(this,t,!1,23,4)},f.prototype.readDoubleLE=function(t,e){return t>>>=0,e||R(t,8,this.length),o.read(this,t,!0,52,8)},f.prototype.readDoubleBE=function(t,e){return t>>>=0,e||R(t,8,this.length),o.read(this,t,!1,52,8)},f.prototype.writeUintLE=f.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||_(this,t,e,r,Math.pow(2,8*r)-1,0);let o=1,i=0;for(this[e]=255&t;++i>>=0,r>>>=0,n||_(this,t,e,r,Math.pow(2,8*r)-1,0);let o=r-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+r},f.prototype.writeUint8=f.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,1,255,0),this[e]=255&t,e+1},f.prototype.writeUint16LE=f.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},f.prototype.writeUint16BE=f.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},f.prototype.writeUint32LE=f.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},f.prototype.writeUint32BE=f.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},f.prototype.writeBigUInt64LE=X((function(t,e=0){return M(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),f.prototype.writeBigUInt64BE=X((function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),f.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);_(this,t,e,r,n-1,-n)}let o=0,i=1,s=0;for(this[e]=255&t;++o>0)-s&255;return e+r},f.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);_(this,t,e,r,n-1,-n)}let o=r-1,i=1,s=0;for(this[e+o]=255&t;--o>=0&&(i*=256);)t<0&&0===s&&0!==this[e+o+1]&&(s=1),this[e+o]=(t/i>>0)-s&255;return e+r},f.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},f.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},f.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},f.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},f.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||_(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},f.prototype.writeBigInt64LE=X((function(t,e=0){return M(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),f.prototype.writeBigInt64BE=X((function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),f.prototype.writeFloatLE=function(t,e,r){return N(this,t,e,!0,r)},f.prototype.writeFloatBE=function(t,e,r){return N(this,t,e,!1,r)},f.prototype.writeDoubleLE=function(t,e,r){return P(this,t,e,!0,r)},f.prototype.writeDoubleBE=function(t,e,r){return P(this,t,e,!1,r)},f.prototype.copy=function(t,e,r,n){if(!f.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function V(t,e,r,n,o,i){if(t>r||t3?0===e||e===BigInt(0)?`>= 0${n} and < 2${n} ** ${8*(i+1)}${n}`:`>= -(2${n} ** ${8*(i+1)-1}${n}) and < 2 ** ${8*(i+1)-1}${n}`:`>= ${e}${n} and <= ${r}${n}`,new F.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,r){q(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||$(e,t.length-(r+1))}(n,o,i)}function q(t,e){if("number"!=typeof t)throw new F.ERR_INVALID_ARG_TYPE(e,"number",t)}function $(t,e,r){if(Math.floor(t)!==t)throw q(t,r),new F.ERR_OUT_OF_RANGE(r||"offset","an integer",t);if(e<0)throw new F.ERR_BUFFER_OUT_OF_BOUNDS;throw new F.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${e}`,t)}H("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),H("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),H("ERR_OUT_OF_RANGE",(function(t,e,r){let n=`The value of "${t}" is out of range.`,o=r;return Number.isInteger(r)&&Math.abs(r)>2**32?o=D(String(r)):"bigint"==typeof r&&(o=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(o=D(o)),o+="n"),n+=` It must be ${e}. Received ${o}`,n}),RangeError);const K=/[^+/0-9A-Za-z-_]/g;function W(t,e){let r;e=e||1/0;const n=t.length;let o=null;const i=[];for(let s=0;s55295&&r<57344){if(!o){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&i.push(239,191,189);continue}o=r;continue}if(r<56320){(e-=3)>-1&&i.push(239,191,189),o=r;continue}r=65536+(o-55296<<10|r-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,r<128){if((e-=1)<0)break;i.push(r)}else if(r<2048){if((e-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function z(t){return n.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(K,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function G(t,e,r,n){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+r]=t[o];return o}function Z(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function J(t){return t!=t}const Y=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let o=0;o<16;++o)e[n+o]=t[r]+t[o]}return e}();function X(t){return"undefined"==typeof BigInt?Q:t}function Q(){throw new Error("BigInt not supported")}},251:(t,e)=>{e.read=function(t,e,r,n,o){var i,s,a=8*o-n-1,f=(1<>1,c=-7,l=r?o-1:0,h=r?-1:1,d=t[e+l];for(l+=h,i=d&(1<<-c)-1,d>>=-c,c+=a;c>0;i=256*i+t[e+l],l+=h,c-=8);for(s=i&(1<<-c)-1,i>>=-c,c+=n;c>0;s=256*s+t[e+l],l+=h,c-=8);if(0===i)i=1-u;else{if(i===f)return s?NaN:1/0*(d?-1:1);s+=Math.pow(2,n),i-=u}return(d?-1:1)*s*Math.pow(2,i-n)},e.write=function(t,e,r,n,o,i){var s,a,f,u=8*i-o-1,c=(1<>1,h=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:i-1,p=n?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=c):(s=Math.floor(Math.log(e)/Math.LN2),e*(f=Math.pow(2,-s))<1&&(s--,f*=2),(e+=s+l>=1?h/f:h*Math.pow(2,1-l))*f>=2&&(s++,f/=2),s+l>=c?(a=0,s=c):s+l>=1?(a=(e*f-1)*Math.pow(2,o),s+=l):(a=e*Math.pow(2,l-1)*Math.pow(2,o),s=0));o>=8;t[r+d]=255&a,d+=p,a/=256,o-=8);for(s=s<0;t[r+d]=255&s,d+=p,s/=256,u-=8);t[r+d-p]|=128*y}},92:(t,e,r)=>{"use strict";var n=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==r.g)return r.g;throw new Error("unable to locate global object")}();t.exports=e=n.fetch,n.fetch&&(e.default=n.fetch.bind(n)),e.Headers=n.Headers,e.Request=n.Request,e.Response=n.Response},374:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mkCardanoWalletExtension=e.mkCip95Wallet=void 0;const n=r(493),o=r(329),i=r(772),s=r(353),a=r(329),f=r(493),u=r(287),c=new a.Encoder({mapsAsObjects:!1,useRecords:!1}),l=new a.Decoder({mapsAsObjects:!1});class h{constructor(t){this.value=t}}async function d(t,e){const r=e.networkId??0,o=t.addressBech32(r);console.debug("Wallet address:"+o);const i=u.Buffer.from(t.addressRawBytes(r)),a=i.toString("hex"),h=u.Buffer.from(t.rewardAddressRawBytes(r)).toString("hex"),d=u.Buffer.from(t.stakeKey.public).toString("hex");return{getBalance:async()=>(await s.default.queryUtxos(o),"0"),submitTx:async t=>(console.debug("[CardanoWallet] SubmittingTx: ",t),await s.default.submitTransaction(t).then((async e=>function(t){let e=l.decode(u.Buffer.from(t,"hex"));const r=Uint8Array.from(c.encode(e[0]));return(0,f.blake2bHex)(r,void 0,32)}(t)))),getUtxos:(t,e)=>p(o,i,t,e),getUsedAddresses:async()=>[a],getUnusedAddresses:async()=>[a],getChangeAddress:async()=>a,getRewardAddresses:async()=>[h,...e.extraRewardAddresses??[]],getNetworkId:async()=>r,experimental:{on:(t,e)=>{},off:(t,e)=>{},getCollateral:()=>""},cip95:{getPubDRepKey:async()=>d,getUnregisteredPubStakeKeys:async()=>[d],getRegisteredPubStakeKeys:async()=>[d,...e.extraRegisteredPubStakeKeys??[]]},getActivePubStakeKeys:async()=>[h],signTx:async(r,o)=>{let i=l.decode(u.Buffer.from(r,"hex"));const s=u.Buffer.from(c.encode(i)).toString("hex");r!=s&&(console.warn("[CardanoWallet] Re-encoded tx is not same"),console.warn("[CardanoWallet] Starting Tx",r),console.warn("[CardanoWallet] Re-Encoded Tx",s));const a=Uint8Array.from(c.encode(i[0])),f=n.blake2b(a,void 0,32);console.debug("[CardanoWallet] Signing Tx hash="+u.Buffer.from(f).toString("hex"));const h=await t.paymentKey.signRaw(f),d=new Map,p=[[t.paymentKey.public,h]];if(e.enableStakeSigning){console.debug("Signing stake key...");const e=await t.stakeKey.signRaw(f);p.push([t.stakeKey.public,e])}return d.set(0,p),u.Buffer.from(c.encode(d)).toString("hex")},signData:async(t,e)=>"",getExtensions:()=>[{cip:95}]}}(0,o.addExtension)({Class:h,tag:259,encode:(t,e)=>e(t.value),decode:t=>new h(t)}),e.mkCip95Wallet=d,e.mkCardanoWalletExtension=async function(){let t=!1;return{apiVersion:"1.3.1",icon:"data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg viewBox='0 0 500 500' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='309.36' y='12.441' width='121.115' height='472.347' style='fill: rgb(128 177 211)%3B'/%3E%3Cellipse style='fill: rgb(128 177 211)%3B' cx='231.272' cy='320.966' rx='171.791' ry='137.051'/%3E%3C/svg%3E",enable:async function(){const e=window.cardanoTestWallet.wallet||(await i.ShelleyWallet.generate()).json(),r=window.cardanoTestWallet.config||{};return t=!0,await d(i.ShelleyWallet.fromJson(e),r)},isEnabled:async function(){return t},name:"Demos",supportedExtensions:[{cip:95}]}};const p=async(t,e,r,n)=>{function o(t){const e=BigInt(t.lovelace);let r=new Map;for(let e in t){const n=t[e];for(let t in n)if(r.has(e))r.get(e).set(t,BigInt(n[t]));else{let o=new Map;o.set(t,BigInt(n[t])),r.set(e,o)}}return r.size>0?[e,r]:e}return(await s.default.queryUtxos(t)).map((t=>{const r=t.txin.split("#");return u.Buffer.from(c.encode([[u.Buffer.from(r[0],"hex"),BigInt(r[1])],[e,o(t.value)]])).toString("hex")}))}},772:(t,e,r)=>{"use strict";var n=r(287).Buffer;Object.defineProperty(e,"__esModule",{value:!0}),e.ShelleyWalletAddress=e.ShelleyWallet=e.Ed25519Key=void 0;const o=r(459),i=r(343),s=r(493);class a{constructor(t,e,r){this.private=t,this.public=e,this.pkh=r}static async generate(){const t=o.ed25519.utils.randomPrivateKey();return await a.fromPrivateKey(t)}static async fromPrivateKey(t){const e=o.ed25519.getPublicKey(t),r=s.blake2b(e,void 0,28);return new a(t,e,r)}static async fromPrivateKeyHex(t){return await a.fromPrivateKey(Uint8Array.from(n.from(t,"hex")))}bech32Pkh(t="stake"){return i.bech32.encode(t,i.bech32.toWords(this.pkh))}bech32PublicKey(t="vk_"){return i.bech32.encode(t,i.bech32.toWords(this.public))}bech32PrivateKey(t="sk_"){return i.bech32.encode(t,i.bech32.toWords(this.private))}async signRaw(t){return o.ed25519.sign(t,this.private)}async verify(t,e){return o.ed25519.verify(e,t,this.public)}json(){return{private:n.from(this.private).toString("hex"),public:n.from(this.public).toString("hex"),pkh:n.from(this.pkh).toString("hex")}}static fromJson(t){if(!t||"object"!=typeof t)throw new Error("Invalid JSON format for Ed25519Key: Input must be a non-null object.");if(!t.private||!t.public||!t.pkh)throw new Error("Invalid JSON format for Ed25519Key: Missing required fields (private, public, or pkh).");return new a(Uint8Array.from(n.from(t.private,"hex")),Uint8Array.from(n.from(t.public,"hex")),Uint8Array.from(n.from(t.pkh,"hex")))}}e.Ed25519Key=a;class f{constructor(t,e){this.paymentKey=t,this.stakeKey=e}static async generate(){return new f(await a.generate(),await a.generate())}addressBech32(t){const e=0==t?"addr_test":"addr";return i.bech32.encode(e,i.bech32.toWords(n.from(this.addressRawBytes(t))),200)}addressRawBytes(t){const e=new Uint8Array(57);return e[0]=t,e.set(this.paymentKey.pkh,1),e.set(this.stakeKey.pkh,29),e}rewardAddressRawBytes(t){const e=224|t,r=new Uint8Array(29);return r[0]=e,r.set(this.stakeKey.pkh,1),r}rewardAddressBech32(t){const e=0==t?"stake_test":"stake";return i.bech32.encode(e,i.bech32.toWords(n.from(this.rewardAddressRawBytes(t))),200)}json(){return{payment:this.paymentKey.json(),stake:this.stakeKey.json()}}static fromJson(t){if(!t||"object"!=typeof t)throw new Error("ShelleyWallet.fromJson: The input must be an object.");const e=t.payment,r=t.stake;if(!e||"object"!=typeof e)throw new Error("ShelleyWallet.fromJson : Invalid payment key: It must be an object.");if(!r||"object"!=typeof r)throw new Error("ShelleyWallet.fromJson : Invalid stake key: It must be an object.");return new f(a.fromJson(e),a.fromJson(r))}static dummy(){return f.fromJson({payment:{pkh:"595ac9bbf256bae584f56a4b671baa4b14a18c8098b8e571834bc12c",private:"5a1380cd79ecaee48d66c14f7d92ddfc866490a3b59d44520e60f16309c8a17d",public:"8d2f4d49118eb1156048b66dd6372cdb1f82da0f8e208d9f8ea4b388c79c09ad"},stake:{pkh:"6706efab75778c2f08b9a5321ead8bfc982a5c08b51a0b2a713cac52",private:"24e8c012c7bef2f5823baef1c06dac253da860a43f0d1f43fc3c8349a4f719a1",public:"f7a1eaea2691ee80b6c0d6f27482145d7037055829b1b26224a5d8f0c2243f16"}})}}e.ShelleyWallet=f;class u{constructor(t,e,r){this.network="mainnet"==t?1:"testnet"==t?0:t,this.paymentKeyHash=e,this.stakeKeyHash=r}static fromRawBytes(t){let e;if(114==t.length&&"string"==typeof t)e=n.from(t,"hex");else{if(57!==t.length)throw Error("ShelleyAddress.fromRawBytes: Invalid byte array length. expected: 57 got: "+t.length);e=n.from(t)}let r=e.subarray(1,29),o=e.subarray(29,57);return new u(e.at(0),r,o)}toBech32(){const t=0==this.network?"addr_test":"addr";return i.bech32.encode(t,i.bech32.toWords(n.from(this.toRawBytes())),200)}toRawBytes(){const t=new Uint8Array(57);return t[0]=this.network,t.set(this.paymentKeyHash,1),t.set(this.stakeKeyHash,29),t}toRawBytesHex(){return n.from(this.toRawBytes()).toString("hex")}}e.ShelleyWalletAddress=u},353:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const n=r(92),o={apiUrl:window.cardanoTestWallet.kuberApiUrl,apiKey:window.cardanoTestWallet.kuberApiKey},i={submitTransaction:t=>(0,n.default)(o.apiUrl+"/api/v1/tx/submit",{method:"POST",headers:{"Content-Type":"application/json","api-key":o.apiKey},body:JSON.stringify({tx:{description:"",type:"Tx ConwayEra",cborHex:t}}),redirect:"follow"}),queryUtxos:t=>async function(t,e="GET",r,i="application/json"){const s=o.apiUrl+t,a={"api-key":o.apiKey};i&&(a["content-type"]=i);const f={method:e,headers:a};return"POST"===e&&r&&(f.body=r),(0,n.default)(s,f).then((async t=>200===t.status?t.json():t.text().then((e=>{let r,n;try{n=JSON.parse(e),r=n?Error(`KuberApi [Status ${t.status}] : ${n.message?n.message:e}`):Error(`KuberApi [Status ${t.status}] : ${e}`)}catch(n){r=Error(`KuberApi [Status ${t.status}] : ${e}`)}throw r.status=t.status,r}))))}("/api/v3/utxo?address="+t)};e.default=i},329:(t,e,r)=>{"use strict";r.r(e),r.d(e,{ALWAYS:()=>Vt,DECIMAL_FIT:()=>$t,DECIMAL_ROUND:()=>qt,Decoder:()=>k,Encoder:()=>It,FLOAT32_OPTIONS:()=>at,NEVER:()=>Dt,REUSE_BUFFER_MODE:()=>Kt,Tag:()=>q,addExtension:()=>jt,clearSource:()=>rt,decode:()=>it,decodeIter:()=>Jt,decodeMultiple:()=>st,encode:()=>Pt,encodeAsAsyncIterable:()=>Ht,encodeAsIterable:()=>Ft,encodeIter:()=>Zt,isNativeAccelerationEnabled:()=>N,roundFloat32:()=>ft});var n=r(287).Buffer;let o,i,s;try{o=new TextDecoder}catch(t){}let a=0;const f=[],u=57342,c=57343,l=57337,h={};let d,p,y,g,b,w,m,E=f,B=0,x={},v=0,A=0,I=[],S=[],U={useRecords:!1,mapsAsObjects:!0},O=!1,T=2;try{new Function("")}catch(t){T=1/0}class k{constructor(t){if(t&&(!t.keyMap&&!t._keyMap||t.useRecords||(t.useRecords=!1,t.mapsAsObjects=!0),!1===t.useRecords&&void 0===t.mapsAsObjects&&(t.mapsAsObjects=!0),t.getStructures&&(t.getShared=t.getStructures),t.getShared&&!t.structures&&((t.structures=[]).uninitialized=!0),t.keyMap)){this.mapKey=new Map;for(let[e,r]of Object.entries(t.keyMap))this.mapKey.set(r,e)}Object.assign(this,t)}decodeKey(t){return this.keyMap&&this.mapKey.get(t)||t}encodeKey(t){return this.keyMap&&this.keyMap.hasOwnProperty(t)?this.keyMap[t]:t}encodeKeys(t){if(!this._keyMap)return t;let e=new Map;for(let[r,n]of Object.entries(t))e.set(this._keyMap.hasOwnProperty(r)?this._keyMap[r]:r,n);return e}decodeKeys(t){if(!this._keyMap||"Map"!=t.constructor.name)return t;if(!this._mapKey){this._mapKey=new Map;for(let[t,e]of Object.entries(this._keyMap))this._mapKey.set(e,t)}let e={};return t.forEach(((t,r)=>e[C(this._mapKey.has(r)?this._mapKey.get(r):r)]=t)),e}mapDecode(t,e){let r=this.decode(t);return this._keyMap&&"Array"===r.constructor.name?r.map((t=>this.decodeKeys(t))):r}decode(t,e){if(i)return et((()=>(rt(),this?this.decode(t,e):k.prototype.decode.call(U,t,e))));s=e>-1?e:t.length,a=0,B=0,A=0,p=null,E=f,y=null,i=t;try{w=t.dataView||(t.dataView=new DataView(t.buffer,t.byteOffset,t.byteLength))}catch(e){if(i=null,t instanceof Uint8Array)throw e;throw new Error("Source must be a Uint8Array or Buffer but was a "+(t&&"object"==typeof t?t.constructor.name:typeof t))}if(this instanceof k){if(x=this,b=this.sharedValues&&(this.pack?new Array(this.maxPrivatePackedValues||16).concat(this.sharedValues):this.sharedValues),this.structures)return d=this.structures,L();(!d||d.length>0)&&(d=[])}else x=U,(!d||d.length>0)&&(d=[]),b=null;return L()}decodeMultiple(t,e){let r,n=0;try{let o=t.length;O=!0;let i=this?this.decode(t,o):ot.decode(t,o);if(!e){for(r=[i];a=y.postBundlePosition){let t=new Error("Unexpected bundle position");throw t.incomplete=!0,t}a=y.postBundlePosition,y=null}if(a==s)d=null,i=null,g&&(g=null);else{if(a>s){let t=new Error("Unexpected end of CBOR data");throw t.incomplete=!0,t}if(!O)throw new Error("Data read, but end of buffer not reached")}return t}catch(t){throw rt(),(t instanceof RangeError||t.message.startsWith("Unexpected end of buffer"))&&(t.incomplete=!0),t}}function R(){let t=i[a++],e=t>>5;if(t&=31,t>23)switch(t){case 24:t=i[a++];break;case 25:if(7==e)return function(){let t=i[a++],e=i[a++],r=(127&t)>>2;if(31===r)return e||3&t?NaN:128&t?-1/0:1/0;if(0===r){let r=((3&t)<<8|e)/(1<<24);return 128&t?-r:r}return V[3]=128&t|56+(r>>1),V[2]=(7&t)<<5|e>>3,V[1]=e<<5,V[0]=0,D[0]}();t=w.getUint16(a),a+=2;break;case 26:if(7==e){let t=w.getFloat32(a);if(x.useFloat32>2){let e=nt[(127&i[a])<<1|i[a+1]>>7];return a+=4,(e*t+(t>0?.5:-.5)>>0)/e}return a+=4,t}t=w.getUint32(a),a+=4;break;case 27:if(7==e){let t=w.getFloat64(a);return a+=8,t}if(e>1){if(w.getUint32(a)>0)throw new Error("JavaScript does not support arrays, maps, or strings with length over 4294967295");t=w.getUint32(a+4)}else x.int64AsNumber?(t=4294967296*w.getUint32(a),t+=w.getUint32(a+4)):t=w.getBigUint64(a);a+=8;break;case 31:switch(e){case 2:case 3:throw new Error("Indefinite length not supported for byte or text strings");case 4:let t,r=[],o=0;for(;(t=R())!=h;)r[o++]=t;return 4==e?r:3==e?r.join(""):n.concat(r);case 5:let i;if(x.mapsAsObjects){let t={};if(x.keyMap)for(;(i=R())!=h;)t[C(x.decodeKey(i))]=R();else for(;(i=R())!=h;)t[C(i)]=R();return t}{m&&(x.mapsAsObjects=!0,m=!1);let t=new Map;if(x.keyMap)for(;(i=R())!=h;)t.set(x.decodeKey(i),R());else for(;(i=R())!=h;)t.set(i,R());return t}case 7:return h;default:throw new Error("Invalid major type for indefinite length "+e)}default:throw new Error("Unknown token "+t)}switch(e){case 0:return t;case 1:return~t;case 2:return r=t,x.copyBuffers?Uint8Array.prototype.slice.call(i,a,a+=r):i.subarray(a,a+=r);case 3:if(A>=a)return p.slice(a-v,(a+=t)-v);if(0==A&&s<140&&t<32){let e=t<16?H(t):function(t){let e=a,r=new Array(t);for(let n=0;n0)return void(a=e);r[n]=t}return F.apply(String,r)}(t);if(null!=e)return e}return j(t);case 4:let e=new Array(t);for(let r=0;r=l){let e=d[8191&t];if(e)return e.read||(e.read=M(e)),e.read();if(t<65536){if(t==c){let t=Q(),e=R(),r=R();$(e,r);let n={};if(x.keyMap)for(let e=2;e23)switch(t){case 24:t=i[a++];break;case 25:t=w.getUint16(a),a+=2;break;case 26:t=w.getUint32(a),a+=4;break;default:throw new Error("Expected array header, but got "+i[a-1])}let e=this.compiledReader;for(;e;){if(e.propertyCount===t)return e(R);e=e.next}if(this.slowReads++>=T){let r=this.length==t?this:this.slice(0,t);return e=x.keyMap?new Function("r","return {"+r.map((t=>x.decodeKey(t))).map((t=>_.test(t)?C(t)+":r()":"["+JSON.stringify(t)+"]:r()")).join(",")+"}"):new Function("r","return {"+r.map((t=>_.test(t)?C(t)+":r()":"["+JSON.stringify(t)+"]:r()")).join(",")+"}"),this.compiledReader&&(e.next=this.compiledReader),e.propertyCount=t,this.compiledReader=e,e(R)}let r={};if(x.keyMap)for(let e=0;e64&&o)return o.decode(i.subarray(a,a+=t));const r=a+t,n=[];for(e="";a65535&&(e-=65536,n.push(e>>>10&1023|55296),e=56320|1023&e),n.push(e)}else n.push(t);n.length>=4096&&(e+=F.apply(String,n),n.length=0)}return n.length>0&&(e+=F.apply(String,n)),e}let F=String.fromCharCode;function H(t){if(t<4){if(t<2){if(0===t)return"";{let t=i[a++];return(128&t)>1?void(a-=1):F(t)}}{let e=i[a++],r=i[a++];if((128&e)>0||(128&r)>0)return void(a-=2);if(t<3)return F(e,r);let n=i[a++];return(128&n)>0?void(a-=3):F(e,r,n)}}{let e=i[a++],r=i[a++],n=i[a++],o=i[a++];if((128&e)>0||(128&r)>0||(128&n)>0||(128&o)>0)return void(a-=4);if(t<6){if(4===t)return F(e,r,n,o);{let t=i[a++];return(128&t)>0?void(a-=5):F(e,r,n,o,t)}}if(t<8){let s=i[a++],f=i[a++];if((128&s)>0||(128&f)>0)return void(a-=6);if(t<7)return F(e,r,n,o,s,f);let u=i[a++];return(128&u)>0?void(a-=7):F(e,r,n,o,s,f,u)}{let s=i[a++],f=i[a++],u=i[a++],c=i[a++];if((128&s)>0||(128&f)>0||(128&u)>0||(128&c)>0)return void(a-=8);if(t<10){if(8===t)return F(e,r,n,o,s,f,u,c);{let t=i[a++];return(128&t)>0?void(a-=9):F(e,r,n,o,s,f,u,c,t)}}if(t<12){let l=i[a++],h=i[a++];if((128&l)>0||(128&h)>0)return void(a-=10);if(t<11)return F(e,r,n,o,s,f,u,c,l,h);let d=i[a++];return(128&d)>0?void(a-=11):F(e,r,n,o,s,f,u,c,l,h,d)}{let l=i[a++],h=i[a++],d=i[a++],p=i[a++];if((128&l)>0||(128&h)>0||(128&d)>0||(128&p)>0)return void(a-=12);if(t<14){if(12===t)return F(e,r,n,o,s,f,u,c,l,h,d,p);{let t=i[a++];return(128&t)>0?void(a-=13):F(e,r,n,o,s,f,u,c,l,h,d,p,t)}}{let y=i[a++],g=i[a++];if((128&y)>0||(128&g)>0)return void(a-=14);if(t<15)return F(e,r,n,o,s,f,u,c,l,h,d,p,y,g);let b=i[a++];return(128&b)>0?void(a-=15):F(e,r,n,o,s,f,u,c,l,h,d,p,y,g,b)}}}}}let D=new Float32Array(1),V=new Uint8Array(D.buffer,0,4);new Array(4096);class q{constructor(t,e){this.value=t,this.tag=e}}I[0]=t=>new Date(t),I[1]=t=>new Date(Math.round(1e3*t)),I[2]=t=>{let e=BigInt(0);for(let r=0,n=t.byteLength;rBigInt(-1)-I[2](t),I[4]=t=>+(t[1]+"e"+t[0]),I[5]=t=>t[1]*Math.exp(t[0]*Math.log(2));const $=(t,e)=>{let r=d[t-=57344];r&&r.isShared&&((d.restoreStructures||(d.restoreStructures=[]))[t]=r),d[t]=e,e.read=M(e)};I[105]=t=>{let e=t.length,r=t[1];$(t[0],r);let n={};for(let o=2;oy?y[0].slice(y.position0,y.position0+=t):new q(t,14),I[15]=t=>y?y[1].slice(y.position1,y.position1+=t):new q(t,15);let K={Error,RegExp};I[27]=t=>(K[t[0]]||Error)(t[1],t[2]);const W=t=>{if(132!=i[a++]){let t=new Error("Packed values structure must be followed by a 4 element array");throw i.length{if(!b){if(!x.getShared)return new q(t,6);tt()}if("number"==typeof t)return b[16+(t>=0?2*t:-2*t-1)];let e=new Error("No support for non-integer packed references yet");throw void 0===t&&(e.incomplete=!0),e},I[28]=t=>{g||(g=new Map,g.id=0);let e,r=g.id++;e=i[a]>>5==4?[]:{};let n={target:e};g.set(r,n);let o=t();return n.used?Object.assign(e,o):(n.target=o,o)},I[28].handlesRead=!0,I[29]=t=>{let e=g.get(t);return e.used=!0,e.target},I[258]=t=>new Set(t),(I[259]=t=>(x.mapsAsObjects&&(x.mapsAsObjects=!1,m=!0),t())).handlesRead=!0,S.push(((t,e)=>t>=225&&t<=255?z(G().prefixes[t-224],e):t>=28704&&t<=32767?z(G().prefixes[t-28672],e):t>=1879052288&&t<=2147483647?z(G().prefixes[t-1879048192],e):t>=216&&t<=223?z(e,G().suffixes[t-216]):t>=27647&&t<=28671?z(e,G().suffixes[t-27639]):t>=1811940352&&t<=1879048191?z(e,G().suffixes[t-1811939328]):1399353956==t?{packedValues:b,structures:d.slice(0),version:e}:55799==t?e:void 0));const Z=1==new Uint8Array(new Uint16Array([1]).buffer)[0],J=[Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array,"undefined"==typeof BigUint64Array?{name:"BigUint64Array"}:BigUint64Array,Int8Array,Int16Array,Int32Array,"undefined"==typeof BigInt64Array?{name:"BigInt64Array"}:BigInt64Array,Float32Array,Float64Array],Y=[64,68,69,70,71,72,77,78,79,85,86];for(let t=0;t{if(!t)throw new Error("Could not find typed array for code "+e);return x.copyBuffers||1!==r&&(2!==r||1&n.byteOffset)&&(4!==r||3&n.byteOffset)&&(8!==r||7&n.byteOffset)?new t(Uint8Array.prototype.slice.call(n,0).buffer):new t(n.buffer,n.byteOffset,n.byteLength)}:r=>{if(!t)throw new Error("Could not find typed array for code "+e);let s=new DataView(r.buffer,r.byteOffset,r.byteLength),a=r.length>>i,f=new t(a),u=s[n];for(let t=0;t23)switch(t){case 24:t=i[a++];break;case 25:t=w.getUint16(a),a+=2;break;case 26:t=w.getUint32(a),a+=4}return t}function tt(){if(x.getShared){let t=et((()=>(i=null,x.getShared())))||{},e=t.structures||[];x.sharedVersion=t.version,b=x.sharedValues=t.packedValues,!0===d?x.structures=d=e:d.splice.apply(d,[0,e.length].concat(e))}}function et(t){let e=s,r=a,n=B,o=v,f=A,u=p,c=E,l=g,h=y,b=new Uint8Array(i.slice(0,s)),m=d,I=x,S=O,U=t();return s=e,a=r,B=n,v=o,A=f,p=u,E=c,g=l,y=h,i=b,O=S,d=m,x=I,w=new DataView(i.buffer,i.byteOffset,i.byteLength),U}function rt(){i=null,g=null,d=null}const nt=new Array(147);for(let t=0;t<256;t++)nt[t]=+("1e"+Math.floor(45.15-.30103*t));let ot=new k({useRecords:!1});const it=ot.decode,st=ot.decodeMultiple,at={NEVER:0,ALWAYS:1,DECIMAL_ROUND:3,DECIMAL_FIT:4};function ft(t){D[0]=t;let e=nt[(127&V[3])<<1|V[2]>>7];return(e*t+(t>0?.5:-.5)>>0)/e}let ut,ct,lt;try{ut=new TextEncoder}catch(t){}const ht="object"==typeof globalThis&&globalThis.Buffer,dt=void 0!==ht,pt=dt?ht.allocUnsafeSlow:Uint8Array,yt=dt?ht:Uint8Array,gt=dt?4294967296:2144337920;let bt,wt,mt,Et,Bt=0,xt=null;const vt=/[\u0080-\uFFFF]/,At=Symbol("record-id");class It extends k{constructor(t){let e,r,n,o,i;super(t),this.offset=0,t=t||{};let s=yt.prototype.utf8Write?function(t,e,r){return wt.utf8Write(t,e,r)}:!(!ut||!ut.encodeInto)&&function(t,e){return ut.encodeInto(t,wt.subarray(e)).written},a=this,f=t.structures||t.saveStructures,u=t.maxSharedStructures;if(null==u&&(u=f?128:0),u>8190)throw new Error("Maximum maxSharedStructure is 8190");let c=t.sequential;c&&(u=0),this.structures||(this.structures=[]),this.saveStructures&&(this.saveShared=this.saveStructures);let l,h,d,p=t.sharedValues;if(p){d=Object.create(null);for(let t=0,e=p.length;tthis.encodeKeys(t)))),this.encode(t,e)},this.encode=function(s,f){if(wt||(wt=new pt(8192),mt=new DataView(wt.buffer,0,8192),Bt=0),Et=wt.length-10,Et-Bt<2048?(wt=new pt(wt.length),mt=new DataView(wt.buffer,0,wt.length),Et=wt.length-10,Bt=0):f===Kt&&(Bt=Bt+7&2147483640),e=Bt,a.useSelfDescribedHeader&&(mt.setUint32(Bt,3654940416),Bt+=3),i=a.structuredClone?new Map:null,a.bundleStrings&&"string"!=typeof s?(xt=[],xt.size=1/0):xt=null,r=a.structures,r){if(r.uninitialized){let t=a.getShared()||{};a.structures=r=t.structures||[],a.sharedVersion=t.version;let e=a.sharedValues=t.packedValues;if(e){d={};for(let t=0,r=e.length;tu&&!c&&(t=u),!r.transitions){r.transitions=Object.create(null);for(let e=0;e0){wt[Bt++]=216,wt[Bt++]=51,Ot(4);let t=e.values;w(t),Ot(0),Ot(0),h=Object.create(d||null);for(let e=0,r=t.length;eEt&&E(Bt),a.offset=Bt;let t=function(t,e){let r,n=2*e.length,o=t.length-n;e.sort(((t,e)=>t.offset>e.offset?1:-1));for(let r=0;r>8,t[e]=255&r}for(;r=e.pop();){let e=r.offset;t.copyWithin(e+n,e,o),n-=2;let i=e+n;t[i++]=216,t[i++]=28,o=e}return t}(wt.subarray(e,Bt),i.idsToInsert);return i=null,t}return f&Kt?(wt.start=e,wt.end=Bt,wt):wt.subarray(e,Bt)}finally{if(r)if(b<10&&b++,r.length>u&&(r.length=u),g>1e4)r.transitions=null,b=0,g=0,y.length>0&&(y=[]);else if(y.length>0&&!c){for(let t=0,e=y.length;tu&&(a.structures=a.structures.slice(0,u));let t=wt.subarray(e,Bt);return!1===a.updateSharedData()?a.encode(s):t}f&Wt&&(Bt=e)}},this.findCommonStringsToPack=()=>(l=new Map,d||(d=Object.create(null)),t=>{let e=t&&t.threshold||4,r=this.pack?t.maxPrivatePackedValues||16:0;p||(p=this.sharedValues=[]);for(let[t,o]of l)o.count>e&&(d[t]=r++,p.push(t),n=!0);for(;this.saveShared&&!1===this.updateSharedData(););l=null});const w=r=>{Bt>Et&&(wt=E(Bt));var n,o=typeof r;if("string"===o){if(h){let e=h[r];if(e>=0)return void(e<16?wt[Bt++]=e+224:(wt[Bt++]=198,w(1&e?15-e>>1:e-16>>1)));if(l&&!t.pack){let t=l.get(r);t?t.count++:l.set(r,{count:1})}}let o,i=r.length;if(xt&&i>=4&&i<1024){if((xt.size+=i)>61440){let t,r=(xt[0]?3*xt[0].length+xt[1].length:0)+10;Bt+r>Et&&(wt=E(Bt+r)),wt[Bt++]=217,wt[Bt++]=223,wt[Bt++]=249,wt[Bt++]=xt.position?132:130,wt[Bt++]=26,t=Bt-e,Bt+=4,xt.position&&Ct(e,w),xt=["",""],xt.size=0,xt.position=t}let t=vt.test(r);return xt[t?0:1]+=r,wt[Bt++]=t?206:207,void w(i)}o=i<32?1:i<256?2:i<65536?3:5;let a=3*i;if(Bt+a>Et&&(wt=E(Bt+a)),i<64||!s){let t,e,s,a=Bt+o;for(t=0;t>6|192,wt[a++]=63&e|128):55296==(64512&e)&&56320==(64512&(s=r.charCodeAt(t+1)))?(e=65536+((1023&e)<<10)+(1023&s),t++,wt[a++]=e>>18|240,wt[a++]=e>>12&63|128,wt[a++]=e>>6&63|128,wt[a++]=63&e|128):(wt[a++]=e>>12|224,wt[a++]=e>>6&63|128,wt[a++]=63&e|128);n=a-Bt-o}else n=s(r,Bt+o,a);n<24?wt[Bt++]=96|n:n<256?(o<2&&wt.copyWithin(Bt+2,Bt+1,Bt+1+n),wt[Bt++]=120,wt[Bt++]=n):n<65536?(o<3&&wt.copyWithin(Bt+3,Bt+2,Bt+2+n),wt[Bt++]=121,wt[Bt++]=n>>8,wt[Bt++]=255&n):(o<5&&wt.copyWithin(Bt+5,Bt+3,Bt+3+n),wt[Bt++]=122,mt.setUint32(Bt,n),Bt+=4),Bt+=n}else if("number"===o)if(this.alwaysUseFloat||r>>>0!==r)if(this.alwaysUseFloat||r>>0!==r){let t;if((t=this.useFloat32)>0&&r<4294967296&&r>=-2147483648){let e;if(wt[Bt++]=250,mt.setFloat32(Bt,r),t<4||(e=r*nt[(127&wt[Bt])<<1|wt[Bt+1]>>7])>>0===e)return void(Bt+=4);Bt--}wt[Bt++]=251,mt.setFloat64(Bt,r),Bt+=8}else r>=-24?wt[Bt++]=31-r:r>=-256?(wt[Bt++]=56,wt[Bt++]=~r):r>=-65536?(wt[Bt++]=57,mt.setUint16(Bt,~r),Bt+=2):(wt[Bt++]=58,mt.setUint32(Bt,~r),Bt+=4);else r<24?wt[Bt++]=r:r<256?(wt[Bt++]=24,wt[Bt++]=r):r<65536?(wt[Bt++]=25,wt[Bt++]=r>>8,wt[Bt++]=255&r):(wt[Bt++]=26,mt.setUint32(Bt,r),Bt+=4);else if("object"===o)if(r){if(i){let t=i.get(r);if(t){if(wt[Bt++]=216,wt[Bt++]=29,wt[Bt++]=25,!t.references){let e=i.idsToInsert||(i.idsToInsert=[]);t.references=[],e.push(t)}return t.references.push(Bt-e),void(Bt+=2)}i.set(r,{offset:Bt-e})}let t=r.constructor;if(t===Object)m(r,!0);else if(t===Array){(n=r.length)<24?wt[Bt++]=128|n:Ot(n);for(let t=0;t>8,wt[Bt++]=255&n):(wt[Bt++]=186,mt.setUint32(Bt,n),Bt+=4),a.keyMap)for(let[t,e]of r)w(a.encodeKey(t)),w(e);else for(let[t,e]of r)w(t),w(e);else{for(let t=0,e=ct.length;t>8,wt[Bt++]=255&n):n>-1&&(wt[Bt++]=218,mt.setUint32(Bt,n),Bt+=4),void e.encode.call(this,r,w,E)}if(r[Symbol.iterator]){if(bt){let t=new Error("Iterable should be serialized as iterator");throw t.iteratorNotHandled=!0,t}wt[Bt++]=159;for(let t of r)w(t);return void(wt[Bt++]=255)}if(r[Symbol.asyncIterator]||kt(r)){let t=new Error("Iterable/blob should be serialized as iterator");throw t.iteratorNotHandled=!0,t}if(this.useToJSON&&r.toJSON){const t=r.toJSON();if(t!==r)return w(t)}m(r,!r.hasOwnProperty)}}else wt[Bt++]=246;else if("boolean"===o)wt[Bt++]=r?245:244;else if("bigint"===o){if(r=0)wt[Bt++]=27,mt.setBigUint64(Bt,r);else if(r>-(BigInt(1)<{let e=Object.keys(t),r=Object.values(t),n=e.length;if(n<24?wt[Bt++]=160|n:n<256?(wt[Bt++]=184,wt[Bt++]=n):n<65536?(wt[Bt++]=185,wt[Bt++]=n>>8,wt[Bt++]=255&n):(wt[Bt++]=186,mt.setUint32(Bt,n),Bt+=4),a.keyMap)for(let t=0;t{wt[Bt++]=185;let n=Bt-e;Bt+=2;let o=0;if(a.keyMap)for(let e in t)(r||t.hasOwnProperty(e))&&(w(a.encodeKey(e)),w(t[e]),o++);else for(let e in t)(r||t.hasOwnProperty(e))&&(w(e),w(t[e]),o++);wt[n+++e]=o>>8,wt[n+e]=255&o}:(t,e)=>{let r,i,s,a=o.transitions||(o.transitions=Object.create(null)),f=0,c=0;if(this.keyMap){s=Object.keys(t).map((t=>this.encodeKey(t))),c=s.length;for(let t=0;t>8|224,wt[Bt++]=255&l;else{if(s||(s=a.__keys__||(a.__keys__=Object.keys(t))),void 0===i?(l=o.nextId++,l||(l=0,o.nextId=1),l>=256&&(o.nextId=(l=u)+1)):l=i,o[l]=s,!(l=256-u&&(y.shift()[At]=void 0),y.push(a),Ot(c+2),w(57344+l),w(s),null===e)return;for(let r in t)(e||t.hasOwnProperty(r))&&w(t[r]);return}wt[Bt++]=217,wt[Bt++]=l>>8|224,wt[Bt++]=255&l,a=o.transitions;for(let t=0;t{let r;if(t>16777216){if(t-e>gt)throw new Error("Encoded buffer would be larger than maximum buffer size");r=Math.min(gt,4096*Math.round(Math.max((t-e)*(t>67108864?1.25:2),4194304)/4096))}else r=1+(Math.max(t-e<<2,wt.length-1)>>12)<<12;let n=new pt(r);return mt=new DataView(n.buffer,0,r),wt.copy?wt.copy(n,0,e,t):n.set(wt.slice(e,t)),Bt-=e,e=0,Et=n.length-10,wt=n};let B=100,x=1e3;function*v(t,r,n){let o=t.constructor;if(o===Object){let e=!1!==a.useRecords;e?m(t,null):St(Object.keys(t).length,160);for(let n in t){let o=t[n];e||w(n),o&&"object"==typeof o?r[n]?yield*v(o,r[n]):yield*A(o,r,n):w(o)}}else if(o===Array){let n=t.length;Ot(n);for(let o=0;oB)?r.element?yield*v(n,r.element):yield*A(n,r,"element"):w(n)}}else if(t[Symbol.iterator]){wt[Bt++]=159;for(let n of t)n&&("object"==typeof n||Bt-e>B)?r.element?yield*v(n,r.element):yield*A(n,r,"element"):w(n);wt[Bt++]=255}else kt(t)?(St(t.size,64),yield wt.subarray(e,Bt),yield t,I()):t[Symbol.asyncIterator]?(wt[Bt++]=159,yield wt.subarray(e,Bt),yield t,I(),wt[Bt++]=255):w(t);n&&Bt>e?yield wt.subarray(e,Bt):Bt-e>B&&(yield wt.subarray(e,Bt),I())}function*A(t,r,n){let o=Bt-e;try{w(t),Bt-e>B&&(yield wt.subarray(e,Bt),I())}catch(i){if(!i.iteratorNotHandled)throw i;r[n]={},Bt=e+o,yield*v.call(this,t,r[n])}}function I(){B=x,a.encode(null,zt)}function S(t,e,r){return B=e&&e.chunkThreshold?x=e.chunkThreshold:100,t&&"object"==typeof t?(a.encode(null,zt),r(t,a.iterateProperties||(a.iterateProperties={}),!0)):[a.encode(t)]}async function*U(t,e){for(let r of v(t,e,!0)){let t=r.constructor;if(t===yt||t===Uint8Array)yield r;else if(kt(r)){let t,e=r.stream().getReader();for(;!(t=await e.read()).done;)yield t.value}else if(r[Symbol.asyncIterator])for await(let t of r)I(),t?yield*U(t,e.async||(e.async={})):yield a.encode(t);else yield r}}this.encodeAsIterable=function(t,e){return S(t,e,v)},this.encodeAsAsyncIterable=function(t,e){return S(t,e,U)}}useBuffer(t){wt=t,mt=new DataView(wt.buffer,wt.byteOffset,wt.byteLength),Bt=0}clearSharedData(){this.structures&&(this.structures=[]),this.sharedValues&&(this.sharedValues=void 0)}updateSharedData(){let t=this.sharedVersion||0;this.sharedVersion=t+1;let e=this.structures.slice(0),r=new Ut(e,this.sharedValues,this.sharedVersion),n=this.saveShared(r,(e=>(e&&e.version||0)==t));return!1===n?(r=this.getShared()||{},this.structures=r.structures||[],this.sharedValues=r.packedValues,this.sharedVersion=r.version,this.structures.nextId=this.structures.length):e.forEach(((t,e)=>this.structures[e]=t)),n}}function St(t,e){t<24?wt[Bt++]=e|t:t<256?(wt[Bt++]=24|e,wt[Bt++]=t):t<65536?(wt[Bt++]=25|e,wt[Bt++]=t>>8,wt[Bt++]=255&t):(wt[Bt++]=26|e,mt.setUint32(Bt,t),Bt+=4)}class Ut{constructor(t,e,r){this.structures=t,this.packedValues=e,this.version=r}}function Ot(t){t<24?wt[Bt++]=128|t:t<256?(wt[Bt++]=152,wt[Bt++]=t):t<65536?(wt[Bt++]=153,wt[Bt++]=t>>8,wt[Bt++]=255&t):(wt[Bt++]=154,mt.setUint32(Bt,t),Bt+=4)}const Tt="undefined"==typeof Blob?function(){}:Blob;function kt(t){if(t instanceof Tt)return!0;let e=t[Symbol.toStringTag];return"Blob"===e||"File"===e}function Lt(t,e){switch(typeof t){case"string":if(t.length>3){if(e.objectMap[t]>-1||e.values.length>=e.maxValues)return;let r=e.get(t);if(r)2==++r.count&&e.values.push(t);else if(e.set(t,{count:1}),e.samplingPackedValues){let r=e.samplingPackedValues.get(t);r?r.count++:e.samplingPackedValues.set(t,{count:1})}}break;case"object":if(t)if(t instanceof Array)for(let r=0,n=t.length;r1&&(t-=4),{tag:t,encode:function(t,e){let r=t.byteLength,n=t.byteOffset||0,o=t.buffer||t;e(dt?ht.from(o,n,r):new Uint8Array(o,n,r))}}}function Mt(t,e){let r=t.byteLength;r<24?wt[Bt++]=64+r:r<256?(wt[Bt++]=88,wt[Bt++]=r):r<65536?(wt[Bt++]=89,wt[Bt++]=r>>8,wt[Bt++]=255&r):(wt[Bt++]=90,mt.setUint32(Bt,r),Bt+=4),Bt+r>=wt.length&&e(Bt+r),wt.set(t.buffer?t:new Uint8Array(t),Bt),Bt+=r}function Ct(t,e){mt.setUint32(xt.position+t,Bt-xt.position-t+1);let r=xt;xt=null,e(r[0]),e(r[1])}function jt(t){if(t.Class){if(!t.encode)throw new Error("Extension has no encode function");lt.unshift(t.Class),ct.unshift(t)}!function(t){I[t.tag]=t.decode}(t)}lt=[Date,Set,Error,RegExp,q,ArrayBuffer,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array,"undefined"==typeof BigUint64Array?function(){}:BigUint64Array,Int8Array,Int16Array,Int32Array,"undefined"==typeof BigInt64Array?function(){}:BigInt64Array,Float32Array,Float64Array,Ut],ct=[{tag:1,encode(t,e){let r=t.getTime()/1e3;(this.useTimestamp32||0===t.getMilliseconds())&&r>=0&&r<4294967296?(wt[Bt++]=26,mt.setUint32(Bt,r),Bt+=4):(wt[Bt++]=251,mt.setFloat64(Bt,r),Bt+=8)}},{tag:258,encode(t,e){e(Array.from(t))}},{tag:27,encode(t,e){e([t.name,t.message])}},{tag:27,encode(t,e){e(["RegExp",t.source,t.flags])}},{getTag:t=>t.tag,encode(t,e){e(t.value)}},{encode(t,e,r){Mt(t,r)}},{getTag(t){if(t.constructor===Uint8Array&&(this.tagUint8Array||dt&&!1!==this.tagUint8Array))return 64},encode(t,e,r){Mt(t,r)}},_t(68,1),_t(69,2),_t(70,4),_t(71,8),_t(72,1),_t(77,2),_t(78,4),_t(79,8),_t(85,4),_t(86,8),{encode(t,e){let r=t.packedValues||[],n=t.structures||[];if(r.values.length>0){wt[Bt++]=216,wt[Bt++]=51,Ot(4);let t=r.values;e(t),Ot(0),Ot(0),packedObjectMap=Object.create(sharedPackedObjectMap||null);for(let e=0,r=t.length;e{let e;n&&(t=Gt.concat([n,t]),n=void 0);try{e=r.decodeMultiple(t)}catch(r){if(!r.incomplete)throw r;n=t.slice(r.lastPosition),e=r.values}return e};return"function"==typeof t[Symbol.iterator]?function*(){for(const e of t)yield*o(e)}():"function"==typeof t[Symbol.asyncIterator]?async function*(){for await(const e of t)yield*o(e)}():void 0}}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={exports:{}};return t[n](i,i.exports,r),i.exports}r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},(()=>{"use strict";const t=r(374);(async()=>{if(null==window.cardanoTestWallet.walletName)throw new Error('Please specify the wallet name in the cardanoTestWallet.config object. Example: { walletName: "MyWallet" }');const e=await(0,t.mkCardanoWalletExtension)();window.cardano={demos:e}})()})()})(); \ No newline at end of file diff --git a/tests/cardano-test-wallet/index.js.LICENSE.txt b/tests/cardano-test-wallet/index.js.LICENSE.txt deleted file mode 100644 index 945120b77..000000000 --- a/tests/cardano-test-wallet/index.js.LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -/*! - * - * /*! - * * The cardano-test-wallet module for browser environments. - * * - * * @author Nabin Kawan - * * @license MIT - * * / - * - */ - -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ - -/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ - -/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ - -/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ diff --git a/tests/cardano-test-wallet/types.d.ts b/tests/cardano-test-wallet/types.d.ts deleted file mode 100644 index a08f06b18..000000000 --- a/tests/cardano-test-wallet/types.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -export type HexString = string; -export interface CIP30Provider { - apiVersion: string; - enable: () => Promise; - icon: string; - isEnabled: () => Promise; - name: string; - supportedExtensions: Record[]; -} -export interface CIP30Instance { - submitTx: (tx: string) => Promise; - signTx: (tx: string, partial?: Boolean) => Promise; - getChangeAddress: () => Promise; - getNetworkId: () => Promise; - getRewardAddresses: () => Promise; - getUnusedAddresses: () => Promise; - getUsedAddresses: () => Promise>; - getUtxos: (amount?: object, paginate?: any) => Promise>; - getCollateral?: () => Promise>; - signData: (address: string, payload: HexString) => Promise; - getBalance: () => Promise; -} -export interface Cip95Instance extends CIP30Instance { - cip95: { - getPubDRepKey: () => Promise; - getUnregisteredPubStakeKeys: () => Promise; - getRegisteredPubStakeKeys: () => Promise; - }; - getActivePubStakeKeys: () => Promise; - getExtensions: () => Record[]; -} -export type CardanoTestWallet = { - payment: { - private: string; - public: string; - pkh: string; - }; - stake: { - private: string; - public: string; - pkh: string; - }; -}; -export type CardanoTestWalletConfig = { - networkId?: number; - walletName?: string; - enableStakeSigning?: boolean; - extraRegisteredPubStakeKeys?: string[]; - extraRewardAddresses?: string[]; - kuberApiUrl: string; - kuberApiKey: string; -}; -export type KuberValue = { - [policyId: string]: Record | BigInt | number; -}; diff --git a/tests/govtool-frontend/playwright/lock_logs.txt b/tests/govtool-frontend/playwright/lock_logs.txt new file mode 100644 index 000000000..84773e7f4 --- /dev/null +++ b/tests/govtool-frontend/playwright/lock_logs.txt @@ -0,0 +1,525 @@ +[5/5/2025, 11:58:55 AM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 11:58:55 AM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 11:58:56 AM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 11:59:22 AM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 11:59:22 AM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:01:03 PM] Task completed for:undefined +[5/5/2025, 12:01:03 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:01:03 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:01:03 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:01:03 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:01:38 PM] Task completed for:undefined +[5/5/2025, 12:01:38 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:01:38 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:01:54 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:01:54 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:01:55 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 12:02:46 PM] Task completed for:undefined +[5/5/2025, 12:02:46 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:02:46 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:02:46 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:02:46 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:02:47 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 12:02:50 PM] Task completed for:undefined +[5/5/2025, 12:02:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:02:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:02:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:02:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:02:53 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:02:53 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:02:53 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:02:53 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:02:54 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:02:54 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:02:54 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:02:54 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:04:05 PM] Task completed for:undefined +[5/5/2025, 12:04:05 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:04:05 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:04:05 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:04:05 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:05:01 PM] Task completed for:undefined +[5/5/2025, 12:05:01 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:05:01 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:05:18 PM] Initiator: tempWallets + ---------------------> waiting lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:05:18 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:05:40 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:05:40 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:05:40 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:05:40 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:06:17 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:06:17 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:06:17 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:06:17 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:08:13 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:08:13 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:08:39 PM] Task completed for:undefined +[5/5/2025, 12:08:39 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:08:39 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:08:43 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:08:43 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:08:44 PM] Task failure: +{"error":"{\"status\":400}"} +[5/5/2025, 12:08:44 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:08:44 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:08:47 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:08:47 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:09:01 PM] Task completed for:undefined +[5/5/2025, 12:09:01 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:09:01 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:19:48 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:19:48 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:19:49 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 12:20:02 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:20:02 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:20:21 PM] Task completed for:undefined +[5/5/2025, 12:20:21 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:20:21 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:20:21 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:20:21 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:20:35 PM] Task completed for:undefined +[5/5/2025, 12:20:35 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:20:35 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:20:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:20:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:20:51 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 12:20:55 PM] Task completed for:undefined +[5/5/2025, 12:20:55 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:20:55 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:20:55 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:20:55 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:20:56 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 12:21:20 PM] Task completed for:undefined +[5/5/2025, 12:21:20 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:21:20 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:21:20 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:21:20 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:22:27 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:22:27 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:27:30 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:27:30 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:28:49 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:28:49 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:29:04 PM] Task completed for:undefined +[5/5/2025, 12:29:04 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:29:04 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:41:47 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:41:47 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:41:47 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 12:41:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:41:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:42:11 PM] Task completed for:undefined +[5/5/2025, 12:42:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:42:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:42:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:42:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:42:25 PM] Task completed for:undefined +[5/5/2025, 12:42:25 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:42:25 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:42:49 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:42:49 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:42:50 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 12:42:57 PM] Task completed for:undefined +[5/5/2025, 12:42:57 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:42:57 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:42:57 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:42:57 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:42:58 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd + ---------------------> waiting lock for:undefined +[5/5/2025, 12:43:11 PM] Task completed for:undefined +[5/5/2025, 12:43:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:43:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:43:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:43:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:44:29 PM] Task completed for:undefined +[5/5/2025, 12:44:29 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:44:29 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:44:29 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:44:29 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:44:42 PM] Task completed for:undefined +[5/5/2025, 12:44:42 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:44:42 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:45:12 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:45:12 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:45:12 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:45:12 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:45:12 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:45:12 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:45:12 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:45:12 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:45:18 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:45:18 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:45:18 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:45:18 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:45:19 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:45:19 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:45:19 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:45:19 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:46:43 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:46:44 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:46:44 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:46:44 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:46:44 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:47:07 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:47:07 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:47:07 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:47:07 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:47:41 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:47:41 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:47:41 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:47:41 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:48:38 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:48:38 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:48:38 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:48:38 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:48:42 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:48:42 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:48:42 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:48:42 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:48:59 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 12:48:59 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 12:48:59 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 12:48:59 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 12:52:05 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:52:05 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:53:02 PM] Task completed for:undefined +[5/5/2025, 12:53:02 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:53:02 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:53:06 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:53:06 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:53:07 PM] Task failure: +{"error":"{\"status\":400}"} +[5/5/2025, 12:53:07 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:53:07 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 12:53:10 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 12:53:10 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 12:53:23 PM] Task completed for:undefined +[5/5/2025, 12:53:23 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 12:53:23 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 1:31:04 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 1:31:04 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 1:32:31 PM] Task completed for:undefined +[5/5/2025, 1:32:31 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 1:32:31 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 1:32:32 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 1:32:32 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 1:33:03 PM] Task completed for:undefined +[5/5/2025, 1:33:03 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 1:33:03 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 1:33:03 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 1:33:03 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 1:33:11 PM] Task completed for:undefined +[5/5/2025, 1:33:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 1:33:11 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + +[5/5/2025, 1:33:40 PM] Initiator: tempWallets +---------------------> acquiring lock for:undefined +[5/5/2025, 1:33:40 PM] Initiator: tempWallets +---------------------> acquired lock for:undefined +[5/5/2025, 1:33:40 PM] Initiator: tempWallets +---------------------> releasing lock for:undefined +[5/5/2025, 1:33:40 PM] Initiator: tempWallets +---------------------> released lock for:undefined + +[5/5/2025, 1:35:20 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquiring lock for:undefined +[5/5/2025, 1:35:20 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> acquired lock for:undefined +[5/5/2025, 1:35:58 PM] Task completed for:undefined +[5/5/2025, 1:35:58 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> releasing lock for:undefined +[5/5/2025, 1:35:58 PM] Initiator: addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd +---------------------> released lock for:undefined + From 1e9a59e0702889015d72e8385b7e4a5a3a0c2301 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 14:24:22 +0545 Subject: [PATCH 47/60] fix: correct URL construction in DrepListFetcher --- .../test/java/org/cardano/govtool/feeders/DrepListFetcher.java | 2 +- .../java/org/cardano/govtool/simulations/VvaSimulation.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/load-testing/src/test/java/org/cardano/govtool/feeders/DrepListFetcher.java b/tests/load-testing/src/test/java/org/cardano/govtool/feeders/DrepListFetcher.java index ae85fe931..3d790f138 100644 --- a/tests/load-testing/src/test/java/org/cardano/govtool/feeders/DrepListFetcher.java +++ b/tests/load-testing/src/test/java/org/cardano/govtool/feeders/DrepListFetcher.java @@ -22,7 +22,7 @@ public static List fetchDrepIds(String baseUrl) { // Fetch about 5 pages for (int page = 0; page < 5; page++) { - String requestUrl = baseUrl + "/drep/list" + "?page=" + page + "&size=" + PAGE_SIZE; + String requestUrl = baseUrl + "drep/list" + "?page=" + page + "&size=" + PAGE_SIZE; HttpRequest request = HttpRequest.newBuilder() .uri(new URI(requestUrl)) .GET() diff --git a/tests/load-testing/src/test/java/org/cardano/govtool/simulations/VvaSimulation.java b/tests/load-testing/src/test/java/org/cardano/govtool/simulations/VvaSimulation.java index 37c3a4586..5c6591b1b 100644 --- a/tests/load-testing/src/test/java/org/cardano/govtool/simulations/VvaSimulation.java +++ b/tests/load-testing/src/test/java/org/cardano/govtool/simulations/VvaSimulation.java @@ -53,7 +53,7 @@ private PopulationBuilder makeScenario(String name, ChainBuilder chain, double u // Load Simulation { knownDreps= DrepListFetcher.fetchDrepIds(API_URL); - var DREP_USER_RATI0=0.3 + var DREP_USER_RATI0=0.3; setUp( makeScenario("User Connects and Leave", exec(), 0.1) , makeScenario("User Registers as Drep", From 9c7074c93e5d7e520ac218f908fd0fe97ee7ec78 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 14:24:27 +0545 Subject: [PATCH 48/60] docs: add README for GovTool tests directory --- tests/README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tests/README.md diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 000000000..e1ebe821d --- /dev/null +++ b/tests/README.md @@ -0,0 +1,26 @@ +# GovTool Tests + +This directory contains tests for the GovTool project. + +## πŸ“ Navigation + +- [Backend Tests](./govtool-backend/) +- [Frontend Tests](./govtool-frontend/playwright/) +- [Load Tests](./load-testing/) +- [Test Infrastructure](./test-infrastructure/) +- [Metadata API](./test-metadata-api/) + +## Backend Tests +- Conducts basic tests on GovTool backend endpoints using Python. + +## Frontend Tests +- Performs integration tests on the deployed GovTool platform using Playwright. + +## Load Tests +- Executes load tests on the GovTool API using Gatling. + +## Test Infrastructure +- Includes Docker Compose files and scripts to deploy and manage the GovTool test environment. + +## Metadata API +- A simple service to host JSON metadata during testing. \ No newline at end of file From 18710f8b52bcfa454b189d23277458e25f2493f4 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 16:16:17 +0545 Subject: [PATCH 49/60] refactor: consolidate outcome ID and title fetching into a single method --- .../playwright/lib/pages/outcomesPage.ts | 29 ++++++++++--------- .../9-outcomes/outcomes.loggedin.spec.ts | 7 +++-- .../tests/9-outcomes/outcomes.spec.ts | 8 +++-- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/pages/outcomesPage.ts b/tests/govtool-frontend/playwright/lib/pages/outcomesPage.ts index e8a72481a..031dfa5e9 100644 --- a/tests/govtool-frontend/playwright/lib/pages/outcomesPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/outcomesPage.ts @@ -373,8 +373,12 @@ export default class OutComesPage { } } - async fetchOutcomeIdFromNetwork(governanceActionId: string) { + async fetchOutcomeIdAndTitleFromNetwork( + governanceActionId: string, + governanceActionTitle: string + ) { let updatedGovernanceActionId = governanceActionId; + let updatedGovernanceActionTitle = governanceActionTitle; await this.page.route( "**/governance-actions?search=&filters=&sort=**", async (route) => { @@ -397,16 +401,6 @@ export default class OutComesPage { } ); - const responsePromise = this.page.waitForResponse( - "**/governance-actions?search=&filters=&sort=**" - ); - await this.goto(); - await responsePromise; - return updatedGovernanceActionId; - } - - async fetchOutcomeTitleFromNetwork(governanceActionTitle: string) { - let updatedGovernanceActionTitle = governanceActionTitle; await this.page.route( "**/governance-actions/metadata?**", async (route) => { @@ -430,12 +424,21 @@ export default class OutComesPage { } } ); - await this.goto(); + + const responsePromise = this.page.waitForResponse( + "**/governance-actions?search=&filters=&sort=**" + ); const metadataResponsePromise = this.page.waitForResponse( "**/governance-actions/metadata?**" ); + + await this.goto(); + await responsePromise; await metadataResponsePromise; - return updatedGovernanceActionTitle; + return { + governanceActionId: updatedGovernanceActionId, + governanceActionTitle: updatedGovernanceActionTitle, + }; } async searchOutcomesById(governanceActionId: string) { diff --git a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.loggedin.spec.ts index 864286c65..79f61f98a 100644 --- a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.loggedin.spec.ts @@ -64,11 +64,12 @@ test.describe("Outcomes page", () => { let currentPage: Page; test.beforeEach(async ({ page }) => { const outcomePage = new OutComesPage(page); - governanceActionId = - await outcomePage.fetchOutcomeIdFromNetwork(governanceActionId); - governanceActionTitle = await outcomePage.fetchOutcomeTitleFromNetwork( + const response = await outcomePage.fetchOutcomeIdAndTitleFromNetwork( + governanceActionId, governanceActionTitle ); + governanceActionId = response.governanceActionId; + governanceActionTitle = response.governanceActionTitle; currentPage = page; }); diff --git a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts index 2245e5ae3..512ccca3a 100644 --- a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts +++ b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts @@ -58,11 +58,13 @@ test.describe("Outcomes page", () => { let currentPage: Page; test.beforeEach(async ({ page }) => { const outcomePage = new OutComesPage(page); - governanceActionId = - await outcomePage.fetchOutcomeIdFromNetwork(governanceActionId); - governanceActionTitle = await outcomePage.fetchOutcomeTitleFromNetwork( + const response = await outcomePage.fetchOutcomeIdAndTitleFromNetwork( + governanceActionId, governanceActionTitle ); + governanceActionId = response.governanceActionId; + governanceActionTitle = response.governanceActionTitle; + currentPage = page; }); From bce32eb7b4c4c05308324745074c9e657c42cbdc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 10:36:42 +0000 Subject: [PATCH 50/60] chore: update @intersect.mbo/pdf-ui to 0.7.0-beta-25 --- govtool/frontend/package-lock.json | 8 ++++---- govtool/frontend/package.json | 2 +- govtool/frontend/yarn.lock | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/govtool/frontend/package-lock.json b/govtool/frontend/package-lock.json index 2f7e1e056..dc2c6004e 100644 --- a/govtool/frontend/package-lock.json +++ b/govtool/frontend/package-lock.json @@ -15,7 +15,7 @@ "@hookform/resolvers": "^3.3.1", "@intersect.mbo/govtool-outcomes-pillar-ui": "1.4.0", "@intersect.mbo/intersectmbo.org-icons-set": "^1.0.8", - "@intersect.mbo/pdf-ui": "0.7.0-beta-24", + "@intersect.mbo/pdf-ui": "0.7.0-beta-25", "@mui/icons-material": "^5.14.3", "@mui/material": "^5.14.4", "@rollup/plugin-babel": "^6.0.4", @@ -3424,9 +3424,9 @@ "license": "ISC" }, "node_modules/@intersect.mbo/pdf-ui": { - "version": "0.7.0-beta-24", - "resolved": "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.7.0-beta-24.tgz", - "integrity": "sha512-o/3thkna2DQjvtiSqMf4KHN2XgDQN8qHVRklF3VRVhPue8y99IWtbji0nhlvhoYDqmdEVL/3Nmrt9Xom3QjHwg==", + "version": "0.7.0-beta-25", + "resolved": "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.7.0-beta-25.tgz", + "integrity": "sha512-TDeWjJVMvLOR6sgTT6bCoHspZbybiRH0C5OzDDaU1yLSFD7xKx1aW5eAVdG0uzxrO+C0X7ceBGFoN5ucHICdlg==", "dependencies": { "@emurgo/cardano-serialization-lib-asmjs": "^12.0.0-beta.2", "@fontsource/poppins": "^5.0.14", diff --git a/govtool/frontend/package.json b/govtool/frontend/package.json index e9e3744b2..308a1adc3 100644 --- a/govtool/frontend/package.json +++ b/govtool/frontend/package.json @@ -29,7 +29,7 @@ "@hookform/resolvers": "^3.3.1", "@intersect.mbo/govtool-outcomes-pillar-ui": "1.4.0", "@intersect.mbo/intersectmbo.org-icons-set": "^1.0.8", - "@intersect.mbo/pdf-ui": "0.7.0-beta-24", + "@intersect.mbo/pdf-ui": "0.7.0-beta-25", "@mui/icons-material": "^5.14.3", "@mui/material": "^5.14.4", "@rollup/plugin-babel": "^6.0.4", diff --git a/govtool/frontend/yarn.lock b/govtool/frontend/yarn.lock index 14d5adf21..1add0afdf 100644 --- a/govtool/frontend/yarn.lock +++ b/govtool/frontend/yarn.lock @@ -1512,10 +1512,10 @@ resolved "https://registry.npmjs.org/@intersect.mbo/intersectmbo.org-icons-set/-/intersectmbo.org-icons-set-1.1.0.tgz" integrity sha512-sjKEtnK9eLYH/8kCD0YRQCms3byFA/tnSsei9NHTZbBYX9sBpeX6ErfR0sKYjOSxQOxl4FumX9D0X+vHIqxo8g== -"@intersect.mbo/pdf-ui@0.7.0-beta-24": - version "0.7.0-beta-24" - resolved "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.7.0-beta-24.tgz" - integrity sha512-o/3thkna2DQjvtiSqMf4KHN2XgDQN8qHVRklF3VRVhPue8y99IWtbji0nhlvhoYDqmdEVL/3Nmrt9Xom3QjHwg== +"@intersect.mbo/pdf-ui@0.7.0-beta-25": + version "0.7.0-beta-25" + resolved "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.7.0-beta-25.tgz" + integrity sha512-TDeWjJVMvLOR6sgTT6bCoHspZbybiRH0C5OzDDaU1yLSFD7xKx1aW5eAVdG0uzxrO+C0X7ceBGFoN5ucHICdlg== dependencies: "@emurgo/cardano-serialization-lib-asmjs" "^12.0.0-beta.2" "@fontsource/poppins" "^5.0.14" From 6163f89d78e25816220aca0d8ce1d6872a4032da Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 16:35:37 +0545 Subject: [PATCH 51/60] chore: revert default test trigger host url to govtool.cardanoapi.io --- .github/workflows/test_integration_playwright.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index 1417cfb65..4a186dbca 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -11,7 +11,7 @@ on: deployment: required: true type: choice - default: "p80-z6b8d2f7a-ze34e4cb2-gtw.z937eb260.rustrocks.fr" + default: "govtool.cardanoapi.io" options: - "sanchogov.tools" - "staging.govtool.byron.network" From d9ea3ce9bf790869725d5fc20817dba5c30c4def Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 16:49:33 +0545 Subject: [PATCH 52/60] fix: add branch restriction to the backend test workflow file --- .github/workflows/test_backend.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test_backend.yml b/.github/workflows/test_backend.yml index aa651f28c..15433a89f 100644 --- a/.github/workflows/test_backend.yml +++ b/.github/workflows/test_backend.yml @@ -31,6 +31,9 @@ on: workflow_run: workflows: ["Build and deploy GovTool test stack"] types: [completed] + branches: + - test + - infra/test-chores concurrency: group: ${{ github.workflow }}-${{ github.ref }} From 3251061ca0e2dbd1177d44a408786d7913812945 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 5 May 2025 16:50:07 +0545 Subject: [PATCH 53/60] chore: add wallet address on error message for missing FAUCET_API_KEY environment variable --- tests/govtool-backend/lib/faucet_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/govtool-backend/lib/faucet_api.py b/tests/govtool-backend/lib/faucet_api.py index b6c63c9de..68e02ec08 100644 --- a/tests/govtool-backend/lib/faucet_api.py +++ b/tests/govtool-backend/lib/faucet_api.py @@ -25,7 +25,7 @@ def from_env(): api_key = FACUET_API_KEY base_url = FAUCET_API_URL if not api_key: - raise ValueError("FAUCET_API_KEY environment variable not set.") + raise ValueError("FAUCET_API_KEY environment variable not set. Please set this variable or fund missing balance to the wallet address: addr_test1qzc97zml9xzhm7xcsmqretkk7ztzyehj3dpd7ph7h0s40wp0ea9f3e353pmmr7yxv7m2dj09rn44m7pvd0m4cylusn8szlm75t") return CardanoFaucet(api_key, base_url) def send_money(self, address: str, tx_type: str = "default") -> Transaction: From cc463883aa6a8e277e28b56cde882c50cc6dc409 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 13:37:40 +0000 Subject: [PATCH 54/60] chore: update @intersect.mbo/govtool-outcomes-pillar-ui to 1.4.1 --- govtool/frontend/package-lock.json | 8 ++++---- govtool/frontend/package.json | 2 +- govtool/frontend/yarn.lock | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/govtool/frontend/package-lock.json b/govtool/frontend/package-lock.json index dc2c6004e..435748478 100644 --- a/govtool/frontend/package-lock.json +++ b/govtool/frontend/package-lock.json @@ -13,7 +13,7 @@ "@emotion/styled": "^11.11.0", "@emurgo/cardano-serialization-lib-asmjs": "^14.1.1", "@hookform/resolvers": "^3.3.1", - "@intersect.mbo/govtool-outcomes-pillar-ui": "1.4.0", + "@intersect.mbo/govtool-outcomes-pillar-ui": "1.4.1", "@intersect.mbo/intersectmbo.org-icons-set": "^1.0.8", "@intersect.mbo/pdf-ui": "0.7.0-beta-25", "@mui/icons-material": "^5.14.3", @@ -3390,9 +3390,9 @@ } }, "node_modules/@intersect.mbo/govtool-outcomes-pillar-ui": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@intersect.mbo/govtool-outcomes-pillar-ui/-/govtool-outcomes-pillar-ui-1.4.0.tgz", - "integrity": "sha512-iSg6FzeUW4F3KSQDcHCytggCG68Q4OKUzQa8yNMSPVAuM6w5I6LhaqEYRO8x02G8WPyE+8W+Q9m3SCFea59osg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@intersect.mbo/govtool-outcomes-pillar-ui/-/govtool-outcomes-pillar-ui-1.4.1.tgz", + "integrity": "sha512-cev6uUOiWH2KY4ozv17oxGkfonQ2oLDTlpcqU7HFntekUPwjEx0rOqaZPakGShxR6rb+GrBJ4Y7Vnf1bBk2Otg==", "license": "ISC", "dependencies": { "@fontsource/poppins": "^5.0.14", diff --git a/govtool/frontend/package.json b/govtool/frontend/package.json index 308a1adc3..c02cfeab5 100644 --- a/govtool/frontend/package.json +++ b/govtool/frontend/package.json @@ -27,7 +27,7 @@ "@emotion/styled": "^11.11.0", "@emurgo/cardano-serialization-lib-asmjs": "^14.1.1", "@hookform/resolvers": "^3.3.1", - "@intersect.mbo/govtool-outcomes-pillar-ui": "1.4.0", + "@intersect.mbo/govtool-outcomes-pillar-ui": "1.4.1", "@intersect.mbo/intersectmbo.org-icons-set": "^1.0.8", "@intersect.mbo/pdf-ui": "0.7.0-beta-25", "@mui/icons-material": "^5.14.3", diff --git a/govtool/frontend/yarn.lock b/govtool/frontend/yarn.lock index 1add0afdf..03cd99721 100644 --- a/govtool/frontend/yarn.lock +++ b/govtool/frontend/yarn.lock @@ -1492,10 +1492,10 @@ resolved "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz" integrity sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA== -"@intersect.mbo/govtool-outcomes-pillar-ui@1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@intersect.mbo/govtool-outcomes-pillar-ui/-/govtool-outcomes-pillar-ui-1.4.0.tgz" - integrity sha512-iSg6FzeUW4F3KSQDcHCytggCG68Q4OKUzQa8yNMSPVAuM6w5I6LhaqEYRO8x02G8WPyE+8W+Q9m3SCFea59osg== +"@intersect.mbo/govtool-outcomes-pillar-ui@1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/@intersect.mbo/govtool-outcomes-pillar-ui/-/govtool-outcomes-pillar-ui-1.4.1.tgz" + integrity sha512-cev6uUOiWH2KY4ozv17oxGkfonQ2oLDTlpcqU7HFntekUPwjEx0rOqaZPakGShxR6rb+GrBJ4Y7Vnf1bBk2Otg== dependencies: "@fontsource/poppins" "^5.0.14" "@intersect.mbo/intersectmbo.org-icons-set" "^1.0.8" From 8c3f1a651121b4b164a36b3871aceac9fd761d59 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 6 May 2025 09:52:20 +0545 Subject: [PATCH 55/60] fix: update image paths in Developer's Guide for correct relative references --- .../playwright/DEVELOPERS_GUIDE.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md index 9d4f0039e..5869e5171 100644 --- a/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md +++ b/tests/govtool-frontend/playwright/DEVELOPERS_GUIDE.md @@ -117,7 +117,7 @@ This directory contains all automated test cases, organized by feature area: - Use the terminal to run specific test suites using the commands provided in the **README.md**. - Ensure all test files are recognized in the **Test Explorer**. -![Test Runner Screenshot](/docs/image.png) +![Test Runner Screenshot](./docs/image.png) - Use the **Play** ▢️ icon to run individual tests directly from the UI. @@ -127,12 +127,12 @@ This directory contains all automated test cases, organized by feature area: - Add **Playwright Test for VSCode** extension - ![Playwright Test Screenshot](/docs/image-1.png) + ![Playwright Test Screenshot](./docs/image-1.png) 1. **Remove** the `CI` environment variable. 2. **Navigate** to the specific directory where your test is located to run it directly. - ![Directory Navigation Screenshot](/docs/image-2.png) + ![Directory Navigation Screenshot](./docs/image-2.png) > **Note:** > @@ -149,7 +149,7 @@ This section outlines the core behavioral areas of the Govtool application as ca This set of tests covers all key UI and interaction flows related to delegation functionality. -![Delegation Pillars](/docs/delegation-pillars.png) +![Delegation Pillars](./docs/delegation-pillars.png) --- @@ -157,7 +157,7 @@ This set of tests covers all key UI and interaction flows related to delegation Covers user voting mechanisms, including interface states and validation of voting logic. -![Voting Pillars](/docs/voting-pillars.png) +![Voting Pillars](./docs/voting-pillars.png) --- @@ -169,13 +169,13 @@ Proposal functionality is split into two sub-categories, each with distinct test Tracks creation, display, and participation in proposal discussions. -![Proposal Discussion](/docs/proposal-discussion.png) +![Proposal Discussion](./docs/proposal-discussion.png) #### ii. Budget Proposal Tracks creation, display, and participation in budget-related proposals. -![Budget Proposal](/docs/budget-proposal.png) +![Budget Proposal](./docs/budget-proposal.png) --- @@ -183,7 +183,7 @@ Tracks creation, display, and participation in budget-related proposals. Tests centered around outcomes from various actions. -![Outcomes Pillars](/docs/outcomes-pillars.png) +![Outcomes Pillars](./docs/outcomes-pillars.png) --- @@ -191,7 +191,7 @@ Tests centered around outcomes from various actions. Covers all test cases that require the user to be authenticated, and are not included in the delegation, voting, proposal, or outcomes pillars -![Logged-In State](/docs/loggedin.png) +![Logged-In State](./docs/loggedin.png) --- @@ -199,4 +199,4 @@ Covers all test cases that require the user to be authenticated, and are not inc For a comprehensive view of the project's Playwright architecture, refer to the Excalidraw diagram: -[Govtool Project Architecture](/docs/govtool-playwright-project.excalidraw) +[Govtool Project Architecture](./docs/govtool-playwright-project.excalidraw) From fe2d1110660c7af63edd66ac045acad081728c6f Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 6 May 2025 09:53:20 +0545 Subject: [PATCH 56/60] chore: make pillar singular on readme --- tests/govtool-frontend/playwright/README.md | 14 +++++++------- tests/govtool-frontend/playwright/package.json | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 0ad7c6351..d7a7cc123 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -122,13 +122,13 @@ Each test suite can be run in **UI** or **Headless** mode. #### πŸ–₯️ UI Mode ```bash -npm run test:delegation-pillars +npm run test:delegation-pillar ``` #### πŸ§ͺ Headless Mode (No UI) ```bash -npm run test:headless:delegation-pillars +npm run test:headless:delegation-pillar ``` --- @@ -140,13 +140,13 @@ npm run test:headless:delegation-pillars #### πŸ–₯️ UI Mode ```bash -npm run test:voting-pillars +npm run test:voting-pillar ``` #### πŸ§ͺ Headless Mode (No UI) ```bash -npm run test:headless:voting-pillars +npm run test:headless:voting-pillar ``` --- @@ -176,13 +176,13 @@ _Includes both Proposal Discussion and Budget Discussion_ #### πŸ–₯️ UI Mode ```bash -npm run test:proposal-pillars +npm run test:proposal-pillar ``` #### πŸ§ͺ Headless Mode (No UI) ```bash -npm run test:headless:proposal-pillars +npm run test:headless:proposal-pillar ``` --- @@ -285,4 +285,4 @@ npm run allure:serve For contribution guidelines and development tips, refer to: -πŸ“„ **[DEVELOPERS_GUIDE.md](/DEVELOPERS_GUIDE.md)** +πŸ“„ **[DEVELOPERS_GUIDE.md](./DEVELOPERS_GUIDE.md)** diff --git a/tests/govtool-frontend/playwright/package.json b/tests/govtool-frontend/playwright/package.json index 80d9a6f40..ae13b722d 100644 --- a/tests/govtool-frontend/playwright/package.json +++ b/tests/govtool-frontend/playwright/package.json @@ -24,20 +24,20 @@ "allure:open": "npx allure open ./allure-report", "allure:serve": "npx allure serve", "test": "npx playwright test --ui", - "test:delegation-pillars": "npx playwright test delegation dRepRegistration editDRep --ui", - "test:voting-pillars": "npx playwright test proposalVisibility proposalFunctionality --ui", + "test:delegation-pillar": "npx playwright test delegation dRepRegistration editDRep --ui", + "test:voting-pillar": "npx playwright test proposalVisibility proposalFunctionality --ui", "test:outcomes": "npx playwright test outcomes --ui", - "test:proposal-pillars": "npx playwright test proposalDiscussion proposalSubmission proposalBudget --ui", + "test:proposal-pillar": "npx playwright test proposalDiscussion proposalSubmission proposalBudget --ui", "test:proposal-discussion": "npx playwright test proposalDiscussion proposalSubmission --ui", "test:proposal-budget": "npx playwright test proposalBudget --ui", "test:wallet-connect": "npx playwright test walletConnect --ui", "test:usersnap": "npx playwright test userSnap.spec.ts --ui", "test:misc": "npx playwright test miscellaneous --ui", "test:headless": "npx playwright test", - "test:headless:delegation-pillars": "npx playwright test delegation dRepRegistration editDRep", - "test:headless:voting-pillars": "npx playwright test proposalVisibility proposalFunctionality", + "test:headless:delegation-pillar": "npx playwright test delegation dRepRegistration editDRep", + "test:headless:voting-pillar": "npx playwright test proposalVisibility proposalFunctionality", "test:headless:outcomes": "npx playwright test outcomes", - "test:headless:proposal-pillars": "npx playwright test proposalDiscussion proposalSubmission proposalBudget", + "test:headless:proposal-pillar": "npx playwright test proposalDiscussion proposalSubmission proposalBudget", "test:headless:proposal-discussion": "npx playwright test proposalDiscussion proposalSubmission", "test:headless:proposal-budget": "npx playwright test proposalBudget", "test:headless:wallet-connect": "npx playwright test walletConnect", From b980db76668c4298a10bc4ea83ebbd205eb61246 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 6 May 2025 11:26:27 +0545 Subject: [PATCH 57/60] feat: add wallet generation script for faucet --- .../playwright/generate_faucet_wallet.ts | 30 +++++++++++++++++++ .../govtool-frontend/playwright/package.json | 3 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 tests/govtool-frontend/playwright/generate_faucet_wallet.ts diff --git a/tests/govtool-frontend/playwright/generate_faucet_wallet.ts b/tests/govtool-frontend/playwright/generate_faucet_wallet.ts new file mode 100644 index 000000000..0fd3fbe60 --- /dev/null +++ b/tests/govtool-frontend/playwright/generate_faucet_wallet.ts @@ -0,0 +1,30 @@ +import { ShelleyWallet } from "./lib/helpers/crypto"; + +(async () => { + try { + console.log("\nGenerating your wallet... πŸ”"); + const wallet = await ShelleyWallet.generate(); + const walletJson = wallet.json(); + + // Display wallet details + console.log("\nπŸŽ‰ Wallet generated successfully!"); + console.log("-----------------------------------"); + console.log("πŸ’Ό Wallet:", walletJson); + console.log(`πŸ”‘ Payment Private Key: ${walletJson.payment.private}`); + console.log(`πŸ”— Stake Public Key Hash: ${walletJson.stake.pkh}`); + console.log(`🏠 Wallet Address: ${walletJson.address}`); + console.log("-----------------------------------"); + + // Instructions for environment variables + console.log( + "\nπŸ“‹ Please copy the following to your environment variables:" + ); + console.log(`1. Set FAUCET_PAYMENT_PRIVATE=${walletJson.payment.private}`); + console.log(`2. Set FAUCET_STAKE_PKH=${walletJson.stake.pkh}`); + console.log(`3. Set FAUCET_ADDRESS=${walletJson.address}`); + + console.log("\n🎈 All done! Have fun with your new wallet!"); + } catch (error) { + console.error("\n❌ An error occurred:", error.message); + } +})(); diff --git a/tests/govtool-frontend/playwright/package.json b/tests/govtool-frontend/playwright/package.json index ae13b722d..62bdac42d 100644 --- a/tests/govtool-frontend/playwright/package.json +++ b/tests/govtool-frontend/playwright/package.json @@ -44,7 +44,8 @@ "test:headless:usersnap": "npx playwright test userSnap.spec.ts", "test:headless:misc": "npx playwright test miscellaneous", "format": "prettier . --write", - "generate-wallets": "ts-node ./generate_wallets.ts 23" + "generate-wallets": "ts-node ./generate_wallets.ts 23", + "generate-faucet-wallet": "ts-node ./generate_faucet_wallet.ts" }, "dependencies": { "@cardanoapi/cardano-test-wallet": "^3.3.1", From 4896bfb1a38a9888045a828b3a7712f86a529731 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 6 May 2025 11:26:43 +0545 Subject: [PATCH 58/60] feat: add faucet wallet generation instructions to README --- tests/govtool-frontend/playwright/README.md | 65 ++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index d7a7cc123..36d99abee 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -77,13 +77,76 @@ npx playwright install 3. Navigate to **API Keys**. 4. Click to **Generate API Key**. +--- + +## πŸ”§ Faucet wallet Configuration + +This section guides you through generating a Cardano faucet wallet and configuring it for use. Follow the steps below to create and set the config on env + +### Step 1: Generate a Faucet Wallet + +Run the following command to generate a new faucet wallet: + +```bash +npm run generate-faucet-wallet +``` + +The script will: +- Display the wallet details (payment private key, stake public key hash, and wallet address) in the terminal. + +**Example Output:** +``` +πŸŽ‰ Wallet generated successfully! +----------------------------------- +πŸ”‘ Payment Private Key: +πŸ”— Stake Public Key Hash: +🏠 Wallet Address: +----------------------------------- + +πŸ“‹ Please copy the following to your environment variables: +1. Set FAUCET_PAYMENT_PRIVATE= +2. Set FAUCET_STAKE_PKH= +3. Set FAUCET_ADDRESS= + +🎈 All done! Have fun with your new wallet! +``` + +### Step 2: Configure Environment Variables + +Securely store the generated wallet details in your environment variables. Add the following to your `.env` file or environment configuration: + +```env +FAUCET_PAYMENT_PRIVATE= +FAUCET_STAKE_PKH= +FAUCET_ADDRESS= +``` + +⚠️ **Security Note**: Store your wallet details in a secure location for future use. The payment private key is sensitive and must be protected to prevent unauthorized access to your funds. + +### Step 3: Fund the Wallet + +Ensure the wallet address has sufficient funds for your test runs. The required balance depends on the specific tests you plan to execute (refer to the test-specific test run details below). + +To check the wallet balance, visit: + +``` +https://${network}.cardanoscan.io/address/ +``` + +Replace `${network}` with the appropriate Cardano network (e.g.`preprod`, or `preview`) and `` with the generated address. + +**Example**: +- For a preview wallet: `https://preview.cardanoscan.io/address/` +- Monitor the balance to ensure it meets the requirements for individual or all test runs. + + --- ## πŸ§ͺ Running Tests ### πŸ”‘ Generate Test Wallets -Before each test run, generate fresh test wallets to avoid conflicts: +Before each test run, generate test wallets which is required for wallet dependent test: ```bash npm run generate-wallets From 72417435dd3f40d2974c33ca5f1cc88641d6a511 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 6 May 2025 11:33:53 +0545 Subject: [PATCH 59/60] fix: update README for generation of test wallets and correct singular terms --- tests/govtool-frontend/playwright/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 36d99abee..efebb147d 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -92,9 +92,11 @@ npm run generate-faucet-wallet ``` The script will: + - Display the wallet details (payment private key, stake public key hash, and wallet address) in the terminal. **Example Output:** + ``` πŸŽ‰ Wallet generated successfully! ----------------------------------- @@ -136,17 +138,17 @@ https://${network}.cardanoscan.io/address/ Replace `${network}` with the appropriate Cardano network (e.g.`preprod`, or `preview`) and `` with the generated address. **Example**: + - For a preview wallet: `https://preview.cardanoscan.io/address/` - Monitor the balance to ensure it meets the requirements for individual or all test runs. - --- ## πŸ§ͺ Running Tests ### πŸ”‘ Generate Test Wallets -Before each test run, generate test wallets which is required for wallet dependent test: +Before each test run, generate test wallets required for wallet-dependent tests: ```bash npm run generate-wallets @@ -178,7 +180,7 @@ Each test suite can be run in **UI** or **Headless** mode. --- -#### 1. **Delegation Pillars** +#### 1. **Delegation Pillar** - **Pre-requisite**: Ensure the faucet address holds at least **12,000 ADA**. @@ -196,7 +198,7 @@ npm run test:headless:delegation-pillar --- -#### 2. **Voting Pillars** +#### 2. **Voting Pillar** - **Pre-requisite**: Ensure the faucet address holds at least **12,000 ADA**. @@ -230,7 +232,7 @@ npm run test:headless:outcomes --- -#### 4. **Proposal Pillars** +#### 4. **Proposal Pillar** _Includes both Proposal Discussion and Budget Discussion_ From 04918ab6cfe70976512b562b57520696b33872f1 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 6 May 2025 15:49:29 +0545 Subject: [PATCH 60/60] chore: update generate faucet wallet success message --- tests/govtool-frontend/playwright/README.md | 2 +- tests/govtool-frontend/playwright/generate_faucet_wallet.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index efebb147d..567219012 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -110,7 +110,7 @@ The script will: 2. Set FAUCET_STAKE_PKH= 3. Set FAUCET_ADDRESS= -🎈 All done! Have fun with your new wallet! +🎈 All set! Please ensure this wallet is funded with a sufficient balance ``` ### Step 2: Configure Environment Variables diff --git a/tests/govtool-frontend/playwright/generate_faucet_wallet.ts b/tests/govtool-frontend/playwright/generate_faucet_wallet.ts index 0fd3fbe60..f29d3bab5 100644 --- a/tests/govtool-frontend/playwright/generate_faucet_wallet.ts +++ b/tests/govtool-frontend/playwright/generate_faucet_wallet.ts @@ -23,7 +23,9 @@ import { ShelleyWallet } from "./lib/helpers/crypto"; console.log(`2. Set FAUCET_STAKE_PKH=${walletJson.stake.pkh}`); console.log(`3. Set FAUCET_ADDRESS=${walletJson.address}`); - console.log("\n🎈 All done! Have fun with your new wallet!"); + console.log( + "\n🎈 All set! Please ensure this wallet is funded with a sufficient balance" + ); } catch (error) { console.error("\n❌ An error occurred:", error.message); }