From 5039df6bee00399bdb723ab621dfce9b19e509ab Mon Sep 17 00:00:00 2001 From: grigoreo Date: Fri, 10 Jul 2026 00:31:22 +0000 Subject: [PATCH 01/15] docs: add Playwright e2e design spec Replace Cypress v4 flows with Playwright, required CI gate, drop v3-compat. --- .../specs/2026-07-10-playwright-e2e-design.md | 282 ++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-10-playwright-e2e-design.md diff --git a/docs/superpowers/specs/2026-07-10-playwright-e2e-design.md b/docs/superpowers/specs/2026-07-10-playwright-e2e-design.md new file mode 100644 index 00000000..6a87961b --- /dev/null +++ b/docs/superpowers/specs/2026-07-10-playwright-e2e-design.md @@ -0,0 +1,282 @@ +# Playwright E2E Design + +**Date:** 2026-07-10 +**Status:** Approved design, ready for implementation planning +**Related:** Cypress suite under `cypress/` (to be removed); CI in `.github/workflows/ci.yml` + +## Summary + +Replace the legacy Cypress e2e suite with **Playwright**, covering **Padloc v4 PWA + server only**. E2E becomes a **required** CI gate on every PR. **v3 client compatibility is out of scope** and will be deleted with Cypress. Admin, extension, and desktop targets remain out of scope. + +All repository artifacts must be in English per `AGENTS.md`. + +## Goals + +- Catch production-class UI failures (including “app never mounts” after Vite module load). +- Preserve the valuable v4 user journeys from Cypress: signup, login, lock/unlock, create item, search, and server HTTP smoke. +- Run e2e as a **required** job in `.github/workflows/ci.yml` alongside lint/build/unit. +- Use a maintainable root-level Playwright layout and shared helpers for Shadow DOM + maildev. +- Remove Cypress, v3 fixtures, and the non-required `e2e.yml` workflow in the **same** delivery. + +## Non-goals + +- v3 client compatibility tests or fixtures. +- Admin e2e. +- Extension / Electron / Cordova / Tauri e2e. +- Multi-browser matrix (Firefox/WebKit) in the first delivery — **Chromium only**. +- Large-scale `data-testid` refactor of the app (allowed opportunistically later). +- Visual regression / accessibility audits. +- Hardening work unrelated to e2e. + +## Decisions (from design review) + +| Decision | Choice | +|----------|--------| +| Scope of first delivery | Full Cypress **v4** replacement in one PR (not smoke-only) | +| CI placement | Required `e2e` job in `ci.yml` | +| Clients | PWA UI + server API only | +| Email codes | Keep **maildev** (SMTP + REST) | +| Tooling layout | Root Playwright project (not a separate workspace package) | +| v3-compat | Delete; not migrated | +| Browsers in CI | Chromium only | + +## Architecture + +``` +pnpm run test:e2e + │ + ├─ maildev (:1025 SMTP, :1080 REST) + ├─ server + PWA (memory DB, SW disabled, SMTP → maildev) + │ PWA :8080, API :3000 + └─ playwright test (Chromium, baseURL http://localhost:8080) +``` + +### Stack process model + +Mirror the current Cypress orchestration, **without** the v3 static client: + +1. Start maildev. +2. Start app stack with env: + - `PL_DATA_BACKEND=memory` + - `PL_DISABLE_SW=true` + - `PL_EMAIL_BACKEND=smtp` + - `PL_EMAIL_SMTP_HOST=localhost` + - `PL_EMAIL_SMTP_PORT=1025` + - `PL_EMAIL_SMTP_IGNORE_TLS=true` +3. Wait until PWA port `:8080` is ready (and server `:3000` for API specs). +4. Run Playwright. +5. Tear down on completion (`concurrently --kill-others` or equivalent). + +Production-style start (`pnpm start` = PWA build + server + static PWA serve) is the default for CI to match deploy artifacts. Dev mode (`test:e2e:dev`) may use `pnpm dev` / Vite for interactive debugging. + +### Repository layout + +``` +playwright.config.ts +e2e/ + smoke.spec.ts + auth.spec.ts + items.spec.ts + server.spec.ts + helpers/ + reset.ts # cookies, localStorage, IndexedDB + mail.ts # clearEmails, getCodeFromEmail (maildev REST) + shadow.ts # pierce Lit shadow roots / nested custom elements + auth.ts # signup, login, lock, unlock flows +``` + +Optional later: `e2e/fixtures/` for static test assets (not v3 client bundles). + +### Tooling + +| Piece | Choice | +|-------|--------| +| Runner | `@playwright/test` (pin current stable at implementation time) | +| Browser | Chromium (install via `playwright install --with-deps chromium` in CI) | +| Mail | Existing `maildev` dependency | +| Orchestration | `concurrently` + `wait-on` (already in root) | +| Config | `playwright.config.ts` at repo root | +| baseURL | `http://localhost:8080` | +| Server URL (API tests) | `http://localhost:3000` | + +## Test plan + +### smoke.spec.ts + +- Visit `/`. +- Assert `pl-app` is attached in the document (mounted custom element). +- Assert login shell is usable (e.g. `pl-login-signup` and/or `#emailInput` visible/interactable). + +**Purpose:** Fail fast on blank page / eternal spinner / broken module entry / CSP blocking scripts. This would have caught the Vite `window.onload` mount bug. + +### auth.spec.ts + +Port Cypress `01 - signup-login` behavior: + +1. **Signup** — random email → submit → read 6-digit code from maildev → name + TOS → choose own master password → confirm weak password if prompted → success → land on `/items`. +2. **Login** — clear client state → same email → code → password → accept trusted device if prompted → `/items`. +3. **Lock / unlock** — open menu → lock → `/unlock` → unlock with password → `/items`. + +Shared password/name values come from env (see Configuration). + +### items.spec.ts + +Port Cypress `02 - items` behavior (v4 UI only): + +1. Signup (or reuse auth helper). +2. Create item: open create flow → fill name / username / password / URL → save → URL is an item route, not `/new`. +3. Search: filter by a known substring → one hit with expected name; filter by nonexistent term → empty state message. + +### server.spec.ts + +Port Cypress `04 - server` HTTP checks against `http://localhost:3000` (no browser UI required; Playwright `request` context is fine): + +| Request | Expectation | +|---------|-------------| +| GET `/` | 405 | +| PUT `/` | 405 | +| OPTIONS `/` | success (CORS preflight path) | +| POST `/` without JSON body | 400 | +| POST JSON without valid RPC shape | 200 + `error.code === "invalid_request"` | +| POST `getAuthInfo` without session | 200 + `error.code === "invalid_session"` | + +Exact body shapes should match current server responses (version field may differ from Cypress hard-coded `4.0.0` — assert stable fields: `kind`, `error.code`, not necessarily frozen version string unless still accurate). + +### Explicitly not ported + +- All `v3_*` flows and `03 - v3-compatibility.cy.ts`. +- Admin UI. +- Any test that depends on `cypress/fixtures/v3-client`. + +## Helpers & selectors + +### Helpers + +| Helper | Responsibility | +|--------|----------------| +| `reset` | Clear cookies, localStorage, IndexedDB between auth scenarios | +| `mail` | `DELETE http://localhost:1080/email/all`; poll `GET http://localhost:1080/email` for latest message; extract `(\d{6})` | +| `shadow` | Navigate into nested custom elements / shadow roots (Lit) | +| `auth` | High-level signup/login/lock/unlock using stable selectors where possible | + +### Selector strategy + +**Prefer (stable):** + +- Custom element tags: `pl-app`, `pl-login-signup`, `pl-items`, `pl-items-list`, `pl-item-view`, … +- Existing element ids: `#emailInput`, `#submitEmailButton`, `#loginPasswordInput`, `#unlockButton`, … + +**Accept temporarily (fragile, matches Cypress):** + +- Ordinal selectors (`nth` button/drawer) only where the UI has no id/role. +- Do **not** block the first PR on a full `data-testid` campaign. Follow-up: add testids when a flow flakes or UI is touched. + +**Shadow DOM:** Playwright must pierce open shadow roots consistently (shared helper, not ad-hoc per test). + +### Flake control + +- Prefer waiting on URL / locator state over fixed `wait(ms)`. +- Poll maildev for codes with a bounded timeout. +- Keep animations in mind; wait for actionable elements. +- Single worker or low parallelism if shared server state conflicts (memory backend + one app instance — default to **serial** e2e or one worker unless proven safe). + +## Scripts & package.json + +| Script | Behavior | +|--------|----------| +| `test:e2e` | Start maildev + server/PWA (CI-like), wait for readiness, `playwright test` | +| `test:e2e:dev` | Start stack (dev-friendly), open Playwright UI or headed mode | +| ~~`start:v3`~~ | **Remove** | +| Cypress scripts | **Remove** | + +Root dependencies: + +- **Add:** `@playwright/test` +- **Remove:** `cypress` +- **Keep:** `maildev`, `concurrently`, `wait-on`, `http-server` (still used by PWA `start`) + +Update `pnpm-workspace.yaml` if it still lists a `cypress` workspace path only for Cypress. + +## CI integration + +### `.github/workflows/ci.yml` + +Add required job `e2e`: + +1. checkout, pnpm, Node from `.nvmrc` +2. `pnpm install --frozen-lockfile` +3. `pnpm exec playwright install --with-deps chromium` +4. `pnpm run test:e2e` + +Job runs on the same triggers as other CI jobs (`pull_request`, `push` to `main`). It is a **merge gate** (required status check — document for branch protection if not already covering new job name). + +### Remove + +- `.github/workflows/e2e.yml` (label/nightly/manual Cypress workflow) + +### Artifacts (recommended) + +On failure, upload Playwright HTML report / test traces as CI artifacts to speed debugging. Not required for green path. + +## Deletion checklist (same PR) + +- [ ] `cypress/` tree (specs, support, plugins, fixtures including `v3-client`) +- [ ] `cypress.config.ts`, `cypress.env.json` +- [ ] Root `cypress` dependency +- [ ] `start:v3` script and any v3-only docs references +- [ ] `.github/workflows/e2e.yml` +- [ ] README / CONTRIBUTING e2e instructions → Playwright +- [ ] Biome ignore entries that only existed for Cypress fixtures (if any become unused) + +## Configuration + +Playwright / test env (via `playwright.config.ts` and/or env vars; no committed secrets): + +| Key | Example | Use | +|-----|---------|-----| +| baseURL | `http://localhost:8080` | PWA | +| `E2E_SERVER_URL` or equivalent | `http://localhost:3000` | API smoke | +| password / name | same defaults as old `cypress.env.json` (`password`, `The Dude`) | auth flows | +| maildev REST | `http://localhost:1080` | codes | + +Do not commit production credentials. Local defaults for disposable test users only. + +## Documentation updates + +- `README.md` — replace Cypress run instructions with Playwright. +- `CONTRIBUTING.md` — `pnpm run test:e2e` / `test:e2e:dev`, note `playwright install` for local browsers. +- This design lives at `docs/superpowers/specs/2026-07-10-playwright-e2e-design.md`. +- Implementation plan (next): `docs/superpowers/plans/2026-07-10-playwright-e2e.md`. + +## Risks & mitigations + +| Risk | Mitigation | +|------|------------| +| Shadow DOM / Lit selector flake | Shared pierce helpers; prefer ids; serial runs | +| maildev race | Poll with timeout; clear inbox before signup/login | +| CI duration | Chromium only; one stack; avoid extra builds if artifacts reusable | +| Fragile ordinal selectors | Port first for parity; harden when flaking | +| Local missing browser binary | Document `pnpm exec playwright install`; CI is source of truth | +| Server response version field drift | Assert stable error codes/kinds, not frozen marketing version unless verified | +| Branch protection still points at old `e2e` check name | After merge, ensure required check is the new `ci.yml` job name | + +## Success criteria + +1. `pnpm run test:e2e` green locally (with Playwright browser installed) and in GitHub Actions. +2. Required CI includes green `e2e` on PRs to `main`. +3. Smoke fails if `pl-app` never mounts. +4. Auth + items flows pass against memory server + maildev. +5. Server HTTP smoke passes. +6. No Cypress or v3 e2e fixtures remain in the repo. +7. Docs describe Playwright only for e2e. + +## Implementation order (preview) + +1. Add Playwright config + deps; skeleton smoke spec. +2. Stack scripts without v3; wire CI job (can be temporary non-blocking only if needed mid-PR — final state is required). +3. Port mail + shadow + auth helpers; auth + items specs. +4. Port server API smoke. +5. Delete Cypress/v3/e2e.yml; update docs. +6. Verify full `test:e2e` and CI green; open PR. + +Detailed step-by-step plan will be written after this spec is approved in-repo. From 0bb95c0d8dc36015b7d23a31ac93e6afba5fc48b Mon Sep 17 00:00:00 2001 From: grigoreo Date: Fri, 10 Jul 2026 00:33:49 +0000 Subject: [PATCH 02/15] docs: add Playwright e2e implementation plan Task-by-task plan to replace Cypress with required Playwright CI e2e. --- .../plans/2026-07-10-playwright-e2e.md | 821 ++++++++++++++++++ 1 file changed, 821 insertions(+) create mode 100644 docs/superpowers/plans/2026-07-10-playwright-e2e.md diff --git a/docs/superpowers/plans/2026-07-10-playwright-e2e.md b/docs/superpowers/plans/2026-07-10-playwright-e2e.md new file mode 100644 index 00000000..3d6f7ef7 --- /dev/null +++ b/docs/superpowers/plans/2026-07-10-playwright-e2e.md @@ -0,0 +1,821 @@ +# Playwright E2E Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Replace Cypress with Playwright for Padloc v4 PWA + server e2e, make e2e a required CI gate, and delete Cypress/v3 fixtures. + +**Architecture:** Root Playwright project (`playwright.config.ts` + `e2e/`). CI/local `test:e2e` starts maildev + memory server + built PWA, then runs Chromium specs (smoke, auth, items, server). Shared helpers pierce Lit shadow DOM and read email codes from maildev. Cypress and v3-compat are removed in the same PR. + +**Tech Stack:** `@playwright/test` (current stable at implement time), Chromium, maildev, concurrently, wait-on, pnpm 10.15.0, Node 24, GitHub Actions. + +## Global Constraints + +- English-only repository artifacts (`AGENTS.md`). +- Spec: `docs/superpowers/specs/2026-07-10-playwright-e2e-design.md` (must already be on the branch or merged). +- **No v3-compat**, no Admin e2e, Chromium only. +- Soft-focus packages (electron/tauri/cordova) untouched. +- Do not include untracked `docs/superpowers/backlog.md`. +- Open PR; wait for GitHub `lint` / `build` / `unit` / `e2e`; inspect CodeRabbit/Cubic unless user says skip. +- Prefer waiting on URL/locator state over fixed `wait(ms)`. +- Serial e2e workers (`workers: 1`) unless proven safe otherwise. + +## File map + +| Path | Role | +|------|------| +| `playwright.config.ts` | Playwright config: baseURL, Chromium, serial, timeouts, testDir | +| `e2e/helpers/reset.ts` | Clear cookies / localStorage / IndexedDB | +| `e2e/helpers/mail.ts` | maildev REST clear + poll 6-digit code | +| `e2e/helpers/shadow.ts` | Chain locators through nested custom elements | +| `e2e/helpers/auth.ts` | signup / login / lock / unlock flows | +| `e2e/helpers/env.ts` | Test password/name/server URL defaults | +| `e2e/smoke.spec.ts` | Mount + login shell | +| `e2e/auth.spec.ts` | Signup / login / lock-unlock | +| `e2e/items.spec.ts` | Create item + search | +| `e2e/server.spec.ts` | HTTP API smoke on `:3000` | +| `package.json` | deps + `test:e2e` / `test:e2e:dev`; remove Cypress/`start:v3` | +| `pnpm-workspace.yaml` | Remove `cypress` entry | +| `.github/workflows/ci.yml` | Add required `e2e` job | +| `.github/workflows/e2e.yml` | Delete | +| `cypress/**`, `cypress.config.ts`, `cypress.env.json` | Delete | +| `biome.json` | Drop `!**/cypress/fixtures` ignore if unused | +| `README.md`, `CONTRIBUTING.md` | Playwright instructions | + +--- + +### Task 1: Branch, Playwright dependency, config, smoke skeleton + +**Files:** +- Create: `playwright.config.ts` +- Create: `e2e/smoke.spec.ts` +- Create: `e2e/helpers/env.ts` +- Modify: `package.json` +- Modify: `pnpm-lock.yaml` (via install) +- Modify: `pnpm-workspace.yaml` (remove cypress path only if still listed; full Cypress delete is Task 6 — for Task 1 keep Cypress until scripts switch, or remove path when deleting) + +**Interfaces:** +- Produces: `e2eEnv` from `e2e/helpers/env.ts`: + - `password: string` default `"password"` + - `name: string` default `"The Dude"` + - `serverUrl: string` default `"http://localhost:3000"` + - `maildevUrl: string` default `"http://localhost:1080"` + - `baseURL: string` default `"http://localhost:8080"` + +- [ ] **Step 1: Create branch from latest main** + +```bash +git checkout main +git pull origin main +git checkout -b test/playwright-e2e +``` + +If the design spec commit is only on `docs/playwright-e2e-design`, cherry-pick or merge it first: + +```bash +git cherry-pick b6ca52b0 +# or: git merge origin/docs/playwright-e2e-design +``` + +Ensure `docs/superpowers/specs/2026-07-10-playwright-e2e-design.md` exists on the branch. + +- [ ] **Step 2: Install Playwright and remove Cypress package** + +```bash +PLAYWRIGHT_VERSION=$(npm view @playwright/test version) +pnpm add -D -w "@playwright/test@${PLAYWRIGHT_VERSION}" +pnpm remove -w cypress +pnpm exec playwright install chromium +``` + +Record the exact `@playwright/test` version from `package.json` in the PR body. + +- [ ] **Step 3: Write `e2e/helpers/env.ts`** + +```ts +export const e2eEnv = { + password: process.env.E2E_PASSWORD || "password", + name: process.env.E2E_NAME || "The Dude", + serverUrl: process.env.E2E_SERVER_URL || "http://localhost:3000", + maildevUrl: process.env.E2E_MAILDEV_URL || "http://localhost:1080", + baseURL: process.env.E2E_BASE_URL || "http://localhost:8080", +}; +``` + +- [ ] **Step 4: Write `playwright.config.ts`** + +```ts +import { defineConfig, devices } from "@playwright/test"; +import { e2eEnv } from "./e2e/helpers/env"; + +export default defineConfig({ + testDir: "./e2e", + fullyParallel: false, + workers: 1, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 1 : 0, + reporter: process.env.CI ? [["list"], ["html", { open: "never" }]] : "list", + timeout: 120_000, + expect: { timeout: 15_000 }, + use: { + baseURL: e2eEnv.baseURL, + trace: "on-first-retry", + screenshot: "only-on-failure", + video: "off", + }, + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], +}); +``` + +- [ ] **Step 5: Write failing/minimal `e2e/smoke.spec.ts`** + +```ts +import { expect, test } from "@playwright/test"; + +test.describe("smoke", () => { + test("mounts pl-app and shows login shell", async ({ page }) => { + await page.goto("/"); + await expect(page.locator("pl-app")).toBeAttached({ timeout: 30_000 }); + const emailInput = page.locator("pl-app").locator("pl-login-signup").locator("#emailInput"); + await expect(emailInput).toBeVisible({ timeout: 30_000 }); + }); +}); +``` + +Playwright pierces open shadow roots when chaining locators (`pl-app` → `pl-login-signup` → `#emailInput`). + +- [ ] **Step 6: Point package scripts at Playwright (keep stack start; drop v3)** + +In root `package.json`: + +1. Remove script `start:v3`. +2. Replace e2e scripts: + +```json +"test:e2e": "concurrently --prefix=name --prefix-length=30 --kill-others --success=first -n app,maildev,playwright \"PL_DATA_BACKEND=memory PL_DISABLE_SW=true PL_EMAIL_BACKEND=smtp PL_EMAIL_SMTP_HOST=localhost PL_EMAIL_SMTP_PORT=1025 PL_EMAIL_SMTP_IGNORE_TLS=true pnpm start\" \"npx maildev\" \"./node_modules/.bin/wait-on tcp:localhost:8080 tcp:localhost:3000 && playwright test\"", +"test:e2e:dev": "concurrently --prefix=name --prefix-length=30 --kill-others --success=first -n app,maildev,playwright \"PL_DATA_BACKEND=memory PL_DISABLE_SW=true PL_EMAIL_BACKEND=smtp PL_EMAIL_SMTP_HOST=localhost PL_EMAIL_SMTP_PORT=1025 PL_EMAIL_SMTP_IGNORE_TLS=true pnpm run dev\" \"npx maildev\" \"./node_modules/.bin/wait-on tcp:localhost:8080 tcp:localhost:3000 && playwright test --ui\"" +``` + +3. Ensure `cypress` is gone from `devDependencies`. +4. In `pnpm-workspace.yaml`, remove the `- cypress` line if present. + +- [ ] **Step 7: Sanity-check smoke (optional if browser available)** + +```bash +pnpm run test:e2e -- e2e/smoke.spec.ts +``` + +Expected: smoke passes when stack + Chromium work. If local browser install fails, continue; CI will validate. Do not skip writing the spec. + +- [ ] **Step 8: Commit** + +```bash +git add package.json pnpm-lock.yaml pnpm-workspace.yaml playwright.config.ts e2e/helpers/env.ts e2e/smoke.spec.ts +git commit -m "test: scaffold Playwright e2e with smoke mount check" +``` + +--- + +### Task 2: Helpers — reset, mail, shadow + +**Files:** +- Create: `e2e/helpers/reset.ts` +- Create: `e2e/helpers/mail.ts` +- Create: `e2e/helpers/shadow.ts` + +**Interfaces:** +- Consumes: `e2eEnv.maildevUrl` +- Produces: + - `resetClientState(page: Page): Promise` + - `clearEmails(): Promise` + - `getCodeFromEmail(options?: { timeout?: number }): Promise` + - `deep(page: Page, ...selectors: string[]): Locator` + - `typeIn(locator: Locator, text: string): Promise` — types into inner `input, textarea` + +- [ ] **Step 1: Write `e2e/helpers/reset.ts`** + +```ts +import type { Page } from "@playwright/test"; + +export async function resetClientState(page: Page): Promise { + await page.context().clearCookies(); + await page.goto("/"); + await page.evaluate(async () => { + localStorage.clear(); + sessionStorage.clear(); + const dbs = await indexedDB.databases(); + await Promise.all( + dbs.map( + (db) => + new Promise((resolve, reject) => { + if (!db.name) { + resolve(); + return; + } + const req = indexedDB.deleteDatabase(db.name); + req.onsuccess = () => resolve(); + req.onerror = () => reject(req.error); + req.onblocked = () => resolve(); + }) + ) + ); + }); +} +``` + +- [ ] **Step 2: Write `e2e/helpers/mail.ts`** + +```ts +import { e2eEnv } from "./env"; + +type MaildevEmail = { + time: string | number; + text?: string; + html?: string; +}; + +export async function clearEmails(): Promise { + const res = await fetch(`${e2eEnv.maildevUrl}/email/all`, { method: "DELETE" }); + if (!res.ok && res.status !== 200) { + throw new Error(`maildev clear failed: ${res.status}`); + } +} + +export async function getCodeFromEmail(options: { timeout?: number } = {}): Promise { + const timeout = options.timeout ?? 30_000; + const deadline = Date.now() + timeout; + + while (Date.now() < deadline) { + const res = await fetch(`${e2eEnv.maildevUrl}/email`); + if (res.ok) { + const emails = (await res.json()) as MaildevEmail[]; + const latest = [...emails].sort((a, b) => (a.time > b.time ? -1 : 1))[0]; + const body = `${latest?.text || ""}\n${latest?.html || ""}`; + const match = body.match(/(\d{6})/); + if (match?.[1]) { + return match[1]; + } + } + await new Promise((r) => setTimeout(r, 500)); + } + + throw new Error("Timed out waiting for email verification code from maildev"); +} +``` + +- [ ] **Step 3: Write `e2e/helpers/shadow.ts`** + +```ts +import type { Locator, Page } from "@playwright/test"; + +/** Chain locators; Playwright pierces open shadow roots between custom elements. */ +export function deep(page: Page, ...selectors: string[]): Locator { + if (selectors.length === 0) { + throw new Error("deep() requires at least one selector"); + } + let loc = page.locator(selectors[0]); + for (let i = 1; i < selectors.length; i++) { + loc = loc.locator(selectors[i]); + } + return loc; +} + +export async function typeIn(host: Locator, text: string): Promise { + const field = host.locator("input, textarea").first(); + await field.fill(text); +} +``` + +- [ ] **Step 4: Commit** + +```bash +git add e2e/helpers/reset.ts e2e/helpers/mail.ts e2e/helpers/shadow.ts +git commit -m "test: add Playwright e2e helpers for reset, mail, shadow" +``` + +--- + +### Task 3: Auth helpers + auth.spec.ts + +**Files:** +- Create: `e2e/helpers/auth.ts` +- Create: `e2e/auth.spec.ts` + +**Interfaces:** +- Consumes: `resetClientState`, `clearEmails`, `getCodeFromEmail`, `deep`, `typeIn`, `e2eEnv` +- Produces: + - `signup(page: Page, email: string): Promise` + - `login(page: Page, email: string): Promise` + - `lock(page: Page): Promise` + - `unlock(page: Page, email: string): Promise` + +Port behavior from `cypress/support/commands.ts` (v4 only: `signup`, `login`, `lock`, `unlock`). + +- [ ] **Step 1: Write `e2e/helpers/auth.ts`** + +```ts +import type { Page } from "@playwright/test"; +import { expect } from "@playwright/test"; +import { e2eEnv } from "./env"; +import { clearEmails, getCodeFromEmail } from "./mail"; +import { resetClientState } from "./reset"; +import { deep, typeIn } from "./shadow"; + +export async function signup(page: Page, email: string): Promise { + await resetClientState(page); + await clearEmails(); + await page.goto("/"); + + const login = deep(page, "pl-app", "pl-start", "pl-login-signup"); + await typeIn(login.locator("#emailInput"), email); + await login.locator("#submitEmailButton").click({ force: true }); + + const prompt = deep(page, "pl-app", "pl-prompt-dialog"); + await expect(prompt).toBeVisible({ timeout: 15_000 }); + const code = await getCodeFromEmail(); + await typeIn(prompt.locator("pl-input").first(), code); + await prompt.locator("#confirmButton").click({ force: true }); + + await expect(page).toHaveURL(/authToken/, { timeout: 30_000 }); + + // Name + TOS (drawer indices match current Cypress flow) + await typeIn(login.locator("pl-drawer").nth(2).locator("pl-input").first(), e2eEnv.name); + await login.locator("pl-drawer").nth(2).locator("input#tosCheckbox").click({ force: true }); + await login.locator("pl-button").nth(2).click({ force: true }); + + // Choose a different password + await login.locator("pl-drawer").nth(5).locator("pl-button").nth(1).click({ force: true }); + + const alert = deep(page, "pl-app", "pl-alert-dialog"); + await expect(alert).toBeVisible({ timeout: 10_000 }); + await alert.locator("pl-button").nth(2).click({ force: true }); + + const masterPrompt = deep(page, "pl-app", "pl-prompt-dialog"); + await expect(masterPrompt).toBeVisible({ timeout: 10_000 }); + await typeIn(masterPrompt.locator("pl-input[label='Enter Master Password']"), e2eEnv.password); + await masterPrompt.locator("#confirmButton").click({ force: true }); + + // Confirm weak password + await expect(alert).toBeVisible({ timeout: 10_000 }); + await alert.locator("pl-button").nth(1).click({ force: true }); + + await login.locator("pl-drawer").nth(5).locator("pl-button").nth(3).click({ force: true }); + await typeIn(login.locator("pl-drawer").nth(6).locator("pl-password-input#repeatPasswordInput"), e2eEnv.password); + await login.locator("pl-drawer").nth(6).locator("pl-button#confirmPasswordButton").click({ force: true }); + + await expect(page).toHaveURL(/\/signup\/success/, { timeout: 30_000 }); + await login.locator("pl-drawer").nth(7).locator("pl-button").click({ force: true }); + await expect(page).toHaveURL(/\/items/, { timeout: 30_000 }); +} + +export async function login(page: Page, email: string): Promise { + await resetClientState(page); + await clearEmails(); + await page.goto("/"); + + const loginView = deep(page, "pl-app", "pl-start", "pl-login-signup"); + await typeIn(loginView.locator("#emailInput"), email); + await loginView.locator("#submitEmailButton").click({ force: true }); + + const prompt = deep(page, "pl-app", "pl-prompt-dialog"); + await expect(prompt).toBeVisible({ timeout: 15_000 }); + const code = await getCodeFromEmail(); + await typeIn(prompt.locator("pl-input").first(), code); + await prompt.locator("#confirmButton").click({ force: true }); + + await expect(page).toHaveURL(/authToken/, { timeout: 30_000 }); + + await typeIn(loginView.locator("pl-drawer").nth(3).locator("pl-password-input#loginPasswordInput"), e2eEnv.password); + await loginView.locator("pl-drawer").nth(3).locator("pl-button#loginButton").click({ force: true }); + + const alert = deep(page, "pl-app", "pl-alert-dialog"); + await expect(alert).toBeVisible({ timeout: 15_000 }); + await alert.locator("pl-button").nth(0).click({ force: true }); + + await expect(page).toHaveURL(/\/items/, { timeout: 30_000 }); +} + +export async function lock(page: Page): Promise { + await page.goto("/"); + const list = deep(page, "pl-app", "pl-items", "pl-items-list"); + await list.locator("pl-button.menu-button").first().click({ force: true }); + const menu = deep(page, "pl-app", "pl-menu"); + await menu.locator("pl-button.menu-footer-button").first().click({ force: true }); + await expect(page).toHaveURL(/\/unlock/, { timeout: 15_000 }); +} + +export async function unlock(page: Page, email: string): Promise { + await page.goto("/"); + const unlockView = deep(page, "pl-app", "pl-start", "pl-unlock"); + await expect(unlockView.locator("pl-input[label='Logged In As']").locator("input")).toHaveValue(email, { + timeout: 15_000, + }); + await typeIn(unlockView.locator("pl-password-input#passwordInput"), e2eEnv.password); + await unlockView.locator("pl-button#unlockButton").click({ force: true }); + await expect(page).toHaveURL(/\/items/, { timeout: 30_000 }); +} +``` + +If drawer/button indices fail against current UI, adjust to match live DOM (inspect with Playwright trace/UI). Prefer ids when available. Do not reintroduce v3 helpers. + +- [ ] **Step 2: Write `e2e/auth.spec.ts`** + +```ts +import { test } from "@playwright/test"; +import { lock, login, signup, unlock } from "./helpers/auth"; + +test.describe("Signup/Login", () => { + const email = `${Math.floor(Math.random() * 1e8)}@example.com`; + + test("can signup without errors", async ({ page }) => { + await signup(page, email); + }); + + test("can login without errors", async ({ page }) => { + await login(page, email); + }); + + test("can lock/unlock without errors", async ({ page }) => { + await login(page, email); + await lock(page); + await unlock(page, email); + }); +}); +``` + +Note: tests share `email` and run serially (`workers: 1`). Order matters (signup before login). + +- [ ] **Step 3: Run auth specs against local stack** + +```bash +pnpm run test:e2e -- e2e/auth.spec.ts +``` + +Expected: 3 passed. If a step fails on selector, fix `auth.ts` selectors using Playwright UI (`test:e2e:dev`) or trace; keep flow semantics identical to Cypress. + +- [ ] **Step 4: Commit** + +```bash +git add e2e/helpers/auth.ts e2e/auth.spec.ts +git commit -m "test: port signup/login/lock Playwright e2e flows" +``` + +--- + +### Task 4: items.spec.ts + +**Files:** +- Create: `e2e/items.spec.ts` + +**Interfaces:** +- Consumes: `signup`, `unlock`, `deep`, `typeIn` from helpers + +- [ ] **Step 1: Write `e2e/items.spec.ts`** + +Port `cypress/e2e/02 - items.cy.ts`: + +```ts +import { expect, test } from "@playwright/test"; +import { signup, unlock } from "./helpers/auth"; +import { deep, typeIn } from "./helpers/shadow"; + +const testItem = { + name: "Google", + username: "example@google.com", + password: "somethingsecret", + url: "https://google.com", +}; + +const itemSearch = { + existing: "secret", + nonexistent: "apple", +}; + +const email = `${Math.floor(Math.random() * 1e8)}@example.com`; + +test.describe("Items", () => { + test("can create an item without errors", async ({ page }) => { + await signup(page, email); + + const list = deep(page, "pl-app", "pl-items", "pl-items-list"); + await list.locator("pl-button").nth(2).click({ force: true }); + + const createDialog = deep(page, "pl-app", "pl-create-item-dialog"); + await createDialog.locator("footer pl-button.primary").click({ force: true }); + + await expect(page).toHaveURL(/\/items\//); + await expect(page).toHaveURL(/\/new/); + + const itemView = deep(page, "pl-app", "pl-items", "pl-item-view"); + await typeIn(itemView.locator("pl-input#nameInput"), testItem.name); + await typeIn(itemView.locator("pl-scroller pl-list pl-field").nth(0).locator("pl-input.value-input"), testItem.username); + await typeIn(itemView.locator("pl-scroller pl-list pl-field").nth(1).locator("pl-input.value-input"), testItem.password); + await typeIn(itemView.locator("pl-scroller pl-list pl-field").nth(2).locator("pl-input.value-input"), testItem.url); + await itemView.locator("pl-button.primary").click({ force: true }); + + await expect(page).toHaveURL(/\/items\//); + await expect(page).not.toHaveURL(/\/new/); + }); + + test("can find an item without errors", async ({ page }) => { + await unlock(page, email); + + const list = deep(page, "pl-app", "pl-items", "pl-items-list"); + await list.locator("pl-button").nth(3).click({ force: true }); + await typeIn(list.locator("pl-input#filterInput"), itemSearch.existing); + + const rows = list.locator("main pl-virtual-list pl-scroller div.content > div"); + await expect(rows).toHaveCount(1); + await expect(list.locator("pl-vault-item-list-item div.semibold").first()).toContainText(testItem.name); + + await list.locator("pl-input#filterInput pl-button.slim").click({ force: true }); + await list.locator("pl-button").nth(3).click({ force: true }); + await typeIn(list.locator("pl-input#filterInput"), itemSearch.nonexistent); + + await expect(list.locator("main > div.centering")).toContainText("did not match any items"); + }); +}); +``` + +- [ ] **Step 2: Run items specs** + +```bash +pnpm run test:e2e -- e2e/items.spec.ts +``` + +Expected: 2 passed. Fix selectors if UI differs slightly from Cypress-era DOM. + +- [ ] **Step 3: Commit** + +```bash +git add e2e/items.spec.ts +git commit -m "test: port items create/search Playwright e2e" +``` + +--- + +### Task 5: server.spec.ts + +**Files:** +- Create: `e2e/server.spec.ts` + +**Interfaces:** +- Consumes: `e2eEnv.serverUrl` +- Uses Playwright `request` fixture (no browser UI) + +- [ ] **Step 1: Write `e2e/server.spec.ts`** + +```ts +import { expect, test } from "@playwright/test"; +import { e2eEnv } from "./helpers/env"; + +test.describe("Server", () => { + const serverUrl = e2eEnv.serverUrl; + + test("responds correctly to valid and invalid requests", async ({ request }) => { + expect((await request.get(`${serverUrl}/`, { failOnStatusCode: false })).status()).toBe(405); + expect((await request.put(`${serverUrl}/`, { failOnStatusCode: false })).status()).toBe(405); + expect((await request.fetch(`${serverUrl}/`, { method: "OPTIONS" })).ok()).toBeTruthy(); + + expect((await request.post(`${serverUrl}/`, { failOnStatusCode: false })).status()).toBe(400); + + const invalid = await request.post(`${serverUrl}/`, { + headers: { "Content-Type": "application/json" }, + data: { email: "user@example.com" }, + }); + expect(invalid.status()).toBe(200); + const invalidBody = await invalid.json(); + expect(invalidBody.kind).toBe("response"); + expect(invalidBody.error?.code).toBe("invalid_request"); + expect(invalidBody.result).toBeNull(); + + const unauth = await request.post(`${serverUrl}/`, { + headers: { "Content-Type": "application/json" }, + data: { + method: "getAuthInfo", + params: [], + device: {}, + auth: {}, + kind: "request", + version: "4.0.0", + }, + }); + expect(unauth.status()).toBe(200); + const unauthBody = await unauth.json(); + expect(unauthBody.kind).toBe("response"); + expect(unauthBody.error?.code).toBe("invalid_session"); + expect(unauthBody.result).toBeNull(); + }); +}); +``` + +Do **not** assert a frozen `version` string unless verified against current server; prefer `kind` + `error.code`. + +- [ ] **Step 2: Run server + full suite** + +```bash +pnpm run test:e2e -- e2e/server.spec.ts +pnpm run test:e2e +``` + +Expected: all Playwright specs pass. + +- [ ] **Step 3: Commit** + +```bash +git add e2e/server.spec.ts +git commit -m "test: add Playwright server HTTP smoke" +``` + +--- + +### Task 6: CI required e2e job + delete Cypress/v3 + docs + +**Files:** +- Modify: `.github/workflows/ci.yml` +- Delete: `.github/workflows/e2e.yml` +- Delete: `cypress/` (entire tree) +- Delete: `cypress.config.ts` +- Delete: `cypress.env.json` +- Modify: `biome.json` (remove `!**/cypress/fixtures` if present) +- Modify: `README.md` (e2e section) +- Modify: `CONTRIBUTING.md` (e2e section) +- Modify: `package.json` / lockfile if any Cypress leftovers + +- [ ] **Step 1: Add `e2e` job to `.github/workflows/ci.yml`** + +Append after the `unit` job (same checkout/pnpm/node pattern): + +```yaml + e2e: + name: e2e + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Install Playwright Chromium + run: pnpm exec playwright install --with-deps chromium + - name: Run E2E tests + run: pnpm run test:e2e + - name: Upload Playwright report + if: failure() + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: playwright-report/ + retention-days: 7 +``` + +- [ ] **Step 2: Delete Cypress workflow and tree** + +```bash +rm -f .github/workflows/e2e.yml cypress.config.ts cypress.env.json +rm -rf cypress +``` + +- [ ] **Step 3: Clean `biome.json`** + +Remove the ignore entry `"!**/cypress/fixtures"` from `files.includes` if present. + +- [ ] **Step 4: Update README e2e section** + +Replace Cypress wording with: + +```markdown +### End-to-end tests + +```bash +pnpm exec playwright install chromium # once per machine +pnpm run test:e2e +``` + +Interactive UI mode: + +```bash +pnpm run test:e2e:dev +``` +``` + +Keep surrounding README structure; only fix the e2e subsection (and any remaining `npm run` e2e lines in that subsection to `pnpm`). + +- [ ] **Step 5: Update CONTRIBUTING.md** + +Ensure the test section mentions: + +```bash +pnpm exec playwright install chromium +pnpm run test:e2e +``` + +Remove Cypress-specific notes if any. + +- [ ] **Step 6: Grep for leftovers** + +```bash +grep -RIn --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=docs/superpowers \ + -e 'cypress' -e 'start:v3' -e 'v3-client' -e 'cypress.config' . || true +``` + +Expected: no runtime/package references left outside historical docs under `docs/superpowers/` (plans/specs may still mention Cypress as past tense — leave historical plans alone unless they claim Cypress is current required tooling in CONTRIBUTING/README). + +- [ ] **Step 7: Final local verification** + +```bash +pnpm run lint +pnpm run test:e2e +``` + +Expected: lint clean enough for CI gate; full e2e green. + +- [ ] **Step 8: Commit** + +```bash +git add -A +git status # confirm backlog.md is NOT staged +git commit -m "ci: require Playwright e2e and remove Cypress" +``` + +--- + +### Task 7: Open PR and verify CI + +**Files:** none (git/GitHub only) + +- [ ] **Step 1: Push and open PR** + +```bash +git push -u origin test/playwright-e2e +gh pr create --base main --title "test: replace Cypress with Playwright e2e" --body "$(cat <<'EOF' +## Summary +- Replace Cypress with Playwright for Padloc v4 PWA + server e2e +- Required `e2e` job in `ci.yml` (Chromium) +- Smoke, auth, items, server HTTP specs; maildev retained +- Remove Cypress, v3 fixtures, and label-based `e2e.yml` + +## Spec +- `docs/superpowers/specs/2026-07-10-playwright-e2e-design.md` + +## Test plan +- [x] `pnpm run test:e2e` locally (if browser available) +- [ ] CI: lint, build, unit, e2e green +- [ ] Confirm smoke would fail without `pl-app` mount +EOF +)" +``` + +- [ ] **Step 2: Wait for checks** + +```bash +gh pr checks --watch +``` + +Expected: `lint`, `build`, `unit`, `e2e`, `PR Title` pass. Inspect CodeRabbit/Cubic; fix real issues. + +- [ ] **Step 3: Post-merge note for branch protection** + +After merge, ensure GitHub branch protection required checks include the new CI job name `e2e` from workflow `CI` (not the deleted standalone E2E workflow). Document in PR comment if the owner must click UI settings. + +- [ ] **Step 4: Do not merge until user confirms** (unless user already authorized merge). + +--- + +## Self-review (plan vs spec) + +| Spec requirement | Task | +|------------------|------| +| Playwright root layout | Task 1 | +| smoke mount + login shell | Task 1 | +| maildev email codes | Task 2–3 | +| signup/login/lock/unlock | Task 3 | +| items create + search | Task 4 | +| server HTTP smoke | Task 5 | +| required `e2e` in `ci.yml` | Task 6 | +| delete Cypress + v3 + `e2e.yml` | Task 6 | +| docs README/CONTRIBUTING | Task 6 | +| Chromium only / no Admin / no v3 | All tasks | +| PR + CI verification | Task 7 | + +No TBD placeholders. Helper names consistent: `resetClientState`, `clearEmails`, `getCodeFromEmail`, `deep`, `typeIn`, `signup`, `login`, `lock`, `unlock`, `e2eEnv`. + +--- + +## Execution handoff + +Plan complete and saved to `docs/superpowers/plans/2026-07-10-playwright-e2e.md`. + +**Two execution options:** + +1. **Subagent-Driven (recommended)** — fresh subagent per task, review between tasks +2. **Inline Execution** — this session with executing-plans and checkpoints + +Which approach? From ed7c9cd10b1779c4c025116a60d5a52b21c2fa59 Mon Sep 17 00:00:00 2001 From: grigoreo Date: Fri, 10 Jul 2026 00:43:18 +0000 Subject: [PATCH 03/15] test: scaffold Playwright e2e with smoke mount check --- e2e/helpers/env.ts | 7 + e2e/smoke.spec.ts | 10 ++ package.json | 7 +- playwright.config.ts | 25 +++ pnpm-lock.yaml | 412 ++++++------------------------------------- pnpm-workspace.yaml | 1 - 6 files changed, 95 insertions(+), 367 deletions(-) create mode 100644 e2e/helpers/env.ts create mode 100644 e2e/smoke.spec.ts create mode 100644 playwright.config.ts diff --git a/e2e/helpers/env.ts b/e2e/helpers/env.ts new file mode 100644 index 00000000..da54f096 --- /dev/null +++ b/e2e/helpers/env.ts @@ -0,0 +1,7 @@ +export const e2eEnv = { + password: process.env.E2E_PASSWORD || "password", + name: process.env.E2E_NAME || "The Dude", + serverUrl: process.env.E2E_SERVER_URL || "http://localhost:3000", + maildevUrl: process.env.E2E_MAILDEV_URL || "http://localhost:1080", + baseURL: process.env.E2E_BASE_URL || "http://localhost:8080", +}; diff --git a/e2e/smoke.spec.ts b/e2e/smoke.spec.ts new file mode 100644 index 00000000..e9314b8b --- /dev/null +++ b/e2e/smoke.spec.ts @@ -0,0 +1,10 @@ +import { expect, test } from "@playwright/test"; + +test.describe("smoke", () => { + test("mounts pl-app and shows login shell", async ({ page }) => { + await page.goto("/"); + await expect(page.locator("pl-app")).toBeAttached({ timeout: 30_000 }); + const emailInput = page.locator("pl-app").locator("pl-login-signup").locator("#emailInput"); + await expect(emailInput).toBeVisible({ timeout: 30_000 }); + }); +}); diff --git a/package.json b/package.json index c531bc34..37967dad 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ }, "devDependencies": { "@biomejs/biome": "2.5.3", + "@playwright/test": "1.61.1", "concurrently": "7.6.0", - "cypress": "12.5.1", "http-server": "14.1.0", "maildev": "git+https://github.com/padloc/maildev.git#master", "ts-node": "10.0.0", @@ -70,12 +70,11 @@ "server:start-dry": "pnpm --filter @padloc/server run start-dry", "web-extension:build": "pnpm --filter @padloc/extension run build", "start": "pnpm run pwa:build && pnpm --filter @padloc/server --filter @padloc/pwa --parallel run start", - "start:v3": "http-server cypress/fixtures/v3-client -s -p 8081 --proxy http://0.0.0.0:8081?", "dev": "pnpm --filter @padloc/server --filter @padloc/pwa --filter @padloc/admin --parallel run dev", "repl": "pnpm --filter @padloc/server run repl", "test": "pnpm -r run test", - "test:e2e": "concurrently --prefix=name --prefix-length=30 --kill-others --success=first -n app,v3-app,maildev,cypress \"PL_DATA_BACKEND=memory PL_DISABLE_SW=true PL_EMAIL_BACKEND=smtp PL_EMAIL_SMTP_HOST=localhost PL_EMAIL_SMTP_PORT=1025 PL_EMAIL_SMTP_IGNORE_TLS=true pnpm start\" \"pnpm run start:v3\" \"npx maildev\" \"./node_modules/.bin/wait-on tcp:localhost:8080 && CYPRESS_CRASH_REPORTS=0 cypress run\"", - "test:e2e:dev": "concurrently --prefix=name --prefix-length=30 --kill-others --success=first -n app,v3-app,cypress \"PL_DATA_BACKEND=memory PL_DISABLE_SW=true PL_EMAIL_BACKEND=smtp PL_EMAIL_SMTP_HOST=localhost PL_EMAIL_SMTP_PORT=1025 PL_EMAIL_SMTP_IGNORE_TLS=true pnpm run dev\" \"pnpm run start:v3\" \"npx maildev\" \"./node_modules/.bin/wait-on tcp:localhost:8080 && CYPRESS_CRASH_REPORTS=0 cypress open\"", + "test:e2e": "concurrently --prefix=name --prefix-length=30 --kill-others --success=first -n app,maildev,playwright \"PL_DATA_BACKEND=memory PL_DISABLE_SW=true PL_EMAIL_BACKEND=smtp PL_EMAIL_SMTP_HOST=localhost PL_EMAIL_SMTP_PORT=1025 PL_EMAIL_SMTP_IGNORE_TLS=true pnpm start\" \"npx maildev\" \"./node_modules/.bin/wait-on tcp:localhost:8080 tcp:localhost:3000 && playwright test\"", + "test:e2e:dev": "concurrently --prefix=name --prefix-length=30 --kill-others --success=first -n app,maildev,playwright \"PL_DATA_BACKEND=memory PL_DISABLE_SW=true PL_EMAIL_BACKEND=smtp PL_EMAIL_SMTP_HOST=localhost PL_EMAIL_SMTP_PORT=1025 PL_EMAIL_SMTP_IGNORE_TLS=true pnpm run dev\" \"npx maildev\" \"./node_modules/.bin/wait-on tcp:localhost:8080 tcp:localhost:3000 && playwright test --ui\"", "locale:extract": "pnpm --filter @padloc/locale run extract", "add": "echo 'Use: pnpm add --filter @padloc/' && exit 1", "format": "biome format --write .", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..bb126577 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,25 @@ +import { defineConfig, devices } from "@playwright/test"; +import { e2eEnv } from "./e2e/helpers/env"; + +export default defineConfig({ + testDir: "./e2e", + fullyParallel: false, + workers: 1, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 1 : 0, + reporter: process.env.CI ? [["list"], ["html", { open: "never" }]] : "list", + timeout: 120_000, + expect: { timeout: 15_000 }, + use: { + baseURL: e2eEnv.baseURL, + trace: "on-first-retry", + screenshot: "only-on-failure", + video: "off", + }, + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 352dc533..ed7236fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,12 +44,12 @@ importers: '@biomejs/biome': specifier: 2.5.3 version: 2.5.3 + '@playwright/test': + specifier: 1.61.1 + version: 1.61.1 concurrently: specifier: 7.6.0 version: 7.6.0 - cypress: - specifier: 12.5.1 - version: 12.5.1 http-server: specifier: 14.1.0 version: 14.1.0 @@ -1386,21 +1386,10 @@ packages: cpu: [x64] os: [win32] - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@cypress/request@2.88.12': - resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==} - engines: {node: '>= 6'} - - '@cypress/xvfb@1.2.4': - resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - '@develar/schema-utils@2.6.5': resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} engines: {node: '>= 8.9.0'} @@ -1664,6 +1653,11 @@ packages: '@peculiar/utils@2.0.3': resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} + '@playwright/test@1.61.1': + resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==} + engines: {node: '>=18'} + hasBin: true + '@rollup/plugin-babel@5.3.1': resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -2238,12 +2232,6 @@ packages: '@types/serve-static@1.15.10': resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} - '@types/sinonjs__fake-timers@8.1.1': - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} - - '@types/sizzle@2.3.10': - resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==} - '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} @@ -2359,9 +2347,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@types/zxcvbn@4.4.5': resolution: {integrity: sha512-FZJgC5Bxuqg7Rhsm/bx6gAruHHhDQ55r+s0JhDh8CQ16fD7NsJJ+p8YMMQDhSQoIrSmjpqqYWA96oQVMNkjRyA==} @@ -2546,10 +2531,6 @@ packages: resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} engines: {node: '>=4'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} @@ -2600,9 +2581,6 @@ packages: aproba@1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - are-we-there-yet@1.1.7: resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} deprecated: This package is no longer supported. @@ -2780,9 +2758,6 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - blob-util@2.0.2: - resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} - bluebird-lst@1.0.9: resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} @@ -2917,10 +2892,6 @@ packages: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} - cachedir@2.4.0: - resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} - engines: {node: '>=6'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2984,10 +2955,6 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - check-more-types@2.24.0: - resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} - engines: {node: '>= 0.8.0'} - chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -3043,14 +3010,6 @@ packages: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -3363,11 +3322,6 @@ packages: resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} engines: {node: '>=0.10.0'} - cypress@12.5.1: - resolution: {integrity: sha512-ZmCmJ3lsyeOpBfh410m5+AO2CO1AxAzFBt7k6/uVbNcrNZje1vdiwYTpj2ksPKg9mjr9lR6V8tmlDNMvr4H/YQ==} - engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} - hasBin: true - dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} @@ -3396,9 +3350,6 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} - dayjs@1.11.21: - resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} - debounce-fn@4.0.0: resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} engines: {node: '>=10'} @@ -3411,14 +3362,6 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.3: resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} engines: {node: '>=6.0'} @@ -3759,10 +3702,6 @@ packages: resolution: {integrity: sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==} engines: {node: '>=10.13.0'} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -3883,9 +3822,6 @@ packages: resolution: {integrity: sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==} engines: {node: '>=10.13.0'} - eventemitter2@6.4.7: - resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} - eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -3901,10 +3837,6 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} - expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -3924,11 +3856,6 @@ packages: resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} hasBin: true - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - extsprintf@1.3.0: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} @@ -3980,10 +3907,6 @@ packages: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - file-loader@6.2.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} @@ -4078,6 +4001,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -4143,9 +4071,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - getos@3.2.1: - resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} - getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} @@ -4369,10 +4294,6 @@ packages: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} - http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} - engines: {node: '>=0.10'} - https-proxy-agent@5.0.0: resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} engines: {node: '>= 6'} @@ -4854,10 +4775,6 @@ packages: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} - jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - jsqr@1.4.0: resolution: {integrity: sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A==} @@ -4881,10 +4798,6 @@ packages: resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} engines: {node: '>=8'} - lazy-ass@1.6.0: - resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} - engines: {node: '> 0.8'} - lazy-val@1.0.5: resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} @@ -4944,15 +4857,6 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - listr2@3.14.0: - resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} - engines: {node: '>=10.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - lit-element@3.3.3: resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} @@ -4998,9 +4902,6 @@ packages: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -5011,10 +4912,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - loud-rejection@2.2.0: resolution: {integrity: sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==} engines: {node: '>=8'} @@ -5547,9 +5444,6 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - ospath@1.2.2: - resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -5745,6 +5639,16 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + playwright-core@1.61.1: + resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.61.1: + resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} + engines: {node: '>=18'} + hasBin: true + plist@3.1.1: resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==} engines: {node: '>=10.4.0'} @@ -5899,9 +5803,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-from-env@1.0.0: - resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} - psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} @@ -5939,10 +5840,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - qs@6.10.7: - resolution: {integrity: sha512-SU8Tw69GDcmdCwqC8OksqrQ6w/TGMsKRWGOj5rOaFt1xVwLbReX87/icjHrGDVuS3yfZUHKo2Q26IoAVucBS3Q==} - engines: {node: '>=0.6'} - qs@6.15.3: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} @@ -6073,9 +5970,6 @@ packages: renderkid@3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} - request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} - request@2.88.2: resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} engines: {node: '>= 6'} @@ -6119,10 +6013,6 @@ packages: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -6135,9 +6025,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -6384,10 +6271,6 @@ packages: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -6676,9 +6559,6 @@ packages: engines: {node: '>=10'} hasBin: true - throttleit@1.0.1: - resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -6852,10 +6732,6 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -8470,41 +8346,10 @@ snapshots: '@biomejs/cli-win32-x64@2.5.3': optional: true - '@colors/colors@1.5.0': - optional: true - '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@cypress/request@2.88.12': - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - http-signature: 1.3.6 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.10.7 - safe-buffer: 5.2.1 - tough-cookie: 4.1.4 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - - '@cypress/xvfb@1.2.4(supports-color@8.1.1)': - dependencies: - debug: 3.2.7(supports-color@8.1.1) - lodash.once: 4.1.1 - transitivePeerDependencies: - - supports-color - '@develar/schema-utils@2.6.5': dependencies: ajv: 6.15.0 @@ -8757,6 +8602,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@playwright/test@1.61.1': + dependencies: + playwright: 1.61.1 + '@rollup/plugin-babel@5.3.1(@babel/core@7.29.7)(rollup@2.80.0)': dependencies: '@babel/core': 7.29.7 @@ -9315,10 +9164,6 @@ snapshots: '@types/node': 24.13.3 '@types/send': 0.17.6 - '@types/sinonjs__fake-timers@8.1.1': {} - - '@types/sizzle@2.3.10': {} - '@types/sockjs@0.3.36': dependencies: '@types/node': 24.13.3 @@ -9461,11 +9306,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 24.13.3 - optional: true - '@types/zxcvbn@4.4.5': {} '@ungap/promise-all-settled@1.1.2': {} @@ -9639,7 +9479,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9693,10 +9533,6 @@ snapshots: ansi-escapes@3.2.0: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-html-community@0.0.8: {} ansi-regex@2.1.1: {} @@ -9759,8 +9595,6 @@ snapshots: aproba@1.2.0: {} - arch@2.2.0: {} - are-we-there-yet@1.1.7: dependencies: delegates: 1.0.0 @@ -9829,7 +9663,8 @@ snapshots: assertion-error@1.1.0: {} - astral-regex@2.0.0: {} + astral-regex@2.0.0: + optional: true async-exit-hook@2.0.1: {} @@ -9926,8 +9761,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - blob-util@2.0.2: {} - bluebird-lst@1.0.9: dependencies: bluebird: 3.7.2 @@ -10131,8 +9964,6 @@ snapshots: normalize-url: 4.5.1 responselike: 1.0.2 - cachedir@2.4.0: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -10203,8 +10034,6 @@ snapshots: dependencies: get-func-name: 2.0.2 - check-more-types@2.24.0: {} - chokidar@3.5.3: dependencies: anymatch: 3.1.3 @@ -10263,20 +10092,11 @@ snapshots: dependencies: restore-cursor: 2.0.0 - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-table3@0.6.5: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - cli-truncate@2.1.0: dependencies: slice-ansi: 3.0.0 string-width: 4.2.3 + optional: true cli-width@2.2.1: {} @@ -10684,51 +10504,6 @@ snapshots: dependencies: array-find-index: 1.0.2 - cypress@12.5.1: - dependencies: - '@cypress/request': 2.88.12 - '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 24.13.3 - '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.10 - arch: 2.2.0 - blob-util: 2.0.2 - bluebird: 3.7.2 - buffer: 5.7.1 - cachedir: 2.4.0 - chalk: 4.1.2 - check-more-types: 2.24.0 - cli-cursor: 3.1.0 - cli-table3: 0.6.5 - commander: 5.1.0 - common-tags: 1.8.2 - dayjs: 1.11.21 - debug: 4.4.3(supports-color@8.1.1) - enquirer: 2.4.1 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: 4.1.1 - extract-zip: 2.0.1(supports-color@8.1.1) - figures: 3.2.0 - fs-extra: 9.1.0 - getos: 3.2.1 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - lazy-ass: 1.6.0 - listr2: 3.14.0(enquirer@2.4.1) - lodash: 4.18.1 - log-symbols: 4.1.0 - minimist: 1.2.8 - ospath: 1.2.2 - pretty-bytes: 5.6.0 - proxy-from-env: 1.0.0 - request-progress: 3.0.0 - semver: 7.8.5 - supports-color: 8.1.1 - tmp: 0.2.7 - untildify: 4.0.0 - yauzl: 2.10.0 - dashdash@1.14.1: dependencies: assert-plus: 1.0.0 @@ -10763,8 +10538,6 @@ snapshots: dependencies: '@babel/runtime': 7.29.7 - dayjs@1.11.21: {} - debounce-fn@4.0.0: dependencies: mimic-fn: 3.1.0 @@ -10773,12 +10546,6 @@ snapshots: dependencies: ms: 2.0.0 - debug@3.2.7(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - debug@4.3.3(supports-color@8.1.1): dependencies: ms: 2.1.2 @@ -10789,6 +10556,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -11172,11 +10943,6 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - entities@2.2.0: {} env-paths@2.2.1: {} @@ -11349,8 +11115,6 @@ snapshots: event-target-shim@6.0.2: {} - eventemitter2@6.4.7: {} - eventemitter3@4.0.7: {} events@3.3.0: {} @@ -11379,10 +11143,6 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - executable@4.1.1: - dependencies: - pify: 2.3.0 - expand-template@2.0.3: {} express@4.22.2: @@ -11438,16 +11198,6 @@ snapshots: transitivePeerDependencies: - supports-color - extract-zip@2.0.1(supports-color@8.1.1): - dependencies: - debug: 4.4.3(supports-color@8.1.1) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - extsprintf@1.3.0: {} extsprintf@1.4.1: {} @@ -11490,10 +11240,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - file-loader@6.2.0(webpack@5.108.4): dependencies: loader-utils: 2.0.4 @@ -11597,6 +11343,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -11676,10 +11425,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - getos@3.2.1: - dependencies: - async: 3.2.6 - getpass@0.1.7: dependencies: assert-plus: 1.0.0 @@ -11932,7 +11677,7 @@ snapshots: dependencies: '@tootallnate/once': 2.0.1 agent-base: 6.0.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -12000,12 +11745,6 @@ snapshots: jsprim: 1.4.2 sshpk: 1.18.0 - http-signature@1.3.6: - dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.18.0 - https-proxy-agent@5.0.0: dependencies: agent-base: 6.0.2 @@ -12016,7 +11755,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -12479,13 +12218,6 @@ snapshots: json-schema: 0.4.0 verror: 1.10.0 - jsprim@2.0.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - jsqr@1.4.0: {} jsrsasign@10.9.0: {} @@ -12513,8 +12245,6 @@ snapshots: dependencies: package-json: 6.5.0 - lazy-ass@1.6.0: {} - lazy-val@1.0.5: {} level-codec@10.0.0: @@ -12578,19 +12308,6 @@ snapshots: dependencies: immediate: 3.0.6 - listr2@3.14.0(enquirer@2.4.1): - dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.20 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.4.1 - rxjs: 7.8.2 - through: 2.3.8 - wrap-ansi: 7.0.0 - optionalDependencies: - enquirer: 2.4.1 - lit-element@3.3.3: dependencies: '@lit-labs/ssr-dom-shim': 1.6.0 @@ -12644,8 +12361,6 @@ snapshots: lodash.isequal@4.5.0: {} - lodash.once@4.1.1: {} - lodash.sortby@4.7.0: {} lodash@4.18.1: {} @@ -12655,13 +12370,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log-update@4.0.0: - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - loud-rejection@2.2.0: dependencies: currently-unhandled: 0.4.1 @@ -13185,8 +12893,6 @@ snapshots: os-tmpdir@1.0.2: {} - ospath@1.2.2: {} - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -13370,6 +13076,14 @@ snapshots: dependencies: find-up: 3.0.0 + playwright-core@1.61.1: {} + + playwright@1.61.1: + dependencies: + playwright-core: 1.61.1 + optionalDependencies: + fsevents: 2.3.2 + plist@3.1.1: dependencies: '@xmldom/xmldom': 0.9.10 @@ -13381,7 +13095,7 @@ snapshots: portfinder@1.0.38: dependencies: async: 3.2.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -13544,8 +13258,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.0.0: {} - psl@1.15.0: dependencies: punycode: 2.3.1 @@ -13577,10 +13289,6 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - qs@6.10.7: - dependencies: - side-channel: 1.1.1 - qs@6.15.3: dependencies: es-define-property: 1.0.1 @@ -13750,10 +13458,6 @@ snapshots: lodash: 4.18.1 strip-ansi: 6.0.1 - request-progress@3.0.0: - dependencies: - throttleit: 1.0.1 - request@2.88.2: dependencies: aws-sign2: 0.7.0 @@ -13809,19 +13513,12 @@ snapshots: onetime: 2.0.1 signal-exit: 3.0.7 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - retry@0.12.0: {} retry@0.13.1: {} reusify@1.1.0: {} - rfdc@1.4.1: {} - rimraf@2.7.1: dependencies: glob: 7.2.3 @@ -14176,12 +13873,7 @@ snapshots: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 + optional: true smart-buffer@4.2.0: {} @@ -14526,8 +14218,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - throttleit@1.0.1: {} - through@2.3.8: {} thunky@1.1.0: {} @@ -14703,8 +14393,6 @@ snapshots: type-fest@0.20.2: {} - type-fest@0.21.3: {} - type-fest@1.4.0: {} type-is@1.6.18: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5ee52611..dae22095 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,7 +3,6 @@ packages: onlyBuiltDependencies: - sharp - - cypress publicHoistPattern: - "*sharp*" From 10cb99808530f83e04d841a263e3f7b89ba2bc26 Mon Sep 17 00:00:00 2001 From: grigoreo Date: Fri, 10 Jul 2026 00:44:39 +0000 Subject: [PATCH 04/15] test: add Playwright e2e helpers for reset, mail, shadow --- e2e/helpers/mail.ts | 35 +++++++++++++++++++++++++++++++++++ e2e/helpers/reset.ts | 26 ++++++++++++++++++++++++++ e2e/helpers/shadow.ts | 18 ++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 e2e/helpers/mail.ts create mode 100644 e2e/helpers/reset.ts create mode 100644 e2e/helpers/shadow.ts diff --git a/e2e/helpers/mail.ts b/e2e/helpers/mail.ts new file mode 100644 index 00000000..e437268b --- /dev/null +++ b/e2e/helpers/mail.ts @@ -0,0 +1,35 @@ +import { e2eEnv } from "./env"; + +type MaildevEmail = { + time: string | number; + text?: string; + html?: string; +}; + +export async function clearEmails(): Promise { + const res = await fetch(`${e2eEnv.maildevUrl}/email/all`, { method: "DELETE" }); + if (!res.ok && res.status !== 200) { + throw new Error(`maildev clear failed: ${res.status}`); + } +} + +export async function getCodeFromEmail(options: { timeout?: number } = {}): Promise { + const timeout = options.timeout ?? 30_000; + const deadline = Date.now() + timeout; + + while (Date.now() < deadline) { + const res = await fetch(`${e2eEnv.maildevUrl}/email`); + if (res.ok) { + const emails = (await res.json()) as MaildevEmail[]; + const latest = [...emails].sort((a, b) => (a.time > b.time ? -1 : 1))[0]; + const body = `${latest?.text || ""}\n${latest?.html || ""}`; + const match = body.match(/(\d{6})/); + if (match?.[1]) { + return match[1]; + } + } + await new Promise((r) => setTimeout(r, 500)); + } + + throw new Error("Timed out waiting for email verification code from maildev"); +} diff --git a/e2e/helpers/reset.ts b/e2e/helpers/reset.ts new file mode 100644 index 00000000..41b5f2fa --- /dev/null +++ b/e2e/helpers/reset.ts @@ -0,0 +1,26 @@ +import type { Page } from "@playwright/test"; + +export async function resetClientState(page: Page): Promise { + await page.context().clearCookies(); + await page.goto("/"); + await page.evaluate(async () => { + localStorage.clear(); + sessionStorage.clear(); + const dbs = await indexedDB.databases(); + await Promise.all( + dbs.map( + (db) => + new Promise((resolve, reject) => { + if (!db.name) { + resolve(); + return; + } + const req = indexedDB.deleteDatabase(db.name); + req.onsuccess = () => resolve(); + req.onerror = () => reject(req.error); + req.onblocked = () => resolve(); + }) + ) + ); + }); +} diff --git a/e2e/helpers/shadow.ts b/e2e/helpers/shadow.ts new file mode 100644 index 00000000..27e2c1f2 --- /dev/null +++ b/e2e/helpers/shadow.ts @@ -0,0 +1,18 @@ +import type { Locator, Page } from "@playwright/test"; + +/** Chain locators; Playwright pierces open shadow roots between custom elements. */ +export function deep(page: Page, ...selectors: string[]): Locator { + if (selectors.length === 0) { + throw new Error("deep() requires at least one selector"); + } + let loc = page.locator(selectors[0]); + for (let i = 1; i < selectors.length; i++) { + loc = loc.locator(selectors[i]); + } + return loc; +} + +export async function typeIn(host: Locator, text: string): Promise { + const field = host.locator("input, textarea").first(); + await field.fill(text); +} From 9ca0e0b7d3bbd023335b725fda6e34ffcad97b92 Mon Sep 17 00:00:00 2001 From: grigoreo Date: Fri, 10 Jul 2026 01:16:41 +0000 Subject: [PATCH 05/15] test: port signup/login/lock Playwright e2e flows --- e2e/auth.spec.ts | 20 ++++++ e2e/helpers/auth.ts | 149 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 e2e/auth.spec.ts create mode 100644 e2e/helpers/auth.ts diff --git a/e2e/auth.spec.ts b/e2e/auth.spec.ts new file mode 100644 index 00000000..de9f474b --- /dev/null +++ b/e2e/auth.spec.ts @@ -0,0 +1,20 @@ +import { test } from "@playwright/test"; +import { lock, login, signup, unlock } from "./helpers/auth"; + +test.describe("Signup/Login", () => { + const email = `${Math.floor(Math.random() * 1e8)}@example.com`; + + test("can signup without errors", async ({ page }) => { + await signup(page, email); + }); + + test("can login without errors", async ({ page }) => { + await login(page, email); + }); + + test("can lock/unlock without errors", async ({ page }) => { + await login(page, email); + await lock(page); + await unlock(page, email); + }); +}); diff --git a/e2e/helpers/auth.ts b/e2e/helpers/auth.ts new file mode 100644 index 00000000..fd2f7206 --- /dev/null +++ b/e2e/helpers/auth.ts @@ -0,0 +1,149 @@ +import type { Locator, Page } from "@playwright/test"; +import { expect } from "@playwright/test"; +import { e2eEnv } from "./env"; +import { clearEmails, getCodeFromEmail } from "./mail"; +import { resetClientState } from "./reset"; +import { deep } from "./shadow"; + +/** Fill a pl-input / pl-password-input host, ensuring the component value is set. */ +async function fillField(host: Locator, text: string): Promise { + const field = host.locator("input, textarea").first(); + await field.fill(text); + // BaseInput.value setter is async; also write the native input and notify parent forms. + await host.evaluate(async (el: HTMLElement & { value: string; updateComplete?: Promise }, t: string) => { + el.value = t; + const input = el.shadowRoot?.querySelector("input, textarea") as HTMLInputElement | null; + if (input && input.value !== t) { + input.value = t; + } + el.dispatchEvent(new Event("input", { bubbles: true, composed: true })); + el.dispatchEvent(new Event("change", { bubbles: true, composed: true })); + await el.updateComplete; + }, text); + await expect.poll(async () => host.evaluate((el: { value: string }) => el.value), { timeout: 5_000 }).toBe(text); +} + +async function setCheckbox(locator: Locator, checked = true): Promise { + await locator.evaluate((el: HTMLInputElement, val: boolean) => { + el.checked = val; + el.dispatchEvent(new Event("input", { bubbles: true })); + el.dispatchEvent(new Event("change", { bubbles: true })); + }, checked); +} + +async function submitEmailForCode(page: Page, email: string): Promise { + const loginView = deep(page, "pl-app", "pl-start", "pl-login-signup"); + await expect(loginView.locator("#emailInput")).toBeVisible({ timeout: 30_000 }); + await fillField(loginView.locator("#emailInput"), email); + await loginView.locator("#submitEmailButton").click({ force: true }); + + const prompt = deep(page, "pl-app", "pl-prompt-dialog"); + await expect(prompt).toBeVisible({ timeout: 20_000 }); + const code = await getCodeFromEmail(); + await fillField(prompt.locator("pl-input").first(), code); + await prompt.locator("#confirmButton").click({ force: true }); + + await expect(page).toHaveURL(/authToken/, { timeout: 30_000 }); +} + +export async function signup(page: Page, email: string): Promise { + await resetClientState(page); + await clearEmails(); + await page.goto("/"); + + const login = deep(page, "pl-app", "pl-start", "pl-login-signup"); + await submitEmailForCode(page, email); + + // Name + TOS (consent drawer) + const consent = login.locator("pl-drawer#consentDrawer"); + await expect(consent).toBeVisible({ timeout: 15_000 }); + await fillField(consent.locator("#nameInput"), e2eEnv.name); + await setCheckbox(consent.locator("input#tosCheckbox"), true); + await consent.locator("pl-button").filter({ hasText: "Create Account" }).click({ force: true }); + + await expect(page).toHaveURL(/signup\/choose-password/, { timeout: 15_000 }); + + // Choose a different password (open dialog via component API — Lit ghost buttons are flaky under force-click) + await login.evaluate((el: { _editMasterPassword: () => void }) => { + el._editMasterPassword(); + }); + + const alert = deep(page, "pl-app", "pl-alert-dialog"); + await expect(alert).toBeVisible({ timeout: 10_000 }); + await alert.locator("pl-button").filter({ hasText: "Choose My Own" }).click({ force: true }); + + const masterPrompt = deep(page, "pl-app", "pl-prompt-dialog"); + await expect(masterPrompt).toBeVisible({ timeout: 10_000 }); + await fillField(masterPrompt.locator("pl-input[label='Enter Master Password']"), e2eEnv.password); + await masterPrompt.locator("#confirmButton").click({ force: true }); + + // Confirm weak password + await expect(alert).toBeVisible({ timeout: 10_000 }); + await alert.locator("pl-button").filter({ hasText: "Use Anyway" }).click({ force: true }); + await expect + .poll(async () => login.evaluate((el: { _password: string }) => el._password), { timeout: 5_000 }) + .toBe(e2eEnv.password); + + await login.locator("pl-drawer").nth(5).locator("pl-button").filter({ hasText: "Continue" }).click({ force: true }); + await fillField(login.locator("pl-password-input#repeatPasswordInput"), e2eEnv.password); + await login.locator("pl-button#confirmPasswordButton").click({ force: true }); + + await expect(page).toHaveURL(/\/signup\/success/, { timeout: 30_000 }); + await login.locator("pl-button").filter({ hasText: "Get Started" }).click({ force: true }); + await expect(page).toHaveURL(/\/items/, { timeout: 30_000 }); +} + +export async function login(page: Page, email: string): Promise { + await resetClientState(page); + await clearEmails(); + await page.goto("/"); + + const loginView = deep(page, "pl-app", "pl-start", "pl-login-signup"); + await submitEmailForCode(page, email); + + await expect(page).toHaveURL(/\/login/, { timeout: 15_000 }); + const passwordInput = loginView.locator("pl-password-input#loginPasswordInput"); + await expect(passwordInput).toBeVisible({ timeout: 15_000 }); + await fillField(passwordInput, e2eEnv.password); + const loginButton = loginView.locator("pl-button#loginButton"); + await expect + .poll(async () => loginButton.evaluate((el: HTMLElement) => !el.hasAttribute("disabled")), { timeout: 5_000 }) + .toBe(true); + await loginButton.click({ force: true }); + + // Add trusted device (skipped when device already trusted — then we land on /items) + const alert = deep(page, "pl-app", "pl-alert-dialog"); + try { + await expect(alert).toBeVisible({ timeout: 15_000 }); + await alert.locator("pl-button").filter({ hasText: "Yes" }).click({ force: true }); + } catch { + // device already trusted — login proceeds without confirm + } + await expect(page).toHaveURL(/\/items/, { timeout: 30_000 }); +} + +export async function lock(page: Page): Promise { + await page.goto("/items"); + // Desktop: menu is already visible. Mobile: open via menu-button first (force for CSS-hidden). + const list = deep(page, "pl-app", "pl-items", "pl-items-list"); + const menuButton = list.locator("pl-button.menu-button").first(); + if (await menuButton.isVisible().catch(() => false)) { + await menuButton.click({ force: true }); + } else { + await menuButton.dispatchEvent("click").catch(() => undefined); + } + const menu = deep(page, "pl-app", "pl-menu"); + await menu.locator("pl-button").filter({ hasText: "Lock" }).click({ force: true }); + await expect(page).toHaveURL(/\/unlock/, { timeout: 15_000 }); +} + +export async function unlock(page: Page, email: string): Promise { + await page.goto("/"); + const unlockView = deep(page, "pl-app", "pl-start", "pl-unlock"); + await expect(unlockView.locator("pl-input[label='Logged In As']").locator("input")).toHaveValue(email, { + timeout: 15_000, + }); + await fillField(unlockView.locator("pl-password-input#passwordInput"), e2eEnv.password); + await unlockView.locator("pl-button#unlockButton").click({ force: true }); + await expect(page).toHaveURL(/\/items/, { timeout: 30_000 }); +} From 1f597341dc19091bf7de1c0ea2491c23438a8ce7 Mon Sep 17 00:00:00 2001 From: grigoreo Date: Fri, 10 Jul 2026 01:21:34 +0000 Subject: [PATCH 06/15] test: port items create/search Playwright e2e --- e2e/helpers/shadow.ts | 13 +++++++ e2e/items.spec.ts | 88 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 e2e/items.spec.ts diff --git a/e2e/helpers/shadow.ts b/e2e/helpers/shadow.ts index 27e2c1f2..cb526446 100644 --- a/e2e/helpers/shadow.ts +++ b/e2e/helpers/shadow.ts @@ -1,4 +1,5 @@ import type { Locator, Page } from "@playwright/test"; +import { expect } from "@playwright/test"; /** Chain locators; Playwright pierces open shadow roots between custom elements. */ export function deep(page: Page, ...selectors: string[]): Locator { @@ -12,7 +13,19 @@ export function deep(page: Page, ...selectors: string[]): Locator { return loc; } +/** Fill a pl-input / pl-textarea host so both native input and component `.value` stay in sync. */ export async function typeIn(host: Locator, text: string): Promise { const field = host.locator("input, textarea").first(); await field.fill(text); + await host.evaluate(async (el: HTMLElement & { value: string; updateComplete?: Promise }, t: string) => { + el.value = t; + const input = el.shadowRoot?.querySelector("input, textarea") as HTMLInputElement | null; + if (input && input.value !== t) { + input.value = t; + } + el.dispatchEvent(new Event("input", { bubbles: true, composed: true })); + el.dispatchEvent(new Event("change", { bubbles: true, composed: true })); + await el.updateComplete; + }, text); + await expect.poll(async () => host.evaluate((el: { value: string }) => el.value), { timeout: 5_000 }).toBe(text); } diff --git a/e2e/items.spec.ts b/e2e/items.spec.ts new file mode 100644 index 00000000..fbf732b5 --- /dev/null +++ b/e2e/items.spec.ts @@ -0,0 +1,88 @@ +import { expect, test } from "@playwright/test"; +import { lock, login, signup, unlock } from "./helpers/auth"; +import { deep, typeIn } from "./helpers/shadow"; + +const testItem = { + name: "Google", + username: "example@google.com", + password: "somethingsecret", + url: "https://google.com", +}; + +const itemSearch = { + existing: "secret", + nonexistent: "apple", +}; + +const email = `${Math.floor(Math.random() * 1e8)}@example.com`; + +test.describe("Items", () => { + // Playwright isolates storage per test; Cypress shared the browser session. + // Create persists account+item on the memory server; find re-auths then unlocks. + test.describe.configure({ mode: "serial" }); + + test("can create an item without errors", async ({ page }) => { + await signup(page, email); + + const list = deep(page, "pl-app", "pl-items", "pl-items-list"); + // Header: menu, multi-select, add, search — prefer icon over fragile nth indices + await list.locator('pl-button:has(pl-icon[icon="add"])').first().click({ force: true }); + + const createDialog = deep(page, "pl-app", "pl-create-item-dialog"); + await expect(createDialog.locator("footer pl-button.primary")).toBeVisible({ timeout: 15_000 }); + await createDialog.locator("footer pl-button.primary").click({ force: true }); + + await expect(page).toHaveURL(/\/items\//); + await expect(page).toHaveURL(/\/new/); + + const itemView = deep(page, "pl-app", "pl-items", "pl-item-view"); + await expect(itemView.locator("pl-input#nameInput")).toBeVisible({ timeout: 15_000 }); + await typeIn(itemView.locator("pl-input#nameInput"), testItem.name); + await typeIn( + itemView + .locator("pl-scroller pl-list pl-field") + .nth(0) + .locator("pl-input.value-input, pl-textarea.value-input"), + testItem.username + ); + await typeIn( + itemView + .locator("pl-scroller pl-list pl-field") + .nth(1) + .locator("pl-input.value-input, pl-textarea.value-input"), + testItem.password + ); + await typeIn( + itemView + .locator("pl-scroller pl-list pl-field") + .nth(2) + .locator("pl-input.value-input, pl-textarea.value-input"), + testItem.url + ); + await itemView.locator("pl-button.primary").click({ force: true }); + + await expect(page).toHaveURL(/\/items\//); + await expect(page).not.toHaveURL(/\/new/); + }); + + test("can find an item without errors", async ({ page }) => { + // Fresh context: login restores session; lock+unlock matches Cypress unlock path after reload + await login(page, email); + await lock(page); + await unlock(page, email); + + const list = deep(page, "pl-app", "pl-items", "pl-items-list"); + await list.locator('pl-button:has(pl-icon[icon="search"])').first().click({ force: true }); + await typeIn(list.locator("pl-input#filterInput"), itemSearch.existing); + + const rows = list.locator("main pl-virtual-list pl-scroller div.content > div"); + await expect(rows).toHaveCount(1); + await expect(list.locator("pl-vault-item-list-item div.semibold").first()).toContainText(testItem.name); + + await list.locator("pl-input#filterInput pl-button.slim").click({ force: true }); + await list.locator('pl-button:has(pl-icon[icon="search"])').first().click({ force: true }); + await typeIn(list.locator("pl-input#filterInput"), itemSearch.nonexistent); + + await expect(list.locator("main > div.centering")).toContainText("did not match any items"); + }); +}); From 0806491b8033cb9bfe202bb6f7a6341e074a1222 Mon Sep 17 00:00:00 2001 From: grigoreo Date: Fri, 10 Jul 2026 01:23:02 +0000 Subject: [PATCH 07/15] test: add Playwright server HTTP smoke --- e2e/server.spec.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 e2e/server.spec.ts diff --git a/e2e/server.spec.ts b/e2e/server.spec.ts new file mode 100644 index 00000000..5c082d1d --- /dev/null +++ b/e2e/server.spec.ts @@ -0,0 +1,41 @@ +import { expect, test } from "@playwright/test"; +import { e2eEnv } from "./helpers/env"; + +test.describe("Server", () => { + const serverUrl = e2eEnv.serverUrl; + + test("responds correctly to valid and invalid requests", async ({ request }) => { + expect((await request.get(`${serverUrl}/`, { failOnStatusCode: false })).status()).toBe(405); + expect((await request.put(`${serverUrl}/`, { failOnStatusCode: false })).status()).toBe(405); + expect((await request.fetch(`${serverUrl}/`, { method: "OPTIONS" })).ok()).toBeTruthy(); + + expect((await request.post(`${serverUrl}/`, { failOnStatusCode: false })).status()).toBe(400); + + const invalid = await request.post(`${serverUrl}/`, { + headers: { "Content-Type": "application/json" }, + data: { email: "user@example.com" }, + }); + expect(invalid.status()).toBe(200); + const invalidBody = await invalid.json(); + expect(invalidBody.kind).toBe("response"); + expect(invalidBody.error?.code).toBe("invalid_request"); + expect(invalidBody.result).toBeNull(); + + const unauth = await request.post(`${serverUrl}/`, { + headers: { "Content-Type": "application/json" }, + data: { + method: "getAuthInfo", + params: [], + device: {}, + auth: {}, + kind: "request", + version: "4.0.0", + }, + }); + expect(unauth.status()).toBe(200); + const unauthBody = await unauth.json(); + expect(unauthBody.kind).toBe("response"); + expect(unauthBody.error?.code).toBe("invalid_session"); + expect(unauthBody.result).toBeNull(); + }); +}); From 80e3424252270b7afaf7381c91605dfc570db656 Mon Sep 17 00:00:00 2001 From: grigoreo Date: Fri, 10 Jul 2026 01:42:05 +0000 Subject: [PATCH 08/15] ci: require Playwright e2e and remove Cypress Add a required e2e CI job that starts Docker maildev and runs Playwright. Replace broken npx maildev with scripts/e2e.sh (Docker maildev/maildev:2.1.0), delete Cypress/v3 fixtures and optional e2e workflow, and document Playwright. --- .github/workflows/ci.yml | 41 + .github/workflows/e2e.yml | 33 - .gitignore | 10 + CONTRIBUTING.md | 6 +- README.md | 15 +- biome.json | 3 +- cypress.config.ts | 18 - cypress.env.json | 9 - cypress/e2e/01 - signup-login.cy.ts | 19 - cypress/e2e/02 - items.cy.ts | 87 - cypress/e2e/03 - v3-compatibility.cy.ts | 111 - cypress/e2e/04 - server.cy.ts | 63 - cypress/fixtures/example.json | 5 - .../021f830e3290aad20514c75c92ab00c9.woff | Bin 4492 -> 0 bytes .../2f14cbb7792a42471b1b64de35797d7a.ttf | Bin 110856 -> 0 bytes .../2f7fbbd7d8eee807e437e660436c6033.woff | Bin 76632 -> 0 bytes .../3d1a8e52672c4af418771bcd7e4111f5.eot | Bin 160768 -> 0 bytes .../49d0dfccb2c7333add0c1277ce21fa1e.svg | 1 - .../4d410e4977b3525f9fca202da60d43ed.ttf | Bin 96964 -> 0 bytes .../5503c8e2713e276d4a2cdff45e6991c9.ttf | Bin 6552 -> 0 bytes .../9659db92dbc9c899169660fa07a18838.svg | 2231 -- .../app_src_elements_app_ts.chunk.js | 28151 ---------------- .../app_src_elements_app_ts.chunk.js.map | 1 - .../c6d06da41ec4b66d90868ce6bf337cbd.ttf | Bin 108828 -> 0 bytes .../d0adc2b29b7472077dc7439642f1439a.ttf | Bin 111284 -> 0 bytes cypress/fixtures/v3-client/date-fns.chunk.js | 7423 ---- .../fixtures/v3-client/date-fns.chunk.js.map | 1 - .../e21224eb684dfa21443683a3fc963a3b.ttf | Bin 110840 -> 0 bytes .../e3a2c12708311d5e47193da456ccdcba.eot | Bin 6716 -> 0 bytes .../ecbe95f309be4cee7aa3f894386282f6.ttf | Bin 160548 -> 0 bytes .../f862b0f4608b4f0fb945113ef8dcdfa3.woff2 | Bin 59604 -> 0 bytes ...8x128.1934781ac166ce1182473922419945cf.png | Bin 9100 -> 0 bytes ...2x192.02182e390dd5bfda29a85b4ed8ee99e4.png | Bin 16256 -> 0 bytes ...6x256.472eb7710503d2d60f634bdbd0a6f6bc.png | Bin 25444 -> 0 bytes ...4x384.6e43a89ef1b6a6a621bb761eba8c55c7.png | Bin 54638 -> 0 bytes ...2x512.a010485cd9c6e57ff248fd2b3326584d.png | Bin 87921 -> 0 bytes ...96x96.bf1f4e1a1e7b38d6e4daf7b786bdd376.png | Bin 6264 -> 0 bytes cypress/fixtures/v3-client/index.html | 71 - cypress/fixtures/v3-client/jsqr.chunk.js | 10050 ------ cypress/fixtures/v3-client/jsqr.chunk.js.map | 1 - ...e_res_translations__template_json.chunk.js | 14 - .../locale_res_translations_de_json.chunk.js | 14 - .../locale_res_translations_es_json.chunk.js | 14 - .../locale_res_translations_fr_json.chunk.js | 14 - .../locale_res_translations_pl_json.chunk.js | 14 - .../locale_res_translations_ru_json.chunk.js | 14 - .../locale_res_wordlists_de_json.chunk.js | 14 - .../locale_res_wordlists_en_json.chunk.js | 14 - .../locale_res_wordlists_es_json.chunk.js | 14 - .../locale_res_wordlists_fr_json.chunk.js | 14 - .../locale_res_wordlists_pt_json.chunk.js | 14 - cypress/fixtures/v3-client/main.js | 6576 ---- cypress/fixtures/v3-client/main.js.map | 1 - ...fest.41bf06683f2015ae2f4f1a35e4d2873a.json | 41 - cypress/fixtures/v3-client/papaparse.chunk.js | 23 - .../fixtures/v3-client/papaparse.chunk.js.map | 1 - cypress/fixtures/v3-client/sw.js | 4523 --- cypress/fixtures/v3-client/sw.js.map | 1 - cypress/fixtures/v3-client/ua-parser.chunk.js | 913 - .../fixtures/v3-client/ua-parser.chunk.js.map | 1 - ...lit-element_lit-element_js-188e3a.chunk.js | 5700 ---- ...element_lit-element_js-188e3a.chunk.js.map | 1 - cypress/fixtures/v3-client/zxcvbn.chunk.js | 1717 - .../fixtures/v3-client/zxcvbn.chunk.js.map | 1 - cypress/plugins/index.ts | 22 - cypress/support/commands.ts | 343 - cypress/support/e2e.ts | 92 - cypress/tsconfig.json | 8 - e2e/helpers/auth.ts | 22 +- package.json | 5 +- pnpm-lock.yaml | 274 +- scripts/e2e.sh | 149 + 72 files changed, 255 insertions(+), 68663 deletions(-) delete mode 100644 .github/workflows/e2e.yml delete mode 100644 cypress.config.ts delete mode 100644 cypress.env.json delete mode 100644 cypress/e2e/01 - signup-login.cy.ts delete mode 100644 cypress/e2e/02 - items.cy.ts delete mode 100644 cypress/e2e/03 - v3-compatibility.cy.ts delete mode 100644 cypress/e2e/04 - server.cy.ts delete mode 100644 cypress/fixtures/example.json delete mode 100644 cypress/fixtures/v3-client/021f830e3290aad20514c75c92ab00c9.woff delete mode 100644 cypress/fixtures/v3-client/2f14cbb7792a42471b1b64de35797d7a.ttf delete mode 100644 cypress/fixtures/v3-client/2f7fbbd7d8eee807e437e660436c6033.woff delete mode 100644 cypress/fixtures/v3-client/3d1a8e52672c4af418771bcd7e4111f5.eot delete mode 100644 cypress/fixtures/v3-client/49d0dfccb2c7333add0c1277ce21fa1e.svg delete mode 100644 cypress/fixtures/v3-client/4d410e4977b3525f9fca202da60d43ed.ttf delete mode 100644 cypress/fixtures/v3-client/5503c8e2713e276d4a2cdff45e6991c9.ttf delete mode 100644 cypress/fixtures/v3-client/9659db92dbc9c899169660fa07a18838.svg delete mode 100644 cypress/fixtures/v3-client/app_src_elements_app_ts.chunk.js delete mode 100644 cypress/fixtures/v3-client/app_src_elements_app_ts.chunk.js.map delete mode 100644 cypress/fixtures/v3-client/c6d06da41ec4b66d90868ce6bf337cbd.ttf delete mode 100644 cypress/fixtures/v3-client/d0adc2b29b7472077dc7439642f1439a.ttf delete mode 100644 cypress/fixtures/v3-client/date-fns.chunk.js delete mode 100644 cypress/fixtures/v3-client/date-fns.chunk.js.map delete mode 100644 cypress/fixtures/v3-client/e21224eb684dfa21443683a3fc963a3b.ttf delete mode 100644 cypress/fixtures/v3-client/e3a2c12708311d5e47193da456ccdcba.eot delete mode 100644 cypress/fixtures/v3-client/ecbe95f309be4cee7aa3f894386282f6.ttf delete mode 100644 cypress/fixtures/v3-client/f862b0f4608b4f0fb945113ef8dcdfa3.woff2 delete mode 100644 cypress/fixtures/v3-client/icon_128x128.1934781ac166ce1182473922419945cf.png delete mode 100644 cypress/fixtures/v3-client/icon_192x192.02182e390dd5bfda29a85b4ed8ee99e4.png delete mode 100644 cypress/fixtures/v3-client/icon_256x256.472eb7710503d2d60f634bdbd0a6f6bc.png delete mode 100644 cypress/fixtures/v3-client/icon_384x384.6e43a89ef1b6a6a621bb761eba8c55c7.png delete mode 100644 cypress/fixtures/v3-client/icon_512x512.a010485cd9c6e57ff248fd2b3326584d.png delete mode 100644 cypress/fixtures/v3-client/icon_96x96.bf1f4e1a1e7b38d6e4daf7b786bdd376.png delete mode 100644 cypress/fixtures/v3-client/index.html delete mode 100644 cypress/fixtures/v3-client/jsqr.chunk.js delete mode 100644 cypress/fixtures/v3-client/jsqr.chunk.js.map delete mode 100644 cypress/fixtures/v3-client/locale_res_translations__template_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_translations_de_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_translations_es_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_translations_fr_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_translations_pl_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_translations_ru_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_wordlists_de_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_wordlists_en_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_wordlists_es_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_wordlists_fr_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/locale_res_wordlists_pt_json.chunk.js delete mode 100644 cypress/fixtures/v3-client/main.js delete mode 100644 cypress/fixtures/v3-client/main.js.map delete mode 100644 cypress/fixtures/v3-client/manifest.41bf06683f2015ae2f4f1a35e4d2873a.json delete mode 100644 cypress/fixtures/v3-client/papaparse.chunk.js delete mode 100644 cypress/fixtures/v3-client/papaparse.chunk.js.map delete mode 100644 cypress/fixtures/v3-client/sw.js delete mode 100644 cypress/fixtures/v3-client/sw.js.map delete mode 100644 cypress/fixtures/v3-client/ua-parser.chunk.js delete mode 100644 cypress/fixtures/v3-client/ua-parser.chunk.js.map delete mode 100644 cypress/fixtures/v3-client/vendors-app_node_modules_autosize_src_autosize_js-app_node_modules_lit-element_lit-element_js-188e3a.chunk.js delete mode 100644 cypress/fixtures/v3-client/vendors-app_node_modules_autosize_src_autosize_js-app_node_modules_lit-element_lit-element_js-188e3a.chunk.js.map delete mode 100644 cypress/fixtures/v3-client/zxcvbn.chunk.js delete mode 100644 cypress/fixtures/v3-client/zxcvbn.chunk.js.map delete mode 100644 cypress/plugins/index.ts delete mode 100644 cypress/support/commands.ts delete mode 100644 cypress/support/e2e.ts delete mode 100644 cypress/tsconfig.json create mode 100755 scripts/e2e.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6ea6cc0c..6d5e1868 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,3 +68,44 @@ jobs: run: pnpm install --frozen-lockfile - name: Run unit tests run: pnpm test + + e2e: + name: e2e + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Install Playwright Chromium + run: pnpm exec playwright install --with-deps chromium + - name: Start maildev + run: | + docker run -d --name padloc-e2e-maildev \ + -p 1025:1025 -p 1080:1080 \ + maildev/maildev:2.1.0 + for i in $(seq 1 60); do + if curl -sf http://localhost:1080/email >/dev/null; then + echo "maildev ready" + exit 0 + fi + sleep 0.5 + done + echo "maildev failed to start" >&2 + docker logs padloc-e2e-maildev || true + exit 1 + - name: Run E2E tests + env: + E2E_MAILDEV_URL: http://localhost:1080 + run: pnpm run test:e2e + - name: Upload Playwright report + if: failure() + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: playwright-report/ + retention-days: 7 diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml deleted file mode 100644 index cca22a71..00000000 --- a/.github/workflows/e2e.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: E2E - -on: - workflow_dispatch: - schedule: - - cron: "0 3 * * *" - pull_request: - types: - - labeled - - synchronize - - opened - - reopened - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - e2e: - name: e2e - if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'e2e') - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 - with: - node-version-file: ".nvmrc" - cache: "pnpm" - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Run E2E tests - run: pnpm run test:e2e diff --git a/.gitignore b/.gitignore index fcd8417d..d14d456e 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,13 @@ packages/admin/dist # SDD workflow scratch (internal, not part of project) .superpowers/ + +# Playwright +test-results/ +playwright-report/ +playwright/.cache/ + +# Playwright +test-results/ +playwright-report/ +playwright/.cache/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b813f254..9180fba6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,6 +12,7 @@ documentation, commit messages, pull requests, issues, and GitHub templates. - Node.js 24 (see `.nvmrc`) - pnpm 10.15.0 (see `packageManager` in `package.json`) - Corepack +- Docker (for e2e maildev) Recommended setup: @@ -70,12 +71,15 @@ pnpm -r run test it, review `git status` and commit any translation updates. Required CI fails if the extract step leaves a dirty worktree. -E2E tests are slower and can be run with: +E2E tests (Playwright + Docker maildev) are slower. Install Chromium once, then: ```bash +pnpm exec playwright install chromium pnpm run test:e2e ``` +Interactive UI mode: `pnpm run test:e2e:dev`. + ## Pull request review Every PR should: diff --git a/README.md b/README.md index ccecab97..ebd8aede 100644 --- a/README.md +++ b/README.md @@ -144,16 +144,19 @@ To run unit tests, use: npm run test ``` -Cypress end-to-end tests can be run via: +### End-to-end tests -```sh -npm run test:e2e +Requires Docker (used for maildev SMTP/REST). Install the browser once per machine: + +```bash +pnpm exec playwright install chromium +pnpm run test:e2e ``` -And to start cypress tests in "dev mode": +Interactive UI mode: -```ssh -npm run test:e2e:dev +```bash +pnpm run test:e2e:dev ``` ### Adding / removing dependencies diff --git a/biome.json b/biome.json index 27107c26..af40038c 100644 --- a/biome.json +++ b/biome.json @@ -15,7 +15,8 @@ "!**/package-lock.json", "!**/.superpowers", "!**/docs/superpowers", - "!**/cypress/fixtures", + "!**/test-results", + "!**/playwright-report", "!**/packages/locale/res", "!**/packages/app/src/core/*.js", "!**/packages/extension/dist", diff --git a/cypress.config.ts b/cypress.config.ts deleted file mode 100644 index 5e577430..00000000 --- a/cypress.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from "cypress"; - -export default defineConfig({ - includeShadowDom: true, - video: false, - chromeWebSecurity: false, - screenshotOnRunFailure: false, - videoUploadOnPasses: false, - waitForAnimations: true, - e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require("./cypress/plugins/index.ts")(on, config); - }, - baseUrl: "http://localhost:8080", - }, -}); diff --git a/cypress.env.json b/cypress.env.json deleted file mode 100644 index 4e5facde..00000000 --- a/cypress.env.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "email": "user@example.com", - "password": "password", - "name": "The Dude", - "emailToken": "000000", - "serverUrl": "http://localhost:3000", - "v3_email": "user2@example.com", - "v3_url": "http://localhost:8081" -} diff --git a/cypress/e2e/01 - signup-login.cy.ts b/cypress/e2e/01 - signup-login.cy.ts deleted file mode 100644 index a53fd3a1..00000000 --- a/cypress/e2e/01 - signup-login.cy.ts +++ /dev/null @@ -1,19 +0,0 @@ -describe("Signup/Login", () => { - const email = `${Math.floor(Math.random() * 1e8)}@example.com`; - - it("can signup without errors", () => { - cy.signup(email); - }); - - it("can login without errors", () => { - cy.login(email); - }); - - it("can lock/unlock without errors", () => { - cy.login(email); - - cy.lock(); - - cy.unlock(email); - }); -}); diff --git a/cypress/e2e/02 - items.cy.ts b/cypress/e2e/02 - items.cy.ts deleted file mode 100644 index f740b2e2..00000000 --- a/cypress/e2e/02 - items.cy.ts +++ /dev/null @@ -1,87 +0,0 @@ -const testItem = { - name: "Google", - username: "example@google.com", - password: "somethingsecret", - url: "https://google.com", -}; - -const itemSearch = { - existing: "secret", - nonexistent: "apple", -}; - -const email = `${Math.floor(Math.random() * 1e8)}@example.com`; - -describe("Items", () => { - it("can create an item without errors", () => { - cy.signup(email); - - // Click plus sign - cy.doWithin(["pl-app", "pl-items", "pl-items-list"], () => cy.get("pl-button:eq(2)").click()); - - // Click create - cy.doWithin(["pl-app", "pl-create-item-dialog"], () => cy.get("footer pl-button.primary").click(), 100); - - cy.url().should("include", "/items/"); - cy.url().should("include", "/new"); - - cy.doWithin( - ["pl-app", "pl-items", "pl-item-view"], - () => { - // Fill in form - cy.typeWithin("pl-input#nameInput", testItem.name, { force: true }); - cy.doWithin(["pl-scroller pl-list pl-field:eq(0)"], () => - cy.typeWithin("pl-input.value-input", testItem.username, { force: true }) - ); - cy.doWithin(["pl-scroller pl-list pl-field:eq(1)"], () => - cy.typeWithin("pl-input.value-input", testItem.password, { force: true }) - ); - cy.doWithin(["pl-scroller pl-list pl-field:eq(2)"], () => - cy.typeWithin("pl-input.value-input", testItem.url, { force: true }) - ); - - // Click save - cy.get("pl-button.primary").click(); - }, - 500 - ); - - cy.url().should("include", "/items/"); - cy.url().should("not.include", "/new"); - }); - - it("can find an an item without errors", () => { - cy.unlock(email); - - cy.doWithin(["pl-app", "pl-items", "pl-items-list"], () => { - // Click search sign - cy.get("pl-button:eq(3)").click(); - - // Find Item - cy.typeWithin("pl-input#filterInput", itemSearch.existing, { force: true }); - - // Confirm we only find one - cy.get("main pl-virtual-list pl-scroller div.content").children("div").should("have.length", 1); - - // Confirm we find the right one - cy.get("main pl-virtual-list pl-scroller") - .find("div.content pl-vault-item-list-item") - .find("div > div > div.semibold") - .should("include.text", testItem.name); - - // Click clear search sign - cy.get("pl-input#filterInput pl-button.slim").click(); - - // Click search sign - cy.get("pl-button:eq(3)").click(); - - // Find non-existent Item - cy.typeWithin("pl-input#filterInput", itemSearch.nonexistent, { force: true }); - - // Confirm we find none - // cy.get("main pl-virtual-list pl-scroller div.content").children("div").should("have.length", 0); - - cy.get("main > div.centering").should("contain.text", "did not match any items"); - }); - }); -}); diff --git a/cypress/e2e/03 - v3-compatibility.cy.ts b/cypress/e2e/03 - v3-compatibility.cy.ts deleted file mode 100644 index cd821f18..00000000 --- a/cypress/e2e/03 - v3-compatibility.cy.ts +++ /dev/null @@ -1,111 +0,0 @@ -const v3_testItem = { - name: "Google", - username: "example@google.com", - password: "somethingsecret", - url: "https://google.com", -}; - -const v3_itemSearch = { - existing: "secret", - nonexistent: "apple", -}; - -const v3_email = `${Math.floor(Math.random() * 1e8)}@example.com`; - -describe("v3 compatibility", () => { - it("can signup without errors", () => { - cy.v3_signup(v3_email); - }); - - it("can login without errors", () => { - cy.v3_login(v3_email); - }); - - it("can lock/unlock without errors", () => { - cy.v3_login(v3_email); - - cy.v3_lock(); - - cy.v3_unlock(v3_email); - }); - - it("can create an item without errors", () => { - cy.v3_login(v3_email); - - // Click plus sign - cy.doWithin(["pl-app", "pl-items-list"], () => cy.get("pl-icon[icon='add']").click()); - - // Click create - cy.doWithin(["pl-app", "pl-create-item-dialog"], () => cy.get(".footer button.primary").click(), 500); - - cy.url().should("match", /\/items\/[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}/); - - cy.doWithin( - ["pl-app", "pl-item-dialog"], - () => { - // Fill in form - cy.typeWithin("pl-input#nameInput", v3_testItem.name, { force: true }); - - cy.doWithin(["pl-field.item:eq(0)"], () => - cy.typeWithin("pl-input.value-input", v3_testItem.username, { force: true }) - ); - - cy.doWithin(["pl-field.item:eq(1)"], () => - cy.typeWithin("pl-input.value-input", v3_testItem.password, { force: true }) - ); - - cy.doWithin(["pl-field.item:eq(2)"], () => - cy.typeWithin("pl-input.value-input", v3_testItem.url, { force: true }) - ); - - // Click save - cy.get("button.primary.save-button").click(); - - // Close dialog - cy.get("pl-icon[icon='close']").click(); - }, - 1500 - ); - - cy.url().should("include", "/items"); - cy.url().should( - "not.match", - /\/items\/[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}/ - ); - }); - - it("can find an an item without errors", () => { - cy.v3_unlock(v3_email); - - cy.doWithin(["pl-app", "pl-items-list"], () => { - // Click search sign - cy.get("header pl-icon[icon='search']").click(); - - // Find Item - cy.typeWithin("pl-input#filterInput", v3_itemSearch.existing, { force: true }); - - // Confirm we only find one - cy.get("#main pl-virtual-list div.content").children(".cell").should("have.length", 1); - - // Confirm we find the right one - cy.get("#main pl-virtual-list div.content .cell .item-header .item-name").should( - "include.text", - v3_testItem.name - ); - - // Click clear search sign - cy.get("header pl-icon[icon='cancel']").click(); - - // Click search sign - cy.get("header pl-icon[icon='search']").click(); - - // Find non-existent Item - cy.typeWithin("pl-input#filterInput", v3_itemSearch.nonexistent, { force: true }); - - // Confirm we find none - cy.get("#main pl-virtual-list div.content").children(".cell").should("have.length", 0); - - cy.get(".empty-placeholder").should("contain.text", "did not match any items"); - }); - }); -}); diff --git a/cypress/e2e/04 - server.cy.ts b/cypress/e2e/04 - server.cy.ts deleted file mode 100644 index 431aa515..00000000 --- a/cypress/e2e/04 - server.cy.ts +++ /dev/null @@ -1,63 +0,0 @@ -describe("Server", () => { - const { serverUrl } = Cypress.env(); - - it("can properly respond to valid and invalid requests", () => { - cy.request({ url: `${serverUrl}/`, method: "GET", failOnStatusCode: false }).then( - (response) => expect(response.status).to.eq(405) // method not allowed - ); - - cy.request({ url: `${serverUrl}/`, method: "PUT", failOnStatusCode: false }).then( - (response) => expect(response.status).to.eq(405) // method not allowed - ); - - cy.request({ url: `${serverUrl}/`, method: "OPTIONS" }); - - cy.request({ url: `${serverUrl}/`, method: "POST", failOnStatusCode: false }).then( - (response) => expect(response.status).to.eq(400) // bad request (no json) - ); - - cy.request({ - url: `${serverUrl}/`, - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ email: "user@example.com" }), - }).then((response) => { - expect(response.status).to.eq(200); - expect(JSON.stringify(response.body)).to.eq( - JSON.stringify({ - result: null, - error: { - code: "invalid_request", - message: "", - }, - kind: "response", - version: "4.0.0", - }) - ); - }); - - cy.request({ - url: `${serverUrl}/`, - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - method: "getAuthInfo", - params: [], - device: {}, - auth: {}, - kind: "request", - version: "4.0.0", - }), - }).then((response) => { - expect(response.status).to.eq(200); - expect(JSON.stringify(response.body)).to.eq( - JSON.stringify({ - result: null, - error: { code: "invalid_session", message: "" }, - kind: "response", - version: "4.0.0", - }) - ); - }); - }); -}); diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json deleted file mode 100644 index 519902d7..00000000 --- a/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} diff --git a/cypress/fixtures/v3-client/021f830e3290aad20514c75c92ab00c9.woff b/cypress/fixtures/v3-client/021f830e3290aad20514c75c92ab00c9.woff deleted file mode 100644 index 8badf54376d122aea83ca2d95dd3b3613caa885f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4492 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 H0>J+OSTtX$ diff --git a/cypress/fixtures/v3-client/2f14cbb7792a42471b1b64de35797d7a.ttf b/cypress/fixtures/v3-client/2f14cbb7792a42471b1b64de35797d7a.ttf deleted file mode 100644 index 048fc76054318932e97e3c7750ab7ece7988d861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110856 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 UiCUdfwK|n*pQ}}8V;$%J123og{r~^~ diff --git a/cypress/fixtures/v3-client/2f7fbbd7d8eee807e437e660436c6033.woff b/cypress/fixtures/v3-client/2f7fbbd7d8eee807e437e660436c6033.woff deleted file mode 100644 index b1e79db9e64afc3f59017bd817e5838fcfd4f168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76632 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
  • _WV`Dqavo7Qe`u5{VwVA!E1D; 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 A^#A|> diff --git a/cypress/fixtures/v3-client/3d1a8e52672c4af418771bcd7e4111f5.eot b/cypress/fixtures/v3-client/3d1a8e52672c4af418771bcd7e4111f5.eot deleted file mode 100644 index 7bc20d4e5fedcc5d08aba1008236287fe465b72d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160768 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 ND$$rgY*OFoe*tVa0k!}D diff --git a/cypress/fixtures/v3-client/49d0dfccb2c7333add0c1277ce21fa1e.svg b/cypress/fixtures/v3-client/49d0dfccb2c7333add0c1277ce21fa1e.svg deleted file mode 100644 index 93217f00..00000000 --- a/cypress/fixtures/v3-client/49d0dfccb2c7333add0c1277ce21fa1e.svg +++ /dev/null @@ -1 +0,0 @@ -Generated by Glyphter \ No newline at end of file diff --git a/cypress/fixtures/v3-client/4d410e4977b3525f9fca202da60d43ed.ttf b/cypress/fixtures/v3-client/4d410e4977b3525f9fca202da60d43ed.ttf deleted file mode 100644 index fc981ce7ad6c42d2384f0ef74b73174b9302ee65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96964 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

    bO)#R zarzLak8t`Vr_XWv_sz#`+U$Id(>I;Yv322Nge>_%4srx8xe zIj!Nek<)fgh0a>G=2uO;bqtxZPrJ?Y@O?Hed@@WKJ*a29xL00JQM$&Mq;JFxps0bkailezmU9|0 zQ|R1AOk}7um98>WrW&EL)JT=B+{Ξ29ypp!R(LOYK$fsCU(S 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 YaFbT>1t<8 diff --git a/cypress/fixtures/v3-client/5503c8e2713e276d4a2cdff45e6991c9.ttf b/cypress/fixtures/v3-client/5503c8e2713e276d4a2cdff45e6991c9.ttf deleted file mode 100644 index efca77b43676d37516ac2d70f80b0c6b656c735b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6552 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cypress/fixtures/v3-client/app_src_elements_app_ts.chunk.js b/cypress/fixtures/v3-client/app_src_elements_app_ts.chunk.js deleted file mode 100644 index cb72445e..00000000 --- a/cypress/fixtures/v3-client/app_src_elements_app_ts.chunk.js +++ /dev/null @@ -1,28151 +0,0 @@ -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["app_src_elements_app_ts"],{ - -/***/ "../core/vendor/jsbn.js": -/*!******************************!*\ - !*** ../core/vendor/jsbn.js ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "BigInteger": () => (/* binding */ BigInteger), -/* harmony export */ "SecureRandom": () => (/* binding */ SecureRandom) -/* harmony export */ }); -// Copyright (c) 2005 Tom Wu -// All Rights Reserved. -// See "LICENSE" for details. - -// Basic JavaScript BN library - subset useful for RSA encryption. - -// Bits per digit -var dbits; - -// JavaScript engine analysis -var canary = 0xdeadbeefcafe; -var j_lm = (canary & 0xffffff) == 0xefcafe; - -// (public) Constructor -function BigInteger(a, b, c) { - if (a != null) - if ("number" == typeof a) this.fromNumber(a, b, c); - else if (b == null && "string" != typeof a) this.fromString(a, 256); - else this.fromString(a, b); -} - -// return new, unset BigInteger -function nbi() { - return new BigInteger(null); -} - -// am: Compute w_j += (x*this_i), propagate carries, -// c is initial carry, returns final carry. -// c < 3*dvalue, x < 2*dvalue, this_i < dvalue -// We need to select the fastest one that works in this environment. - -// am1: use a single mult and divide to get the high bits, -// max digit bits should be 26 because -// max internal value = 2*dvalue^2-2*dvalue (< 2^53) -function am1(i, x, w, j, c, n) { - while (--n >= 0) { - var v = x * this[i++] + w[j] + c; - c = Math.floor(v / 0x4000000); - w[j++] = v & 0x3ffffff; - } - return c; -} -// am2 avoids a big mult-and-extract completely. -// Max digit bits should be <= 30 because we do bitwise ops -// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) -function am2(i, x, w, j, c, n) { - var xl = x & 0x7fff, - xh = x >> 15; - while (--n >= 0) { - var l = this[i] & 0x7fff; - var h = this[i++] >> 15; - var m = xh * l + h * xl; - l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); - c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); - w[j++] = l & 0x3fffffff; - } - return c; -} -// Alternately, set max digit bits to 28 since some -// browsers slow down when dealing with 32-bit numbers. -function am3(i, x, w, j, c, n) { - var xl = x & 0x3fff, - xh = x >> 14; - while (--n >= 0) { - var l = this[i] & 0x3fff; - var h = this[i++] >> 14; - var m = xh * l + h * xl; - l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; - c = (l >> 28) + (m >> 14) + xh * h; - w[j++] = l & 0xfffffff; - } - return c; -} -var inBrowser = typeof navigator !== "undefined"; -if (inBrowser && j_lm && navigator.appName == "Microsoft Internet Explorer") { - BigInteger.prototype.am = am2; - dbits = 30; -} else if (inBrowser && j_lm && navigator.appName != "Netscape") { - BigInteger.prototype.am = am1; - dbits = 26; -} else { - // Mozilla/Netscape seems to prefer am3 - BigInteger.prototype.am = am3; - dbits = 28; -} - -BigInteger.prototype.DB = dbits; -BigInteger.prototype.DM = (1 << dbits) - 1; -BigInteger.prototype.DV = 1 << dbits; - -var BI_FP = 52; -BigInteger.prototype.FV = Math.pow(2, BI_FP); -BigInteger.prototype.F1 = BI_FP - dbits; -BigInteger.prototype.F2 = 2 * dbits - BI_FP; - -// Digit conversions -var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; -var BI_RC = new Array(); -var rr, vv; -rr = "0".charCodeAt(0); -for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; -rr = "a".charCodeAt(0); -for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; -rr = "A".charCodeAt(0); -for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; - -function int2char(n) { - return BI_RM.charAt(n); -} -function intAt(s, i) { - var c = BI_RC[s.charCodeAt(i)]; - return c == null ? -1 : c; -} - -// (protected) copy this to r -function bnpCopyTo(r) { - for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; - r.t = this.t; - r.s = this.s; -} - -// (protected) set from integer value x, -DV <= x < DV -function bnpFromInt(x) { - this.t = 1; - this.s = x < 0 ? -1 : 0; - if (x > 0) this[0] = x; - else if (x < -1) this[0] = x + this.DV; - else this.t = 0; -} - -// return bigint initialized to value -function nbv(i) { - var r = nbi(); - r.fromInt(i); - return r; -} - -// (protected) set from string and radix -function bnpFromString(s, b) { - var k; - if (b == 16) k = 4; - else if (b == 8) k = 3; - else if (b == 256) k = 8; - // byte array - else if (b == 2) k = 1; - else if (b == 32) k = 5; - else if (b == 4) k = 2; - else { - this.fromRadix(s, b); - return; - } - this.t = 0; - this.s = 0; - var i = s.length, - mi = false, - sh = 0; - while (--i >= 0) { - var x = k == 8 ? s[i] & 0xff : intAt(s, i); - if (x < 0) { - if (s.charAt(i) == "-") mi = true; - continue; - } - mi = false; - if (sh == 0) this[this.t++] = x; - else if (sh + k > this.DB) { - this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; - this[this.t++] = x >> (this.DB - sh); - } else this[this.t - 1] |= x << sh; - sh += k; - if (sh >= this.DB) sh -= this.DB; - } - if (k == 8 && (s[0] & 0x80) != 0) { - this.s = -1; - if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; - } - this.clamp(); - if (mi) BigInteger.ZERO.subTo(this, this); -} - -// (protected) clamp off excess high words -function bnpClamp() { - var c = this.s & this.DM; - while (this.t > 0 && this[this.t - 1] == c) --this.t; -} - -// (public) return string representation in given radix -function bnToString(b) { - if (this.s < 0) return "-" + this.negate().toString(b); - var k; - if (b == 16) k = 4; - else if (b == 8) k = 3; - else if (b == 2) k = 1; - else if (b == 32) k = 5; - else if (b == 4) k = 2; - else return this.toRadix(b); - var km = (1 << k) - 1, - d, - m = false, - r = "", - i = this.t; - var p = this.DB - ((i * this.DB) % k); - if (i-- > 0) { - if (p < this.DB && (d = this[i] >> p) > 0) { - m = true; - r = int2char(d); - } - while (i >= 0) { - if (p < k) { - d = (this[i] & ((1 << p) - 1)) << (k - p); - d |= this[--i] >> (p += this.DB - k); - } else { - d = (this[i] >> (p -= k)) & km; - if (p <= 0) { - p += this.DB; - --i; - } - } - if (d > 0) m = true; - if (m) r += int2char(d); - } - } - return m ? r : "0"; -} - -// (public) -this -function bnNegate() { - var r = nbi(); - BigInteger.ZERO.subTo(this, r); - return r; -} - -// (public) |this| -function bnAbs() { - return this.s < 0 ? this.negate() : this; -} - -// (public) return + if this > a, - if this < a, 0 if equal -function bnCompareTo(a) { - var r = this.s - a.s; - if (r != 0) return r; - var i = this.t; - r = i - a.t; - if (r != 0) return this.s < 0 ? -r : r; - while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; - return 0; -} - -// returns bit length of the integer x -function nbits(x) { - var r = 1, - t; - if ((t = x >>> 16) != 0) { - x = t; - r += 16; - } - if ((t = x >> 8) != 0) { - x = t; - r += 8; - } - if ((t = x >> 4) != 0) { - x = t; - r += 4; - } - if ((t = x >> 2) != 0) { - x = t; - r += 2; - } - if ((t = x >> 1) != 0) { - x = t; - r += 1; - } - return r; -} - -// (public) return the number of bits in "this" -function bnBitLength() { - if (this.t <= 0) return 0; - return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)); -} - -// (protected) r = this << n*DB -function bnpDLShiftTo(n, r) { - var i; - for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; - for (i = n - 1; i >= 0; --i) r[i] = 0; - r.t = this.t + n; - r.s = this.s; -} - -// (protected) r = this >> n*DB -function bnpDRShiftTo(n, r) { - for (var i = n; i < this.t; ++i) r[i - n] = this[i]; - r.t = Math.max(this.t - n, 0); - r.s = this.s; -} - -// (protected) r = this << n -function bnpLShiftTo(n, r) { - var bs = n % this.DB; - var cbs = this.DB - bs; - var bm = (1 << cbs) - 1; - var ds = Math.floor(n / this.DB), - c = (this.s << bs) & this.DM, - i; - for (i = this.t - 1; i >= 0; --i) { - r[i + ds + 1] = (this[i] >> cbs) | c; - c = (this[i] & bm) << bs; - } - for (i = ds - 1; i >= 0; --i) r[i] = 0; - r[ds] = c; - r.t = this.t + ds + 1; - r.s = this.s; - r.clamp(); -} - -// (protected) r = this >> n -function bnpRShiftTo(n, r) { - r.s = this.s; - var ds = Math.floor(n / this.DB); - if (ds >= this.t) { - r.t = 0; - return; - } - var bs = n % this.DB; - var cbs = this.DB - bs; - var bm = (1 << bs) - 1; - r[0] = this[ds] >> bs; - for (var i = ds + 1; i < this.t; ++i) { - r[i - ds - 1] |= (this[i] & bm) << cbs; - r[i - ds] = this[i] >> bs; - } - if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; - r.t = this.t - ds; - r.clamp(); -} - -// (protected) r = this - a -function bnpSubTo(a, r) { - var i = 0, - c = 0, - m = Math.min(a.t, this.t); - while (i < m) { - c += this[i] - a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - if (a.t < this.t) { - c -= a.s; - while (i < this.t) { - c += this[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += this.s; - } else { - c += this.s; - while (i < a.t) { - c -= a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c -= a.s; - } - r.s = c < 0 ? -1 : 0; - if (c < -1) r[i++] = this.DV + c; - else if (c > 0) r[i++] = c; - r.t = i; - r.clamp(); -} - -// (protected) r = this * a, r != this,a (HAC 14.12) -// "this" should be the larger one if appropriate. -function bnpMultiplyTo(a, r) { - var x = this.abs(), - y = a.abs(); - var i = x.t; - r.t = i + y.t; - while (--i >= 0) r[i] = 0; - for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); - r.s = 0; - r.clamp(); - if (this.s != a.s) BigInteger.ZERO.subTo(r, r); -} - -// (protected) r = this^2, r != this (HAC 14.16) -function bnpSquareTo(r) { - var x = this.abs(); - var i = (r.t = 2 * x.t); - while (--i >= 0) r[i] = 0; - for (i = 0; i < x.t - 1; ++i) { - var c = x.am(i, x[i], r, 2 * i, 0, 1); - if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { - r[i + x.t] -= x.DV; - r[i + x.t + 1] = 1; - } - } - if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); - r.s = 0; - r.clamp(); -} - -// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) -// r != q, this != m. q or r may be null. -function bnpDivRemTo(m, q, r) { - var pm = m.abs(); - if (pm.t <= 0) return; - var pt = this.abs(); - if (pt.t < pm.t) { - if (q != null) q.fromInt(0); - if (r != null) this.copyTo(r); - return; - } - if (r == null) r = nbi(); - var y = nbi(), - ts = this.s, - ms = m.s; - var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus - if (nsh > 0) { - pm.lShiftTo(nsh, y); - pt.lShiftTo(nsh, r); - } else { - pm.copyTo(y); - pt.copyTo(r); - } - var ys = y.t; - var y0 = y[ys - 1]; - if (y0 == 0) return; - var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0); - var d1 = this.FV / yt, - d2 = (1 << this.F1) / yt, - e = 1 << this.F2; - var i = r.t, - j = i - ys, - t = q == null ? nbi() : q; - y.dlShiftTo(j, t); - if (r.compareTo(t) >= 0) { - r[r.t++] = 1; - r.subTo(t, r); - } - BigInteger.ONE.dlShiftTo(ys, t); - t.subTo(y, y); // "negative" y so we can replace sub with am later - while (y.t < ys) y[y.t++] = 0; - while (--j >= 0) { - // Estimate quotient digit - var qd = r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); - if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { - // Try it out - y.dlShiftTo(j, t); - r.subTo(t, r); - while (r[i] < --qd) r.subTo(t, r); - } - } - if (q != null) { - r.drShiftTo(ys, q); - if (ts != ms) BigInteger.ZERO.subTo(q, q); - } - r.t = ys; - r.clamp(); - if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder - if (ts < 0) BigInteger.ZERO.subTo(r, r); -} - -// (public) this mod a -function bnMod(a) { - var r = nbi(); - this.abs().divRemTo(a, null, r); - if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); - return r; -} - -// Modular reduction using "classic" algorithm -function Classic(m) { - this.m = m; -} -function cConvert(x) { - if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); - else return x; -} -function cRevert(x) { - return x; -} -function cReduce(x) { - x.divRemTo(this.m, null, x); -} -function cMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); -} -function cSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); -} - -Classic.prototype.convert = cConvert; -Classic.prototype.revert = cRevert; -Classic.prototype.reduce = cReduce; -Classic.prototype.mulTo = cMulTo; -Classic.prototype.sqrTo = cSqrTo; - -// (protected) return "-1/this % 2^DB"; useful for Mont. reduction -// justification: -// xy == 1 (mod m) -// xy = 1+km -// xy(2-xy) = (1+km)(1-km) -// x[y(2-xy)] = 1-k^2m^2 -// x[y(2-xy)] == 1 (mod m^2) -// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 -// should reduce x and y(2-xy) by m^2 at each step to keep size bounded. -// JS multiply "overflows" differently from C/C++, so care is needed here. -function bnpInvDigit() { - if (this.t < 1) return 0; - var x = this[0]; - if ((x & 1) == 0) return 0; - var y = x & 3; // y == 1/x mod 2^2 - y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 - y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 - y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 - // last step - calculate inverse mod DV directly; - // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints - y = (y * (2 - ((x * y) % this.DV))) % this.DV; // y == 1/x mod 2^dbits - // we really want the negative inverse, and -DV < y < DV - return y > 0 ? this.DV - y : -y; -} - -// Montgomery reduction -function Montgomery(m) { - this.m = m; - this.mp = m.invDigit(); - this.mpl = this.mp & 0x7fff; - this.mph = this.mp >> 15; - this.um = (1 << (m.DB - 15)) - 1; - this.mt2 = 2 * m.t; -} - -// xR mod m -function montConvert(x) { - var r = nbi(); - x.abs().dlShiftTo(this.m.t, r); - r.divRemTo(this.m, null, r); - if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); - return r; -} - -// x/R mod m -function montRevert(x) { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; -} - -// x = x/R mod m (HAC 14.32) -function montReduce(x) { - while ( - x.t <= this.mt2 // pad x so am has enough room later - ) - x[x.t++] = 0; - for (var i = 0; i < this.m.t; ++i) { - // faster way of calculating u0 = x[i]*mp mod DV - var j = x[i] & 0x7fff; - var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM; - // use am to combine the multiply-shift-add into one call - j = i + this.m.t; - x[j] += this.m.am(0, u0, x, i, 0, this.m.t); - // propagate carry - while (x[j] >= x.DV) { - x[j] -= x.DV; - x[++j]++; - } - } - x.clamp(); - x.drShiftTo(this.m.t, x); - if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); -} - -// r = "x^2/R mod m"; x != r -function montSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); -} - -// r = "xy/R mod m"; x,y != r -function montMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); -} - -Montgomery.prototype.convert = montConvert; -Montgomery.prototype.revert = montRevert; -Montgomery.prototype.reduce = montReduce; -Montgomery.prototype.mulTo = montMulTo; -Montgomery.prototype.sqrTo = montSqrTo; - -// (protected) true iff this is even -function bnpIsEven() { - return (this.t > 0 ? this[0] & 1 : this.s) == 0; -} - -// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) -function bnpExp(e, z) { - if (e > 0xffffffff || e < 1) return BigInteger.ONE; - var r = nbi(), - r2 = nbi(), - g = z.convert(this), - i = nbits(e) - 1; - g.copyTo(r); - while (--i >= 0) { - z.sqrTo(r, r2); - if ((e & (1 << i)) > 0) z.mulTo(r2, g, r); - else { - var t = r; - r = r2; - r2 = t; - } - } - return z.revert(r); -} - -// (public) this^e % m, 0 <= e < 2^32 -function bnModPowInt(e, m) { - var z; - if (e < 256 || m.isEven()) z = new Classic(m); - else z = new Montgomery(m); - return this.exp(e, z); -} - -// protected -BigInteger.prototype.copyTo = bnpCopyTo; -BigInteger.prototype.fromInt = bnpFromInt; -BigInteger.prototype.fromString = bnpFromString; -BigInteger.prototype.clamp = bnpClamp; -BigInteger.prototype.dlShiftTo = bnpDLShiftTo; -BigInteger.prototype.drShiftTo = bnpDRShiftTo; -BigInteger.prototype.lShiftTo = bnpLShiftTo; -BigInteger.prototype.rShiftTo = bnpRShiftTo; -BigInteger.prototype.subTo = bnpSubTo; -BigInteger.prototype.multiplyTo = bnpMultiplyTo; -BigInteger.prototype.squareTo = bnpSquareTo; -BigInteger.prototype.divRemTo = bnpDivRemTo; -BigInteger.prototype.invDigit = bnpInvDigit; -BigInteger.prototype.isEven = bnpIsEven; -BigInteger.prototype.exp = bnpExp; - -// public -BigInteger.prototype.toString = bnToString; -BigInteger.prototype.negate = bnNegate; -BigInteger.prototype.abs = bnAbs; -BigInteger.prototype.compareTo = bnCompareTo; -BigInteger.prototype.bitLength = bnBitLength; -BigInteger.prototype.mod = bnMod; -BigInteger.prototype.modPowInt = bnModPowInt; - -// "constants" -BigInteger.ZERO = nbv(0); -BigInteger.ONE = nbv(1); - -// Copyright (c) 2005-2009 Tom Wu -// All Rights Reserved. -// See "LICENSE" for details. - -// Extended JavaScript BN functions, required for RSA private ops. - -// Version 1.1: new BigInteger("0", 10) returns "proper" zero -// Version 1.2: square() API, isProbablePrime fix - -// (public) -function bnClone() { - var r = nbi(); - this.copyTo(r); - return r; -} - -// (public) return value as integer -function bnIntValue() { - if (this.s < 0) { - if (this.t == 1) return this[0] - this.DV; - else if (this.t == 0) return -1; - } else if (this.t == 1) return this[0]; - else if (this.t == 0) return 0; - // assumes 16 < DB < 32 - return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; -} - -// (public) return value as byte -function bnByteValue() { - return this.t == 0 ? this.s : (this[0] << 24) >> 24; -} - -// (public) return value as short (assumes DB>=16) -function bnShortValue() { - return this.t == 0 ? this.s : (this[0] << 16) >> 16; -} - -// (protected) return x s.t. r^x < DV -function bnpChunkSize(r) { - return Math.floor((Math.LN2 * this.DB) / Math.log(r)); -} - -// (public) 0 if this == 0, 1 if this > 0 -function bnSigNum() { - if (this.s < 0) return -1; - else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; - else return 1; -} - -// (protected) convert to radix string -function bnpToRadix(b) { - if (b == null) b = 10; - if (this.signum() == 0 || b < 2 || b > 36) return "0"; - var cs = this.chunkSize(b); - var a = Math.pow(b, cs); - var d = nbv(a), - y = nbi(), - z = nbi(), - r = ""; - this.divRemTo(d, y, z); - while (y.signum() > 0) { - r = (a + z.intValue()).toString(b).substr(1) + r; - y.divRemTo(d, y, z); - } - return z.intValue().toString(b) + r; -} - -// (protected) convert from radix string -function bnpFromRadix(s, b) { - this.fromInt(0); - if (b == null) b = 10; - var cs = this.chunkSize(b); - var d = Math.pow(b, cs), - mi = false, - j = 0, - w = 0; - for (var i = 0; i < s.length; ++i) { - var x = intAt(s, i); - if (x < 0) { - if (s.charAt(i) == "-" && this.signum() == 0) mi = true; - continue; - } - w = b * w + x; - if (++j >= cs) { - this.dMultiply(d); - this.dAddOffset(w, 0); - j = 0; - w = 0; - } - } - if (j > 0) { - this.dMultiply(Math.pow(b, j)); - this.dAddOffset(w, 0); - } - if (mi) BigInteger.ZERO.subTo(this, this); -} - -// (protected) alternate constructor -function bnpFromNumber(a, b, c) { - if ("number" == typeof b) { - // new BigInteger(int,int,RNG) - if (a < 2) this.fromInt(1); - else { - this.fromNumber(a, c); - if (!this.testBit(a - 1)) - // force MSB set - this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); - if (this.isEven()) this.dAddOffset(1, 0); // force odd - while (!this.isProbablePrime(b)) { - this.dAddOffset(2, 0); - if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); - } - } - } else { - // new BigInteger(int,RNG) - var x = new Array(), - t = a & 7; - x.length = (a >> 3) + 1; - b.nextBytes(x); - if (t > 0) x[0] &= (1 << t) - 1; - else x[0] = 0; - this.fromString(x, 256); - } -} - -// (public) convert to bigendian byte array -function bnToByteArray() { - var i = this.t, - r = new Array(); - r[0] = this.s; - var p = this.DB - ((i * this.DB) % 8), - d, - k = 0; - if (i-- > 0) { - if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) r[k++] = d | (this.s << (this.DB - p)); - while (i >= 0) { - if (p < 8) { - d = (this[i] & ((1 << p) - 1)) << (8 - p); - d |= this[--i] >> (p += this.DB - 8); - } else { - d = (this[i] >> (p -= 8)) & 0xff; - if (p <= 0) { - p += this.DB; - --i; - } - } - if ((d & 0x80) != 0) d |= -256; - if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k; - if (k > 0 || d != this.s) r[k++] = d; - } - } - return r; -} - -function bnEquals(a) { - return this.compareTo(a) == 0; -} -function bnMin(a) { - return this.compareTo(a) < 0 ? this : a; -} -function bnMax(a) { - return this.compareTo(a) > 0 ? this : a; -} - -// (protected) r = this op a (bitwise) -function bnpBitwiseTo(a, op, r) { - var i, - f, - m = Math.min(a.t, this.t); - for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); - if (a.t < this.t) { - f = a.s & this.DM; - for (i = m; i < this.t; ++i) r[i] = op(this[i], f); - r.t = this.t; - } else { - f = this.s & this.DM; - for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); - r.t = a.t; - } - r.s = op(this.s, a.s); - r.clamp(); -} - -// (public) this & a -function op_and(x, y) { - return x & y; -} -function bnAnd(a) { - var r = nbi(); - this.bitwiseTo(a, op_and, r); - return r; -} - -// (public) this | a -function op_or(x, y) { - return x | y; -} -function bnOr(a) { - var r = nbi(); - this.bitwiseTo(a, op_or, r); - return r; -} - -// (public) this ^ a -function op_xor(x, y) { - return x ^ y; -} -function bnXor(a) { - var r = nbi(); - this.bitwiseTo(a, op_xor, r); - return r; -} - -// (public) this & ~a -function op_andnot(x, y) { - return x & ~y; -} -function bnAndNot(a) { - var r = nbi(); - this.bitwiseTo(a, op_andnot, r); - return r; -} - -// (public) ~this -function bnNot() { - var r = nbi(); - for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; - r.t = this.t; - r.s = ~this.s; - return r; -} - -// (public) this << n -function bnShiftLeft(n) { - var r = nbi(); - if (n < 0) this.rShiftTo(-n, r); - else this.lShiftTo(n, r); - return r; -} - -// (public) this >> n -function bnShiftRight(n) { - var r = nbi(); - if (n < 0) this.lShiftTo(-n, r); - else this.rShiftTo(n, r); - return r; -} - -// return index of lowest 1-bit in x, x < 2^31 -function lbit(x) { - if (x == 0) return -1; - var r = 0; - if ((x & 0xffff) == 0) { - x >>= 16; - r += 16; - } - if ((x & 0xff) == 0) { - x >>= 8; - r += 8; - } - if ((x & 0xf) == 0) { - x >>= 4; - r += 4; - } - if ((x & 3) == 0) { - x >>= 2; - r += 2; - } - if ((x & 1) == 0) ++r; - return r; -} - -// (public) returns index of lowest 1-bit (or -1 if none) -function bnGetLowestSetBit() { - for (var i = 0; i < this.t; ++i) if (this[i] != 0) return i * this.DB + lbit(this[i]); - if (this.s < 0) return this.t * this.DB; - return -1; -} - -// return number of 1 bits in x -function cbit(x) { - var r = 0; - while (x != 0) { - x &= x - 1; - ++r; - } - return r; -} - -// (public) return number of set bits -function bnBitCount() { - var r = 0, - x = this.s & this.DM; - for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); - return r; -} - -// (public) true iff nth bit is set -function bnTestBit(n) { - var j = Math.floor(n / this.DB); - if (j >= this.t) return this.s != 0; - return (this[j] & (1 << n % this.DB)) != 0; -} - -// (protected) this op (1<>= this.DB; - } - if (a.t < this.t) { - c += a.s; - while (i < this.t) { - c += this[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += this.s; - } else { - c += this.s; - while (i < a.t) { - c += a[i]; - r[i++] = c & this.DM; - c >>= this.DB; - } - c += a.s; - } - r.s = c < 0 ? -1 : 0; - if (c > 0) r[i++] = c; - else if (c < -1) r[i++] = this.DV + c; - r.t = i; - r.clamp(); -} - -// (public) this + a -function bnAdd(a) { - var r = nbi(); - this.addTo(a, r); - return r; -} - -// (public) this - a -function bnSubtract(a) { - var r = nbi(); - this.subTo(a, r); - return r; -} - -// (public) this * a -function bnMultiply(a) { - var r = nbi(); - this.multiplyTo(a, r); - return r; -} - -// (public) this^2 -function bnSquare() { - var r = nbi(); - this.squareTo(r); - return r; -} - -// (public) this / a -function bnDivide(a) { - var r = nbi(); - this.divRemTo(a, r, null); - return r; -} - -// (public) this % a -function bnRemainder(a) { - var r = nbi(); - this.divRemTo(a, null, r); - return r; -} - -// (public) [this/a,this%a] -function bnDivideAndRemainder(a) { - var q = nbi(), - r = nbi(); - this.divRemTo(a, q, r); - return new Array(q, r); -} - -// (protected) this *= n, this >= 0, 1 < n < DV -function bnpDMultiply(n) { - this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); - ++this.t; - this.clamp(); -} - -// (protected) this += n << w words, this >= 0 -function bnpDAddOffset(n, w) { - if (n == 0) return; - while (this.t <= w) this[this.t++] = 0; - this[w] += n; - while (this[w] >= this.DV) { - this[w] -= this.DV; - if (++w >= this.t) this[this.t++] = 0; - ++this[w]; - } -} - -// A "null" reducer -function NullExp() {} -function nNop(x) { - return x; -} -function nMulTo(x, y, r) { - x.multiplyTo(y, r); -} -function nSqrTo(x, r) { - x.squareTo(r); -} - -NullExp.prototype.convert = nNop; -NullExp.prototype.revert = nNop; -NullExp.prototype.mulTo = nMulTo; -NullExp.prototype.sqrTo = nSqrTo; - -// (public) this^e -function bnPow(e) { - return this.exp(e, new NullExp()); -} - -// (protected) r = lower n words of "this * a", a.t <= n -// "this" should be the larger one if appropriate. -function bnpMultiplyLowerTo(a, n, r) { - var i = Math.min(this.t + a.t, n); - r.s = 0; // assumes a,this >= 0 - r.t = i; - while (i > 0) r[--i] = 0; - var j; - for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); - for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); - r.clamp(); -} - -// (protected) r = "this * a" without lower n words, n > 0 -// "this" should be the larger one if appropriate. -function bnpMultiplyUpperTo(a, n, r) { - --n; - var i = (r.t = this.t + a.t - n); - r.s = 0; // assumes a,this >= 0 - while (--i >= 0) r[i] = 0; - for (i = Math.max(n - this.t, 0); i < a.t; ++i) r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); - r.clamp(); - r.drShiftTo(1, r); -} - -// Barrett modular reduction -function Barrett(m) { - // setup Barrett - this.r2 = nbi(); - this.q3 = nbi(); - BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); - this.mu = this.r2.divide(m); - this.m = m; -} - -function barrettConvert(x) { - if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); - else if (x.compareTo(this.m) < 0) return x; - else { - var r = nbi(); - x.copyTo(r); - this.reduce(r); - return r; - } -} - -function barrettRevert(x) { - return x; -} - -// x = x mod m (HAC 14.42) -function barrettReduce(x) { - x.drShiftTo(this.m.t - 1, this.r2); - if (x.t > this.m.t + 1) { - x.t = this.m.t + 1; - x.clamp(); - } - this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); - this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); - while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); - x.subTo(this.r2, x); - while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); -} - -// r = x^2 mod m; x != r -function barrettSqrTo(x, r) { - x.squareTo(r); - this.reduce(r); -} - -// r = x*y mod m; x,y != r -function barrettMulTo(x, y, r) { - x.multiplyTo(y, r); - this.reduce(r); -} - -Barrett.prototype.convert = barrettConvert; -Barrett.prototype.revert = barrettRevert; -Barrett.prototype.reduce = barrettReduce; -Barrett.prototype.mulTo = barrettMulTo; -Barrett.prototype.sqrTo = barrettSqrTo; - -// (public) this^e % m (HAC 14.85) -function bnModPow(e, m) { - var i = e.bitLength(), - k, - r = nbv(1), - z; - if (i <= 0) return r; - else if (i < 18) k = 1; - else if (i < 48) k = 3; - else if (i < 144) k = 4; - else if (i < 768) k = 5; - else k = 6; - if (i < 8) z = new Classic(m); - else if (m.isEven()) z = new Barrett(m); - else z = new Montgomery(m); - - // precomputation - var g = new Array(), - n = 3, - k1 = k - 1, - km = (1 << k) - 1; - g[1] = z.convert(this); - if (k > 1) { - var g2 = nbi(); - z.sqrTo(g[1], g2); - while (n <= km) { - g[n] = nbi(); - z.mulTo(g2, g[n - 2], g[n]); - n += 2; - } - } - - var j = e.t - 1, - w, - is1 = true, - r2 = nbi(), - t; - i = nbits(e[j]) - 1; - while (j >= 0) { - if (i >= k1) w = (e[j] >> (i - k1)) & km; - else { - w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); - if (j > 0) w |= e[j - 1] >> (this.DB + i - k1); - } - - n = k; - while ((w & 1) == 0) { - w >>= 1; - --n; - } - if ((i -= n) < 0) { - i += this.DB; - --j; - } - if (is1) { - // ret == 1, don't bother squaring or multiplying it - g[w].copyTo(r); - is1 = false; - } else { - while (n > 1) { - z.sqrTo(r, r2); - z.sqrTo(r2, r); - n -= 2; - } - if (n > 0) z.sqrTo(r, r2); - else { - t = r; - r = r2; - r2 = t; - } - z.mulTo(r2, g[w], r); - } - - while (j >= 0 && (e[j] & (1 << i)) == 0) { - z.sqrTo(r, r2); - t = r; - r = r2; - r2 = t; - if (--i < 0) { - i = this.DB - 1; - --j; - } - } - } - return z.revert(r); -} - -// (public) gcd(this,a) (HAC 14.54) -function bnGCD(a) { - var x = this.s < 0 ? this.negate() : this.clone(); - var y = a.s < 0 ? a.negate() : a.clone(); - if (x.compareTo(y) < 0) { - var t = x; - x = y; - y = t; - } - var i = x.getLowestSetBit(), - g = y.getLowestSetBit(); - if (g < 0) return x; - if (i < g) g = i; - if (g > 0) { - x.rShiftTo(g, x); - y.rShiftTo(g, y); - } - while (x.signum() > 0) { - if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); - if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); - if (x.compareTo(y) >= 0) { - x.subTo(y, x); - x.rShiftTo(1, x); - } else { - y.subTo(x, y); - y.rShiftTo(1, y); - } - } - if (g > 0) y.lShiftTo(g, y); - return y; -} - -// (protected) this % n, n < 2^26 -function bnpModInt(n) { - if (n <= 0) return 0; - var d = this.DV % n, - r = this.s < 0 ? n - 1 : 0; - if (this.t > 0) - if (d == 0) r = this[0] % n; - else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; - return r; -} - -// (public) 1/this % m (HAC 14.61) -function bnModInverse(m) { - var ac = m.isEven(); - if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; - var u = m.clone(), - v = this.clone(); - var a = nbv(1), - b = nbv(0), - c = nbv(0), - d = nbv(1); - while (u.signum() != 0) { - while (u.isEven()) { - u.rShiftTo(1, u); - if (ac) { - if (!a.isEven() || !b.isEven()) { - a.addTo(this, a); - b.subTo(m, b); - } - a.rShiftTo(1, a); - } else if (!b.isEven()) b.subTo(m, b); - b.rShiftTo(1, b); - } - while (v.isEven()) { - v.rShiftTo(1, v); - if (ac) { - if (!c.isEven() || !d.isEven()) { - c.addTo(this, c); - d.subTo(m, d); - } - c.rShiftTo(1, c); - } else if (!d.isEven()) d.subTo(m, d); - d.rShiftTo(1, d); - } - if (u.compareTo(v) >= 0) { - u.subTo(v, u); - if (ac) a.subTo(c, a); - b.subTo(d, b); - } else { - v.subTo(u, v); - if (ac) c.subTo(a, c); - d.subTo(b, d); - } - } - if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; - if (d.compareTo(m) >= 0) return d.subtract(m); - if (d.signum() < 0) d.addTo(m, d); - else return d; - if (d.signum() < 0) return d.add(m); - else return d; -} - -var lowprimes = [ - 2, - 3, - 5, - 7, - 11, - 13, - 17, - 19, - 23, - 29, - 31, - 37, - 41, - 43, - 47, - 53, - 59, - 61, - 67, - 71, - 73, - 79, - 83, - 89, - 97, - 101, - 103, - 107, - 109, - 113, - 127, - 131, - 137, - 139, - 149, - 151, - 157, - 163, - 167, - 173, - 179, - 181, - 191, - 193, - 197, - 199, - 211, - 223, - 227, - 229, - 233, - 239, - 241, - 251, - 257, - 263, - 269, - 271, - 277, - 281, - 283, - 293, - 307, - 311, - 313, - 317, - 331, - 337, - 347, - 349, - 353, - 359, - 367, - 373, - 379, - 383, - 389, - 397, - 401, - 409, - 419, - 421, - 431, - 433, - 439, - 443, - 449, - 457, - 461, - 463, - 467, - 479, - 487, - 491, - 499, - 503, - 509, - 521, - 523, - 541, - 547, - 557, - 563, - 569, - 571, - 577, - 587, - 593, - 599, - 601, - 607, - 613, - 617, - 619, - 631, - 641, - 643, - 647, - 653, - 659, - 661, - 673, - 677, - 683, - 691, - 701, - 709, - 719, - 727, - 733, - 739, - 743, - 751, - 757, - 761, - 769, - 773, - 787, - 797, - 809, - 811, - 821, - 823, - 827, - 829, - 839, - 853, - 857, - 859, - 863, - 877, - 881, - 883, - 887, - 907, - 911, - 919, - 929, - 937, - 941, - 947, - 953, - 967, - 971, - 977, - 983, - 991, - 997 -]; -var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; - -// (public) test primality with certainty >= 1-.5^t -function bnIsProbablePrime(t) { - var i, - x = this.abs(); - if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { - for (i = 0; i < lowprimes.length; ++i) if (x[0] == lowprimes[i]) return true; - return false; - } - if (x.isEven()) return false; - i = 1; - while (i < lowprimes.length) { - var m = lowprimes[i], - j = i + 1; - while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; - m = x.modInt(m); - while (i < j) if (m % lowprimes[i++] == 0) return false; - } - return x.millerRabin(t); -} - -// (protected) true if probably prime (HAC 4.24, Miller-Rabin) -function bnpMillerRabin(t) { - var n1 = this.subtract(BigInteger.ONE); - var k = n1.getLowestSetBit(); - if (k <= 0) return false; - var r = n1.shiftRight(k); - t = (t + 1) >> 1; - if (t > lowprimes.length) t = lowprimes.length; - var a = nbi(); - for (var i = 0; i < t; ++i) { - //Pick bases at random, instead of starting at 2 - a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); - var y = a.modPow(r, this); - if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { - var j = 1; - while (j++ < k && y.compareTo(n1) != 0) { - y = y.modPowInt(2, this); - if (y.compareTo(BigInteger.ONE) == 0) return false; - } - if (y.compareTo(n1) != 0) return false; - } - } - return true; -} - -// protected -BigInteger.prototype.chunkSize = bnpChunkSize; -BigInteger.prototype.toRadix = bnpToRadix; -BigInteger.prototype.fromRadix = bnpFromRadix; -BigInteger.prototype.fromNumber = bnpFromNumber; -BigInteger.prototype.bitwiseTo = bnpBitwiseTo; -BigInteger.prototype.changeBit = bnpChangeBit; -BigInteger.prototype.addTo = bnpAddTo; -BigInteger.prototype.dMultiply = bnpDMultiply; -BigInteger.prototype.dAddOffset = bnpDAddOffset; -BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; -BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; -BigInteger.prototype.modInt = bnpModInt; -BigInteger.prototype.millerRabin = bnpMillerRabin; - -// public -BigInteger.prototype.clone = bnClone; -BigInteger.prototype.intValue = bnIntValue; -BigInteger.prototype.byteValue = bnByteValue; -BigInteger.prototype.shortValue = bnShortValue; -BigInteger.prototype.signum = bnSigNum; -BigInteger.prototype.toByteArray = bnToByteArray; -BigInteger.prototype.equals = bnEquals; -BigInteger.prototype.min = bnMin; -BigInteger.prototype.max = bnMax; -BigInteger.prototype.and = bnAnd; -BigInteger.prototype.or = bnOr; -BigInteger.prototype.xor = bnXor; -BigInteger.prototype.andNot = bnAndNot; -BigInteger.prototype.not = bnNot; -BigInteger.prototype.shiftLeft = bnShiftLeft; -BigInteger.prototype.shiftRight = bnShiftRight; -BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; -BigInteger.prototype.bitCount = bnBitCount; -BigInteger.prototype.testBit = bnTestBit; -BigInteger.prototype.setBit = bnSetBit; -BigInteger.prototype.clearBit = bnClearBit; -BigInteger.prototype.flipBit = bnFlipBit; -BigInteger.prototype.add = bnAdd; -BigInteger.prototype.subtract = bnSubtract; -BigInteger.prototype.multiply = bnMultiply; -BigInteger.prototype.divide = bnDivide; -BigInteger.prototype.remainder = bnRemainder; -BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; -BigInteger.prototype.modPow = bnModPow; -BigInteger.prototype.modInverse = bnModInverse; -BigInteger.prototype.pow = bnPow; -BigInteger.prototype.gcd = bnGCD; -BigInteger.prototype.isProbablePrime = bnIsProbablePrime; - -// JSBN-specific extension -BigInteger.prototype.square = bnSquare; - -// Expose the Barrett function -BigInteger.prototype.Barrett = Barrett; - -// BigInteger interfaces not implemented in jsbn: - -// BigInteger(int signum, byte[] magnitude) -// double doubleValue() -// float floatValue() -// int hashCode() -// long longValue() -// static BigInteger valueOf(long val) - -// Random number generator - requires a PRNG backend, e.g. prng4.js - -// For best results, put code like -// -// in your main HTML document. - -var rng_state; -var rng_pool; -var rng_pptr; - -// Mix in a 32-bit integer into the pool -function rng_seed_int(x) { - rng_pool[rng_pptr++] ^= x & 255; - rng_pool[rng_pptr++] ^= (x >> 8) & 255; - rng_pool[rng_pptr++] ^= (x >> 16) & 255; - rng_pool[rng_pptr++] ^= (x >> 24) & 255; - if (rng_pptr >= rng_psize) rng_pptr -= rng_psize; -} - -// Mix in the current time (w/milliseconds) into the pool -function rng_seed_time() { - rng_seed_int(new Date().getTime()); -} - -// Initialize the pool with junk if needed. -if (rng_pool == null) { - rng_pool = new Array(); - rng_pptr = 0; - var t; - if (typeof window !== "undefined" && window.crypto) { - if (window.crypto.getRandomValues) { - // Use webcrypto if available - var ua = new Uint8Array(32); - window.crypto.getRandomValues(ua); - for (t = 0; t < 32; ++t) rng_pool[rng_pptr++] = ua[t]; - } else if (navigator.appName == "Netscape" && navigator.appVersion < "5") { - // Extract entropy (256 bits) from NS4 RNG if available - var z = window.crypto.random(32); - for (t = 0; t < z.length; ++t) rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; - } - } - while (rng_pptr < rng_psize) { - // extract some randomness from Math.random() - t = Math.floor(65536 * Math.random()); - rng_pool[rng_pptr++] = t >>> 8; - rng_pool[rng_pptr++] = t & 255; - } - rng_pptr = 0; - rng_seed_time(); - //rng_seed_int(window.screenX); - //rng_seed_int(window.screenY); -} - -function rng_get_byte() { - if (rng_state == null) { - rng_seed_time(); - rng_state = prng_newstate(); - rng_state.init(rng_pool); - for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) rng_pool[rng_pptr] = 0; - rng_pptr = 0; - //rng_pool = null; - } - // TODO: allow reseeding after first request - return rng_state.next(); -} - -function rng_get_bytes(ba) { - var i; - for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); -} - -function SecureRandom() {} - -SecureRandom.prototype.nextBytes = rng_get_bytes; - -// prng4.js - uses Arcfour as a PRNG - -function Arcfour() { - this.i = 0; - this.j = 0; - this.S = new Array(); -} - -// Initialize arcfour context from key, an array of ints, each from [0..255] -function ARC4init(key) { - var i, j, t; - for (i = 0; i < 256; ++i) this.S[i] = i; - j = 0; - for (i = 0; i < 256; ++i) { - j = (j + this.S[i] + key[i % key.length]) & 255; - t = this.S[i]; - this.S[i] = this.S[j]; - this.S[j] = t; - } - this.i = 0; - this.j = 0; -} - -function ARC4next() { - var t; - this.i = (this.i + 1) & 255; - this.j = (this.j + this.S[this.i]) & 255; - t = this.S[this.i]; - this.S[this.i] = this.S[this.j]; - this.S[this.j] = t; - return this.S[(t + this.S[this.i]) & 255]; -} - -Arcfour.prototype.init = ARC4init; -Arcfour.prototype.next = ARC4next; - -// Plug in your RNG constructor here -function prng_newstate() { - return new Arcfour(); -} - -// Pool size must be a multiple of 4 and greater than 32. -// An array of bytes the size of the pool will be passed to init() -var rng_psize = 256; - - -/***/ }), - -/***/ "../locale/res/wordlists lazy recursive ^\\.\\/.*\\.json$": -/*!*********************************************************************!*\ - !*** ../locale/res/wordlists/ lazy ^\.\/.*\.json$ namespace object ***! - \*********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var map = { - "./de.json": [ - "../locale/res/wordlists/de.json", - "locale_res_wordlists_de_json" - ], - "./en.json": [ - "../locale/res/wordlists/en.json", - "locale_res_wordlists_en_json" - ], - "./es.json": [ - "../locale/res/wordlists/es.json", - "locale_res_wordlists_es_json" - ], - "./fr.json": [ - "../locale/res/wordlists/fr.json", - "locale_res_wordlists_fr_json" - ], - "./pt.json": [ - "../locale/res/wordlists/pt.json", - "locale_res_wordlists_pt_json" - ] -}; -function webpackAsyncContext(req) { - if(!__webpack_require__.o(map, req)) { - return Promise.resolve().then(() => { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - }); - } - - var ids = map[req], id = ids[0]; - return __webpack_require__.e(ids[1]).then(() => { - return __webpack_require__.t(id, 3 | 16); - }); -} -webpackAsyncContext.keys = () => (Object.keys(map)); -webpackAsyncContext.id = "../locale/res/wordlists lazy recursive ^\\.\\/.*\\.json$"; -module.exports = webpackAsyncContext; - -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js!../app/assets/fonts/fonts.css": -/*!***************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js!../app/assets/fonts/fonts.css ***! - \***************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _pwa_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../pwa/node_modules/css-loader/dist/runtime/cssWithMappingToString.js */ "./node_modules/css-loader/dist/runtime/cssWithMappingToString.js"); -/* harmony import */ var _pwa_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_pwa_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _pwa_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../pwa/node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _pwa_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_pwa_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../pwa/node_modules/css-loader/dist/runtime/getUrl.js */ "./node_modules/css-loader/dist/runtime/getUrl.js"); -/* harmony import */ var _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _Nunito_Light_ttf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Nunito-Light.ttf */ "../app/assets/fonts/Nunito-Light.ttf"); -/* harmony import */ var _Nunito_Regular_ttf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Nunito-Regular.ttf */ "../app/assets/fonts/Nunito-Regular.ttf"); -/* harmony import */ var _Nunito_SemiBold_ttf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Nunito-SemiBold.ttf */ "../app/assets/fonts/Nunito-SemiBold.ttf"); -/* harmony import */ var _Nunito_Bold_ttf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Nunito-Bold.ttf */ "../app/assets/fonts/Nunito-Bold.ttf"); -/* harmony import */ var _Inconsolata_Regular_ttf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Inconsolata-Regular.ttf */ "../app/assets/fonts/Inconsolata-Regular.ttf"); -/* harmony import */ var _Padlock_eot__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Padlock.eot */ "../app/assets/fonts/Padlock.eot"); -/* harmony import */ var _Padlock_woff__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Padlock.woff */ "../app/assets/fonts/Padlock.woff"); -/* harmony import */ var _Padlock_ttf__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Padlock.ttf */ "../app/assets/fonts/Padlock.ttf"); -/* harmony import */ var _Padlock_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Padlock.svg */ "../app/assets/fonts/Padlock.svg"); -/* harmony import */ var _fontawesome_webfont_eot__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./fontawesome-webfont.eot */ "../app/assets/fonts/fontawesome-webfont.eot"); -/* harmony import */ var _fontawesome_webfont_woff2__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./fontawesome-webfont.woff2 */ "../app/assets/fonts/fontawesome-webfont.woff2"); -/* harmony import */ var _fontawesome_webfont_woff__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./fontawesome-webfont.woff */ "../app/assets/fonts/fontawesome-webfont.woff"); -/* harmony import */ var _fontawesome_webfont_ttf__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./fontawesome-webfont.ttf */ "../app/assets/fonts/fontawesome-webfont.ttf"); -/* harmony import */ var _fontawesome_webfont_svg__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./fontawesome-webfont.svg */ "../app/assets/fonts/fontawesome-webfont.svg"); -// Imports - - - - - - - - - - - - - - - - - -var ___CSS_LOADER_EXPORT___ = _pwa_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_pwa_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default())); -var ___CSS_LOADER_URL_REPLACEMENT_0___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Nunito_Light_ttf__WEBPACK_IMPORTED_MODULE_3__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_1___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Nunito_Regular_ttf__WEBPACK_IMPORTED_MODULE_4__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_2___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Nunito_SemiBold_ttf__WEBPACK_IMPORTED_MODULE_5__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_3___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Nunito_Bold_ttf__WEBPACK_IMPORTED_MODULE_6__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_4___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Inconsolata_Regular_ttf__WEBPACK_IMPORTED_MODULE_7__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_5___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Padlock_eot__WEBPACK_IMPORTED_MODULE_8__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_6___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Padlock_woff__WEBPACK_IMPORTED_MODULE_9__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_7___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Padlock_ttf__WEBPACK_IMPORTED_MODULE_10__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_8___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_Padlock_svg__WEBPACK_IMPORTED_MODULE_11__["default"], { hash: "#Padlock" }); -var ___CSS_LOADER_URL_REPLACEMENT_9___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_fontawesome_webfont_eot__WEBPACK_IMPORTED_MODULE_12__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_10___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_fontawesome_webfont_woff2__WEBPACK_IMPORTED_MODULE_13__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_11___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_fontawesome_webfont_woff__WEBPACK_IMPORTED_MODULE_14__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_12___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_fontawesome_webfont_ttf__WEBPACK_IMPORTED_MODULE_15__["default"]); -var ___CSS_LOADER_URL_REPLACEMENT_13___ = _pwa_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_fontawesome_webfont_svg__WEBPACK_IMPORTED_MODULE_16__["default"]); -// Module -___CSS_LOADER_EXPORT___.push([module.id, "@font-face {\n font-family: \"Nunito\";\n font-style: normal;\n font-weight: 300;\n src: local(\"Nunito Light\"), local(\"Nunito-Light\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ") format(\"truetype\");\n}\n@font-face {\n font-family: \"Nunito\";\n font-style: normal;\n font-weight: 400;\n src: local(\"Nunito Regular\"), local(\"Nunito-Regular\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ") format(\"truetype\");\n}\n@font-face {\n font-family: \"Nunito\";\n font-style: normal;\n font-weight: 600;\n src: local(\"Nunito SemiBold\"), local(\"Nunito-SemiBold\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + ") format(\"truetype\");\n}\n@font-face {\n font-family: \"Nunito\";\n font-style: normal;\n font-weight: 700;\n src: local(\"Nunito Bold\"), local(\"Nunito-Bold\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ") format(\"truetype\");\n}\n@font-face {\n font-family: \"Inconsolata\";\n font-style: normal;\n font-weight: 400;\n src: local(\"Inconsolata Regular\"), local(\"Inconsolata-Regular\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_4___ + ") format(\"truetype\");\n}\n\n@font-face {\n font-family: \"Padlock\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_5___ + ");\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_5___ + ") format(\"embedded-opentype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_6___ + ") format(\"woff\"),\n url(" + ___CSS_LOADER_URL_REPLACEMENT_7___ + ") format(\"truetype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_8___ + ") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"FontAwesome\";\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_9___ + ");\n src: url(" + ___CSS_LOADER_URL_REPLACEMENT_9___ + ") format(\"embedded-opentype\"),\n url(" + ___CSS_LOADER_URL_REPLACEMENT_10___ + ") format(\"woff2\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_11___ + ") format(\"woff\"),\n url(" + ___CSS_LOADER_URL_REPLACEMENT_12___ + ") format(\"truetype\"), url(" + ___CSS_LOADER_URL_REPLACEMENT_13___ + ") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n", "",{"version":3,"sources":["webpack://./../app/assets/fonts/fonts.css"],"names":[],"mappings":"AAAA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,6GAA6F;AACjG;AACA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,iHAAmG;AACvG;AACA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,mHAAsG;AAC1G;AACA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,2GAA0F;AAC9F;AACA;IACI,0BAA0B;IAC1B,kBAAkB;IAClB,gBAAgB;IAChB,2HAAkH;AACtH;;AAEA;IACI,sBAAsB;IACtB,4CAAyB;IACzB;yHACuF;IACvF,mBAAmB;IACnB,kBAAkB;AACtB;;AAEA;IACI,0BAA0B;IAC1B,4CAAqC;IACrC;;2HAEuG;IACvG,mBAAmB;IACnB,kBAAkB;AACtB","sourcesContent":["@font-face {\n font-family: \"Nunito\";\n font-style: normal;\n font-weight: 300;\n src: local(\"Nunito Light\"), local(\"Nunito-Light\"), url(./Nunito-Light.ttf) format(\"truetype\");\n}\n@font-face {\n font-family: \"Nunito\";\n font-style: normal;\n font-weight: 400;\n src: local(\"Nunito Regular\"), local(\"Nunito-Regular\"), url(./Nunito-Regular.ttf) format(\"truetype\");\n}\n@font-face {\n font-family: \"Nunito\";\n font-style: normal;\n font-weight: 600;\n src: local(\"Nunito SemiBold\"), local(\"Nunito-SemiBold\"), url(./Nunito-SemiBold.ttf) format(\"truetype\");\n}\n@font-face {\n font-family: \"Nunito\";\n font-style: normal;\n font-weight: 700;\n src: local(\"Nunito Bold\"), local(\"Nunito-Bold\"), url(./Nunito-Bold.ttf) format(\"truetype\");\n}\n@font-face {\n font-family: \"Inconsolata\";\n font-style: normal;\n font-weight: 400;\n src: local(\"Inconsolata Regular\"), local(\"Inconsolata-Regular\"), url(./Inconsolata-Regular.ttf) format(\"truetype\");\n}\n\n@font-face {\n font-family: \"Padlock\";\n src: url(\"./Padlock.eot\");\n src: url(\"./Padlock.eot\") format(\"embedded-opentype\"), url(\"./Padlock.woff\") format(\"woff\"),\n url(\"./Padlock.ttf\") format(\"truetype\"), url(\"./Padlock.svg#Padlock\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"FontAwesome\";\n src: url(\"./fontawesome-webfont.eot\");\n src: url(\"./fontawesome-webfont.eot\") format(\"embedded-opentype\"),\n url(\"./fontawesome-webfont.woff2\") format(\"woff2\"), url(\"./fontawesome-webfont.woff\") format(\"woff\"),\n url(\"./fontawesome-webfont.ttf\") format(\"truetype\"), url(\"./fontawesome-webfont.svg\") format(\"svg\");\n font-weight: normal;\n font-style: normal;\n}\n"],"sourceRoot":""}]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); - - -/***/ }), - -/***/ "../app/assets/fonts/Inconsolata-Regular.ttf": -/*!***************************************************!*\ - !*** ../app/assets/fonts/Inconsolata-Regular.ttf ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "4d410e4977b3525f9fca202da60d43ed.ttf"); - -/***/ }), - -/***/ "../app/assets/fonts/Nunito-Bold.ttf": -/*!*******************************************!*\ - !*** ../app/assets/fonts/Nunito-Bold.ttf ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "e21224eb684dfa21443683a3fc963a3b.ttf"); - -/***/ }), - -/***/ "../app/assets/fonts/Nunito-Light.ttf": -/*!********************************************!*\ - !*** ../app/assets/fonts/Nunito-Light.ttf ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "d0adc2b29b7472077dc7439642f1439a.ttf"); - -/***/ }), - -/***/ "../app/assets/fonts/Nunito-Regular.ttf": -/*!**********************************************!*\ - !*** ../app/assets/fonts/Nunito-Regular.ttf ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "c6d06da41ec4b66d90868ce6bf337cbd.ttf"); - -/***/ }), - -/***/ "../app/assets/fonts/Nunito-SemiBold.ttf": -/*!***********************************************!*\ - !*** ../app/assets/fonts/Nunito-SemiBold.ttf ***! - \***********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "2f14cbb7792a42471b1b64de35797d7a.ttf"); - -/***/ }), - -/***/ "../app/assets/fonts/Padlock.eot": -/*!***************************************!*\ - !*** ../app/assets/fonts/Padlock.eot ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "e3a2c12708311d5e47193da456ccdcba.eot"); - -/***/ }), - -/***/ "../app/assets/fonts/Padlock.svg": -/*!***************************************!*\ - !*** ../app/assets/fonts/Padlock.svg ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "49d0dfccb2c7333add0c1277ce21fa1e.svg"); - -/***/ }), - -/***/ "../app/assets/fonts/Padlock.ttf": -/*!***************************************!*\ - !*** ../app/assets/fonts/Padlock.ttf ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "5503c8e2713e276d4a2cdff45e6991c9.ttf"); - -/***/ }), - -/***/ "../app/assets/fonts/Padlock.woff": -/*!****************************************!*\ - !*** ../app/assets/fonts/Padlock.woff ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "021f830e3290aad20514c75c92ab00c9.woff"); - -/***/ }), - -/***/ "../app/assets/fonts/fontawesome-webfont.eot": -/*!***************************************************!*\ - !*** ../app/assets/fonts/fontawesome-webfont.eot ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "3d1a8e52672c4af418771bcd7e4111f5.eot"); - -/***/ }), - -/***/ "../app/assets/fonts/fontawesome-webfont.svg": -/*!***************************************************!*\ - !*** ../app/assets/fonts/fontawesome-webfont.svg ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "9659db92dbc9c899169660fa07a18838.svg"); - -/***/ }), - -/***/ "../app/assets/fonts/fontawesome-webfont.ttf": -/*!***************************************************!*\ - !*** ../app/assets/fonts/fontawesome-webfont.ttf ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "ecbe95f309be4cee7aa3f894386282f6.ttf"); - -/***/ }), - -/***/ "../app/assets/fonts/fontawesome-webfont.woff": -/*!****************************************************!*\ - !*** ../app/assets/fonts/fontawesome-webfont.woff ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "2f7fbbd7d8eee807e437e660436c6033.woff"); - -/***/ }), - -/***/ "../app/assets/fonts/fontawesome-webfont.woff2": -/*!*****************************************************!*\ - !*** ../app/assets/fonts/fontawesome-webfont.woff2 ***! - \*****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "f862b0f4608b4f0fb945113ef8dcdfa3.woff2"); - -/***/ }), - -/***/ "../app/assets/fonts/fonts.css": -/*!*************************************!*\ - !*** ../app/assets/fonts/fonts.css ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _pwa_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../pwa/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); -/* harmony import */ var _pwa_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_pwa_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _pwa_node_modules_css_loader_dist_cjs_js_fonts_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../../pwa/node_modules/css-loader/dist/cjs.js!./fonts.css */ "./node_modules/css-loader/dist/cjs.js!../app/assets/fonts/fonts.css"); - - - -var options = {}; - -options.insert = "head"; -options.singleton = false; - -var update = _pwa_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_pwa_node_modules_css_loader_dist_cjs_js_fonts_css__WEBPACK_IMPORTED_MODULE_1__["default"], options); - - - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_pwa_node_modules_css_loader_dist_cjs_js_fonts_css__WEBPACK_IMPORTED_MODULE_1__["default"].locals || {}); - -/***/ }), - -/***/ "../app/src/elements/alert-dialog.ts": -/*!*******************************************!*\ - !*** ../app/src/elements/alert-dialog.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AlertDialog": () => (/* binding */ AlertDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - -const defaultButtonLabel = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("OK"); -let AlertDialog = class AlertDialog extends _dialog__WEBPACK_IMPORTED_MODULE_2__.Dialog { - constructor() { - super(...arguments); - this.buttonLabel = defaultButtonLabel; - this.dialogTitle = ""; - this.message = ""; - this.type = "info"; - this.icon = ""; - this.options = []; - this.hideIcon = false; - this.vertical = false; - } - renderContent() { - const { message, dialogTitle, options, icon, vertical } = this; - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` -

    -
    - -
    -
    ${dialogTitle}
    -
    ${message}
    -
    -
    - -
    - ${options.map((o, i) => _base__WEBPACK_IMPORTED_MODULE_1__.html ` - - `)} -
    -
    - `; - } - done(i = -1) { - super.done(i); - } - show({ message = "", title = "", options = ["OK"], type = "info", preventDismiss = false, hideIcon = false, vertical = false, icon, preventAutoClose } = {}) { - this.message = message; - this.dialogTitle = title; - this.type = type; - this.preventDismiss = preventDismiss; - this.options = options; - this.hideIcon = hideIcon; - this.vertical = vertical; - this.icon = icon || this._icon(type); - if (typeof preventAutoClose !== "undefined") { - this.preventAutoClose = preventAutoClose; - } - return super.show(); - } - _icon(type) { - switch (type) { - case "info": - return "info-round"; - case "warning": - return "error"; - case "success": - return "success"; - case "question": - case "choice": - case "destructive": - return "question"; - default: - return ""; - } - } - _buttonClass(i) { - if (i === 0) { - return this.type === "destructive" ? "negative" : this.type !== "choice" ? "primary" : ""; - } - else { - return ""; - } - } -}; -AlertDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_2__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_1__.css ` - :host([hide-icon]) .info-icon { - display: none; - } - - :host([hide-icon]) .info-text, - :host([hide-icon]) .info-title { - text-align: center; - } - - .info-text:not(.small) { - font-size: var(--font-size-default); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], AlertDialog.prototype, "buttonLabel", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], AlertDialog.prototype, "dialogTitle", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], AlertDialog.prototype, "message", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)({ reflect: true, attribute: "type" }), - __metadata("design:type", String) -], AlertDialog.prototype, "type", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Object) -], AlertDialog.prototype, "icon", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Array) -], AlertDialog.prototype, "options", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)({ attribute: "hide-icon", reflect: true }), - __metadata("design:type", Boolean) -], AlertDialog.prototype, "hideIcon", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], AlertDialog.prototype, "vertical", void 0); -AlertDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("pl-alert-dialog") -], AlertDialog); - - - -/***/ }), - -/***/ "../app/src/elements/app.ts": -/*!**********************************!*\ - !*** ../app/src/elements/app.ts ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "App": () => (/* binding */ App) -/* harmony export */ }); -/* harmony import */ var _assets_fonts_fonts_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../assets/fonts/fonts.css */ "../app/assets/fonts/fonts.css"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _mixins_auto_lock__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../mixins/auto-lock */ "../app/src/mixins/auto-lock.ts"); -/* harmony import */ var _mixins_error_handling__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../mixins/error-handling */ "../app/src/mixins/error-handling.ts"); -/* harmony import */ var _mixins_auto_sync__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../mixins/auto-sync */ "../app/src/mixins/auto-sync.ts"); -/* harmony import */ var _mixins_service_worker__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../mixins/service-worker */ "../app/src/mixins/service-worker.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _items_list__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./items-list */ "../app/src/elements/items-list.ts"); -/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./settings */ "../app/src/elements/settings.ts"); -/* harmony import */ var _org_view__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./org-view */ "../app/src/elements/org-view.ts"); -/* harmony import */ var _orgs_list__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./orgs-list */ "../app/src/elements/orgs-list.ts"); -/* harmony import */ var _start__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./start */ "../app/src/elements/start.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _lib_clipboard__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../lib/clipboard */ "../app/src/lib/clipboard.ts"); -/* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./menu */ "../app/src/elements/menu.ts"); -/* harmony import */ var _invite_dialog__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./invite-dialog */ "../app/src/elements/invite-dialog.ts"); -/* harmony import */ var _item_dialog__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./item-dialog */ "../app/src/elements/item-dialog.ts"); -/* harmony import */ var _create_org_dialog__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./create-org-dialog */ "../app/src/elements/create-org-dialog.ts"); -/* harmony import */ var _choose_plan_dialog__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./choose-plan-dialog */ "../app/src/elements/choose-plan-dialog.ts"); -/* harmony import */ var _premium_dialog__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./premium-dialog */ "../app/src/elements/premium-dialog.ts"); -/* harmony import */ var _create_item_dialog__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./create-item-dialog */ "../app/src/elements/create-item-dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -class App extends (0,_mixins_service_worker__WEBPACK_IMPORTED_MODULE_10__.ServiceWorker)((0,_mixins_state__WEBPACK_IMPORTED_MODULE_6__.StateMixin)((0,_mixins_auto_sync__WEBPACK_IMPORTED_MODULE_9__.AutoSync)((0,_mixins_error_handling__WEBPACK_IMPORTED_MODULE_8__.ErrorHandling)((0,_mixins_auto_lock__WEBPACK_IMPORTED_MODULE_7__.AutoLock)(_base__WEBPACK_IMPORTED_MODULE_11__.BaseElement))))) { - constructor() { - super(); - this.locked = true; - this.loggedIn = false; - this.singletonContainer = true; - this._ready = false; - this._menuOpen = false; - this.load(); - } - get router() { - return _globals__WEBPACK_IMPORTED_MODULE_5__.router; - } - shouldUpdate() { - return this._ready; - } - async load() { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.loaded; - // Try syncing account so user can unlock with new password in case it has changed - if (_globals__WEBPACK_IMPORTED_MODULE_5__.app.state.loggedIn) { - _globals__WEBPACK_IMPORTED_MODULE_5__.app.fetchAccount(); - } - this._ready = true; - this._routeChanged(); - const spinner = document.querySelector(".spinner"); - spinner.style.display = "none"; - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_11__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("o f f l i n e")} - - -
    - -
    - - -
    - - -
    - - - - - - - - - -
    -
    - - -
    - `; - } - stateChanged() { - this.locked = this.state.locked; - this.loggedIn = this.state.loggedIn; - super.stateChanged(); - } - updated(changes) { - if (changes.has("locked")) { - if (this.locked) { - this._locked(); - } - else { - this._unlocked(); - } - } - if (changes.has("loggedIn")) { - if (this.loggedIn) { - this._loggedIn(); - } - else { - this._loggedOut(); - } - } - } - _locked() { - this.$(".wrapper").classList.remove("active"); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.clearDialogs)(); - (0,_lib_clipboard__WEBPACK_IMPORTED_MODULE_21__.clearClipboard)(); - this._routeChanged(); - } - _unlocked(instant = false) { - setTimeout(async () => { - if (!this.$(".wrapper")) { - await this.updateComplete; - } - this.$(".wrapper").classList.add("active"); - if (typeof _globals__WEBPACK_IMPORTED_MODULE_5__.router.params.next !== "undefined") { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go(_globals__WEBPACK_IMPORTED_MODULE_5__.router.params.next, {}, true); - } - else { - this._routeChanged(); - } - }, instant ? 0 : 600); - } - _loggedIn() { } - _loggedOut() { } - _toggleMenu() { - this._menuOpen = !this._menuOpen; - } - _closeMenu(e) { - this._menuOpen = false; - e.preventDefault(); - } - _dialogOpen(e) { - const dialog = e.target; - this.classList.add("dialog-open"); - if (dialog.hideApp) { - this.classList.add("hide-app"); - } - } - _dialogClose() { - this.classList.remove("dialog-open"); - this.classList.remove("hide-app"); - } - async _routeChanged() { - if (!this._ready) { - return; - } - _dialog__WEBPACK_IMPORTED_MODULE_20__.Dialog.closeAll(); - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.loaded; - const path = _globals__WEBPACK_IMPORTED_MODULE_5__.router.path; - let match; - if (path === "recover") { - this._startView.recover(); - return; - } - if (!_globals__WEBPACK_IMPORTED_MODULE_5__.app.account) { - if (path === "login") { - this._startView.login(); - } - else if ((match = path.match(/^signup(?:\/([^\/]+))?$/))) { - const [, step] = match; - this._startView.signup(step); - } - else { - const params = _globals__WEBPACK_IMPORTED_MODULE_5__.router.params; - if (path) { - params.next = path; - } - if ((match = path.match(/^invite\/([^\/]+)\/([^\/]+)$/))) { - const [, org, id] = match; - params.invite = org + "," + id; - } - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go(params.verify ? "signup" : "login", params, true); - } - return; - } - if (this.state.locked) { - if (path === "unlock") { - this._startView.unlock(); - } - else { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("unlock", path ? { next: path, nobio: "1", ..._globals__WEBPACK_IMPORTED_MODULE_5__.router.params } : undefined, true); - } - return; - } - if (path === "settings") { - this._openView(this._settings); - this._menu.selected = "settings"; - } - else if ((match = path.match(/^orgs?(?:\/([^\/]+))?$/))) { - const [, id] = match; - const org = id && _globals__WEBPACK_IMPORTED_MODULE_5__.app.getOrg(id); - if (id && !org) { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("orgs", undefined, true); - return; - } - if (org) { - this._orgView.orgId = id || ""; - this._openView(this._orgView); - this._menu.selected = `orgs/${id}`; - } - else { - this._openView(this._orgs); - this._menu.selected = "orgs"; - } - } - else if ((match = path.match(/^items(?:\/([^\/]+))?$/))) { - const [, id] = match; - const { vault, tag, favorites, attachments, recent, host } = _globals__WEBPACK_IMPORTED_MODULE_5__.router.params; - this._items.selected = id || ""; - this._items.vault = vault || ""; - this._items.tag = tag || ""; - this._items.favorites = favorites === "true"; - this._items.attachments = attachments === "true"; - this._items.recent = recent === "true"; - this._items.host = host === "true"; - this._openView(this._items); - this._menu.selected = vault - ? `vault/${vault}` - : tag - ? `tag/${tag}` - : favorites - ? "favorites" - : recent - ? "recent" - : attachments - ? "attachments" - : host - ? "host" - : "items"; - const item = id && _globals__WEBPACK_IMPORTED_MODULE_5__.app.getItem(id); - if (item) { - const { newitem, edit, addattachment, ...rest } = _globals__WEBPACK_IMPORTED_MODULE_5__.router.params; - _globals__WEBPACK_IMPORTED_MODULE_5__.router.params = rest; - this._itemDialog.isNew = typeof newitem !== "undefined"; - this._itemDialog.show(item.item.id); - if (typeof edit !== "undefined") { - this._itemDialog.edit(); - if (this._itemDialog.isNew && typeof addattachment !== "undefined") { - this._itemDialog.addAttachment(); - } - } - _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateLastUsed(item.item); - } - } - else if ((match = path.match(/^invite\/([^\/]+)\/([^\/]+)$/))) { - const [, orgId, id] = match; - const invite = await _globals__WEBPACK_IMPORTED_MODULE_5__.app.getInvite(orgId, id); - const org = _globals__WEBPACK_IMPORTED_MODULE_5__.app.getOrg(orgId); - if (invite) { - if (org && org.isAdmin(_globals__WEBPACK_IMPORTED_MODULE_5__.app.account)) { - await org.unlock(_globals__WEBPACK_IMPORTED_MODULE_5__.app.account); - await invite.unlock(org.invitesKey); - } - this._inviteDialog.show(invite); - } - else { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Could not find invite! Did you use the correct link?"), { type: "warning" }); - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("items", undefined, true); - } - } - else if ((match = path.match(/^plans?\/(.+)\/?$/))) { - const billingProvider = _globals__WEBPACK_IMPORTED_MODULE_5__.app.state.billingProvider; - if (!billingProvider) { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("items", undefined, true); - return; - } - const planType = parseInt(match[1]); - if (planType === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.PlanType.Premium) { - await this._premiumDialog.show(); - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("items", undefined, true); - } - else { - const plan = billingProvider.plans.find(p => p.type === planType); - if (plan && plan.type !== _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.PlanType.Free) { - const org = await this._createOrgDialog.show(plan); - if (org) { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go(`orgs/${org.id}`); - } - else { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("items", undefined, true); - } - } - else { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("items", undefined, true); - } - } - } - else { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("items", undefined, true); - } - } - async _openView(view) { - if (view === this._view) { - return; - } - if (view) { - view.classList.add("showing"); - view.active = true; - } - if (this._view) { - this._view.classList.remove("showing"); - this._view.active = false; - } - this._view = view; - } - _keydown(event) { - if (this.state.locked || _input__WEBPACK_IMPORTED_MODULE_13__.Input.activeInput) { - return; - } - const control = event.ctrlKey || event.metaKey; - // ESCAPE -> Back - if (event.key === "Escape") { - if (_dialog__WEBPACK_IMPORTED_MODULE_20__.Dialog.openDialogs.size) { - _dialog__WEBPACK_IMPORTED_MODULE_20__.Dialog.closeAll(); - } - } - // CTRL/CMD (+ Shift) + F -> Search (All) - else if (control && event.key === "f") { - event.preventDefault(); - const { vault, tags, recent, favorites, attachments, ...rest } = _globals__WEBPACK_IMPORTED_MODULE_5__.router.params; - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("items", event.shiftKey ? rest : { vault, tags, recent, favorites, attachments, ...rest }); - this._items.search(); - } - } - _androidBack() { - if (!this.locked && _globals__WEBPACK_IMPORTED_MODULE_5__.router.canGoBack) { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.back(); - } - else { - navigator.Backbutton && navigator.Backbutton.goBack(); - } - } - async _newItem() { - const vault = (_globals__WEBPACK_IMPORTED_MODULE_5__.router.params.vault && _globals__WEBPACK_IMPORTED_MODULE_5__.app.getVault(_globals__WEBPACK_IMPORTED_MODULE_5__.router.params.vault)) || undefined; - await this._createItemDialog.show(vault); - } - async _createOrg() { - let plan = null; - if (_globals__WEBPACK_IMPORTED_MODULE_5__.app.billingEnabled) { - plan = await this._choosePlanDialog.show(); - if (!plan) { - return; - } - } - const org = await this._createOrgDialog.show(plan); - if (org) { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go(`orgs/${org.id}`); - } - } - async _getPremium(e) { - const message = e.detail && e.detail.message; - const icon = (e.detail && e.detail.icon) || "error"; - const confirmed = !message || (await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.confirm)(message, (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Get Premium"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Cancel"), { icon })); - if (confirmed) { - await this._premiumDialog.show(); - } - this._routeChanged(); - } - _showOfflineAlert() { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("It looks like the app cannot connect to the Padloc servers right now, probably due " + - "to a missing internet connection. You can still access your vaults and even create " + - "or edit Vault Items but your changes won't be synchronized until you're back online."), { title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("You're Offline") }); - } - async _enableBiometricAuth(e) { - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.confirm)((e.detail && e.detail.message) || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Do you want to enable biometric unlock for this device?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Setup"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Cancel"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Biometric Unlock") - }); - if (!confirmed) { - _globals__WEBPACK_IMPORTED_MODULE_5__.app.forgetMasterKey(); - return; - } - try { - const authenticated = await (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_3__.biometricAuth)(); - if (!authenticated) { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Biometric authentication failed! Canceling Setup."), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Setup Failed"), - type: "warning" - }); - _globals__WEBPACK_IMPORTED_MODULE_5__.app.forgetMasterKey(); - return; - } - } - catch (e) { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Biometric unlock failed! Canceling Setup. (Reason: {0})", e.message), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Setup Failed"), - type: "warning" - }); - _globals__WEBPACK_IMPORTED_MODULE_5__.app.forgetMasterKey(); - return; - } - if (_globals__WEBPACK_IMPORTED_MODULE_5__.app.account.locked) { - const password = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Please enter your master password!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Biometric Unlock"), - label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Enter Master Password"), - type: "password", - validate: async (pwd) => { - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.unlock(pwd); - } - catch (e) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Wrong password! Please try again!"); - } - return pwd; - } - }); - if (!password) { - _globals__WEBPACK_IMPORTED_MODULE_5__.app.forgetMasterKey(); - return; - } - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.unlock(password); - } - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.rememberMasterKey(); - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Biometric unlock activated successfully!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Biometric Unlock"), - type: "success", - preventAutoClose: true - }); - } - async _fieldDragged({ detail: { event, item, index } }) { - const field = item.fields[index]; - const target = event.target; - target.classList.add("dragging"); - target.addEventListener("dragend", () => target.classList.remove("dragging"), { once: true }); - const totp = target.querySelector("pl-totp") || (target.shadowRoot && target.shadowRoot.querySelector("pl-totp")); - event.dataTransfer.setData("text/plain", field.type === "totp" && totp ? totp.token : field.value); - } -} -App.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_4__.config.cssVars, - _styles__WEBPACK_IMPORTED_MODULE_4__.shared, - _base__WEBPACK_IMPORTED_MODULE_11__.css ` - @keyframes fadeIn { - from { - opacity: 0; - } - } - - :host { - background: linear-gradient( - var(--color-gradient-highlight-to) 0%, - var(--color-gradient-highlight-from) 100% - ); - overflow: hidden; - color: var(--color-foreground); - position: fixed; - width: 100%; - height: 100%; - animation: fadeIn 0.5s; - display: flex; - flex-direction: column; - --menu-width: 250px; - } - - .main { - flex: 1; - position: relative; - perspective: 1000px; - } - - .wrapper { - display: flex; - transform-origin: 0 center; - transition: transform 0.4s cubic-bezier(0.6, 0, 0.2, 1); - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.fullbleed()} - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.gradientDark()} - } - - pl-menu { - width: var(--menu-width); - } - - .views { - flex: 1; - position: relative; - margin: var(--gutter-size); - margin-left: 0; - background: var(--color-quaternary); - border-radius: var(--border-radius); - overflow: hidden; - } - - .views > * { - transition: opacity 0.4s; - border-radius: var(--border-radius); - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.fullbleed()} - } - - .views > :not(.showing) { - opacity: 0; - z-index: -1; - pointer-events: none; - } - - .wrapper:not(.active), - :host(.dialog-open) .wrapper { - transform: translate3d(0, 0, -150px) rotateX(5deg); - border-radius: var(--border-radius); - } - - :host(.dialog-open.hide-app) { - background: transparent; - } - - :host(.dialog-open.hide-app) .main > * { - opacity: 0; - } - - .offline { - background: var(--color-negative); - color: var(--color-tertiary); - padding: 8px; - text-align: center; - z-index: 100; - font-weight: 600; - font-size: var(--font-size-small); - position: relative; - } - - .offline pl-icon { - position: absolute; - right: 0; - bottom: 0; - font-size: var(--font-size-micro); - margin: 4px; - width: 30px; - height: 30px; - } - - .menu-scrim { - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.fullbleed()} - z-index: 10; - background: var(--color-tertiary); - opacity: 0.3; - transition: opacity 0.3s; - display: none; - } - - @supports (-webkit-overflow-scrolling: touch) { - .offline { - padding-top: max(calc(env(safe-area-inset-top) - 8px), 8px); - margin-bottom: calc(-1 * max(env(safe-area-inset-top), 8px) + 8px); - } - } - - @media (max-width: 700px) { - .views { - transition: transform 0.3s cubic-bezier(0.6, 0, 0.2, 1); - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.fullbleed()} - } - - .views { - margin: 0; - } - - .views, - .views > * { - border-radius: 0; - } - - :host([menu-open]) .views { - transform: translate(var(--menu-width), 0); - } - - pl-menu { - transition: transform 0.3s cubic-bezier(0.6, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.6, 0, 0.2, 1); - } - - .menu-scrim { - display: block; - } - - :host(:not([menu-open])) .menu-scrim { - opacity: 0; - pointer-events: none; - } - - :host(:not([menu-open])) pl-menu { - opacity: 0; - transform: translate(-100px, 0); - } - } - - @media (min-width: 1200px) { - .wrapper { - border-radius: 8px; - overflow: hidden; - box-shadow: rgba(0, 0, 0, 0.5) 0 1px 3px; - margin: auto; - overflow: hidden; - top: 20px; - left: 20px; - right: 20px; - bottom: 20px; - max-width: 1200px; - max-height: 900px; - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.property)(), - __metadata("design:type", Object) -], App.prototype, "locked", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.property)(), - __metadata("design:type", Object) -], App.prototype, "loggedIn", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.property)({ type: Boolean, reflect: true, attribute: "singleton-container" }), - __metadata("design:type", Object) -], App.prototype, "singletonContainer", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.property)(), - __metadata("design:type", Object) -], App.prototype, "_ready", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.query)("pl-start"), - __metadata("design:type", _start__WEBPACK_IMPORTED_MODULE_18__.Start) -], App.prototype, "_startView", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.query)("pl-settings"), - __metadata("design:type", _settings__WEBPACK_IMPORTED_MODULE_15__.Settings) -], App.prototype, "_settings", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.query)("pl-org-view"), - __metadata("design:type", _org_view__WEBPACK_IMPORTED_MODULE_16__.OrgView) -], App.prototype, "_orgView", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.query)("pl-items-list"), - __metadata("design:type", _items_list__WEBPACK_IMPORTED_MODULE_14__.ItemsList) -], App.prototype, "_items", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.query)("pl-orgs-list"), - __metadata("design:type", _orgs_list__WEBPACK_IMPORTED_MODULE_17__.OrgsList) -], App.prototype, "_orgs", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.query)("pl-menu"), - __metadata("design:type", _menu__WEBPACK_IMPORTED_MODULE_22__.Menu) -], App.prototype, "_menu", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.dialog)("pl-invite-dialog"), - __metadata("design:type", _invite_dialog__WEBPACK_IMPORTED_MODULE_23__.InviteDialog) -], App.prototype, "_inviteDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.dialog)("pl-item-dialog"), - __metadata("design:type", _item_dialog__WEBPACK_IMPORTED_MODULE_24__.ItemDialog) -], App.prototype, "_itemDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.dialog)("pl-choose-plan-dialog"), - __metadata("design:type", _choose_plan_dialog__WEBPACK_IMPORTED_MODULE_26__.ChoosePlanDialog) -], App.prototype, "_choosePlanDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.dialog)("pl-create-org-dialog"), - __metadata("design:type", _create_org_dialog__WEBPACK_IMPORTED_MODULE_25__.CreateOrgDialog) -], App.prototype, "_createOrgDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.dialog)("pl-premium-dialog"), - __metadata("design:type", _premium_dialog__WEBPACK_IMPORTED_MODULE_27__.PremiumDialog) -], App.prototype, "_premiumDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_19__.dialog)("pl-create-item-dialog"), - __metadata("design:type", _create_item_dialog__WEBPACK_IMPORTED_MODULE_28__.CreateItemDialog) -], App.prototype, "_createItemDialog", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.property)(), - __metadata("design:type", Object) -], App.prototype, "_view", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.property)({ reflect: true, attribute: "menu-open" }), - __metadata("design:type", Boolean) -], App.prototype, "_menuOpen", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("toggle-menu"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], App.prototype, "_toggleMenu", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("dialog-open"), - __metadata("design:type", Function), - __metadata("design:paramtypes", [CustomEvent]), - __metadata("design:returntype", void 0) -], App.prototype, "_dialogOpen", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("dialog-close"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], App.prototype, "_dialogClose", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("route-changed", _globals__WEBPACK_IMPORTED_MODULE_5__.router), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Promise) -], App.prototype, "_routeChanged", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("keydown", document), - __metadata("design:type", Function), - __metadata("design:paramtypes", [KeyboardEvent]), - __metadata("design:returntype", void 0) -], App.prototype, "_keydown", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("backbutton", document), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], App.prototype, "_androidBack", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("create-item"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Promise) -], App.prototype, "_newItem", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("create-org"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Promise) -], App.prototype, "_createOrg", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("get-premium"), - __metadata("design:type", Function), - __metadata("design:paramtypes", [CustomEvent]), - __metadata("design:returntype", Promise) -], App.prototype, "_getPremium", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("enable-biometric-auth"), - __metadata("design:type", Function), - __metadata("design:paramtypes", [CustomEvent]), - __metadata("design:returntype", Promise) -], App.prototype, "_enableBiometricAuth", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_11__.listen)("field-dragged"), - __metadata("design:type", Function), - __metadata("design:paramtypes", [CustomEvent]), - __metadata("design:returntype", Promise) -], App.prototype, "_fieldDragged", null); -window.customElements.define("pl-app", App); - - -/***/ }), - -/***/ "../app/src/elements/attachment-dialog.ts": -/*!************************************************!*\ - !*** ../app/src/elements/attachment-dialog.ts ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AttachmentDialog": () => (/* binding */ AttachmentDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _view__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./view */ "../app/src/elements/view.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - -let AttachmentDialog = class AttachmentDialog extends _dialog__WEBPACK_IMPORTED_MODULE_7__.Dialog { - constructor() { - super(...arguments); - this.info = null; - this.itemId = null; - this.preventDismiss = true; - this._progress = null; - this._error = ""; - this._attachment = null; - this._preview = null; - } - get _item() { - const found = (this.itemId && _globals__WEBPACK_IMPORTED_MODULE_2__.app.getItem(this.itemId)) || null; - return found && found.item; - } - get _vault() { - const found = (this.itemId && _globals__WEBPACK_IMPORTED_MODULE_2__.app.getItem(this.itemId)) || null; - return found && found.vault; - } - show({ info, item }) { - this.info = info; - this.itemId = item; - this._error = ""; - this._progress = null; - this._preview = null; - this._attachment = null; - this._download(); - return super.show(); - } - done() { - if (this._objectUrl) { - URL.revokeObjectURL(this._objectUrl); - } - this._objectUrl = undefined; - this._preview = null; - this._attachment = null; - super.done(); - } - async _delete() { - this.open = false; - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to delete this attachment?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete Attachment"), - type: "destructive" - }); - if (confirmed) { - await _globals__WEBPACK_IMPORTED_MODULE_2__.app.deleteAttachment(this.itemId, this.info); - this.done(); - } - else { - this.open = true; - } - } - async _download() { - this._progress = null; - this._error = ""; - const att = await _globals__WEBPACK_IMPORTED_MODULE_2__.app.downloadAttachment(this.info); - const download = att.downloadProgress; - const handler = () => (this._progress = download.progress); - download.addEventListener("progress", handler); - try { - await download.completed; - } - catch (e) { } - download.removeEventListener("progress", handler); - this._progress = null; - if (download.error) { - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Download failed!"); - } - else { - this._attachment = att; - this._preview = await this._getPreview(att); - } - } - async _getPreview(att) { - if (!this.info) { - return null; - } - const mType = (0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.mediaType)(this.info.type); - switch (mType) { - case "pdf": - this._objectUrl = await att.toObjectURL(); - return _base__WEBPACK_IMPORTED_MODULE_6__.html ` - - `; - case "image": - this._objectUrl = await att.toObjectURL(); - return _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    - -
    - `; - case "text": - case "code": - const text = await att.toText(); - return _base__WEBPACK_IMPORTED_MODULE_6__.html `
    ${text}
    `; - default: - return null; - } - } - async _saveToDisk() { - if (!this._attachment || !this.info) { - throw "Need to download attachment first!"; - } - this.open = false; - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Do you want to save this file to your disk? WARNING: Doing " + - "this will leave the file exposed and unprotected on your " + - "harddrive!"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Save"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel"), { title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Save To Disk"), type: "warning" }); - this.open = true; - if (confirmed) { - (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__.saveFile)(this.info.name, this.info.type, await this._attachment.getData()); - } - } - async _edit() { - if (!this.info) { - return; - } - this.open = false; - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.prompt)("", { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Edit Name"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Save"), - value: this.info.name, - label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Attachment Name"), - validate: async (name) => { - if (!name) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter an attachment name!"); - } - if (name !== this.info.name) { - this.info.name = name; - await _globals__WEBPACK_IMPORTED_MODULE_2__.app.updateItem(this._item, {}); - } - return name; - } - }); - this.open = true; - } - renderContent() { - if (!this.info) { - return _base__WEBPACK_IMPORTED_MODULE_6__.html ``; - } - return _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    -
    ${this.info.name}
    - this.done()}> -
    - - ${this._preview || - _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    - - - -
    ${this.info.type || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unknown File Type")}
    - -
    ${this._error}
    - -
    - ${this._progress - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("downloading... {0}/{1}", (0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.fileSize)(this._progress.loaded), (0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.fileSize)(this._progress.total)) - : (0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.fileSize)(this.info.size)} -
    -
    - `} - -
    - -
    - - -
    - `; - } -}; -AttachmentDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_7__.Dialog.styles, - ..._view__WEBPACK_IMPORTED_MODULE_9__.View.styles, - _base__WEBPACK_IMPORTED_MODULE_6__.css ` - .inner { - background: none; - box-shadow: none; - border-radius: 0; - ${_styles__WEBPACK_IMPORTED_MODULE_3__.mixins.fullbleed()} - max-width: none; - display: flex; - flex-direction: column; - } - - .scrim { - background: var(--color-secondary); - } - - :host([open]) .scrim { - opacity: 1; - } - - header { - box-shadow: rgba(0, 0, 0, 0.15) 0px 1px 3px; - } - - header > .name { - flex: 1; - font-weight: bold; - text-align: center; - ${_styles__WEBPACK_IMPORTED_MODULE_3__.mixins.ellipsis()} - } - - .info, - .preview { - flex: 1; - position: relative; - } - - .preview.image { - display: flex; - align-items: center; - justify-content: center; - padding: 8px; - } - - .preview.image img { - width: 100%; - height: 100%; - object-fit: scale-down; - } - - .preview.text, - .preview.code { - margin: 0; - background: var(--color-quaternary); - font-size: var(--font-size-tiny); - display: flex; - align-items: center; - justify-content: center; - } - - .preview code { - padding: 16px; - padding-bottom: 80px; - max-width: 100%; - max-height: 100%; - box-sizing: border-box; - ${_styles__WEBPACK_IMPORTED_MODULE_3__.mixins.scroll()} - } - - .preview.text { - white-space: normal; - } - - .preview.text code { - max-width: 600px; - } - - .info { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - color: var(--color-tertiary); - } - - .info > pl-icon { - width: 100px; - height: 100px; - font-size: 80px; - } - - .controls { - display: flex; - align-items: center; - padding: 12px; - background: var(--color-tertiarty); - border-radius: var(--border-radius); - } - - .mime-type { - font-weight: bold; - margin-top: 8px; - } - - .error { - font-size: var(--font-size-small); - margin-bottom: 12px; - color: var(--color-negative); - font-weight: bold; - } - - .size { - font-size: var(--font-size-small); - margin-bottom: 12px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], AttachmentDialog.prototype, "info", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], AttachmentDialog.prototype, "itemId", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], AttachmentDialog.prototype, "_progress", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], AttachmentDialog.prototype, "_error", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", String) -], AttachmentDialog.prototype, "_objectUrl", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], AttachmentDialog.prototype, "_attachment", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], AttachmentDialog.prototype, "_preview", void 0); -AttachmentDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.element)("pl-attachment-dialog") -], AttachmentDialog); - - - -/***/ }), - -/***/ "../app/src/elements/base-input.ts": -/*!*****************************************!*\ - !*** ../app/src/elements/base-input.ts ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "BaseInput": () => (/* binding */ BaseInput) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - -let activeInput = null; -// On touch devices, blur active input when tapping on a non-input -document.addEventListener("touchend", () => { - if (activeInput) { - activeInput.blur(); - } -}); -class BaseInput extends _base__WEBPACK_IMPORTED_MODULE_0__.BaseElement { - constructor() { - super(...arguments); - this.autocapitalize = "off"; - this.disabled = false; - this.focused = false; - this.invalid = false; - this.placeholder = ""; - this.label = ""; - this.noTab = false; - this.readonly = false; - this.required = false; - this.selectOnFocus = false; - this._prevValue = this.value; - } - get value() { - return (this._inputElement && this._inputElement.value) || ""; - } - set value(val) { - (async () => { - if (!this._inputElement) { - await this.updateComplete; - } - const oldValue = this._inputElement.value; - this._inputElement.value = val; - this.requestUpdate("value", oldValue); - })(); - } - static get activeInput() { - return activeInput; - } - async focus() { - if (!this._inputElement) { - await this.updateComplete; - } - this._inputElement.focus(); - } - async blur() { - if (!this._inputElement) { - await this.updateComplete; - } - this._inputElement.blur(); - } - selectAll() { - try { - this._inputElement.setSelectionRange(0, this.value.length); - } - catch (e) { - this._inputElement.select(); - } - } - _focused(e) { - e.stopPropagation(); - this.focused = true; - activeInput = this; - this.dispatch("focus"); - if (this.selectOnFocus) { - setTimeout(() => this.selectAll(), 10); - } - } - _blurred(e) { - e.stopPropagation(); - this.focused = false; - this.dispatch("blur"); - if (activeInput === this) { - activeInput = null; - } - } - _changeHandler(e) { - e.stopPropagation(); - this.dispatch("change", { prevValue: this._prevValue, value: this.value }, true, true); - this._prevValue = this.value; - } - _touchend(e) { - e.stopPropagation(); - } - render() { - const { value, focused, label, placeholder } = this; - return _base__WEBPACK_IMPORTED_MODULE_0__.html ` - ${this._renderInput()} - - - `; - } -} -BaseInput.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_1__.shared, - _base__WEBPACK_IMPORTED_MODULE_0__.css ` - :host { - display: block; - position: relative; - font-size: inherit; - font-weight: inherit; - font-family: inherit; - background: var(--shade-2-color); - border-radius: var(--border-radius); - padding: 12px 10px; - } - - input { - box-sizing: border-box; - text-overflow: ellipsis; - box-shadow: none; - } - - .input-element { - text-align: inherit; - width: 100%; - min-height: inherit; - line-height: inherit; - caret-color: currentColor; - cursor: inherit; - } - - textarea { - overflow-wrap: break-word; - } - - ::-webkit-search-cancel-button { - display: none; - } - - ::-webkit-placeholder { - text-shadow: inherit; - color: inherit; - opacity: 0.5; - } - - label { - position: absolute; - top: 0; - left: 0; - right: 0; - padding: 12px 10px; - opacity: 0.5; - transition: transform 0.2s, color 0.2s, opacity 0.5s; - cursor: text; - pointer-events: none; - } - - label[float] { - transform: scale(0.8) translate(0, -32px); - color: var(--color-highlight); - font-weight: bold; - opacity: 1; - } - - .input-element[disabled] { - opacity: 1; - -webkit-text-fill-color: currentColor; - } - - @supports (-webkit-overflow-scrolling: touch) { - input[type="date"], - input[type="month"] { - display: block; - min-height: 1.5em; - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", String) -], BaseInput.prototype, "autocapitalize", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], BaseInput.prototype, "disabled", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], BaseInput.prototype, "focused", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], BaseInput.prototype, "invalid", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", String) -], BaseInput.prototype, "placeholder", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", String) -], BaseInput.prototype, "label", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ attribute: "no-tab" }), - __metadata("design:type", Boolean) -], BaseInput.prototype, "noTab", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], BaseInput.prototype, "readonly", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], BaseInput.prototype, "required", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ attribute: "select-on-focus" }), - __metadata("design:type", Boolean) -], BaseInput.prototype, "selectOnFocus", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", String), - __metadata("design:paramtypes", [String]) -], BaseInput.prototype, "value", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.query)(".input-element"), - __metadata("design:type", HTMLInputElement) -], BaseInput.prototype, "_inputElement", void 0); - - -/***/ }), - -/***/ "../app/src/elements/base.ts": -/*!***********************************!*\ - !*** ../app/src/elements/base.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "html": () => (/* reexport safe */ lit_element__WEBPACK_IMPORTED_MODULE_1__.html), -/* harmony export */ "css": () => (/* reexport safe */ lit_element__WEBPACK_IMPORTED_MODULE_1__.css), -/* harmony export */ "svg": () => (/* reexport safe */ lit_element__WEBPACK_IMPORTED_MODULE_1__.svg), -/* harmony export */ "BaseElement": () => (/* binding */ BaseElement), -/* harmony export */ "element": () => (/* binding */ element), -/* harmony export */ "property": () => (/* binding */ property), -/* harmony export */ "query": () => (/* binding */ query), -/* harmony export */ "queryAll": () => (/* binding */ queryAll), -/* harmony export */ "listen": () => (/* binding */ listen), -/* harmony export */ "observe": () => (/* binding */ observe) -/* harmony export */ }); -/* harmony import */ var reflect_metadata__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! reflect-metadata */ "../app/node_modules/reflect-metadata/Reflect.js"); -/* harmony import */ var reflect_metadata__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(reflect_metadata__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lit-element */ "../app/node_modules/lit-element/lit-element.js"); - - - -class BaseElement extends lit_element__WEBPACK_IMPORTED_MODULE_1__.LitElement { - constructor() { - super(...arguments); - this._$ = {}; - this._$$ = {}; - this._listeners = []; - } - /** - * Find first element macthing the selector in the element's shadow root, caching the result - * @param selector query selector string - */ - $(sel, cached = false) { - if (!cached || !this._$[sel]) { - const e = this.renderRoot.querySelector(sel); - if (e) { - this._$[sel] = e; - } - } - return this._$[sel]; - } - /** - * Find first element macthing the selector in the element's shadow root, caching the result - * @param selector query selector string - */ - $$(sel, cached = false) { - if (!cached || !this._$[sel]) { - const e = this.renderRoot.querySelectorAll(sel); - if (e) { - this._$$[sel] = e; - } - } - return this._$$[sel]; - } - /** - * Fires a custom event with the specified name - * @param name Name of the event - * @param detail Optional event detail object - * @param bubbles Optional - if the event bubbles. Default is TRUE. - * @param composed Optional - if the event bubbles past the shadow root. Default is TRUE. - */ - dispatch(name, detail, bubbles = true, composed = true) { - if (name) { - const init = { - bubbles: typeof bubbles === "boolean" ? bubbles : true, - composed: typeof composed === "boolean" ? composed : true - }; - if (detail) { - init.detail = detail; - } - this.dispatchEvent(new CustomEvent(name, init)); - } - } - get node() { - return this; - } - connectedCallback() { - super.connectedCallback(); - const declarations = this.constructor._listeners; - if (!declarations) { - return; - } - for (const decl of declarations) { - (async () => { - let targets = []; - if (!decl.target) { - targets = [this]; - } - else if (typeof decl.target === "string") { - // a string target property indicates that the target is a child of this element, - // so we have to make sure the renderRoot is created first - await this.updateComplete; - targets = this.$$(decl.target); - } - else if (typeof decl.target.addEventListener === "function") { - targets = [decl.target]; - } - if (!targets.length) { - throw "invalid event target: " + decl.target; - } - const handler = (e) => { - decl.handler.call(this, e); - }; - for (const target of targets) { - target.addEventListener(decl.name, handler); - this._listeners.push({ - target, - handler, - name: decl.name - }); - } - })(); - } - } - disconnectedCallback() { - let listener; - while ((listener = this._listeners.pop())) { - listener.target.removeEventListener(listener.name, listener.handler); - } - } - updated(changed) { - let proto = this; - do { - const observers = proto.constructor._observers; - if (!observers) { - return; - } - for (const observer of observers) { - if (observer.props.some(p => changed.has(p))) { - observer.handler.call(this, changed); - } - } - } while (proto instanceof BaseElement && (proto = Object.getPrototypeOf(proto))); - } -} -/** - * Decorator for defining a new custom element - * @param name tag name of custom element - */ -function element(name) { - return (c) => { - if (name) { - window.customElements.define(name, c); - } - }; -} -function property(options) { - return (proto, name) => { - options = options || {}; - if (!options.type) { - // @ts-ignore - options.type = getType(proto, name); - } - proto.constructor.createProperty(name, options); - }; -} -function getType(prototype, propertyName) { - if (Reflect.hasMetadata) { - if (Reflect.hasMetadata("design:type", prototype, propertyName)) { - return Reflect.getMetadata("design:type", prototype, propertyName); - } - } - return null; -} -/** - * Decorator to create a getter for the specified selector - * @param selector selector to find the element - */ -function query(selector, cached = false) { - return (prototype, propertyName) => { - Object.defineProperty(prototype, propertyName, { - get() { - return this.$(selector, cached); - }, - enumerable: true, - configurable: true - }); - }; -} -/** - * Decorator to create a getter that returns a nodelist of all - * elements matching the selector - * @param selector selector query - */ -function queryAll(selector, cached = false) { - return (prototype, propertyName) => { - Object.defineProperty(prototype, propertyName, { - get() { - return this.$$(selector, cached); - }, - enumerable: true, - configurable: true - }); - }; -} -/** - * Decorator to add event handlers - * @param name name of event, e.g. 'click' - * @param selector EventTarget or a selector to the node to listen to e.g. '#myButton' - */ -function listen(name, target) { - return (prototype, methodName) => { - const { constructor } = prototype; - if (!constructor.hasOwnProperty("_listeners")) { - Object.defineProperty(constructor, "_listeners", { value: [] }); - } - constructor._listeners.push({ - name, - target, - handler: prototype[methodName] - }); - }; -} -/** - * Decortator to define an observer that gets called back - * whenever any of the specified property is updated - * @param properties list of properties to observe - */ -function observe(...properties) { - return (prototype, methodName) => { - const { constructor } = prototype; - if (!constructor.hasOwnProperty("_observers")) { - Object.defineProperty(constructor, "_observers", { value: [] }); - } - constructor._observers.push({ - props: properties, - handler: prototype[methodName] - }); - }; -} - - -/***/ }), - -/***/ "../app/src/elements/billing-dialog.ts": -/*!*********************************************!*\ - !*** ../app/src/elements/billing-dialog.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "BillingDialog": () => (/* binding */ BillingDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_countries__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/countries */ "../locale/src/countries.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./select */ "../app/src/elements/select.ts"); -/* harmony import */ var _assets_fonts_Nunito_Regular_ttf__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../assets/fonts/Nunito-Regular.ttf */ "../app/assets/fonts/Nunito-Regular.ttf"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - -let BillingDialog = class BillingDialog extends _dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog { - constructor() { - super(...arguments); - this.condensed = false; - this.dialogTitle = ""; - this.message = ""; - this.submitLabel = ""; - this.preventDismiss = true; - this._error = ""; - this._editingPaymentMethod = false; - this._isBusiness = false; - } - async show({ condensed, title, message, submitLabel, billingInfo }) { - this.condensed = condensed || false; - this.dialogTitle = title || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Update Billing Info"); - this.message = message || ""; - this.submitLabel = submitLabel || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Save"); - this._billingInfo = billingInfo; - this._editingPaymentMethod = !this._billingInfo || !this._billingInfo.paymentMethod; - // $l( - // "Add your billing info now so you're all set to keep using Padloc once the trial period is over. Don't worry, you won't be charged yet!" - // ) - if (_globals__WEBPACK_IMPORTED_MODULE_4__.app.state.billingProvider && !this._stripe) { - this._initStripe(); - } - return super.show(); - } - async _initStripe() { - const stripePubKey = _globals__WEBPACK_IMPORTED_MODULE_4__.app.state.billingProvider && _globals__WEBPACK_IMPORTED_MODULE_4__.app.state.billingProvider.config.publicKey; - if (!stripePubKey) { - return; - } - const Stripe = await (0,_lib_util__WEBPACK_IMPORTED_MODULE_3__.loadScript)("https://js.stripe.com/v3/", "Stripe"); - const stripe = (this._stripe = Stripe(stripePubKey)); - const elements = stripe.elements({ - fonts: [ - { - src: `local("Nunito Regular"), local("Nunito-Regular"), url(${_assets_fonts_Nunito_Regular_ttf__WEBPACK_IMPORTED_MODULE_10__["default"]}) format("truetype")`, - family: "Nunito", - style: "normal", - weight: 400 - } - ] - }); - const card = (this._cardElement = elements.create("card", { - iconStyle: "solid", - hidePostalCode: true, - style: { - base: { - fontFamily: '"Nunito", "Helvetica Neue", Helvetica, sans-serif', - fontSmoothing: "antialiased", - fontSize: "18px" - } - } - })); - const cardElement = document.createElement("div"); - this.appendChild(cardElement); - card.mount(cardElement); - let cardEmpty = true; - card.addEventListener("change", (e) => { - this._error = (e.error && e.error.message) || ""; - cardEmpty = e.empty; - }); - card.addEventListener("blur", () => { - if (cardEmpty) { - this._editingPaymentMethod = !this._billingInfo || !this._billingInfo.paymentMethod; - } - }); - } - async _editPaymentMethod() { - this._editingPaymentMethod = true; - await this.updateComplete; - this._cardElement.focus(); - } - async _submit() { - if (this._submitButton.state === "loading") { - return; - } - this._error = ""; - let paymentMethod; - if (this._editingPaymentMethod) { - this._submitButton.start(); - const { token, error } = await this._stripe.createToken(this._cardElement); - if (error) { - this._error = error.message; - this._submitButton.fail(); - return; - } - this._submitButton.success(); - paymentMethod = { - name: `${token.card.brand} •••• •••• •••• ${token.card.last4}`, - source: token.id - }; - } - const address = new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.BillingAddress().fromRaw({ - name: this._nameInput.value, - street: this._streetInput.value, - postalCode: this._zipInput.value, - city: this._cityInput.value, - country: this._countrySelect.selected.code - }); - const coupon = this._couponInput.value; - this.done(new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.UpdateBillingParams({ - account: this._billingInfo.account, - org: this._billingInfo.org, - email: this._emailInput.value, - address, - paymentMethod, - coupon - })); - } - renderContent() { - const billingInfo = this._billingInfo || new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.BillingInfo(); - let { email, address, paymentMethod, discount } = billingInfo; - email = email || (_globals__WEBPACK_IMPORTED_MODULE_4__.app.account.billing && _globals__WEBPACK_IMPORTED_MODULE_4__.app.account.billing.email) || _globals__WEBPACK_IMPORTED_MODULE_4__.app.account.email; - const name = address.name || _globals__WEBPACK_IMPORTED_MODULE_4__.app.account.name; - const countryOptions = [ - { code: "", toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Select A Country") }, - ..._padloc_locale_src_countries__WEBPACK_IMPORTED_MODULE_0__.countries.map(c => Object.assign(c, { toString: () => c.name })) - ]; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - -
    ${this.dialogTitle}
    - this.done()}> -
    - -
    - ${!_globals__WEBPACK_IMPORTED_MODULE_4__.app.billingEnabled - ? _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)('To update your billing info and payment method, please log in through our website (found under "Settings") ' + - "or contact us at ")} - support@padloc.app! -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - ${this.message} -
    - - - -
    - -
    - -
    - ${this._error} -
    - - ${paymentMethod - ? _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - -
    - ${paymentMethod.name} -
    - -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_5__.html ``} - -
    - - - - - - - - -
    - - - -
    - - c.code === address.country)} - > - - - - (this._isBusiness = e.detail.value)} - > - - -
    - - - -
    - ${discount && discount.name} - (${discount && discount.coupon}) -
    - - - -
    - - ${this.submitLabel} - - - -
    - `} -
    - `; - } - renderAfter() { - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` - - `; - } -}; -BillingDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_5__.css ` - .inner { - background: var(--color-quaternary); - } - - h1 { - display: block; - text-align: center; - } - - label { - font-weight: bold; - margin: 8px 16px; - font-size: var(--font-size-small); - } - - .card-wrapper { - padding: 14px 0 14px 12px; - } - - .city-wrapper { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 8px; - margin: 8px; - } - - .city-wrapper > * { - margin: 0; - } - - .payment-method { - display: flex; - align-items: center; - padding: 5px; - font-weight: bold; - } - - .message { - font-size: var(--font-size-small); - padding: 0 20px 10px 20px; - } - - .skip-button { - background: none; - color: var(--color-tertiary); - margin-top: 8px; - } - - .discount { - padding: 12px; - } - - .discount .name { - font-weight: bold; - } - - .discount .coupon { - opacity: 0.7; - font-family: var(--font-family-mono); - } - - .payment-disabled-message { - padding: 30px; - text-align: center; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Boolean) -], BillingDialog.prototype, "condensed", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], BillingDialog.prototype, "dialogTitle", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], BillingDialog.prototype, "message", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], BillingDialog.prototype, "submitLabel", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], BillingDialog.prototype, "_error", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.BillingInfo) -], BillingDialog.prototype, "_billingInfo", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Boolean) -], BillingDialog.prototype, "_editingPaymentMethod", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Boolean) -], BillingDialog.prototype, "_isBusiness", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#submitButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], BillingDialog.prototype, "_submitButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#emailInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], BillingDialog.prototype, "_emailInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#nameInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], BillingDialog.prototype, "_nameInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#streetInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], BillingDialog.prototype, "_streetInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#zipInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], BillingDialog.prototype, "_zipInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#cityInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], BillingDialog.prototype, "_cityInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#countrySelect"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_9__.Select) -], BillingDialog.prototype, "_countrySelect", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#couponInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], BillingDialog.prototype, "_couponInput", void 0); -BillingDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.element)("pl-billing-dialog") -], BillingDialog); - - - -/***/ }), - -/***/ "../app/src/elements/billing-info.ts": -/*!*******************************************!*\ - !*** ../app/src/elements/billing-info.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "BillingInfoElement": () => (/* binding */ BillingInfoElement) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_countries__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/countries */ "../locale/src/countries.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _billing_dialog__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./billing-dialog */ "../app/src/elements/billing-dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - -let BillingInfoElement = class BillingInfoElement extends _base__WEBPACK_IMPORTED_MODULE_5__.BaseElement { - constructor() { - super(...arguments); - this.billing = null; - } - async _update() { - if (this._editButton.state === "loading") { - return; - } - const billingInfo = this.billing; - const params = await this._billingDialog.show({ billingInfo }); - if (params) { - this._editButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_4__.app.updateBilling(params); - this._editButton.success(); - } - catch (e) { - this._editButton.fail(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)(e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Something went wrong. Please try again later!"), { type: "warning" }); - throw e; - } - } - } - render() { - if (!this.billing) { - return _base__WEBPACK_IMPORTED_MODULE_5__.html ``; - } - const billing = this.billing; - const country = _padloc_locale_src_countries__WEBPACK_IMPORTED_MODULE_0__.countries.find(c => c.code === billing.address.country); - const postalCode = billing.address.postalCode; - const city = billing.address.city; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` - - - - - - -
    - ${billing.paymentMethod - ? _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - ${billing.paymentMethod.name} -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Add Payment Method")} -
    - `} -
    - - ${billing.email || billing.address.name - ? _base__WEBPACK_IMPORTED_MODULE_5__.html ` - - -
    -
    ${billing.email}
    -
    ${billing.address.name}
    -
    ${billing.address.street}
    -
    - ${postalCode ? `${postalCode}, ` : ""} ${city ? `${city}, ` : ""} - ${country ? `${country.name}` : ""} -
    -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_5__.html ``} - ${billing.discount - ? _base__WEBPACK_IMPORTED_MODULE_5__.html ` - - -
    - ${billing.discount.name} -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_5__.html ``} - `; - } -}; -BillingInfoElement.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_2__.shared, - _base__WEBPACK_IMPORTED_MODULE_5__.css ` - :host { - padding: 8px; - display: grid; - grid-template-columns: 36px 1fr; - position: relative; - } - - .payment-method, - .billing-email, - .discount { - font-weight: bold; - } - - .data { - margin: 8px 6px; - } - - .edit-button { - position: absolute; - top: 8px; - right: 8px; - z-index: 1; - } - - .missing { - opacity: 0.7; - cursor: pointer; - } - - .data-icon { - width: 36px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], BillingInfoElement.prototype, "billing", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#editButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], BillingInfoElement.prototype, "_editButton", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.dialog)("pl-billing-dialog"), - __metadata("design:type", _billing_dialog__WEBPACK_IMPORTED_MODULE_8__.BillingDialog) -], BillingInfoElement.prototype, "_billingDialog", void 0); -BillingInfoElement = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.element)("pl-billing-info") -], BillingInfoElement); - - - -/***/ }), - -/***/ "../app/src/elements/card-input.ts": -/*!*****************************************!*\ - !*** ../app/src/elements/card-input.ts ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CardInput": () => (/* binding */ CardInput) -/* harmony export */ }); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _assets_fonts_Nunito_Regular_ttf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../assets/fonts/Nunito-Regular.ttf */ "../app/assets/fonts/Nunito-Regular.ttf"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - -let CardInput = class CardInput extends _base__WEBPACK_IMPORTED_MODULE_2__.BaseElement { - constructor() { - super(...arguments); - this.stripePubKey = "pk_test_jTF9rjIV9LyiyJ6ir2ARE8Oy"; - this.error = ""; - } - async getToken() { - this.error = ""; - const { token, error } = await this._stripe.createToken(this._cardElement); - if (error) { - this.error = error.message; - this.dispatch("change", { error: this.error }); - throw error; - } - return token.id; - } - async connectedCallback() { - super.connectedCallback(); - const Stripe = await (0,_lib_util__WEBPACK_IMPORTED_MODULE_0__.loadScript)("https://js.stripe.com/v3/", "Stripe"); - const stripe = (this._stripe = Stripe(this.stripePubKey)); - const elements = stripe.elements({ - fonts: [ - { - src: `local("Nunito Regular"), local("Nunito-Regular"), url(${_assets_fonts_Nunito_Regular_ttf__WEBPACK_IMPORTED_MODULE_3__["default"]}) format("truetype")`, - family: "Nunito", - style: "normal", - weight: 400 - } - ] - }); - const card = (this._cardElement = elements.create("card", { - iconStyle: "solid", - hidePostalCode: true, - style: { - base: { - fontFamily: '"Nunito", "Helvetica Neue", Helvetica, sans-serif', - fontSmoothing: "antialiased", - fontSize: "18px" - }, - invalid: { - // color: "#ff6666", - // textShadow: "none" - } - } - })); - const cardElement = document.createElement("div"); - this.appendChild(cardElement); - card.mount(cardElement); - card.addEventListener("change", (e) => { - this.error = (e.error && e.error.message) || ""; - this.dispatch("change", { error: this.error }); - }); - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` - - `; - } -}; -CardInput.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_1__.shared, - _base__WEBPACK_IMPORTED_MODULE_2__.css ` - :host { - display: block; - padding: 14px 0 14px 12px; - border-radius: var(--border-radius); - background: var(--color-shade-1); - } - - :host(.item) { - background: var(--color-tertiary); - border: solid 1px var(--color-shade-1); - border-bottom-width: 3px; - margin: var(--gutter-size); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Object) -], CardInput.prototype, "stripePubKey", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Object) -], CardInput.prototype, "error", void 0); -CardInput = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.element)("pl-card-input") -], CardInput); - - - -/***/ }), - -/***/ "../app/src/elements/choose-plan-dialog.ts": -/*!*************************************************!*\ - !*** ../app/src/elements/choose-plan-dialog.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ChoosePlanDialog": () => (/* binding */ ChoosePlanDialog) -/* harmony export */ }); -/* harmony import */ var lit_html_directives_unsafe_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html/directives/unsafe-html */ "../app/node_modules/lit-html/directives/unsafe-html.js"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @padloc/core/src/org */ "../core/src/org.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - -let ChoosePlanDialog = class ChoosePlanDialog extends _dialog__WEBPACK_IMPORTED_MODULE_7__.Dialog { - constructor() { - super(...arguments); - this._plans = []; - } - async show(org) { - const result = super.show(); - this._org = org; - if (!_globals__WEBPACK_IMPORTED_MODULE_5__.app.state.billingProvider) { - this.done(); - } - else { - this._plans = _globals__WEBPACK_IMPORTED_MODULE_5__.app.state.billingProvider.plans.filter(p => [_padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.PlanType.Family, _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.PlanType.Team, _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.PlanType.Business].includes(p.type)) - .sort((a, b) => a.type - b.type); - } - return result; - } - _renderPlan(plan) { - const monthlyPrice = Math.round(plan.cost / 12); - const trialDaysLeft = this._org && this._org.billing ? this._org.billing.trialDaysLeft : 30; - return _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    this.done(plan)} - > -
    -
    - ${plan.name} -
    -
    - ${(0,lit_html_directives_unsafe_html__WEBPACK_IMPORTED_MODULE_0__.unsafeHTML)(plan.description.replace(/\*\*(.+)\*\*/g, "$1"))} -
    -
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Free For {0} Days", trialDaysLeft.toString())} -
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("then")} -
    -
    -
    - $ -
    -
    - ${Math.floor(monthlyPrice / 100)} -
    -
    - .${(monthlyPrice % 100).toString().padEnd(2, "0")} -
    -
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("per user / month")} -
    -
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("USD, billed annually")} -
    -
    - -
      - ${plan.features.map(feature => _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    • - ${(0,lit_html_directives_unsafe_html__WEBPACK_IMPORTED_MODULE_0__.unsafeHTML)(feature.replace(/\*\*(.+)\*\*/g, "$1"))} -
    • - `)} -
    - -
    - - -
    - `; - } - // - // renderBefore() { - // return html` - //

    ${$l("Choose A Plan")}

    - // `; - // } - renderContent() { - const plans = this._plans; - return _base__WEBPACK_IMPORTED_MODULE_6__.html ` - ${plans.map(plan => this._renderPlan(plan))} - `; - } -}; -ChoosePlanDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_7__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_6__.css ` - h2 { - color: var(--color-tertiary); - margin: 0; - } - - .outer { - padding: 0; - } - - .inner { - background: transparent; - box-shadow: none; - max-width: 100%; - width: 100%; - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.scroll()} - scroll-snap-type: x mandatory; - white-space: nowrap; - padding: 12px 24px; - text-align: center; - display: block; - } - - .plans { - min-width: 100%; - display: flex; - padding: 20px 50px; - box-sizing: border-box; - justify-content: center; - } - - .plan { - flex: 1; - white-space: normal; - width: 100%; - max-width: 330px; - background: var(--color-tertiary); - border-radius: var(--border-radius); - overflow: hidden; - display: inline-flex; - flex-direction: column; - cursor: pointer; - scroll-snap-align: center; - text-align: center; - will-change: transform; - } - - .plan:not(:last-child) { - margin-right: 12px; - } - - .plan-header { - text-align: center; - padding: 20px; - background: var(--color-highlight); - color: var(--color-highlight-text); - display: flex; - flex-direction: column; - position: relative; - } - - /* - .plan-header::before { - content: ""; - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.fullbleed()} - background: linear-gradient(rgba(255, 255, 255, 0.2) 0%, rgba(0, 0, 0, 0.2) 100%); - } - */ - - .plan-name { - font-size: 2rem; - margin-bottom: 10px; - font-weight: bold; - } - - .plan-description { - font-size: 1.1rem; - } - - .plan-trial { - font-size: 1.5rem; - margin-top: 8px; - } - - .plan-then { - font-size: var(--font-size-small); - margin: 4px 0 -4px 0; - } - - .plan-price { - letter-spacing: 0.1em; - display: flex; - align-items: flex-start; - justify-content: center; - font-weight: bold; - font-size: 1.2rem; - margin-top: 8px; - } - - .plan-price-currency { - line-height: 1em; - margin-top: 0.4em; - } - - .plan-price-dollars { - font-size: 3em; - line-height: 1em; - } - - .plan-price-cents { - font-size: 1.5em; - line-height: 1em; - margin-top: 0.2em; - } - - .plan-unit { - font-size: var(--font-size-small); - } - - .plan-fineprint { - font-size: var(--font-size-tiny); - opacity: 0.8; - } - - .features { - font-size: var(--font-size-small); - } - - .features > * { - margin: 0; - padding: 10px 15px; - border: none; - border-radius: 0; - } - - .features > :not(:last-child) { - border-bottom: solid 1px var(--color-shade-1); - } - - .plan button { - margin: 8px; - background: var(--color-highlight); - color: var(--color-highlight-text); - font-weight: bold; - } - - .tabs { - color: var(--color-tertiary); - justify-content: center; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Array) -], ChoosePlanDialog.prototype, "_plans", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_3__.Org) -], ChoosePlanDialog.prototype, "_org", void 0); -ChoosePlanDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.element)("pl-choose-plan-dialog") -], ChoosePlanDialog); - - - -/***/ }), - -/***/ "../app/src/elements/clipboard.ts": -/*!****************************************!*\ - !*** ../app/src/elements/clipboard.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Clipboard": () => (/* binding */ Clipboard) -/* harmony export */ }); -/* harmony import */ var lit_html_directives_style_map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html/directives/style-map */ "../app/node_modules/lit-html/directives/style-map.js"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - -let Clipboard = class Clipboard extends _base__WEBPACK_IMPORTED_MODULE_3__.BaseElement { - constructor() { - super(...arguments); - this.item = null; - this.field = null; - this._tMinusClear = 0; - this._resolve = null; - } - shouldUpdate() { - return !!this.item && !!this.field; - } - render() { - const { item, field, _tMinusClear } = this; - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    - - -
    ${item.name} / ${field.name}
    - - -
    - `; - } - async set(item, field, duration = 60) { - clearInterval(this._interval); - this.item = item; - this.field = field; - const value = await field.transform(); - (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__.setClipboard)(value); - const tStart = Date.now(); - this._tMinusClear = duration; - this._interval = window.setInterval(() => { - const dt = tStart + duration * 1000 - Date.now(); - if (dt <= 0) { - this.clear(); - } - else { - this._tMinusClear = Math.floor(dt / 1000); - } - }, 1000); - setTimeout(() => this.classList.add("showing"), 10); - return new Promise(resolve => { - this._resolve = resolve; - }); - } - clear() { - clearInterval(this._interval); - (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__.setClipboard)(" "); - this.classList.remove("showing"); - this._resolve && this._resolve(); - this._resolve = null; - } -}; -Clipboard.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_2__.shared, - _base__WEBPACK_IMPORTED_MODULE_3__.css ` - :host { - display: flex; - justify-content: center; - transition: transform 0.5s cubic-bezier(1, -0.3, 0, 1.3); - position: fixed; - left: 70px; - right: 70px; - bottom: 15px; - z-index: 100; - pointer-events: none; - } - - .inner { - display: flex; - align-items: center; - border-radius: var(--border-radius); - color: var(--color-background); - text-shadow: rgba(0, 0, 0, 0.2) 0 1px 0; - max-width: 100%; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px; - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.gradientHighlight(true)} - pointer-events: auto; - } - - pl-icon { - flex: none; - } - - :host(:not(.showing)) { - transform: translateY(150%); - } - - .content { - flex: 1; - padding: 15px; - } - - .name { - font-weight: bold; - flex-grow: 1; - font-size: var(--font-size-tiny); - line-height: 15px; - margin: 4px 4px 4px 0; - text-align: center; - } - - .clear-button { - padding: 0; - width: 36px; - height: 36px; - margin: 4px; - line-height: normal; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - border-radius: 100%; - font-size: 10px; - flex: none; - background: transparent; - position: relative; - font-weight: bold; - } - - .countdown { - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.fullbleed()} - width: 32px; - height: 32px; - margin: auto; - border-radius: 100%; - } - - .countdown circle { - transform-origin: center center; - transform: rotate(-90deg); - fill: none; - stroke: currentColor; - stroke-width: 0.8; - stroke-dasharray: 25; - stroke-linecap: round; - transition: stroke-dashoffset 1s linear; - } - - @supports (-webkit-overflow-scrolling: touch) { - :host { - left: 80px; - right: 80px; - bottom: calc(env(safe-area-inset-bottom) / 1.5); - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Object) -], Clipboard.prototype, "item", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Object) -], Clipboard.prototype, "field", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Number) -], Clipboard.prototype, "_tMinusClear", void 0); -Clipboard = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.element)("pl-clipboard") -], Clipboard); - - - -/***/ }), - -/***/ "../app/src/elements/create-invites-dialog.ts": -/*!****************************************************!*\ - !*** ../app/src/elements/create-invites-dialog.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CreateInvitesDialog": () => (/* binding */ CreateInvitesDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - -let CreateInvitesDialog = class CreateInvitesDialog extends _dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog { - constructor() { - super(...arguments); - this._emails = []; - this._error = ""; - this._maxEmails = 50; - } - _isValid(email) { - return /\S+@\S+\.\S+/.test(email); - } - _input() { - const emails = this._emailInput.value.split(/[,;\s]+/); - this._emails = [...new Set([...this._emails, ...emails.slice(0, -1).filter(e => !!e)])]; - this._emailInput.value = emails[emails.length - 1]; - this.requestUpdate(); - } - _enter() { - const emails = this._emailInput.value.split(/[,;\s]+/); - this._emails = [...new Set([...this._emails, ...emails.filter(e => !!e)])]; - this._emailInput.value = ""; - this.requestUpdate(); - } - _keydown(e) { - if (e.key === "Backspace" && !this._emailInput.value) { - this._emails.pop(); - this.requestUpdate(); - } - } - _remove(email) { - this._emails = this._emails.filter(e => e !== email); - } - async _submit() { - if (this._submitButton.state === "loading") { - return; - } - if (!this._emails.length) { - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter at least one email address!"); - this.rumble(); - return; - } - if (this._emails.length > this._maxEmails) { - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You have entered too many email addresses! Please delete some before submitting!"); - this.rumble(); - return; - } - if (this._emails.some(email => !this._isValid(email))) { - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Some of the emails you entered appear to be invalid!"); - this.rumble(); - return; - } - this._error = ""; - this._submitButton.start(); - try { - const invites = await _globals__WEBPACK_IMPORTED_MODULE_1__.app.createInvites(this._org, this._emails); - this._submitButton.success(); - this.done(invites); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong! Please try again later!"); - this._submitButton.fail(); - this.rumble(); - } - } - async show(org) { - this._org = org; - this._emails = []; - this._error = ""; - return super.show(); - } - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Invite New Members")}
    -
    - -
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter up to {0} email addresses of the persons you would like to invite, separated by spaces or commas!", this._maxEmails.toString())} -
    - -
    this._emailInput.focus()}> - ${this._emails.map(email => _base__WEBPACK_IMPORTED_MODULE_2__.html ` -
    -
    ${email}
    - this._remove(email)}> -
    - `)} - - - - -
    - -
    ${this._error}
    -
    - - - `; - } -}; -CreateInvitesDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_2__.css ` - :host { - text-align: center; - } - - .inner { - background: var(--color-quaternary); - } - - .message { - font-size: var(--font-size-small); - margin: 8px 20px; - } - - .tags { - flex-wrap: wrap; - margin: 8px; - padding: 12px 12px 6px 12px; - justify-content: center; - position: relative; - } - - .tags > * { - margin-bottom: 6px; - } - - .tag > pl-icon { - font-size: var(--font-size-micro); - margin: 0 -3px 0 0; - } - - pl-input { - text-align: left; - background: transparent; - font-size: var(--font-size-small); - padding: 4px 8px; - } - - .email-count { - font-weight: bold; - position: absolute; - bottom: 8px; - right: 8px; - margin: 0; - font-size: var(--font-size-tiny); - } - - .email-count[warning] { - color: var(--color-negative); - } - - .error.item { - padding: 8px; - color: var(--color-negative); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Array) -], CreateInvitesDialog.prototype, "_emails", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", String) -], CreateInvitesDialog.prototype, "_error", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.query)("pl-input"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_3__.Input) -], CreateInvitesDialog.prototype, "_emailInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.query)("#submitButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_5__.LoadingButton) -], CreateInvitesDialog.prototype, "_submitButton", void 0); -CreateInvitesDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.element)("pl-create-invites-dialog") -], CreateInvitesDialog); - - - -/***/ }), - -/***/ "../app/src/elements/create-item-dialog.ts": -/*!*************************************************!*\ - !*** ../app/src/elements/create-item-dialog.ts ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CreateItemDialog": () => (/* binding */ CreateItemDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/item */ "../core/src/item.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./select */ "../app/src/elements/select.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - -let CreateItemDialog = class CreateItemDialog extends _dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog { - constructor() { - super(...arguments); - this._template = _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__.ITEM_TEMPLATES[0]; - this.preventDismiss = true; - } - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("New Vault Item")}
    -
    - -
    - _globals__WEBPACK_IMPORTED_MODULE_2__.app.hasWritePermissions(v))} - > - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("What kind of item you would like to add?")} -
    - -
    - ${_padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__.ITEM_TEMPLATES.map(template => _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    (this._template = template)} - ?active=${this._template === template} - > - -
    ${template.toString()}
    -
    - `)} -
    -
    - - - `; - } - async _enter() { - const vault = this._vaultSelect.selected; - const quota = _globals__WEBPACK_IMPORTED_MODULE_2__.app.getItemsQuota(vault); - if (quota !== -1 && vault.items.size >= quota) { - this.done(); - if (_globals__WEBPACK_IMPORTED_MODULE_2__.app.billingEnabled) { - this.dispatch("get-premium", { - message: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("You have reached the maximum number of items for this account. " + - "Upgrade to Premium to get unlimited items for your private vault!"), - icon: "list" - }); - } - else { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("You have reached the maximum number of items for this account!"), { type: "warning" }); - } - return; - } - const item = await _globals__WEBPACK_IMPORTED_MODULE_2__.app.createItem("", vault, this._template.fields.map(f => new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__.Field({ ...f, value: "" }))); - this.done(item); - const params = { ..._globals__WEBPACK_IMPORTED_MODULE_2__.router.params, edit: "true", newitem: "true" }; - if (this._template.attachment) { - params.addattachment = "true"; - } - _globals__WEBPACK_IMPORTED_MODULE_2__.router.go(`items/${item.id}`, params); - } - async show(vault = _globals__WEBPACK_IMPORTED_MODULE_2__.app.mainVault) { - await this.updateComplete; - this._vaultSelect.selected = vault; - return super.show(); - } -}; -CreateItemDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - .inner { - background: var(--color-quaternary); - max-width: 500px; - } - - pl-input, - pl-select { - text-align: center; - } - - .templates { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - grid-gap: 8px; - margin: var(--gutter-size); - } - - .template { - padding: 4px; - display: flex; - align-items: center; - margin: 0; - font-weight: 600; - } - - .vault-select, - .template[active] { - background: var(--color-primary); - color: var(--color-tertiary); - font-weight: bold; - text-shadow: rgba(0, 0, 0, 0.15) 0 2px 0; - } - - .icon { - margin-right: 4px; - } - - .message { - text-align: center; - margin: 20px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#vaultSelect"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_5__.Select) -], CreateItemDialog.prototype, "_vaultSelect", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], CreateItemDialog.prototype, "_template", void 0); -CreateItemDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-create-item-dialog") -], CreateItemDialog); - - - -/***/ }), - -/***/ "../app/src/elements/create-org-dialog.ts": -/*!************************************************!*\ - !*** ../app/src/elements/create-org-dialog.ts ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CreateOrgDialog": () => (/* binding */ CreateOrgDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _card_input__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./card-input */ "../app/src/elements/card-input.ts"); -/* harmony import */ var _billing_dialog__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./billing-dialog */ "../app/src/elements/billing-dialog.ts"); -/* harmony import */ var _choose_plan_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./choose-plan-dialog */ "../app/src/elements/choose-plan-dialog.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - -let CreateOrgDialog = class CreateOrgDialog extends _dialog__WEBPACK_IMPORTED_MODULE_5__.Dialog { - constructor() { - super(...arguments); - this.plan = null; - this.quantity = 1; - this._updateBillingParams = null; - this._error = ""; - this._org = null; - } - async show(plan) { - this.plan = plan; - this.quantity = (plan && plan.min) || 1; - this._updateBillingParams = null; - this._org = null; - this._error = ""; - return super.show(); - } - async _submit() { - if (this._submitButton.state === "loading") { - return; - } - const name = this._nameInput.value; - if (!name) { - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter an organization name!"); - return; - } - this._error = ""; - this._submitButton.start(); - if (!this._org) { - try { - this._org = await _globals__WEBPACK_IMPORTED_MODULE_3__.app.createOrg(name); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"); - this._submitButton.fail(); - return; - } - } - if (this.plan) { - const params = this._updateBillingParams || new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.UpdateBillingParams(); - params.plan = this.plan.id; - params.members = this.quantity; - params.org = this._org.id; - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.updateBilling(params); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"); - this._submitButton.fail(); - return; - } - } - const org = (this._org = _globals__WEBPACK_IMPORTED_MODULE_3__.app.getOrg(this._org.id)); - // Create first vault and group - if (org.quota.groups) { - const everyone = await _globals__WEBPACK_IMPORTED_MODULE_3__.app.createGroup(org, "Everyone", [org.getMember(_globals__WEBPACK_IMPORTED_MODULE_3__.app.account)]); - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.createVault("Main", org, [], [{ name: everyone.name, readonly: false }]); - } - else { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.createVault("Main", org, [{ id: _globals__WEBPACK_IMPORTED_MODULE_3__.app.account.id, readonly: false }]); - } - this._submitButton.success(); - this.done(org); - } - async _updateQuantity() { - const quantity = parseInt(this._quantityInput.value); - const { min, max } = this.plan; - if (!isNaN(quantity) && quantity >= min && quantity <= max) { - this.quantity = quantity; - } - } - async _updateBillingInfo() { - this.open = false; - const billingInfo = new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.BillingInfo(); - billingInfo.address.name = this._nameInput.value; - const billing = await this._billingDialog.show({ - billingInfo - }); - if (billing) { - this._updateBillingParams = billing; - this._error = ""; - } - this.open = true; - } - async _changePlan() { - this.open = false; - const plan = await this._choosePlanDialog.show(); - if (plan) { - this.plan = plan; - } - this.open = true; - } - _renderBilling(plan) { - const monthlyPrice = Math.round((this.quantity * plan.cost) / 12); - const paymentMethod = this._updateBillingParams && this._updateBillingParams.paymentMethod; - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    - - -
    - ${plan.name} -
    - -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Free For {0} Days", (30).toString())} -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("then")} -
    - -
    -
    $
    -
    - ${Math.floor(monthlyPrice / 100)} -
    -
    - .${(monthlyPrice % 100).toString().padEnd(2, "0")} -
    -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("per month")} -
    - -
    - (${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("USD, billed annually")}) -
    - -
    -
    - -
    -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("{0} min", plan.min.toString())}
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("{0} max", plan.max.toString())}
    -
    - (this._quantityInput.value = this.quantity.toString())} - > -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Seats")} -
    -
    - -
    - - ${paymentMethod - ? _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    - ${paymentMethod.name} -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Add Billing Info")} -
    - `} -
    - `; - } - renderContent() { - const plan = this.plan; - const color = (plan && plan.color) || "var(--color-primary)"; - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Create Organization")}
    - -
    - -
    - - - ${plan ? this._renderBilling(plan) : _base__WEBPACK_IMPORTED_MODULE_4__.html ``} - -
    - ${this._error} -
    - - - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Create")} - -
    - `; - } -}; -CreateOrgDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_5__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - .inner { - background: var(--color-quaternary); - text-align: center; - } - - .plan { - text-align: center; - padding: 20px; - background: var(--color-highlight); - color: var(--color-highlight-text); - display: flex; - flex-direction: column; - position: relative; - } - - .plan-name { - font-size: 1.7rem; - margin-bottom: 8px; - font-weight: bold; - } - - .plan-trial { - font-size: 1.2rem; - margin-bottom: 8px; - } - - .plan-then { - font-size: var(--font-size-tiny); - margin-bottom: 8px; - } - - .plan-price { - letter-spacing: 0.1em; - display: flex; - align-items: flex-start; - justify-content: center; - font-weight: bold; - font-size: 1rem; - margin: 5px; - } - - .plan-price-currency { - line-height: 1em; - margin-top: 0.4em; - } - - .plan-price-dollars { - font-size: 3em; - line-height: 1em; - } - - .plan-price-cents { - font-size: 1.5em; - line-height: 1em; - margin-top: 0.2em; - } - - .plan-unit { - font-size: var(--font-size-small); - } - - .plan-fineprint { - font-size: var(--font-size-tiny); - opacity: 0.7; - margin: 4px 0 -4px 0; - } - - pl-loading-button { - font-weight: bold; - } - - pl-loading-button.primary { - margin: 8px; - background: var(--color-highlight); - color: var(--color-highlight-text); - font-weight: bold; - border-bottom: solid 3px var(--color-shade-2); - } - - .error { - color: var(--color-negative); - padding: 8px; - text-align: center; - } - - .payment-method { - display: flex; - align-items: center; - justify-content: center; - padding: 4px; - font-weight: bold; - } - - .quantity-wrapper { - display: flex; - align-items: center; - justify-content: center; - margin: 8px; - } - - .quantity-label { - font-weight: bold; - padding: 12px; - font-size: 1.2em; - text-align: left; - } - - .quantity-input { - width: 60px; - margin: 0; - font-weight: bold; - font-size: 1.5rem; - } - - .quantity-minmax { - font-size: var(--font-size-micro); - opacity: 0.5; - text-align: right; - padding: 12px; - } - - .edit-plan-icon { - position: absolute; - top: 8px; - right: 8px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], CreateOrgDialog.prototype, "plan", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Number) -], CreateOrgDialog.prototype, "quantity", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], CreateOrgDialog.prototype, "_updateBillingParams", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], CreateOrgDialog.prototype, "_error", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], CreateOrgDialog.prototype, "_org", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#nameInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_10__.Input) -], CreateOrgDialog.prototype, "_nameInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#quantityInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_10__.Input) -], CreateOrgDialog.prototype, "_quantityInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#submitButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_6__.LoadingButton) -], CreateOrgDialog.prototype, "_submitButton", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.dialog)("pl-billing-dialog"), - __metadata("design:type", _billing_dialog__WEBPACK_IMPORTED_MODULE_8__.BillingDialog) -], CreateOrgDialog.prototype, "_billingDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.dialog)("pl-choose-plan-dialog"), - __metadata("design:type", _choose_plan_dialog__WEBPACK_IMPORTED_MODULE_9__.ChoosePlanDialog) -], CreateOrgDialog.prototype, "_choosePlanDialog", void 0); -CreateOrgDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-create-org-dialog") -], CreateOrgDialog); - - - -/***/ }), - -/***/ "../app/src/elements/dialog.ts": -/*!*************************************!*\ - !*** ../app/src/elements/dialog.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Dialog": () => (/* binding */ Dialog) -/* harmony export */ }); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_animation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/animation */ "../app/src/lib/animation.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -var Dialog_1; - - - - -let Dialog = Dialog_1 = class Dialog extends _base__WEBPACK_IMPORTED_MODULE_2__.BaseElement { - constructor() { - super(...arguments); - this.open = false; - this.preventDismiss = false; - this.preventAutoClose = false; - this.dismissOnTapOutside = true; - this.hideApp = false; - this.isShowing = false; - } - static closeAll() { - for (const dialog of Dialog_1.openDialogs) { - if (!dialog.preventAutoClose) { - dialog.done(); - } - } - } - done(result) { - this._resolve && this._resolve(result); - this._resolve = null; - this.open = false; - Dialog_1.openDialogs.delete(this); - } - async show(_input = undefined) { - Dialog_1.openDialogs.add(this); - this.open = true; - return new Promise(resolve => { - this._resolve = resolve; - }); - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` -
    - -
    - ${this.renderBefore()} -
    e.stopPropagation()}> - ${this.renderContent()} -
    - ${this.renderAfter()} -
    - `; - } - renderBefore() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` - - `; - } - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` - - `; - } - renderAfter() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` - - `; - } - _back(e) { - if (this.open) { - this.dismiss(); - e.preventDefault(); - e.stopPropagation(); - } - } - rumble() { - (0,_lib_animation__WEBPACK_IMPORTED_MODULE_1__.animateElement)(this.$("#inner"), { animation: "rumble", duration: 200, clear: true }); - } - _openChanged() { - clearTimeout(this._hideTimeout); - // Set _display: block_ if we're showing. If we're hiding - // we need to wait until the transitions have finished before we - // set _display: none_. - if (this.open) { - if (_input__WEBPACK_IMPORTED_MODULE_3__.Input.activeInput) { - _input__WEBPACK_IMPORTED_MODULE_3__.Input.activeInput.blur(); - } - this.style.display = ""; - this.offsetLeft; - this.isShowing = true; - this.setAttribute("open", ""); - } - else { - this.removeAttribute("open"); - this._hideTimeout = window.setTimeout(() => { - this.style.display = "none"; - this.isShowing = false; - }, 400); - } - this.dispatch(this.open ? "dialog-open" : "dialog-close", { dialog: this }, true, true); - } - _tappedOutside() { - if (this.dismissOnTapOutside) { - this.dismiss(); - } - } - dismiss() { - if (!this.preventDismiss) { - this.dispatch("dialog-dismiss"); - this.done(); - } - } -}; -Dialog.openDialogs = new Set(); -Dialog.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_0__.shared, - _base__WEBPACK_IMPORTED_MODULE_2__.css ` - :host { - display: block; - ${_styles__WEBPACK_IMPORTED_MODULE_0__.mixins.fullbleed()} - z-index: 10; - } - - :host(:not([open])) { - pointer-events: none; - } - - .outer { - height: 100%; - display: flex; - position: relative; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 12px; - box-sizing: border-box; - transition: transform 400ms cubic-bezier(0.08, 0.85, 0.3, 1.15) 0s, - opacity 200ms cubic-bezier(0.6, 0, 0.2, 1) 0s; - } - - .scrim { - display: block; - background: #000000; - opacity: 0; - transition: opacity 400ms cubic-bezier(0.6, 0, 0.2, 1); - ${_styles__WEBPACK_IMPORTED_MODULE_0__.mixins.fullbleed()} - position: fixed; - } - - :host([open]) .scrim { - opacity: 0.8; - } - - .inner { - position: relative; - width: 100%; - max-height: 100%; - box-sizing: border-box; - max-width: var(--pl-dialog-max-width, 400px); - z-index: 1; - border-radius: var(--border-radius); - box-shadow: rgba(0, 0, 0, 0.25) 0 0 5px; - overflow: hidden; - background: var(--color-tertiary); - display: flex; - flex-direction: column; - } - - .content { - flex: 1; - ${_styles__WEBPACK_IMPORTED_MODULE_0__.mixins.scroll()} - } - - .footer { - background: var(--color-tertiary); - margin: 0; - border-top: solid 1px var(--color-shade-1); - } - - .actions { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); - grid-gap: var(--gutter-size); - margin: var(--gutter-size); - } - - .actions.vertical { - grid-template-columns: 1fr; - } - - :host(:not([open])) .outer { - opacity: 0; - transform: scale(0.8); - transition: transform 200ms cubic-bezier(0.6, 0, 0.2, 1), opacity 200ms cubic-bezier(0.6, 0, 0.2, 1); - } - - @supports (-webkit-overflow-scrolling: touch) { - .outer { - padding-top: max(env(safe-area-inset-top), 12px); - padding-bottom: max(env(safe-area-inset-bottom), 12px); - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Boolean) -], Dialog.prototype, "open", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Boolean) -], Dialog.prototype, "preventDismiss", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Boolean) -], Dialog.prototype, "preventAutoClose", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Boolean) -], Dialog.prototype, "dismissOnTapOutside", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.listen)("backbutton", window), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Event]), - __metadata("design:returntype", void 0) -], Dialog.prototype, "_back", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.observe)("open"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], Dialog.prototype, "_openChanged", null); -Dialog = Dialog_1 = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.element)("pl-dialog") -], Dialog); - - - -/***/ }), - -/***/ "../app/src/elements/export-dialog.ts": -/*!********************************************!*\ - !*** ../app/src/elements/export-dialog.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ExportDialog": () => (/* binding */ ExportDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var _padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _lib_import__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/import */ "../app/src/lib/import.ts"); -/* harmony import */ var _lib_export__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/export */ "../app/src/lib/export.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./select */ "../app/src/elements/select.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - -let ExportDialog = class ExportDialog extends _dialog__WEBPACK_IMPORTED_MODULE_9__.Dialog { - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_7__.html ` -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Export Data")}

    - - this.requestUpdate()} - > - - - this.requestUpdate()} - > - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("WARNING: Exporting to CSV format will save your data without encyryption of any " + - "kind which means it can be read by anyone. We strongly recommend exporting your data as " + - "a secure, encrypted file, instead!")} -
    - - - `; - } - async show() { - await this.updateComplete; - this._formatSelect.selected = _lib_import__WEBPACK_IMPORTED_MODULE_3__.PBES2; - this._vaultSelect.selected = _globals__WEBPACK_IMPORTED_MODULE_5__.app.mainVault; - return super.show(); - } - async _export() { - const vault = this._vaultSelect.selected; - const items = [...vault.items]; - const date = new Date().toISOString().substr(0, 10); - let data = ""; - let fileName = ""; - let type = "text/plain"; - switch (this._formatSelect.selected.format) { - case _lib_import__WEBPACK_IMPORTED_MODULE_3__.CSV.format: - data = await (0,_lib_export__WEBPACK_IMPORTED_MODULE_4__.asCSV)(items); - fileName = `${vault.name.replace(/ /g, "_")}_${date}.csv`; - type = "text/csv"; - break; - case _lib_import__WEBPACK_IMPORTED_MODULE_3__.PBES2.format: - this.open = false; - const password = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please choose a password to protect this backup with!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Choose Password"), - type: "password", - placeholder: "Enter Password", - validate: async (val) => { - if (!val) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please choose a password!"); - } - return val; - } - }); - if (!password) { - this.open = true; - return; - } - const repeated = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please repeat the password!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Choose Password"), - type: "password", - placeholder: "Repeat Password", - validate: async (val) => { - if (val !== password) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Password not repeated correctly!"); - } - return val; - } - }); - if (!repeated) { - this.open = true; - return; - } - data = await (0,_lib_export__WEBPACK_IMPORTED_MODULE_4__.asPBES2Container)(items, password); - fileName = `${vault.name.replace(/ /g, "_")}_${date}.pbes2`; - break; - default: - return; - } - (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__.saveFile)(fileName, type, (0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_2__.stringToBytes)(data)); - this.done(); - } -}; -ExportDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_9__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_7__.css ` - .inner { - display: flex; - flex-direction: column; - } - - pl-input, - pl-select, - button { - text-align: center; - margin: 0 10px 10px 10px; - background: var(--shade-2-color); - border-radius: 8px; - } - - h1 { - display: block; - text-align: center; - } - - .csv-note { - font-size: var(--font-size-micro); - text-align: center; - padding: 0px 20px 20px 20px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("#formatSelect"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_8__.Select) -], ExportDialog.prototype, "_formatSelect", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("#vaultSelect"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_8__.Select) -], ExportDialog.prototype, "_vaultSelect", void 0); -ExportDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.element)("pl-export-dialog") -], ExportDialog); - - - -/***/ }), - -/***/ "../app/src/elements/field-type-dialog.ts": -/*!************************************************!*\ - !*** ../app/src/elements/field-type-dialog.ts ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FieldTypeDialog": () => (/* binding */ FieldTypeDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/item */ "../core/src/item.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; - - - - -let FieldTypeDialog = class FieldTypeDialog extends _dialog__WEBPACK_IMPORTED_MODULE_3__.Dialog { - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` -
    - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Choose A Field Type")}
    - -
    - -
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("What kind of field you would like to add?")} -
    -
    - ${[...Object.values(_padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__.FIELD_DEFS)].map(fieldDef => _base__WEBPACK_IMPORTED_MODULE_2__.html ` -
    this.done(fieldDef)}> - -
    ${fieldDef.name}
    -
    - `)} -
    -
    - `; - } -}; -FieldTypeDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_3__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_2__.css ` - .inner { - background: var(--color-quaternary); - max-width: 440px; - } - - .field-defs { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - grid-gap: 8px; - margin: 8px; - } - - .field-def { - padding: 8px; - display: flex; - align-items: center; - margin: 0; - font-weight: 600; - } - - .icon { - margin-right: 4px; - } - - .message { - text-align: center; - margin: 20px; - } - ` -]; -FieldTypeDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.element)("pl-field-type-dialog") -], FieldTypeDialog); - - - -/***/ }), - -/***/ "../app/src/elements/field.ts": -/*!************************************!*\ - !*** ../app/src/elements/field.ts ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FieldElement": () => (/* binding */ FieldElement) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/item */ "../core/src/item.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _textarea__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textarea */ "../app/src/elements/textarea.ts"); -/* harmony import */ var _totp__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./totp */ "../app/src/elements/totp.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - -let FieldElement = class FieldElement extends _base__WEBPACK_IMPORTED_MODULE_3__.BaseElement { - constructor() { - super(...arguments); - this.editing = false; - this.name = ""; - this.value = ""; - this.type = _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__.FieldType.Note; - this._masked = false; - } - get _fieldDef() { - return _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__.FIELD_DEFS[this.type] || _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_0__.FIELD_DEFS.text; - } - get _fieldActions() { - const actions = [{ icon: "copy", action: () => this.dispatch("copy-clipboard") }]; - if (this._fieldDef.mask) { - actions.push({ icon: this._masked ? "show" : "hide", action: () => (this._masked = !this._masked) }); - } - return actions; - } - focus() { - const inputToFocus = this._nameInput.value ? this._valueInput : this._nameInput; - inputToFocus.focus(); - } - _typeChanged() { - this._masked = this._fieldDef.mask; - } - _editingChanged() { - if (!this.editing) { - this.setAttribute("draggable", "true"); - } - else { - this.removeAttribute("draggable"); - } - } - _renderDisplayValue() { - const format = this._fieldDef.format || ((value, _masked) => value); - switch (this.type) { - case "totp": - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` - - `; - default: - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    ${format(this.value, this._masked)}
    - `; - } - } - _renderEditValue() { - switch (this.type) { - case "note": - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` - (this.value = this._valueInput.value)} - autosize - .value=${this.value} - > - - `; - case "totp": - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` - (this.value = this._valueInput.value)} - .value=${this.value} - > - - this.dispatch("get-totp-qr")}> - `; - case "password": - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` - (this.value = this._valueInput.value)} - .value=${this.value} - > - - this.dispatch("generate")}> - `; - default: - let inputType; - switch (this.type) { - case "email": - case "url": - case "date": - case "month": - inputType = this.type; - break; - case "pin": - case "credit": - inputType = "number"; - break; - case "phone": - inputType = "tel"; - break; - default: - inputType = "text"; - } - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` - (this.value = this._valueInput.value)} - .value=${this.value} - > - - `; - } - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    - this.setAttribute("draggable", "true")} - @mouseout=${() => this.removeAttribute("draggable")} - > - - - this.dispatch("remove")}> -
    - -
    -
    - - - (this.name = this._nameInput.value)} - ?readonly=${!this.editing} - > - -
    - -
    - ${this.editing ? this._renderEditValue() : this._renderDisplayValue()} -
    -
    - -
    - ${this._fieldActions.map(({ icon, action }) => _base__WEBPACK_IMPORTED_MODULE_3__.html ` - - `)} -
    - `; - } -}; -FieldElement.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_2__.shared, - _base__WEBPACK_IMPORTED_MODULE_3__.css ` - :host { - display: flex; - border-radius: 8px; - min-height: 80px; - opacity: 0.999; - } - - .field-buttons { - display: flex; - flex-direction: column; - margin: 4px; - } - - .field-buttons.right { - margin-left: -4px; - } - - .field-buttons.left { - margin-right: -4px; - } - - :host(:not(:hover)) .field-buttons.right { - visibility: hidden; - } - - .field-header { - display: flex; - margin-bottom: 4px; - font-size: var(--font-size-tiny); - font-weight: bold; - color: var(--color-highlight); - align-items: center; - position: relative; - } - - .field-header pl-icon { - border-radius: 0; - font-size: 10px; - width: 10px; - height: 11px; - position: absolute; - left: 8px; - top: 8px; - } - - .field-value { - display: flex; - } - - .field-value > :not(:first-child) { - margin-left: 4px; - } - - .value-input, - .value-display { - font-family: var(--font-family-mono); - font-size: 110%; - padding: 4px 8px; - line-height: 1.4em; - flex: 1; - width: 0; - } - - .value-display { - white-space: pre-wrap; - overflow-wrap: break-word; - user-select: text; - cursor: text; - } - - .fields-container { - margin: 8px; - width: 0; - } - - .name-input { - flex: 1; - min-width: 0; - padding: 0 10px 0 24px; - line-height: 30px; - } - - .name-input, - .value-input { - height: auto; - box-sizing: border-box; - background: none; - } - - .value-input { - border: dashed 1px var(--color-shade-2); - } - - .name-input[readonly] { - border: none; - } - - :host([draggable]), - :host([draggable]) .name-input { - cursor: grab; - } - - :host([draggable]):active { - cursor: grabbing; - } - - @supports (-webkit-overflow-scrolling: touch) { - .field-header pl-icon { - top: 11px; - } - - .drag-handle { - display: none; - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Boolean) -], FieldElement.prototype, "editing", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", String) -], FieldElement.prototype, "name", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", String) -], FieldElement.prototype, "value", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", String) -], FieldElement.prototype, "type", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Boolean) -], FieldElement.prototype, "_masked", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)(".name-input"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_5__.Input) -], FieldElement.prototype, "_nameInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)(".value-input"), - __metadata("design:type", Object) -], FieldElement.prototype, "_valueInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.observe)("type"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], FieldElement.prototype, "_typeChanged", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.observe)("editing"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], FieldElement.prototype, "_editingChanged", null); -FieldElement = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.element)("pl-field") -], FieldElement); - - - -/***/ }), - -/***/ "../app/src/elements/generator.ts": -/*!****************************************!*\ - !*** ../app/src/elements/generator.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Generator": () => (/* binding */ Generator) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/util */ "../core/src/util.ts"); -/* harmony import */ var _padloc_core_src_diceware__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/diceware */ "../core/src/diceware.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _lib_animation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/animation */ "../app/src/lib/animation.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _slider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./slider */ "../app/src/elements/slider.ts"); -/* harmony import */ var _toggle_button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./toggle-button */ "../app/src/elements/toggle-button.ts"); -/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./select */ "../app/src/elements/select.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - -const separators = [ - { - value: "-", - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Dash") + " ( - )" - }, - { - value: "_", - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Underscore") + " ( _ )" - }, - { - value: "/", - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Slash") + " ( / )" - }, - { - value: " ", - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Space") + " ( )" - } -]; -class Generator extends _dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog { - constructor() { - super(...arguments); - this.value = ""; - this.mode = "words"; - } - renderContent() { - const { value } = this; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Generate Password")}
    -
    -
    this._selectMode("words")} - > - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("passphrase")} -
    -
    this._selectMode("chars")} - > - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("random string")} -
    -
    -
    - -
    -
    - - - - - -
    - -
    - - - - - - - - - -
    - - - -
    this._generate()}> -
    - ${value} -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Click To Shuffle")} -
    -
    -
    - - - `; - } - firstUpdated() { - this._lower.active = this._upper.active = this._numbers.active = true; - } - async show() { - await this.updateComplete; - this._generate(); - return super.show(); - } - async _generate() { - const separator = (this._separator && this._separator.selected && this._separator.selected.value) || "-"; - const language = (this._language && this._language.selected && this._language.selected.value) || _globals__WEBPACK_IMPORTED_MODULE_4__.app.state.device.locale; - switch (this.mode) { - case "words": - this.value = await (0,_padloc_core_src_diceware__WEBPACK_IMPORTED_MODULE_1__.generatePassphrase)(this._wordCount.value, separator, [language]); - break; - case "chars": - let charSet = ""; - this._lower.active && (charSet += _padloc_core_src_util__WEBPACK_IMPORTED_MODULE_0__.chars.lower); - this._upper.active && (charSet += _padloc_core_src_util__WEBPACK_IMPORTED_MODULE_0__.chars.upper); - this._numbers.active && (charSet += _padloc_core_src_util__WEBPACK_IMPORTED_MODULE_0__.chars.numbers); - this._other.active && (charSet += _padloc_core_src_util__WEBPACK_IMPORTED_MODULE_0__.chars.other); - this.value = charSet ? await (0,_padloc_core_src_util__WEBPACK_IMPORTED_MODULE_0__.randomString)(this._length.value, charSet) : ""; - break; - } - (0,_lib_animation__WEBPACK_IMPORTED_MODULE_3__.animateElement)(this._result, { animation: "bounce" }); - } - _confirm() { - this.done(this.value); - } - _selectMode(mode) { - this.mode = mode; - this._generate(); - } -} -Generator.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_5__.css ` - .inner { - background: var(--color-quaternary); - display: flex; - flex-direction: column; - } - - .header { - background: var(--color-tertiary); - text-align: center; - font-weight: bold; - } - - .header-title { - font-size: 120%; - padding: 20px 20px 10px 20px; - } - - .charsets { - display: flex; - } - - .charsets > * { - flex: 1; - } - - pl-toggle-button { - display: block; - border-bottom: solid 1px rgba(0, 0, 0, 0.1); - } - - pl-slider { - display: flex; - height: var(--row-height); - border-bottom: solid 1px rgba(0, 0, 0, 0.1); - } - - .controls > pl-select { - margin-top: calc(2 * var(--gutter-size)); - } - - .result { - font-family: var(--font-family-mono); - text-align: center; - font-size: 120%; - overflow-wrap: break-word; - font-weight: bold; - padding: 20px; - margin: var(--gutter-size); - cursor: pointer; - } - - .result > .hint { - margin: 8px 0 -12px 0; - font-size: var(--font-size-micro); - color: var(--color-shade-3); - } - - .arrow { - display: block; - margin: -10px auto; - font-size: 120%; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", String) -], Generator.prototype, "value", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", String) -], Generator.prototype, "mode", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#separator"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_9__.Select) -], Generator.prototype, "_separator", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#language"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_9__.Select) -], Generator.prototype, "_language", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#wordCount"), - __metadata("design:type", _slider__WEBPACK_IMPORTED_MODULE_7__.Slider) -], Generator.prototype, "_wordCount", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#lower"), - __metadata("design:type", _toggle_button__WEBPACK_IMPORTED_MODULE_8__.ToggleButton) -], Generator.prototype, "_lower", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#upper"), - __metadata("design:type", _toggle_button__WEBPACK_IMPORTED_MODULE_8__.ToggleButton) -], Generator.prototype, "_upper", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#numbers"), - __metadata("design:type", _toggle_button__WEBPACK_IMPORTED_MODULE_8__.ToggleButton) -], Generator.prototype, "_numbers", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#other"), - __metadata("design:type", _toggle_button__WEBPACK_IMPORTED_MODULE_8__.ToggleButton) -], Generator.prototype, "_other", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#length"), - __metadata("design:type", _slider__WEBPACK_IMPORTED_MODULE_7__.Slider) -], Generator.prototype, "_length", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)(".result"), - __metadata("design:type", HTMLDivElement) -], Generator.prototype, "_result", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.listen)("change"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Promise) -], Generator.prototype, "_generate", null); -window.customElements.define("pl-generator", Generator); - - -/***/ }), - -/***/ "../app/src/elements/group-dialog.ts": -/*!*******************************************!*\ - !*** ../app/src/elements/group-dialog.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "GroupDialog": () => (/* binding */ GroupDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _toggle_button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./toggle-button */ "../app/src/elements/toggle-button.ts"); -/* harmony import */ var _member_item__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./member-item */ "../app/src/elements/member-item.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - -let GroupDialog = class GroupDialog extends _dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog { - constructor() { - super(...arguments); - this.group = null; - this.org = null; - this._membersFilter = ""; - this._error = ""; - this._members = new Set(); - } - _getCurrentMembers() { - const members = new Set(); - if (!this.group || !this.org) { - return members; - } - for (const member of this.org.getMembersForGroup(this.group)) { - members.add(member.id); - } - return members; - } - get _hasChanged() { - if (!this._nameInput) { - return false; - } - const currentMembers = this._getCurrentMembers(); - const membersChanged = this._members.size !== currentMembers.size || - [...this._members.values()].some(group => !currentMembers.has(group)); - const nameChanged = this.group ? this.group.name !== this._nameInput.value : !!this._nameInput.value; - return this._members.size && this._nameInput.value && (membersChanged || nameChanged); - } - async show({ org, group }) { - this.org = org; - this.group = group; - this._members = this._getCurrentMembers(); - this._error = ""; - await this.updateComplete; - this._nameInput.value = group ? group.name : ""; - this._clearMembersFilter(); - if (group) { - setTimeout(() => this._nameInput.focus(), 100); - } - await super.show(); - } - _toggleMember(member) { - if (this._members.has(member.id)) { - this._members.delete(member.id); - } - else { - this._members.add(member.id); - } - this.requestUpdate(); - } - async _save() { - if (this._saveButton.state === "loading") { - return; - } - this._error = ""; - this._saveButton.start(); - try { - const org = this.org; - const members = [...this._members.values()].map(id => org.getMember({ id })); - if (this.group) { - await _globals__WEBPACK_IMPORTED_MODULE_1__.app.updateGroup(org, this.group, members, this._nameInput.value); - } - else { - await _globals__WEBPACK_IMPORTED_MODULE_1__.app.createGroup(org, this._nameInput.value, members); - } - this._saveButton.success(); - this.done(); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"); - this._saveButton.fail(); - throw e; - } - } - async _deleteGroup() { - this.open = false; - const deleted = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to delete this group?"), { - type: "destructive", - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete Group"), - placeholder: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Type 'DELETE' to confirm"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete"), - validate: async (val) => { - if (val !== "DELETE") { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Type 'DELETE' to confirm"); - } - await _globals__WEBPACK_IMPORTED_MODULE_1__.app.updateOrg(this.org.id, async (org) => { - org.groups = org.groups.filter(group => group.name !== this.group.name); - }); - return val; - } - }); - if (deleted) { - this.done(); - } - else { - this.open = true; - } - } - _updateMembersFilter() { - this._membersFilter = this._filterMembersInput.value; - } - _clearMembersFilter() { - this._membersFilter = this._filterMembersInput.value = ""; - } - shouldUpdate() { - return !!this.org; - } - renderContent() { - const org = this.org; - const memFilter = this._membersFilter.toLowerCase(); - const members = memFilter - ? org.members.filter(({ name, email }) => email.toLowerCase().includes(memFilter) || name.toLowerCase().includes(memFilter)) - : org.members; - // members.sort((a, b) => this._members.has(a.id) - this._members.has(b.id)); - const canEdit = org.isAdmin(_globals__WEBPACK_IMPORTED_MODULE_1__.app.account); - const canDelete = this.group && canEdit; - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    - - this.requestUpdate()} - > - -
    - -
    -
    - - - -
    - - ${members.map(member => _base__WEBPACK_IMPORTED_MODULE_3__.html ` - this._toggleMember(member)} - .active=${this._members.has(member.id)} - ?disabled=${!canEdit} - > - - - `)} - -
    - ${this._error} -
    -
    - - - `; - } -}; -GroupDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_3__.css ` - .inner { - background: var(--color-quaternary); - } - - pl-toggle-button { - display: block; - padding: 0 15px 0 0; - } - - .delete-button { - color: var(--color-negative); - font-size: var(--font-size-default); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Object) -], GroupDialog.prototype, "group", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Object) -], GroupDialog.prototype, "org", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("#saveButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_5__.LoadingButton) -], GroupDialog.prototype, "_saveButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("#nameInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_6__.Input) -], GroupDialog.prototype, "_nameInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("#filterMembersInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_6__.Input) -], GroupDialog.prototype, "_filterMembersInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", String) -], GroupDialog.prototype, "_membersFilter", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", String) -], GroupDialog.prototype, "_error", void 0); -GroupDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.element)("pl-group-dialog") -], GroupDialog); - - - -/***/ }), - -/***/ "../app/src/elements/group-item.ts": -/*!*****************************************!*\ - !*** ../app/src/elements/group-item.ts ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "GroupItem": () => (/* binding */ GroupItem) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/org */ "../core/src/org.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - -let GroupItem = class GroupItem extends _base__WEBPACK_IMPORTED_MODULE_2__.BaseElement { - render() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` - - -
    -
    ${this.group.name}
    - -
    -
    - - -
    ${this.group.members.length}
    -
    - -
    - - -
    ${this.group.vaults.length}
    -
    -
    -
    - `; - } -}; -GroupItem.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_1__.shared, - _base__WEBPACK_IMPORTED_MODULE_2__.css ` - :host { - display: flex; - align-items: center; - padding: 4px 0; - } - - .icon { - font-size: 120%; - margin: 8px; - background: #eee; - border: solid 1px #ddd; - width: 45px; - height: 45px; - } - - .tags { - margin: 4px 0; - } - - .group-name { - font-weight: bold; - margin-bottom: 4px; - } - - .group-info { - flex: 1; - width: 0; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.Group) -], GroupItem.prototype, "group", void 0); -GroupItem = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.element)("pl-group-item") -], GroupItem); - - - -/***/ }), - -/***/ "../app/src/elements/icon.ts": -/*!***********************************!*\ - !*** ../app/src/elements/icon.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PlIcon": () => (/* binding */ PlIcon) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - -let PlIcon = class PlIcon extends _base__WEBPACK_IMPORTED_MODULE_0__.BaseElement { - constructor() { - super(...arguments); - this.icon = ""; - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_0__.html ` -
    - `; - } -}; -PlIcon.styles = [ - _base__WEBPACK_IMPORTED_MODULE_0__.css ` - :host { - display: inline-block; - text-align: center; - font-family: "FontAwesome"; - color: inherit; - font-size: inherit; - position: relative; - height: 40px; - width: 40px; - font-weight: normal !important; - border-radius: 100%; - overflow: hidden; - } - - div { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - margin: auto; - height: 0; - line-height: 0; - } - - :host([icon="add"]) > div::before { - content: "\\f067"; - } - - :host([icon="menu"]) > div::before { - content: "\\f0c9"; - } - - :host([icon="close"]) > div::before { - content: "\\f00d"; - } - - :host([icon="more"]) > div::before { - content: "\\f141"; - } - - :host([icon="delete"]) > div::before { - content: "\\f2ed"; - } - - :host([icon="copy"]) > div::before { - /* content: "\\f24d"; */ - content: "\\f0c5"; - } - - :host([icon="edit"]) > div::before { - content: "\\f303"; - } - - :host([icon="forward"]) > div::before { - content: "\\f054"; - } - - :host([icon="backward"]) > div::before { - content: "\\f053"; - } - - :host([icon="check"]) > div::before { - content: "\\f00c"; - } - - :host([icon="cancel"]) > div::before { - content: "\\f00d"; - } - - :host([icon="generate"]) > div::before { - content: "\\f522"; - } - - :host([icon="tag"]) > div::before { - content: "\\f02b"; - } - - :host([icon="tags"]) > div::before { - content: "\\f02c"; - } - - :host([icon="dropdown"]) > div::before { - content: "\\f0d7"; - } - - :host([icon="dropup"]) > div::before { - content: "\\f0d8"; - } - - :host([icon="settings"]) > div::before { - content: "\\f013"; - } - - :host([icon="cloud"]) > div::before { - content: "\\f0c2"; - } - - :host([icon="lock"]) > div::before { - content: "\\f023"; - } - - :host([icon="refresh"]) > div::before { - content: "\\f2f1"; - } - - :host([icon="unlock"]) > div::before { - content: "\\f13e"; - } - - :host([icon="export"]) > div::before { - content: "\\f093"; - } - - :host([icon="import"]) > div::before { - content: "\\f019"; - } - - :host([icon="search"]) > div::before { - content: "\\f002"; - } - - :host([icon="info"]) > div::before { - content: "\\f129"; - } - - :host([icon="info-round"]) > div::before { - content: "\\f05a"; - } - - :host([icon="download"]) > div::before { - content: "\\f019"; - } - - :host([icon="upload"]) > div::before { - content: "\\f093"; - } - - :host([icon="show"]) > div::before { - content: "\\f06e"; - } - - :host([icon="hide"]) > div::before { - content: "\\f070"; - } - - :host([icon="checked"]) > div::before { - content: "\\f14a"; - } - - :host([icon="checkall"]) > div::before { - content: "\\f560"; - } - - :host([icon="success"]) > div::before { - content: "\\f058"; - } - - :host([icon="unchecked"]) > div::before { - content: "\\f146"; - } - - :host([icon="share"]) > div::before { - content: "\\f045"; - } - - :host([icon="logout"]) > div::before { - content: "\\f2f5"; - } - - :host([icon="mail"]) > div::before { - content: "\\f0e0"; - } - - :host([icon="user"]) > div::before { - content: "\\f007"; - } - - :host([icon="record"]) > div::before { - content: "\\f15b"; - } - - :host([icon="mobile"]) > div::before { - content: "\\f10b"; - font-size: 140%; - } - - :host([icon="database"]) > div::before { - content: "\\f1c0"; - } - - :host([icon="time"]) > div::before { - content: "\\f017"; - } - - :host([icon="error"]) > div::before { - content: "\\f071"; - } - - :host([icon="question"]) > div::before { - content: "\\f059"; - } - - :host([icon="desktop"]) > div::before { - content: "\\f109"; - } - - :host([icon="group"]) > div::before { - content: "\\f509"; - } - - :host([icon="members"]) > div::before { - content: "\\f0c0"; - } - - :host([icon="vaults"]) > div::before { - content: "\\f1b3"; - } - - :host([icon="vault"]) > div::before { - content: "\\f1b2"; - } - - :host([icon="share"]) > div::before { - content: "\\f064"; - } - - :host([icon="invite"]) > div::before { - content: "\\f234"; - } - - :host([icon="trusted"]) > div::before { - content: "\\f4fc"; - } - - :host([icon="removeuser"]) > div::before { - content: "\\f506"; - } - - :host([icon="org"]) > div::before { - content: "\\f0c0"; - } - - // :host([icon="logo"]) > div::before { - // content: "\\f447"; - // } - - :host([icon="list"]) > div::before { - content: "\\f550"; - } - - :host([icon="remove"]) > div::before { - content: "\\f056"; - } - - :host([icon="password"]) > div::before { - content: "\\f069"; - } - - :host([icon="admins"]) > div::before { - content: "\\f509"; - } - - :host([icon="archive"]) > div::before { - content: "\\f187"; - } - - :host([icon="attachment"]) > div::before { - content: "\\f0c6"; - } - - :host([icon="file"]) > div::before { - content: "\\f15b"; - } - - :host([icon="file-video"]) > div::before { - content: "\\f1c8"; - } - - :host([icon="file-pdf"]) > div::before { - content: "\\f1c1"; - } - - :host([icon="file-image"]) > div::before { - content: "\\f1c5"; - } - - :host([icon="file-csv"]) > div::before { - content: "\\f6dd"; - } - - :host([icon="file-code"]) > div::before { - content: "\\f1c9"; - } - - :host([icon="file-archive"]) > div::before { - content: "\\f1c6"; - } - - :host([icon="file-audio"]) > div::before { - content: "\\f1c7"; - } - - :host([icon="file-text"]) > div::before { - content: "\\f15c"; - } - - :host([icon="file-certificate"]) > div::before { - content: "\\f56c"; - } - - :host([icon="arrow-down"]) > div::before { - content: "\\f309"; - } - - :host([icon="favorite"]) > div::before { - content: "\\f005"; - } - - :host([icon="qrcode"]) > div::before { - content: "\\f029"; - } - - :host([icon="credit"]) > div::before { - content: "\\f09d"; - } - - :host([icon="address"]) > div::before { - content: "\\f2bb"; - } - - :host([icon="discount"]) > div::before { - content: "\\f295"; - } - - :host([icon="dollar"]) > div::before { - content: "\\f155"; - } - - :host([icon="storage"]) > div::before { - content: "\\f49e"; - } - - :host([icon="hirarchy"]) > div::before { - content: "\\f0e8"; - } - - :host([icon="web"]) > div::before { - content: "\\f57d"; - } - - :host([icon="bank"]) > div::before { - content: "\\f53d"; - } - - :host([icon="login"]) > div::before { - content: "\\f2f6"; - } - - :host([icon="sim"]) > div::before { - content: "\\f7c4"; - } - - :host([icon="wifi"]) > div::before { - content: "\\f1eb"; - } - - :host([icon="passport"]) > div::before { - content: "\\f5ab"; - } - - :host([icon="note"]) > div::before { - content: "\\f036"; - } - - :host([icon="custom"]) > div::before { - content: "\\f249"; - } - - :host([icon="email"]) > div::before { - content: "\\f1fa"; - } - - :host([icon="fingerprint"]) > div::before { - content: "\\f577"; - } - - :host([icon="totp"]) > div::before { - content: "\\f1da"; - } - - :host([icon="month"]) > div::before { - content: "\\f133"; - } - - :host([icon="date"]) > div::before { - content: "\\f073"; - } - - :host([icon="phone"]) > div::before { - content: "\\f095"; - } - - :host([icon="text"]) > div::before { - content: "\\f031"; - } - - :host([icon="clipboard"]) > div::before { - content: "\\f328"; - } - - :host([icon="logo"]) > div::before { - font-family: "Padlock"; - content: "\\0041"; - font-size: 110%; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", String) -], PlIcon.prototype, "icon", void 0); -PlIcon = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.element)("pl-icon") -], PlIcon); - - - -/***/ }), - -/***/ "../app/src/elements/import-dialog.ts": -/*!********************************************!*\ - !*** ../app/src/elements/import-dialog.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ImportDialog": () => (/* binding */ ImportDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _lib_import__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../lib/import */ "../app/src/lib/import.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./select */ "../app/src/elements/select.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - -let ImportDialog = class ImportDialog extends _dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog { - constructor() { - super(...arguments); - this._rawData = ""; - this._items = []; - } - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Import Data")}

    - - - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("IMPORTANT: Before importing, please make sure that your CSV data " + - "is structured according to Padlocks specific requirements!")} - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Learn More")} -
    - - - - - `; - } - async show(input) { - await this.updateComplete; - const result = super.show(); - this._rawData = input; - this._formatSelect.selected = _lib_import__WEBPACK_IMPORTED_MODULE_1__.guessFormat(input) || _lib_import__WEBPACK_IMPORTED_MODULE_1__.CSV; - this._parseString(); - this._vaultSelect.selected = _globals__WEBPACK_IMPORTED_MODULE_3__.app.mainVault; - return result; - } - async _parseString() { - const rawStr = this._rawData; - switch (this._formatSelect.selected.format) { - case _lib_import__WEBPACK_IMPORTED_MODULE_1__.PADLOCK_LEGACY.format: - this.open = false; - const pwd = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This file is protected by a password."), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Password"), - placeholder: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Password"), - type: "password", - validate: async (pwd) => { - try { - this._items = await _lib_import__WEBPACK_IMPORTED_MODULE_1__.asPadlockLegacy(rawStr, pwd); - } - catch (e) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Wrong Password"); - } - return pwd; - } - }); - this.open = true; - if (pwd === null) { - this.done(); - } - break; - case _lib_import__WEBPACK_IMPORTED_MODULE_1__.LASTPASS.format: - this._items = await _lib_import__WEBPACK_IMPORTED_MODULE_1__.asLastPass(rawStr); - break; - case _lib_import__WEBPACK_IMPORTED_MODULE_1__.CSV.format: - this._items = await _lib_import__WEBPACK_IMPORTED_MODULE_1__.asCSV(rawStr); - break; - case _lib_import__WEBPACK_IMPORTED_MODULE_1__.PBES2.format: - this.open = false; - const pwd2 = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This file is protected by a password."), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Password"), - placeholder: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Password"), - type: "password", - validate: async (pwd) => { - try { - this._items = await _lib_import__WEBPACK_IMPORTED_MODULE_1__.asPBES2Container(rawStr, pwd); - } - catch (e) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Wrong Password"); - } - return pwd; - } - }); - this.open = true; - if (pwd2 === null) { - this.done(); - } - break; - default: - this._items = []; - } - } - async _import() { - const vault = this._vaultSelect.selected; - const quota = _globals__WEBPACK_IMPORTED_MODULE_3__.app.getItemsQuota(vault); - if (quota !== -1 && vault.items.size + this._items.length > quota) { - this.done(); - if (_globals__WEBPACK_IMPORTED_MODULE_3__.app.billingEnabled) { - this.dispatch("get-premium", { - message: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("The number of imported items exceeds your remaining quota. " + - "Upgrade to Premium to get unlimited items for your private vault!"), - icon: "list" - }); - } - else { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("The number of imported items exceeds your remaining quota."), { type: "warning" }); - } - return; - } - _globals__WEBPACK_IMPORTED_MODULE_3__.app.addItems(this._items, vault); - // this.dispatch("data-imported", { items: items }); - this.done(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Successfully imported {0} items.", this._items.length.toString()), { type: "success" }); - } -}; -ImportDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - .inner { - display: flex; - flex-direction: column; - } - - pl-input, - pl-select, - button { - text-align: center; - margin: 0 10px 10px 10px; - background: var(--shade-2-color); - border-radius: 8px; - } - - h1 { - display: block; - text-align: center; - } - - .csv-note { - font-size: var(--font-size-micro); - text-align: center; - padding: 0px 20px 20px 20px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", String) -], ImportDialog.prototype, "_rawData", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Array) -], ImportDialog.prototype, "_items", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#formatSelect"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_5__.Select) -], ImportDialog.prototype, "_formatSelect", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#vaultSelect"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_5__.Select) -], ImportDialog.prototype, "_vaultSelect", void 0); -ImportDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-import-dialog") -], ImportDialog); - - - -/***/ }), - -/***/ "../app/src/elements/input.ts": -/*!************************************!*\ - !*** ../app/src/elements/input.ts ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Input": () => (/* binding */ Input) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _base_input__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base-input */ "../app/src/elements/base-input.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - -let Input = class Input extends _base_input__WEBPACK_IMPORTED_MODULE_1__.BaseInput { - constructor() { - super(...arguments); - this.type = ""; - this.pattern = ""; - } - get validationMessage() { - return this._inputElement.validationMessage; - } - _keydown(e) { - if (e.key === "Enter") { - this.checkValidity(); - this.dispatch("enter"); - e.preventDefault(); - e.stopPropagation(); - } - else if (e.key === "Escape") { - this.dispatch("escape"); - e.preventDefault(); - e.stopPropagation(); - } - } - _renderInput() { - const { placeholder, readonly, noTab, disabled, autocapitalize, required, type, pattern } = this; - return _base__WEBPACK_IMPORTED_MODULE_0__.html ` - - `; - } - checkValidity() { - return this._inputElement && this._inputElement.checkValidity(); - } - reportValidity() { - return this._inputElement && this._inputElement.reportValidity(); - } -}; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", String) -], Input.prototype, "type", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", String) -], Input.prototype, "pattern", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.listen)("keydown"), - __metadata("design:type", Function), - __metadata("design:paramtypes", [KeyboardEvent]), - __metadata("design:returntype", void 0) -], Input.prototype, "_keydown", null); -Input = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.element)("pl-input") -], Input); - - - -/***/ }), - -/***/ "../app/src/elements/invite-dialog.ts": -/*!********************************************!*\ - !*** ../app/src/elements/invite-dialog.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "InviteDialog": () => (/* binding */ InviteDialog) -/* harmony export */ }); -/* harmony import */ var lit_html_directives_until__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html/directives/until */ "../app/node_modules/lit-html/directives/until.js"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _member_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./member-dialog */ "../app/src/elements/member-dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - -let InviteDialog = class InviteDialog extends _dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog { - constructor() { - super(...arguments); - this.invite = null; - this._error = ""; - this._pollInterval = 5000; - } - get _enableActions() { - return !!this.invite && !this.invite.expired && !this.invite.accepted; - } - async show(invite) { - this._error = ""; - this.invite = invite; - setTimeout(() => this._refresh(), this._pollInterval); - return super.show(); - } - dismiss() { - super.dismiss(); - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go(`orgs/${this.invite.org.id}`); - } - async _refresh() { - if (!this.invite || !this.open || this.invite.accepted) { - return; - } - const invite = await _globals__WEBPACK_IMPORTED_MODULE_3__.app.getInvite(this.invite.org.id, this.invite.id); - if (invite) { - invite.secret = this.invite.secret; - invite.expires = this.invite.expires; - this.invite = invite; - } - setTimeout(() => this._refresh(), this._pollInterval); - } - shouldUpdate() { - return !!this.invite; - } - renderContent() { - const { email, expires, expired, org, accepted, purpose } = this.invite; - const forMe = email === _globals__WEBPACK_IMPORTED_MODULE_3__.app.account.email; - const status = expired - ? { icon: "time", class: "warning", text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("This invite has expired") } - : accepted - ? { icon: "check", class: "", text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Accepted") } - : { - icon: "time", - class: "", - text: (0,lit_html_directives_until__WEBPACK_IMPORTED_MODULE_0__.until)((async () => { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("expires {0}", await (0,_lib_util__WEBPACK_IMPORTED_MODULE_2__.formatDateFromNow)(expires)); - })()) - }; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - - -
    - ${purpose === "confirm_membership" ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Confirm Membership") : (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Organization Invite")} -
    - - this.dismiss()}> -
    - -
    -
    -
    - - -
    ${org.name}
    -
    -
    - - ${forMe ? this._inviteeBody() : this._adminBody()} - -
    -
    - - -
    ${status.text}
    -
    -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Please wait for an admin to complete the process. " + - "You will be notified as soon as you receive access.")} -
    - -
    - ${this._error} -
    - -
    - ${forMe ? this._inviteeActions() : this._adminActions()} -
    -
    - `; - } - _inviteeBody() { - const { org, purpose } = this.invite; - const { _enableActions } = this; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)(purpose === "confirm_membership" - ? "Please confirm your membership for the {0} organization." - : "You've been invited to join the {0} organization.", org.name)} -
    - - this._accept()} - label="${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Enter Confirmation Code")}" - > - - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("If you haven't received the confirmation code yet, please ask the organization owner " + - "to provide it to you!")} -
    - `; - } - _inviteeActions() { - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` - this._accept()} - > - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)(this.invite.purpose === "confirm_membership" ? "Confirm" : "Accept")} - - `; - } - _adminBody() { - const { _enableActions } = this; - const { email, secret, purpose } = this.invite; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)(purpose === "confirm_membership" - ? "A membership confirmation request was sent to:" - : "An invite was sent to:")} -
    - -
    ${email}
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("They will also need the following confirmation code, which " + - "you should communicate to them separately:")} -
    - -
    ${secret}
    - `; - } - _adminActions() { - const { accepted, expired, purpose } = this.invite; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` - this._confirm()} - > - - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)(purpose === "confirm_membership" ? "Confirm" : "Add Member")}
    -
    - - this._delete()}> - - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Delete")}
    -
    - - this._resend()}> - - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Resend")}
    -
    - `; - } - async _delete() { - if (this._deleteButton.state === "loading") { - return; - } - this._deleteButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.deleteInvite(this.invite); - this._deleteButton.success(); - this.dismiss(); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Something went wrong. Please try again later!"); - this._deleteButton.fail(); - throw e; - } - this.dismiss(); - } - async _resend() { - if (this._resendButton.state === "loading") { - return; - } - this._resendButton.start(); - let org = _globals__WEBPACK_IMPORTED_MODULE_3__.app.getOrg(this.invite.org.id); - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.deleteInvite(this.invite); - this.invite = (await _globals__WEBPACK_IMPORTED_MODULE_3__.app.createInvites(org, [this.invite.email], this.invite.purpose))[0]; - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go(`invite/${this.invite.org.id}/${this.invite.id}`, undefined, true); - this._resendButton.success(); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Something went wrong. Please try again later!"); - this._resendButton.fail(); - throw e; - } - } - async _accept() { - if (this._acceptButton.state === "loading") { - return; - } - if (!this._codeInput.value) { - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Please enter a confirmation code!"); - this.rumble(); - return; - } - this._acceptButton.start(); - try { - const success = await _globals__WEBPACK_IMPORTED_MODULE_3__.app.acceptInvite(this.invite, this._codeInput.value.toLowerCase()); - if (success) { - this._acceptButton.success(); - this.dismiss(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("You have successfully accepted the invite. You'll be notified once you've been granted access."), { type: "success" }); - } - else { - this._acceptButton.fail(); - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Wrong confirmation code. Please try again!"); - this.rumble(); - return; - } - } - catch (e) { - this._acceptButton.fail(); - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Something went wrong. Please try again later!"); - this.rumble(); - } - } - async _confirm() { - if (this._confirmButton.state === "loading") { - return; - } - this._confirmButton.start(); - try { - const member = await _globals__WEBPACK_IMPORTED_MODULE_3__.app.confirmInvite(this.invite); - this._confirmButton.success(); - this.open = false; - await this._memberDialog.show({ org: _globals__WEBPACK_IMPORTED_MODULE_3__.app.getOrg(this.invite.org.id), member }); - this.dismiss(); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Something went wrong. Please try again later!"); - this._confirmButton.fail(); - throw e; - } - } -}; -InviteDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_5__.css ` - :host { - text-align: center; - } - - .invite-text { - font-size: var(--font-size-small); - margin: 20px; - } - - .invite-text.small { - font-size: var(--font-size-tiny); - } - - .invite-text.error { - color: var(--color-error); - text-shadow: none; - font-weight: bold; - } - - .invite-email { - font-size: 120%; - margin: 15px; - font-weight: bold; - } - - .invite-code { - font-size: 200%; - font-family: var(--font-family-mono); - text-transform: uppercase; - margin: 20px; - letter-spacing: 5px; - font-weight: bold; - user-select: text; - cursor: text; - } - - .tags { - justify-content: center; - overflow: visible; - margin: 20px 0; - } - - .tag.org { - font-size: var(--font-size-small); - padding: 4px 16px; - } - - .code-input { - border-radius: 8px; - margin: 15px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], InviteDialog.prototype, "invite", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#acceptButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], InviteDialog.prototype, "_acceptButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#resendButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], InviteDialog.prototype, "_resendButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#deleteButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], InviteDialog.prototype, "_deleteButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#confirmButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], InviteDialog.prototype, "_confirmButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#codeInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], InviteDialog.prototype, "_codeInput", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.dialog)("pl-member-dialog"), - __metadata("design:type", _member_dialog__WEBPACK_IMPORTED_MODULE_9__.MemberDialog) -], InviteDialog.prototype, "_memberDialog", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", String) -], InviteDialog.prototype, "_error", void 0); -InviteDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.element)("pl-invite-dialog") -], InviteDialog); - - - -/***/ }), - -/***/ "../app/src/elements/invite-item.ts": -/*!******************************************!*\ - !*** ../app/src/elements/invite-item.ts ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "InviteItem": () => (/* binding */ InviteItem) -/* harmony export */ }); -/* harmony import */ var lit_html_directives_until__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html/directives/until */ "../app/node_modules/lit-html/directives/until.js"); -/* harmony import */ var _padloc_core_src_invite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/invite */ "../core/src/invite.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _member_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./member-dialog */ "../app/src/elements/member-dialog.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - -let InviteItem = class InviteItem extends _base__WEBPACK_IMPORTED_MODULE_7__.BaseElement { - async _confirm() { - if (this._confirmButton.state === "loading") { - return; - } - this._confirmButton.start(); - try { - const member = await _globals__WEBPACK_IMPORTED_MODULE_5__.app.confirmInvite(this.invite); - this._confirmButton.success(); - await this._memberDialog.show({ org: _globals__WEBPACK_IMPORTED_MODULE_5__.app.getOrg(this.invite.org.id), member }); - } - catch (e) { - this._confirmButton.fail(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.alert)(e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Something went wrong. Please try again later!"), { type: "warning" }); - } - } - shoudUpdate() { - return !!this.invite; - } - render() { - const inv = this.invite; - const account = _globals__WEBPACK_IMPORTED_MODULE_5__.app.account; - const org = _globals__WEBPACK_IMPORTED_MODULE_5__.app.getOrg(inv.org.id); - const status = inv.expired - ? { icon: "time", class: "warning", text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("expired") } - : inv.accepted - ? { icon: "check", class: "highlight", text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("accepted") } - : { - icon: "time", - class: "", - text: (async () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("{0}", await (0,_lib_util__WEBPACK_IMPORTED_MODULE_3__.formatDateFromNow)(inv.expires, false)))() - }; - let secret = Promise.resolve(""); - if (org.isAdmin(account)) { - const unlockOrg = org.unlock(account); - secret = (async () => { - await unlockOrg; - await inv.unlock(org.invitesKey); - return inv.secret; - })(); - } - return _base__WEBPACK_IMPORTED_MODULE_7__.html ` - - -
    -
    ${inv.email}
    - -
    -
    - - -
    ${(0,lit_html_directives_until__WEBPACK_IMPORTED_MODULE_0__.until)(status.text)}
    -
    -
    -
    - - - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Confirm")} - - -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_2__.translate)("Confirmation Code:")}
    - -
    ${(0,lit_html_directives_until__WEBPACK_IMPORTED_MODULE_0__.until)(secret)}
    -
    - `; - } -}; -InviteItem.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_4__.shared, - _base__WEBPACK_IMPORTED_MODULE_7__.css ` - :host { - display: flex; - align-items: center; - padding: 4px 0; - } - - .icon { - font-size: 120%; - margin: 10px; - background: #eee; - border: solid 1px #ddd; - width: 45px; - height: 45px; - } - - .tags { - margin: 4px 0; - } - - .invite-info { - flex: 1; - width: 0; - } - - .invite:hover { - background: #fafafa; - } - - .invite .tags { - padding: 0; - margin: 0; - } - - .invite-email { - font-weight: bold; - margin-bottom: 4px; - } - - .invite-code { - text-align: center; - margin: 12px; - } - - .invite-code-label { - font-weight: bold; - font-size: var(--font-size-micro); - } - - .invite-code-value { - font-size: 140%; - font-family: var(--font-family-mono); - font-weight: bold; - text-transform: uppercase; - cursor: text; - user-select: text; - letter-spacing: 2px; - } - - .confirm-button { - padding: 6px 8px; - margin: 12px; - font-size: var(--font-size-small); - align-self: center; - } - - @media (max-width: 400px) { - .invite-code { - display: none; - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.property)(), - __metadata("design:type", _padloc_core_src_invite__WEBPACK_IMPORTED_MODULE_1__.Invite) -], InviteItem.prototype, "invite", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)(".confirm-button"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_8__.LoadingButton) -], InviteItem.prototype, "_confirmButton", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-member-dialog"), - __metadata("design:type", _member_dialog__WEBPACK_IMPORTED_MODULE_9__.MemberDialog) -], InviteItem.prototype, "_memberDialog", void 0); -InviteItem = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.element)("pl-invite-item") -], InviteItem); - - - -/***/ }), - -/***/ "../app/src/elements/item-dialog.ts": -/*!******************************************!*\ - !*** ../app/src/elements/item-dialog.ts ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ItemDialog": () => (/* binding */ ItemDialog) -/* harmony export */ }); -/* harmony import */ var lit_html_directives_until__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html/directives/until */ "../app/node_modules/lit-html/directives/until.js"); -/* harmony import */ var lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lit-html/directives/repeat */ "../app/node_modules/lit-html/directives/repeat.js"); -/* harmony import */ var _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/item */ "../core/src/item.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_otp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @padloc/core/src/otp */ "../core/src/otp.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_clipboard__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/clipboard */ "../app/src/lib/clipboard.ts"); -/* harmony import */ var _lib_animation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/animation */ "../app/src/lib/animation.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _tags_input__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./tags-input */ "../app/src/elements/tags-input.ts"); -/* harmony import */ var _move_items_dialog__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./move-items-dialog */ "../app/src/elements/move-items-dialog.ts"); -/* harmony import */ var _field__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./field */ "../app/src/elements/field.ts"); -/* harmony import */ var _generator__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./generator */ "../app/src/elements/generator.ts"); -/* harmony import */ var _attachment_dialog__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./attachment-dialog */ "../app/src/elements/attachment-dialog.ts"); -/* harmony import */ var _upload_dialog__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./upload-dialog */ "../app/src/elements/upload-dialog.ts"); -/* harmony import */ var _qr_dialog__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./qr-dialog */ "../app/src/elements/qr-dialog.ts"); -/* harmony import */ var _field_type_dialog__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./field-type-dialog */ "../app/src/elements/field-type-dialog.ts"); -/* harmony import */ var _view__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./view */ "../app/src/elements/view.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - - - - - - - - - - - -let ItemDialog = class ItemDialog extends _dialog__WEBPACK_IMPORTED_MODULE_11__.Dialog { - constructor() { - super(...arguments); - this.itemId = ""; - this.isNew = false; - this._editing = false; - this._fields = []; - this._draggingIndex = -1; - this._dragOverIndex = -1; - } - get _item() { - const found = (this.itemId && _globals__WEBPACK_IMPORTED_MODULE_7__.app.getItem(this.itemId)) || null; - return found && found.item; - } - get _vault() { - const found = (this.itemId && _globals__WEBPACK_IMPORTED_MODULE_7__.app.getItem(this.itemId)) || null; - return found && found.vault; - } - async show(itemId) { - this._editing = false; - this.itemId = itemId; - await this.updateComplete; - this._itemChanged(); - // Workaround for weird bug where name input is sometimes empty after opening dialog - setTimeout(() => this._itemChanged(), 200); - const promise = super.show(); - await this.updateComplete; - (0,_lib_animation__WEBPACK_IMPORTED_MODULE_9__.animateCascade)(this.$$(".content > *")); - return promise; - } - async addAttachment() { - await this.updateComplete; - if (this._vault.id === _globals__WEBPACK_IMPORTED_MODULE_7__.app.mainVault.id && !_globals__WEBPACK_IMPORTED_MODULE_7__.app.account.quota.storage && _globals__WEBPACK_IMPORTED_MODULE_7__.app.billingEnabled) { - this.dispatch("get-premium", { - message: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Upgrade to Premium now and get 1GB of encrypted file storage!"), - icon: "storage" - }); - this.done(); - return; - } - this._fileInput.click(); - } - dismiss() { - super.dismiss(); - _globals__WEBPACK_IMPORTED_MODULE_7__.router.go("items"); - } - done() { - super.done(); - this.itemId = ""; - this._itemChanged(); - } - renderContent() { - if (_globals__WEBPACK_IMPORTED_MODULE_7__.app.state.locked || !this._item || !this._vault) { - return _base__WEBPACK_IMPORTED_MODULE_10__.html ``; - } - const { updated, updatedBy } = this._item; - const vault = this._vault; - const org = vault.org && _globals__WEBPACK_IMPORTED_MODULE_7__.app.getOrg(vault.org.id); - const readonly = !_globals__WEBPACK_IMPORTED_MODULE_7__.app.hasWritePermissions(vault); - const updatedByMember = org && org.getMember({ id: updatedBy }); - const attachments = this._item.attachments || []; - const isFavorite = _globals__WEBPACK_IMPORTED_MODULE_7__.app.account.favorites.has(this.itemId); - return _base__WEBPACK_IMPORTED_MODULE_10__.html ` -
    - - - - this._setFavorite(!isFavorite)} - > -
    - -
    - - - ${(0,lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_1__.repeat)(this._fields, field => `${this.itemId}_${field.name}_${field.type}`, (field, index) => _base__WEBPACK_IMPORTED_MODULE_10__.html ` - this._editField(index)} - @copy-clipboard=${() => (0,_lib_clipboard__WEBPACK_IMPORTED_MODULE_8__.setClipboard)(this._item, field)} - @remove=${() => this._removeField(index)} - @generate=${() => this._generateValue(index)} - @get-totp-qr=${() => this._getTotpQR(index)} - @dragstart=${(e) => this._dragstart(e, index)} - @dragenter=${(e) => this._dragenter(e, index)} - @dragover=${(e) => this._dragover(e)} - @dragend=${(e) => this._dragend(e)} - @drop=${(e) => this._drop(e)} - > - - `)} - ${attachments.map(a => _base__WEBPACK_IMPORTED_MODULE_10__.html ` -
    this._openAttachment(a)} - > - - this._deleteAttachment(a)} - > -
    -
    ${a.name}
    -
    ${(0,_lib_util__WEBPACK_IMPORTED_MODULE_5__.fileSize)(a.size)}
    -
    -
    - `)} - -
    - - - - - - - -
    - -
    - ${(0,lit_html_directives_until__WEBPACK_IMPORTED_MODULE_0__.until)((0,_lib_util__WEBPACK_IMPORTED_MODULE_5__.formatDateFromNow)(updated))} - ${updatedByMember && " " + (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("by {0}", updatedByMember.email)} -
    -
    - -
    -
    - - this.edit()} ?disabled=${readonly}> -
    - -
    - - -
    - - -
    - - - `; - } - async edit() { - if (!_globals__WEBPACK_IMPORTED_MODULE_7__.app.hasWritePermissions(this._vault)) { - return; - } - this._editing = true; - await this.updateComplete; - setTimeout(() => this._nameInput.focus(), 100); - } - async cancelEdit() { - if (this.isNew) { - _globals__WEBPACK_IMPORTED_MODULE_7__.app.deleteItems([this._item]); - this.dismiss(); - } - else { - this._fields = this._getFields(); - await this.updateComplete; - this._editing = false; - this._itemChanged(); - } - this.isNew = false; - } - save() { - _globals__WEBPACK_IMPORTED_MODULE_7__.app.updateItem(this._item, { - name: this._nameInput.value, - fields: this._getFields(), - tags: this._tagsInput.tags - }); - this._editing = false; - this._itemChanged(); - this.isNew = false; - } - _editingChanged() { - this.dismissOnTapOutside = !this._editing; - } - _getFields() { - return [...this._fieldInputs].map((fieldEl) => { - return new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_2__.Field({ - name: fieldEl.name, - value: fieldEl.value, - type: fieldEl.type - }); - }); - } - _itemChanged() { - if (this._item) { - this._nameInput.value = this._item.name; - this._fields = this._item.fields.map(f => new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_2__.Field({ ...f })); - this._tagsInput.tags = [...this._item.tags]; - } - else { - this._nameInput.value = ""; - this._fields = []; - this._tagsInput.tags = []; - } - } - _removeField(index) { - this._fields = this._fields.filter((_, i) => i !== index); - } - async _deleteItem() { - this.open = false; - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Are you sure you want to delete this item?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Delete"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Cancel"), { - type: "destructive" - }); - if (confirmed) { - _globals__WEBPACK_IMPORTED_MODULE_7__.app.deleteItems([this._item]); - _globals__WEBPACK_IMPORTED_MODULE_7__.router.go("items"); - } - else { - this.open = true; - } - } - async _addField() { - this.open = false; - const fieldDef = await this._fieldTypeDialog.show(); - this.open = true; - if (!fieldDef) { - return; - } - this._fields.push(new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_2__.Field({ name: fieldDef.name, value: "", type: fieldDef.type })); - this.requestUpdate(); - await this.updateComplete; - setTimeout(() => this._fieldInputs[this._fields.length - 1].focus(), 100); - } - async _move() { - if (!_globals__WEBPACK_IMPORTED_MODULE_7__.app.hasWritePermissions(this._vault)) { - return; - } - this.open = false; - if (this._item.attachments.length) { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Items with attachments cannot be moved!"), { type: "warning" }); - } - else { - const movedItems = await this._moveItemsDialog.show([{ item: this._item, vault: this._vault }]); - if (movedItems && movedItems.length) { - _globals__WEBPACK_IMPORTED_MODULE_7__.router.go(`items/${movedItems[0].id}`); - } - } - this.open = true; - } - async _editField(index) { - if (!_globals__WEBPACK_IMPORTED_MODULE_7__.app.hasWritePermissions(this._vault)) { - return; - } - this._editing = true; - await this.updateComplete; - this._fieldInputs[index].focus(); - } - async _generateValue(index) { - this.open = false; - const value = await this._generator.show(); - this.open = true; - if (value) { - this._fields[index].value = value; - } - } - async _attachFile() { - const file = this._fileInput.files[0]; - this._fileInput.value = ""; - if (!file) { - return; - } - if (file.size > 5e6) { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("The selected file is too large! Only files of up to 5 MB are supported."), { - type: "warning" - }); - return; - } - this.open = false; - const att = await this._uploadDialog.show({ item: this.itemId, file }); - if (att) { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("File uploaded successfully!"), { type: "success" }); - } - this.open = true; - } - async _openAttachment(info) { - if (this._editing) { - return; - } - this.open = false; - await this._attachmentDialog.show({ item: this.itemId, info }); - this.open = true; - } - async _getTotpQR(index) { - this.open = false; - const data = await this._qrDialog.show(); - if (data) { - try { - const { secret } = (0,_padloc_core_src_otp__WEBPACK_IMPORTED_MODULE_4__.parseURL)(data); - this._fields[index].value = secret; - } - catch (e) { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.alert)("Invalid Code! Please try again!", { type: "warning" }); - return this._getTotpQR(index); - } - } - this.open = true; - } - _setFavorite(favorite) { - _globals__WEBPACK_IMPORTED_MODULE_7__.app.toggleFavorite(this.itemId, favorite); - this.requestUpdate(); - } - async _deleteAttachment(a) { - this.open = false; - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Are you sure you want to delete this attachment?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Delete"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Cancel"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Delete Attachment"), - type: "destructive" - }); - this.open = true; - if (confirmed) { - await _globals__WEBPACK_IMPORTED_MODULE_7__.app.deleteAttachment(this.itemId, a); - this.requestUpdate(); - } - } - _drop(e) { - // console.log("drop", e, this._draggingIndex, this._dragOverIndex); - e.preventDefault(); - e.stopPropagation(); - return false; - } - async _dragstart(event, index) { - // console.log("dragstart", event); - this._draggingIndex = index; - this.dispatch("field-dragged", { item: this._item, index, event }); - event.target.classList.add("dragging"); - this.classList.add("dragging"); - } - _dragenter(e, index) { - // console.log("dragenter", e); - e.dataTransfer.dropEffect = "move"; - this._dragOverIndex = index; - for (const [i, field] of this._fieldInputs.entries()) { - field.classList.toggle("dragover", i === index && i !== this._draggingIndex && i !== this._draggingIndex - 1); - } - } - _dragover(e) { - e.preventDefault(); - } - _dragend(_e) { - // console.log("dragend", e, this._draggingIndex, this._dragOverIndex); - if (this._draggingIndex !== -1 || this._dragOverIndex !== -1) { - const field = this._fields[this._draggingIndex]; - this._fields.splice(this._draggingIndex, 1); - const targetIndex = this._dragOverIndex >= this._draggingIndex ? this._dragOverIndex : this._dragOverIndex + 1; - this._fields.splice(targetIndex, 0, field); - this.requestUpdate(); - } - for (const field of this._fieldInputs) { - field.classList.remove("dragging"); - field.classList.remove("dragover"); - } - this.classList.remove("dragging"); - this._dragOverIndex = -1; - this._draggingIndex = -1; - } -}; -ItemDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_11__.Dialog.styles, - ..._view__WEBPACK_IMPORTED_MODULE_22__.View.styles, - _base__WEBPACK_IMPORTED_MODULE_10__.css ` - .inner { - max-width: 500px; - background: var(--color-quaternary); - display: flex; - flex-direction: column; - min-height: 500px; - max-height: 100%; - } - - .content { - padding-bottom: 50px; - } - - .content > * { - margin: 12px; - } - - .name { - padding: 0 8px; - margin: 0 8px; - line-height: 40px; - text-align: center; - } - - :host([editing]) .name { - border: dashed 1px var(--color-shade-3); - text-align: left; - } - - pl-field { - position: relative; - } - - .content > pl-tags-input { - margin: 12px 16px; - } - - :host(:not([editing])) pl-field:hover { - background: #eee; - } - - .updated { - text-align: center; - font-size: var(--font-size-tiny); - color: var(--color-shade-4); - font-weight: 600; - margin: 30px; - } - - .updated::before { - font-family: FontAwesome; - font-size: 80%; - content: "\\f303"; - display: inline-block; - margin-right: 4px; - } - - .attachment { - display: flex; - align-items: center; - padding: 12px; - margin: 12px; - } - - .attachment-body { - flex: 1; - width: 0; - } - - .attachment .file-icon { - font-size: 150%; - margin: 0 4px 0 -4px; - } - - .attachment-name { - font-size: var(--font-size-small); - font-weight: bold; - line-height: 1.5em; - } - - .attachment-size { - font-size: var(--font-size-tiny); - } - - .attachment-remove { - margin: 0 8px 0 -8px; - } - - .favorite { - color: var(--color-secondary); - opacity: 0.3; - cursor: pointer; - transition: transform 0.2s cubic-bezier(0.05, 0.7, 0.03, 3) 0s; - transform: scale(0.9); - } - - .favorite:hover { - opacity: 0.6; - } - - .favorite[active] { - color: var(--color-negative); - opacity: 1; - transform: scale(1); - } - - .editing { - text-align: center; - padding: 8px; - margin: 0 0 0 12px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - border-radius: var(--border-radius); - background: rgba(255, 255, 255, 0.9); - } - - .actions { - grid-template-columns: 1fr 1fr; - } - - .actions > button { - font-size: var(--font-size-small); - background: none; - padding: 10px 8px 10px 0; - border: dashed 1px; - font-weight: bold; - } - - .actions > button.negative { - color: var(--color-negative); - border-color: var(--color-negative); - } - - .save-button, - .cancel-button { - flex: 1; - max-width: 200px; - min-width: 120px; - } - - :host(.dragging) .content > * { - will-change: transform; - transition: transform 0.2s; - } - - pl-field.dragover::after { - content: ""; - display: block; - height: 30px; - border: dashed 2px var(--color-primary); - width: 100%; - box-sizing: border-box; - position: absolute; - bottom: -45px; - border-radius: var(--border-radius); - } - - pl-field.dragover ~ * { - transform: translate3d(0, 40px, 0); - } - - @media (max-width: 700px) { - .outer { - padding: 0; - } - - .inner { - border-radius: 0; - max-width: 100%; - width: 100%; - height: 100%; - } - - .scrim { - display: none; - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.property)(), - __metadata("design:type", String) -], ItemDialog.prototype, "itemId", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.property)(), - __metadata("design:type", Boolean) -], ItemDialog.prototype, "isNew", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.property)({ reflect: true, attribute: "editing" }), - __metadata("design:type", Boolean) -], ItemDialog.prototype, "_editing", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.property)(), - __metadata("design:type", Array) -], ItemDialog.prototype, "_fields", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.query)("#nameInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_13__.Input) -], ItemDialog.prototype, "_nameInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.query)("pl-tags-input"), - __metadata("design:type", _tags_input__WEBPACK_IMPORTED_MODULE_14__.TagsInput) -], ItemDialog.prototype, "_tagsInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.queryAll)("pl-field"), - __metadata("design:type", Array) -], ItemDialog.prototype, "_fieldInputs", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.query)("input[type='file']"), - __metadata("design:type", HTMLInputElement) -], ItemDialog.prototype, "_fileInput", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-move-items-dialog"), - __metadata("design:type", _move_items_dialog__WEBPACK_IMPORTED_MODULE_15__.MoveItemsDialog) -], ItemDialog.prototype, "_moveItemsDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-generator"), - __metadata("design:type", _generator__WEBPACK_IMPORTED_MODULE_17__.Generator) -], ItemDialog.prototype, "_generator", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-attachment-dialog"), - __metadata("design:type", _attachment_dialog__WEBPACK_IMPORTED_MODULE_18__.AttachmentDialog) -], ItemDialog.prototype, "_attachmentDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-upload-dialog"), - __metadata("design:type", _upload_dialog__WEBPACK_IMPORTED_MODULE_19__.UploadDialog) -], ItemDialog.prototype, "_uploadDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-qr-dialog"), - __metadata("design:type", _qr_dialog__WEBPACK_IMPORTED_MODULE_20__.QRDialog) -], ItemDialog.prototype, "_qrDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-field-type-dialog"), - __metadata("design:type", _field_type_dialog__WEBPACK_IMPORTED_MODULE_21__.FieldTypeDialog) -], ItemDialog.prototype, "_fieldTypeDialog", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.observe)("_editing"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], ItemDialog.prototype, "_editingChanged", null); -ItemDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_10__.element)("pl-item-dialog") -], ItemDialog); - - - -/***/ }), - -/***/ "../app/src/elements/items-filter.ts": -/*!*******************************************!*\ - !*** ../app/src/elements/items-filter.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ItemsFilter": () => (/* binding */ ItemsFilter) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - -let ItemsFilter = class ItemsFilter extends (0,_mixins_state__WEBPACK_IMPORTED_MODULE_1__.StateMixin)(_base__WEBPACK_IMPORTED_MODULE_4__.BaseElement) { - constructor() { - super(...arguments); - this.vault = ""; - this.tag = ""; - this.favorites = false; - this.attachments = false; - this.recent = false; - this.host = ""; - this.searching = false; - this._selecting = false; - } - render() { - if (!_globals__WEBPACK_IMPORTED_MODULE_3__.app.mainVault || !_globals__WEBPACK_IMPORTED_MODULE_3__.app.account) { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ``; - } - const { vault: vaultId, tag, favorites, attachments, recent, host } = this; - const vault = _globals__WEBPACK_IMPORTED_MODULE_3__.app.getVault(vaultId); - const cl = favorites - ? "favorites" - : recent - ? "recent" - : vault - ? "vault" - : attachments - ? "attachments" - : tag - ? "filter-tag" - : host - ? "host" - : "all"; - const label = favorites - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Favorites") - : recent - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Recently Used") - : attachments - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Attachments") - : host - ? this.state.currentHost - : vault - ? vault.name - : tag || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("All Items"); - const count = _globals__WEBPACK_IMPORTED_MODULE_3__.app.count; - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` - - -
    this._dismiss()}> -
    - - - - - - - - - - - - - ${_globals__WEBPACK_IMPORTED_MODULE_3__.app.orgs.map(org => { - const vaults = _globals__WEBPACK_IMPORTED_MODULE_3__.app.vaults.filter(v => v.org && v.org.id === org.id); - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -

    ${org.name}

    - - ${vaults.map(vault => _base__WEBPACK_IMPORTED_MODULE_4__.html ` - - `)} - `; - })} - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Tags")}

    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You don't have any tags yet.")} -
    - - ${_globals__WEBPACK_IMPORTED_MODULE_3__.app.state.tags.map(([tag, count]) => _base__WEBPACK_IMPORTED_MODULE_4__.html ` - - `)} -
    -
    - `; - } - _select({ tag, vault, favorites, recent, attachments, host }) { - const params = {}; - if (tag) { - params.tag = tag; - } - if (vault) { - params.vault = vault; - } - if (favorites) { - params.favorites = favorites; - } - if (attachments) { - params.attachments = attachments; - } - if (recent) { - params.recent = recent; - } - if (host) { - params.host = host; - } - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go("items", params); - } - _dismiss() { - this._selecting = false; - } -}; -ItemsFilter.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_2__.shared, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - :host { - display: block; - text-align: center; - overflow: visible; - } - - button { - display: flex; - margin: 0 auto; - align-items: center; - font-weight: bold; - padding: 6px 12px; - border-radius: 20px; - line-height: normal; - box-sizing: border-box; - overflow: hidden; - max-width: 100%; - background: var(--color-shade-1); - border-bottom: solid 2px var(--color-shade-2); - margin-bottom: -2px; - font-size: var(--font-size-small); - } - - button.vault { - background: var(--color-primary); - color: var(--color-tertiary); - text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0; - border-bottom: solid 2px var(--color-shade-4); - } - - button.filter-tag { - background: var(--color-secondary); - color: var(--color-tertiary); - text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0; - border-bottom: solid 2px #222; - } - - button.favorites, - button.host { - background: var(--color-negative); - color: var(--color-tertiary); - text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0; - border-bottom: solid 2px var(--color-shade-4); - } - - button pl-icon { - font-size: 85%; - width: 20px; - height: 20px; - margin-right: -6px; - } - - button pl-icon.search-icon { - margin-right: 3px; - margin-left: -4px; - } - - .list pl-icon { - margin-left: -4px; - margin-right: 2px; - margin-top: 1px; - font-size: 80%; - width: 25px; - } - - button > div, - .option > div { - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.ellipsis()} - } - - .scrim { - z-index: 10; - border-top: solid 3px #f2f2f2; - background: rgba(255, 255, 255, 0.5); - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.fullbleed()} - top: 60px; - will-change: opacity; - transition: opacity 200ms cubic-bezier(0.6, 0, 0.2, 1); - } - - :host(:not([selecting])) .scrim { - opacity: 0; - pointer-events: none; - } - - :host(:not([selecting])) .list { - transform: translate3d(0, -100%, 0); - } - - .list { - padding: 12px 6px 6px 6px; - background: var(--color-tertiary); - box-sizing: border-box; - max-height: 100%; - width: 100%; - font-size: var(--font-size-tiny); - border-bottom: solid 3px var(--color-shade-1); - will-change: transform; - transition: transform 200ms cubic-bezier(0.6, 0, 0.2, 1); - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.scroll()} - } - - .list button { - margin-bottom: 6px; - border-bottom: none; - padding: 5px 10px; - text-shadow: none; - } - - h4 { - margin: 16px 10px 10px 10px; - text-align: center; - opacity: 0.8; - } - - .no-tags { - font-size: var(--font-size-micro); - padding: 5px 10px 15px 10px; - opacity: 0.5; - } - - .count { - opacity: 0.7; - margin-left: 6px; - margin-right: 2px; - font-size: var(--font-size-tiny); - } - - @supports (-webkit-overflow-scrolling: touch) { - .scrim { - top: calc(50px + max(env(safe-area-inset-top), 8px)); - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", String) -], ItemsFilter.prototype, "vault", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", String) -], ItemsFilter.prototype, "tag", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Boolean) -], ItemsFilter.prototype, "favorites", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Boolean) -], ItemsFilter.prototype, "attachments", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Boolean) -], ItemsFilter.prototype, "recent", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", String) -], ItemsFilter.prototype, "host", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Boolean) -], ItemsFilter.prototype, "searching", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)({ reflect: true, attribute: "selecting" }), - __metadata("design:type", Boolean) -], ItemsFilter.prototype, "_selecting", void 0); -ItemsFilter = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-items-filter") -], ItemsFilter); - - - -/***/ }), - -/***/ "../app/src/elements/items-list.ts": -/*!*****************************************!*\ - !*** ../app/src/elements/items-list.ts ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ItemsList": () => (/* binding */ ItemsList) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/util */ "../core/src/util.ts"); -/* harmony import */ var lit_html_directives_cache__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lit-html/directives/cache */ "../app/node_modules/lit-html/directives/cache.js"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _lib_clipboard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/clipboard */ "../app/src/lib/clipboard.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _view__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./view */ "../app/src/elements/view.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _move_items_dialog__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./move-items-dialog */ "../app/src/elements/move-items-dialog.ts"); -/* harmony import */ var _attachment_dialog__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./attachment-dialog */ "../app/src/elements/attachment-dialog.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _items_filter__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./items-filter */ "../app/src/elements/items-filter.ts"); -/* harmony import */ var _virtual_list__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./virtual-list */ "../app/src/elements/virtual-list.ts"); -/* harmony import */ var _totp__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./totp */ "../app/src/elements/totp.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - - - - - - -function filterByString(fs, rec) { - if (!fs) { - return true; - } - const content = [rec.name, ...rec.tags, ...rec.fields.map(f => f.name), ...rec.fields.map(f => f.value)] - .join(" ") - .toLowerCase(); - return content.search((0,_padloc_core_src_util__WEBPACK_IMPORTED_MODULE_1__.escapeRegex)(fs.toLowerCase())) !== -1; -} -let ItemsList = class ItemsList extends (0,_mixins_state__WEBPACK_IMPORTED_MODULE_3__.StateMixin)(_view__WEBPACK_IMPORTED_MODULE_10__.View) { - constructor() { - super(...arguments); - this.selected = ""; - this.multiSelect = false; - this.vault = ""; - this.tag = ""; - this.favorites = false; - this.attachments = false; - this.recent = false; - this.host = false; - this._listItems = []; - this._filterShowing = false; - this._cachedBounds = null; - this._multiSelect = new Map(); - this._updateItems = (0,_padloc_core_src_util__WEBPACK_IMPORTED_MODULE_1__.debounce)(() => { - this._listItems = this._getItems(); - }, 50); - } - async stateChanged() { - // Clear items from selection that are no longer in list (due to filtering) - for (const id of this._multiSelect.keys()) { - if (!this._listItems.some(i => i.item.id === id)) { - this._multiSelect.delete(id); - } - } - // When the app is getting locked, give the lock animation some time to finish - if (this._listItems.length && this.state.locked) { - await (0,_padloc_core_src_util__WEBPACK_IMPORTED_MODULE_1__.wait)(500); - } - this._updateItems(); - } - async search() { - this._filterShowing = true; - await this.updateComplete; - this._filterInput.focus(); - } - cancelFilter() { - this._filterInput.value = ""; - this._filterInput.blur(); - this._filterShowing = false; - this._updateItems(); - } - selectItem(item) { - if (this.multiSelect) { - if (this._multiSelect.has(item.item.id)) { - this._multiSelect.delete(item.item.id); - } - else { - this._multiSelect.set(item.item.id, item); - } - this.requestUpdate(); - } - else { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go(`items/${item.item.id}`); - } - } - selectAll() { - this.multiSelect = true; - for (const item of this._listItems) { - this._multiSelect.set(item.item.id, item); - } - this.requestUpdate(); - } - clearSelection() { - this._multiSelect.clear(); - this.requestUpdate(); - } - cancelMultiSelect() { - this._multiSelect.clear(); - this.multiSelect = false; - this.requestUpdate(); - } - firstUpdated() { - this._resizeHandler(); - } - render() { - const placeholder = this._listItems.length - ? {} - : this._filterShowing - ? { - icon: "search", - text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Your search did not match any items.") - } - : this.vault - ? { - icon: "vault", - text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This vault does not have any items yet.") - } - : this.attachments - ? { - icon: "attachment", - text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You don't have any attachments yet.") - } - : this.favorites - ? { - icon: "favorite", - text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You don't have any favorites yet.") - } - : this.recent - ? { - icon: "time", - text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You don't have any recently used items!") - } - : { - icon: "list", - text: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You don't have any items yet.") - }; - return _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    - this.dispatch("toggle-menu")} - ?hidden=${this._filterShowing} - > - -
    - - - -
    - - - - - this.search()} - ?hidden=${this._filterShowing} - > - - this.cancelFilter()} - ?hidden=${!this._filterShowing} - > -
    - -
    - this._renderItem(item)} - .guard=${({ item, vault }) => [ - item.name, - item.tags, - item.fields, - vault, - item.id === this.selected, - this.multiSelect, - this._multiSelect.has(item.id) - ]} - > -
    - -
    - - -
    ${placeholder.text}
    -
    - -
    - (this.multiSelect = true)}> - -
    - - this.dispatch("create-item")}> -
    - -
    - (this._multiSelect.size ? this.clearSelection() : this.selectAll())} - > - - - this.cancelMultiSelect()}> - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("{0} items selected", this._multiSelect.size.toString())}
    - - this._moveItems()}> - - this._deleteItems()}> -
    - `; - } - _resizeHandler() { - delete this._cachedBounds; - } - // - // private _scrollToIndex(i: number) { - // const el = this.$(`pl-item-item[index="${i}"]`); - // if (el) { - // this._main.scrollTop = el.offsetTop - 6; - // } - // } - // - // private _scrollToSelected() { - // const selected = this._selected.values()[0]; - // const i = this._listItems.indexOf(selected); - // if (i !== -1 && (i < this._firstVisibleIndex || i > this._lastVisibleIndex)) { - // this._scrollToIndex(i); - // } - // } - // private async _animateItems(delay = 100) { - // await this.updateComplete; - // this._main.style.opacity = "0"; - // setTimeout(() => { - // this._scrollHandler(); - // const elements = Array.from(this.$$(".list-item")); - // const animated = elements.slice(this._firstVisibleIndex, this._lastVisibleIndex + 1); - // - // animateCascade(animated, { clear: true }); - // this._main.style.opacity = "1"; - // }, delay); - // } - async _deleteItems() { - let selected = [...this._multiSelect.values()]; - if (selected.some(({ vault }) => !_globals__WEBPACK_IMPORTED_MODULE_5__.app.hasWritePermissions(vault))) { - const proceed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Some items in your selection are from Vaults you don't have write access " + - "to and cannot be deleted. Do you want to proceed deleting the other items?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Yes"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("No")); - if (!proceed) { - return; - } - selected = selected.filter(({ vault }) => _globals__WEBPACK_IMPORTED_MODULE_5__.app.hasWritePermissions(vault)); - } - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to delete these items? This action can not be undone!"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete {0} Items", selected.length.toString()), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel"), { type: "destructive" }); - if (confirmed) { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.deleteItems(selected.map(i => i.item)); - this.cancelMultiSelect(); - } - } - async _moveItems() { - let selected = [...this._multiSelect.values()]; - if (selected.some(({ item }) => !!item.attachments.length)) { - const proceed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Some items in your selection have attachments and cannot be moved. " + - "Do you want to proceed moving the other items?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Yes"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("No")); - if (!proceed) { - return; - } - selected = selected.filter(({ item }) => !item.attachments.length); - } - if (selected.some(({ vault }) => !_globals__WEBPACK_IMPORTED_MODULE_5__.app.hasWritePermissions(vault))) { - const proceed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Some items in your selection are from Vaults you don't have write " + - "access to and cannot be moved. Do you want to proceed moving the other items?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Yes"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("No")); - if (!proceed) { - return; - } - selected = selected.filter(({ vault }) => _globals__WEBPACK_IMPORTED_MODULE_5__.app.hasWritePermissions(vault)); - } - const movedItems = await this._moveItemsDialog.show(selected); - if (movedItems) { - this.cancelMultiSelect(); - } - } - _copyField({ item }, index, e) { - e.stopPropagation(); - (0,_lib_clipboard__WEBPACK_IMPORTED_MODULE_4__.setClipboard)(item, item.fields[index]); - const fieldEl = e.target; - fieldEl.classList.add("copied"); - setTimeout(() => fieldEl.classList.remove("copied"), 1000); - _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateLastUsed(item); - this.dispatch("field-clicked", { item, index }); - } - async _dragFieldStart({ item }, index, event) { - this.dispatch("field-dragged", { item, index, event }); - return true; - } - _openAttachment(a, item, e) { - e.stopPropagation(); - this._attachmentDialog.show({ info: a, item: item.id }); - } - _getItems() { - const { vault: vaultId, tag, favorites, attachments, recent, host } = this; - const filter = (this._filterInput && this._filterInput.value) || ""; - const recentThreshold = new Date(Date.now() - _globals__WEBPACK_IMPORTED_MODULE_5__.app.settings.recentLimit * 24 * 60 * 60 * 1000); - let items = []; - if (host) { - items = this.app.getItemsForHost(this.app.state.currentHost); - } - else { - for (const vault of this.state.vaults) { - // Filter by vault - if (vaultId && vault.id !== vaultId) { - continue; - } - for (const item of vault.items) { - if ( - // filter by tag - (!tag || item.tags.includes(tag)) && - (!favorites || _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.favorites.has(item.id)) && - (!attachments || !!item.attachments.length) && - (!recent || - (_globals__WEBPACK_IMPORTED_MODULE_5__.app.state.lastUsed.has(item.id) && _globals__WEBPACK_IMPORTED_MODULE_5__.app.state.lastUsed.get(item.id) > recentThreshold)) && - filterByString(filter || "", item)) { - items.push({ - vault, - item, - section: "", - firstInSection: false, - lastInSection: false - }); - } - } - } - } - items.sort((a, b) => { - const x = a.item.name.toLowerCase(); - const y = b.item.name.toLowerCase(); - return x > y ? 1 : x < y ? -1 : 0; - }); - return items; - } - _renderItem(li) { - const { item, vault, warning } = li; - const tags = []; - if (!this.vault && _globals__WEBPACK_IMPORTED_MODULE_5__.app.mainVault && vault.id !== _globals__WEBPACK_IMPORTED_MODULE_5__.app.mainVault.id) { - tags.push({ name: vault.name, icon: "", class: "highlight" }); - } - if (warning) { - tags.push({ icon: "error", class: "warning", name: "" }); - } - if (item.tags.length === 1) { - const t = item.tags.find(t => t === _globals__WEBPACK_IMPORTED_MODULE_5__.router.params.tag) || item.tags[0]; - tags.push({ - name: t, - class: "" - }); - } - else if (item.tags.length) { - tags.push({ - icon: "tag", - name: item.tags.length.toString(), - class: "" - }); - } - const attCount = (item.attachments && item.attachments.length) || 0; - if (attCount) { - tags.push({ - name: attCount.toString(), - icon: "attachment", - class: "" - }); - } - if (_globals__WEBPACK_IMPORTED_MODULE_5__.app.account.favorites.has(item.id)) { - tags.push({ - name: "", - icon: "favorite", - class: "warning" - }); - } - return _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    - ${(0,lit_html_directives_cache__WEBPACK_IMPORTED_MODULE_2__.cache)(this.multiSelect - ? _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    - ` - : "")} - -
    -
    -
    - ${item.name || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("No Name")} -
    - -
    - ${tags.map(tag => _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    - ${tag.icon - ? _base__WEBPACK_IMPORTED_MODULE_9__.html ` - - ` - : ""} - ${tag.name - ? _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    - ${tag.name} -
    - ` - : ""} -
    - `)} -
    -
    - -
    - ${item.fields.map((f, i) => { - return _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    this._copyField(li, i, e)} - draggable="true" - @dragstart=${(e) => this._dragFieldStart(li, i, e)} - > -
    -
    - - ${f.name || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unnamed")} -
    - ${f.type === "totp" - ? _base__WEBPACK_IMPORTED_MODULE_9__.html ` - - ` - : _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    - ${f.format(true)} -
    - `} -
    - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("copied")}
    -
    - `; - })} - ${item.attachments.map(a => _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    this._openAttachment(a, item, e)} - > -
    -
    - - ${a.name} -
    -
    - - ${(0,_lib_util__WEBPACK_IMPORTED_MODULE_8__.fileSize)(a.size)} -
    -
    -
    - `)} - ${(0,lit_html_directives_cache__WEBPACK_IMPORTED_MODULE_2__.cache)(!item.fields.length && !item.attachments.length - ? _base__WEBPACK_IMPORTED_MODULE_9__.html ` -
    -
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("No Fields")} -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This item has no fields.")}
    -
    -
    - ` - : "")} -
    -
    -
    - `; - } -}; -ItemsList.styles = [ - ..._view__WEBPACK_IMPORTED_MODULE_10__.View.styles, - _base__WEBPACK_IMPORTED_MODULE_9__.css ` - :host { - display: flex; - flex-direction: column; - box-sizing: border-box; - position: relative; - background: var(--color-quaternary); - border-radius: var(--border-radius); - } - - header { - overflow: visible; - z-index: 10; - } - - header pl-input { - font-size: var(--font-size-default); - padding: 0 0 0 10px; - } - - pl-items-filter { - min-width: 0; - } - - main { - padding-bottom: 70px; - position: relative; - } - - .section-header { - grid-column: 1/-1; - font-weight: bold; - display: flex; - align-items: flex-end; - height: 35px; - box-sizing: border-box; - padding: 0 10px 5px 10px; - background: var(--color-quaternary); - display: flex; - z-index: 1; - position: -webkit-sticky; - position: sticky; - top: -3px; - margin-bottom: -8px; - font-size: var(--font-size-small); - } - - .item { - box-sizing: border-box; - display: flex; - align-items: center; - margin: 6px; - cursor: pointer; - /* - box-shadow: rgba(0, 0, 0, 0.1) 0 1px 8px; - border: none; - */ - } - - .item-body { - flex: 1; - min-width: 0; - } - - .item .tags { - padding: 0; - } - - .item .tags .tag-name { - max-width: 60px; - } - - .item-header { - height: 24px; - margin: 12px 12px 8px 12px; - position: relative; - display: flex; - align-items: center; - } - - .item-name { - ${_styles__WEBPACK_IMPORTED_MODULE_7__.mixins.ellipsis()} - font-weight: 600; - flex: 1; - min-width: 0; - line-height: 24px; - } - - .item-fields { - position: relative; - display: flex; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - padding: 0 0 6px 6px; - } - - .item-fields::after { - content: ""; - display: block; - width: 6px; - flex: none; - /* - position: absolute; - z-index: 1; - right: 0; - top: 0; - bottom: 0; - background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1)); - */ - } - - .item-field { - cursor: pointer; - font-size: var(--font-size-tiny); - position: relative; - flex: 1; - border-radius: 8px; - max-width: calc(60%); - opacity: 0.999; - } - - .item-field.dragging { - background: var(--color-tertiary); - } - - .item-field.dragging::after { - background: none; - } - - .item-field > * { - transition: transform 0.2s cubic-bezier(1, -0.3, 0, 1.3), opacity 0.2s; - } - - .item-field:not(.copied) .copied-message, - .item-field.copied .item-field-label { - opacity: 0; - transform: scale(0); - } - - .copied-message { - ${_styles__WEBPACK_IMPORTED_MODULE_7__.mixins.fullbleed()} - border-radius: inherit; - font-weight: bold; - color: var(--color-primary); - text-align: center; - line-height: 45px; - } - - .copied-message::before { - font-family: "FontAwesome"; - content: "\\f00c\\ "; - } - - .item-field-label { - padding: 4px 6px; - pointer-events: none; - min-width: 0; - } - - .item-field-name { - font-size: var(--font-size-micro); - color: var(--color-primary); - margin-bottom: 2px; - font-weight: 600; - ${_styles__WEBPACK_IMPORTED_MODULE_7__.mixins.ellipsis()} - line-height: 16px; - height: 16px; - } - - .item-field-name pl-icon { - font-size: 9px; - color: var(--color-primary); - display: inline-block; - height: 10px; - width: 10px; - border-radius: 0; - position: relative; - top: 1px; - } - - .item-field-value { - font-weight: 600; - line-height: 19px; - height: 19px; - ${_styles__WEBPACK_IMPORTED_MODULE_7__.mixins.ellipsis()} - } - - .item-field-value > * { - vertical-align: middle; - } - - .item-field.attachment { - display: flex; - align-items: center; - } - - .attachment .file-icon { - display: inline-block; - height: 1em; - width: 1em; - font-size: 90%; - border-radius: 0; - vertical-align: middle; - } - - .item:focus:not([selected]) { - border-color: var(--color-highlight); - color: #4ca8d9; - } - - .item[selected] { - background: #e6e6e6; - border-color: #ddd; - } - - .item-check { - position: relative; - width: 30px; - height: 30px; - box-sizing: border-box; - border: solid 3px transparent; - background: var(--color-shade-1); - border-radius: 30px; - margin: 12px; - margin-right: 0; - } - - .item-check::after { - content: ""; - display: block; - ${_styles__WEBPACK_IMPORTED_MODULE_7__.mixins.fullbleed()} - background: var(--color-negative); - border-radius: inherit; - transition: transform 0.2s, opacity 0.2s; - transition-timing-function: cubic-bezier(1, -0.3, 0, 1.3); - } - - .item-check:not([checked])::after { - opacity: 0; - transform: scale(0); - } - - .selected-count { - text-align: center; - display: block; - margin-left: 12px; - background: rgba(255, 255, 255, 0.9); - border-radius: var(--border-radius); - padding: 12px 4px; - line-height: 1.2em; - font-size: var(--font-size-tiny); - font-weight: bold; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - } - - pl-virtual-list { - padding: 6px; - padding-bottom: 65px; - ${_styles__WEBPACK_IMPORTED_MODULE_7__.mixins.fullbleed()} - ${_styles__WEBPACK_IMPORTED_MODULE_7__.mixins.scroll()} - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", String) -], ItemsList.prototype, "selected", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", Boolean) -], ItemsList.prototype, "multiSelect", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", String) -], ItemsList.prototype, "vault", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", String) -], ItemsList.prototype, "tag", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", Boolean) -], ItemsList.prototype, "favorites", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", Boolean) -], ItemsList.prototype, "attachments", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", Boolean) -], ItemsList.prototype, "recent", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", Boolean) -], ItemsList.prototype, "host", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", Array) -], ItemsList.prototype, "_listItems", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.query)("#filterInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_11__.Input) -], ItemsList.prototype, "_filterInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.property)(), - __metadata("design:type", Boolean) -], ItemsList.prototype, "_filterShowing", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-move-items-dialog"), - __metadata("design:type", _move_items_dialog__WEBPACK_IMPORTED_MODULE_12__.MoveItemsDialog) -], ItemsList.prototype, "_moveItemsDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_6__.dialog)("pl-attachment-dialog"), - __metadata("design:type", _attachment_dialog__WEBPACK_IMPORTED_MODULE_13__.AttachmentDialog) -], ItemsList.prototype, "_attachmentDialog", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.observe)("vault"), - (0,_base__WEBPACK_IMPORTED_MODULE_9__.observe)("tag"), - (0,_base__WEBPACK_IMPORTED_MODULE_9__.observe)("favorites"), - (0,_base__WEBPACK_IMPORTED_MODULE_9__.observe)("attachments"), - (0,_base__WEBPACK_IMPORTED_MODULE_9__.observe)("recent"), - (0,_base__WEBPACK_IMPORTED_MODULE_9__.observe)("host"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Promise) -], ItemsList.prototype, "stateChanged", null); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.listen)("resize", window), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], ItemsList.prototype, "_resizeHandler", null); -ItemsList = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_9__.element)("pl-items-list") -], ItemsList); - - - -/***/ }), - -/***/ "../app/src/elements/loading-button.ts": -/*!*********************************************!*\ - !*** ../app/src/elements/loading-button.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "LoadingButton": () => (/* binding */ LoadingButton) -/* harmony export */ }); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _spinner__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./spinner */ "../app/src/elements/spinner.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - -let LoadingButton = class LoadingButton extends _base__WEBPACK_IMPORTED_MODULE_1__.BaseElement { - constructor() { - super(...arguments); - this.state = "idle"; - this.noTab = false; - } - render() { - const { state, noTab } = this; - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` - - `; - } - static get is() { - return "pl-loading-button"; - } - _click(e) { - if (this.state === "loading") { - e.stopPropagation(); - } - } - start() { - clearTimeout(this._stopTimeout); - this.state = "loading"; - } - stop() { - this.state = "idle"; - } - success() { - this.state = "success"; - this._stopTimeout = window.setTimeout(() => this.stop(), 1000); - } - fail() { - this.state = "fail"; - this._stopTimeout = window.setTimeout(() => this.stop(), 1000); - } -}; -LoadingButton.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_0__.shared, - _base__WEBPACK_IMPORTED_MODULE_1__.css ` - :host { - display: flex; - padding: 12px 15px; - } - - :host([state="loading"]) button { - cursor: progress; - } - - button { - background: transparent; - position: relative; - flex: 1; - height: auto; - padding: 0; - } - - button > * { - transition: transform 0.2s cubic-bezier(1, -0.3, 0, 1.3), opacity 0.2s; - will-change: transform; - } - - button > :not(.label) { - ${_styles__WEBPACK_IMPORTED_MODULE_0__.mixins.absoluteCenter()} - } - - button > .label { - display: flex; - align-items: center; - justify-content: center; - } - - :host(.vertical) .label { - flex-direction: column; - } - - button.loading .label, - button.success .label, - button.fail .label, - button:not(.loading) .spinner, - button:not(.success) .icon-success, - button:not(.fail) .icon-fail { - opacity: 0.5; - transform: scale(0); - } - - button pl-icon { - font-size: 120%; - } - - pl-spinner { - width: 30px; - height: 30px; - } - - :host(.icon) { - background: transparent !important; - border-radius: 100% !important; - padding: 0; - line-height: 0; - } - - :host(:not(.icon)) ::slotted(pl-icon:first-child) { - margin: -10px 0 -10px -10px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)({ reflect: true }), - __metadata("design:type", String) -], LoadingButton.prototype, "state", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Boolean) -], LoadingButton.prototype, "noTab", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.listen)("click"), - __metadata("design:type", Function), - __metadata("design:paramtypes", [MouseEvent]), - __metadata("design:returntype", void 0) -], LoadingButton.prototype, "_click", null); -LoadingButton = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("pl-loading-button") -], LoadingButton); - - - -/***/ }), - -/***/ "../app/src/elements/login.ts": -/*!************************************!*\ - !*** ../app/src/elements/login.ts ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Login": () => (/* binding */ Login) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/mfa */ "../core/src/mfa.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _start_form__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./start-form */ "../app/src/elements/start-form.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _password_input__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./password-input */ "../app/src/elements/password-input.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _logo__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./logo */ "../app/src/elements/logo.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - -let Login = class Login extends _start_form__WEBPACK_IMPORTED_MODULE_5__.StartForm { - constructor() { - super(...arguments); - this._failedCount = 0; - } - async reset() { - await this.updateComplete; - this._emailInput.value = _globals__WEBPACK_IMPORTED_MODULE_3__.router.params.email || ""; - this._passwordInput.value = ""; - this._loginButton.stop(); - this._failedCount = 0; - super.reset(); - if (_globals__WEBPACK_IMPORTED_MODULE_3__.router.params.verifying) { - this._verifyEmail(); - } - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    - -
    - - - this._submit()} - > - - - this._submit()} - > - - - this._submit()}> - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Login")} - - - ${this._errorMessage - ? _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    ${this._errorMessage}
    - ` - : ""} - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("New to Padloc?")} -
    - - -
    - -
    - `; - } - async _verifyEmail() { - _globals__WEBPACK_IMPORTED_MODULE_3__.router.params = { ..._globals__WEBPACK_IMPORTED_MODULE_3__.router.params, email: this._emailInput.value, verifying: "1" }; - const res = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_9__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter the confirmation code sent to your email address to proceed!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("One Last Step!"), - placeholder: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Verification Code"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Submit"), - type: "number", - pattern: "[0-9]*", - validate: async (code) => { - try { - return _globals__WEBPACK_IMPORTED_MODULE_3__.app.retrieveMFAToken(this._emailInput.value, code, _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_2__.MFAPurpose.Login); - } - catch (e) { - if (e.code === _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.MFA_TRIES_EXCEEDED) { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_9__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Maximum number of tries exceeded! Please resubmit and try again!"), { - type: "warning" - }); - return null; - } - throw e.message || - `Something went wrong while we were processing your request. Please try again later! (Error Code: ${e.code})`; - } - } - }); - if (res) { - this._verificationToken = res.token; - } - const { email, verifying, ...rest } = _globals__WEBPACK_IMPORTED_MODULE_3__.router.params; - _globals__WEBPACK_IMPORTED_MODULE_3__.router.params = rest; - return res; - } - async _accountDoesntExist(email) { - const signup = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_9__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("An account with this email address does not exist!"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Sign Up"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel"), { - icon: "info" - }); - if (signup) { - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go("signup", { email }); - } - } - async _submit() { - if (this._loginButton.state === "loading") { - return; - } - if (!this._emailInput.reportValidity()) { - return; - } - this._emailInput.blur(); - this._passwordInput.blur(); - const email = this._emailInput.value; - let password = this._passwordInput.value; - if (this._emailInput.invalid) { - this._errorMessage = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter a valid email address!"); - this.rumble(); - this._emailInput.focus(); - return; - } - if (!password) { - this._errorMessage = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter your master password!"); - this.rumble(); - this._passwordInput.focus(); - return; - } - this._errorMessage = ""; - this._loginButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.login(email, password, this._verificationToken); - this._loginButton.success(); - this.done(); - } - catch (e) { - switch (e.code) { - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.MFA_REQUIRED: - this._loginButton.stop(); - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.requestMFACode(email, _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_2__.MFAPurpose.Login); - const verify = await this._verifyEmail(); - if (!verify) { - return; - } - if (!verify.hasAccount) { - if (verify.hasLegacyAccount) { - this._migrateAccount(email, password, verify.legacyToken, verify.token); - } - else { - this._accountDoesntExist(email); - } - return; - } - return this._submit(); - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.INVALID_CREDENTIALS: - this._errorMessage = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Wrong username or password. Please try again!"); - this._loginButton.fail(); - this.rumble(); - this._failedCount++; - if (this._failedCount > 2) { - const recover = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_9__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Can't remember your master password?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Recover Account"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Try Again")); - if (recover) { - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go("recover", { email }); - } - } - else { - this._passwordInput.focus(); - } - return; - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.NOT_FOUND: - this._loginButton.fail(); - this._accountDoesntExist(email); - return; - default: - this._loginButton.fail(); - throw e; - } - } - } -}; -Login.styles = [ - ..._start_form__WEBPACK_IMPORTED_MODULE_5__.StartForm.styles, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - .hint { - font-size: var(--font-size-tiny); - box-sizing: border-box; - transition: max-height 0.3s; - max-height: 100px; - margin: 40px 0 -20px 0; - } - - button.signup { - background: none; - border: none; - height: auto; - line-height: normal; - font-weight: bold; - height: var(--row-height); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", String) -], Login.prototype, "_errorMessage", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#emailInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_6__.Input) -], Login.prototype, "_emailInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#passwordInput"), - __metadata("design:type", _password_input__WEBPACK_IMPORTED_MODULE_7__.PasswordInput) -], Login.prototype, "_passwordInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#loginButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_8__.LoadingButton) -], Login.prototype, "_loginButton", void 0); -Login = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-login") -], Login); - - - -/***/ }), - -/***/ "../app/src/elements/logo.ts": -/*!***********************************!*\ - !*** ../app/src/elements/logo.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Logo": () => (/* binding */ Logo) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - -let Logo = class Logo extends _base__WEBPACK_IMPORTED_MODULE_0__.BaseElement { - constructor() { - super(...arguments); - this.reveal = false; - } - _logo() { - return _base__WEBPACK_IMPORTED_MODULE_0__.svg ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - `; - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_0__.html ` - ${this._logo()} - `; - } -}; -Logo.styles = [ - _base__WEBPACK_IMPORTED_MODULE_0__.css ` - :host { - position: relative; - display: block; - width: 200px; - height: 52px; - } - - :host([reveal]) .padloc > * { - stroke-dashoffset: 0; - } - - svg { - width: 100%; - height: 100%; - fill: none; - stroke: currentColor; - stroke-linecap: round; - stroke-width: 7; - } - - .padloc > * { - transition: stroke-dashoffset 1.4s cubic-bezier(0.57, 0.25, 0, 0.99); - stroke-dashoffset: 0; - } - - .p { - stroke-dashoffset: 234px; - stroke-dasharray: 234px; - transition-delay: 0s; - } - - .a { - stroke-dashoffset: 190px; - stroke-dasharray: 190px; - transition-delay: 0.1s; - } - - .d { - stroke-dashoffset: 232px; - stroke-dasharray: 232px; - transition-delay: 0.2s; - } - - .l { - stroke-dashoffset: 155px; - stroke-dasharray: 155px; - transition-delay: 0.3s; - } - - .o { - stroke-dashoffset: 168px; - stroke-dasharray: 168px; - transition-delay: 0.4s; - } - - .c { - stroke-dashoffset: 237px; - stroke-dasharray: 237px; - transition-delay: 0.5s; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], Logo.prototype, "reveal", void 0); -Logo = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.element)("pl-logo") -], Logo); - - - -/***/ }), - -/***/ "../app/src/elements/member-dialog.ts": -/*!********************************************!*\ - !*** ../app/src/elements/member-dialog.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "MemberDialog": () => (/* binding */ MemberDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/org */ "../core/src/org.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _toggle_button__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./toggle-button */ "../app/src/elements/toggle-button.ts"); -/* harmony import */ var _group_item__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./group-item */ "../app/src/elements/group-item.ts"); -/* harmony import */ var _member_item__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./member-item */ "../app/src/elements/member-item.ts"); -/* harmony import */ var _vault_item__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./vault-item */ "../app/src/elements/vault-item.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - -let MemberDialog = class MemberDialog extends _dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog { - constructor() { - super(...arguments); - this.org = null; - this.member = null; - this._error = ""; - this._vaults = new Map(); - this._groups = new Set(); - } - _getCurrentVaults() { - const vaults = new Map(); - if (!this.org || !this.member) { - return vaults; - } - for (const vault of this.org.vaults) { - const v = this.member && this.member.vaults.find(v => v.id === vault.id); - vaults.set(vault.id, { - read: !!v, - write: !!v && !v.readonly - }); - } - return vaults; - } - _getCurrentGroups() { - return this.org && this.member - ? new Set(this.org.getGroupsForMember(this.member).map(g => g.name)) - : new Set(); - } - get _hasChanged() { - if (!this.org || !this.member) { - return false; - } - const currentVaults = this._getCurrentVaults(); - const vaultsChanged = this.org.vaults.some(({ id }) => { - const c = currentVaults.get(id); - const s = this._vaults.get(id); - return c.read !== s.read || c.write !== s.write; - }); - const currentGroups = this._getCurrentGroups(); - const groupsChanged = currentGroups.size !== this._groups.size || - [...this._groups.values()].some(name => !currentGroups.has(name)); - return vaultsChanged || groupsChanged; - } - async show({ member, org }) { - this.member = member; - this.org = org; - this._groups = this._getCurrentGroups(); - this._vaults = this._getCurrentVaults(); - this._error = ""; - await this.updateComplete; - return super.show(); - } - _toggleGroup(group) { - if (this._groups.has(group.name)) { - this._groups.delete(group.name); - } - else { - this._groups.add(group.name); - } - this.requestUpdate(); - } - _toggleVault({ id }) { - const { read } = this._vaults.get(id); - this._vaults.set(id, read ? { read: false, write: false } : { read: true, write: true }); - this.requestUpdate(); - } - _toggleRead({ id }, event) { - if (event) { - event.stopImmediatePropagation(); - } - const sel = this._vaults.get(id); - sel.read = !sel.read; - if (!sel.read) { - sel.write = false; - } - this.requestUpdate(); - } - _toggleWrite({ id }, event) { - if (event) { - event.stopImmediatePropagation(); - } - const sel = this._vaults.get(id); - sel.write = !sel.write; - if (sel.write) { - sel.read = true; - } - this.requestUpdate(); - } - async _save() { - if (this._saveButton.state === "loading") { - return; - } - this._error = ""; - this._saveButton.start(); - const vaults = [...this._vaults.entries()] - .filter(([, { read }]) => read) - .map(([id, { write }]) => ({ id, readonly: !write })); - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.updateMember(this.org, this.member, { - vaults, - groups: [...this._groups] - }); - this._saveButton.success(); - this.done(); - } - catch (e) { - this._saveButton.fail(); - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Something went wrong. Please try again later!"); - throw e; - } - } - async _showOptions() { - const isAdmin = this.member.role === _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.OrgRole.Admin; - this.open = false; - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.choose)("", [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Remove"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Suspend"), isAdmin ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Remove Admin") : (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Make Admin")], { - hideIcon: true, - type: "destructive" - }); - switch (choice) { - case 0: - this._removeMember(); - break; - case 1: - this._suspendMember(); - break; - case 2: - isAdmin ? this._removeAdmin() : this._makeAdmin(); - break; - default: - this.open = true; - } - } - async _removeMember() { - this.open = false; - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Are you sure you want to remove this member from this organization?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Remove"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Cancel"), { - type: "destructive", - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Remove Member") - }); - this.open = true; - if (confirmed) { - this._saveButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.removeMember(this.org, this.member); - this._saveButton.success(); - this.done(); - } - catch (e) { - this._saveButton.fail(); - throw e; - } - } - } - async _makeAdmin() { - this.open = false; - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Are you sure you want to make this member an admin? " + - "Admins can manage vaults, groups and permissions."), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Make Admin"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Cancel")); - this.open = true; - if (confirmed) { - this._saveButton.start(); - try { - this.member = await _globals__WEBPACK_IMPORTED_MODULE_3__.app.updateMember(this.org, this.member, { role: _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.OrgRole.Admin }); - this._saveButton.success(); - } - catch (e) { - this._saveButton.fail(); - throw e; - } - } - } - async _removeAdmin() { - this.open = false; - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Are you sure you want to remove this member as admin?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Remove Admin"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Cancel"), { type: "destructive" }); - this.open = true; - if (confirmed) { - this._saveButton.start(); - try { - this.member = await _globals__WEBPACK_IMPORTED_MODULE_3__.app.updateMember(this.org, this.member, { role: _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.OrgRole.Member }); - this._saveButton.success(); - } - catch (e) { - this._saveButton.fail(); - throw e; - } - } - } - async _suspendMember() { - this.open = false; - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Are you sure you want to suspend this member?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Suspend Member"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Cancel"), { type: "destructive" }); - this.open = true; - if (confirmed) { - this._saveButton.start(); - try { - this.member = await _globals__WEBPACK_IMPORTED_MODULE_3__.app.updateMember(this.org, this.member, { role: _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.OrgRole.Suspended }); - this._saveButton.success(); - this.done(); - } - catch (e) { - this._saveButton.fail(); - throw e; - } - } - } - shouldUpdate() { - return !!this.org && !!this.member; - } - renderContent() { - const org = this.org; - const member = this.member; - const accountIsOwner = org.isOwner(_globals__WEBPACK_IMPORTED_MODULE_3__.app.account); - const accountIsAdmin = org.isAdmin(_globals__WEBPACK_IMPORTED_MODULE_3__.app.account); - const memberIsOwner = org.isOwner(member); - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - - -
    - -
    -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Groups")}
    -
    - - ${org.groups.map(group => _base__WEBPACK_IMPORTED_MODULE_5__.html ` - this._toggleGroup(group)} - .active=${this._groups.has(group.name)} - > - - - `)} - -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Vaults")}
    -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("read")}
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("write")}
    -
    - - ${org.vaults.map(vault => _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    this._toggleVault(vault)} ?disabled=${!accountIsAdmin}> - - this._toggleRead(vault, e)} - > - this._toggleWrite(vault, e)} - > -
    - `)} - -
    - ${this._error} -
    -
    - - - `; - } -}; -MemberDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_5__.css ` - .inner { - background: var(--color-quaternary); - } - - pl-toggle-button { - display: block; - padding: 0 15px 0 0; - } - - .more-button { - font-size: var(--font-size-small); - align-self: flex-start; - width: 30px; - height: 30px; - margin-top: 5px; - } - - .subheader { - margin: 8px; - font-weight: bold; - display: flex; - align-items: flex-end; - padding: 0 8px; - font-size: var(--font-size-small); - } - - .subheader .permission { - width: 50px; - font-size: var(--font-size-tiny); - text-align: center; - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.ellipsis()} - } - - .item { - display: flex; - align-items: center; - } - - .item pl-toggle { - margin-right: 14px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], MemberDialog.prototype, "org", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], MemberDialog.prototype, "member", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#saveButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], MemberDialog.prototype, "_saveButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", String) -], MemberDialog.prototype, "_error", void 0); -MemberDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.element)("pl-member-dialog") -], MemberDialog); - - - -/***/ }), - -/***/ "../app/src/elements/member-item.ts": -/*!******************************************!*\ - !*** ../app/src/elements/member-item.ts ***! - \******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "MemberItem": () => (/* binding */ MemberItem) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/org */ "../core/src/org.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _randomart__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./randomart */ "../app/src/elements/randomart.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - -let MemberItem = class MemberItem extends _base__WEBPACK_IMPORTED_MODULE_3__.BaseElement { - constructor() { - super(...arguments); - this.hideRole = false; - } - render() { - const isAdmin = this.member.role === _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.OrgRole.Admin; - const isOwner = this.member.role === _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.OrgRole.Owner; - const isSuspended = this.member.role === _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.OrgRole.Suspended; - const groups = (this.org && this.org.getGroupsForMember(this.member).filter(g => g.name !== "Everyone")) || []; - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` - - -
    -
    -
    ${this.member.name}
    - -
    - ${groups.map(group => _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    - - ${group.name} -
    - `)} - ${!this.hideRole && isOwner - ? _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Owner")}
    - ` - : !this.hideRole && isAdmin - ? _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Admin")}
    - ` - : !this.hideRole && isSuspended - ? _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Suspended")}
    - ` - : ""} -
    -
    - -
    ${this.member.email}
    -
    - `; - } -}; -MemberItem.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_2__.shared, - _base__WEBPACK_IMPORTED_MODULE_3__.css ` - :host { - display: flex; - align-items: center; - padding: 8px; - } - - pl-fingerprint { - color: var(--color-secondary); - --color-background: var(--color-tertiary); - width: 45px; - height: 45px; - border-radius: 100%; - border: solid 1px var(--border-color); - margin-right: 8px; - } - - .member-info { - flex: 1; - width: 0; - } - - .name-wrapper { - display: flex; - } - - .name-wrapper > .tags { - margin: 0 0 0 4px; - } - - .member-name { - font-weight: bold; - flex: 1; - width: 0; - } - - .member-email { - font-size: 90%; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.OrgMember) -], MemberItem.prototype, "member", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.Org) -], MemberItem.prototype, "org", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Boolean) -], MemberItem.prototype, "hideRole", void 0); -MemberItem = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.element)("pl-member-item") -], MemberItem); - - - -/***/ }), - -/***/ "../app/src/elements/menu.ts": -/*!***********************************!*\ - !*** ../app/src/elements/menu.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Menu": () => (/* binding */ Menu) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _logo__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./logo */ "../app/src/elements/logo.ts"); -/* harmony import */ var _spinner__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./spinner */ "../app/src/elements/spinner.ts"); -/* harmony import */ var _report_errors_dialog__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./report-errors-dialog */ "../app/src/elements/report-errors-dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - -let Menu = class Menu extends (0,_mixins_state__WEBPACK_IMPORTED_MODULE_6__.StateMixin)(_base__WEBPACK_IMPORTED_MODULE_7__.BaseElement) { - constructor() { - super(...arguments); - this.selected = "items"; - } - _goTo(path, params) { - this.dispatch("toggle-menu"); - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go(path, params); - } - _lock() { - this.dispatch("toggle-menu"); - _globals__WEBPACK_IMPORTED_MODULE_3__.app.lock(); - } - _getPremium(e) { - e && e.stopPropagation(); - this.dispatch("get-premium"); - this.dispatch("toggle-menu"); - } - _reportErrors() { - this._reportErrorsDialog.show(); - } - _displayVaultError(vault, e) { - e && e.stopPropagation(); - const error = vault.error; - switch (error.code) { - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_2__.ErrorCode.UNSUPPORTED_VERSION: - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("A newer version of Padloc is required to synchronize this vault. Please update to the latest version now!"), { - title: "Update Required", - type: "warning" - }); - return; - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_2__.ErrorCode.MISSING_ACCESS: - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This vault could not be synchronized because you no longer have access to it."), { - title: "Sync Failed", - type: "warning" - }); - return; - default: - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)(error.message || - (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("An unknown error occured while synchronizing this vault. If this problem persists please contact customer support."), { - title: "Sync Failed", - type: "warning" - }); - return; - } - } - render() { - const mainVault = _globals__WEBPACK_IMPORTED_MODULE_3__.app.mainVault; - const account = _globals__WEBPACK_IMPORTED_MODULE_3__.app.account; - if (!mainVault || !account) { - return _base__WEBPACK_IMPORTED_MODULE_7__.html ``; - } - const itemsQuota = _globals__WEBPACK_IMPORTED_MODULE_3__.app.getItemsQuota(); - const tags = _globals__WEBPACK_IMPORTED_MODULE_3__.app.state.tags; - const count = _globals__WEBPACK_IMPORTED_MODULE_3__.app.count; - const showSettingsWarning = _globals__WEBPACK_IMPORTED_MODULE_3__.app.billingEnabled && - account.billing && - (!account.billing.subscription || account.billing.subscription.status === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.SubscriptionStatus.Inactive); - const showUpgradeButton = _globals__WEBPACK_IMPORTED_MODULE_3__.app.billingEnabled && - (!account.billing || - !account.billing.subscription || - account.billing.subscription.plan.type === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.PlanType.Free) && - itemsQuota !== -1; - return _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - - -
    v${"3.1.4"}
    - -
    - - -
    - - - `; - } -}; -Menu.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_4__.shared, - _base__WEBPACK_IMPORTED_MODULE_7__.css ` - :host { - display: flex; - flex-direction: column; - color: var(--color-tertiary); - font-size: var(--font-size-small); - } - - .scroller { - flex: 1; - height: 0; - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.scroll()} - padding: 10px 0; - } - - li { - background: transparent; - border: none; - display: flex; - align-items: center; - height: 40px; - margin: 2px 10px; - padding-right: 10px; - border-radius: 8px; - overflow: hidden; - height: 40px; - font-weight: 600; - --color-highlight: var(--color-tertiary); - --color-foreground: var(--color-secondary); - } - - li:not(.sub-item) { - margin-top: 8px; - } - - li[selected] { - background: var(--color-highlight); - box-shadow: rgba(0, 0, 0, 0.1) 0 1px 1px; - color: var(--color-foreground); - font-weight: bold; - } - - li div { - flex: 1; - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.ellipsis()} - } - - h3 { - font-size: 100%; - margin-top: 30px; - padding: 0 20px; - opacity: 0.8; - font-weight: normal; - } - - .sub-item { - height: 35px; - font-size: var(--font-size-tiny); - margin-left: 20px; - } - - .sub-item pl-icon { - width: 30px; - height: 30px; - font-size: 90%; - } - - .favorites, - .host { - --color-highlight: var(--color-negative); - --color-foreground: var(--color-tertiary); - } - - .vault { - --color-highlight: var(--color-primary); - --color-foreground: var(--color-tertiary); - } - - .new { - opacity: 0.6; - } - - pl-logo { - height: 30px; - margin: 15px auto 0 auto; - opacity: 0.25; - } - - .version { - text-align: center; - margin-bottom: 15px; - font-size: var(--font-size-micro); - font-weight: 600; - opacity: 0.3; - } - - .no-tags { - font-size: var(--font-size-micro); - padding: 0 20px; - opacity: 0.5; - width: 100px; - } - - .footer { - padding: 5px; - display: flex; - align-items: center; - box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 15px 0px; - z-index: 1; - } - - .footer pl-icon { - width: 30px; - height: 30px; - font-size: var(--font-size-tiny); - } - - .syncing { - width: 20px; - height: 20px; - margin: 5px; - } - - .get-premium { - background: var(--color-negative); - } - - li .detail { - margin-left: 2px; - flex: none; - opacity: 0.7; - font-weight: semi-bold; - padding: 2px 6px; - margin-right: -4px; - opacity: 1; - border-radius: var(--border-radius); - display: flex; - } - - li .detail pl-icon { - height: 20px; - width: 20px; - } - - .detail.warning { - color: white; - opacity: 1; - background: var(--color-negative); - } - - .separator { - height: 2px; - background: var(--color-shade-2); - border-radius: 100%; - margin: 8px 16px; - } - - .errors-button { - background: var(--color-negative); - padding: 0; - padding-right: 8px; - display: flex; - align-items: center; - font-weight: bold; - } - - .subsection-header { - margin: 12px 8px 6px 26px; - opacity: 0.7; - font-size: var(--font-size-tiny); - } - - @supports (-webkit-overflow-scrolling: touch) { - pl-logo { - margin-top: max(env(safe-area-inset-top), 15px); - } - - .footer { - padding-bottom: max(calc(env(safe-area-inset-bottom) / 3), 5px); - padding-left: max(calc(env(safe-area-inset-bottom) / 3), 5px); - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.property)(), - __metadata("design:type", String) -], Menu.prototype, "selected", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.dialog)("pl-report-errors-dialog"), - __metadata("design:type", _report_errors_dialog__WEBPACK_IMPORTED_MODULE_10__.ReportErrorsDialog) -], Menu.prototype, "_reportErrorsDialog", void 0); -Menu = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.element)("pl-menu") -], Menu); - - - -/***/ }), - -/***/ "../app/src/elements/move-items-dialog.ts": -/*!************************************************!*\ - !*** ../app/src/elements/move-items-dialog.ts ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "MoveItemsDialog": () => (/* binding */ MoveItemsDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./select */ "../app/src/elements/select.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - -let MoveItemsDialog = class MoveItemsDialog extends _dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog { - constructor() { - super(...arguments); - this.items = []; - this.vaults = []; - } - renderContent() { - const itemsDescription = this.items.length === 1 ? `'${this.items[0].item.name}'` : (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("{0} Items", this.items.length.toString()); - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Move {0} To", itemsDescription)}

    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("No target vaults available!")} -
    - - - - -
    - - -
    - `; - } - async _enter() { - this.done(await _globals__WEBPACK_IMPORTED_MODULE_1__.app.moveItems(this.items.map(i => i.item), this._vaultSelect.selected)); - } - async show(items) { - this.items = items; - const sourceVaults = this.items.reduce((sv, i) => sv.add(i.vault), new Set()); - this.vaults = - sourceVaults.size === 1 - ? _globals__WEBPACK_IMPORTED_MODULE_1__.app.vaults.filter(v => _globals__WEBPACK_IMPORTED_MODULE_1__.app.hasWritePermissions(v) && v !== sourceVaults.values().next().value) - : _globals__WEBPACK_IMPORTED_MODULE_1__.app.vaults.filter(v => _globals__WEBPACK_IMPORTED_MODULE_1__.app.hasWritePermissions(v)); - // this._vaultSelect.options = vaults; - await this.updateComplete; - this._vaultSelect.selected = this.vaults[0]; - return super.show(); - } -}; -MoveItemsDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_2__.css ` - pl-input, - pl-select { - text-align: center; - margin: 12px; - } - - .actions { - margin: 12px; - grid-gap: 12px; - } - - h1 { - display: block; - text-align: center; - } - - .message { - margin: 8px; - text-align: center; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Array) -], MoveItemsDialog.prototype, "items", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.property)(), - __metadata("design:type", Array) -], MoveItemsDialog.prototype, "vaults", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.query)("#vaultSelect"), - __metadata("design:type", _select__WEBPACK_IMPORTED_MODULE_3__.Select) -], MoveItemsDialog.prototype, "_vaultSelect", void 0); -MoveItemsDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.element)("pl-move-items-dialog") -], MoveItemsDialog); - - - -/***/ }), - -/***/ "../app/src/elements/org-view.ts": -/*!***************************************!*\ - !*** ../app/src/elements/org-view.ts ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "OrgView": () => (/* binding */ OrgView) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/org */ "../core/src/org.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _view__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./view */ "../app/src/elements/view.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _vault_dialog__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./vault-dialog */ "../app/src/elements/vault-dialog.ts"); -/* harmony import */ var _group_dialog__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./group-dialog */ "../app/src/elements/group-dialog.ts"); -/* harmony import */ var _member_dialog__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./member-dialog */ "../app/src/elements/member-dialog.ts"); -/* harmony import */ var _create_invites_dialog__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./create-invites-dialog */ "../app/src/elements/create-invites-dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _billing_info__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./billing-info */ "../app/src/elements/billing-info.ts"); -/* harmony import */ var _subscription__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./subscription */ "../app/src/elements/subscription.ts"); -/* harmony import */ var _member_item__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./member-item */ "../app/src/elements/member-item.ts"); -/* harmony import */ var _group_item__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./group-item */ "../app/src/elements/group-item.ts"); -/* harmony import */ var _vault_item__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./vault-item */ "../app/src/elements/vault-item.ts"); -/* harmony import */ var _invite_item__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./invite-item */ "../app/src/elements/invite-item.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - - - - - - - - - - -let OrgView = class OrgView extends (0,_mixins_state__WEBPACK_IMPORTED_MODULE_3__.StateMixin)(_view__WEBPACK_IMPORTED_MODULE_8__.View) { - constructor() { - super(...arguments); - this.orgId = ""; - this._page = "members"; - this._membersFilter = ""; - } - get _org() { - return _globals__WEBPACK_IMPORTED_MODULE_6__.app.getOrg(this.orgId); - } - async _createInvite() { - const invites = await this._createInvitesDialog.show(this._org); - if (invites) { - if (invites.length === 1) { - _globals__WEBPACK_IMPORTED_MODULE_6__.router.go(`invite/${invites[0].org.id}/${invites[0].id}`); - } - else { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Successfully created {0} invites!", invites.length.toString())); - this._page = "invites"; - } - } - } - _showInvite(invite) { - _globals__WEBPACK_IMPORTED_MODULE_6__.router.go(`invite/${invite.org.id}/${invite.id}`); - } - async _createVault() { - await this._vaultDialog.show({ org: this._org, vault: null }); - } - async _showGroup(group) { - await this._groupDialog.show({ org: this._org, group }); - } - async _createGroup() { - await this._groupDialog.show({ org: this._org, group: null }); - } - async _showVault(vault) { - await this._vaultDialog.show({ org: this._org, vault: vault }); - } - _updateMembersFilter() { - this._membersFilter = this._filterMembersInput.value; - } - async _showMember(member) { - const org = this._org; - if (member.role === _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_1__.OrgRole.Suspended) { - if (!org.isOwner(_globals__WEBPACK_IMPORTED_MODULE_6__.app.account)) { - return; - } - const invite = org.invites.find(invite => invite.email === member.email); - if (invite) { - this._showInvite(invite); - } - else { - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.choose)("", [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Remove Member"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unsuspend")], { type: "destructive" }); - switch (choice) { - case 0: - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to remove this member from this organization?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Remove"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel"), { - type: "destructive", - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Remove Member") - }); - if (confirmed) { - await _globals__WEBPACK_IMPORTED_MODULE_6__.app.removeMember(org, member); - } - break; - case 1: - const [invite] = await _globals__WEBPACK_IMPORTED_MODULE_6__.app.createInvites(org, [member.email], "confirm_membership"); - _globals__WEBPACK_IMPORTED_MODULE_6__.router.go(`invite/${invite.org.id}/${invite.id}`); - break; - } - } - } - else { - await this._memberDialog.show({ org: org, member }); - } - } - async _deleteOrg() { - const deleted = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to delete this organization? " + - "All associated vaults and the data within them will be lost! " + - "This action can not be undone."), { - type: "destructive", - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete Organization"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete"), - placeholder: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Type 'DELETE' to confirm"), - validate: async (val) => { - if (val !== "DELETE") { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Type 'DELETE' to confirm"); - } - await _globals__WEBPACK_IMPORTED_MODULE_6__.app.deleteOrg(this._org.id); - return val; - } - }); - if (deleted) { - _globals__WEBPACK_IMPORTED_MODULE_6__.router.go(""); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)("Organization deleted successfully.", { type: "success" }); - } - } - async _changeName() { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.prompt)("", { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Rename Organization"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Save"), - label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Company Name"), - value: this._org.name, - validate: async (name) => { - if (!name) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter a name!"); - } - await _globals__WEBPACK_IMPORTED_MODULE_6__.app.updateOrg(this._org.id, async (org) => (org.name = name)); - return name; - } - }); - } - async _rotateKeys() { - if (this._rotateKeysButton.state === "loading") { - return; - } - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Do you want to rotate this organizations cryptographic keys? All organization " + - "memberships will have to be reconfirmed but no data will be lost."), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Confirm")); - if (!confirmed) { - return; - } - this._rotateKeysButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_6__.app.rotateOrgKeys(this._org); - this._rotateKeysButton.success(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("The organizations cryptographic keys have been rotated successfully and " + - "membership confirmation requests for all members have been sent out."), { type: "success" }); - } - catch (e) { - this._rotateKeysButton.fail(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)(e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"), { type: "warning" }); - } - } - _orgChanged() { - this._page = "members"; - this._clearMembersFilter(); - } - _clearMembersFilter() { - this._membersFilter = this._filterMembersInput.value = ""; - } - shouldUpdate() { - return !!this._org; - } - render() { - const org = this._org; - const isOwner = org.isOwner(_globals__WEBPACK_IMPORTED_MODULE_6__.app.account); - const isAdmin = isOwner || org.isAdmin(_globals__WEBPACK_IMPORTED_MODULE_6__.app.account); - const invites = org.invites; - const groups = org.groups; - const vaults = org.vaults; - const memFilter = this._membersFilter.toLowerCase(); - const members = memFilter - ? org.members.filter(({ name, email }) => email.toLowerCase().includes(memFilter) || name.toLowerCase().includes(memFilter)) - : org.members; - const billing = org.billing || Object.assign(new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.BillingInfo(), { org: org.id }); - return _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    -
    - this.dispatch("toggle-menu")}> -
    ${org.name}
    - -
    - -
    -
    - -
    (this._page = "members")}> - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Members")}
    -
    - -
    (this._page = "groups")} - ?hidden=${!org.groups.length && !org.quota.groups} - > - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Groups")}
    -
    - -
    (this._page = "vaults")}> - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Vaults")}
    -
    - -
    (this._page = "settings")} - ?hidden=${!isOwner} - > - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Settings")}
    -
    - -
    -
    -
    - -
    -
    -
    - ${org.frozen - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This organization currently does not have an active subscription " + - 'and has been put in "frozen" state as a result. While in this state, ' + - "you won't be able to make any changes to members, groups or vaults of this " + - "organization.")} - -
    - ` - : ""} - -
    - - - -
    -
      -
    • - -
      ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Invite New Members")}
      -
    • - - ${invites.map(inv => _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    • this._showInvite(inv)}> - -
    • - `)} - ${members.map(member => _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    • this._showMember(member)}> - -
    • - `)} - -
    • - -
      ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Invite New Members")}
      -
    • -
    -
    - -
    - ${org.frozen - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This organization currently does not have an active subscription " + - 'and has been put in "frozen" state as a result. While in this state, ' + - "you won't be able to make any changes to members, groups or vaults of this " + - "organization.")} - -
    - ` - : ""} -
      - ${groups.map(group => _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    • this._showGroup(group)} class="item tap"> - -
    • - `)} -
    • - -
      ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("New Group")}
      -
    • -
    -
    - -
    - ${org.frozen - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This organization currently does not have an active subscription " + - 'and has been put in "frozen" state as a result. While in this state, ' + - "you won't be able to make any changes to members, groups or vaults of this " + - "organization.")} - -
    - ` - : ""} -
      - ${vaults.map(vault => _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    • this._showVault(vault)} class="item tap"> - -
    • - `)} -
    • - -
      ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("New Vault")}
      -
    • -
    -
    - -
    - ${org.frozen - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("This organization currently does not have an active subscription " + - 'and has been put in "frozen" state as a result. While in this state, ' + - "you won't be able to make any changes to members, groups or vaults of this " + - "organization.")} -
    - ` - : ""} - ${_globals__WEBPACK_IMPORTED_MODULE_6__.app.billingEnabled - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Subscription")}

    - - - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Billing Info")}

    - - - ` - : ""} - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Security")}

    - - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Rotate Cryptographic Keys")} - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("General")}

    - - - - -
    -
    -
    - `; - } -}; -OrgView.styles = [ - ..._view__WEBPACK_IMPORTED_MODULE_8__.View.styles, - _base__WEBPACK_IMPORTED_MODULE_7__.css ` - :host { - display: flex; - flex-direction: column; - background: var(--color-quaternary); - border-radius: var(--border-radius); - } - - .wrapper { - position: relative; - width: 100%; - height: 100%; - max-width: 500px; - margin: 0 auto; - } - - .subview { - position: relative; - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.fullbleed()} - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.scroll()} - } - - header { - display: block; - border: none; - } - - .header-inner { - display: flex; - align-items: center; - margin-bottom: 10px; - } - - .header-inner .title { - text-align: center; - } - - header > .tabs { - margin: -10px; - } - - .tabs .spacer { - padding: 0; - } - - .new-button { - display: flex; - font-weight: bold; - align-items: center; - justify-content: center; - padding: 8px; - } - - .new-button > pl-icon { - font-size: 80%; - width: 30px; - height: 30px; - } - - .settings { - padding: 8px; - } - - .settings > button, - .settings > pl-loading-button { - text-align: center; - display: block; - font-weight: bold; - } - - .settings .item { - margin: 8px 0; - } - - .settings h3 { - margin: 18px 8px 12px 8px; - text-align: center; - } - - .settings button { - width: 100%; - } - - .error.item button { - width: 100%; - margin-top: 8px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.property)(), - __metadata("design:type", String) -], OrgView.prototype, "orgId", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("#filterMembersInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_9__.Input) -], OrgView.prototype, "_filterMembersInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("#rotateKeysButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_14__.LoadingButton) -], OrgView.prototype, "_rotateKeysButton", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.dialog)("pl-vault-dialog"), - __metadata("design:type", _vault_dialog__WEBPACK_IMPORTED_MODULE_10__.VaultDialog) -], OrgView.prototype, "_vaultDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.dialog)("pl-group-dialog"), - __metadata("design:type", _group_dialog__WEBPACK_IMPORTED_MODULE_11__.GroupDialog) -], OrgView.prototype, "_groupDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.dialog)("pl-member-dialog"), - __metadata("design:type", _member_dialog__WEBPACK_IMPORTED_MODULE_12__.MemberDialog) -], OrgView.prototype, "_memberDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.dialog)("pl-create-invites-dialog"), - __metadata("design:type", _create_invites_dialog__WEBPACK_IMPORTED_MODULE_13__.CreateInvitesDialog) -], OrgView.prototype, "_createInvitesDialog", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.property)(), - __metadata("design:type", String) -], OrgView.prototype, "_page", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.property)(), - __metadata("design:type", String) -], OrgView.prototype, "_membersFilter", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.observe)("orgId"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], OrgView.prototype, "_orgChanged", null); -OrgView = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.element)("pl-org-view") -], OrgView); - - - -/***/ }), - -/***/ "../app/src/elements/orgs-list.ts": -/*!****************************************!*\ - !*** ../app/src/elements/orgs-list.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "OrgsList": () => (/* binding */ OrgsList) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _view__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./view */ "../app/src/elements/view.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; - - - - - - -let OrgsList = class OrgsList extends (0,_mixins_state__WEBPACK_IMPORTED_MODULE_1__.StateMixin)(_view__WEBPACK_IMPORTED_MODULE_4__.View) { - render() { - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    - this.dispatch("toggle-menu")}> - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Orgs & Teams")}
    - - -
    - -
    -
    - ${_globals__WEBPACK_IMPORTED_MODULE_2__.app.orgs.map(org => _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    _globals__WEBPACK_IMPORTED_MODULE_2__.router.go(`orgs/${org.id}`)}> - - -
    -
    ${org.name}
    - -
    -
    - - -
    ${org.members.length}
    -
    - -
    - - -
    ${org.groups.length}
    -
    - -
    - - -
    ${org.vaults.length}
    -
    - -
    - -
    -
    -
    -
    - `)} -
    - -
    - - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Organizations allow you to securely share passwords, documents and other data " + - "within your family, team or any other kind of group!")} -
    - - -
    - -
    -
    - - this.dispatch("create-org")}> -
    -
    - `; - } -}; -OrgsList.styles = [ - ..._view__WEBPACK_IMPORTED_MODULE_4__.View.styles, - _base__WEBPACK_IMPORTED_MODULE_3__.css ` - :host { - background: var(--color-quaternary); - display: flex; - flex-direction: column; - } - - .orgs { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); - grid-gap: 12px; - margin: 12px; - } - - .orgs > * { - margin: 0; - } - - .org { - padding: 16px; - display: flex; - align-items: center; - } - - .org-icon { - font-size: 120%; - margin-right: 12px; - background: #eee; - border: solid 1px #ddd; - width: 50px; - height: 50px; - } - - .org .tags { - margin: 4px 0; - } - - .org-name { - font-weight: bold; - margin-bottom: 4px; - font-size: 120%; - font-weight: 600; - } - - .org-info { - flex: 1; - width: 0; - } - - .new-org { - background: none; - border: dashed 1px; - font-weight: bold; - } - ` -]; -OrgsList = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.element)("pl-orgs-list") -], OrgsList); - - - -/***/ }), - -/***/ "../app/src/elements/password-input.ts": -/*!*********************************************!*\ - !*** ../app/src/elements/password-input.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PasswordInput": () => (/* binding */ PasswordInput) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - -let PasswordInput = class PasswordInput extends _input__WEBPACK_IMPORTED_MODULE_1__.Input { - constructor() { - super(); - this.type = "password"; - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_0__.html ` - ${super.render()} - - - - `; - } - _toggleMasked() { - this.type = this.type === "password" ? "text" : "password"; - } -}; -PasswordInput.styles = [ - ..._input__WEBPACK_IMPORTED_MODULE_1__.Input.styles, - _base__WEBPACK_IMPORTED_MODULE_0__.css ` - input { - font-size: 120%; - font-family: var(--font-family-mono); - } - - .mask-icon { - position: absolute; - z-index: 1; - right: 5px; - top: 0; - bottom: 0; - margin: auto; - opacity: 0.8; - } - ` -]; -PasswordInput = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.element)("pl-password-input"), - __metadata("design:paramtypes", []) -], PasswordInput); - - - -/***/ }), - -/***/ "../app/src/elements/premium-dialog.ts": -/*!*********************************************!*\ - !*** ../app/src/elements/premium-dialog.ts ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PremiumDialog": () => (/* binding */ PremiumDialog) -/* harmony export */ }); -/* harmony import */ var lit_html_directives_unsafe_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html/directives/unsafe-html */ "../app/node_modules/lit-html/directives/unsafe-html.js"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _card_input__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./card-input */ "../app/src/elements/card-input.ts"); -/* harmony import */ var _billing_dialog__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./billing-dialog */ "../app/src/elements/billing-dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - -let PremiumDialog = class PremiumDialog extends _dialog__WEBPACK_IMPORTED_MODULE_7__.Dialog { - constructor() { - super(...arguments); - this.plan = null; - this._error = ""; - this._updateBillingParams = null; - } - async _submit() { - if (this._submitButton.state === "loading") { - return; - } - this._error = ""; - this._submitButton.start(); - const params = this._updateBillingParams || - new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.UpdateBillingParams({ - account: _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.id - }); - params.plan = this.plan.id; - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateBilling(params); - this._submitButton.success(); - this.done(); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Something went wrong. Please try again later!"); - this._submitButton.fail(); - return; - } - } - async show() { - const result = super.show(); - const plan = _globals__WEBPACK_IMPORTED_MODULE_5__.app.state.billingProvider && _globals__WEBPACK_IMPORTED_MODULE_5__.app.state.billingProvider.plans.find(p => p.type === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.PlanType.Premium); - if (plan) { - this.plan = plan; - this._error = ""; - this._updateBillingParams = null; - } - else { - this.done(); - } - return result; - } - async _updateBillingInfo() { - this.open = false; - const billing = await this._billingDialog.show({ - billingInfo: Object.assign(new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_2__.BillingInfo(), { account: _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.id }) - }); - if (billing) { - this._updateBillingParams = billing; - this._error = ""; - } - this.open = true; - } - renderContent() { - if (!this.plan || !_globals__WEBPACK_IMPORTED_MODULE_5__.app.account) { - return _base__WEBPACK_IMPORTED_MODULE_6__.html ``; - } - const plan = this.plan; - const monthlyPrice = Math.round(plan.cost / 12); - const paymentMethod = (this._updateBillingParams && this._updateBillingParams.paymentMethod) || - (_globals__WEBPACK_IMPORTED_MODULE_5__.app.account.billing && _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.billing.paymentMethod); - const trialDaysLeft = _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.billing ? _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.billing.trialDaysLeft : 30; - return _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    -
    - this.done()}> - -
    - ${plan.name} -
    - -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Free For {0} Days", trialDaysLeft.toString())} -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("then")} -
    - -
    -
    $
    -
    - ${Math.floor(monthlyPrice / 100)} -
    -
    - .${(monthlyPrice % 100).toString().padEnd(2, "0")} -
    -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("per month")} -
    - -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("USD, billed annually")} -
    -
    - -
      - ${plan.features.map(feature => _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    • - ${(0,lit_html_directives_unsafe_html__WEBPACK_IMPORTED_MODULE_0__.unsafeHTML)(feature.replace(/\*\*(.+)\*\*/g, "$1"))} -
    • - `)} -
    - -
    - - ${paymentMethod - ? _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    - ${paymentMethod.name} -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_6__.html ` -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Add Billing Info")} -
    - `} -
    - -
    - ${this._error} -
    - - - ${trialDaysLeft ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Start Trial") : (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Buy Now")} - -
    - `; - } -}; -PremiumDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_7__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_6__.css ` - .plan { - height: 100%; - display: flex; - flex-direction: column; - } - - .inner { - background: var(--color-quaternary); - text-align: center; - } - - .plan-header { - text-align: center; - padding: 20px; - /* background: linear-gradient(180deg, #59c6ff 0%, #077cb9 100%); */ - background: var(--color-highlight); - color: var(--color-highlight-text); - display: flex; - flex-direction: column; - position: relative; - } - - .close-icon { - position: absolute; - top: 8px; - right: 8px; - } - - .plan-name { - font-size: 2rem; - margin-bottom: 10px; - font-weight: bold; - } - - .plan-trial { - font-size: 1.5rem; - margin-bottom: 10px; - } - - .plan-then { - font-size: var(--font-size-small); - margin-bottom: 10px; - } - - .plan-price { - letter-spacing: 0.1em; - display: flex; - align-items: flex-start; - justify-content: center; - font-weight: bold; - font-size: 1.2rem; - margin: 5px; - } - - .plan-price-currency { - line-height: 1em; - margin-top: 0.4em; - } - - .plan-price-dollars { - font-size: 3em; - line-height: 1em; - } - - .plan-price-cents { - font-size: 1.5em; - line-height: 1em; - margin-top: 0.2em; - } - - .plan-unit { - font-size: var(--font-size-small); - margin-bottom: 15px; - } - - .plan-fineprint { - font-size: var(--font-size-tiny); - opacity: 0.8; - } - - .quantity { - font-size: 1.6rem; - margin-top: 20px; - } - - pl-loading-button { - font-weight: bold; - } - - pl-loading-button.primary { - margin: 8px; - background: var(--color-highlight); - color: var(--color-highlight-text); - font-weight: bold; - border-bottom: solid 3px var(--color-shade-2); - } - - .error { - color: var(--color-negative); - padding: 8px; - text-align: center; - } - - .payment-method { - display: flex; - align-items: center; - justify-content: center; - padding: 4px; - font-weight: bold; - margin-bottom: 0; - } - - .change-plan { - background: transparent; - color: var(--color-tertiary); - font-weight: bold; - margin: 4px; - } - - .features { - font-size: var(--font-size-small); - margin-top: 8px; - flex: 1; - ${_styles__WEBPACK_IMPORTED_MODULE_4__.mixins.scroll()} - } - - .features > * { - padding: 10px 15px; - } - - .features > :not(:last-child) { - border-bottom: solid 1px var(--color-shade-1); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], PremiumDialog.prototype, "plan", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], PremiumDialog.prototype, "_error", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", Object) -], PremiumDialog.prototype, "_updateBillingParams", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.query)("#submitButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_8__.LoadingButton) -], PremiumDialog.prototype, "_submitButton", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.dialog)("pl-billing-dialog"), - __metadata("design:type", _billing_dialog__WEBPACK_IMPORTED_MODULE_10__.BillingDialog) -], PremiumDialog.prototype, "_billingDialog", void 0); -PremiumDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.element)("pl-premium-dialog") -], PremiumDialog); - - - -/***/ }), - -/***/ "../app/src/elements/prompt-dialog.ts": -/*!********************************************!*\ - !*** ../app/src/elements/prompt-dialog.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PromptDialog": () => (/* binding */ PromptDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - -const defaultConfirmLabel = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("OK"); -const defaultCancelLabel = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel"); -const defaultType = "text"; -const defaultPlaceholder = ""; -let PromptDialog = class PromptDialog extends _dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog { - constructor() { - super(...arguments); - this.confirmLabel = defaultConfirmLabel; - this.cancelLabel = defaultCancelLabel; - this.title = ""; - this.message = ""; - this.placeholder = defaultPlaceholder; - this.label = ""; - this.preventDismiss = true; - this.type = defaultType; - this.pattern = ""; - this._validationMessage = ""; - } - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` -
    -

    ${this.title}

    - -
    ${this.message}
    - - this._confirmButton.click()} - > - - -
    - this._confirm()} - > - ${this.confirmLabel} - - - -
    -
    - `; - } - renderAfter() { - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` -
    ${this._validationMessage}
    - `; - } - done(val) { - this._validationMessage = ""; - super.done(val); - } - async show({ title = "", message = "", placeholder = defaultPlaceholder, label = "", value = "", type = defaultType, pattern = "", confirmLabel = defaultConfirmLabel, cancelLabel = defaultCancelLabel, preventDismiss = true, preventAutoClose = false, validate } = {}) { - this.title = title; - this.message = message; - this.type = type; - this.pattern = pattern; - this.placeholder = placeholder; - this.label = label; - this.confirmLabel = confirmLabel; - this.cancelLabel = cancelLabel; - this.preventDismiss = preventDismiss; - this.preventAutoClose = preventAutoClose; - this.validate = validate; - this._validationMessage = ""; - await this.updateComplete; - this._confirmButton.stop(); - this._input.value = value; - setTimeout(() => this._input.focus(), 300); - return super.show(); - } - async _confirm() { - let val = this._input.value; - if (this.validate) { - this._confirmButton.start(); - try { - val = await this.validate(val, this._input); - this._confirmButton.success(); - this.done(val); - } - catch (e) { - this.rumble(); - this._validationMessage = e; - this._confirmButton.fail(); - } - } - else { - this.done(val); - } - } -}; -PromptDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_4__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_1__.css ` - h1 { - display: block; - text-align: center; - } - - .message { - margin: 20px; - text-align: center; - } - - pl-input { - text-align: center; - margin: 8px; - } - - .validation-message { - position: relative; - margin-top: 15px; - font-weight: bold; - font-size: var(--font-size-small); - color: var(--color-error); - text-shadow: none; - text-align: center; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], PromptDialog.prototype, "confirmLabel", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], PromptDialog.prototype, "cancelLabel", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], PromptDialog.prototype, "title", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], PromptDialog.prototype, "message", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], PromptDialog.prototype, "placeholder", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], PromptDialog.prototype, "label", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Boolean) -], PromptDialog.prototype, "preventDismiss", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)({ reflect: true }), - __metadata("design:type", String) -], PromptDialog.prototype, "type", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], PromptDialog.prototype, "pattern", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Function) -], PromptDialog.prototype, "validate", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], PromptDialog.prototype, "_validationMessage", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.query)("#confirmButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_3__.LoadingButton) -], PromptDialog.prototype, "_confirmButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.query)("pl-input"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_2__.Input) -], PromptDialog.prototype, "_input", void 0); -PromptDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("pl-prompt-dialog") -], PromptDialog); - - - -/***/ }), - -/***/ "../app/src/elements/qr-dialog.ts": -/*!****************************************!*\ - !*** ../app/src/elements/qr-dialog.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "QRDialog": () => (/* binding */ QRDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _view__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./view */ "../app/src/elements/view.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; - - - - - - - - -let QRDialog = class QRDialog extends _dialog__WEBPACK_IMPORTED_MODULE_5__.Dialog { - constructor() { - super(...arguments); - this.hideApp = true; - } - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Scan QR Code")} -
    - this.done()}> -
    - -
    - `; - } - async show() { - (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__.scanQR)().then((res) => this.done(res), (err) => { - this.done(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Failed to scan QR code. Error: " + err.toString()), { - type: "warning" - }); - }); - return super.show(); - } - done(data) { - (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__.stopScanQR)(); - super.done(data); - } -}; -QRDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_5__.Dialog.styles, - ..._view__WEBPACK_IMPORTED_MODULE_6__.View.styles, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - .inner { - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.fullbleed()} - border-radius: 0; - max-width: 100%; - display: flex; - flex-direction: column; - background: transparent; - } - - .scrim { - background: transparent; - } - - .seeker { - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.fullbleed()} - width: 300px; - height: 300px; - border: solid 3px var(--color-negative); - border-radius: var(--border-radius); - margin: auto; - } - ` -]; -QRDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-qr-dialog") -], QRDialog); - - - -/***/ }), - -/***/ "../app/src/elements/randomart.ts": -/*!****************************************!*\ - !*** ../app/src/elements/randomart.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Fingerprint": () => (/* binding */ Fingerprint) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_randomart__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/randomart */ "../core/src/randomart.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var lit_html__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lit-html */ "../app/node_modules/lit-html/lit-html.js"); -/* harmony import */ var lit_html_directives_until__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lit-html/directives/until */ "../app/node_modules/lit-html/directives/until.js"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - -let Fingerprint = class Fingerprint extends _base__WEBPACK_IMPORTED_MODULE_4__.BaseElement { - async _grid() { - const size = 11; - const fingerprint = await (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__.getCryptoProvider)().fingerprint(this.key); - const art = (0,_padloc_core_src_randomart__WEBPACK_IMPORTED_MODULE_0__.randomArt)(fingerprint, { width: size, height: size }); - const rects = []; - for (const [x, line] of art.values.entries()) { - for (const [y, val] of line.entries()) { - rects.push(lit_html__WEBPACK_IMPORTED_MODULE_2__.svg ``); - } - } - return lit_html__WEBPACK_IMPORTED_MODULE_2__.svg ` - - ${rects} - - `; - } - shouldUpdate() { - return !!this.key; - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` - ${(0,lit_html_directives_until__WEBPACK_IMPORTED_MODULE_3__.until)(this._grid())} - `; - } -}; -Fingerprint.styles = [ - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - :host { - display: block; - width: 100px; - height: 100px; - position: relative; - overflow: hidden; - background: var(--color-background); - color: var(--color-foreground); - } - - svg { - width: 100%; - height: 100%; - fill: currentColor; - pointer-events: none; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Uint8Array) -], Fingerprint.prototype, "key", void 0); -Fingerprint = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-fingerprint") -], Fingerprint); - - - -/***/ }), - -/***/ "../app/src/elements/recover.ts": -/*!**************************************!*\ - !*** ../app/src/elements/recover.ts ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Recover": () => (/* binding */ Recover) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/mfa */ "../core/src/mfa.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _start_form__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./start-form */ "../app/src/elements/start-form.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - -let Recover = class Recover extends _start_form__WEBPACK_IMPORTED_MODULE_5__.StartForm { - constructor() { - super(...arguments); - this._weakPassword = false; - } - get _email() { - return _globals__WEBPACK_IMPORTED_MODULE_3__.router.params.email || ""; - } - async reset() { - this._passwordInput.value = ""; - this._repeatPasswordInput.value = ""; - this._submitButton.stop(); - super.reset(); - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    - -
    - - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Recover Account")}

    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter your email address and new master password.")} -
    - - this._submit()} - > - - - this._updatePwdStrength()} - @enter=${() => this._submit()} - > - - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("WARNING: Weak Password!")}
    - - this._submit()} - > - - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("IMPORTANT, READ CAREFULLY: Padloc is designed in a way that makes it impossible " + - "for us to access the data encrypted in any of your vaults even if we wanted to. " + - "While this is essential to ensuring the security of your data, it also has the " + - "following implications:")} -
      -
    • - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Any data stored in your private vault can not be recovered and will be permantently lost.")} -
    • -
    • - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("All your organization memberships will be suspended temporarily until " + - "confirmed by the organization owner.")} -
    • -
    • - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("All members of organizations you own will be suspended temporarily until " + - "confirmed by you.")} -
    • -
    -
    - - this._submit()}> - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Recover Account")} - -
    - -
    - `; - } - async _submit() { - if (this._submitButton.state === "loading") { - return; - } - this._emailInput.blur(); - this._passwordInput.blur(); - if (this._emailInput.invalid) { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_8__.alert)(this._emailInput.validationMessage || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter a valid email address!"), { - type: "warning" - }); - return; - } - if (!this._passwordInput.value) { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_8__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter a master password!"), { type: "warning" }); - return; - } - if (this._passwordInput.value !== this._repeatPasswordInput.value) { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_8__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You didn't repeat your master password correctly. Try again!"), { type: "warning" }); - return; - } - const email = this._emailInput.value; - const password = this._passwordInput.value; - const strength = await (0,_lib_util__WEBPACK_IMPORTED_MODULE_9__.passwordStrength)(password); - if (strength.score < 2) { - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_8__.choose)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("The password you entered is weak which makes it easier for attackers to break " + - "the encryption used to protect your data. Try to use a longer password or include a " + - "variation of uppercase, lowercase and special characters as well as numbers!"), [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Learn More"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Choose Different Password"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Use Anyway")], { - type: "warning", - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("WARNING: Weak Password"), - hideIcon: true, - preventDismiss: true - }); - switch (choice) { - case 0: - this._openPwdHowTo(); - return; - case 1: - this._passwordInput.focus(); - return; - } - } - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.requestMFACode(email, _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_2__.MFAPurpose.Recover); - return this._recover(email, password); - } - async _recover(email, password) { - this._submitButton.start(); - const verify = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_8__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("To complete the account recovery process, please enter " + - "the confirmation code sent to your email address!"), { - placeholder: "Enter Verification Code", - confirmLabel: "Submit", - validate: async (code) => { - try { - return await _globals__WEBPACK_IMPORTED_MODULE_3__.app.retrieveMFAToken(email, code, _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_2__.MFAPurpose.Recover); - } - catch (e) { - if (e.code === _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.MFA_TRIES_EXCEEDED) { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_8__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Maximum number of tries exceeded! Please resubmit and try again!"), { - type: "warning" - }); - return ""; - } - throw e.message || e.code || e.toString(); - } - } - }); - if (!verify) { - this._submitButton.stop(); - return; - } - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.recoverAccount({ email, password, verify: verify.token }); - this._submitButton.success(); - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_8__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Account recovery successful!"), { type: "success" }); - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go("login"); - } - catch (e) { - this._submitButton.fail(); - throw e; - } - } - async _updatePwdStrength() { - const pwd = this._passwordInput.value; - const result = await (0,_lib_util__WEBPACK_IMPORTED_MODULE_9__.passwordStrength)(pwd); - const score = result.score; - this._weakPassword = score < 3; - } - _openPwdHowTo() { - window.open("https://padlock.io/howto/choose-master-password/", "_system"); - } -}; -Recover.styles = [ - ..._start_form__WEBPACK_IMPORTED_MODULE_5__.StartForm.styles, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - h1 { - display: block; - text-align: center; - margin: 10px; - } - - .title { - width: 300px; - margin: 10px auto 30px auto; - font-size: var(--font-size-small); - font-weight: bold; - letter-spacing: 0.5px; - padding: 0 10px; - } - - #submitButton { - margin-bottom: 30px; - } - - .login { - text-decoration: underline; - cursor: pointer; - } - - .recovery-notes { - text-align: left; - padding: 20px; - margin: 10px; - } - - .recovery-notes ul { - list-style: disc; - } - - .recovery-notes li { - margin: 10px 20px 0 20px; - background: transparent; - border: none; - } - - .back-button { - display: flex; - align-items: center; - padding: 4px 8px 4px 4px; - background: transparent; - align-self: flex-start; - margin-top: 20px; - } - - .back-button:not:hover { - opacity: 0.8; - } - - .back-button pl-icon { - width: 15px; - height: 15px; - margin-right: 4px; - font-size: 0.8em; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], Recover.prototype, "_weakPassword", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#emailInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_6__.Input) -], Recover.prototype, "_emailInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#passwordInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_6__.Input) -], Recover.prototype, "_passwordInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#repeatPasswordInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_6__.Input) -], Recover.prototype, "_repeatPasswordInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#submitButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], Recover.prototype, "_submitButton", void 0); -Recover = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-recover") -], Recover); - - - -/***/ }), - -/***/ "../app/src/elements/report-errors-dialog.ts": -/*!***************************************************!*\ - !*** ../app/src/elements/report-errors-dialog.ts ***! - \***************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ReportErrorsDialog": () => (/* binding */ ReportErrorsDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; - - - - - -let ReportErrorsDialog = class ReportErrorsDialog extends _dialog__WEBPACK_IMPORTED_MODULE_3__.Dialog { - _reportErrors() { - const email = "support@padloc.app" || 0; - const subject = "Padloc Error Report"; - const message = ` - ------ enter your comment above ----- - -IMPORTANT: Please verify that the message below does not contain any sensitive data before sending this email! - -The following errors occurred: - -${_globals__WEBPACK_IMPORTED_MODULE_1__.app.state._errors.join("\n\n")} - -Device Info: - -${JSON.stringify(_globals__WEBPACK_IMPORTED_MODULE_1__.app.state.device.toRaw(), null, 4)} -`; - (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_4__.composeEmail)(email, subject, message); - this._dismissErrors(); - } - _dismissErrors() { - _globals__WEBPACK_IMPORTED_MODULE_1__.app.setState({ _errors: [] }); - this.done(); - } - renderContent() { - return _base__WEBPACK_IMPORTED_MODULE_2__.html ` -
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Report Errors")} -
    -
    - -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("{0} Errors Detected", _globals__WEBPACK_IMPORTED_MODULE_1__.app.state._errors.length.toString())}
    -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Padloc has registered {0} errors during your use of the app. " + - "These errors may not have any impact on functionality and can often be ignored, " + - "but reporting them may help us diagnose problems, identify possible failure " + - "modes and generally improve the stability of the app.", _globals__WEBPACK_IMPORTED_MODULE_1__.app.state._errors.length.toString())} -
    -
    - - -
    -
    - `; - } -}; -ReportErrorsDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_3__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_2__.css ` - .message { - margin: 18px; - } - ` -]; -ReportErrorsDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_2__.element)("pl-report-errors-dialog") -], ReportErrorsDialog); - - - -/***/ }), - -/***/ "../app/src/elements/select.ts": -/*!*************************************!*\ - !*** ../app/src/elements/select.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Select": () => (/* binding */ Select) -/* harmony export */ }); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - -let Select = class Select extends _base__WEBPACK_IMPORTED_MODULE_1__.BaseElement { - constructor() { - super(...arguments); - this.options = []; - this.label = ""; - this.icon = ""; - } - render() { - const { options, selected, label, icon } = this; - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` - ${icon - ? _base__WEBPACK_IMPORTED_MODULE_1__.html ` - - ` - : ""} - - - - - - - `; - } - async _propsChanged() { - if (!this.selected) { - this.selected = this.options[0]; - } - await this.updateComplete; - this._select.selectedIndex = this.options.indexOf(this.selected); - } - _changed() { - this.selected = this.options[this._select.selectedIndex]; - this.dispatch("change"); - } -}; -Select.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_0__.shared, - _base__WEBPACK_IMPORTED_MODULE_1__.css ` - :host { - display: block; - position: relative; - padding: 0; - height: var(--row-height); - padding: 0 15px; - background: var(--shade-2-color); - border-radius: var(--border-radius); - } - - select { - width: 100%; - height: 100%; - box-sizing: border-box; - cursor: pointer; - } - - select.pad-left { - padding-left: 30px; - } - - option { - background-color: var(--color-tertiary); - color: var(--color-secondary); - } - - label { - position: absolute; - top: 0; - left: 0; - right: 0; - padding: 13px; - opacity: 0.5; - transition: transform 0.2s, color 0.2s, opacity 0.5s; - cursor: text; - pointer-events: none; - } - - label[float] { - transform: scale(0.8) translate(0, -32px); - color: var(--color-highlight); - font-weight: bold; - opacity: 1; - } - - pl-icon { - position: absolute; - width: 20px; - height: 20px; - top: 0; - bottom: 0; - margin: auto; - pointer-events: none; - } - - pl-icon.right { - right: 12px; - } - - pl-icon.left { - left: 14px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Array) -], Select.prototype, "options", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Object) -], Select.prototype, "selected", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], Select.prototype, "label", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], Select.prototype, "icon", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.query)("select"), - __metadata("design:type", HTMLSelectElement) -], Select.prototype, "_select", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.observe)("options"), - (0,_base__WEBPACK_IMPORTED_MODULE_1__.observe)("selected"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Promise) -], Select.prototype, "_propsChanged", null); -Select = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("pl-select") -], Select); - - - -/***/ }), - -/***/ "../app/src/elements/settings.ts": -/*!***************************************!*\ - !*** ../app/src/elements/settings.ts ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Settings": () => (/* binding */ Settings) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _view__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./view */ "../app/src/elements/view.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _import_dialog__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./import-dialog */ "../app/src/elements/import-dialog.ts"); -/* harmony import */ var _export_dialog__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./export-dialog */ "../app/src/elements/export-dialog.ts"); -/* harmony import */ var _billing_info__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./billing-info */ "../app/src/elements/billing-info.ts"); -/* harmony import */ var _randomart__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./randomart */ "../app/src/elements/randomart.ts"); -/* harmony import */ var _subscription__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./subscription */ "../app/src/elements/subscription.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - - - -let Settings = class Settings extends (0,_mixins_state__WEBPACK_IMPORTED_MODULE_6__.StateMixin)(_view__WEBPACK_IMPORTED_MODULE_8__.View) { - shouldUpdate() { - return !!_globals__WEBPACK_IMPORTED_MODULE_5__.app.account; - } - render() { - const { settings, billingEnabled } = _globals__WEBPACK_IMPORTED_MODULE_5__.app; - const account = _globals__WEBPACK_IMPORTED_MODULE_5__.app.account; - const billing = account.billing || new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.BillingInfo(); - return _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - this.dispatch("toggle-menu")}> - -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Settings")}
    - - -
    - -
    -
    -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Profile")}

    - - - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Security")}

    - - - - - - ${billingEnabled - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Subscription")}

    - - - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Billing Info")}

    - - - ` - : _base__WEBPACK_IMPORTED_MODULE_7__.html ``} - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Auto Lock")}

    - - - - - - - - ${_globals__WEBPACK_IMPORTED_MODULE_5__.app.supportsBiometricUnlock - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Biometric Unlock")}

    - - - ` - : ""} - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Import / Export")}

    - - - - - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Support")}

    - - - - - -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Danger Zone")}

    - - -
    -
    - - this._importFile()} /> - `; - } - _updateSettings() { - _globals__WEBPACK_IMPORTED_MODULE_5__.app.setSettings({ - autoLock: this.$("#autoLockButton").active, - autoLockDelay: this.$("#autoLockDelaySlider").value - }); - } - _editAccount() { - const account = _globals__WEBPACK_IMPORTED_MODULE_5__.app.account; - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.prompt)("", { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Edit Profile"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Save"), - value: account.name, - label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Name"), - validate: async (name) => { - if (!name) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter a name!"); - } - if (name !== account.name) { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateAccount(async (account) => (account.name = name)); - } - return name; - } - }); - } - async _logout() { - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Do you really want to log out?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Log Out")); - if (confirmed) { - _globals__WEBPACK_IMPORTED_MODULE_5__.app.logout(); - } - } - //* Opens the change password dialog and resets the corresponding input elements - async _changePassword() { - const success = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter your current password!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Change Master Password"), - label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Current Password"), - type: "password", - validate: async (pwd) => { - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.unlock(pwd); - } - catch (e) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Wrong password! Please try again!"); - } - return pwd; - } - }); - if (!success) { - return; - } - const newPwd = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Now choose a new master password!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Change Master Password"), - label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter New Password"), - type: "password", - validate: async (val) => { - if (val === "") { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter a password!"); - } - return val; - } - }); - if (newPwd === null) { - return; - } - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please confirm your new password!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Change Master Password"), - label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Repeat New Password"), - type: "password", - validate: async (pwd) => { - if (pwd !== newPwd) { - throw "Wrong password! Please try again!"; - } - return pwd; - } - }); - if (!confirmed) { - return; - } - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.changePassword(newPwd); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Master password changed successfully."), { type: "success" }); - } - _openWebsite() { - window.open("https://padloc.app", "_system"); - } - _sendMail() { - const email = "support@padloc.app" || 0; - const subject = "Padloc Support Request"; - const message = ` - ------ enter your message above ----- - -NOTE: Below we have included some information about your device that may help -us analyse any problems you may be having. If you're not comfortable sharing -this data simply delete this of the email! - -Device Info: ${JSON.stringify(_globals__WEBPACK_IMPORTED_MODULE_5__.app.state.device.toRaw(), null, 4)} -`; - (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_2__.composeEmail)(email, subject, message); - } - async _import() { - this._fileInput.click(); - } - async _importFile() { - const file = this._fileInput.files[0]; - const reader = new FileReader(); - reader.onload = async () => { - await this._importDialog.show(reader.result); - this._fileInput.value = ""; - }; - reader.readAsText(file); - } - _export() { - this._exportDialog.show(); - } - async _deleteAccount() { - const success = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter your master password to proceed."), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete Account"), - label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Master Password"), - type: "password", - validate: async (pwd) => { - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.unlock(pwd); - } - catch (e) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Wrong password! Please try again!"); - } - return pwd; - } - }); - if (!success) { - return; - } - const deleted = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to delete this account? " + - "All associated vaults and the data within them will be lost and any active subscriptions will be canceled immediately. " + - "This action can not be undone!"), { - type: "destructive", - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete Account"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete"), - placeholder: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Type 'DELETE' to confirm"), - validate: async (val) => { - if (val !== "DELETE") { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Type 'DELETE' to confirm"); - } - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.deleteAccount(); - } - catch (e) { - throw e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"); - } - return val; - } - }); - if (deleted) { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go(""); - } - } - async _toggleBiometricUnlock(e) { - e.stopPropagation(); - const toggle = e.target; - console.log(toggle.active); - if (toggle.active) { - this.dispatch("enable-biometric-auth"); - } - else { - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to disable biometric unlock?")); - if (confirmed) { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.forgetMasterKey(); - } - else { - toggle.active = true; - } - } - } -}; -Settings.styles = [ - ..._view__WEBPACK_IMPORTED_MODULE_8__.View.styles, - _base__WEBPACK_IMPORTED_MODULE_7__.css ` - :host { - background: var(--color-quaternary); - display: flex; - flex-direction: column; - } - - h3 { - margin: 18px 8px 12px 8px; - text-align: center; - } - - .wrapper { - max-width: 500px; - margin: 0 auto; - padding: 0 8px 8px 8px; - } - - button { - display: block; - } - - .item { - width: 100%; - box-sizing: border-box; - margin: 12px 0; - } - - .account { - font-size: 110%; - display: flex; - align-items: center; - } - - pl-fingerprint { - width: 60px; - height: 60px; - border-radius: 100%; - border: solid 1px var(--border-color); - margin: 15px; - } - - .account-info { - flex: 1; - min-width: 0; - padding-right: 18px; - } - - .account-email { - ${_styles__WEBPACK_IMPORTED_MODULE_3__.mixins.ellipsis()} - } - - .account-email { - font-weight: bold; - ${_styles__WEBPACK_IMPORTED_MODULE_3__.mixins.ellipsis()} - } - - .account pl-icon { - width: 50px; - height: 50px; - margin: 5px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("input[type='file']"), - __metadata("design:type", HTMLInputElement) -], Settings.prototype, "_fileInput", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.dialog)("pl-import-dialog"), - __metadata("design:type", _import_dialog__WEBPACK_IMPORTED_MODULE_10__.ImportDialog) -], Settings.prototype, "_importDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.dialog)("pl-export-dialog"), - __metadata("design:type", _export_dialog__WEBPACK_IMPORTED_MODULE_11__.ExportDialog) -], Settings.prototype, "_exportDialog", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.listen)("change"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], Settings.prototype, "_updateSettings", null); -Settings = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.element)("pl-settings") -], Settings); - - - -/***/ }), - -/***/ "../app/src/elements/signup.ts": -/*!*************************************!*\ - !*** ../app/src/elements/signup.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Signup": () => (/* binding */ Signup) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _padloc_core_src_diceware__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/diceware */ "../core/src/diceware.ts"); -/* harmony import */ var _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @padloc/core/src/mfa */ "../core/src/mfa.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _start_form__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./start-form */ "../app/src/elements/start-form.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _password_input__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./password-input */ "../app/src/elements/password-input.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _generator__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./generator */ "../app/src/elements/generator.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _logo__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./logo */ "../app/src/elements/logo.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - - - -const steps = ["", "verify", "password"]; -let Signup = class Signup extends _start_form__WEBPACK_IMPORTED_MODULE_7__.StartForm { - constructor() { - super(...arguments); - this._password = ""; - this._step = "start"; - } - get _verificationToken() { - return _globals__WEBPACK_IMPORTED_MODULE_5__.router.params.verify || _globals__WEBPACK_IMPORTED_MODULE_5__.router.params.token || ""; - } - get _email() { - return _globals__WEBPACK_IMPORTED_MODULE_5__.router.params.email || ""; - } - get _name() { - return _globals__WEBPACK_IMPORTED_MODULE_5__.router.params.name || ""; - } - get _invite() { - const inviteString = _globals__WEBPACK_IMPORTED_MODULE_5__.router.params.invite; - if (inviteString) { - const [org, id] = inviteString.split(","); - return { org, id }; - } - else { - return undefined; - } - } - async reset() { - this._repeatPasswordInput.value = ""; - this._codeInput.value = ""; - this._submitEmailButton.stop(); - this._verifyEmailButton.stop(); - this._submitPasswordButton.stop(); - setTimeout(() => (this._logo.reveal = true), 500); - } - async goToStep(step = "") { - const i = steps.indexOf(step); - if (i === -1) { - return; - } - const iPrev = steps.indexOf(this._step); - const wrappers = this.$$(".wrapper"); - const wrapper = wrappers[i]; - const prevWrapper = wrappers[iPrev]; - wrapper.removeAttribute("hidden"); - this._animateIn(wrapper.querySelectorAll(".animate")); - if (prevWrapper && prevWrapper !== wrapper) { - this._animateOut(prevWrapper.querySelectorAll(".animate")); - setTimeout(() => prevWrapper.setAttribute("hidden", ""), 1000); - } - this._step = step; - if (step === "password" && !this._password) { - this._generatePassphrase(); - } - setTimeout(() => this.requestUpdate(), 10); - } - async _generatePassphrase() { - this._password = await (0,_padloc_core_src_diceware__WEBPACK_IMPORTED_MODULE_2__.generatePassphrase)(4, " ", [_globals__WEBPACK_IMPORTED_MODULE_5__.app.state.device.locale]); - const wrapper = this.$(".master-password"); - wrapper.classList.add("reveal"); - setTimeout(() => wrapper.classList.remove("reveal"), 2000); - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_6__.html ` - - - - - - `; - } - async _submitEmail() { - if (this._submitEmailButton.state === "loading") { - return; - } - if (!this._emailInput.reportValidity()) { - return; - } - const email = this._emailInput.value; - const name = this._nameInput.value; - if (this._verificationToken) { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("signup/password", { ..._globals__WEBPACK_IMPORTED_MODULE_5__.router.params, email, name }); - } - else { - this._submitEmailButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.requestMFACode(email, _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_3__.MFAPurpose.Signup); - this._submitEmailButton.success(); - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("signup/verify", { ..._globals__WEBPACK_IMPORTED_MODULE_5__.router.params, email, name }); - } - catch (e) { - this._submitEmailButton.fail(); - throw e; - } - } - } - async _verifyEmail() { - if (this._verifyEmailButton.state === "loading") { - return; - } - this._verifyEmailButton.start(); - try { - const verify = await _globals__WEBPACK_IMPORTED_MODULE_5__.app.retrieveMFAToken(this._email, this._codeInput.value, _padloc_core_src_mfa__WEBPACK_IMPORTED_MODULE_3__.MFAPurpose.Signup); - if (verify.hasAccount) { - this._verifyEmailButton.stop(); - this._accountExists(); - return; - } - if (verify.hasLegacyAccount) { - const migrated = await this._migrateAccount(this._email, "", verify.legacyToken, verify.token, this._name); - if (migrated) { - this._verifyEmailButton.success(); - } - else { - const { verify, ...params } = _globals__WEBPACK_IMPORTED_MODULE_5__.router.params; - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("signup", params); - this._emailInput.focus(); - } - return; - } - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("signup/password", { ..._globals__WEBPACK_IMPORTED_MODULE_5__.router.params, token: verify.token }); - this._verifyEmailButton.success(); - } - catch (e) { - if (e.code === _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.MFA_TRIES_EXCEEDED) { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_12__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Maximum number of tries exceeded! Please resubmit and try again!"), { type: "warning" }); - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("signup"); - return; - } - this._verifyEmailButton.fail(); - throw e; - } - } - async _submitPassword() { - if (this._submitPasswordButton.state === "loading") { - return; - } - if (this._password !== this._repeatPasswordInput.value) { - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_12__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You didn't repeat your master password correctly. Try again!"), { type: "warning" }); - return; - } - const email = this._email; - const name = this._name; - const password = this._password; - this._submitPasswordButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.signup({ email, password, name, verify: this._verificationToken, invite: this._invite }); - this._submitPasswordButton.success(); - this.done(); - } - catch (e) { - this._submitPasswordButton.fail(); - switch (e.code) { - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.ACCOUNT_EXISTS: - this._accountExists(); - return; - default: - throw e; - } - } - this._password = ""; - } - async _accountExists() { - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_12__.choose)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("An account with this email address already exists!"), [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Login"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Change Email")], { type: "warning" }); - if (choice === 0) { - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("login"); - } - else { - const { verify, ...params } = _globals__WEBPACK_IMPORTED_MODULE_5__.router.params; - _globals__WEBPACK_IMPORTED_MODULE_5__.router.go("signup", params); - this._emailInput.focus(); - } - } - async _editMasterPassword() { - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_12__.choose)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("We recommend using a randomly generated password that is both strong and easy to remember."), [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Keep This One"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Generate Another"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Choose My Own")], { title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Want A Different Master Password?") }); - let newPwd; - switch (choice) { - case 0: - break; - case 1: - newPwd = await this._generator.show(); - break; - case 2: - newPwd = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_12__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("We recommend using a randomly generated password that is both strong and easy to remember."), { title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Choose Own Master Password"), label: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Master Password"), type: "password" }); - break; - } - if (newPwd) { - const strength = await (0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.passwordStrength)(newPwd); - if (strength.score < 2) { - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_12__.choose)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("The password you entered is weak which makes it easier for attackers to break " + - "the encryption used to protect your data. Try to use a longer password or include a " + - "variation of uppercase, lowercase and special characters as well as numbers!"), [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Choose Different Password"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Use Anyway")], { - type: "warning", - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("WARNING: Weak Password"), - hideIcon: true, - preventDismiss: true - }); - if (choice === 0) { - return this._editMasterPassword(); - } - } - this._password = newPwd; - } - } -}; -Signup.styles = [ - ..._start_form__WEBPACK_IMPORTED_MODULE_7__.StartForm.styles, - _base__WEBPACK_IMPORTED_MODULE_6__.css ` - h1 { - display: block; - text-align: center; - margin: 20px 10px; - } - - .master-password-form { - max-width: 500px; - } - - .title { - max-width: 310px; - margin: 30px auto; - font-size: var(--font-size-small); - font-weight: bold; - letter-spacing: 0.5px; - padding: 0 10px; - } - - #submitButton { - margin-bottom: 30px; - } - - .login-wrapper { - font-size: var(--font-size-small); - padding: 8px; - margin: 8px 0; - opacity: 0.7; - } - - .link { - text-decoration: underline; - cursor: pointer; - font-weight: bold; - } - - pl-input:not([focused]) + .hint { - color: rgba(0, 0, 0, 0.2); - text-shadow: none; - } - - .master-password { - position: relative; - background: var(--shade-2-color); - font-family: var(--font-family-mono); - font-size: 120%; - padding: 20px; - overflow-wrap: break-word; - } - - .master-password-cover { - ${_styles__WEBPACK_IMPORTED_MODULE_13__.mixins.fullbleed()} - height: 2em; - line-height: 2em; - margin: auto; - font-weight: bold; - text-shadow: none; - color: rgba(0, 0, 0, 0.3); - } - - .master-password:hover { - background: var(--shade-3-color); - } - - .master-password > * { - transition: transform 0.2s cubic-bezier(1, -0.3, 0, 1.3), opacity 0.2s; - } - - .master-password:not(:hover):not(.reveal) .master-password-value, - .master-password:hover .master-password-cover, - .master-password.reveal .master-password-cover { - opacity: 0; - transform: scale(0); - } - - .hint.subtle { - opacity: 0.5; - } - - [focused] + .hint.subtle { - opacity: 1; - } - - .password-actions { - margin: -20px 0 30px 0; - } - - .password-action { - padding: 6px 10px; - margin: 0 4px; - font-size: var(--font-size-tiny); - font-weight: 600; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.property)(), - __metadata("design:type", String) -], Signup.prototype, "_password", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.query)("#emailInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], Signup.prototype, "_emailInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.query)("#nameInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], Signup.prototype, "_nameInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.query)("#codeInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], Signup.prototype, "_codeInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.query)("#repeatPasswordInput"), - __metadata("design:type", _password_input__WEBPACK_IMPORTED_MODULE_9__.PasswordInput) -], Signup.prototype, "_repeatPasswordInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.query)("#submitEmailButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_10__.LoadingButton) -], Signup.prototype, "_submitEmailButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.query)("#verifyEmailButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_10__.LoadingButton) -], Signup.prototype, "_verifyEmailButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.query)("#submitPasswordButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_10__.LoadingButton) -], Signup.prototype, "_submitPasswordButton", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_12__.dialog)("pl-generator"), - __metadata("design:type", _generator__WEBPACK_IMPORTED_MODULE_11__.Generator) -], Signup.prototype, "_generator", void 0); -Signup = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_6__.element)("pl-signup") -], Signup); - - - -/***/ }), - -/***/ "../app/src/elements/slider.ts": -/*!*************************************!*\ - !*** ../app/src/elements/slider.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Slider": () => (/* binding */ Slider) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - -let Slider = class Slider extends _base__WEBPACK_IMPORTED_MODULE_0__.BaseElement { - constructor() { - super(...arguments); - this.min = 1; - this.max = 10; - this.value = this.min; - this.unit = ""; - this.step = 1; - this.label = ""; - this.hideValue = false; - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_0__.html ` - - - this._inputChange()} - /> - - ${this.value}${this.unit} - `; - } - _inputChange() { - const prev = this.value; - this.value = parseFloat(this._input.value); - this.dispatch("change", { prev: prev, value: this.value }, true, true); - } -}; -Slider.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_1__.shared, - _base__WEBPACK_IMPORTED_MODULE_0__.css ` - :host { - display: flex; - align-items: center; - height: var(--row-height); - padding: 0 15px; - font-size: inherit; - --track-color: var(--slider-track-color, rgba(0, 0, 0, 0.1)); - --knob-color: var(--slider-knob-color, var(--color-highlight)); - --track-size: var(--slider-track-size, 2px); - --knob-size: var(--slider-knob-size, 25px); - } - - input[type="range"] { - -webkit-appearance: none; - width: 100%; - margin: 0; - padding: 0; - flex: 1; - height: auto; - min-height: var(--knob-size); - } - - input[type="range"]:focus { - outline: none; - } - - label { - margin-right: 10px; - } - - label:empty { - display: none; - } - - .value-display { - margin-left: 10px; - } - - input[type="range"]::-webkit-slider-runnable-track { - width: 100%; - cursor: pointer; - border-radius: 100%; - height: 0.2em; - background: var(--shade-2); - } - - input[type="range"]::-webkit-slider-thumb { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - height: var(--knob-size); - width: var(--knob-size); - margin-top: calc(0.5 * var(--track-size) - 0.5 * var(--knob-size)); - position: relative; - border-radius: 100%; - background: var(--knob-color); - cursor: pointer; - border: none; - box-sizing: border-box; - background-clip: content-box; - } - - input[type="range"]:active::-webkit-slider-thumb { - transform: scale(1.1); - } - - input[type="range"]::-moz-range-track { - width: 100%; - height: var(--track-size); - cursor: pointer; - background: var(--track-color); - border-radius: 100%; - } - - input[type="range"]::-moz-range-thumb { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - height: var(--knob-size); - width: var(--knob-size); - margin-top: calc(0.5 * var(--track-size) - 0.5 * var(--knob-size)); - position: relative; - border-radius: 100%; - background: var(--knob-color); - cursor: pointer; - border: none; - box-sizing: border-box; - background-clip: content-box; - } - - input[type="range"]:active::-moz-range-thumb { - transform: scale(1.1); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", Number) -], Slider.prototype, "min", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", Number) -], Slider.prototype, "max", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", Number) -], Slider.prototype, "value", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", String) -], Slider.prototype, "unit", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", Number) -], Slider.prototype, "step", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", String) -], Slider.prototype, "label", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", Boolean) -], Slider.prototype, "hideValue", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.query)("input"), - __metadata("design:type", HTMLInputElement) -], Slider.prototype, "_input", void 0); -Slider = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.element)("pl-slider") -], Slider); - - - -/***/ }), - -/***/ "../app/src/elements/spinner.ts": -/*!**************************************!*\ - !*** ../app/src/elements/spinner.ts ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Spinner": () => (/* binding */ Spinner) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - -let Spinner = class Spinner extends _base__WEBPACK_IMPORTED_MODULE_0__.BaseElement { - constructor() { - super(...arguments); - this.active = false; - } - _activeChanged() { - clearTimeout(this._stopTimeout); - if (this.active) { - this._circle.classList.add("spinning"); - } - else { - this._stopTimeout = window.setTimeout(() => this._circle.classList.remove("spinning"), 300); - } - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_0__.html ` - ${_base__WEBPACK_IMPORTED_MODULE_0__.svg ` - - - - `} - `; - } -}; -Spinner.styles = [ - _base__WEBPACK_IMPORTED_MODULE_0__.css ` - @keyframes spin { - from { - stroke-dashoffset: 240; - } - - to { - stroke-dashoffset: 40; - } - } - - @keyframes rotate { - to { - transform: rotate(360deg); - } - } - - :host { - display: block; - width: 40px; - height: 40px; - position: relative; - transition: opacity 0.3s; - will-change: opacity; - } - - :host(:not([active])) { - opacity: 0; - } - - svg { - width: 100%; - height: 100%; - } - - circle { - fill: none; - stroke: currentColor; - stroke-linecap: round; - stroke-width: 10; - stroke-dasharray: 252; - transform-origin: center center; - will-change: transform; - } - - circle.spinning { - animation: spin 1.5s cubic-bezier(0.44, 0.22, 0.64, 0.86) alternate infinite, - rotate linear 1.2s infinite; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], Spinner.prototype, "active", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.query)("circle"), - __metadata("design:type", SVGCircleElement) -], Spinner.prototype, "_circle", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.observe)("active"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], Spinner.prototype, "_activeChanged", null); -Spinner = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.element)("pl-spinner") -], Spinner); - - - -/***/ }), - -/***/ "../app/src/elements/start-form.ts": -/*!*****************************************!*\ - !*** ../app/src/elements/start-form.ts ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "StartForm": () => (/* binding */ StartForm) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/api */ "../core/src/api.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _lib_animation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/animation */ "../app/src/lib/animation.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _lib_import__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lib/import */ "../app/src/lib/import.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _logo__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./logo */ "../app/src/elements/logo.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - -const styles = _base__WEBPACK_IMPORTED_MODULE_3__.css ` - @keyframes reveal { - from { - transform: translate(0, 30px); - opacity: 0; - } - } - - @keyframes fade { - to { - transform: translate(0, -200px); - opacity: 0; - } - } - - :host, - .wrapper { - display: flex; - flex-direction: column; - align-items: center; - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.fullbleed()} - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.scroll()} - } - - form { - width: 100%; - max-width: 400px; - } - - form > * { - border-radius: 8px; - margin: 12px; - } - - pl-logo { - margin: 40px auto 30px auto; - } - - pl-loading-button { - overflow: hidden; - font-weight: bold; - } - - .hint { - font-size: var(--font-size-small); - box-sizing: border-box; - padding: 0 10px; - margin-bottom: 30px; - transition: color 0.2s; - } - - .hint.warning { - color: #ffc107; - font-weight: bold; - margin: 0; - padding: 0; - text-shadow: none; - } -`; -class StartForm extends _base__WEBPACK_IMPORTED_MODULE_3__.BaseElement { - _animateIn(nodes) { - return (0,_lib_animation__WEBPACK_IMPORTED_MODULE_4__.animateCascade)(nodes, { - animation: "reveal", - duration: 1000, - fullDuration: 1500, - initialDelay: 300, - fill: "backwards", - clear: 3000 - }); - } - _animateOut(nodes) { - (0,_lib_animation__WEBPACK_IMPORTED_MODULE_4__.animateCascade)(nodes, { - animation: "fade", - duration: 400, - fullDuration: 600, - initialDelay: 0, - fill: "forwards", - easing: "cubic-bezier(1, 0, 0.2, 1)", - clear: 3000 - }); - } - reset() { - this._animateIn(this.$$(".animate")); - this.requestUpdate(); - this._logo && setTimeout(() => (this._logo.reveal = true), 500); - } - done() { - this._animateOut(this.$$(".animate")); - } - rumble() { - (0,_lib_animation__WEBPACK_IMPORTED_MODULE_4__.animateElement)(this.$("form"), { animation: "rumble", duration: 200, clear: true }); - } - async _migrateAccount(email, password, legacyToken, signupToken, name = "") { - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("You don't have a Padloc 3 account yet but we've found " + - "an account from an older version. " + - "Would you like to migrate your account to Padloc 3 now?"), { - title: "Account Migration", - icon: "user", - options: [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Migrate"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Learn More"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel")] - }); - if (choice === 1) { - window.open("https://padloc.app/help/migrate-v3", "_system"); - return this._migrateAccount(email, password, legacyToken, signupToken, name); - } - else if (choice === 2) { - return false; - } - const legacyData = await _globals__WEBPACK_IMPORTED_MODULE_7__.app.api.getLegacyData(new _padloc_core_src_api__WEBPACK_IMPORTED_MODULE_1__.GetLegacyDataParams({ - email, - verify: legacyToken - })); - let items = null; - try { - if (!password) { - throw "No password provided"; - } - await legacyData.unlock(password); - items = await (0,_lib_import__WEBPACK_IMPORTED_MODULE_6__.importLegacyContainer)(legacyData); - } - catch (e) { - password = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter your master password!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Migrating Account"), - placeholder: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Enter Master Password"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Submit"), - type: "password", - preventAutoClose: true, - validate: async (password) => { - try { - await legacyData.unlock(password); - items = await (0,_lib_import__WEBPACK_IMPORTED_MODULE_6__.importLegacyContainer)(legacyData); - } - catch (e) { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Wrong password! Please try again!"); - } - return password; - } - }); - } - if (items && password) { - await _globals__WEBPACK_IMPORTED_MODULE_7__.app.signup({ email, password, verify: signupToken, name }); - await _globals__WEBPACK_IMPORTED_MODULE_7__.app.addItems(items, _globals__WEBPACK_IMPORTED_MODULE_7__.app.mainVault); - const deleteLegacy = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Your account and all associated data was migrated successfully! Do you want to delete your old account now?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Yes"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("No"), { title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Delete Legacy Account"), icon: "delete", preventAutoClose: true }); - if (deleteLegacy) { - await _globals__WEBPACK_IMPORTED_MODULE_7__.app.api.deleteLegacyAccount(); - } - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("All done! Please note that you won't be able to access your Padloc 3 account " + - "with older versions of the app, so please make sure you have the latest version installed " + - "on all your devices! (You can find download links for all platforms at " + - "https://padloc.app/downloads/). Enjoy using Padloc 3!"), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Migration Complete"), - type: "success" - }); - return true; - } - else { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_5__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unfortunately we could not complete migration of your data."), { - type: "warning" - }); - return false; - } - } -} -StartForm.styles = [_styles__WEBPACK_IMPORTED_MODULE_2__.shared, styles]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("pl-logo"), - __metadata("design:type", _logo__WEBPACK_IMPORTED_MODULE_8__.Logo) -], StartForm.prototype, "_logo", void 0); - - -/***/ }), - -/***/ "../app/src/elements/start.ts": -/*!************************************!*\ - !*** ../app/src/elements/start.ts ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Start": () => (/* binding */ Start) -/* harmony export */ }); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _unlock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./unlock */ "../app/src/elements/unlock.ts"); -/* harmony import */ var _login__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./login */ "../app/src/elements/login.ts"); -/* harmony import */ var _signup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./signup */ "../app/src/elements/signup.ts"); -/* harmony import */ var _recover__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./recover */ "../app/src/elements/recover.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - -let Start = class Start extends (0,_mixins_state__WEBPACK_IMPORTED_MODULE_2__.StateMixin)(_base__WEBPACK_IMPORTED_MODULE_3__.BaseElement) { - constructor() { - super(...arguments); - this.open = false; - } - async unlock() { - await this.updateComplete; - this._showForm(this._unlockForm); - } - async login() { - await this.updateComplete; - this._showForm(this._loginForm); - } - async signup(step) { - await this.updateComplete; - this._signupForm.goToStep(step); - this._showForm(this._signupForm); - } - async recover() { - await this.updateComplete; - this._showForm(this._recoverForm); - } - stateChanged() { - this.open = !_globals__WEBPACK_IMPORTED_MODULE_0__.app.state.locked; - } - async _showForm(form) { - for (const f of [this._unlockForm, this._loginForm, this._signupForm, this._recoverForm]) { - if (f === form) { - f.classList.add("showing"); - f.reset(); - } - else { - f.classList.remove("showing"); - f.done(); - } - } - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` - - - - - - - - `; - } -}; -Start.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_1__.shared, - _base__WEBPACK_IMPORTED_MODULE_3__.css ` - :host { - --color-background: var(--color-primary); - --color-foreground: var(--color-tertiary); - --color-highlight: var(--color-secondary); - color: var(--color-foreground); - display: flex; - flex-direction: column; - z-index: 5; - text-align: center; - text-shadow: rgba(0, 0, 0, 0.15) 0 2px 0; - background: linear-gradient(180deg, #59c6ff 0%, #077cb9 100%); - transition: transform 0.4s cubic-bezier(1, 0, 0.2, 1); - ${_styles__WEBPACK_IMPORTED_MODULE_1__.mixins.fullbleed()} - ${_styles__WEBPACK_IMPORTED_MODULE_1__.mixins.scroll()} - } - - main { - ${_styles__WEBPACK_IMPORTED_MODULE_1__.mixins.fullbleed()} - background: transparent; - min-height: 510px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - } - - .form:not(.showing) { - opacity: 0; - transition: opacity 1s; - pointer-events: none; - } - - :host([open]) { - pointer-events: none; - } - - :host([open]) { - transition-delay: 0.4s; - transform: translate3d(0, -100%, 0); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], Start.prototype, "open", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("pl-unlock"), - __metadata("design:type", _unlock__WEBPACK_IMPORTED_MODULE_4__.Unlock) -], Start.prototype, "_unlockForm", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("pl-login"), - __metadata("design:type", _login__WEBPACK_IMPORTED_MODULE_5__.Login) -], Start.prototype, "_loginForm", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("pl-signup"), - __metadata("design:type", _signup__WEBPACK_IMPORTED_MODULE_6__.Signup) -], Start.prototype, "_signupForm", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("pl-recover"), - __metadata("design:type", _recover__WEBPACK_IMPORTED_MODULE_7__.Recover) -], Start.prototype, "_recoverForm", void 0); -Start = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.element)("pl-start") -], Start); - - - -/***/ }), - -/***/ "../app/src/elements/subscription.ts": -/*!*******************************************!*\ - !*** ../app/src/elements/subscription.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "OrgSubscription": () => (/* binding */ OrgSubscription) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _mixins_state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../mixins/state */ "../app/src/mixins/state.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _update_subscription_dialog__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./update-subscription-dialog */ "../app/src/elements/update-subscription-dialog.ts"); -/* harmony import */ var _billing_dialog__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./billing-dialog */ "../app/src/elements/billing-dialog.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - -let OrgSubscription = class OrgSubscription extends (0,_mixins_state__WEBPACK_IMPORTED_MODULE_6__.StateMixin)(_base__WEBPACK_IMPORTED_MODULE_7__.BaseElement) { - constructor() { - super(...arguments); - this.org = null; - } - get _billing() { - return this.org ? this.org.billing : _globals__WEBPACK_IMPORTED_MODULE_5__.app.account && _globals__WEBPACK_IMPORTED_MODULE_5__.app.account.billing; - } - get _subscription() { - return this._billing && this._billing.subscription; - } - async _update() { - const sub = this._subscription; - if (this.org) { - if (!sub) { - this._updatePlan(); - return; - } - } - else { - if (!sub || sub.plan.type === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.PlanType.Free) { - this.dispatch("get-premium"); - return; - } - } - const canceled = sub.status === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.SubscriptionStatus.Canceled; - const choices = canceled ? [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Resume Subscription")] : [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel Subscription")]; - if (this.org) { - choices.push((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Update Plan")); - } - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.choose)("", choices); - switch (choice) { - case 0: - return canceled ? this._resumeSubscription() : this._cancelSubscription(); - case 1: - return this._updateSubscriptionDialog.show(this.org); - } - } - _updatePlan() { - this.org ? this._updateSubscriptionDialog.show(this.org) : this.dispatch("get-premium"); - } - async _downgrade() { - if (this.org) { - throw "Can only downgrade subscription for private account!"; - } - if (this._downgradeButton.state === "loading") { - return; - } - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to downgrade to the Free Plan?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Downgrade"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel"), { type: "destructive", title: "Downgrade" }); - if (!confirmed) { - return; - } - this._downgradeButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateBilling(new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.UpdateBillingParams({ planType: _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.PlanType.Free })); - this._downgradeButton.success(); - } - catch (e) { - this._downgradeButton.fail(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)(e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"), { type: "warning" }); - } - } - async _updateBilling() { - if (this._paymentButton.state === "loading") { - return; - } - const billingInfo = this._billing; - const params = await this._billingDialog.show({ billingInfo }); - if (params) { - this._paymentButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateBilling(params); - this._paymentButton.success(); - } - catch (e) { - this._paymentButton.fail(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)(e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"), { type: "warning" }); - throw e; - } - } - } - async _do(fn) { - if (this._editButton.state === "loading") { - return; - } - this._editButton.start(); - try { - await fn(); - this._editButton.success(); - } - catch (e) { - this._editButton.fail(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)(e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"), { type: "warning" }); - } - } - async _cancelSubscription() { - this._do(() => _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateBilling(new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.UpdateBillingParams({ org: (this.org && this.org.id) || undefined, cancel: true }))); - } - async _resumeSubscription() { - this._do(() => _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateBilling(new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.UpdateBillingParams({ org: (this.org && this.org.id) || undefined, cancel: false }))); - } - async _authenticatePayment() { - const stripePubKey = _globals__WEBPACK_IMPORTED_MODULE_5__.app.state.billingProvider && _globals__WEBPACK_IMPORTED_MODULE_5__.app.state.billingProvider.config.publicKey; - if (!stripePubKey || this._authButton.state === "loading") { - return; - } - this._authButton.start(); - let error = ""; - try { - const Stripe = await (0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.loadScript)("https://js.stripe.com/v3/", "Stripe"); - const stripe = Stripe(stripePubKey); - const result = await stripe.handleCardPayment(this._subscription.paymentRequiresAuth); - error = result.error && result.error.message; - await _globals__WEBPACK_IMPORTED_MODULE_5__.app.updateBilling(new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.UpdateBillingParams()); - } - catch (e) { - error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"); - } - if (error) { - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)(error); - this._authButton.fail(); - } - else { - this._authButton.success(); - } - } - render() { - if (!_globals__WEBPACK_IMPORTED_MODULE_5__.app.account) { - return _base__WEBPACK_IMPORTED_MODULE_7__.html ``; - } - const account = _globals__WEBPACK_IMPORTED_MODULE_5__.app.account; - const billing = this.org ? this.org.billing : account.billing; - const sub = billing && billing.subscription; - const trialDays = sub && sub.trialEnd - ? Math.max(0, Math.ceil((sub.trialEnd.getTime() - Date.now()) / 1000 / 60 / 60 / 24)) - : 0; - const periodDays = sub && sub.periodEnd - ? Math.max(0, Math.ceil((sub.periodEnd.getTime() - Date.now()) / 1000 / 60 / 60 / 24)) - : 0; - const privateItemQuota = _globals__WEBPACK_IMPORTED_MODULE_5__.app.getItemsQuota(); - const privateItemCount = (_globals__WEBPACK_IMPORTED_MODULE_5__.app.mainVault && _globals__WEBPACK_IMPORTED_MODULE_5__.app.mainVault.items.size) || 0; - return _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - ${(sub && sub.plan.name) || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("No Plan Selected")} -
    - -
    - ${this.org - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    = this.org.quota.members} - > - - -
    - ${this.org.quota.members === -1 - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unlimited") - : `${this.org.members.length} / ${this.org.quota.members}`} -
    -
    - -
    = this.org.quota.groups} - > - - -
    - ${this.org.quota.groups === -1 - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unlimited") - : `${this.org.groups.length} / ${this.org.quota.groups}`} -
    -
    - -
    = this.org.quota.vaults} - > - - -
    - ${this.org.quota.vaults === -1 - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unlimited") - : `${this.org.vaults.length} / ${this.org.quota.vaults}`} -
    -
    - -
    = this.org.quota.storage * 1e9 - 5e6} - > - - -
    - ${this.org.quota.storage === -1 - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unlimited") - : `${(0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.fileSize)(this.org.usedStorage)} / ${this.org.quota.storage} GB`} -
    -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    = privateItemQuota} - > - - -
    - ${privateItemQuota === -1 - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unlimited") - : `${privateItemCount} / ${privateItemQuota}`} -
    -
    - -
    = account.quota.storage * 1e9 - 5e6}> - - -
    - ${(0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.fileSize)(account.usedStorage)} / ${account.quota.storage} GB -
    -
    - `} - ${sub - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("{0} / Year", ((sub.members * sub.plan.cost) / 100).toFixed(2))} -
    -
    - - ${sub.status === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.SubscriptionStatus.Canceled - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Canceled ({0} days left)", periodDays.toString())} -
    -
    - ` - : sub.status === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.SubscriptionStatus.Inactive - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - - -
    - ${sub.paymentRequiresAuth ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Authentication Required") : (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Inactive")} -
    -
    - ` - : sub.status === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.SubscriptionStatus.Trialing - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    - - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Trialing ({0} days left)", trialDays.toString())} -
    -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_7__.html ``} - ` - : ""} -
    - - ${sub && sub.paymentError - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` -
    ${sub.paymentError}
    - ` - : ""} - ${!sub - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` - - ` - : sub.paymentRequiresAuth - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Complete Payment")} - ` - : sub.status === _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.SubscriptionStatus.Inactive - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` - - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Add Payment Method")} - - - - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Downgrade To Free Plan")} - - ` - : this.org || sub.plan.type !== _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.PlanType.Free - ? _base__WEBPACK_IMPORTED_MODULE_7__.html ` - - - - ` - : _base__WEBPACK_IMPORTED_MODULE_7__.html ` - - `} - `; - } -}; -OrgSubscription.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_2__.shared, - _base__WEBPACK_IMPORTED_MODULE_7__.css ` - :host { - display: block; - position: relative; - display: flex; - flex-direction: column; - } - - .quota { - margin: 0 12px 12px 12px; - display: grid; - grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); - } - - .quota-item { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 4px; - font-weight: bold; - text-align: center; - } - - .quota-item[warning] { - color: var(--color-negative); - } - - .quota-item pl-icon { - font-size: 150%; - } - - .quota-item .label { - font-size: var(--font-size-small); - } - - .edit-button { - position: absolute; - top: 12px; - right: 12px; - z-index: 1; - } - - .missing { - opacity: 0.7; - cursor: pointer; - } - - .plan-name { - font-size: 150%; - font-weight: bold; - margin: 16px 8px; - text-align: center; - } - - button { - font-weight: bold; - } - - .premium-button { - margin: 0 12px 12px 12px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.property)(), - __metadata("design:type", Object) -], OrgSubscription.prototype, "org", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.dialog)("pl-update-subscription-dialog"), - __metadata("design:type", _update_subscription_dialog__WEBPACK_IMPORTED_MODULE_10__.UpdateSubscriptionDialog) -], OrgSubscription.prototype, "_updateSubscriptionDialog", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.dialog)("pl-billing-dialog"), - __metadata("design:type", _billing_dialog__WEBPACK_IMPORTED_MODULE_11__.BillingDialog) -], OrgSubscription.prototype, "_billingDialog", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("#editButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_9__.LoadingButton) -], OrgSubscription.prototype, "_editButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("#paymentButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_9__.LoadingButton) -], OrgSubscription.prototype, "_paymentButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("#authButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_9__.LoadingButton) -], OrgSubscription.prototype, "_authButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.query)("#downgradeButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_9__.LoadingButton) -], OrgSubscription.prototype, "_downgradeButton", void 0); -OrgSubscription = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_7__.element)("pl-subscription") -], OrgSubscription); - - - -/***/ }), - -/***/ "../app/src/elements/tags-input.ts": -/*!*****************************************!*\ - !*** ../app/src/elements/tags-input.ts ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "TagsInput": () => (/* binding */ TagsInput) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - -let TagsInput = class TagsInput extends _base__WEBPACK_IMPORTED_MODULE_3__.BaseElement { - constructor() { - super(...arguments); - this.editing = false; - this.vault = null; - this.tags = []; - this._showResults = false; - this._focusTimeout = 0; - } - render() { - const { tags, editing, vault, _showResults } = this; - const { value } = this._input || { value: "" }; - const results = _globals__WEBPACK_IMPORTED_MODULE_1__.app.state.tags.filter(([t]) => !this.tags.includes(t) && t !== value && t.toLowerCase().startsWith(value)) - .map(([t]) => t); - if (value) { - results.push(value); - } - return _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    -
    this._vaultClicked()}> - - -
    ${vault}
    -
    - - ${tags.map(tag => _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    this._tagClicked(tag)}> - - -
    ${tag}
    - - -
    - `)} - -
    -
    this._input.focus()}> - - - this._addTag(value)} - @input=${() => this.requestUpdate()} - @focus=${() => this._focusChanged()} - @blur=${() => this._focusChanged()} - > - -
    - -
    - ${results.map(res => _base__WEBPACK_IMPORTED_MODULE_3__.html ` -
    this._addTag(res)}> - - -
    ${res}
    -
    - `)} -
    -
    -
    - `; - } - _addTag(tag) { - if (!tag || this.tags.includes(tag)) { - return; - } - this.tags.push(tag); - this._input.value = ""; - this._showResults = false; - this.requestUpdate(); - } - _tagClicked(tag) { - if (this.editing) { - this.tags = this.tags.filter(t => t !== tag); - } - } - _vaultClicked() { - this.dispatch("move"); - } - _focusChanged() { - clearTimeout(this._focusTimeout); - setTimeout(() => (this._showResults = this._input.focused), this._input.focused ? 0 : 200); - } -}; -TagsInput.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_2__.shared, - _base__WEBPACK_IMPORTED_MODULE_3__.css ` - :host { - display: block; - position: relative; - z-index: 1; - overflow: visible; - font-size: var(--font-size-small); - overflow: visible; - } - - .wrapper { - flex-wrap: wrap; - overflow: visible; - margin-top: -6px; - } - - .wrapper > * { - margin-top: 6px; - } - - .tags.small .tag { - padding: 5px 7px; - } - - .results { - padding: 0; - border-radius: 8px; - margin-top: 0; - flex-direction: column; - align-items: flex-start; - } - - .results .tag { - padding: 6px 8px; - margin-top: 6px; - } - - .input-wrapper { - font-size: var(--font-size-micro); - padding: 0 4px; - height: 24px; - line-height: 24px; - background: var(--color-tertiary); - border: solid 1px var(--color-shade-4); - border-radius: 8px; - align-self: stretch; - position: relative; - min-width: 80px; - overflow: hidden; - } - - .input-wrapper pl-input { - font-size: inherit; - position: absolute; - height: 100%; - width: 100%; - box-sizing: border-box; - padding-left: 20px; - top: 0; - font-weight: bold; - pointer-events: none; - } - - .add-tag { - height: 26px; - overflow: visible; - } - - .add-tag .input-wrapper pl-icon { - height: 25px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Boolean) -], TagsInput.prototype, "editing", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Object) -], TagsInput.prototype, "vault", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Array) -], TagsInput.prototype, "tags", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.property)(), - __metadata("design:type", Boolean) -], TagsInput.prototype, "_showResults", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.query)("pl-input"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_4__.Input) -], TagsInput.prototype, "_input", void 0); -TagsInput = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_3__.element)("pl-tags-input") -], TagsInput); - - - -/***/ }), - -/***/ "../app/src/elements/textarea.ts": -/*!***************************************!*\ - !*** ../app/src/elements/textarea.ts ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Textarea": () => (/* binding */ Textarea) -/* harmony export */ }); -/* harmony import */ var autosize_src_autosize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! autosize/src/autosize */ "../app/node_modules/autosize/src/autosize.js"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _base_input__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base-input */ "../app/src/elements/base-input.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; -// @ts-ignore - - - -let Textarea = class Textarea extends _base_input__WEBPACK_IMPORTED_MODULE_2__.BaseInput { - constructor() { - super(...arguments); - this.autosize = false; - } - updated() { - if (this.autosize) { - setTimeout(() => (0,autosize_src_autosize__WEBPACK_IMPORTED_MODULE_0__["default"])(this._inputElement)); - } - } - _renderInput() { - const { placeholder, readonly, noTab, disabled, autocapitalize, required } = this; - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` - - `; - } -}; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Boolean) -], Textarea.prototype, "autosize", void 0); -Textarea = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("pl-textarea") -], Textarea); - - - -/***/ }), - -/***/ "../app/src/elements/toggle-button.ts": -/*!********************************************!*\ - !*** ../app/src/elements/toggle-button.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ToggleButton": () => (/* binding */ ToggleButton) -/* harmony export */ }); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _toggle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toggle */ "../app/src/elements/toggle.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - -let ToggleButton = class ToggleButton extends _base__WEBPACK_IMPORTED_MODULE_1__.BaseElement { - constructor() { - super(...arguments); - this.active = false; - this.reverse = false; - this.label = ""; - } - render() { - const { active, label } = this; - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` - -`; - } - toggle() { - this._toggle.toggle(); - } -}; -ToggleButton.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_0__.shared, - _base__WEBPACK_IMPORTED_MODULE_1__.css ` - :host { - display: block; - font-size: inherit; - padding: 12px 15px; - } - - button { - background: transparent; - display: flex; - width: 100%; - align-items: center; - height: 100%; - padding: 0; - line-height: normal; - text-align: left; - } - - button > div { - flex: 1; - ${_styles__WEBPACK_IMPORTED_MODULE_0__.mixins.ellipsis()} - } - - :host(:not([reverse])) button > div { - padding-left: 0.5em; - } - - :host([reverse]) button > div { - padding-right: 0.5em; - } - - :host([reverse]) button { - flex-direction: row-reverse; - } - - pl-toggle { - display: inline-block; - pointer-events: none; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Boolean) -], ToggleButton.prototype, "active", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], ToggleButton.prototype, "reverse", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", String) -], ToggleButton.prototype, "label", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.query)("pl-toggle"), - __metadata("design:type", _toggle__WEBPACK_IMPORTED_MODULE_2__.Toggle) -], ToggleButton.prototype, "_toggle", void 0); -ToggleButton = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("pl-toggle-button") -], ToggleButton); - - - -/***/ }), - -/***/ "../app/src/elements/toggle.ts": -/*!*************************************!*\ - !*** ../app/src/elements/toggle.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Toggle": () => (/* binding */ Toggle) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - -let Toggle = class Toggle extends _base__WEBPACK_IMPORTED_MODULE_0__.BaseElement { - constructor() { - super(...arguments); - this.active = false; - this.notap = false; - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_0__.html ` -
    - `; - } - _click() { - if (!this.notap) { - this.toggle(); - } - } - toggle() { - this.active = !this.active; - this.dispatch("change", { value: this.active, prevValue: !this.active }, true, true); - } -}; -Toggle.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_1__.shared, - _base__WEBPACK_IMPORTED_MODULE_0__.css ` - :host { - --width: var(--toggle-width, 36px); - --height: var(--toggle-height, 24px); - --gutter-width: var(--toggle-gutter-width, 2px); - --color-off: var(--toggle-color-off, var(--color-foreground)); - --color-on: var(--toggle-color-on, var(--color-highlight)); - --color-knob: var(--toggle-color-knob, var(--color-background)); - - display: inline-block; - width: var(--width); - height: var(--height); - background: var(--color-off); - border-radius: var(--height); - - transition: background 0.5s ease; - } - - .knob { - --size: calc(var(--height) - 2 * var(--gutter-width)); - display: block; - height: var(--size); - width: var(--size); - margin: var(--gutter-width); - background: var(--color-knob); - border-radius: var(--size); - - transition: transform 0.5s cubic-bezier(1, -0.5, 0, 1.5) -0.2s, background 0.5s, opacity 0.5s; - } - - :host([active]) { - background: var(--color-on); - } - - :host([active]) .knob { - --dx: calc(var(--width) - var(--height)); - transform: translate(var(--dx), 0); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)({ reflect: true }), - __metadata("design:type", Boolean) -], Toggle.prototype, "active", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", Boolean) -], Toggle.prototype, "notap", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.listen)("click"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], Toggle.prototype, "_click", null); -Toggle = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.element)("pl-toggle") -], Toggle); - - - -/***/ }), - -/***/ "../app/src/elements/totp.ts": -/*!***********************************!*\ - !*** ../app/src/elements/totp.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "TOTPElement": () => (/* binding */ TOTPElement) -/* harmony export */ }); -/* harmony import */ var lit_html_directives_style_map_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html/directives/style-map.js */ "../app/node_modules/lit-html/directives/style-map.js"); -/* harmony import */ var _padloc_core_src_otp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/otp */ "../core/src/otp.ts"); -/* harmony import */ var _padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - -let TOTPElement = class TOTPElement extends _base__WEBPACK_IMPORTED_MODULE_5__.BaseElement { - constructor() { - super(...arguments); - this.secret = ""; - this.interval = 30; - this.token = ""; - this._error = ""; - this._age = 0; - this._counter = 0; - this._updateTimeout = -1; - } - async _update(updInt = 2000) { - window.clearTimeout(this._updateTimeout); - if (!this.secret) { - this.token = ""; - this._age = 0; - return; - } - const time = Date.now(); - const counter = Math.floor(time / 1000 / this.interval); - if (counter !== this._counter) { - try { - this.token = await (0,_padloc_core_src_otp__WEBPACK_IMPORTED_MODULE_1__.hotp)((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_2__.base32ToBytes)(this.secret), counter); - this._error = ""; - } - catch (e) { - this.token = ""; - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_3__.translate)("Invalid Code"); - this._age = 0; - return; - } - this._counter = counter; - } - this._age = ((Date.now() / 1000) % this.interval) / this.interval; - if (updInt) { - this._updateTimeout = window.setTimeout(() => this._update(updInt), updInt); - } - } - connectedCallback() { - super.connectedCallback(); - this._update(); - } - disconnectedCallback() { - super.disconnectedCallback(); - window.clearTimeout(this._updateTimeout); - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` - ${this._error - ? _base__WEBPACK_IMPORTED_MODULE_5__.html ` - ${this._error} - ` - : _base__WEBPACK_IMPORTED_MODULE_5__.html ` - - ${this.token.substring(0, 3)} ${this.token.substring(3, 6)} - - `} - ${_base__WEBPACK_IMPORTED_MODULE_5__.svg ` - - - - - `} - `; - } -}; -TOTPElement.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_4__.shared, - _base__WEBPACK_IMPORTED_MODULE_5__.css ` - :host { - display: flex; - align-items: center; - user-select: text; - -webkit-user-select: text; - font: inherit; - white-space: normal !important; - } - - .countdown { - width: 1em; - height: 1em; - margin-left: 0.3em; - border-radius: 100%; - } - - .countdown circle { - transform-origin: center center; - transform: rotate(-90deg); - fill: none; - stroke: currentColor; - stroke-width: 8; - stroke-dasharray: 25; - transition: stroke-dashoffset 1s linear; - } - - .countdown circle.bg { - opacity: 0.2; - } - - .error { - color: var(--color-negative); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", String) -], TOTPElement.prototype, "secret", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], TOTPElement.prototype, "interval", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], TOTPElement.prototype, "token", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], TOTPElement.prototype, "_error", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], TOTPElement.prototype, "_age", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.observe)("secret"), - __metadata("design:type", Function), - __metadata("design:paramtypes", [Object]), - __metadata("design:returntype", Promise) -], TOTPElement.prototype, "_update", null); -TOTPElement = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.element)("pl-totp") -], TOTPElement); - - - -/***/ }), - -/***/ "../app/src/elements/unlock.ts": -/*!*************************************!*\ - !*** ../app/src/elements/unlock.ts ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Unlock": () => (/* binding */ Unlock) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _start_form__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./start-form */ "../app/src/elements/start-form.ts"); -/* harmony import */ var _password_input__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./password-input */ "../app/src/elements/password-input.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _logo__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./logo */ "../app/src/elements/logo.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - -let Unlock = class Unlock extends _start_form__WEBPACK_IMPORTED_MODULE_6__.StartForm { - constructor() { - super(...arguments); - this._failedCount = 0; - } - async reset() { - if (!this._passwordInput) { - return; - } - this._passwordInput.value = ""; - this._errorMessage = ""; - this._unlockButton.stop(); - this._failedCount = 0; - super.reset(); - if (!(0,_lib_util__WEBPACK_IMPORTED_MODULE_4__.isTouch)()) { - setTimeout(() => this._passwordInput.focus(), 100); - } - if (_globals__WEBPACK_IMPORTED_MODULE_3__.app.account && - _globals__WEBPACK_IMPORTED_MODULE_3__.app.account.locked && - _globals__WEBPACK_IMPORTED_MODULE_3__.app.supportsBiometricUnlock && - _globals__WEBPACK_IMPORTED_MODULE_3__.app.remembersMasterKey && - !("nobio" in _globals__WEBPACK_IMPORTED_MODULE_3__.router.params)) { - this._bioAuth(); - } - setTimeout(() => { - this._bioauthButton.classList.toggle("show", _globals__WEBPACK_IMPORTED_MODULE_3__.app.supportsBiometricUnlock); - }, 1000); - } - render() { - const email = _globals__WEBPACK_IMPORTED_MODULE_3__.app.account && _globals__WEBPACK_IMPORTED_MODULE_3__.app.account.email; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - -
    - - - - - this._submit()} - > - - - this._submit()}> - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unlock")} - - -
    ${this._errorMessage}
    -
    - -
    - - - - - `; - } - async _submit() { - if (this._unlockButton.state === "loading") { - return; - } - this._passwordInput.blur(); - if (!this._passwordInput.value) { - this._errorMessage = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter your master password!"); - this.rumble(); - this._passwordInput.focus(); - return; - } - this._errorMessage = ""; - this._unlockButton.start(); - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.unlock(this._passwordInput.value); - this._unlockButton.success(); - this.done(); - } - catch (e) { - this._unlockButton.fail(); - if (e.code !== _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.DECRYPTION_FAILED) { - throw e; - } - this._errorMessage = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Wrong password! Please try again."); - this.rumble(); - this._failedCount++; - if (this._failedCount > 2) { - const recover = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_9__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Can't remember your master password?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Recover Account"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Try Again")); - if (recover) { - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go("recover", { email: _globals__WEBPACK_IMPORTED_MODULE_3__.app.account.email }); - } - } - else { - this._passwordInput.focus(); - } - } - } - async _showMenu() { - const choice = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_9__.choose)("", [(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Logout / Switch Account"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Forgot Password")]); - switch (choice) { - case 0: - this._logout(); - break; - case 1: - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go("recover", { email: _globals__WEBPACK_IMPORTED_MODULE_3__.app.account.email }); - break; - } - } - async _logout() { - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_9__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Are you sure you want to log out of this account?")); - if (confirmed) { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.logout(); - _globals__WEBPACK_IMPORTED_MODULE_3__.router.go("login"); - } - } - async _bioAuth() { - if (this._bioauthButton.state === "loading") { - return; - } - this._bioauthButton.start(); - try { - if (_globals__WEBPACK_IMPORTED_MODULE_3__.app.remembersMasterKey) { - const authenticated = await (0,_padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_2__.biometricAuth)(); - if (!authenticated) { - this._bioauthButton.fail(); - return; - } - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.unlockWithRememberedMasterKey(); - } - catch (e) { - this.dispatch("enable-biometric-auth", { - message: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Biometric unlock expired. Complete setup to reeneable.") - }); - } - this._bioauthButton.success(); - } - else { - this.dispatch("enable-biometric-auth"); - this._bioauthButton.stop(); - } - } - catch (error) { - this._bioauthButton.fail(); - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_9__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Biometric unlock failed! Reason: {0}", error.message), { - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Failed To Unlock"), - type: "warning" - }); - } - } - _focused() { - setTimeout(() => { - if (_globals__WEBPACK_IMPORTED_MODULE_3__.app.state.locked && this.classList.contains("showing") && document.visibilityState !== "hidden") { - this._passwordInput && this._passwordInput.focus(); - } - }, 100); - } -}; -Unlock.styles = [ - ..._start_form__WEBPACK_IMPORTED_MODULE_6__.StartForm.styles, - _base__WEBPACK_IMPORTED_MODULE_5__.css ` - .current-account { - font-size: var(--font-size-tiny); - margin: 30px; - } - - .logout { - text-decoration: underline; - cursor: pointer; - } - - .account { - position: relative; - } - - .account pl-icon { - position: absolute; - right: 5px; - top: 6px; - } - - .bioauth-button { - background: transparent; - width: 50px; - transition: transform 0.5s cubic-bezier(1, -0.3, 0, 1.3), opacity 0.5s; - position: absolute; - bottom: 12px; - left: 0; - right: 0; - margin: auto; - } - - .bioauth-button:not(.show) { - opacity: 0; - transform: scale(0); - } - - .bioauth-button pl-icon { - font-size: 140%; - width: 50px; - height: 50px; - } - - @supports (-webkit-overflow-scrolling: touch) { - .bioauth-button { - bottom: max(env(safe-area-inset-bottom), 12px); - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", String) -], Unlock.prototype, "_errorMessage", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#passwordInput"), - __metadata("design:type", _password_input__WEBPACK_IMPORTED_MODULE_7__.PasswordInput) -], Unlock.prototype, "_passwordInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#unlockButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_8__.LoadingButton) -], Unlock.prototype, "_unlockButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#bioauthButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_8__.LoadingButton) -], Unlock.prototype, "_bioauthButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.listen)("visibilitychange", document), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], Unlock.prototype, "_focused", null); -Unlock = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.element)("pl-unlock") -], Unlock); - - - -/***/ }), - -/***/ "../app/src/elements/update-subscription-dialog.ts": -/*!*********************************************************!*\ - !*** ../app/src/elements/update-subscription-dialog.ts ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "UpdateSubscriptionDialog": () => (/* binding */ UpdateSubscriptionDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/billing */ "../core/src/billing.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _card_input__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./card-input */ "../app/src/elements/card-input.ts"); -/* harmony import */ var _choose_plan_dialog__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./choose-plan-dialog */ "../app/src/elements/choose-plan-dialog.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - -let UpdateSubscriptionDialog = class UpdateSubscriptionDialog extends _dialog__WEBPACK_IMPORTED_MODULE_5__.Dialog { - constructor() { - super(...arguments); - this.org = null; - this.plan = null; - this.quantity = 1; - this._error = ""; - } - async show(org) { - const promise = super.show(); - this._error = ""; - this.org = org; - const sub = org.billing && org.billing.subscription; - if (sub) { - this.plan = sub.plan; - this.quantity = sub.members; - } - else { - this._changePlan(); - } - return promise; - } - async _submit() { - if (this._submitButton.state === "loading") { - return; - } - this._error = ""; - this._submitButton.start(); - const params = new _padloc_core_src_billing__WEBPACK_IMPORTED_MODULE_1__.UpdateBillingParams({ - plan: this.plan.id, - members: this.quantity, - org: this.org.id - }); - try { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.updateBilling(params); - this._submitButton.success(); - this.done(); - } - catch (e) { - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Something went wrong. Please try again later!"); - this._submitButton.fail(); - } - } - async _updateQuantity() { - const quantity = parseInt(this._quantityInput.value); - const { min, max } = this.plan; - if (!isNaN(quantity) && quantity >= min && quantity <= max) { - this.quantity = quantity; - } - } - async _changePlan() { - this.open = false; - const plan = await this._choosePlanDialog.show(this.org || undefined); - if (plan) { - this.plan = plan; - this.quantity = plan.min; - } - this.open = true; - } - renderContent() { - const plan = this.plan; - if (!plan) { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ``; - } - const color = plan.color; - const monthlyPrice = Math.round((this.quantity * plan.cost) / 12); - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Update Subscription")}

    - -
    - - -
    - ${plan.name} -
    - -
    -
    $
    -
    - ${Math.floor(monthlyPrice / 100)} -
    -
    - .${(monthlyPrice % 100).toString().padEnd(2, "0")} -
    -
    - -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("per month")} -
    - -
    - (${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("USD, billed annually")}) -
    - -
    -
    - -
    -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("{0} min", plan.min.toString())}
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("{0} max", plan.max.toString())}
    -
    - (this._quantityInput.value = this.quantity.toString())} - > -
    - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Seats")} -
    -
    - -
    - ${this._error} -
    - -
    - - ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Update")} - - - -
    -
    - `; - } -}; -UpdateSubscriptionDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_5__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - .inner { - background: transparent; - box-shadow: none; - background: var(--color-quaternary); - text-align: center; - } - - .plan { - text-align: center; - padding: 20px; - background: var(--color-highlight); - color: var(--color-highlight-text); - display: flex; - flex-direction: column; - position: relative; - } - - .plan-name { - font-size: 1.7rem; - margin-bottom: 8px; - font-weight: bold; - } - - .plan-price { - letter-spacing: 0.1em; - display: flex; - align-items: flex-start; - justify-content: center; - font-weight: bold; - font-size: 1rem; - margin: 5px; - } - - .plan-price-currency { - line-height: 1em; - margin-top: 0.4em; - } - - .plan-price-dollars { - font-size: 3em; - line-height: 1em; - } - - .plan-price-cents { - font-size: 1.5em; - line-height: 1em; - margin-top: 0.2em; - } - - .plan-unit { - font-size: var(--font-size-small); - } - - .plan-fineprint { - font-size: var(--font-size-tiny); - opacity: 0.7; - margin: 4px 0 -4px 0; - } - - pl-loading-button { - font-weight: bold; - } - - pl-loading-button.primary { - background: var(--color-highlight); - color: var(--color-highlight-text); - font-weight: bold; - border-bottom: solid 3px var(--color-shade-2); - } - - .quantity-wrapper { - display: flex; - align-items: center; - justify-content: center; - margin: 8px; - } - - .quantity-label { - font-weight: bold; - padding: 12px; - font-size: 1.2em; - text-align: left; - } - - .quantity-input { - width: 60px; - margin: 0; - font-weight: bold; - font-size: 1.5rem; - } - - .quantity-minmax { - font-size: var(--font-size-micro); - opacity: 0.5; - text-align: right; - padding: 12px; - } - - .edit-plan-icon { - position: absolute; - top: 8px; - right: 8px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], UpdateSubscriptionDialog.prototype, "org", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], UpdateSubscriptionDialog.prototype, "plan", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Number) -], UpdateSubscriptionDialog.prototype, "quantity", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], UpdateSubscriptionDialog.prototype, "_error", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#quantityInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_9__.Input) -], UpdateSubscriptionDialog.prototype, "_quantityInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#submitButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_6__.LoadingButton) -], UpdateSubscriptionDialog.prototype, "_submitButton", void 0); -__decorate([ - (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.dialog)("pl-choose-plan-dialog"), - __metadata("design:type", _choose_plan_dialog__WEBPACK_IMPORTED_MODULE_8__.ChoosePlanDialog) -], UpdateSubscriptionDialog.prototype, "_choosePlanDialog", void 0); -UpdateSubscriptionDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-update-subscription-dialog") -], UpdateSubscriptionDialog); - - - -/***/ }), - -/***/ "../app/src/elements/upload-dialog.ts": -/*!********************************************!*\ - !*** ../app/src/elements/upload-dialog.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "UploadDialog": () => (/* binding */ UploadDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/util */ "../app/src/lib/util.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - -let UploadDialog = class UploadDialog extends _dialog__WEBPACK_IMPORTED_MODULE_5__.Dialog { - constructor() { - super(...arguments); - this.file = null; - this.itemId = null; - this.preventDismiss = true; - this._progress = null; - this._error = ""; - } - get _item() { - const found = (this.itemId && _globals__WEBPACK_IMPORTED_MODULE_2__.app.getItem(this.itemId)) || null; - return found && found.item; - } - get _vault() { - const found = (this.itemId && _globals__WEBPACK_IMPORTED_MODULE_2__.app.getItem(this.itemId)) || null; - return found && found.vault; - } - show({ item, file }) { - this._error = ""; - this._progress = null; - this.file = file; - this.itemId = item; - return super.show(); - } - async upload() { - if (this._uploadButton.state === "loading") { - return; - } - this._progress = null; - this._error = ""; - if (!this._nameInput.value) { - this._error = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Please enter a name!"); - return; - } - this._uploadButton.start(); - const att = await _globals__WEBPACK_IMPORTED_MODULE_2__.app.createAttachment(this.itemId, this.file, this._nameInput.value); - const upload = att.uploadProgress; - const handler = () => (this._progress = upload.progress); - upload.addEventListener("progress", handler); - try { - await upload.completed; - } - catch (e) { } - upload.removeEventListener("progress", handler); - this._progress = null; - if (upload.error) { - this._uploadButton.fail(); - this._error = - upload.error.code === _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.STORAGE_QUOTA_EXCEEDED - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Storage limit exceeded!") - : (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Upload failed! Please try again!"); - } - else { - this._uploadButton.success(); - this.done(att); - } - } - renderContent() { - if (!this.file) { - return _base__WEBPACK_IMPORTED_MODULE_4__.html ``; - } - return _base__WEBPACK_IMPORTED_MODULE_4__.html ` -
    - - -
    -

    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Upload Attachment")}

    - - - -
    - ${this._progress - ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("uploading... {0}/{1}", (0,_lib_util__WEBPACK_IMPORTED_MODULE_3__.fileSize)(this._progress.loaded), (0,_lib_util__WEBPACK_IMPORTED_MODULE_3__.fileSize)(this._progress.total)) - : (this.file.type || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Unkown File Type")) + " - " + (0,_lib_util__WEBPACK_IMPORTED_MODULE_3__.fileSize)(this.file.size)} -
    - -
    ${this._error}
    -
    -
    - -
    - -
    ${this._error ? (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Retry Upload") : (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Upload")}
    -
    - - -
    - `; - } -}; -UploadDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_5__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_4__.css ` - h1 { - margin: 0 0 8px 0; - } - - .file-info { - display: flex; - margin: 12px 0; - align-items: center; - } - - .file-info pl-icon { - width: 80px; - height: 80px; - font-size: 60px; - margin: 4px; - } - - .name { - font-weight: bold; - height: auto; - padding: 8px 12px; - margin-right: 12px; - margin-left: -6px; - } - - .size, - .error { - margin-top: 8px; - font-weight: bold; - font-size: var(--font-size-small); - } - - .error { - color: var(--color-negative); - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], UploadDialog.prototype, "file", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], UploadDialog.prototype, "itemId", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], UploadDialog.prototype, "_progress", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.property)(), - __metadata("design:type", Object) -], UploadDialog.prototype, "_error", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#nameInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], UploadDialog.prototype, "_nameInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.query)("#uploadButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], UploadDialog.prototype, "_uploadButton", void 0); -UploadDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_4__.element)("pl-upload-dialog") -], UploadDialog); - - - -/***/ }), - -/***/ "../app/src/elements/vault-dialog.ts": -/*!*******************************************!*\ - !*** ../app/src/elements/vault-dialog.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "VaultDialog": () => (/* binding */ VaultDialog) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/org */ "../core/src/org.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ "../app/src/elements/dialog.ts"); -/* harmony import */ var _loading_button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./loading-button */ "../app/src/elements/loading-button.ts"); -/* harmony import */ var _input__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./input */ "../app/src/elements/input.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -/* harmony import */ var _group_item__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./group-item */ "../app/src/elements/group-item.ts"); -/* harmony import */ var _member_item__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./member-item */ "../app/src/elements/member-item.ts"); -/* harmony import */ var _toggle__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./toggle */ "../app/src/elements/toggle.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - -let VaultDialog = class VaultDialog extends _dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog { - constructor() { - super(...arguments); - this.org = null; - this.vault = null; - this._filterString = ""; - this._error = ""; - this._members = new Map(); - this._groups = new Map(); - } - _getCurrentMembers() { - const members = new Map(); - if (!this.org) { - return members; - } - for (const member of this.org.members) { - const v = this.vault && member.vaults.find(v => v.id === this.vault.id); - members.set(member.id, { - read: !!v, - write: !!v && !v.readonly - }); - } - return members; - } - _getCurrentGroups() { - const groups = new Map(); - if (!this.org) { - return groups; - } - for (const group of this.org.groups) { - const v = this.vault && group.vaults.find(v => v.id === this.vault.id); - groups.set(group.name, { - read: !!v, - write: !!v && !v.readonly - }); - } - return groups; - } - get _hasChanged() { - if (!this.org || !this._nameInput) { - return false; - } - const currentGroups = this._getCurrentGroups(); - const groupsChanged = this.org.groups.some(({ name }) => { - const c = currentGroups.get(name); - const s = this._groups.get(name); - return c.read !== s.read || c.write !== s.write; - }); - const currentMembers = this._getCurrentMembers(); - const membersChanged = this.org.members.some(({ id }) => { - const c = currentMembers.get(id); - const s = this._members.get(id); - return c.read !== s.read || c.write !== s.write; - }); - const nameChanged = this.vault ? this.vault.name !== this._nameInput.value : !!this._nameInput.value; - return ((this._groups.size || this._members.size) && - this._nameInput.value && - (groupsChanged || membersChanged || nameChanged)); - } - async show({ vault, org }) { - this._error = ""; - this.vault = vault; - this.org = org; - this._members = this._getCurrentMembers(); - this._groups = this._getCurrentGroups(); - await this.updateComplete; - this._nameInput.value = this.vault ? this.vault.name : ""; - return super.show(); - } - _toggle(obj) { - if (obj instanceof _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.Group) { - const { read } = this._groups.get(obj.name); - this._groups.set(obj.name, read ? { read: false, write: false } : { read: true, write: true }); - } - else { - const { read } = this._members.get(obj.id); - this._members.set(obj.id, read ? { read: false, write: false } : { read: true, write: true }); - } - this.requestUpdate(); - } - _toggleRead(obj, event) { - if (event) { - event.stopImmediatePropagation(); - } - const sel = obj instanceof _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.Group ? this._groups.get(obj.name) : this._members.get(obj.id); - sel.read = !sel.read; - if (!sel.read) { - sel.write = false; - } - this.requestUpdate(); - } - _toggleWrite(obj, event) { - if (event) { - event.stopImmediatePropagation(); - } - const sel = obj instanceof _padloc_core_src_org__WEBPACK_IMPORTED_MODULE_0__.Group ? this._groups.get(obj.name) : this._members.get(obj.id); - sel.write = !sel.write; - if (sel.write) { - sel.read = true; - } - this.requestUpdate(); - } - // _toggleReadonly(group: Group) { - // this._selection.get(group.id)!.readonly = !this._selection.get(group.id)!.readonly; - // } - async _save() { - this._error = ""; - const groups = [...this._groups.entries()] - .filter(([, { read }]) => read) - .map(([name, { write }]) => ({ name, readonly: !write })); - const members = [...this._members.entries()] - .filter(([, { read }]) => read) - .map(([id, { write }]) => ({ id, readonly: !write })); - if (!members.length && !groups.length) { - this._error = "You have to assign at least one member or group!"; - return; - } - if (this._saveButton.state === "loading") { - return; - } - this._saveButton.start(); - try { - if (this.vault) { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.updateVaultAccess(this.org.id, this.vault.id, this._nameInput.value, members, groups); - } - else { - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.createVault(this._nameInput.value, this.org, members, groups); - } - this._saveButton.success(); - this.done(); - } - catch (e) { - this._saveButton.fail(); - this._error = e.message || (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Something went wrong. Please try again later!"); - throw e; - } - this.requestUpdate(); - } - async _deleteVault() { - this.open = false; - const deleted = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_4__.prompt)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Are you sure you want to delete this vault? " + - "All the data stored in it will be lost! " + - "This action can not be undone."), { - type: "destructive", - title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Delete Vault"), - confirmLabel: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Delete"), - placeholder: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Type 'DELETE' to confirm"), - validate: async (val) => { - if (val !== "DELETE") { - throw (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Type 'DELETE' to confirm"); - } - await _globals__WEBPACK_IMPORTED_MODULE_3__.app.deleteVault(this.vault.id); - return val; - } - }); - if (deleted) { - this.done(); - } - else { - this.open = true; - } - } - _updateFilter() { - this._filterString = this._filterInput.value; - } - _clearFilter() { - this._filterString = this._filterInput.value = ""; - } - shouldUpdate() { - return !!this.org; - } - renderContent() { - const org = this.org; - const isAdmin = org.isAdmin(_globals__WEBPACK_IMPORTED_MODULE_3__.app.account); - const filter = this._filterString.toLowerCase(); - const members = filter - ? org.members.filter(({ name, email }) => email.toLowerCase().includes(filter) || name.toLowerCase().includes(filter)) - : org.members; - const groups = filter ? org.groups.filter(({ name }) => name.toLowerCase().includes(filter)) : org.groups; - return _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    - - this.requestUpdate()} - > - -
    - -
    -
    - - - -
    - -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Groups")}
    -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("read")}
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("write")}
    -
    - - ${groups.map(group => _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    this._toggle(group)} ?disabled=${!isAdmin}> - - this._toggleRead(group, e)} - > - this._toggleWrite(group, e)} - > -
    - `)} - -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Members")}
    -
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("read")}
    -
    ${(0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("write")}
    -
    - - ${members.map(member => _base__WEBPACK_IMPORTED_MODULE_5__.html ` -
    this._toggle(member)} ?disabled=${!isAdmin}> - - this._toggleRead(member, e)} - > - this._toggleWrite(member, e)} - > -
    - `)} - -
    - ${this._error} -
    -
    - - - `; - } -}; -VaultDialog.styles = [ - ..._dialog__WEBPACK_IMPORTED_MODULE_6__.Dialog.styles, - _base__WEBPACK_IMPORTED_MODULE_5__.css ` - .inner { - background: var(--color-quaternary); - } - - .delete-button { - color: var(--color-negative); - font-size: var(--font-size-default); - } - - .subheader { - margin: 8px; - font-weight: bold; - display: flex; - align-items: flex-end; - padding: 0 8px; - font-size: var(--font-size-small); - } - - .subheader .permission { - width: 50px; - text-align: center; - font-size: var(--font-size-tiny); - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.ellipsis()} - } - - .item { - display: flex; - align-items: center; - } - - .item pl-toggle { - margin-right: 14px; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], VaultDialog.prototype, "org", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", Object) -], VaultDialog.prototype, "vault", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#nameInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], VaultDialog.prototype, "_nameInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#saveButton"), - __metadata("design:type", _loading_button__WEBPACK_IMPORTED_MODULE_7__.LoadingButton) -], VaultDialog.prototype, "_saveButton", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.query)("#filterInput"), - __metadata("design:type", _input__WEBPACK_IMPORTED_MODULE_8__.Input) -], VaultDialog.prototype, "_filterInput", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", String) -], VaultDialog.prototype, "_filterString", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.property)(), - __metadata("design:type", String) -], VaultDialog.prototype, "_error", void 0); -VaultDialog = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_5__.element)("pl-vault-dialog") -], VaultDialog); - - - -/***/ }), - -/***/ "../app/src/elements/vault-item.ts": -/*!*****************************************!*\ - !*** ../app/src/elements/vault-item.ts ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "VaultItem": () => (/* binding */ VaultItem) -/* harmony export */ }); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _icon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./icon */ "../app/src/elements/icon.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - -let VaultItem = class VaultItem extends _base__WEBPACK_IMPORTED_MODULE_1__.BaseElement { - constructor() { - super(...arguments); - this.groups = 0; - this.members = 0; - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` - - -
    -
    ${this.vault.name}
    - -
    -
    - - -
    ${this.groups}
    -
    - -
    - - -
    ${this.members}
    -
    -
    -
    - `; - } -}; -VaultItem.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_0__.shared, - _base__WEBPACK_IMPORTED_MODULE_1__.css ` - :host { - display: flex; - align-items: center; - padding: 4px 0; - } - - .icon { - font-size: 120%; - margin: 8px; - background: #eee; - border: solid 1px #ddd; - width: 45px; - height: 45px; - } - - .tags { - margin: 4px 0; - } - - .vault-name { - font-weight: bold; - margin-bottom: 4px; - } - - .vault-info { - flex: 1; - width: 0; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Object) -], VaultItem.prototype, "vault", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Number) -], VaultItem.prototype, "groups", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Number) -], VaultItem.prototype, "members", void 0); -VaultItem = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("pl-vault-item") -], VaultItem); - - - -/***/ }), - -/***/ "../app/src/elements/view.ts": -/*!***********************************!*\ - !*** ../app/src/elements/view.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "View": () => (/* binding */ View) -/* harmony export */ }); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - -class View extends _base__WEBPACK_IMPORTED_MODULE_0__.BaseElement { - constructor() { - super(...arguments); - this.active = false; - } - _activeChanged() { - if (this.active) { - this._activated(); - } - else { - this._deactivated(); - } - } - _activated() { } - _deactivated() { } -} -View.styles = [ - _styles__WEBPACK_IMPORTED_MODULE_1__.shared, - _base__WEBPACK_IMPORTED_MODULE_0__.css ` - @supports (-webkit-overflow-scrolling: touch) { - header { - padding-top: max(env(safe-area-inset-top), 8px); - } - - .fabs { - margin: calc(env(safe-area-inset-bottom) / 3); - } - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.property)(), - __metadata("design:type", Boolean) -], View.prototype, "active", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_0__.observe)("active"), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], View.prototype, "_activeChanged", null); - - -/***/ }), - -/***/ "../app/src/elements/virtual-list.ts": -/*!*******************************************!*\ - !*** ../app/src/elements/virtual-list.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "VirtualList": () => (/* binding */ VirtualList), -/* harmony export */ "VirtualListTest": () => (/* binding */ VirtualListTest) -/* harmony export */ }); -/* harmony import */ var lit_html_directives_guard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html/directives/guard */ "../app/node_modules/lit-html/directives/guard.js"); -/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ "../app/src/elements/base.ts"); -/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../styles */ "../app/src/styles/index.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - -let VirtualList = class VirtualList extends _base__WEBPACK_IMPORTED_MODULE_1__.BaseElement { - constructor() { - super(...arguments); - this.data = []; - this.buffer = 1; - this._elements = []; - } - get firstIndex() { - return this._firstIndex; - } - get lastIndex() { - return this._lastIndex; - } - connectedCallback() { - super.connectedCallback(); - this.addEventListener("scroll", () => this._updateIndizes(), { passive: true }); - this._updateBounds(); - } - _updateBounds() { - const { width, height } = getComputedStyle(this); - this._width = parseInt(width); - this._height = parseInt(height); - this._itemsPerRow = Math.floor(this._width / (this.minItemWidth || this._width)); - this._itemWidth = this._width / this._itemsPerRow; - const rowCount = Math.ceil(this.data.length / this._itemsPerRow); - this._canvasHeight = rowCount * this.itemHeight; - const elementCount = Math.ceil(this._height / this.itemHeight + 2 * this.buffer) * this._itemsPerRow; - const els = []; - for (let i = 0; i < elementCount; i++) { - els.push({ data: null, x: 0, y: 0 }); - } - this._elements = els; - this._updateIndizes(); - this._updateElements(); - } - _updateIndizes() { - const oldFirstIndex = this._firstIndex; - const oldLastIndex = this._lastIndex; - this._firstIndex = Math.max(Math.floor(this.scrollTop / this.itemHeight - this.buffer) * this._itemsPerRow, 0); - this._lastIndex = Math.min(this._firstIndex + this._elements.length, this.data.length) - 1; - if (this._firstIndex !== oldFirstIndex || this._lastIndex !== oldLastIndex) { - this._updateElements(); - } - } - _updateElements() { - for (let i = this._firstIndex; i <= this._lastIndex; i++) { - const elIndex = i % this._elements.length; - Object.assign(this._elements[elIndex], { - data: this.data[i], - x: (i % this._itemsPerRow) * this._itemWidth, - y: Math.floor(i / this._itemsPerRow) * this.itemHeight - }); - } - this.requestUpdate(); - } - createRenderRoot() { - return this; - } - render() { - const { _itemWidth: w, itemHeight: h } = this; - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` -
    - ${this._elements.map(({ x, y, data }) => { - const render = () => { - return data !== null - ? _base__WEBPACK_IMPORTED_MODULE_1__.html ` -
    - ${this.renderItem(data)} -
    - ` - : _base__WEBPACK_IMPORTED_MODULE_1__.html ``; - }; - const deps = [x, y, data, w, h]; - this.guard && data && deps.push(...this.guard(data)); - return this.guard ? (0,lit_html_directives_guard__WEBPACK_IMPORTED_MODULE_0__.guard)(deps, render) : render(); - })} -
    - `; - } -}; -VirtualList.styles = [ - _base__WEBPACK_IMPORTED_MODULE_1__.css ` - :host { - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.scroll()} - overflow-y: auto !important; - overflow-x: hidden !important; - } - - ::slotted(.content) { - position: relative; - } - - ::slotted(.cell) { - position: absolute; - will-change: transform; - transition: transform 0.5s; - } - ` -]; -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Array) -], VirtualList.prototype, "data", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Number) -], VirtualList.prototype, "minItemWidth", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Number) -], VirtualList.prototype, "itemHeight", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Function) -], VirtualList.prototype, "renderItem", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Number) -], VirtualList.prototype, "buffer", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.property)(), - __metadata("design:type", Function) -], VirtualList.prototype, "guard", void 0); -__decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.observe)("data", "itemMinWidth", "minItemWidth", "itemHeight"), - (0,_base__WEBPACK_IMPORTED_MODULE_1__.listen)("resize", window), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", void 0) -], VirtualList.prototype, "_updateBounds", null); -VirtualList = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("pl-virtual-list") -], VirtualList); - -let VirtualListTest = class VirtualListTest extends _base__WEBPACK_IMPORTED_MODULE_1__.BaseElement { - constructor() { - super(); - this.data = []; - for (let i = 0; i < 10000; i++) { - this.data.push({ i }); - } - } - render() { - return _base__WEBPACK_IMPORTED_MODULE_1__.html ` - _base__WEBPACK_IMPORTED_MODULE_1__.html ` -
    ${item.i}
    - `} - >
    - `; - } -}; -VirtualListTest.styles = [ - _base__WEBPACK_IMPORTED_MODULE_1__.css ` - pl-virtual-list { - ${_styles__WEBPACK_IMPORTED_MODULE_2__.mixins.fullbleed()} - overflow-y: auto; - } - - .item { - border: solid 1px; - margin: 5px; - text-align: center; - line-height: 90px; - } - ` -]; -VirtualListTest = __decorate([ - (0,_base__WEBPACK_IMPORTED_MODULE_1__.element)("virtual-list-test"), - __metadata("design:paramtypes", []) -], VirtualListTest); - - - -/***/ }), - -/***/ "../app/src/globals.ts": -/*!*****************************!*\ - !*** ../app/src/globals.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "app": () => (/* binding */ app), -/* harmony export */ "router": () => (/* binding */ router) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_app__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/app */ "../core/src/app.ts"); -/* harmony import */ var _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/platform */ "../core/src/platform.ts"); -/* harmony import */ var _lib_route__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/route */ "../app/src/lib/route.ts"); -/* harmony import */ var _lib_ajax__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/ajax */ "../app/src/lib/ajax.ts"); - - - - -const sender = new _lib_ajax__WEBPACK_IMPORTED_MODULE_3__.AjaxSender("http://0.0.0.0:3000"); -const app = (window.app = new _padloc_core_src_app__WEBPACK_IMPORTED_MODULE_0__.App(sender)); -const router = (window.router = new _lib_route__WEBPACK_IMPORTED_MODULE_2__.Router()); -window.getPlatform = _padloc_core_src_platform__WEBPACK_IMPORTED_MODULE_1__.getPlatform; - - -/***/ }), - -/***/ "../app/src/lib/ajax.ts": -/*!******************************!*\ - !*** ../app/src/lib/ajax.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "request": () => (/* binding */ request), -/* harmony export */ "AjaxSender": () => (/* binding */ AjaxSender) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _padloc_core_src_transport__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/transport */ "../core/src/transport.ts"); - - - -async function request(method, url, body, headers, progress) { - let req = new XMLHttpRequest(); - return new Promise((resolve, reject) => { - req.onreadystatechange = () => { - if (req.readyState === 4) { - if (!req.status) { - reject(new _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.Err(_padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.FAILED_CONNECTION)); - } - else { - resolve(req); - } - } - }; - try { - req.open(method, url, true); - if (headers) { - headers.forEach((value, key) => req.setRequestHeader(key, value)); - } - if (progress) { - req.onprogress = (pg) => (progress.downloadProgress = pg); - req.upload.onprogress = (pg) => (progress.uploadProgress = pg); - } - req.send(body); - } - catch (e) { - reject(new _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.Err(_padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.FAILED_CONNECTION)); - } - }); -} -class AjaxSender { - constructor(url) { - this.url = url; - } - async send(req, progress) { - const body = (0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_1__.marshal)(req.toRaw()); - const res = await request("POST", this.url, body, new Map([["Content-Type", "application/json"], ["Accept", "application/json"]]), progress); - try { - return new _padloc_core_src_transport__WEBPACK_IMPORTED_MODULE_2__.Response().fromRaw((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_1__.unmarshal)(res.responseText)); - } - catch (e) { - throw new _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.Err(_padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.SERVER_ERROR); - } - } -} - - -/***/ }), - -/***/ "../app/src/lib/animation.ts": -/*!***********************************!*\ - !*** ../app/src/lib/animation.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "animateElement": () => (/* binding */ animateElement), -/* harmony export */ "animateCascade": () => (/* binding */ animateCascade) -/* harmony export */ }); -const defaults = { - animation: "slideIn", - duration: 500, - easing: "ease", - delay: 0, - fill: "backwards", - initialDelay: 0, - fullDuration: 1000, - clear: false, - direction: "normal" -}; -const clearAnimation = new Map(); -function animateElement(el, opts = {}) { - const { animation, duration, direction, easing, delay, fill, clear } = Object.assign({}, defaults, opts); - clearTimeout(clearAnimation.get(el)); - el.style.animation = ""; - el.offsetLeft; - el.style.animation = `${animation} ${direction} ${duration}ms ${easing} ${delay}ms ${fill}`; - if (clear) { - const clearDelay = typeof clear === "number" ? clear : 0; - clearAnimation.set(el, window.setTimeout(() => (el.style.animation = ""), delay + duration + clearDelay)); - } - return new Promise(resolve => setTimeout(resolve, delay + duration)); -} -function animateCascade(nodes, opts = {}) { - const els = Array.from(nodes); - const { fullDuration, duration, initialDelay } = Object.assign({}, defaults, opts); - const dt = Math.max(30, Math.floor((fullDuration - duration) / els.length)); - const promises = []; - for (const [i, e] of els.entries()) { - promises.push(animateElement(e, Object.assign(opts, { delay: initialDelay + i * dt }))); - } - return Promise.all(promises); -} - - -/***/ }), - -/***/ "../app/src/lib/clipboard.ts": -/*!***********************************!*\ - !*** ../app/src/lib/clipboard.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "setClipboard": () => (/* binding */ setClipboard), -/* harmony export */ "clearClipboard": () => (/* binding */ clearClipboard) -/* harmony export */ }); -/* harmony import */ var _elements_clipboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../elements/clipboard */ "../app/src/elements/clipboard.ts"); -/* harmony import */ var _singleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./singleton */ "../app/src/lib/singleton.ts"); - - -async function setClipboard(item, field, duration) { - const singleton = (0,_singleton__WEBPACK_IMPORTED_MODULE_1__.getSingleton)("pl-clipboard"); - return singleton.set(item, field, duration); -} -function clearClipboard() { - const singleton = (0,_singleton__WEBPACK_IMPORTED_MODULE_1__.getSingleton)("pl-clipboard"); - singleton.clear(); -} - - -/***/ }), - -/***/ "../app/src/lib/dialog.ts": -/*!********************************!*\ - !*** ../app/src/lib/dialog.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getDialog": () => (/* binding */ getDialog), -/* harmony export */ "lineUpDialog": () => (/* binding */ lineUpDialog), -/* harmony export */ "alert": () => (/* binding */ alert), -/* harmony export */ "confirm": () => (/* binding */ confirm), -/* harmony export */ "prompt": () => (/* binding */ prompt), -/* harmony export */ "choose": () => (/* binding */ choose), -/* harmony export */ "generate": () => (/* binding */ generate), -/* harmony export */ "clearDialogs": () => (/* binding */ clearDialogs), -/* harmony export */ "dialog": () => (/* binding */ dialog) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _elements_generator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../elements/generator */ "../app/src/elements/generator.ts"); -/* harmony import */ var _elements_alert_dialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../elements/alert-dialog */ "../app/src/elements/alert-dialog.ts"); -/* harmony import */ var _elements_prompt_dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../elements/prompt-dialog */ "../app/src/elements/prompt-dialog.ts"); -/* harmony import */ var _elements_export_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../elements/export-dialog */ "../app/src/elements/export-dialog.ts"); -/* harmony import */ var _singleton__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./singleton */ "../app/src/lib/singleton.ts"); - - - - - - -let lastDialogPromise = Promise.resolve(); -let currentDialog; -const getDialog = _singleton__WEBPACK_IMPORTED_MODULE_5__.getSingleton; -function lineUpDialog(d, fn) { - const dialog = typeof d === "string" ? (0,_singleton__WEBPACK_IMPORTED_MODULE_5__.getSingleton)(d) : d; - const promise = lastDialogPromise.then(() => { - currentDialog = dialog; - return fn(dialog); - }); - lastDialogPromise = promise; - return promise; -} -function alert(message, options, instant = false) { - options = options || {}; - options.message = message; - return instant - ? getDialog("pl-alert-dialog").show(options) - : lineUpDialog("pl-alert-dialog", (dialog) => dialog.show(options)); -} -function confirm(message, confirmLabel = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Confirm"), cancelLabel = (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Cancel"), options = {}, instant) { - options.options = [confirmLabel, cancelLabel]; - options.type = options.type || "question"; - options.horizontal = typeof options.horizontal !== "undefined" ? options.horizontal : true; - return alert(message, options, instant).then(choice => choice === 0); -} -function prompt(message, opts = {}, instant = false) { - opts.message = message; - return instant - ? getDialog("pl-prompt-dialog").show(opts) - : lineUpDialog("pl-prompt-dialog", (dialog) => dialog.show(opts)); -} -function choose(message, options, opts = {}) { - opts.options = options; - return alert(message, { - ...opts, - options, - type: "choice", - vertical: true - }); -} -function generate() { - return lineUpDialog("pl-generator", dialog => dialog.show()); -} -function clearDialogs() { - if (currentDialog) { - currentDialog.open = false; - } - lastDialogPromise = Promise.resolve(); -} -function dialog(name) { - return (prototype, propertyName) => { - Object.defineProperty(prototype, propertyName, { - get() { - return getDialog(name); - }, - enumerable: true, - configurable: true - }); - }; -} - - -/***/ }), - -/***/ "../app/src/lib/export.ts": -/*!********************************!*\ - !*** ../app/src/lib/export.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "supportedFormats": () => (/* binding */ supportedFormats), -/* harmony export */ "CSV": () => (/* reexport safe */ _import__WEBPACK_IMPORTED_MODULE_2__.CSV), -/* harmony export */ "PBES2": () => (/* reexport safe */ _import__WEBPACK_IMPORTED_MODULE_2__.PBES2), -/* harmony export */ "asCSV": () => (/* binding */ asCSV), -/* harmony export */ "asPBES2Container": () => (/* binding */ asPBES2Container) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/container */ "../core/src/container.ts"); -/* harmony import */ var _padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _import__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./import */ "../app/src/lib/import.ts"); - - - -const supportedFormats = [_import__WEBPACK_IMPORTED_MODULE_2__.CSV, _import__WEBPACK_IMPORTED_MODULE_2__.PBES2]; - -function itemsToTable(items) { - // Array of column names - let cols = ["name", "tags"]; - // Column indizes associated with field/column names - let colInds = {}; - // Two dimensional array, starting with column names - let table = [cols]; - // Fill up columns array with distinct field names - for (let item of items) { - for (let field of item.fields) { - if (!colInds[field.name]) { - colInds[field.name] = cols.length; - cols.push(field.name); - } - } - } - // Creates an array of empty strings with the length of the `cols` array - function emptyRow() { - var l = cols.length; - var row = []; - while (l--) { - row.push(""); - } - return row; - } - // Add a row for each item - items.forEach(function (item) { - // Create an empty row to be filled with item name, category and field values - var row = emptyRow(); - // VaultItem name and category are always the first and second column respectively - row[0] = item.name; - row[1] = item.tags.join(","); - // Fill up columns with corrensponding field values if the fields exist on the item. All - // other columns remain empty - item.fields.forEach(function (item) { - row[colInds[item.name]] = item.value; - }); - // Add row to table - table.push(row); - }); - return table; -} -async function asCSV(items) { - const papa = await (0,_import__WEBPACK_IMPORTED_MODULE_2__.loadPapa)(); - return papa.unparse(itemsToTable(items)); -} -async function asPBES2Container(items, password) { - for (const item of items) { - item.attachments = []; - } - const container = new _padloc_core_src_container__WEBPACK_IMPORTED_MODULE_0__.PBES2Container(); - await container.unlock(password); - await container.setData((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_1__.stringToBytes)((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_1__.marshal)({ items: items.map((item) => item.toRaw()) }))); - return container.toJSON(); -} - - -/***/ }), - -/***/ "../app/src/lib/import.ts": -/*!********************************!*\ - !*** ../app/src/lib/import.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CSV": () => (/* binding */ CSV), -/* harmony export */ "PADLOCK_LEGACY": () => (/* binding */ PADLOCK_LEGACY), -/* harmony export */ "LASTPASS": () => (/* binding */ LASTPASS), -/* harmony export */ "PBES2": () => (/* binding */ PBES2), -/* harmony export */ "supportedFormats": () => (/* binding */ supportedFormats), -/* harmony export */ "loadPapa": () => (/* binding */ loadPapa), -/* harmony export */ "fromTable": () => (/* binding */ fromTable), -/* harmony export */ "isCSV": () => (/* binding */ isCSV), -/* harmony export */ "asCSV": () => (/* binding */ asCSV), -/* harmony export */ "isPadlockV1": () => (/* binding */ isPadlockV1), -/* harmony export */ "asPadlockLegacy": () => (/* binding */ asPadlockLegacy), -/* harmony export */ "importLegacyContainer": () => (/* binding */ importLegacyContainer), -/* harmony export */ "isPBES2Container": () => (/* binding */ isPBES2Container), -/* harmony export */ "asPBES2Container": () => (/* binding */ asPBES2Container), -/* harmony export */ "asLastPass": () => (/* binding */ asLastPass), -/* harmony export */ "isLastPass": () => (/* binding */ isLastPass), -/* harmony export */ "guessFormat": () => (/* binding */ guessFormat) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _padloc_core_src_container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/core/src/container */ "../core/src/container.ts"); -/* harmony import */ var _padloc_core_src_legacy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @padloc/core/src/legacy */ "../core/src/legacy.ts"); -/* harmony import */ var _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @padloc/core/src/item */ "../core/src/item.ts"); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _padloc_core_src_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @padloc/core/src/util */ "../core/src/util.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); - - - - - - - -const CSV = { - format: "csv", - toString() { - return "CSV"; - } -}; -const PADLOCK_LEGACY = { - format: "padlock-legacy", - toString() { - return "Padlock (v2)"; - } -}; -const LASTPASS = { - format: "lastpass", - toString() { - return "LastPass"; - } -}; -const PBES2 = { - format: "padloc", - toString() { - return "Encrypted Container"; - } -}; -const supportedFormats = [CSV, PADLOCK_LEGACY, LASTPASS, PBES2]; -function loadPapa() { - return __webpack_require__.e(/*! import() | papaparse */ "papaparse").then(__webpack_require__.t.bind(__webpack_require__, /*! papaparse */ "../app/node_modules/papaparse/papaparse.min.js", 23)); -} -/** - * Takes a data table (represented by a two-dimensional array) and converts it - * into an array of items - * @param Array data Two-dimensional array containing tabular item data; The first 'row' - * should contain field names. All other rows represent items, containing - * the item name, field values and optionally a list of tags. - * @param Integer nameColIndex Index of the column containing the item names. Defaults to 0 - * @param Integer tagsColIndex Index of the column containing the item categories. If left empty - * no categories will be used - */ -async function fromTable(data, nameColIndex, tagsColIndex) { - // Use first row for column names - const colNames = data[0]; - if (nameColIndex === undefined) { - const i = colNames.indexOf("name"); - nameColIndex = i !== -1 ? i : 0; - } - if (tagsColIndex === undefined) { - tagsColIndex = colNames.indexOf("tags"); - if (tagsColIndex === -1) { - tagsColIndex = colNames.indexOf("category"); - } - } - // All subsequent rows should contain values - let items = data.slice(1).map(function (row) { - // Construct an array of field object from column names and values - let fields = []; - for (let i = 0; i < row.length; i++) { - // Skip name column, category column (if any) and empty fields - if (i != nameColIndex && i != tagsColIndex && row[i]) { - const name = colNames[i]; - const value = row[i]; - fields.push(new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.Field().fromRaw({ - name, - value - })); - } - } - const name = row[nameColIndex]; - const tags = row[tagsColIndex]; - return (0,_padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.createVaultItem)(name, fields, (tags && tags.split(",")) || []); - }); - return Promise.all(items); -} -async function isCSV(data) { - const papa = await loadPapa(); - return papa.parse(data).errors.length === 0; -} -async function asCSV(data, nameColIndex, tagsColIndex) { - const papa = await loadPapa(); - const parsed = papa.parse(data); - if (parsed.errors.length) { - throw new _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_4__.Err(_padloc_core_src_error__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.INVALID_CSV); - } - return fromTable(parsed.data, nameColIndex, tagsColIndex); -} -/** - * Checks if a given string represents a Padlock enrypted backup - */ -function isPadlockV1(data) { - try { - return (0,_padloc_core_src_legacy__WEBPACK_IMPORTED_MODULE_2__.validateLegacyContainer)((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.unmarshal)(data)); - } - catch (e) { - return false; - } -} -async function asPadlockLegacy(data, password) { - const container = (0,_padloc_core_src_legacy__WEBPACK_IMPORTED_MODULE_2__.parseLegacyContainer)((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.unmarshal)(data)); - await container.unlock(password); - return importLegacyContainer(container); -} -async function importLegacyContainer(container) { - const records = (0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.unmarshal)((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.bytesToString)(await container.getData())); - const items = records - .filter(({ removed }) => !removed) - .map(async ({ name = "Unnamed", fields = [], tags, category, updated }) => { - return new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.VaultItem().fromRaw({ - id: await (0,_padloc_core_src_util__WEBPACK_IMPORTED_MODULE_5__.uuid)(), - name, - fields, - tags: tags || [category], - updated, - updatedBy: "", - attachments: [] - }); - }); - return Promise.all(items); -} -function isPBES2Container(data) { - try { - new _padloc_core_src_container__WEBPACK_IMPORTED_MODULE_1__.PBES2Container().fromRaw((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.unmarshal)(data)); - return true; - } - catch (e) { - return false; - } -} -async function asPBES2Container(data, password) { - const container = new _padloc_core_src_container__WEBPACK_IMPORTED_MODULE_1__.PBES2Container().fromRaw((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.unmarshal)(data)); - await container.unlock(password); - const raw = (0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.unmarshal)((0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.bytesToString)(await container.getData())); - const items = raw.items.map((item) => { - // Due to a bug in < v1.3.4 items were not serialized properly, so we may - // need this additional step - if (typeof item === "string") { - try { - item = (0,_padloc_core_src_encoding__WEBPACK_IMPORTED_MODULE_0__.unmarshal)(item); - } - catch (e) { } - } - return new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.VaultItem().fromRaw(item); - }); - return items; -} -/* - * Lastpass secure notes are exported by putting non-standard fields into the 'extra' column. Every line - * represents a field in the following format: - * - * field_name:data - * - * We're parsing that information to retrieve the individual fields - */ -function lpParseNotes(str) { - let lines = str.split("\n"); - let fields = lines - .filter(line => !!line) - .map(line => { - let split = line.indexOf(":"); - return new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.Field({ - name: line.substring(0, split), - value: line.substring(split + 1), - type: _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.FieldType.Text - }); - }); - return fields; -} -/* - * Parses a single row in a LastPass CSV file. Apart from extracting the default fields, we also parse - * the 'extra' column for 'special notes' and remove any special fields that are not needed outside of - * LastPass - */ -async function lpParseRow(row) { - const nameIndex = 4; - const categoryIndex = 5; - const urlIndex = 0; - const usernameIndex = 1; - const passwordIndex = 2; - const notesIndex = 3; - let fields = [ - new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.Field({ name: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_6__.translate)("Username"), value: row[usernameIndex], type: _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.FieldType.Username }), - new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.Field({ name: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_6__.translate)("Password"), value: row[passwordIndex], type: _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.FieldType.Password }), - new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.Field({ name: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_6__.translate)("URL"), value: row[urlIndex], type: _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.FieldType.Url }) - ]; - let notes = row[notesIndex]; - if (row[urlIndex] === "http://sn") { - // The 'http://sn' url indicates that this line represents a 'secure note', which means - // we'll have to parse the 'extra' column to retrieve the individual fields - fields.push(...lpParseNotes(notes)); - // In case of 'secure notes' we don't want the url and NoteType field - fields = fields.filter(f => f.name != "url" && f.name != "NoteType"); - } - else { - // We've got a regular 'site' item, so the 'extra' column simply contains notes - fields.push(new _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.Field({ name: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_6__.translate)("Notes"), value: notes, type: _padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.FieldType.Note })); - } - const dir = row[categoryIndex]; - // Create a basic item using the standard fields - return (0,_padloc_core_src_item__WEBPACK_IMPORTED_MODULE_3__.createVaultItem)(row[nameIndex], fields, dir ? [dir] : []); -} -async function asLastPass(data) { - const papa = await loadPapa(); - let items = papa - .parse(data) - .data // Remove first row as it only contains field names - .slice(1) - // Filter out empty rows - .filter((row) => row.length > 1) - .map(lpParseRow); - return Promise.all(items); -} -/** - * Checks if a given string represents a LastPass CSV file - */ -function isLastPass(data) { - return data.split("\n")[0] === "url,username,password,extra,name,grouping,fav"; -} -function guessFormat(data) { - return isPBES2Container(data) - ? PBES2 - : isPadlockV1(data) - ? PADLOCK_LEGACY - : isLastPass(data) - ? LASTPASS - : isCSV(data) - ? CSV - : null; -} - - -/***/ }), - -/***/ "../app/src/lib/route.ts": -/*!*******************************!*\ - !*** ../app/src/lib/route.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Router": () => (/* binding */ Router) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_event_target__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/event-target */ "../core/src/event-target.ts"); - -class Router extends _padloc_core_src_event_target__WEBPACK_IMPORTED_MODULE_0__.EventEmitter { - constructor(basePath = "/") { - super(); - this.basePath = basePath; - this.history = []; - window.addEventListener("popstate", () => { - this._pathChanged(); - }); - this._pathChanged(); - } - _pathChanged() { - const index = (history.state && history.state.historyIndex) || 0; - const path = this.path; - const direction = this.history.length - 1 < index ? "forward" : "backward"; - if (this.history.length === index) { - this.history.push(path); - } - else - while (this.history.length - 1 > index) { - this.history.pop(); - } - this.dispatch("route-changed", { path, direction }); - } - get path() { - return window.location.pathname.replace(new RegExp("^" + this.basePath), ""); - } - get params() { - const params = {}; - for (const [key, value] of new URLSearchParams(window.location.search)) { - params[key] = value; - } - return params; - } - set params(params) { - history.replaceState({ historyIndex: this.history.length - 1 }, "", this.basePath + this.path + "?" + new URLSearchParams(params).toString()); - this.dispatch("params-changed", { params }); - } - get canGoBack() { - return this.history.length > 1; - } - go(path, params, replace = false) { - params = params || this.params; - // Clean out properties with value undefined - for (const [key, value] of Object.entries(params)) { - if (typeof value === "undefined") { - delete params[key]; - } - } - const queryString = new URLSearchParams(params).toString(); - if (path !== this.path || queryString !== window.location.search) { - let url = this.basePath + path; - if (queryString) { - url += "?" + queryString; - } - if (replace) { - history.replaceState({ historyIndex: this.history.length - 1 }, "", url); - } - else { - history.pushState({ historyIndex: this.history.length }, "", url); - } - this._pathChanged(); - } - } - forward() { - history.forward(); - } - back(alternate = "") { - if (this.canGoBack) { - history.back(); - } - else { - this.go(alternate); - } - } -} - - -/***/ }), - -/***/ "../app/src/lib/singleton.ts": -/*!***********************************!*\ - !*** ../app/src/lib/singleton.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getSingleton": () => (/* binding */ getSingleton) -/* harmony export */ }); -const singletons = {}; -let container; -function getSingleton(elName) { - if (!container) { - container = document.querySelector("[singleton-container]"); - } - let el = singletons[elName]; - if (!el) { - singletons[elName] = el = document.createElement(elName); - container.appendChild(el); - } - return el; -} - - -/***/ }), - -/***/ "../app/src/lib/util.ts": -/*!******************************!*\ - !*** ../app/src/lib/util.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "loadScript": () => (/* binding */ loadScript), -/* harmony export */ "formatDateFromNow": () => (/* binding */ formatDateFromNow), -/* harmony export */ "passwordStrength": () => (/* binding */ passwordStrength), -/* harmony export */ "toggleAttribute": () => (/* binding */ toggleAttribute), -/* harmony export */ "mediaType": () => (/* binding */ mediaType), -/* harmony export */ "fileIcon": () => (/* binding */ fileIcon), -/* harmony export */ "fileSize": () => (/* binding */ fileSize), -/* harmony export */ "mask": () => (/* binding */ mask), -/* harmony export */ "isTouch": () => (/* binding */ isTouch) -/* harmony export */ }); -const loaded = new Map(); -function loadScript(src, global) { - if (loaded.has(src)) { - return loaded.get(src); - } - const s = document.createElement("script"); - s.src = src; - s.type = "text/javascript"; - const p = new Promise((resolve, reject) => { - s.onload = () => resolve(global ? window[global] : undefined); - s.onerror = (e) => reject(e); - document.head.appendChild(s); - }); - loaded.set(src, p); - return p; -} -async function formatDateFromNow(date, addSuffix = true) { - const { distanceInWordsToNow } = await __webpack_require__.e(/*! import() | date-fns */ "date-fns").then(__webpack_require__.t.bind(__webpack_require__, /*! date-fns */ "../app/node_modules/date-fns/index.js", 23)); - return distanceInWordsToNow(date, { addSuffix }); -} -async function passwordStrength(pwd) { - // @ts-ignore - const { default: zxcvbn } = await __webpack_require__.e(/*! import() | zxcvbn */ "zxcvbn").then(__webpack_require__.t.bind(__webpack_require__, /*! zxcvbn */ "../app/node_modules/zxcvbn/lib/main.js", 23)); - return zxcvbn(pwd); -} -function toggleAttribute(el, attr, on) { - if (on) { - el.setAttribute(attr, ""); - } - else { - el.removeAttribute(attr); - } -} -function mediaType(mimeType) { - const match = mimeType.match(/(.*)\/(.*)/); - const [, type, subtype] = match || ["", "", ""]; - switch (type) { - case "video": - return "video"; - case "audio": - return "audio"; - case "image": - return "image"; - case "text": - switch (subtype) { - case "csv": - // return "csv"; - case "plain": - return "text"; - default: - return "code"; - } - case "application": - switch (subtype) { - case "pdf": - return "pdf"; - case "json": - return "code"; - case "pkcs8": - case "pkcs10": - case "pkix-cert": - case "pkix-crl": - case "pkcs7-mime": - case "x-x509-ca-cert": - case "x-x509-user-cert": - case "x-pkcs12": - case "x-pkcs7-certificates": - case "x-pkcs7-mime": - case "x-pkcs7-crl": - case "x-pem-file": - case "x-pkcs12": - case "x-pkcs7-certreqresp": - return "certificate"; - case "zip": - case "x-7z-compressed": - case "x-freearc": - case "x-bzip": - case "x-bzip2": - case "java-archive": - case "x-rar-compressed": - case "x-tar": - return "archive"; - } - default: - return ""; - } -} -function fileIcon(mimeType) { - const mType = mediaType(mimeType); - return mType ? `file-${mType}` : "file"; -} -function fileSize(size = 0) { - return size < 1e6 ? Math.ceil(size / 10) / 100 + " KB" : Math.ceil(size / 10000) / 100 + " MB"; -} -function mask(value) { - return value && value.replace(/[^\n]/g, "\u2022"); -} -function isTouch() { - return window.matchMedia("(hover: none)").matches; -} - - -/***/ }), - -/***/ "../app/src/mixins/auto-lock.ts": -/*!**************************************!*\ - !*** ../app/src/mixins/auto-lock.ts ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AutoLock": () => (/* binding */ AutoLock) -/* harmony export */ }); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); - -function AutoLock(baseClass) { - return class extends baseClass { - constructor(...args) { - super(...args); - this._pausedAt = null; - document.addEventListener("click", () => this._startTimer()); - document.addEventListener("keydown", () => this._startTimer()); - document.addEventListener("pause", () => this._pause()); - document.addEventListener("resume", () => this._resume()); - } - get _lockDelay() { - return _globals__WEBPACK_IMPORTED_MODULE_0__.app.settings.autoLockDelay * 60 * 1000; - } - _cancelAutoLock() { - this._pausedAt = null; - if (this._lockTimeout) { - clearTimeout(this._lockTimeout); - } - // if (this._lockNotificationTimeout) { - // clearTimeout(this._lockNotificationTimeout); - // } - } - // Handler for cordova `pause` event. Records the current time for auto locking when resuming - _pause() { - this._pausedAt = new Date(); - } - // Handler for cordova `resume` event. If auto lock is enabled and the specified time has passed - // since the app was paused, locks the app - _resume() { - if (_globals__WEBPACK_IMPORTED_MODULE_0__.app.settings.autoLock && - !_globals__WEBPACK_IMPORTED_MODULE_0__.app.state.locked && - this._pausedAt && - new Date().getTime() - this._pausedAt.getTime() > this._lockDelay) { - this._doLock(); - } - this._startTimer(); - } - _doLock() { - // if app is currently syncing restart the timer - if (_globals__WEBPACK_IMPORTED_MODULE_0__.app.state.syncing) { - this._startTimer(); - return; - } - _globals__WEBPACK_IMPORTED_MODULE_0__.app.lock(); - } - _startTimer() { - this._cancelAutoLock(); - if (_globals__WEBPACK_IMPORTED_MODULE_0__.app.settings.autoLock && !_globals__WEBPACK_IMPORTED_MODULE_0__.app.state.locked) { - this._lockTimeout = window.setTimeout(() => this._doLock(), this._lockDelay); - // this._lockNotificationTimeout = setTimeout(() => { - // if (!this.locked && !this._pausedAt) { - // this.notify($l("Auto-lock in 10 seconds"), "info", 3000); - // } - // }, this._lockDelay - 10000); - } - } - }; -} - - -/***/ }), - -/***/ "../app/src/mixins/auto-sync.ts": -/*!**************************************!*\ - !*** ../app/src/mixins/auto-sync.ts ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AutoSync": () => (/* binding */ AutoSync) -/* harmony export */ }); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); - -function AutoSync(baseClass) { - return class extends baseClass { - constructor(...args) { - super(...args); - _globals__WEBPACK_IMPORTED_MODULE_0__.app.loaded.then(() => this.startPeriodicSync()); - } - startPeriodicSync() { - setTimeout(async () => { - if (_globals__WEBPACK_IMPORTED_MODULE_0__.app.state.loggedIn && !_globals__WEBPACK_IMPORTED_MODULE_0__.app.state.locked) { - try { - await _globals__WEBPACK_IMPORTED_MODULE_0__.app.synchronize(); - } - catch (e) { - await this.handleError(e); - } - } - this.startPeriodicSync(); - }, _globals__WEBPACK_IMPORTED_MODULE_0__.app.settings.syncInterval * 60 * 1000); - } - }; -} - - -/***/ }), - -/***/ "../app/src/mixins/error-handling.ts": -/*!*******************************************!*\ - !*** ../app/src/mixins/error-handling.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ErrorHandling": () => (/* binding */ ErrorHandling) -/* harmony export */ }); -/* harmony import */ var _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/core/src/error */ "../core/src/error.ts"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); - - - - -function ErrorHandling(baseClass) { - return class extends baseClass { - constructor(...args) { - super(...args); - window.addEventListener("error", (e) => this.handleError(e.error)); - window.addEventListener("unhandledrejection", (e) => this.handleError(e.reason)); - } - async handleError(error) { - error = - error instanceof _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.Err - ? error - : error instanceof Error - ? new _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.Err(_padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.UNKNOWN_ERROR, error.message, { error }) - : new _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.Err(_padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.UNKNOWN_ERROR, error.toString()); - switch (error.code) { - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.FAILED_CONNECTION: - // A failed connection is interpreted as the user simply being offline, - // which is indicated in another place in the UI - return true; - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.INVALID_SESSION: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.SESSION_EXPIRED: - await _globals__WEBPACK_IMPORTED_MODULE_2__.app.logout(); - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Your session has expired. Please log in again!"), { preventAutoClose: true }); - _globals__WEBPACK_IMPORTED_MODULE_2__.router.go("login"); - return true; - // These are expected to occur during a user lifecycle and can be ingored. - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.ACCOUNT_EXISTS: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.MFA_REQUIRED: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.MFA_FAILED: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.MFA_TRIES_EXCEEDED: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.ORG_FROZEN: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.ORG_QUOTA_EXCEEDED: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.MEMBER_QUOTA_EXCEEDED: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.GROUP_QUOTA_EXCEEDED: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.VAULT_QUOTA_EXCEEDED: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.STORAGE_QUOTA_EXCEEDED: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.BILLING_ERROR: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.OUTDATED_REVISION: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.MISSING_ACCESS: - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.INVALID_CREDENTIALS: - return true; - case _padloc_core_src_error__WEBPACK_IMPORTED_MODULE_0__.ErrorCode.UNSUPPORTED_VERSION: - await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_3__.alert)(error.message || - (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Some data associated with your account was saved with a newer version of " + - "Padloc and cannot be decoded. Please install the latest version Padloc!"), { title: (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Update Required"), type: "warning" }); - default: - _globals__WEBPACK_IMPORTED_MODULE_2__.app.state._errors.push(error); - _globals__WEBPACK_IMPORTED_MODULE_2__.app.publish(); - } - return false; - } - }; -} - - -/***/ }), - -/***/ "../app/src/mixins/service-worker.ts": -/*!*******************************************!*\ - !*** ../app/src/mixins/service-worker.ts ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "ServiceWorker": () => (/* binding */ ServiceWorker) -/* harmony export */ }); -/* harmony import */ var workbox_window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! workbox-window */ "../app/node_modules/workbox-window/build/workbox-window.prod.es5.mjs"); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _lib_dialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/dialog */ "../app/src/lib/dialog.ts"); - - - -function ServiceWorker(baseClass) { - return class extends baseClass { - constructor(...args) { - super(...args); - if (true) { - this.initSW(); - } - } - async _updateReady() { - const confirmed = await (0,_lib_dialog__WEBPACK_IMPORTED_MODULE_2__.confirm)((0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("A new update is ready to install! Do you want to install it now?"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Install & Reload"), (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_1__.translate)("Later"), { preventAutoClose: true }); - if (confirmed) { - // set up a listener that will reload the page as soon as the - // previously waiting service worker has taken control. - this._wb.addEventListener("controlling", () => { - window.location.reload(); - }); - // Send a message telling the service worker to skip waiting. - // This will trigger the `controlling` event handler above. - this._wb.messageSW({ type: "INSTALL_UPDATE" }); - } - } - initSW() { - if (!("serviceWorker" in navigator)) { - return; - } - this._wb = new workbox_window__WEBPACK_IMPORTED_MODULE_0__.Workbox("/sw.js"); - // Add an event listener to detect when the registered - // service worker has installed but is waiting to activate. - this._wb.addEventListener("waiting", () => { - setTimeout(() => { - this._updateReady(); - }, 1000); - }); - this._wb.register(); - } - checkForUpdates() { - this._wb.register(); - } - }; -} - - -/***/ }), - -/***/ "../app/src/mixins/state.ts": -/*!**********************************!*\ - !*** ../app/src/mixins/state.ts ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "StateMixin": () => (/* binding */ StateMixin) -/* harmony export */ }); -/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../globals */ "../app/src/globals.ts"); - -const StateMixin = (baseElement) => class extends baseElement { - constructor() { - super(...arguments); - this._stateHandler = this.stateChanged.bind(this); - } - get app() { - return _globals__WEBPACK_IMPORTED_MODULE_0__.app; - } - get state() { - return _globals__WEBPACK_IMPORTED_MODULE_0__.app.state; - } - connectedCallback() { - super.connectedCallback(); - _globals__WEBPACK_IMPORTED_MODULE_0__.app.subscribe(this._stateHandler); - this.stateChanged(); - } - disconnectedCallback() { - _globals__WEBPACK_IMPORTED_MODULE_0__.app.unsubscribe(this._stateHandler); - super.disconnectedCallback(); - } - /** - * The `stateChanged()` method will be called when the state is updated. - */ - stateChanged() { - this.requestUpdate(); - } -}; - - -/***/ }), - -/***/ "../app/src/styles/config.ts": -/*!***********************************!*\ - !*** ../app/src/styles/config.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "narrowWidth": () => (/* binding */ narrowWidth), -/* harmony export */ "wideWidth": () => (/* binding */ wideWidth), -/* harmony export */ "cssVars": () => (/* binding */ cssVars) -/* harmony export */ }); -/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-element */ "../app/node_modules/lit-element/lit-element.js"); - -const narrowWidth = 700; -const wideWidth = 1200; -const cssVars = lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - :host { - --font-family: "Nunito"; - --font-family-fallback: sans-serif; - --font-family-mono: "Inconsolata"; - - --font-size-micro: 12px; - --font-size-tiny: 14px; - --font-size-small: 16px; - --font-size-default: 18px; - --font-weight-thin: 100; - --font-weight-light: 300; - --font-weight-regular: 400; - --font-weight-bold: 700; - - --color-primary: #3bb7f9; - --color-secondary: #444; - --color-tertiary: #ffffff; - --color-quaternary: #fafafa; - /* --color-negative: #D7322D; */ - --color-negative: #ff6666; - - --color-background: var(--color-tertiary); - --color-foreground: var(--color-secondary); - --color-highlight: var(--color-primary); - --color-error: var(--color-negative); - - --color-shade-1: rgba(0, 0, 0, 0.05); - --color-shade-2: rgba(0, 0, 0, 0.1); - --color-shade-3: rgba(0, 0, 0, 0.15); - --color-shade-4: rgba(0, 0, 0, 0.2); - - --color-gradient-highlight-from: rgb(7, 124, 185); - --color-gradient-highlight-to: rgb(89, 198, 255); - --color-gradient-warning-from: #f25b00; - --color-gradient-warning-to: #f49300; - --color-gradient-dark-from: #222; - --color-gradient-dark-to: #555; - - --color-scrim: rgba(255, 255, 255, 0.9); - - --color-btn-front: var(--color-foreground); - --color-btn-back: var(--shade-3-color); - - --row-height: 50px; - - --gutter-size: 8px; - --border-radius: 8px; - --border-color: rgba(0, 0, 0, 0.1); - - --toaster-easing: cubic-bezier(1, -0.3, 0, 1.3); - - --shade-1-color: transparent; - --shade-2-color: var(--color-shade-1); - --shade-3-color: var(--color-shade-2); - --shade-4-color: var(--color-shade-3); - --shade-5-color: var(--color-shade-4); - - --narrow-width: 700px; - --wide-width: 1200px; - } -`; - - -/***/ }), - -/***/ "../app/src/styles/index.ts": -/*!**********************************!*\ - !*** ../app/src/styles/index.ts ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "mixins": () => (/* reexport module object */ _mixins__WEBPACK_IMPORTED_MODULE_0__), -/* harmony export */ "config": () => (/* reexport module object */ _config__WEBPACK_IMPORTED_MODULE_1__), -/* harmony export */ "shared": () => (/* reexport safe */ _shared__WEBPACK_IMPORTED_MODULE_2__.shared) -/* harmony export */ }); -/* harmony import */ var _mixins__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mixins */ "../app/src/styles/mixins.ts"); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config */ "../app/src/styles/config.ts"); -/* harmony import */ var _shared__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shared */ "../app/src/styles/shared.ts"); - - - - - - -/***/ }), - -/***/ "../app/src/styles/mixins.ts": -/*!***********************************!*\ - !*** ../app/src/styles/mixins.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "unselectable": () => (/* binding */ unselectable), -/* harmony export */ "positionSticky": () => (/* binding */ positionSticky), -/* harmony export */ "fullbleed": () => (/* binding */ fullbleed), -/* harmony export */ "scroll": () => (/* binding */ scroll), -/* harmony export */ "ellipsis": () => (/* binding */ ellipsis), -/* harmony export */ "absoluteCenter": () => (/* binding */ absoluteCenter), -/* harmony export */ "shade1": () => (/* binding */ shade1), -/* harmony export */ "shade2": () => (/* binding */ shade2), -/* harmony export */ "shade3": () => (/* binding */ shade3), -/* harmony export */ "shade4": () => (/* binding */ shade4), -/* harmony export */ "shade5": () => (/* binding */ shade5), -/* harmony export */ "card": () => (/* binding */ card), -/* harmony export */ "gradientHighlight": () => (/* binding */ gradientHighlight), -/* harmony export */ "gradientWarning": () => (/* binding */ gradientWarning), -/* harmony export */ "gradientDark": () => (/* binding */ gradientDark), -/* harmony export */ "textShadow": () => (/* binding */ textShadow) -/* harmony export */ }); -/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-element */ "../app/node_modules/lit-element/lit-element.js"); - -const unselectable = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - cursor: default; - user-select: none; -`; -const positionSticky = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - position: -webkit-sticky; - position: -moz-sticky; - position: -o-sticky; - position: -ms-sticky; - position: sticky; -`; -const fullbleed = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - overflow: hidden; -`; -const scroll = (direction) => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - ${direction === "vertical" ? lit_element__WEBPACK_IMPORTED_MODULE_0__.css `overflow-y` : direction === "horizontal" ? lit_element__WEBPACK_IMPORTED_MODULE_0__.css `overflow-x` : lit_element__WEBPACK_IMPORTED_MODULE_0__.css `overflow`}: auto; - -webkit-overflow-scrolling: touch; -`; -const ellipsis = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -`; -const absoluteCenter = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - ${fullbleed()}; - margin: auto; -`; -const shade1 = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: var(--shade-1-color); -`; -const shade2 = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: var(--shade-2-color); -`; -const shade3 = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: var(--shade-3-color); -`; -const shade4 = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: var(--shade-4-color); -`; -const shade5 = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: var(--shade-5-color); -`; -const card = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: var(--color-background); - /* box-shadow: rgba(0, 0, 0, 0.2) 0 0 1px; */ - border-radius: var(--border-radius); - border: solid 1px rgba(0, 0, 0, 0.1); - border-bottom-width: 2px; - overflow: hidden; -`; -const gradientHighlight = (horizontal = false) => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: linear-gradient( - ${horizontal ? lit_element__WEBPACK_IMPORTED_MODULE_0__.css `90deg` : lit_element__WEBPACK_IMPORTED_MODULE_0__.css `0`}, - var(--color-gradient-highlight-from) 0%, - var(--color-gradient-highlight-to) 100% - ); -`; -const gradientWarning = (horizontal = false) => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: linear-gradient( - ${horizontal ? lit_element__WEBPACK_IMPORTED_MODULE_0__.css `90deg` : lit_element__WEBPACK_IMPORTED_MODULE_0__.css `0`}, - var(--color-gradient-warning-from) 0%, - var(--color-gradient-warning-to) 100% - ); -`; -const gradientDark = (horizontal = false) => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - background: linear-gradient( - ${horizontal ? lit_element__WEBPACK_IMPORTED_MODULE_0__.css `90deg` : lit_element__WEBPACK_IMPORTED_MODULE_0__.css `0`}, - var(--color-gradient-dark-from) 0%, - var(--color-gradient-dark-to) 100% - ); -`; -const textShadow = () => lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - text-shadow: rgba(0, 0, 0, 0.2) 0px 2px 0px; -`; - - -/***/ }), - -/***/ "../app/src/styles/shared.ts": -/*!***********************************!*\ - !*** ../app/src/styles/shared.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "shared": () => (/* binding */ shared) -/* harmony export */ }); -/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-element */ "../app/node_modules/lit-element/lit-element.js"); -/* harmony import */ var _mixins__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mixins */ "../app/src/styles/mixins.ts"); - - -const shared = lit_element__WEBPACK_IMPORTED_MODULE_0__.css ` - :host { - user-select: none; - -webkit-user-select: none; - } - - input, - textarea { - user-select: auto; - -webkit-user-select: auto; - } - - input[type="number"]::-webkit-outer-spin-button, - input[type="number"]::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - - input[type="number"] { - -moz-appearance: textfield; - } - - :host, - html, - button, - input, - textarea { - font-family: var(--font-family), var(--font-family-fallback); - font-weight: var(--font-weight-regular); - font-size: var(--font-size-default); - -webkit-font-smoothing: antialiased; - -webkit-tap-highlight-color: transparent; - } - - ::selection { - background: var(--color-secondary); - color: var(--color-tertiary); - } - - a { - text-decoration: underline; - color: inherit; - } - - button, - a.button { - display: inline-block; - color: inherit; - font-family: inherit; - font-size: inherit; - font-weight: inherit; - border: none; - margin: 0; - padding: 12px 15px; - cursor: pointer; - text-align: center; - text-shadow: inherit; - } - - button.icon { - display: flex; - align-items: center; - justify-content: center; - } - - button.icon pl-icon { - width: 30px; - height: 20px; - margin-left: -8px; - font-size: 90%; - } - - button.arrow, - a.button.arrow { - padding-right: 30px; - } - - button.arrow::before, - a.button.arrow::before { - font-family: "FontAwesome"; - content: "\\f054"; - display: block; - position: absolute; - top: 0; - right: 15px; - bottom: 0; - } - - button, - pl-loading-button, - pl-toggle-button, - a.button { - background: var(--color-btn-back); - border-radius: var(--border-radius); - } - - button.primary, - pl-loading-button.primary, - a.button.primary { - background: var(--color-highlight); - color: var(--color-tertiary); - font-weight: bold; - } - - button.negative, - pl-loading-button.negative, - a.button.negative { - background: var(--color-negative); - color: var(--color-tertiary); - font-weight: bold; - } - - button.transparent { - background: none; - } - - button.light { - color: var(--color-tertiary); - } - - input, - select { - border: none; - -webkit-appearance: none; - -mox-appearance: none; - appearance: none; - font-family: inherit; - font-size: inherit; - font-weight: inherit; - text-shadow: inherit; - color: inherit; - border-radius: 0; - background: transparent; - margin: 0; - padding: 0; - } - - textarea { - font-weight: inherit; - font-family: inherit; - font-size: inherit; - color: inherit; - border: none; - background: transparent; - margin: 0; - display: block; - padding: 0; - border-radius: 0; - appearance: none; - resize: none; - } - - textarea[nowrap] { - white-space: pre; - word-wrap: normal; - overflow-x: scroll; - } - - strong { - font-weight: var(--font-weight-bold); - } - - h1, - h2 { - font-weight: normal; - } - - h1 { - font-size: 150%; - margin: 20px; - } - - h2 { - font-size: 120%; - margin: 10px 20px 5px 20px; - } - - ::-webkit-search-cancel-button { - display: none; - } - - *:focus { - outline: none; - } - - ::-webkit-input-placeholder { - text-shadow: inherit; - color: inherit; - opacity: 0.6; - } - - ::-webkit-scrollbar { - display: none; - } - - [hidden] { - display: none !important; - } - - [invisible] { - opacity: 0; - } - - [disabled] { - opacity: 0.5; - pointer-events: none !important; - } - - section { - margin: 10px 5px; - } - - section > button { - width: 100%; - } - - header { - display: flex; - font-size: 120%; - padding: 10px; - background: var(--color-tertiary); - border-bottom: solid 3px var(--color-shade-1); - align-items: center; - font-weight: bold; - min-height: 40px; - } - - header pl-input { - height: auto; - background: transparent; - padding: 0 5px; - } - - header .title { - padding: 0 5px; - text-align: center; - } - - main { - flex: 1; - box-sizing: border-box; - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.scroll()} - overflow-x: hidden; - position: relative; - } - - ul { - list-style: none; - padding: 0; - margin: 0; - } - - .item { - border-radius: var(--border-radius); - background: var(--color-tertiary); - border: solid 1px var(--color-shade-1); - border-bottom-width: 3px; - margin: var(--gutter-size); - /*box-shadow: 0px 5px 5px -5px var(--color-shade-2), 0 0 2px var(--color-shade-1);*/ - } - - .item.error { - background: var(--color-negative); - color: var(--color-tertiary); - padding: 8px; - text-align: center; - } - - .item.padded { - padding: 8px; - } - - code { - font-family: var(--font-family-mono); - } - - pre { - font: inherit; - margin: 0; - } - - pl-dialog .message { - padding: 15px; - text-align: center; - } - - pl-dialog button, - pl-dialog pl-loading-button { - width: 100%; - box-sizing: border-box; - font-weight: bold; - } - - .layout { - display: flex; - } - - .layout.vertical { - flex-direction: column; - } - - .layout.align-center { - align-items: center; - } - - .layout.justify-center { - justify-content: center; - } - - .spacer, - .flex, - [flex] { - flex: 1; - } - - .tap { - position: relative; - cursor: pointer; - } - - .tap::after { - content: ""; - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: currentColor; - opacity: 0; - transition: opacity 1s; - pointer-events: none; - border-radius: inherit; - } - - .tap:active::after { - opacity: 0.3; - transition: none; - } - - .tap::before { - content: ""; - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: currentColor; - opacity: 0; - pointer-events: none; - border-radius: inherit; - } - - .tap:not(:active):hover::before { - opacity: 0.1; - } - - .tiles > :nth-child(8n + 1), - .tiles-1 { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.shade1()} - } - - .tiles > :nth-child(8n + 2), - .tiles-2 { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.shade2()} - } - - .tiles > :nth-child(8n + 3), - .tiles-3 { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.shade3()} - } - - .tiles > :nth-child(8n + 4), - .tiles-4 { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.shade4()} - } - - .tiles > :nth-child(8n + 5), - .tiles-5 { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.shade5()} - } - - .tiles > :nth-child(8n + 6), - .tiles-6 { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.shade4()} - } - - .tiles > :nth-child(8n + 7), - .tiles-7 { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.shade3()} - } - - .tiles > :nth-child(8n + 8), - .tiles-8 { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.shade2()} - } - - .ellipsis { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.ellipsis()} - } - - pl-icon[spin] { - animation: spin 1s infinite; - transform-origin: center 49%; - } - - .info { - display: flex; - align-items: center; - } - - .info-icon { - width: 80px; - height: 80px; - font-size: 46px; - margin: 10px 0 10px 10px; - } - - .info-body { - padding: 20px 15px 20px 10px; - flex: 1; - width: 0; - } - - .info-title { - font-size: 120%; - font-weight: bold; - margin-bottom: 5px; - } - - .info-text { - font-size: var(--font-size-small); - } - - .tags { - display: flex; - overflow-x: auto; - margin: 8px 0; - align-items: center; - -webkit-overflow-scrolling: touch; - } - - .tags::after { - content: ""; - display: block; - width: 1px; - flex: none; - } - - .tag { - color: var(--color-tertiary); - /*text-shadow: rgba(0, 0, 0, 0.2) 0 1px 0;*/ - font-weight: bold; - border-radius: var(--border-radius); - font-size: var(--font-size-tiny); - padding: 5px 8px; - line-height: normal; - text-align: center; - background: var(--color-secondary); - } - - .tag:not(:last-child) { - margin-right: 6px; - } - - .tag > * { - display: inline-block; - vertical-align: top; - } - - .tag pl-icon { - width: 20px; - height: 20px; - } - - .tag pl-icon:first-child { - margin-left: -2px; - } - - .tag pl-icon:last-child { - margin-right: -2px; - } - - .tag.ghost { - border: dashed 1px; - background: transparent; - color: var(--color-foreground); - } - - .tag.highlight { - background: var(--color-highlight); - } - - .tag.warning { - background: var(--color-negative); - } - - .tags.tiny .tag { - font-size: 12px; - padding: 4px 6px; - line-height: 14px; - border-radius: 6px; - } - - .tags.tiny pl-icon { - font-size: 10px; - width: 14px; - height: 14px; - } - - .tags.small .tag { - font-size: var(--font-size-micro); - padding: 4px 6px; - line-height: 16px; - } - - .tags.small pl-icon { - font-size: 10px; - width: 16px; - height: 16px; - } - - .record-tag.store-tag { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.gradientDark(true)} - text-shadow: rgba(0, 0, 0, 0.1) 0 1px 0; - } - - .fabs { - position: absolute; - z-index: 2; - left: 0; - right: 0; - bottom: 0; - pointer-events: none; - display: flex; - align-items: center; - } - - .fab { - pointer-events: auto; - border-radius: 45px; - margin: 12px; - box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px; - color: var(--color-tertiary); - width: 45px; - height: 45px; - text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0px; - background: var(--color-secondary); - } - - button.fab { - width: auto; - padding: 4px 20px; - font-weight: bold; - } - - .fab.primary { - background: var(--color-primary); - } - - .fab.light { - background: var(--color-tertiary); - color: var(--color-secondary); - text-shadow: none; - } - - .fab:not(:last-child) { - margin-right: 0; - } - - .fab.destructive { - background: var(--color-negative); - } - - .centering { - display: flex; - align-items: center; - justify-content: center; - } - - .empty-placeholder { - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.fullbleed()} - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; - padding: 20px; - } - - .empty-placeholder pl-icon { - width: 100px; - height: 100px; - font-size: 50px; - } - - .empty-placeholder > div { - width: 300px; - margin-bottom: 20px; - } - - .input-wrapper { - display: flex; - align-items: center; - padding: 0 10px; - } - - .input-wrapper pl-input { - padding: 0; - background: transparent; - } - - .tabs { - display: flex; - margin: 0 auto; - width: auto; - ${_mixins__WEBPACK_IMPORTED_MODULE_1__.scroll("horizontal")} - font-size: var(--font-size-default); - font-weight: bold; - } - - .tabs > * { - display: flex; - align-items: center; - justify-content: center; - padding: 10px 15px; - border-bottom: solid 3px var(--color-shade-1); - } - - .tabs > * > pl-icon { - margin-left: -10px; - font-size: 90%; - width: 35px; - height: 35px; - } - - .tabs > *[active] { - color: var(--color-highlight); - border-color: var(--color-highlight); - } - - .search-wrapper { - display: flex; - align-items: center; - position: sticky; - top: var(--gutter-size); - z-index: 5; - } - - .search-wrapper pl-icon { - opacity: 0.5; - margin-left: 5px; - } - - .search-wrapper pl-input { - font-size: var(--font-size-small); - height: auto; - flex: 1; - background: transparent; - padding-left: 5px; - } - - .note { - padding: 0; - font-size: var(--font-size-small); - font-weight: bold; - padding: 8px; - box-shadow: rgba(0, 0, 0, 0.3) 0 0 3px 0; - text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0; - background: var(--color-primary); - } - - .note.error { - background: var(--color-negative); - } - - @keyframes spin { - to { - transform: rotate(360deg); - } - } - - @keyframes slideIn { - from { - transform: translate(0, 50px); - opacity: 0; - } - to { - opacity: 1; - } - } - - @keyframes rumble { - 25% { - transform: translate(5px, 0); - } - 50% { - transform: translate(-5px, -3px); - } - 75% { - transform: translate(5px, 2px); - } - } - - @keyframes bounce { - from, - 20%, - 40%, - to { - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - 0% { - transform: scale3d(0.5, 0.5, 0.5); - } - - 33% { - transform: scale3d(1.05, 1.05, 1.05); - } - - 66% { - transform: scale3d(0.98, 0.98, 0.98); - } - - to { - transform: scale3d(1, 1, 1); - } - } - - @media (min-width: 701px) { - .menu-button { - visibility: hidden; - } - - .narrow { - display: none !important; - } - } - - @media (max-width: 700px) { - .wide { - display: none; - } - } -`; - - -/***/ }), - -/***/ "../core/src/account.ts": -/*!******************************!*\ - !*** ../core/src/account.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AccountSecrets": () => (/* binding */ AccountSecrets), -/* harmony export */ "Account": () => (/* binding */ Account) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./container */ "../core/src/container.ts"); -/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./session */ "../core/src/session.ts"); -/* harmony import */ var _quota__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./quota */ "../core/src/quota.ts"); -/* harmony import */ var _billing__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./billing */ "../core/src/billing.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - -class AccountSecrets extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor({ signingKey, privateKey, favorites } = {}) { - super(); - this.favorites = new Set(); - Object.assign(this, { signingKey, privateKey, favorites }); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], AccountSecrets.prototype, "signingKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], AccountSecrets.prototype, "privateKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSet)(), - __metadata("design:type", Object) -], AccountSecrets.prototype, "favorites", void 0); -/** - * The `Account` object represents an individual Padloc user and holds general - * account information as well as cryptographic keys necessary for accessing - * [[Vaults]] and signing/verifying [[Org]]anization details. - * - * The [[privateKey]] and [[signingKey]] properties are considered secret and - * therefore need to be encrypted at rest. For this, the [[Account]] object - * serves as a [[PBESContainer]] which is unlocked by the users **master - * password**. - */ -class Account extends _container__WEBPACK_IMPORTED_MODULE_4__.PBES2Container { - constructor() { - super(...arguments); - /** Unique account ID */ - this.id = ""; - /** The users email address */ - this.email = ""; - /** The users display name */ - this.name = ""; - /** When the account was created */ - this.created = new Date(); - /** when the account was last updated */ - this.updated = new Date(); - /** List of currently active sessions */ - this.sessions = []; - /** ID of the accounts main or "private" [[Vault]]. */ - this.mainVault = { id: "" }; - /** IDs of all organizations this account is a member of */ - this.orgs = []; - /** - * Revision id used for ensuring continuity when synchronizing the account - * object between client and server - */ - this.revision = ""; - this.quota = new _quota__WEBPACK_IMPORTED_MODULE_6__.AccountQuota(); - this.billingDisabled = false; - this.usedStorage = 0; - this.favorites = new Set(); - } - /** - * Whether or not this Account object is current "locked" or, in other words, - * whether the `privateKey` and `signingKey` properties have been decrypted. - */ - get locked() { - return !this.privateKey; - } - get masterKey() { - return this._key; - } - set masterKey(key) { - this._key = key; - } - /** - * Generates the accounts [[privateKey]], [[publicKey]] and [[signingKey]] and - * encrypts [[privateKey]] and [[singingKey]] using the master password. - */ - async initialize(password) { - const { publicKey, privateKey } = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().generateKey(new _crypto__WEBPACK_IMPORTED_MODULE_1__.RSAKeyParams()); - this.publicKey = publicKey; - this.privateKey = privateKey; - this.signingKey = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().generateKey(new _crypto__WEBPACK_IMPORTED_MODULE_1__.HMACKeyParams()); - await this.setPassword(password); - } - /** Updates the master password by reencrypting the [[privateKey]] and [[signingKey]] properties */ - async setPassword(password) { - await super.unlock(password); - await this._commitSecrets(); - this.updated = new Date(); - } - /** - * "Unlocks" the account by decrypting and extracting [[privateKey]] and - * [[signingKey]] from [[encryptedData]] - */ - async unlock(password) { - await super.unlock(password); - await this._loadSecrets(); - } - /** - * Unlocks the account by providing the encryption key directly rather than - * deriving it fro the master password - */ - async unlockWithMasterKey(key) { - this._key = key; - await this._loadSecrets(); - } - /** - * "Locks" the account by deleting all sensitive data from the object - */ - lock() { - super.lock(); - delete this.privateKey; - delete this.signingKey; - delete this.favorites; - } - clone() { - const clone = super.clone(); - clone.copySecrets(this); - return clone; - } - toString() { - return this.name || this.email; - } - /** - * Creates a signature that can be used later to verify an organizations id and public key - */ - async signOrg({ id, publicKey }) { - return (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().sign(this.signingKey, (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.concatBytes)([(0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(id), publicKey], 0x00), new _crypto__WEBPACK_IMPORTED_MODULE_1__.HMACParams()); - } - /** - * Verifies an organizations id an public key, using the signature stored - * in the [[Member]] object associated with the account. - */ - async verifyOrg(org) { - if (!this.signingKey) { - throw "Account needs to be unlocked first"; - } - const member = org.getMember(this); - if (!member) { - throw new _error__WEBPACK_IMPORTED_MODULE_3__.Err(_error__WEBPACK_IMPORTED_MODULE_3__.ErrorCode.VERIFICATION_ERROR, "Account is not a member."); - } - const verified = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().verify(this.signingKey, member.orgSignature, (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.concatBytes)([(0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(org.id), org.publicKey], 0x00), new _crypto__WEBPACK_IMPORTED_MODULE_1__.HMACParams()); - if (!verified) { - throw new _error__WEBPACK_IMPORTED_MODULE_3__.Err(_error__WEBPACK_IMPORTED_MODULE_3__.ErrorCode.VERIFICATION_ERROR, `Failed to verify public key of ${org.name}!`); - } - } - async toggleFavorite(id, favorite) { - favorite ? this.favorites.add(id) : this.favorites.delete(id); - await this._commitSecrets(); - } - copySecrets(account) { - this.privateKey = account.privateKey; - this.signingKey = account.signingKey; - this.favorites = account.favorites; - this._key = account._key; - } - async _loadSecrets() { - const secrets = new AccountSecrets().fromBytes(await this.getData()); - if (!secrets.favorites) { - secrets.favorites = new Set(); - } - Object.assign(this, secrets); - } - async _commitSecrets() { - const secrets = new AccountSecrets(this); - await this.setData(secrets.toBytes()); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Object) -], Account.prototype, "created", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Object) -], Account.prototype, "updated", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Object) -], Account.prototype, "publicKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.Exclude)(), - __metadata("design:type", Object) -], Account.prototype, "privateKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.Exclude)(), - __metadata("design:type", Object) -], Account.prototype, "signingKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_session__WEBPACK_IMPORTED_MODULE_5__.SessionInfo), - __metadata("design:type", Array) -], Account.prototype, "sessions", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_quota__WEBPACK_IMPORTED_MODULE_6__.AccountQuota), - __metadata("design:type", _quota__WEBPACK_IMPORTED_MODULE_6__.AccountQuota) -], Account.prototype, "quota", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_billing__WEBPACK_IMPORTED_MODULE_7__.BillingInfo), - __metadata("design:type", _billing__WEBPACK_IMPORTED_MODULE_7__.BillingInfo) -], Account.prototype, "billing", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.Exclude)(), - __metadata("design:type", Object) -], Account.prototype, "favorites", void 0); - - -/***/ }), - -/***/ "../core/src/api.ts": -/*!**************************!*\ - !*** ../core/src/api.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "CreateAccountParams": () => (/* binding */ CreateAccountParams), -/* harmony export */ "RecoverAccountParams": () => (/* binding */ RecoverAccountParams), -/* harmony export */ "RequestEmailVerificationParams": () => (/* binding */ RequestEmailVerificationParams), -/* harmony export */ "CompleteEmailVerificationParams": () => (/* binding */ CompleteEmailVerificationParams), -/* harmony export */ "RequestMFACodeParams": () => (/* binding */ RequestMFACodeParams), -/* harmony export */ "RetrieveMFATokenParams": () => (/* binding */ RetrieveMFATokenParams), -/* harmony export */ "RetrieveMFATokenResponse": () => (/* binding */ RetrieveMFATokenResponse), -/* harmony export */ "InitAuthParams": () => (/* binding */ InitAuthParams), -/* harmony export */ "InitAuthResponse": () => (/* binding */ InitAuthResponse), -/* harmony export */ "CreateSessionParams": () => (/* binding */ CreateSessionParams), -/* harmony export */ "GetInviteParams": () => (/* binding */ GetInviteParams), -/* harmony export */ "GetAttachmentParams": () => (/* binding */ GetAttachmentParams), -/* harmony export */ "DeleteAttachmentParams": () => (/* binding */ DeleteAttachmentParams), -/* harmony export */ "GetLegacyDataParams": () => (/* binding */ GetLegacyDataParams), -/* harmony export */ "API": () => (/* binding */ API) -/* harmony export */ }); -/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./session */ "../core/src/session.ts"); -/* harmony import */ var _account__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./account */ "../core/src/account.ts"); -/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./auth */ "../core/src/auth.ts"); -/* harmony import */ var _vault__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./vault */ "../core/src/vault.ts"); -/* harmony import */ var _org__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./org */ "../core/src/org.ts"); -/* harmony import */ var _invite__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./invite */ "../core/src/invite.ts"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _attachment__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./attachment */ "../core/src/attachment.ts"); -/* harmony import */ var _billing__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./billing */ "../core/src/billing.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./container */ "../core/src/container.ts"); -/* harmony import */ var _mfa__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./mfa */ "../core/src/mfa.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - -/** - * Api parameters for creating a new Account to be used with [[API.createAccount]]. - */ -class CreateAccountParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** - * The verification token obtained from [[API.completeEmailVerification]]. - */ - this.verify = ""; - /** - * The corresponding [[InviteID]] and [[OrgID]] if signup was initiated - * through an invite link. - * - * @optional - */ - this.invite = undefined; - props && Object.assign(this, props); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_6__.AsSerializable)(_account__WEBPACK_IMPORTED_MODULE_1__.Account), - __metadata("design:type", _account__WEBPACK_IMPORTED_MODULE_1__.Account) -], CreateAccountParams.prototype, "account", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_6__.AsSerializable)(_auth__WEBPACK_IMPORTED_MODULE_2__.Auth), - __metadata("design:type", _auth__WEBPACK_IMPORTED_MODULE_2__.Auth) -], CreateAccountParams.prototype, "auth", void 0); -/** - * Parameters for initiating account recovery to be used with [[API.recoverAccount]] - */ -class RecoverAccountParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** An email verification token obtained from [[API.completeEmailVerification]] */ - this.verify = ""; - props && Object.assign(this, props); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_6__.AsSerializable)(_account__WEBPACK_IMPORTED_MODULE_1__.Account), - __metadata("design:type", _account__WEBPACK_IMPORTED_MODULE_1__.Account) -], RecoverAccountParams.prototype, "account", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_6__.AsSerializable)(_auth__WEBPACK_IMPORTED_MODULE_2__.Auth), - __metadata("design:type", _auth__WEBPACK_IMPORTED_MODULE_2__.Auth) -], RecoverAccountParams.prototype, "auth", void 0); -/** - * Parameters for requesting email verfication through [[API.requestEmailVerification]] - * @deprecated since v3.1.0 - */ -class RequestEmailVerificationParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The email address to be verified */ - this.email = ""; - /** The purpose of the email verification */ - this.purpose = _mfa__WEBPACK_IMPORTED_MODULE_11__.MFAPurpose.Signup; - props && Object.assign(this, props); - } -} -/** - * Parameters for completing email verification through [[API.completeEmailVerification]] - * @deprecated since v3.1.0 - */ -class CompleteEmailVerificationParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The email address to be verified */ - this.email = ""; - /** The verification code received via email after calling [[API.requestEmailVerification]] */ - this.code = ""; - props && Object.assign(this, props); - } -} -/** - * Parameters for requesting Multi-Factor Authenticatino via [[API.requestMFACode]] - */ -class RequestMFACodeParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The accounts email address */ - this.email = ""; - /** The purpose of the email verification */ - this.purpose = _mfa__WEBPACK_IMPORTED_MODULE_11__.MFAPurpose.Login; - this.type = _mfa__WEBPACK_IMPORTED_MODULE_11__.MFAType.Email; - props && Object.assign(this, props); - } -} -/** - * Parameters for retrieving MFA token via [[API.retrieveMFAToken]] - */ -class RetrieveMFATokenParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The email address to be verified */ - this.email = ""; - /** The verification code received via email after calling [[API.requestEmailVerification]] */ - this.code = ""; - this.purpose = _mfa__WEBPACK_IMPORTED_MODULE_11__.MFAPurpose.Login; - props && Object.assign(this, props); - } -} -class RetrieveMFATokenResponse extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The verification token which can be used to authenticate certain requests */ - this.token = ""; - /** Whether the user already has an account */ - this.hasAccount = false; - /** Whether the user has a legacy account */ - this.hasLegacyAccount = false; - /** Token for getting legacy data. */ - this.legacyToken = undefined; - props && Object.assign(this, props); - } -} -/** - * Parameters for initiating authentication through [[API.initAuth]] - */ -class InitAuthParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The email address of the [[Account]] in question */ - this.email = ""; - /** - * The verification token obtained from [[API.completeEmailVerification]]. - */ - this.verify = undefined; - props && Object.assign(this, props); - } -} -/** - * The response object received from [[API.initAuth]] - */ -class InitAuthResponse extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The account id */ - this.account = ""; - /** The key derivation parameters used for authentication */ - this.keyParams = new _crypto__WEBPACK_IMPORTED_MODULE_9__.PBKDF2Params(); - props && Object.assign(this, props); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_6__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_9__.PBKDF2Params), - __metadata("design:type", _crypto__WEBPACK_IMPORTED_MODULE_9__.PBKDF2Params) -], InitAuthResponse.prototype, "keyParams", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_6__.AsBytes)(), - __metadata("design:type", Uint8Array) -], InitAuthResponse.prototype, "B", void 0); -/** - * Parameters for creating a new [[Session]] through [[API.createSession]] - */ -class CreateSessionParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The id of the [[Account]] to create the session for */ - this.account = ""; - props && Object.assign(this, props); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_6__.AsBytes)(), - __metadata("design:type", Uint8Array) -], CreateSessionParams.prototype, "M", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_6__.AsBytes)(), - __metadata("design:type", Uint8Array) -], CreateSessionParams.prototype, "A", void 0); -/** - * Parameters for fetching an [[Invite]] - */ -class GetInviteParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The organization id */ - this.org = ""; - /** The invite id */ - this.id = ""; - props && Object.assign(this, props); - } -} -/** - * Parameters for fetching an [[Attachment]] - */ -class GetAttachmentParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(props) { - super(); - /** The vault id */ - this.vault = ""; - /** The attachment id */ - this.id = ""; - props && Object.assign(this, props); - } -} -class DeleteAttachmentParams extends GetAttachmentParams { -} -class GetLegacyDataParams extends _encoding__WEBPACK_IMPORTED_MODULE_6__.Serializable { - constructor(vals = {}) { - super(); - this.email = ""; - this.verify = undefined; - Object.assign(this, vals); - } -} -/** - * Decorator for defining request handler methods - */ -function Handler(input, output) { - return (proto, method) => { - if (!proto.handlerDefinitions) { - proto.handlerDefinitions = []; - } - proto.handlerDefinitions.push({ - method, - input: input === String ? undefined : input, - output: output === String ? undefined : output - }); - }; -} -/** - * Transport-agnostic interface defining communication - * between [[Client]] and [[Server]] instances. - */ -class API { - /** - * Request verification of a given email address. This will send a verification code - * to the email in question which can then be exchanged for a verification token via - * [[completeEmailVerification]]. - * @deprecated since v3.1.0 - */ - requestEmailVerification(_params) { - throw "Not implemented"; - } - /** - * Complete the email verification process by providing a verification code received - * via email. Returns a verification token that can be used in other api calls like - * [[createAccount]] or [[recoverAccount]]. - * @deprecated since v3.1.0 - */ - completeEmailVerification(_params) { - throw "Not implemented"; - } - /** - * Request verification of a given email address. This will send a verification code - * to the email in question which can then be exchanged for a verification token via - * [[completeEmailVerification]]. - */ - requestMFACode(_params) { - throw "Not implemented"; - } - /** - * Complete the email verification process by providing a verification code received - * via email. Returns a verification token that can be used in other api calls like - * [[createAccount]] or [[recoverAccount]]. - */ - retrieveMFAToken(_params) { - throw "Not implemented"; - } - /** - * Initiate the login procedure for a given account by requesting the authentication params - * which are required for proceeding with [[createSession]]. - */ - initAuth(_params) { - throw "Not implemented"; - } - /** - * Update the authentication params stored on the server. This is usually used - * in case a users master password has changed. - */ - updateAuth(_params) { - throw "Not implemented"; - } - /** - * Create new [[Session]] which can be used to authenticate future request - */ - createSession(_params) { - throw "Not implemented"; - } - /** - * Revoke a [[Session]], effectively logging out any client authenticated with it - */ - revokeSession(_id) { - throw "Not implemented"; - } - /** - * Create a new [[Account]] - */ - createAccount(_params) { - throw "Not implemented"; - } - /** - * Get the [[Account]] associated with the current session - * - * @authentication_required - */ - getAccount() { - throw "Not implemented"; - } - /** - * Update the [[Account]] associated with the current session. - * - * @authentication_required - */ - updateAccount(_account) { - throw "Not implemented"; - } - /** - * Initiate account recovery - */ - recoverAccount(_params) { - throw "Not implemented"; - } - /** - * Delete current account - */ - deleteAccount() { - throw "Not implemented"; - } - /** - * Create a new [[Org]] - * - * @authentication_required - */ - createOrg(_params) { - throw "Not implemented"; - } - /** - * Get the [[Org]] for a given `id`. - * - * @authentication_required - * - * Requires the authenticated account to be a member of the given organization - */ - getOrg(_id) { - throw "Not implemented"; - } - /** - * Updates a given [[Org]] - * - * @authentication_required - * - * Updating members, organization name or pubic/private keys requires the [[OrgRole.Owner]] - * role, while any other changes require the [[OrgRole.Admin]] role. - */ - updateOrg(_org) { - throw "Not implemented"; - } - deleteOrg(_id) { - throw "Not implemented"; - } - /** - * Create a new vault - * - * @authentication_required - * - * Requires the [[OrgRole.Admin]] role on the associated organization - */ - createVault(_vault) { - throw "Not implemented"; - } - /** - * Get the [[Vault]] with the given `id` - * - * @authentiation_required - * - * If the vault belongs to an organization, the authenticated account needs to - * be assigned to the given vault either directly or through a [[Group]]. - * Otherwise, only access to the accounts private vault is allowed. - */ - getVault(_id) { - throw "Not implemented"; - } - /** - * Update the given [[Vault]] - * - * @authentiation_required - * - * If vault belongs to an organization, the authenticated account needs to - * be be assigned to the given vault either directly or through a [[Group]] - * and have explicit write access. Otherwise, only access to the accounts - * private vault is allowed. - */ - updateVault(_vault) { - throw "Not implemented"; - } - /** - * Delete the [[Vault]] with the given `id` - * - * @authentication_required - * - * Requires at least the [[OrgRole.Admin]] role on the organization the vault - * belongs to. Private vaults cannot be deleted. - */ - deleteVault(_id) { - throw "Not implemented"; - } - /** - * Get an [[Invite]]. - * - * @authentication_required - * - * Requires the authenticated account to either be an [[OrgRole.Owner]] of - * the associated organization or the recipient of the invite. - */ - getInvite(_params) { - throw "Not implemented"; - } - /** - * Accept an [[Invite]] - * - * @authentication_required - * - * Requires the authenticated account to be the recipient of the invite. - */ - acceptInvite(_invite) { - throw "Not implemented"; - } - createAttachment(_attachment) { - throw "Not implemented"; - } - getAttachment(_attachment) { - throw "Not implemented"; - } - deleteAttachment(_attachment) { - throw "Not implemented"; - } - updateBilling(_params) { - throw "Not implemented"; - } - getBillingProviders() { - throw "Not implemented"; - } - getLegacyData(_params) { - throw "Not implemented"; - } - deleteLegacyAccount() { - throw "Not implemented"; - } -} -__decorate([ - Handler(RequestEmailVerificationParams, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [RequestEmailVerificationParams]), - __metadata("design:returntype", Object) -], API.prototype, "requestEmailVerification", null); -__decorate([ - Handler(CompleteEmailVerificationParams, String), - __metadata("design:type", Function), - __metadata("design:paramtypes", [CompleteEmailVerificationParams]), - __metadata("design:returntype", Object) -], API.prototype, "completeEmailVerification", null); -__decorate([ - Handler(RequestMFACodeParams, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [RequestMFACodeParams]), - __metadata("design:returntype", Object) -], API.prototype, "requestMFACode", null); -__decorate([ - Handler(RetrieveMFATokenParams, RetrieveMFATokenResponse), - __metadata("design:type", Function), - __metadata("design:paramtypes", [RetrieveMFATokenParams]), - __metadata("design:returntype", Object) -], API.prototype, "retrieveMFAToken", null); -__decorate([ - Handler(InitAuthParams, InitAuthResponse), - __metadata("design:type", Function), - __metadata("design:paramtypes", [InitAuthParams]), - __metadata("design:returntype", Object) -], API.prototype, "initAuth", null); -__decorate([ - Handler(_auth__WEBPACK_IMPORTED_MODULE_2__.Auth, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_auth__WEBPACK_IMPORTED_MODULE_2__.Auth]), - __metadata("design:returntype", Object) -], API.prototype, "updateAuth", null); -__decorate([ - Handler(CreateSessionParams, _session__WEBPACK_IMPORTED_MODULE_0__.Session), - __metadata("design:type", Function), - __metadata("design:paramtypes", [CreateSessionParams]), - __metadata("design:returntype", Object) -], API.prototype, "createSession", null); -__decorate([ - Handler(String, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", Object) -], API.prototype, "revokeSession", null); -__decorate([ - Handler(CreateAccountParams, _account__WEBPACK_IMPORTED_MODULE_1__.Account), - __metadata("design:type", Function), - __metadata("design:paramtypes", [CreateAccountParams]), - __metadata("design:returntype", Object) -], API.prototype, "createAccount", null); -__decorate([ - Handler(undefined, _account__WEBPACK_IMPORTED_MODULE_1__.Account), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Object) -], API.prototype, "getAccount", null); -__decorate([ - Handler(_account__WEBPACK_IMPORTED_MODULE_1__.Account, _account__WEBPACK_IMPORTED_MODULE_1__.Account), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_account__WEBPACK_IMPORTED_MODULE_1__.Account]), - __metadata("design:returntype", Object) -], API.prototype, "updateAccount", null); -__decorate([ - Handler(RecoverAccountParams, _account__WEBPACK_IMPORTED_MODULE_1__.Account), - __metadata("design:type", Function), - __metadata("design:paramtypes", [RecoverAccountParams]), - __metadata("design:returntype", Object) -], API.prototype, "recoverAccount", null); -__decorate([ - Handler(undefined, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Object) -], API.prototype, "deleteAccount", null); -__decorate([ - Handler(_org__WEBPACK_IMPORTED_MODULE_4__.Org, _org__WEBPACK_IMPORTED_MODULE_4__.Org), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_org__WEBPACK_IMPORTED_MODULE_4__.Org]), - __metadata("design:returntype", Object) -], API.prototype, "createOrg", null); -__decorate([ - Handler(undefined, _org__WEBPACK_IMPORTED_MODULE_4__.Org), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", Object) -], API.prototype, "getOrg", null); -__decorate([ - Handler(_org__WEBPACK_IMPORTED_MODULE_4__.Org, _org__WEBPACK_IMPORTED_MODULE_4__.Org), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_org__WEBPACK_IMPORTED_MODULE_4__.Org]), - __metadata("design:returntype", Object) -], API.prototype, "updateOrg", null); -__decorate([ - Handler(String, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", Object) -], API.prototype, "deleteOrg", null); -__decorate([ - Handler(_vault__WEBPACK_IMPORTED_MODULE_3__.Vault, _vault__WEBPACK_IMPORTED_MODULE_3__.Vault), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_vault__WEBPACK_IMPORTED_MODULE_3__.Vault]), - __metadata("design:returntype", Object) -], API.prototype, "createVault", null); -__decorate([ - Handler(String, _vault__WEBPACK_IMPORTED_MODULE_3__.Vault), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", Object) -], API.prototype, "getVault", null); -__decorate([ - Handler(_vault__WEBPACK_IMPORTED_MODULE_3__.Vault, _vault__WEBPACK_IMPORTED_MODULE_3__.Vault), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_vault__WEBPACK_IMPORTED_MODULE_3__.Vault]), - __metadata("design:returntype", Object) -], API.prototype, "updateVault", null); -__decorate([ - Handler(String, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [String]), - __metadata("design:returntype", Object) -], API.prototype, "deleteVault", null); -__decorate([ - Handler(GetInviteParams, _invite__WEBPACK_IMPORTED_MODULE_5__.Invite), - __metadata("design:type", Function), - __metadata("design:paramtypes", [GetInviteParams]), - __metadata("design:returntype", Object) -], API.prototype, "getInvite", null); -__decorate([ - Handler(_invite__WEBPACK_IMPORTED_MODULE_5__.Invite, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_invite__WEBPACK_IMPORTED_MODULE_5__.Invite]), - __metadata("design:returntype", Object) -], API.prototype, "acceptInvite", null); -__decorate([ - Handler(_attachment__WEBPACK_IMPORTED_MODULE_7__.Attachment, String), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_attachment__WEBPACK_IMPORTED_MODULE_7__.Attachment]), - __metadata("design:returntype", Object) -], API.prototype, "createAttachment", null); -__decorate([ - Handler(GetAttachmentParams, _attachment__WEBPACK_IMPORTED_MODULE_7__.Attachment), - __metadata("design:type", Function), - __metadata("design:paramtypes", [GetAttachmentParams]), - __metadata("design:returntype", Object) -], API.prototype, "getAttachment", null); -__decorate([ - Handler(DeleteAttachmentParams, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [DeleteAttachmentParams]), - __metadata("design:returntype", Object) -], API.prototype, "deleteAttachment", null); -__decorate([ - Handler(_billing__WEBPACK_IMPORTED_MODULE_8__.UpdateBillingParams, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", [_billing__WEBPACK_IMPORTED_MODULE_8__.UpdateBillingParams]), - __metadata("design:returntype", Object) -], API.prototype, "updateBilling", null); -__decorate([ - Handler(undefined, _billing__WEBPACK_IMPORTED_MODULE_8__.BillingProviderInfo), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Object) -], API.prototype, "getBillingProviders", null); -__decorate([ - Handler(GetLegacyDataParams, _container__WEBPACK_IMPORTED_MODULE_10__.PBES2Container), - __metadata("design:type", Function), - __metadata("design:paramtypes", [GetLegacyDataParams]), - __metadata("design:returntype", Object) -], API.prototype, "getLegacyData", null); -__decorate([ - Handler(undefined, undefined), - __metadata("design:type", Function), - __metadata("design:paramtypes", []), - __metadata("design:returntype", Object) -], API.prototype, "deleteLegacyAccount", null); - - -/***/ }), - -/***/ "../core/src/app.ts": -/*!**************************!*\ - !*** ../core/src/app.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Stats": () => (/* binding */ Stats), -/* harmony export */ "Settings": () => (/* binding */ Settings), -/* harmony export */ "Index": () => (/* binding */ Index), -/* harmony export */ "AppState": () => (/* binding */ AppState), -/* harmony export */ "App": () => (/* binding */ App) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./storage */ "../core/src/storage.ts"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _invite__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./invite */ "../core/src/invite.ts"); -/* harmony import */ var _vault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./vault */ "../core/src/vault.ts"); -/* harmony import */ var _org__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./org */ "../core/src/org.ts"); -/* harmony import */ var _item__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./item */ "../core/src/item.ts"); -/* harmony import */ var _account__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./account */ "../core/src/account.ts"); -/* harmony import */ var _auth__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./auth */ "../core/src/auth.ts"); -/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./session */ "../core/src/session.ts"); -/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./api */ "../core/src/api.ts"); -/* harmony import */ var _client__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./client */ "../core/src/client.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util */ "../core/src/util.ts"); -/* harmony import */ var _srp__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./srp */ "../core/src/srp.ts"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -/* harmony import */ var _attachment__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./attachment */ "../core/src/attachment.ts"); -/* harmony import */ var _billing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./billing */ "../core/src/billing.ts"); -/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./container */ "../core/src/container.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - - - - - - - - - - - - - -/** Various usage stats */ -class Stats extends _encoding__WEBPACK_IMPORTED_MODULE_2__.Serializable { -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsDate)(), - __metadata("design:type", Date) -], Stats.prototype, "lastSync", void 0); -/** Various application settings */ -class Settings extends _encoding__WEBPACK_IMPORTED_MODULE_2__.Serializable { - constructor() { - super(...arguments); - /** Whether to lock app automatically after a certain period of inactivity */ - this.autoLock = true; - /** Duration after which auto-lock is triggered, in minutes */ - this.autoLockDelay = 5; - /** Interval for automatic sync, in minutes */ - this.syncInterval = 1; - /** Time threshold used for filtering "recent" items, in days */ - this.recentLimit = 7; - } -} -class Index extends _encoding__WEBPACK_IMPORTED_MODULE_2__.Serializable { - constructor() { - super(...arguments); - this.hashParams = new _crypto__WEBPACK_IMPORTED_MODULE_19__.PBKDF2Params({ iterations: 1 }); - this.items = []; - } - async fromItems(items) { - const crypto = (0,_platform__WEBPACK_IMPORTED_MODULE_12__.getCryptoProvider)(); - if (!this.hashParams.salt.length) { - this.hashParams.salt = await crypto.randomBytes(16); - } - this.items = (await Promise.all(items.map(async (item) => ({ - hosts: (await Promise.all(item.fields - .filter(f => f.type === "url") - .map(async (f) => { - // try to parse host from url. if url is not valid, - // assume the url field contains just the domain. - let host = f.value; - try { - host = new URL(f.value).host; - } - catch (e) { } - if (!host) { - return null; - } - const hashedHost = await crypto.deriveKey((0,_encoding__WEBPACK_IMPORTED_MODULE_2__.stringToBytes)(host), this.hashParams); - return (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.bytesToBase64)(hashedHost); - }))).filter(h => h !== null) - })))).filter(item => item.hosts.length); - } - async matchHost(host) { - const hashedHost = (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.bytesToBase64)(await (0,_platform__WEBPACK_IMPORTED_MODULE_12__.getCryptoProvider)().deriveKey((0,_encoding__WEBPACK_IMPORTED_MODULE_2__.stringToBytes)(host), this.hashParams)); - return this.items.filter(item => item.hosts.some(h => h === hashedHost)).length; - } - async fuzzyMatchHost(host) { - // Try exact match first, then try to add/remove "www." - return ((await this.matchHost(host)) || - (host.startsWith("www.") ? this.matchHost(host.slice(4)) : this.matchHost("www." + host))); - } - async matchUrl(url) { - try { - const { host } = new URL(url); - return this.fuzzyMatchHost(host); - } - catch (e) { - return 0; - } - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_19__.PBKDF2Params), - __metadata("design:type", Object) -], Index.prototype, "hashParams", void 0); -/** Application state */ -class AppState extends _storage__WEBPACK_IMPORTED_MODULE_1__.Storable { - constructor() { - super(...arguments); - this.id = "app-state"; - /** Application Settings */ - this.settings = new Settings(); - /** Usage data */ - this.stats = new Stats(); - /** Info about current device */ - this.device = new _platform__WEBPACK_IMPORTED_MODULE_12__.DeviceInfo(); - /** Current [[Session]] */ - this.session = null; - /** Currently logged in [[Account]] */ - this.account = null; - /** All organizations the current [[account]] is a member of. */ - this.orgs = []; - /** All vaults the current [[account]] has access to. */ - this.vaults = []; - /** Whether a sync is currently in process. */ - this.syncing = false; - /** Whether the app has an internet connection at the moment */ - this.online = true; - this.rememberedMasterKey = null; - this.billingProvider = null; - this.currentHost = ""; - this.index = new Index(); - /** IDs of most recently used items. The most recently used item is last */ - this.lastUsed = new Map(); - this._errors = []; - } - /** All [[Tag]]s found within the users [[Vault]]s */ - get tags() { - const tags = new Map(); - for (const vault of this.vaults) { - for (const item of vault.items) { - for (const tag of item.tags) { - if (!tags.has(tag)) { - tags.set(tag, 0); - } - tags.set(tag, tags.get(tag) + 1); - } - } - } - return [...tags.entries()]; - } - /** Whether the app is in "locked" state */ - get locked() { - return !this.account || this.account.locked; - } - /** Whether a user is logged in */ - get loggedIn() { - return !!this.session; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(Settings), - __metadata("design:type", Object) -], AppState.prototype, "settings", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(Stats), - __metadata("design:type", Object) -], AppState.prototype, "stats", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(_platform__WEBPACK_IMPORTED_MODULE_12__.DeviceInfo), - __metadata("design:type", Object) -], AppState.prototype, "device", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(_session__WEBPACK_IMPORTED_MODULE_9__.Session), - __metadata("design:type", Object) -], AppState.prototype, "session", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(_account__WEBPACK_IMPORTED_MODULE_7__.Account), - __metadata("design:type", Object) -], AppState.prototype, "account", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(_org__WEBPACK_IMPORTED_MODULE_5__.Org), - __metadata("design:type", Array) -], AppState.prototype, "orgs", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(_vault__WEBPACK_IMPORTED_MODULE_4__.Vault), - __metadata("design:type", Array) -], AppState.prototype, "vaults", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(_container__WEBPACK_IMPORTED_MODULE_18__.SimpleContainer), - __metadata("design:type", Object) -], AppState.prototype, "rememberedMasterKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(_billing__WEBPACK_IMPORTED_MODULE_17__.BillingProviderInfo), - __metadata("design:type", Object) -], AppState.prototype, "billingProvider", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsSerializable)(Index), - __metadata("design:type", Index) -], AppState.prototype, "index", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.Serialize)({ - arrayDeserializeIndividually: false, - fromRaw: (raw) => new Map(raw.map(([id, date]) => [id, new Date(date)])), - toRaw: (val) => [...val] - }), - __metadata("design:type", Object) -], AppState.prototype, "lastUsed", void 0); -/** - * The `App` class is *the* user-facing top level component encapsulating all - * functionality of the Padloc client app. It is responsible for managing - * state, client-side persistence and synchronization with the [[Server]] and - * exposes methods for manipulating a users [[Account]], [[Org]]anizations and - * [[Vault]]s. - * - * [[App]] is completely platform-agnostic and can be used in any environment - * capable of running JavaScript. It does however rely on platform-specific - * providers for a number of features like storage and encryption which can - * be "plugged in" as needed. - * - * ### Encryption - * - * The `@padloc/core` module does not provide or depend on any specific - * implementation of cryptographic primitives but instead relies on - * the [[CryptoProvider]] interface to provide those. - * - * Users of the [[App]] class (and of the `@padloc/core` package in general) - * are responsible for ensuring that a secure implemenation of the - * [[CryptoProvider]] interface is available before using any methods that - * require cryptographic functionality. This is done through the - * `crypto.setProvider` function (see example below). - * - * ### Platform API - * - * Certain functionality requires access to some platform APIs. For this, - * an implementation of the [[Platform]] interface can be provided via - * `platform.setPlatform`. - * - * ### Persistent Storage - * - * Persistent storage is provided by an implementation of the [[Storage]] - * interface. - * - * ### Data Transport - * - * The [[Sender]] interface handles communication with the [[Server]] instance - * through a RPC [[Request]]-[[Response]] cycle. The implementation provided - * should match the [[Receiver]] implementation used in the [[Server]] - * instance. - * - * ### Initialization Example - * - * ```ts - * @import { setProvider } from "@padloc/core/src/crypto"; - * @import { setPlatform } from "@padloc/core/src/platform"; - * - * setProvider(new NodeCryptoProvider()); - * setPlatform(new NodePlatform()); - * - * const app = new App(new LevelDBStorage(), new HTTPSender()); - * - * app.loaded.then(() => console.log("app ready!"); - * ``` - */ -class App { - constructor( - /** Data transport provider */ - sender, storage = (0,_platform__WEBPACK_IMPORTED_MODULE_12__.getStorage)()) { - /** App version */ - this.version = "3.0"; - /** Application state */ - this.state = new AppState(); - this._queuedSyncPromises = new Map(); - this._activeSyncPromises = new Map(); - this._subscriptions = []; - this._cachedAuthInfo = new Map(); - /** - * Notifies all subscribers of a [[state]] change - */ - this.publish = (0,_util__WEBPACK_IMPORTED_MODULE_13__.throttle)(() => { - for (const fn of this._subscriptions) { - fn(this.state); - } - }, 1000); - this.storage = storage; - this.api = new _client__WEBPACK_IMPORTED_MODULE_11__.Client(this.state, sender, (_req, _res, err) => { - const online = !err || err.code !== _error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.FAILED_CONNECTION; - if (online !== this.state.online) { - this.setState({ online }); - } - }); - this.loaded = this.load(); - } - /** Promise that resolves once all current synchronization processes are complete */ - get syncComplete() { - return Promise.all([...this._activeSyncPromises.values(), ...this._queuedSyncPromises.values()]); - } - /** Current account */ - get account() { - return this.state.account; - } - /** Current session */ - get session() { - return this.state.session; - } - /** The current accounts organizations */ - get orgs() { - return this.state.orgs.sort(); - } - /** The current accounts vaults */ - get vaults() { - return this.state.vaults.sort(); - } - /** Application settings */ - get settings() { - return this.state.settings; - } - /** The current users main, or "private" [[Vault]] */ - get mainVault() { - return (this.account && this.getVault(this.account.mainVault.id)) || null; - } - get online() { - return this.state.online; - } - get supportsBiometricUnlock() { - return this.state.device.supportsBioAuth && this.state.device.supportsKeyStore; - } - get remembersMasterKey() { - return !!this.state.rememberedMasterKey; - } - get billingEnabled() { - return !!this.state.billingProvider && !(this.state.account && this.state.account.billingDisabled); - } - get count() { - const count = { - favorites: 0, - attachments: 0, - recent: 0, - total: 0, - currentHost: this.state.currentHost ? this.getItemsForHost(this.state.currentHost).length : 0 - }; - const recentThreshold = new Date(Date.now() - this.settings.recentLimit * 24 * 60 * 60 * 1000); - for (const vault of this.vaults) { - for (const item of vault.items) { - count.total++; - if (this.account && this.account.favorites.has(item.id)) { - count.favorites++; - } - if (item.attachments.length) { - count.attachments++; - } - if (this.state.lastUsed.has(item.id) && this.state.lastUsed.get(item.id) > recentThreshold) { - count.recent++; - } - } - } - return count; - } - /** Save application state to persistent storage */ - async save() { - await this.loaded; - if (!this.state.locked) { - await this.state.index.fromItems(this.state.vaults.reduce((items, v) => [...items, ...v.items], [])); - } - await this.storage.save(this.state); - } - /** Load application state from persistent storage */ - async load() { - // Try to load app state from persistent storage. - try { - this.setState(await this.storage.get(AppState, this.state.id)); - } - catch (e) { } - // Update device info - const { id, ...rest } = await (0,_platform__WEBPACK_IMPORTED_MODULE_12__.getDeviceInfo)(); - Object.assign(this.state.device, rest); - try { - await (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.loadLanguage)(this.state.device.locale); - } - catch (e) { - // Failed to load language, so we'll fallback to default (English) - } - // If no device id has been set yet, generate a new one - if (!this.state.device.id) { - this.state.device.id = await (0,_util__WEBPACK_IMPORTED_MODULE_13__.uuid)(); - } - // Save back to storage - await this.storage.save(this.state); - this.loadBillingProvider(); - // Notify state change - this.publish(); - } - async reload() { - const masterKey = this.account && this.account.masterKey; - await this.load(); - if (masterKey) { - await this.unlockWithMasterKey(masterKey); - } - } - /** - * Unlocks the current [[Account]] and all available [[Vaults]]. - */ - async unlock(password) { - if (!this.account) { - throw "Unlocking only works if the user is logged in!"; - } - // Unlock account using the master password - await this.account.unlock(password); - await this._unlocked(); - } - /** - * Locks the app and wipes all sensitive information from memory. - */ - async lock() { - [this.account, ...this.state.orgs, ...this.state.vaults].forEach(each => each.lock()); - this.publish(); - } - /** - * Synchronizes the current account and all of the accounts organizations - * and vaults - */ - async synchronize() { - this.setState({ syncing: true }); - await this.fetchAccount(); - await this.fetchOrgs(); - await this.syncVaults(); - await this.save(); - this.setStats({ lastSync: new Date() }); - this.publish(); - } - /** - * Notifies of changes to the app [[state]] via the provided function - * - * @returns A unsubscribe function - */ - subscribe(fn) { - this._subscriptions.push(fn); - return () => this.unsubscribe(fn); - } - /** - * Unsubscribes a function previously subscribed through [[subscribe]]. - */ - unsubscribe(fn) { - this._subscriptions = this._subscriptions.filter(f => f === fn); - } - /** - * Updates the app [[state]] - */ - setState(state) { - Object.assign(this.state, state); - this.publish(); - } - /** Update usage data */ - async setStats(obj) { - Object.assign(this.state.stats, obj); - await this.save(); - this.publish(); - } - /** Update application settings */ - async setSettings(obj) { - Object.assign(this.state.settings, obj); - await this.save(); - this.publish(); - } - /* - * =============================== - * ACCOUNT & SESSION MANGAGEMENT - * =============================== - */ - /** Request email verification for a given `email`. */ - async requestMFACode(email, purpose) { - return this.api.requestMFACode(new _api__WEBPACK_IMPORTED_MODULE_10__.RequestMFACodeParams({ email, purpose })); - } - /** Complete email with the given `code` */ - async retrieveMFAToken(email, code, purpose) { - return this.api.retrieveMFAToken(new _api__WEBPACK_IMPORTED_MODULE_10__.RetrieveMFATokenParams({ email, code, purpose })); - } - /** - * Creates a new Padloc [[Account]] and signs in the user. - */ - async signup({ - /** The desired email address */ - email, - /** The users master password */ - password, - /** The desired display name */ - name, - /** Verification token obtained trough [[completeEmailVerification]] */ - verify, - /** Information about the [[Invite]] object if signup was initiated through invite link */ - invite }) { - // Inialize account object - const account = new _account__WEBPACK_IMPORTED_MODULE_7__.Account(); - account.email = email; - account.name = name; - await account.initialize(password); - // Initialize auth object - const auth = new _auth__WEBPACK_IMPORTED_MODULE_8__.Auth(email); - const authKey = await auth.getAuthKey(password); - // Calculate verifier - const srp = new _srp__WEBPACK_IMPORTED_MODULE_14__.Client(); - await srp.initialize(authKey); - auth.verifier = srp.v; - // Send off request to server - await this.api.createAccount(new _api__WEBPACK_IMPORTED_MODULE_10__.CreateAccountParams({ - account, - auth, - verify, - invite - })); - // Sign into new account - await this.login(email, password); - } - /** - * Log in user, creating a new [[Session]], loading [[Account]] info and - * fetching all of the users [[Org]]anizations and [[Vault]]s. - */ - async login(email, password, verify) { - if (!this._cachedAuthInfo.has(email)) { - // Fetch authentication info - this._cachedAuthInfo.set(email, await this.api.initAuth(new _api__WEBPACK_IMPORTED_MODULE_10__.InitAuthParams({ email, verify }))); - } - const { account: accId, keyParams, B } = this._cachedAuthInfo.get(email); - const auth = new _auth__WEBPACK_IMPORTED_MODULE_8__.Auth(email); - auth.keyParams = keyParams; - // Generate auth secret - const authKey = await auth.getAuthKey(password); - // Initialize SRP object - const srp = new _srp__WEBPACK_IMPORTED_MODULE_14__.Client(); - await srp.initialize(authKey); - await srp.setB(B); - // Create session object - const session = await this.api.createSession(new _api__WEBPACK_IMPORTED_MODULE_10__.CreateSessionParams({ account: accId, A: srp.A, M: srp.M1 })); - // Apply session key and update state - session.key = srp.K; - this.setState({ session }); - // Fetch and unlock account object - const account = await this.api.getAccount(); - await account.unlock(password); - this.setState({ account }); - // Save application state - await this.save(); - // Load organizations and vaults - await this.synchronize(); - } - /** - * Logs out user and clears all sensitive information - */ - async logout() { - await this._logout(); - this.publish(); - } - async deleteAccount() { - await this.api.deleteAccount(); - await this._logout(); - } - async _logout() { - this._cachedAuthInfo.clear(); - if (await this.canRememberMasterKey()) { - await this.forgetMasterKey(); - } - // Revoke session - try { - await this.api.revokeSession(this.state.session.id); - } - catch (e) { } - // Reset application state - this.setState({ - account: null, - session: null, - vaults: [], - orgs: [], - index: new Index() - }); - await this.save(); - } - /** - * Updates the users master password - */ - async changePassword(password) { - // TODO: Add option to rotate keys - await this.updateAccount(async (account) => { - // Update account object - await account.setPassword(password); - // Update auth object - const auth = new _auth__WEBPACK_IMPORTED_MODULE_8__.Auth(account.email); - auth.account = account.id; - const authKey = await auth.getAuthKey(password); - const srp = new _srp__WEBPACK_IMPORTED_MODULE_14__.Client(); - await srp.initialize(authKey); - auth.verifier = srp.v; - await this.api.updateAuth(auth); - }); - if (await this.canRememberMasterKey()) { - await this.forgetMasterKey(); - } - } - /** - * Fetches the users [[Account]] info from the [[Server]] - */ - async fetchAccount() { - const account = await this.api.getAccount(); - // Copy over secret properties so we don't have to - // unlock the account object again. - if (this.account) { - account.copySecrets(this.account); - } - // Update and save state - this.setState({ account }); - await this.save(); - } - /** - * Updates the users [[Account]] information - * @param transform A function applying the changes to the account - */ - async updateAccount(transform) { - if (!this.account) { - throw "User needs to be logged in in order to update their account!"; - } - // Create a clone of the current account to prevent inconsistencies in - // case something goes wrong. - let account = this.account.clone(); - // Apply changes - await transform(account); - // Send request to server - try { - account = await this.api.updateAccount(account); - } - catch (e) { - // If account has been updated since last fetch, - // get the current version and then retry - if (e.code === _error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.OUTDATED_REVISION) { - await this.fetchAccount(); - await this.updateAccount(transform); - } - else { - throw e; - } - } - // Copy over secret properties so we don't have to unlock the - // account object again. - account.copySecrets(this.account); - // Update and save state - this.setState({ account }); - await this.save(); - } - /** - * Revokes the given [[Session]] - */ - async revokeSession({ id }) { - await this.api.revokeSession(id); - await this.fetchAccount(); - } - /** - * Initiates account recovery allowing a user to regain control of their - * account in case they forget their master password. This results in the - * following: - * - * - All of the accounts cryptographic keys are rotated. - * - The accounts sensitive data is encrypted with the new master password. - * - The accounts authentication info is updated to reflect the password change. - * - The accounts private vault is reset (and the data within it lost). - * - The cryptographic keys of all [[Org]]anizations owned by the account will be - * rotated and all members suspended until reconfirmed. - * - The accounts memberships to any [[Org]]ganizations not owned by it will be - * suspended until reconfirmed. - * - * The user will automatically get logged in during this process - * so a separate login is not necessary. - */ - async recoverAccount({ - /** Account email */ - email, - /** New master password */ - password, - /** Verification token obtained trough [[completeEmailVerification]] */ - verify }) { - // Log out user (if logged in) - await this._logout(); - // Initialize account with new password - let account = new _account__WEBPACK_IMPORTED_MODULE_7__.Account(); - account.email = email; - await account.initialize(password); - // Initialize auth object with new password - const auth = new _auth__WEBPACK_IMPORTED_MODULE_8__.Auth(email); - const authKey = await auth.getAuthKey(password); - const srp = new _srp__WEBPACK_IMPORTED_MODULE_14__.Client(); - await srp.initialize(authKey); - auth.verifier = srp.v; - // Send account recovery request to the server, updating account and - // authentication info. This will also suspend the accounts membership - // to any organizations not owned by them. - await this.api.recoverAccount(new _api__WEBPACK_IMPORTED_MODULE_10__.RecoverAccountParams({ - account, - auth, - verify - })); - // Sign in user using the new password - await this.login(email, password); - // Rotate keys of all owned organizations. Suspend all other members - // and create invites to reconfirm the membership. - for (const org of this.state.orgs.filter(o => o.isOwner(account))) { - await this.rotateOrgKeys(org); - } - } - async rotateOrgKeys(org) { - const account = this.account; - return this.updateOrg(org.id, async (org) => { - // Rotate org encryption key - delete org.encryptedData; - await org.updateAccessors([account]); - // Rotate other cryptographic keys - await org.generateKeys(); - org.invites = []; - // Suspend members and create confirmation invites - for (const member of org.members.filter(m => m.id !== account.id)) { - member.role = _org__WEBPACK_IMPORTED_MODULE_5__.OrgRole.Suspended; - const invite = new _invite__WEBPACK_IMPORTED_MODULE_3__.Invite(member.email, "confirm_membership"); - await invite.initialize(org, this.account); - org.invites.push(invite); - } - // Update own membership - await org.addOrUpdateMember({ - id: account.id, - email: account.email, - name: account.name, - publicKey: account.publicKey, - orgSignature: await account.signOrg(org), - role: _org__WEBPACK_IMPORTED_MODULE_5__.OrgRole.Owner - }); - }); - } - canRememberMasterKey() { - return (0,_platform__WEBPACK_IMPORTED_MODULE_12__.isKeyStoreAvailable)(); - } - async rememberMasterKey() { - if (!this.account || this.account.locked) { - throw "App needs to be unlocked first"; - } - const key = await (0,_platform__WEBPACK_IMPORTED_MODULE_12__.getCryptoProvider)().generateKey(new _crypto__WEBPACK_IMPORTED_MODULE_19__.AESKeyParams()); - await (0,_platform__WEBPACK_IMPORTED_MODULE_12__.keyStoreSet)("master_key_encryption_key", (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.bytesToBase64)(key)); - const container = new _container__WEBPACK_IMPORTED_MODULE_18__.SimpleContainer(); - await container.unlock(key); - await container.setData(this.account.masterKey); - this.setState({ rememberedMasterKey: container }); - await this.save(); - } - async forgetMasterKey() { - try { - await (0,_platform__WEBPACK_IMPORTED_MODULE_12__.keyStoreDelete)("master_key_encryption_key"); - } - catch (e) { } - this.setState({ rememberedMasterKey: null }); - await this.save(); - } - async unlockWithRememberedMasterKey() { - const encryptedMasterKey = this.state.rememberedMasterKey; - const key = (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.base64ToBytes)(await (0,_platform__WEBPACK_IMPORTED_MODULE_12__.keyStoreGet)("master_key_encryption_key")); - await encryptedMasterKey.unlock(key); - const masterKey = await encryptedMasterKey.getData(); - await this.unlockWithMasterKey(masterKey); - } - async unlockWithMasterKey(key) { - await this.account.unlockWithMasterKey(key); - await this._unlocked(); - } - /** - * ================== - * VAULT MANAGEMENT - * ================== - */ - /** Get the [[Vault]] with the given `id` */ - getVault(id) { - return this.state.vaults.find(vault => vault.id === id); - } - /** Locally update the given `vault` object */ - putVault(vault) { - this.setState({ - vaults: [...this.state.vaults.filter(v => v.id !== vault.id), vault] - }); - } - isMainVault(vault) { - return vault && this.account && this.account.mainVault.id === vault.id; - } - /** Create a new [[Vault]] */ - async createVault(name, org, members = [], groups = []) { - let vault = new _vault__WEBPACK_IMPORTED_MODULE_4__.Vault(); - vault.name = name; - vault.org = { id: org.id, name: org.name }; - vault = await this.api.createVault(vault); - await this.fetchOrg(org); - await this.updateOrg(org.id, async (org) => { - groups.forEach(({ name, readonly }) => { - const group = org.getGroup(name); - if (!group) { - setTimeout(() => { - throw `Group not found: ${name}`; - }); - return; - } - group.vaults.push({ id: vault.id, readonly }); - }); - members.forEach(({ id, readonly }) => { - const member = org.getMember({ id }); - if (!member) { - setTimeout(() => { - throw `Member not found: ${id}`; - }); - return; - } - member.vaults.push({ id: vault.id, readonly }); - }); - }); - await this.synchronize(); - return vault; - } - /** Update [[Vault]] name and access (not the vaults contents) */ - async updateVaultAccess( - /** Organization owning the vault */ - orgId, - /** The vault id */ - id, - /** The new vault name */ - name, - /** Organization members that should have access to the vault */ - members = [], - /** Groups that should have access to the vault */ - groups = []) { - if (!members.length && !groups.length) { - throw new Error("You have to assign at least one member or group!"); - } - await this.updateOrg(orgId, async (org) => { - // Update name (the name of the actual [[Vault]] name will be - // updated in the background) - org.vaults.find(v => v.id === id).name = name; - // Update group access - for (const group of org.groups) { - // remove previous vault entry - group.vaults = group.vaults.filter(v => v.id !== id); - // update vault entry - const selection = groups.find(g => g.name === group.name); - if (selection) { - group.vaults.push({ id, readonly: selection.readonly }); - } - } - // Update member access - for (const member of org.members) { - // remove previous vault entry - member.vaults = member.vaults.filter(v => v.id !== id); - // update vault entry - const selection = members.find(m => m.id === member.id); - if (selection) { - member.vaults.push({ id, readonly: selection.readonly }); - } - } - }); - this.synchronize(); - } - /** Commit changes to vault object and save locally */ - async saveVault(vault) { - await vault.commit(); - this.putVault(vault); - await this.save(); - } - /** Delete [[Vault]] */ - async deleteVault(id) { - await this.api.deleteVault(id); - await this.synchronize(); - } - /** Synchronize the given [[Vault]] */ - async syncVault(vault) { - return this._queueSync(vault, (vault) => this._syncVault(vault)); - } - /** Synchronize all vaults the current user has access to. */ - async syncVaults() { - if (!this.account) { - return; - } - // Sync private vault - const promises = [this.syncVault(this.account.mainVault)]; - // Sync vaults assigned to through organizations - for (const org of this.state.orgs) { - // Sync all vaults for this organization - for (const vault of org.getVaultsForMember(this.account)) { - promises.push(this.syncVault(vault)); - } - } - // clean up vaults the user no longer has access to - const removeVaults = new Set(); - for (const vault of this.state.vaults) { - const org = vault.org && this.getOrg(vault.org.id); - if (vault.id !== this.account.mainVault.id && - (!org || !org.vaults.find(v => v.id === vault.id) || !org.canRead(vault, this.account))) { - removeVaults.add(vault.id); - } - } - await this.setState({ - vaults: this.state.vaults.filter(v => !removeVaults.has(v.id)) - }); - await Promise.all(promises); - } - async fetchVault({ id, revision }) { - if (!this.account) { - console.error("need to be logged in to fetch vault!"); - return null; - } - let localVault = this.getVault(id); - if (localVault && revision && localVault.revision === revision) { - return localVault; - } - let remoteVault = null; - let result; - try { - // Fetch and unlock remote vault - remoteVault = await this.api.getVault(id); - } - catch (e) { - if (localVault && e.code !== _error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.FAILED_CONNECTION) { - localVault.error = e; - } - } - if (!remoteVault) { - return null; - } - try { - await remoteVault.unlock(this.account); - } - catch (e) { - if (localVault) { - localVault.error = e; - return localVault; - } - else { - remoteVault.error = e; - this.putVault(remoteVault); - return remoteVault; - } - } - // Merge changes - if (localVault) { - result = this.getVault(id); - try { - await result.unlock(this.account); - result.merge(remoteVault); - } - catch (e) { - result = remoteVault; - } - } - else { - result = remoteVault; - } - // Migrate favorites from "old" favoriting mechanism - for (const item of result.items) { - if (item.favorited && item.favorited.includes(this.account.id)) { - this.account.favorites.add(item.id); - item.favorited = item.favorited.filter(acc => acc !== this.account.id); - result.items.update(item); - } - } - await this.saveVault(result); - return result; - } - async updateVault({ id }, tries = 0) { - if (!this.account) { - throw "need to be logged in to update vault!"; - } - let vault = this.getVault(id); - const org = vault.org && this.getOrg(vault.org.id); - const accessors = (org ? org.getAccessors(vault) : [this.account]); - const accessorsChanged = vault.accessors.length !== accessors.length || - accessors.some(a => vault.accessors.some(b => a.id !== b.id)); - if ((org && org.isSuspended(this.account)) || (!vault.items.hasChanges && !accessorsChanged)) { - // No changes - skipping update - return vault; - } - if (org && !org.canWrite(vault, this.account)) { - // User does'nt have write access; dismiss changes and bail out; - vault.items.clearChanges(); - return vault; - } - const updateStarted = new Date(); - vault = vault.clone(); - vault.items.clearChanges(); - await vault.commit(); - try { - // // Make sure the organization revision matches the one the vault is based on - if (vault.org && (!org || org.revision !== vault.org.revision)) { - if (tries > 3) { - throw new _error__WEBPACK_IMPORTED_MODULE_15__.Err(_error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.OUTDATED_REVISION, (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Local changes to this vault could not be synchronized because there was a problem " + - "retrieving information for this vaults organization. If this problem persists " + - "please contact customer support!")); - } - // Get the latest organization and vault info, then try again - await this.fetchOrg({ id: vault.org.id }); - await this.fetchVault({ id }); - return this.updateVault(vault, tries + 1); - } - } - catch (e) { - this.getVault(vault.id).error = e; - return null; - } - // Update accessors - if (org) { - try { - if (org.frozen) { - throw new _error__WEBPACK_IMPORTED_MODULE_15__.Err(_error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.ORG_FROZEN, (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Synching local changes failed because the organization this vault belongs to is frozen.")); - } - if (!org.canWrite(vault, this.account)) { - throw new _error__WEBPACK_IMPORTED_MODULE_15__.Err(_error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.INSUFFICIENT_PERMISSIONS, (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Synching local changes failed because you don't have write permissions for this vault.")); - } - // Look up which members should have access to this vault - const accessors = org.getAccessors(vault); - // Verify member details - await this.account.verifyOrg(org); - await org.verifyAll(accessors); - // Update accessors - await vault.updateAccessors(accessors); - } - catch (e) { - this.getVault(vault.id).error = e; - return null; - } - } - else { - await vault.updateAccessors([this.account]); - } - // Push updated vault object to [[Server]] - try { - vault = await this.api.updateVault(vault); - await vault.unlock(this.account); - const existing = this.getVault(vault.id); - // Clear changes that happened before the sync started (retaining any changes made while - // the sync was in progress) - existing.items.clearChanges(updateStarted); - // Merge changes back into existing vault (also updating revisision etc.) - existing.merge(vault); - // Comit changes and update local state - await existing.commit(); - this.putVault(existing); - if (org) { - org.revision = vault.org.revision; - org.vaults.find(v => v.id === vault.id).revision = vault.revision; - this.putOrg(org); - this.account.orgs.find(o => o.id === org.id).revision = org.revision; - } - else { - this.account.mainVault.revision = vault.revision; - } - await this.save(); - return existing; - } - catch (e) { - // The server will reject the update if the vault revision does - // not match the current revision on the server, in which case we'll - // have to fetch the current vault version and try again. - if (e.code === _error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.OUTDATED_REVISION) { - await this.fetchVault({ id }); - return this.updateVault({ id }); - } - if (e.code !== _error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.FAILED_CONNECTION) { - this.getVault(vault.id).error = e; - } - return vault; - } - } - /** Whether the current user has write permissions to the given `vault`. */ - hasWritePermissions(vault) { - // No organization means its the users private vault so they naturally have write access - if (!vault.org) { - return true; - } - const org = this.getOrg(vault.org.id); - return org.canWrite(vault, this.account); - } - async _syncVault(vault) { - await this.fetchVault(vault); - return this.updateVault(vault); - } - /** - * ======================= - * Vault Item Management - * ======================= - */ - /** Get the [[VaultItem]] and [[Vault]] for the given item `id` */ - getItem(id) { - for (const vault of this.state.vaults) { - const item = vault.items.get(id); - if (item) { - return { item, vault }; - } - } - return null; - } - /** Adds a number of `items` to the given `vault` */ - async addItems(items, { id }) { - const vault = this.getVault(id); - vault.items.update(...items); - await this.saveVault(vault); - this.syncVault(vault); - } - /** Creates a new [[VaultItem]] */ - async createItem(name, vault, fields, tags) { - const item = await (0,_item__WEBPACK_IMPORTED_MODULE_6__.createVaultItem)(name || "", fields, tags); - if (this.account) { - item.updatedBy = this.account.id; - } - await this.addItems([item], vault); - return item; - } - /** Update a given [[VaultItem]]s name, fields, tags and attachments */ - async updateItem(item, upd) { - const { vault } = this.getItem(item.id); - vault.items.update(new _item__WEBPACK_IMPORTED_MODULE_6__.VaultItem({ ...item, ...upd, updatedBy: this.account.id })); - await this.saveVault(vault); - await this.syncVault(vault); - } - async toggleFavorite(id, favorite) { - await this.updateAccount(acc => acc.toggleFavorite(id, favorite)); - } - async updateLastUsed(item) { - this.state.lastUsed.set(item.id, new Date()); - this.publish(); - } - /** Delete a number of `items` */ - async deleteItems(items) { - const attachments = []; - // Group items by vault - const grouped = new Map(); - for (const item of items) { - const { vault } = this.getItem(item.id); - if (!grouped.has(vault)) { - grouped.set(vault, []); - } - grouped.get(vault).push(item); - attachments.push(...item.attachments); - } - const promises = []; - // Delete all attachments for this item - promises.push(...attachments.map(att => this.api.deleteAttachment(new _api__WEBPACK_IMPORTED_MODULE_10__.DeleteAttachmentParams(att)))); - // Remove items from their respective vaults - for (const [vault, items] of grouped.entries()) { - promises.push((async () => { - vault.items.remove(...items); - await this.saveVault(vault); - await this.syncVault(vault); - })()); - } - await Promise.all(promises); - } - /** Move `items` from their current vault to the `target` vault */ - async moveItems(items, target) { - if (items.some(item => !!item.attachments.length)) { - throw "Items with attachments cannot be moved!"; - } - const newItems = await Promise.all(items.map(async (item) => new _item__WEBPACK_IMPORTED_MODULE_6__.VaultItem({ ...item, id: await (0,_util__WEBPACK_IMPORTED_MODULE_13__.uuid)() }))); - await this.addItems(newItems, target); - await this.deleteItems(items); - return newItems; - } - getItemsForHost(host) { - const items = []; - for (const vault of this.vaults) { - for (const item of vault.items) { - if (item.fields.some(field => { - if (field.type !== "url") { - return false; - } - // Try to parse host from url. If field value is not a valid URL, - // assume its the bare host name - let h = field.value; - try { - h = new URL(field.value).host; - } - catch (e) { } - // If host doesn't match exactly, try with/without "www." - return h === host || (host.startsWith("www.") ? host.slice(4) === h : "www." + host === h); - })) { - items.push({ vault, item }); - } - } - } - return items; - } - getItemsForUrl(url) { - try { - const { host } = new URL(url); - return this.getItemsForHost(host); - } - catch (e) { - return []; - } - } - /* - * ========================= - * ORGANIZATION MANAGEMENT - * ========================= - */ - /** Get the organization with the given `id` */ - getOrg(id) { - return this.state.orgs.find(org => org.id === id); - } - /** Update the given organization locally */ - putOrg(org) { - this.setState({ - orgs: [...this.state.orgs.filter(v => v.id !== org.id), org] - }); - } - /** Create a new [[Org]]ganization */ - async createOrg(name, type = _org__WEBPACK_IMPORTED_MODULE_5__.OrgType.Business) { - let org = new _org__WEBPACK_IMPORTED_MODULE_5__.Org(); - org.name = name; - org.type = type; - org = await this.api.createOrg(org); - await org.initialize(this.account); - org = await this.api.updateOrg(org); - await this.fetchAccount(); - return this.fetchOrg(org); - } - /** Fetch all organizations the current account is a member of */ - async fetchOrgs() { - if (!this.account) { - return; - } - try { - await Promise.all(this.account.orgs.map(org => this.fetchOrg(org))); - } - catch (e) { } - // Remove orgs that the account is no longer a member of - this.setState({ orgs: this.state.orgs.filter(org => this.account.orgs.some(o => o.id === org.id)) }); - } - /** Fetch the [[Org]]anization object with the given `id` */ - async fetchOrg({ id, revision }) { - const existing = this.getOrg(id); - if (existing && existing.revision === revision) { - return existing; - } - const org = await this.api.getOrg(id); - // Verify that the updated organization object has a `minMemberUpdated` - // property equal to or higher than the previous (local) one. - if (existing && org.minMemberUpdated < existing.minMemberUpdated) { - throw new _error__WEBPACK_IMPORTED_MODULE_15__.Err(_error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.VERIFICATION_ERROR, "'minMemberUpdated' property may not decrease!"); - } - this.putOrg(org); - await this.save(); - return org; - } - /** - * Update the organization with the given `id`. - * - * @param transform Function applying the changes - */ - async updateOrg(id, transform) { - // Create a clone of the existing org object - let org = this.getOrg(id).clone(); - // Apply changes - await transform(org); - try { - org = await this.api.updateOrg(org); - } - catch (e) { - // If organizaton has been updated since last fetch, - // get the current version and then retry - if (e.code === _error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.OUTDATED_REVISION) { - await this.fetchOrg({ id }); - return this.updateOrg(id, transform); - } - else { - throw e; - } - } - // Update and save app state - this.putOrg(org); - await this.save(); - return org; - } - async deleteOrg(id) { - await this.api.deleteOrg(id); - await this.synchronize(); - } - /** Creates a new [[Group]] in the given `org` */ - async createGroup(org, name, members) { - const group = new _org__WEBPACK_IMPORTED_MODULE_5__.Group(); - group.name = name; - group.members = members.map(({ id }) => ({ id })); - await this.updateOrg(org.id, async (org) => { - if (org.getGroup(name)) { - throw "A group with this name already exists!"; - } - org.groups.push(group); - }); - return group; - } - /** - * Updates a [[Group]]s name and members - */ - async updateGroup(org, { name }, members, newName) { - await this.updateOrg(org.id, async (org) => { - const group = org.getGroup(name); - if (!group) { - throw "Group not found!"; - } - if (newName && newName !== name && org.getGroup(newName)) { - throw "Another group with this name already exists!"; - } - if (newName) { - group.name = newName; - } - group.members = members.map(({ id }) => ({ id })); - }); - } - /** - * Update a members assigned [[Vault]]s, [[Group]]s and [[OrgRole]]. - */ - async updateMember(org, { id }, { vaults, groups, role }) { - await this.updateOrg(org.id, async (org) => { - const member = org.getMember({ id }); - // Update assigned vaults - if (vaults) { - member.vaults = vaults; - } - // Update assigned groups - if (groups) { - // Remove member from all groups - for (const group of org.groups) { - group.members = group.members.filter(m => m.id !== id); - } - // Add them back to the assigned groups - for (const name of groups) { - const group = org.getGroup(name); - group.members.push({ id }); - } - } - // Update member role - if (role && member.role !== role) { - await org.unlock(this.account); - await org.addOrUpdateMember({ ...member, role }); - } - }); - return this.getOrg(org.id).getMember({ id }); - } - /** - * Removes a member from the given `org` - */ - async removeMember(org, member) { - await this.updateOrg(org.id, async (org) => { - await org.unlock(this.account); - await org.removeMember(member); - }); - } - /* - * =================== - * INVITE MANAGEMENT - * =================== - */ - /** - * Create a new [[Invite]] - */ - async createInvites({ id }, emails, purpose) { - let invites = []; - await this.updateOrg(id, async (org) => { - await org.unlock(this.account); - invites = []; - for (const email of emails) { - const invite = new _invite__WEBPACK_IMPORTED_MODULE_3__.Invite(email, purpose); - await invite.initialize(org, this.account); - invites.push(invite); - } - org.invites = [...org.invites.filter(a => !invites.some(b => a.email === b.email)), ...invites]; - }); - return invites; - } - /** - * Get an [[Invite]] based on the organization id and invite id. - */ - async getInvite(orgId, id) { - let invite = null; - try { - invite = await this.api.getInvite(new _api__WEBPACK_IMPORTED_MODULE_10__.GetInviteParams({ org: orgId, id })); - } - catch (e) { } - return invite; - } - /** - * Accept an [[Invite]] - * - * @param secret The secret confirmation code, provided to the user by the organization owner - */ - async acceptInvite(invite, secret) { - const success = await invite.accept(this.account, secret); - if (success) { - await this.api.acceptInvite(invite); - } - return success; - } - /** - * Confirm an [[Invite]] after it has been accepted by the invitee. - * This will verify the invitees information and then add them to - * the organization. - * - * @returns The newly created member object. - */ - async confirmInvite(invite) { - // Verify invitee information - if (!(await invite.verifyInvitee())) { - throw new _error__WEBPACK_IMPORTED_MODULE_15__.Err(_error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.VERIFICATION_ERROR, "Failed to verify invitee information!"); - } - // Add member and update organization - await this.updateOrg(invite.org.id, async (org) => { - await org.unlock(this.account); - await org.addOrUpdateMember(invite.invitee); - org.removeInvite(invite); - }); - return this.getOrg(invite.org.id).getMember({ id: invite.invitee.id }); - } - /** - * Deletes an [[Invite]] - */ - async deleteInvite(invite) { - await this.updateOrg(invite.org.id, async (org) => (org.invites = org.invites.filter(inv => inv.id !== invite.id))); - } - /** - * ============= - * ATTACHMENTS - * ============= - */ - async createAttachment(itemId, file, name) { - const { vault, item } = this.getItem(itemId); - const att = new _attachment__WEBPACK_IMPORTED_MODULE_16__.Attachment({ vault: vault.id }); - await att.fromFile(file); - if (name) { - att.name = name; - } - const promise = this.api.createAttachment(att); - att.uploadProgress = promise.progress; - promise.then(id => { - att.id = id; - this.updateItem(item, { attachments: [...item.attachments, att.info] }); - promise.progress.complete(); - }); - return att; - } - async downloadAttachment(att) { - const attachment = new _attachment__WEBPACK_IMPORTED_MODULE_16__.Attachment(att); - const promise = this.api.getAttachment(new _api__WEBPACK_IMPORTED_MODULE_10__.GetAttachmentParams({ id: att.id, vault: att.vault })); - attachment.downloadProgress = promise.progress; - promise.then(att => { - attachment.fromRaw(att.toRaw()); - attachment.type = att.type; - attachment.name = att.name; - promise.progress.complete(); - }); - return attachment; - } - async deleteAttachment(itemId, att) { - const { item } = this.getItem(itemId); - try { - await this.api.deleteAttachment(new _api__WEBPACK_IMPORTED_MODULE_10__.DeleteAttachmentParams(att)); - } - catch (e) { - if (e.code !== _error__WEBPACK_IMPORTED_MODULE_15__.ErrorCode.NOT_FOUND) { - throw e; - } - } - await this.updateItem(item, { attachments: item.attachments.filter(a => a.id !== att.id) }); - } - /** - * ========= - * BILLING - * ========= - */ - async updateBilling(params) { - params.provider = (this.state.billingProvider && this.state.billingProvider.type) || ""; - await this.api.updateBilling(params); - params.org ? await this.fetchOrg({ id: params.org }) : await this.fetchAccount(); - } - async loadBillingProvider() { - const providers = await this.api.getBillingProviders(); - this.setState({ billingProvider: providers[0] || null }); - } - getItemsQuota(vault = this.mainVault) { - return this.isMainVault(vault) && !this.orgs.some(org => !org.frozen) ? this.account.quota.items : -1; - } - /** - * ================ - * HELPER METHODS - * ================ - */ - async _queueSync(obj, fn) { - let queued = this._queuedSyncPromises.get(obj.id); - let active = this._activeSyncPromises.get(obj.id); - if (queued) { - // There is already a queued sync promise, so just return that one - return queued; - } - if (active) { - // There is already a synchronization in process. wait for the current sync to finish - // before starting a new one. - const next = () => { - this._queuedSyncPromises.delete(obj.id); - return this._queueSync(obj, fn); - }; - queued = active.then(next, next); - this._queuedSyncPromises.set(obj.id, queued); - return queued; - } - active = fn(obj).then((result) => { - this._activeSyncPromises.delete(obj.id); - this.setState({ syncing: !!this._activeSyncPromises.size }); - return result; - }, e => { - this._activeSyncPromises.delete(obj.id); - this.setState({ syncing: !!this._activeSyncPromises.size }); - throw e; - }); - this._activeSyncPromises.set(obj.id, active); - this.setState({ syncing: !!this._activeSyncPromises.size }); - return active; - } - async _unlocked() { - // Unlock all vaults - await Promise.all(this.state.vaults.map(async (vault) => { - try { - await vault.unlock(this.account); - } - catch (e) { - vault.error = e; - } - })); - // Notify state change - this.publish(); - // Trigger sync - this.synchronize(); - } -} - - -/***/ }), - -/***/ "../core/src/attachment.ts": -/*!*********************************!*\ - !*** ../core/src/attachment.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AttachmentInfo": () => (/* binding */ AttachmentInfo), -/* harmony export */ "Attachment": () => (/* binding */ Attachment), -/* harmony export */ "MemoryAttachmentStorage": () => (/* binding */ MemoryAttachmentStorage) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./container */ "../core/src/container.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - -function readFile(blob) { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = () => { - const result = new Uint8Array(reader.result); - resolve(result); - }; - reader.onerror = e => { - reader.abort(); - reject(e); - }; - reader.readAsArrayBuffer(blob); - }); -} -function readAsText(blob) { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = () => { - resolve(reader.result); - }; - reader.onerror = e => { - reader.abort(); - reject(e); - }; - reader.readAsText(blob); - }); -} -function readFileAsDataURL(blob) { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = () => { - resolve(reader.result); - }; - reader.onerror = e => { - reader.abort(); - reject(e); - }; - reader.readAsDataURL(blob); - }); -} -class AttachmentInfo extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(vals = {}) { - super(); - this.id = ""; - this.vault = ""; - this.name = ""; - this.size = 0; - this.type = ""; - Object.assign(this, vals); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], AttachmentInfo.prototype, "key", void 0); -class Attachment extends _container__WEBPACK_IMPORTED_MODULE_1__.SimpleContainer { - constructor({ key, ...info } = {}) { - super(); - this.id = ""; - this.vault = ""; - this.name = ""; - this.size = 0; - this.type = ""; - Object.assign(this, { - _key: key, - ...info - }); - } - get info() { - return new AttachmentInfo({ - id: this.id, - vault: this.vault, - name: this.name, - type: this.type, - size: this.size, - key: this._key - }); - } - get loaded() { - return !!this.encryptedData; - } - async fromFile(file) { - this.type = file.type; - this.size = file.size; - this.name = file.name; - const data = await readFile(file); - this._key = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().generateKey({ - algorithm: "AES", - keySize: this.encryptionParams.keySize - }); - await this.setData(data); - return this; - } - async toFile() { - const data = await this.getData(); - return new File([data], this.name, { type: this.type }); - } - async toDataURL() { - const file = await this.toFile(); - return readFileAsDataURL(file); - } - async toObjectURL() { - const file = await this.toFile(); - return URL.createObjectURL(file); - } - async toText() { - const file = await this.toFile(); - return readAsText(file); - } - validate() { - return typeof this.id === "string" && typeof this.vault === "string" && typeof this.size === "number"; - } -} -class MemoryAttachmentStorage { - constructor() { - this._storage = new Map(); - } - async put(a) { - this._storage.set(`${a.vault}_${a.id}`, a); - } - async get(vault, id) { - const att = this._storage.get(`${vault}_${id}`); - if (!att) { - throw new _error__WEBPACK_IMPORTED_MODULE_3__.Err(_error__WEBPACK_IMPORTED_MODULE_3__.ErrorCode.NOT_FOUND); - } - return att; - } - async delete(vault, id) { - this._storage.delete(`${vault}_${id}`); - } - async deleteAll(vault) { - for (const key of this._storage.keys()) { - if (key.startsWith(vault)) { - this._storage.delete(key); - } - } - } - async getUsage(vault) { - let size = 0; - for (const [key, att] of this._storage.entries()) { - if (key.startsWith(vault)) { - size += att.size; - } - } - return size; - } -} - - -/***/ }), - -/***/ "../core/src/auth.ts": -/*!***************************!*\ - !*** ../core/src/auth.ts ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Auth": () => (/* binding */ Auth) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - -/** - * Contains authentication data needed for SRP session negotiation - */ -class Auth extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(email = "") { - super(); - this.email = email; - /** Id of the [[Account]] the authentication data belongs to */ - this.account = ""; - /** - * Key derivation params used by the client to compute session key from the - * users master password - * */ - this.keyParams = new _crypto__WEBPACK_IMPORTED_MODULE_1__.PBKDF2Params(); - this.trustedDevices = []; - } - get id() { - return this.email; - } - /** - * Generate the session key from the users master `password` - */ - async getAuthKey(password) { - // If no salt is set yet (i.e. during initialization), - // generate a random value - if (!this.keyParams.salt.length) { - this.keyParams.salt = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().randomBytes(16); - } - return (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().deriveKey((0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(password), this.keyParams); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], Auth.prototype, "verifier", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_1__.PBKDF2Params), - __metadata("design:type", Object) -], Auth.prototype, "keyParams", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_platform__WEBPACK_IMPORTED_MODULE_2__.DeviceInfo), - __metadata("design:type", Array) -], Auth.prototype, "trustedDevices", void 0); - - -/***/ }), - -/***/ "../core/src/billing.ts": -/*!******************************!*\ - !*** ../core/src/billing.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PlanType": () => (/* binding */ PlanType), -/* harmony export */ "Plan": () => (/* binding */ Plan), -/* harmony export */ "PaymentMethod": () => (/* binding */ PaymentMethod), -/* harmony export */ "SubscriptionStatus": () => (/* binding */ SubscriptionStatus), -/* harmony export */ "Subscription": () => (/* binding */ Subscription), -/* harmony export */ "BillingAddress": () => (/* binding */ BillingAddress), -/* harmony export */ "Discount": () => (/* binding */ Discount), -/* harmony export */ "BillingInfo": () => (/* binding */ BillingInfo), -/* harmony export */ "UpdateBillingParams": () => (/* binding */ UpdateBillingParams), -/* harmony export */ "BillingProviderInfo": () => (/* binding */ BillingProviderInfo) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - -var PlanType; -(function (PlanType) { - PlanType[PlanType["Free"] = 0] = "Free"; - PlanType[PlanType["Premium"] = 1] = "Premium"; - PlanType[PlanType["Family"] = 2] = "Family"; - PlanType[PlanType["Team"] = 3] = "Team"; - PlanType[PlanType["Business"] = 4] = "Business"; -})(PlanType || (PlanType = {})); -class Plan extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.id = ""; - this.type = PlanType.Free; - this.name = "Free"; - this.description = ""; - this.items = -1; - this.storage = 0; - this.groups = 0; - this.vaults = 0; - this.min = 0; - this.max = 0; - this.available = false; - this.cost = 0; - this.features = []; - this.default = false; - this.color = ""; - } -} -class PaymentMethod extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.id = ""; - this.name = ""; - } -} -var SubscriptionStatus; -(function (SubscriptionStatus) { - SubscriptionStatus["Trialing"] = "trialing"; - SubscriptionStatus["Active"] = "active"; - SubscriptionStatus["Inactive"] = "inactive"; - SubscriptionStatus["Canceled"] = "canceled"; -})(SubscriptionStatus || (SubscriptionStatus = {})); -class Subscription extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.id = ""; - this.account = ""; - this.org = ""; - this.status = SubscriptionStatus.Active; - this.items = -1; - this.storage = 0; - this.groups = 0; - this.vaults = 0; - this.members = 0; - this.paymentError = undefined; - this.paymentRequiresAuth = undefined; - this.currentInvoice = ""; - this.periodEnd = new Date(0); - this.plan = new Plan(); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Date) -], Subscription.prototype, "periodEnd", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Date) -], Subscription.prototype, "trialEnd", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(Plan), - __metadata("design:type", Plan) -], Subscription.prototype, "plan", void 0); -class BillingAddress extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(params) { - super(); - this.name = ""; - this.street = ""; - this.postalCode = ""; - this.city = ""; - this.country = ""; - if (params) { - Object.assign(this, params); - } - } -} -class Discount extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.name = ""; - this.coupon = ""; - } -} -class BillingInfo extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.customerId = ""; - this.account = ""; - this.org = ""; - this.email = ""; - this.subscription = null; - this.paymentMethod = null; - this.address = new BillingAddress(); - this.discount = null; - } - get trialDaysLeft() { - const daysSinceFirstTrial = this.firstTrialStarted - ? Math.floor((Date.now() - this.firstTrialStarted.getTime()) / 24 / 60 / 60 / 1000) - : 0; - return Math.max(0, 30 - daysSinceFirstTrial); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(Subscription), - __metadata("design:type", Object) -], BillingInfo.prototype, "subscription", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(PaymentMethod), - __metadata("design:type", Object) -], BillingInfo.prototype, "paymentMethod", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(BillingAddress), - __metadata("design:type", BillingAddress) -], BillingInfo.prototype, "address", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(Discount), - __metadata("design:type", Object) -], BillingInfo.prototype, "discount", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Date) -], BillingInfo.prototype, "firstTrialStarted", void 0); -class UpdateBillingParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(params) { - super(); - this.provider = ""; - this.account = undefined; - this.org = undefined; - this.email = undefined; - this.plan = undefined; - this.planType = undefined; - this.members = undefined; - this.paymentMethod = undefined; - this.coupon = undefined; - this.cancel = undefined; - if (params) { - Object.assign(this, params); - } - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(BillingAddress), - __metadata("design:type", BillingAddress) -], UpdateBillingParams.prototype, "address", void 0); -class BillingProviderInfo extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.type = ""; - this.config = {}; - this.plans = []; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(Plan), - __metadata("design:type", Array) -], BillingProviderInfo.prototype, "plans", void 0); -// -// const stubPlans: Plan[] = [ -// { -// id: "personal", -// name: "Personal", -// description: "Basic Setup For Personal Use", -// storage: -1, -// available: true, -// default: true -// }, -// { -// id: "shared", -// name: "Shared", -// description: "Basic Setup For Sharing", -// storage: -1, -// vaults: -1, -// available: true, -// orgType: 1 -// }, -// { -// id: "advanced", -// name: "Advanced", -// description: "Advanced Setup For Sharing", -// storage: -1, -// groups: -1, -// vaults: -1, -// available: true, -// orgType: 2 -// } -// ].map(p => { -// const plan = new Plan(); -// Object.assign(plan, p); -// return plan; -// }); - - -/***/ }), - -/***/ "../core/src/client.ts": -/*!*****************************!*\ - !*** ../core/src/client.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Client": () => (/* binding */ Client) -/* harmony export */ }); -/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api */ "../core/src/api.ts"); -/* harmony import */ var _transport__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transport */ "../core/src/transport.ts"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); - - - - -/** - * Client-side interface for Client-Server communication. Manages serialization, - * authentication and some state like current session and account. - */ -class Client extends _api__WEBPACK_IMPORTED_MODULE_0__.API { - constructor( - /** Object for storing state */ - state, - /** [[Sender]] implementation used for sending/receiving requests */ - sender, hook) { - super(); - this.state = state; - this.sender = sender; - this.hook = hook; - this.online = true; - for (const { method, output } of this.handlerDefinitions) { - this[method] = (input) => { - const progress = new _transport__WEBPACK_IMPORTED_MODULE_1__.RequestProgress(); - const promise = this.call(method, typeof input === "undefined" ? [] : [input instanceof _encoding__WEBPACK_IMPORTED_MODULE_3__.Serializable ? input.toRaw() : input], progress).then(res => { - return output - ? Array.isArray(res.result) - ? res.result.map(each => new output().fromRaw(each)) - : new output().fromRaw(res.result) - : res.result; - }); - promise.progress = progress; - return promise; - }; - } - } - /** The current session */ - get session() { - return this.state.session; - } - /** Generic method for making an RPC call */ - async call(method, params, progress) { - const { session } = this.state; - const req = new _transport__WEBPACK_IMPORTED_MODULE_1__.Request(); - req.method = method; - req.params = params; - req.device = this.state.device; - if (session) { - await session.authenticate(req); - } - let res; - try { - res = await this.sender.send(req, progress); - } - catch (e) { - if (progress) { - progress.error = e; - } - this.hook && this.hook(req, null, e); - throw e; - } - if (res.error) { - const err = new _error__WEBPACK_IMPORTED_MODULE_2__.Err(res.error.code, res.error.message); - if (progress) { - progress.error = err; - } - this.hook && this.hook(req, res, err); - throw err; - } - if (session && !(await session.verify(res))) { - const err = new _error__WEBPACK_IMPORTED_MODULE_2__.Err(_error__WEBPACK_IMPORTED_MODULE_2__.ErrorCode.INVALID_RESPONSE); - if (progress) { - progress.error = err; - } - this.hook && this.hook(req, res, err); - throw err; - } - this.hook && this.hook(req, res, null); - return res; - } -} - - -/***/ }), - -/***/ "../core/src/collection.ts": -/*!*********************************!*\ - !*** ../core/src/collection.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "VaultItemCollection": () => (/* binding */ VaultItemCollection) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _item__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./item */ "../core/src/item.ts"); - - -/** - * A collection of vault items items, used for consolidating changes made independently - * across multiple instances through "merging". - */ -class VaultItemCollection extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(items = []) { - super(); - this._changes = new Map(); - this._items = new Map(items.map(item => [item.id, item])); - } - /** Number of items in this VaultItemCollection */ - get size() { - return this._items.size; - } - get hasChanges() { - return !!this._changes.size; - } - /** Aggregated list of tags assigned to the items in this collection */ - get tags() { - const tags = new Set(); - for (const r of this) { - for (const t of r.tags) { - tags.add(t); - } - } - return [...tags]; - } - /** Get an item with a given `id` */ - get(id) { - return this._items.get(id) || null; - } - /** - * Updates one or more items based on their id. If no item with the same id - * exists, the item will be added to the collection - */ - update(...items) { - for (const item of items) { - item.updated = new Date(); - this._items.set(item.id, item); - this._changes.set(item.id, item.updated); - } - } - /** - * Removes one or more items based on their id. - */ - remove(...items) { - for (const item of items) { - this._items.delete(item.id); - this._changes.set(item.id, new Date()); - } - } - /** - * Merges in changes from another [[VaultItemCollection]] instance. - */ - merge(coll) { - // Delete any items from this collection that don't - // exist in the other collection and haven't been changed recently - for (const item of this) { - if (!this._changes.has(item.id) && !coll.get(item.id)) { - this._items.delete(item.id); - } - } - // Get changes items from other collection (but only if they haven't recently changed locally) - for (const item of coll) { - if (!this._changes.has(item.id)) { - this._items.set(item.id, item); - } - } - } - clearChanges(before) { - for (const [id, changed] of this._changes.entries()) { - if (!before || changed <= before) { - this._changes.delete(id); - } - } - } - _toRaw(version) { - return { - items: Array.from(this).map(item => item.toRaw(version)), - changes: [...this._changes] - }; - } - _fromRaw({ items, changes }) { - this._items = new Map(items.map((item) => [item.id, new _item__WEBPACK_IMPORTED_MODULE_1__.VaultItem().fromRaw(item)])); - this._changes = new Map(changes && changes.map(([id, date]) => [id, new Date(date)])); - } - [Symbol.iterator]() { - return this._items.values(); - } -} - - -/***/ }), - -/***/ "../core/src/container.ts": -/*!********************************!*\ - !*** ../core/src/container.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "BaseContainer": () => (/* binding */ BaseContainer), -/* harmony export */ "SimpleContainer": () => (/* binding */ SimpleContainer), -/* harmony export */ "PBES2Container": () => (/* binding */ PBES2Container), -/* harmony export */ "Accessor": () => (/* binding */ Accessor), -/* harmony export */ "SharedContainer": () => (/* binding */ SharedContainer) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - -/** - * Base class for all **Container** implementations. In general, a **Container** is - * an object for holding data encrypted using a symmetric cipher. Implementations - * vary mostly in how the encryption key is generated. Sub classes must implement - * the [[unlock]] method and may likely also want to augment [[lock]], [[validate]], - * [[_fromRaw]] and [[_toRaw]]. - */ -class BaseContainer extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - /** Parameters used for encryption of content data */ - this.encryptionParams = new _crypto__WEBPACK_IMPORTED_MODULE_2__.AESEncryptionParams(); - } - /** - * Encrypts the provided `data` and stores it in the container - */ - async setData(data) { - if (!this._key) { - throw new _error__WEBPACK_IMPORTED_MODULE_1__.Err(_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.ENCRYPTION_FAILED, "No encryption key provided!"); - } - // Generate random initialization vector - this.encryptionParams.iv = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().randomBytes(16); - // Generate additional authenticated data. - // Note: Without knowing anything about the nature of the encrypted data, - // we can't really choose a meaningful value for this. In the future, - // we may want to provide the option to pass this as an argument but for now - // a random value should be sufficient. - this.encryptionParams.additionalData = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().randomBytes(16); - // Encrypt the data and store it. - this.encryptedData = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().encrypt(this._key, data, this.encryptionParams); - } - /** - * Decrypts and extracts the plain text data from the container. This will - * usually require unlocking the container first. - */ - async getData() { - if (!this.encryptedData || !this._key) { - throw new _error__WEBPACK_IMPORTED_MODULE_1__.Err(_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.DECRYPTION_FAILED); - } - return await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().decrypt(this._key, this.encryptedData, this.encryptionParams); - } - /** - * Locks the container, removing the possibility to extract the plain text data - * via [[getData]] until the container is unlocked again. Subclasses extending - * this class must take care to delete any keys or other sensitive data - * that may have been stored temporarily after unlocking the container. - */ - lock() { - delete this._key; - } - clone() { - const clone = super.clone(); - clone._key = this._key; - return clone; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_2__.AESEncryptionParams), - __metadata("design:type", _crypto__WEBPACK_IMPORTED_MODULE_2__.AESEncryptionParams) -], BaseContainer.prototype, "encryptionParams", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], BaseContainer.prototype, "encryptedData", void 0); -/** - * Most basic **Container** implementation where the encryption key is - * simply passed explicitly. - */ -class SimpleContainer extends BaseContainer { - async unlock(key) { - this._key = key; - } -} -/** - * Password-based **Container** that uses the - * [PBES2](https://tools.ietf.org/html/rfc2898#section-6.2) encryption scheme, - * deriving the encryption key from a user-provided passphrase. - */ -class PBES2Container extends BaseContainer { - constructor() { - super(...arguments); - /** Parameters used for key derivation */ - this.keyParams = new _crypto__WEBPACK_IMPORTED_MODULE_2__.PBKDF2Params(); - } - /** - * Unlocks the container using the given **password** - */ - async unlock(password) { - if (!this.keyParams.salt.length) { - this.keyParams.salt = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().randomBytes(16); - } - this._key = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().deriveKey((0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(password), this.keyParams); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_2__.PBKDF2Params), - __metadata("design:type", _crypto__WEBPACK_IMPORTED_MODULE_2__.PBKDF2Params) -], PBES2Container.prototype, "keyParams", void 0); -/** - * Represents an individual with access to a [[SharedContainer]]. Each accessor is mapped - * to an entity owning a public/private key pair via their `id`. - */ -class Accessor extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - /** - * Identifier used to map an `Accessor` to the owner of the public key used to encrypt the shared key. - */ - this.id = ""; - /** Shared key encrypted with the public key of the entity associated with the `Accessor` object */ - this.encryptedKey = new Uint8Array(); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], Accessor.prototype, "encryptedKey", void 0); -/** - * The `SharedContainer` is used to securely share data between a number of - * accessors using a shared-key encryption scheme where the content data is - * encrypted using a randomly generated shared key that is then encrypted with - * each accessors public key and stored along the encrypted data. Accessors can - * then retrieve the shared key by decrypting it using their private key and - * use it to recover the original data. - */ -class SharedContainer extends BaseContainer { - constructor() { - super(...arguments); - /** Parameters used to wrap the shared encryption key */ - this.keyParams = new _crypto__WEBPACK_IMPORTED_MODULE_2__.RSAEncryptionParams(); - /** The ids and encrypted keys of all accessors */ - this.accessors = []; - } - /** - * Unlocks the container using the id and private key of a given accessor. - * The id is used to look up the corresponding encrypted key while the - * private key is used to decrypt it. - */ - async unlock({ id, privateKey }) { - if (this._key) { - // Container is already unlocked, no need to unlock it again - return; - } - // Find accessor object with the same id - const accessor = this.accessors.find(a => a.id === id); - if (!accessor || !accessor.encryptedKey) { - // No corresponding accessor found. - throw new _error__WEBPACK_IMPORTED_MODULE_1__.Err(_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.MISSING_ACCESS, "You no longer have access to this vault."); - } - // Decrypt shared key using provided private key - this._key = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().decrypt(privateKey, accessor.encryptedKey, this.keyParams); - } - /** - * Updates the containers accessors, generating a new shared key and encrypting - * it with the public keys of the provided **subjects**. Non-empty containers - * need to be unlocked first. - */ - async updateAccessors(subjects) { - // Get existing data so we can reencrypt it after rotating the key - let data = null; - // If the container already contains data, we need to reencrypt it after generating a new key - if (this.encryptedData) { - if (!this._key) { - throw "Non-empty containers need to be unlocked before accessors can be updated!"; - } - data = await this.getData(); - } - // Updating the accessors also requires generating a new shared key - this._key = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().generateKey(new _crypto__WEBPACK_IMPORTED_MODULE_2__.AESKeyParams()); - // Reencrypt data with new key - if (data) { - await this.setData(data); - } - // Encrypt the shared key with the public key of each accessor and store it along with their id - this.accessors = await Promise.all(subjects.map(async ({ id, publicKey }) => { - const accessor = new Accessor(); - accessor.id = id; - accessor.encryptedKey = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().encrypt(publicKey, this._key, this.keyParams); - return accessor; - })); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_2__.RSAEncryptionParams), - __metadata("design:type", _crypto__WEBPACK_IMPORTED_MODULE_2__.RSAEncryptionParams) -], SharedContainer.prototype, "keyParams", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(Accessor), - __metadata("design:type", Array) -], SharedContainer.prototype, "accessors", void 0); - - -/***/ }), - -/***/ "../core/src/crypto.ts": -/*!*****************************!*\ - !*** ../core/src/crypto.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "PBKDF2_ITER_DEFAULT": () => (/* binding */ PBKDF2_ITER_DEFAULT), -/* harmony export */ "PBKDF2_ITER_MAX": () => (/* binding */ PBKDF2_ITER_MAX), -/* harmony export */ "AESEncryptionParams": () => (/* binding */ AESEncryptionParams), -/* harmony export */ "AESKeyParams": () => (/* binding */ AESKeyParams), -/* harmony export */ "HMACKeyParams": () => (/* binding */ HMACKeyParams), -/* harmony export */ "RSAKeyParams": () => (/* binding */ RSAKeyParams), -/* harmony export */ "PBKDF2Params": () => (/* binding */ PBKDF2Params), -/* harmony export */ "RSAEncryptionParams": () => (/* binding */ RSAEncryptionParams), -/* harmony export */ "RSASigningParams": () => (/* binding */ RSASigningParams), -/* harmony export */ "HMACParams": () => (/* binding */ HMACParams), -/* harmony export */ "HashParams": () => (/* binding */ HashParams) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - -// Default number of pbkdf2 iterations -const PBKDF2_ITER_DEFAULT = 5e4; -// Maximum number of pbkdf2 iterations -const PBKDF2_ITER_MAX = 1e7; -class AESEncryptionParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.algorithm = "AES-GCM"; - this.tagSize = 128; - this.keySize = 256; - this.iv = new Uint8Array(); - this.additionalData = new Uint8Array(); - } - validate() { - return (["AES-GCM", "AES-CCM"].includes(this.algorithm) && - [64, 96, 128].includes(this.tagSize) && - [256].includes(this.keySize)); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], AESEncryptionParams.prototype, "iv", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Object) -], AESEncryptionParams.prototype, "additionalData", void 0); -class AESKeyParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.algorithm = "AES"; - this.keySize = 256; - } - validate() { - return this.algorithm === "AES" && this.keySize === 256; - } -} -class HMACKeyParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.algorithm = "HMAC"; - this.keySize = 256; - } - validate() { - return this.algorithm === "HMAC" && this.keySize === 256; - } -} -class RSAKeyParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.algorithm = "RSA"; - this.modulusLength = 2048; - this.hash = "SHA-256"; - this.publicExponent = new Uint8Array([0x01, 0x00, 0x01]); - } - validate() { - return (this.algorithm === "RSA" && - this.modulusLength === 2048 && - this.hash === "SHA-256" && - this.publicExponent instanceof Uint8Array); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], RSAKeyParams.prototype, "publicExponent", void 0); -class PBKDF2Params extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(props) { - super(); - this.algorithm = "PBKDF2"; - this.hash = "SHA-256"; - this.keySize = 256; - this.iterations = PBKDF2_ITER_DEFAULT; - this.salt = new Uint8Array(); - props && Object.assign(this, props); - } - validate() { - return (this.algorithm === "PBKDF2" && - this.hash === "SHA-256" && - this.keySize === 256 && - typeof this.iterations === "number" && - this.iterations < PBKDF2_ITER_MAX && - this.salt instanceof Uint8Array); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], PBKDF2Params.prototype, "salt", void 0); -class RSAEncryptionParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.algorithm = "RSA-OAEP"; - this.hash = "SHA-256"; - } - validate() { - return this.algorithm === "RSA-OAEP" && this.hash === "SHA-256"; - } -} -class RSASigningParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - this.algorithm = "RSA-PSS"; - this.hash = "SHA-256"; - this.saltLength = 32; - } - validate() { - return this.algorithm === "RSA-PSS" && this.hash === "SHA-256" && this.saltLength === 32; - } -} -class HMACParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(props) { - super(); - this.algorithm = "HMAC"; - this.hash = "SHA-256"; - this.keySize = 256; - props && Object.assign(this, props); - } - validate() { - return this.algorithm === "HMAC" && this.hash === "SHA-256" && this.keySize === 256; - } -} -class HashParams extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(props) { - super(); - this.algorithm = "SHA-256"; - props && Object.assign(this, props); - } - validate() { - return ["SHA-1", "SHA-256"].includes(this.algorithm); - } -} - - -/***/ }), - -/***/ "../core/src/diceware.ts": -/*!*******************************!*\ - !*** ../core/src/diceware.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AVAILABLE_LANGUAGES": () => (/* reexport safe */ _padloc_locale_src_wordlists__WEBPACK_IMPORTED_MODULE_0__.AVAILABLE_LANGUAGES), -/* harmony export */ "generatePassphrase": () => (/* binding */ generatePassphrase) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_wordlists__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/wordlists */ "../locale/src/wordlists.ts"); -/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./util */ "../core/src/util.ts"); - - - -/** - * Generates a passphrase consisting of a number of words randomly selected - * from a word list. Motivated by http://world.std.com/~reinhold/diceware.html - */ -async function generatePassphrase(nWords = 4, separator = "-", languages = ["en"]) { - const words = []; - const list = []; - for (const lang of languages) { - list.push(...(await (0,_padloc_locale_src_wordlists__WEBPACK_IMPORTED_MODULE_0__.getWordList)(lang))); - } - // Fall back to englisch if no word lists were found for provided languages - if (!list.length) { - list.push(...(await (0,_padloc_locale_src_wordlists__WEBPACK_IMPORTED_MODULE_0__.getWordList)("en"))); - } - for (let i = 0; i < nWords; i++) { - words.push(list[await (0,_util__WEBPACK_IMPORTED_MODULE_1__.randomNumber)(0, list.length - 1)]); - } - return words.join(separator); -} - - -/***/ }), - -/***/ "../core/src/event-target.ts": -/*!***********************************!*\ - !*** ../core/src/event-target.ts ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "EventEmitter": () => (/* binding */ EventEmitter) -/* harmony export */ }); -class EventEmitter { - constructor() { - this._listeners = new Map(); - } - addEventListener(eventName, listener) { - if (!this._listeners.has(eventName)) { - this._listeners.set(eventName, new Set()); - } - this._listeners.get(eventName).add(listener); - } - removeEventListener(eventName, listener) { - const listeners = this._listeners.get(eventName); - if (listeners) { - listeners.delete(listener); - } - } - dispatchEvent(e) { - const listeners = this._listeners.get(e.type); - if (listeners) { - for (const listener of listeners) { - if (typeof listener === "function") { - listener(e); - } - else { - listener.handle(e); - } - } - } - } - dispatch(type, detail) { - this.dispatchEvent({ type, detail }); - } -} - - -/***/ }), - -/***/ "../core/src/invite.ts": -/*!*****************************!*\ - !*** ../core/src/invite.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Invite": () => (/* binding */ Invite) -/* harmony export */ }); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./container */ "../core/src/container.ts"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util */ "../core/src/util.ts"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - -class OrgInfo extends _encoding__WEBPACK_IMPORTED_MODULE_3__.Serializable { - constructor(vals) { - super(); - this.id = ""; - this.name = ""; - Object.assign(this, vals); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsBytes)(), - __metadata("design:type", Uint8Array) -], OrgInfo.prototype, "publicKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsBytes)(), - __metadata("design:type", Uint8Array) -], OrgInfo.prototype, "signature", void 0); -class InviteeInfo extends _encoding__WEBPACK_IMPORTED_MODULE_3__.Serializable { - constructor(vals) { - super(); - this.id = ""; - this.name = ""; - this.email = ""; - Object.assign(this, vals); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsBytes)(), - __metadata("design:type", Uint8Array) -], InviteeInfo.prototype, "publicKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsBytes)(), - __metadata("design:type", Uint8Array) -], InviteeInfo.prototype, "signature", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsBytes)(), - __metadata("design:type", Uint8Array) -], InviteeInfo.prototype, "orgSignature", void 0); -/** - * The `Invite` class encapsules most of the logic and information necessary to - * perform a key exchange between an [[Org]] and [[Account]] before adding the - * [[Account]] as a member. A secret HMAC key is used to sign and verify the public keys - * of both invitee and organization. This key is derived from a [[secret]], which - * needs to be communicated between the organization owner and invitee directly. - * - * The invite flow generally works as follows: - * - * ```ts - * // ORG OWNER - * - * const invite = new Invite("bob@example.com", "add_member"); - * - * // Generates random secret and signs organization details - * await invite.intialize(org, orgOwnerAccount); - * - * console.log("invite secret: ", invite.secret); - * - * // => Invite object is send to server, which sends an email to the invitee - * - * // INVITEE - * // => Invitee fetches `invite` object from server, asks org owner for `secret` (in person) - * - * // Verifies organization info and signs own public key - * - * const success = await invite.accept(inviteeAccount, secret); - * - * if (!success) { - * throw "Verification failed! Incorrect secret?"; - * } - * - * // => Sends updated invite object to server - * - * // ORG OWNER - * - * // => Fetches updated invite object - * - * // Verify invitee details. - * if (!(await invite.verifyInvitee())) { - * throw "Failed to verify invitee details!"; - * } - * - * // DONE! - * await org.addOrUpdateMember(invite.invitee); - * ``` - */ -class Invite extends _container__WEBPACK_IMPORTED_MODULE_2__.SimpleContainer { - constructor( - /** invitee email */ - email = "", - /** purpose of the invite */ - purpose = "join_org") { - super(); - this.email = email; - this.purpose = purpose; - /** Unique identfier */ - this.id = ""; - /** Time of creation */ - this.created = new Date(); - /** - * Expiration time used to limit invite procedure to a certain time - * window. This property is also stored in [[encryptedData]] along - * with the invite secret to prevent tempering. - */ - this.expires = new Date(); - /** Info about who created the invite. */ - this.invitedBy = undefined; - this._secret = ""; - this._signingKey = null; - /** Key derivation paramaters used for deriving the HMAC signing key from [[secret]]. */ - this.signingKeyParams = new _crypto__WEBPACK_IMPORTED_MODULE_0__.PBKDF2Params({ - iterations: 1e6 - }); - /** - * Parameters used for signing organization and initee details. - */ - this.signingParams = new _crypto__WEBPACK_IMPORTED_MODULE_0__.HMACParams(); - } - /** - * Random secret used for deriving the HMAC key that is used to sign and - * verify organization and invitee details. It is encrypted at rest with an - * AES key only available to organization admins. The invitee does not have - * access to this property directly but needs to request it from the - * organization owner directly. - * - * @secret - * **IMPORTANT**: This property is considered **secret** - * and should never stored or transmitted in plain text - */ - set secret(s) { - this._secret = s; - this._signingKey = null; - } - get secret() { - return this._secret; - } - /** Whether this invite has expired */ - get expired() { - return new Date() > new Date(this.expires); - } - /** Whether this invite has been accepted by the invitee */ - get accepted() { - return !!this.invitee; - } - /** - * Initializes the invite by generating a random [[secret]] and [[id]] and - * signing and storing the organization details. - * - * @param org The organization this invite is for - * @param invitor Account creating the invite - * @param duration Number of hours until this invite expires - */ - async initialize(org, invitor, duration = 12) { - this.id = await (0,_util__WEBPACK_IMPORTED_MODULE_4__.uuid)(); - this.invitedBy = { id: invitor.id, email: invitor.email, name: invitor.name }; - // Generate secret - this.secret = (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.bytesToHex)(await (0,_platform__WEBPACK_IMPORTED_MODULE_1__.getCryptoProvider)().randomBytes(4)); - // Set expiration time (12 hours from now) - this.expires = new Date(Date.now() + 1000 * 60 * 60 * duration); - // Encrypt secret and expiration date (the expiration time is also stored/transmitted - // in plain text, encrypting it will allow verifying it wasn't tempered with later) - this._key = org.invitesKey; - await this.setData((0,_encoding__WEBPACK_IMPORTED_MODULE_3__.stringToBytes)((0,_encoding__WEBPACK_IMPORTED_MODULE_3__.marshal)({ secret: this.secret, expires: this.expires }))); - // Initialize signing params - this.signingKeyParams.salt = await (0,_platform__WEBPACK_IMPORTED_MODULE_1__.getCryptoProvider)().randomBytes(16); - // Create org signature using key derived from secret (see `_getSigningKey`) - this.org = new OrgInfo({ - id: org.id, - name: org.name, - publicKey: org.publicKey, - signature: await this._sign((0,_encoding__WEBPACK_IMPORTED_MODULE_3__.concatBytes)([(0,_encoding__WEBPACK_IMPORTED_MODULE_3__.stringToBytes)(org.id), org.publicKey], 0x00)) - }); - } - /** - * "Unlocks" the invite with the dedicated key (owned by the respective [[Org]]). - * This grants access to the [[secret]] property and verfies that [[expires]] has - * not been tempered with. - */ - async unlock(key) { - await super.unlock(key); - const { secret, expires } = (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.unmarshal)((0,_encoding__WEBPACK_IMPORTED_MODULE_3__.bytesToString)(await this.getData())); - this.secret = secret; - // Verify that expiration time has not been tempered with - if (this.expires.getTime() !== new Date(expires).getTime()) { - throw new _error__WEBPACK_IMPORTED_MODULE_5__.Err(_error__WEBPACK_IMPORTED_MODULE_5__.ErrorCode.VERIFICATION_ERROR); - } - } - lock() { - super.lock(); - delete this.secret; - delete this._signingKey; - } - /** - * Accepts the invite by verifying the organization details and, if successful, - * signing and storing the invitees own information. Throws if verification - * is unsuccessful. - */ - async accept(account, secret) { - this.secret = secret; - // Verify org signature - if (!(await this.verifyOrg())) { - this.secret = ""; - return false; - } - this.invitee = new InviteeInfo({ - id: account.id, - name: account.name, - email: account.email, - publicKey: account.publicKey, - // this is used by the organization owner to verify the invitees public key - signature: await this._sign((0,_encoding__WEBPACK_IMPORTED_MODULE_3__.concatBytes)([(0,_encoding__WEBPACK_IMPORTED_MODULE_3__.stringToBytes)(account.id), (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.stringToBytes)(account.email), account.publicKey], 0x00)), - // this is used by member later to verify the organization public key - orgSignature: await account.signOrg(this.org) - }); - return true; - } - /** Verifies the organization information. */ - async verifyOrg() { - if (!this.org) { - throw "Invite needs to be initialized first!"; - } - return (this.expires > new Date() && - this._verify(this.org.signature, (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.concatBytes)([(0,_encoding__WEBPACK_IMPORTED_MODULE_3__.stringToBytes)(this.org.id), this.org.publicKey], 0x00))); - } - /** Verifies the invitee information. */ - async verifyInvitee() { - if (!this.invitee) { - throw "Invite needs to be accepted first!"; - } - return (this.expires > new Date() && - this._verify(this.invitee.signature, (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.concatBytes)([(0,_encoding__WEBPACK_IMPORTED_MODULE_3__.stringToBytes)(this.invitee.id), (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.stringToBytes)(this.invitee.email), this.invitee.publicKey], 0x00))); - } - async _getSigningKey() { - if (!this._signingKey) { - this._signingKey = (await (0,_platform__WEBPACK_IMPORTED_MODULE_1__.getCryptoProvider)().deriveKey((0,_encoding__WEBPACK_IMPORTED_MODULE_3__.stringToBytes)(this.secret), this.signingKeyParams)); - } - return this._signingKey; - } - async _sign(val) { - return (0,_platform__WEBPACK_IMPORTED_MODULE_1__.getCryptoProvider)().sign(await this._getSigningKey(), val, this.signingParams); - } - async _verify(sig, val) { - return await (0,_platform__WEBPACK_IMPORTED_MODULE_1__.getCryptoProvider)().verify(await this._getSigningKey(), sig, val, this.signingParams); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsDate)(), - __metadata("design:type", Object) -], Invite.prototype, "created", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsDate)(), - __metadata("design:type", Object) -], Invite.prototype, "expires", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsSerializable)(OrgInfo), - __metadata("design:type", OrgInfo) -], Invite.prototype, "org", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsSerializable)(InviteeInfo), - __metadata("design:type", InviteeInfo) -], Invite.prototype, "invitee", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_0__.PBKDF2Params), - __metadata("design:type", Object) -], Invite.prototype, "signingKeyParams", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_3__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_0__.HMACParams), - __metadata("design:type", Object) -], Invite.prototype, "signingParams", void 0); - - -/***/ }), - -/***/ "../core/src/item.ts": -/*!***************************!*\ - !*** ../core/src/item.ts ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "FieldType": () => (/* binding */ FieldType), -/* harmony export */ "FIELD_DEFS": () => (/* binding */ FIELD_DEFS), -/* harmony export */ "Field": () => (/* binding */ Field), -/* harmony export */ "normalizeTag": () => (/* binding */ normalizeTag), -/* harmony export */ "VaultItem": () => (/* binding */ VaultItem), -/* harmony export */ "createVaultItem": () => (/* binding */ createVaultItem), -/* harmony export */ "guessFieldType": () => (/* binding */ guessFieldType), -/* harmony export */ "ITEM_TEMPLATES": () => (/* binding */ ITEM_TEMPLATES) -/* harmony export */ }); -/* harmony import */ var _padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @padloc/locale/src/translate */ "../locale/src/translate.ts"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _otp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./otp */ "../core/src/otp.ts"); -/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "../core/src/util.ts"); -/* harmony import */ var _attachment__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./attachment */ "../core/src/attachment.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - -var FieldType; -(function (FieldType) { - FieldType["Username"] = "username"; - FieldType["Password"] = "password"; - FieldType["Url"] = "url"; - FieldType["Email"] = "email"; - FieldType["Date"] = "date"; - FieldType["Month"] = "month"; - FieldType["Credit"] = "credit"; - FieldType["Phone"] = "phone"; - FieldType["Pin"] = "pin"; - FieldType["Totp"] = "totp"; - FieldType["Note"] = "note"; - FieldType["Text"] = "text"; -})(FieldType || (FieldType = {})); -/** Available field types and respective meta data */ -const FIELD_DEFS = { - [FieldType.Username]: { - type: FieldType.Username, - pattern: ".*", - mask: false, - multiline: false, - icon: "user", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Username"); - } - }, - [FieldType.Password]: { - type: FieldType.Password, - pattern: ".*", - mask: true, - multiline: true, - icon: "lock", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Password"); - }, - format(value, masked) { - return masked ? value.replace(/./g, "\u2022") : value; - } - }, - [FieldType.Url]: { - type: FieldType.Url, - pattern: ".*", - mask: false, - multiline: false, - icon: "web", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("URL"); - } - }, - [FieldType.Email]: { - type: FieldType.Email, - pattern: ".*", - mask: false, - multiline: false, - icon: "email", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Email Address"); - } - }, - [FieldType.Date]: { - type: FieldType.Date, - pattern: "\\d\\d\\d\\d-\\d\\d-\\d\\d", - mask: false, - multiline: false, - icon: "date", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Date"); - }, - format(value) { - return new Date(value).toLocaleDateString(); - } - }, - [FieldType.Month]: { - type: FieldType.Month, - pattern: "\\d\\d\\d\\d-\\d\\d", - mask: false, - multiline: false, - icon: "month", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Month"); - } - }, - [FieldType.Credit]: { - type: FieldType.Credit, - pattern: "\\d*", - mask: true, - multiline: false, - icon: "credit", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Credit Card Number"); - }, - format(value, masked) { - const parts = []; - for (let i = 0; i < value.length; i += 4) { - const part = value.slice(i, i + 4); - parts.push(masked && i < value.length - 4 ? part.replace(/./g, "\u2022") : part); - } - return parts.join(" "); - } - }, - [FieldType.Phone]: { - type: FieldType.Phone, - pattern: ".*", - mask: false, - multiline: false, - icon: "phone", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Phone Number"); - } - }, - [FieldType.Pin]: { - type: FieldType.Pin, - pattern: "\\d*", - mask: true, - multiline: false, - icon: "lock", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("PIN"); - }, - format(value, masked) { - return masked ? value.replace(/./g, "\u2022") : value; - } - }, - [FieldType.Totp]: { - type: FieldType.Totp, - pattern: ".*", - mask: false, - multiline: false, - icon: "totp", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("2FA Token"); - }, - async transform(value) { - return await (0,_otp__WEBPACK_IMPORTED_MODULE_2__.totp)((0,_encoding__WEBPACK_IMPORTED_MODULE_1__.base32ToBytes)(value)); - } - }, - [FieldType.Note]: { - type: FieldType.Note, - pattern: ".*", - mask: false, - multiline: true, - icon: "note", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Note"); - } - }, - [FieldType.Text]: { - type: FieldType.Text, - pattern: ".*", - mask: false, - multiline: false, - icon: "text", - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Other"); - } - } -}; -class Field extends _encoding__WEBPACK_IMPORTED_MODULE_1__.Serializable { - constructor(vals = {}) { - super(); - /** - * field type, determining meta data via the corresponding field definition - * in [[FIELD_DEFS]] - */ - this.type = FieldType.Text; - /** field name */ - this.name = ""; - /** field content */ - this.value = ""; - Object.assign(this, vals); - } - get def() { - return FIELD_DEFS[this.type] || FIELD_DEFS[FieldType.Text]; - } - get icon() { - return this.def.icon; - } - async transform() { - return this.def.transform ? await this.def.transform(this.value) : this.value; - } - format(masked) { - return this.def.format ? this.def.format(this.value, masked) : this.value; - } - _fromRaw(raw) { - if (!raw.type) { - raw.type = guessFieldType(raw); - } - return super._fromRaw(raw); - } -} -/** Normalizes a tag value by removing invalid characters */ -function normalizeTag(tag) { - return tag.replace(",", ""); -} -/** Represents an entry within a vault */ -class VaultItem extends _encoding__WEBPACK_IMPORTED_MODULE_1__.Serializable { - constructor(vals = {}) { - super(); - /** unique identfier */ - this.id = ""; - /** item name */ - this.name = ""; - /** item fields */ - this.fields = []; - /** array of tags assigned with this item */ - this.tags = []; - /** Date and time of last update */ - this.updated = new Date(); - /** [[Account]] the item was last updated by */ - this.updatedBy = ""; - /** - * @DEPRECATED - * Accounts that have favorited this item - */ - this.favorited = []; - /** attachments associated with this item */ - this.attachments = []; - Object.assign(this, vals); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsSerializable)(Field), - __metadata("design:type", Array) -], VaultItem.prototype, "fields", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Date) -], VaultItem.prototype, "updated", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsSerializable)(_attachment__WEBPACK_IMPORTED_MODULE_4__.AttachmentInfo), - __metadata("design:type", Array) -], VaultItem.prototype, "attachments", void 0); -/** Creates a new vault item */ -async function createVaultItem(name, fields = [], tags = []) { - return new VaultItem({ - name, - fields, - tags, - id: await (0,_util__WEBPACK_IMPORTED_MODULE_3__.uuid)() - }); -} -const matchUsername = /username/i; -const matchPassword = /password/i; -const matchUrl = /url/i; -const matchNote = /\n/; -/** Guesses the most appropriate field type based on field name and value */ -function guessFieldType({ name = "", value = "", masked }) { - return masked || name.match(matchPassword) - ? FieldType.Password - : name.match(matchUsername) - ? FieldType.Username - : name.match(matchUrl) - ? FieldType.Url - : value.match(matchNote) - ? FieldType.Note - : FieldType.Text; -} -const ITEM_TEMPLATES = [ - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Website / App"), - icon: "web", - fields: [ - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Username"); - }, - type: FieldType.Username - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Password"); - }, - type: FieldType.Password - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("URL"); - }, - type: FieldType.Url - } - ] - }, - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Computer"), - icon: "desktop", - fields: [ - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Username"); - }, - type: FieldType.Username - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Password"); - }, - type: FieldType.Password - } - ] - }, - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Credit Card"), - icon: "credit", - fields: [ - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Card Number"); - }, - type: FieldType.Credit - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Card Owner"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Valid Until"); - }, - type: FieldType.Month - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("CVC"); - }, - type: FieldType.Pin - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("PIN"); - }, - type: FieldType.Pin - } - ] - }, - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Bank Account"), - icon: "bank", - fields: [ - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Account Owner"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("IBAN"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("BIC"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Card PIN"); - }, - type: FieldType.Pin - } - ] - }, - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("WIFI Password"), - icon: "wifi", - fields: [ - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Name"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Password"); - }, - type: FieldType.Password - } - ] - }, - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Passport"), - icon: "passport", - fields: [ - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Full Name"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Passport Number"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Country"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Birthdate"); - }, - type: FieldType.Date - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Birthplace"); - }, - type: FieldType.Text - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Issued On"); - }, - type: FieldType.Date - }, - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Expires"); - }, - type: FieldType.Date - } - ] - }, - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Note"), - icon: "note", - fields: [ - { - get name() { - return (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Note"); - }, - type: FieldType.Note - } - ] - }, - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Document"), - icon: "attachment", - fields: [], - attachment: true - }, - { - toString: () => (0,_padloc_locale_src_translate__WEBPACK_IMPORTED_MODULE_0__.translate)("Custom"), - icon: "custom", - fields: [] - } -]; - - -/***/ }), - -/***/ "../core/src/legacy.ts": -/*!*****************************!*\ - !*** ../core/src/legacy.ts ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "validateLegacyContainer": () => (/* binding */ validateLegacyContainer), -/* harmony export */ "parseLegacyContainer": () => (/* binding */ parseLegacyContainer) -/* harmony export */ }); -/* harmony import */ var _vendor_sjcl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vendor/sjcl */ "../core/vendor/sjcl.js"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./container */ "../core/src/container.ts"); - - - - -/** - * Validates legacy container structure - */ -function validateLegacyContainer(obj) { - return (typeof obj === "object" && - (obj.version === undefined || obj.version === 1) && // has a valid version - [128, 192, 256].includes(obj.keySize) && - typeof obj.iter == "number" && // valid PBKDF2 iteration count - obj.iter <= _crypto__WEBPACK_IMPORTED_MODULE_2__.PBKDF2_ITER_MAX && // sane pbkdf2 iteration count - typeof obj.salt == "string" && - ["aes"].includes(obj.cipher) && // valid cipher - ["ccm", "ocb2"].includes(obj.mode) && // exiting mode - typeof obj.iv == "string" && // valid initialisation vector - typeof obj.ct == "string" && // valid cipher text - typeof obj.adata == "string" && // valid authorisation data - [64, 96, 128].includes(obj.ts) // valid authorisation tag length - ); -} -/** - * Transforms a legacy container object into an instance of [[PBES2Container]] - */ -function parseLegacyContainer(raw) { - if (!validateLegacyContainer(raw)) { - throw new _error__WEBPACK_IMPORTED_MODULE_1__.Err(_error__WEBPACK_IMPORTED_MODULE_1__.ErrorCode.ENCODING_ERROR); - } - if (raw.version === undefined) { - // Legacy versions of Padlock had a bug where the base64-encoded - // `adata` value was not converted to a BitArray before being - // passed to `sjcl.mode.ccm.encrypt/decrypt` and the raw string was - // passed instead. This went unnoticed as the functions in question - // quietly accepted the string and simply treated it as an array. - // So in order to successfully decrypt legacy containers we have to - // perfom this conversion first. - raw.adata = _vendor_sjcl__WEBPACK_IMPORTED_MODULE_0__.sjcl.codec.base64.fromBits(raw.adata); - } - return new _container__WEBPACK_IMPORTED_MODULE_3__.PBES2Container().fromRaw({ - encryptionParams: { - algorithm: "AES-CCM", - tagSize: raw.ts, - keySize: raw.keySize, - iv: raw.iv, - additionalData: raw.adata - }, - keyParams: { - algorithm: "PBKDF2", - hash: "SHA-256", - keySize: raw.keySize, - iterations: raw.iter, - salt: raw.salt - }, - encryptedData: raw.ct - }); -} - - -/***/ }), - -/***/ "../core/src/mfa.ts": -/*!**************************!*\ - !*** ../core/src/mfa.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "MFAPurpose": () => (/* binding */ MFAPurpose), -/* harmony export */ "MFAType": () => (/* binding */ MFAType), -/* harmony export */ "MFARequest": () => (/* binding */ MFARequest) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./util */ "../core/src/util.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - -var MFAPurpose; -(function (MFAPurpose) { - MFAPurpose[MFAPurpose["Signup"] = 0] = "Signup"; - MFAPurpose[MFAPurpose["Login"] = 1] = "Login"; - MFAPurpose[MFAPurpose["Recover"] = 2] = "Recover"; - MFAPurpose[MFAPurpose["GetLegacyData"] = 3] = "GetLegacyData"; -})(MFAPurpose || (MFAPurpose = {})); -var MFAType; -(function (MFAType) { - MFAType[MFAType["Email"] = 0] = "Email"; -})(MFAType || (MFAType = {})); -/** - * Class for storing email verification data. Email verificatiion is used - * to prove ownership of the email address in question and as a authentication - * mechanism. - */ -class MFARequest extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor( - /** The email to be verified */ - email, - /** The verification purpose */ - purpose, type = MFAType.Email) { - super(); - this.email = email; - this.purpose = purpose; - this.type = type; - /** Time of creation */ - this.created = new Date(); - /** - * MFA verification code. This code is sent to the user via email - * through [[API.requestMFACode]] - */ - this.code = ""; - /** - * MFA token that can be exchanged for the MFA code via [[API.retrieveMFAToken]] - */ - this.token = ""; - /** - * Number of failed tries - */ - this.tries = 0; - } - get id() { - return `${this.email}_${this.purpose}`; - } - async init() { - const len = 6; - // Create random 6-digit verification code - this.code = (await (0,_util__WEBPACK_IMPORTED_MODULE_2__.randomNumber)(0, Math.pow(10, len) - 1)).toString().padStart(len, "0"); - // Create random 16-byte verification token - this.token = (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.bytesToBase64)(await (0,_platform__WEBPACK_IMPORTED_MODULE_1__.getCryptoProvider)().randomBytes(16)); - this.tries = 0; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Object) -], MFARequest.prototype, "created", void 0); - - -/***/ }), - -/***/ "../core/src/org.ts": -/*!**************************!*\ - !*** ../core/src/org.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "OrgRole": () => (/* binding */ OrgRole), -/* harmony export */ "OrgMember": () => (/* binding */ OrgMember), -/* harmony export */ "Group": () => (/* binding */ Group), -/* harmony export */ "OrgType": () => (/* binding */ OrgType), -/* harmony export */ "OrgSecrets": () => (/* binding */ OrgSecrets), -/* harmony export */ "Org": () => (/* binding */ Org) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./container */ "../core/src/container.ts"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -/* harmony import */ var _invite__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./invite */ "../core/src/invite.ts"); -/* harmony import */ var _quota__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./quota */ "../core/src/quota.ts"); -/* harmony import */ var _billing__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./billing */ "../core/src/billing.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - - - - -/** Role of a member within an organization, each associated with certain priviliges */ -var OrgRole; -(function (OrgRole) { - /** - * Organization owner. Can manage members, groups and vaults. Owners have - * access to the secret [[Org.privateKey]] and [[Org.invitesKey]] - * properties. - */ - OrgRole[OrgRole["Owner"] = 0] = "Owner"; - /** - * Organization admin. Can manage groups and vaults. - */ - OrgRole[OrgRole["Admin"] = 1] = "Admin"; - /** - * Basic organization member. Can read public organization data and read/write - * certain [[Vault]]s they have been assigned to directly or via [[Group]]s. - */ - OrgRole[OrgRole["Member"] = 2] = "Member"; - /** - * Suspended members can read public organization data and access [[Vaults]] they - * have been assigned to, but are excluded from any updates to those vaults. - * Member information (like public key and email address) of suspended members - * are considered unverified, and need to be updated and verified via a - * membership confirmation [[Invite]]. - */ - OrgRole[OrgRole["Suspended"] = 3] = "Suspended"; -})(OrgRole || (OrgRole = {})); -/** - * Represents an [[Account]]s membership to an [[Org]] - */ -class OrgMember extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor({ id, name, email, publicKey, signature, orgSignature, role, updated } = {}) { - super(); - /** id of the corresponding [[Account]] */ - this.id = ""; - /** name of the corresponding [[Account]] */ - this.name = ""; - /** email address of the corresponding [[Account]] */ - this.email = ""; - /** vaults assigned to this member */ - this.vaults = []; - /** the members organization role */ - this.role = OrgRole.Member; - /** time the member was last updated */ - this.updated = new Date(0); - Object.assign(this, { id, name, email, publicKey, signature, orgSignature, updated }); - this.role = typeof role !== "undefined" && role in OrgRole ? role : OrgRole.Member; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Object) -], OrgMember.prototype, "publicKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], OrgMember.prototype, "signature", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], OrgMember.prototype, "orgSignature", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Object) -], OrgMember.prototype, "updated", void 0); -/** - * A group of members, used to manage [[Vault]] access for multiple members at once. - */ -class Group extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(vals = {}) { - super(); - /** display name */ - this.name = ""; - /** members assigned to this group */ - this.members = []; - /** [[Vault]]s assigned to this group */ - this.vaults = []; - Object.assign(this, vals); - } -} -var OrgType; -(function (OrgType) { - OrgType[OrgType["Basic"] = 0] = "Basic"; - OrgType[OrgType["Team"] = 1] = "Team"; - OrgType[OrgType["Business"] = 2] = "Business"; -})(OrgType || (OrgType = {})); -class OrgSecrets extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor({ invitesKey, privateKey } = {}) { - super(); - Object.assign(this, { invitesKey, privateKey }); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], OrgSecrets.prototype, "invitesKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], OrgSecrets.prototype, "privateKey", void 0); -/** - * Organizations are the central component of Padlocs secure data sharing architecture. - * - * All shared [[Vault]]s are provisioned and managed in the context of an organization, - * while the [[Org]] class itself is responsible for managing, signing and verifying - * public keys, identities and priviliges for all of it's members. - * - * Vaults can be assigned to members direcly or indirectly through [[Group]]s. In both - * cases, this access can be declared *readonly*. - * - * Before being added to an organization, members need to go throug a key exchange - * procedure designed to allow verification of organization and member details - * by both parties. See [[Invite]] class for details. - * - * The [[privateKey]] and [[invitesKey]] properties are considered secret and are only - * accessible to members with the [[OrgRole.Owner]] role. To protect this information - * from unauthorized access, [[Org]] extends the [[SharedContainer]] class, encrypting - * this data at rest. - * - * #### Organization Structure - * ``` - * ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ - * │ │ ╱│ │╲ │ │ - * │ Account │┼─────────○─│ Membership │──┼────────┼│ Organization │ - * │ │ ╲│ │╱ │ │ - * └──────────────┘ └───┬──────┬───┘ └──────────────┘ - * ╲│╱ ╲│╱ ┼ - * ○ ○ ○ - * │ │ ╱│╲ - * │ │ ┌──────────────┐ - * │ │ ╱│ │ - * │ └──────────────○─│ Group │ - * │ ╲│ │ - * ○ └──────────────┘ - * ╱│╲ ╲│╱ - * ┌──────────────┐ ○ - * │ │╲ │ - * │ Shared Vault │─○──────────────────────┘ - * │ │╱ - * └──────────────┘ - * ``` - */ -class Org extends _container__WEBPACK_IMPORTED_MODULE_3__.SharedContainer { - constructor() { - super(...arguments); - /** Unique identier */ - this.id = ""; - this.type = OrgType.Basic; - /** [[Account]] which created this organization */ - this.owner = ""; - /** Organization name */ - this.name = ""; - /** Creation date */ - this.created = new Date(); - /** Last updated */ - this.updated = new Date(); - /** - * Minimum accepted update time for organization members. - * Any members with a [[OrgMember.updated]] value lower than - * this should be considered invalid. - * - * In order to prevent an attacker from rolling back this value, all - * clients should verify that updated organization object always have a - * [[Org.minMemberUpdated]] value equal to or higher than the previous one. - */ - this.minMemberUpdated = new Date(); - /** Parameters for creating member signatures */ - this.signingParams = new _crypto__WEBPACK_IMPORTED_MODULE_1__.RSASigningParams(); - /** Array of organization members */ - this.members = []; - /** This organizations [[Group]]s. */ - this.groups = []; - /** Shared [[Vault]]s owned by this organization */ - this.vaults = []; - /** Pending [[Invite]]s */ - this.invites = []; - /** - * Revision id used for ensuring continuity when synchronizing the account - * object between client and server - */ - this.revision = ""; - /** - * Whether the organization is in "frozen" state. If an organization is - * frozen, groups, members and vaults assoziated with the Organization can - * not be updated. - */ - this.frozen = false; - this.quota = new _quota__WEBPACK_IMPORTED_MODULE_6__.OrgQuota(); - this.usedStorage = 0; - } - /** Whether the given [[Account]] is an [[OrgRole.Owner]] */ - isOwner(m) { - const member = this.getMember(m); - return !!member && member.role <= OrgRole.Owner; - } - /** Whether the given [[Account]] is an [[OrgRole.Admin]] */ - isAdmin(m) { - const member = this.getMember(m); - return !!member && member.role <= OrgRole.Admin; - } - /** Whether the given [[Account]] is currently suspended */ - isSuspended(m) { - const member = this.getMember(m); - return !!member && member.role === OrgRole.Suspended; - } - /** Get the [[OrgMember]] object for this [[Account]] */ - getMember({ id }) { - return this.members.find(m => m.id === id); - } - /** Whether the given [[Account]] is an organization member */ - isMember(acc) { - return !!this.getMember(acc); - } - /** Get group with the given `name` */ - getGroup(name) { - return [...this.groups].find(g => g.name === name); - } - /** Get all members of a given `group` */ - getMembersForGroup(group) { - return group.members - .map(m => this.getMember(m)) - // Filter out undefined members - .filter(m => !!m); - } - /** Get all [[Group]]s the given [[Account]] is a member of */ - getGroupsForMember({ id }) { - return this.groups.filter(g => g.members.some(m => m.id === id)); - } - /** Get all groups assigned to a given [[Vault]] */ - getGroupsForVault({ id }) { - return this.groups.filter(group => group.vaults.some(v => v.id === id)); - } - /** Get all members directly assigned to a given [[Vault]] */ - getMembersForVault({ id }) { - return this.members.filter(member => member.role !== OrgRole.Suspended && member.vaults.some(v => v.id === id)); - } - /** Get all membes that have acess to a given `vault`, either directly or through a [[Group]] */ - getAccessors(vault) { - const results = new Set(this.getMembersForVault(vault)); - for (const group of this.getGroupsForVault(vault)) { - for (const m of group.members) { - const member = this.getMember(m); - if (member && member.role !== OrgRole.Suspended) { - results.add(member); - } - } - } - return [...results]; - } - /** Get all vaults the given member has access to */ - getVaultsForMember(acc) { - const member = this.getMember(acc); - if (!member) { - throw "A member with this id does not exist!"; - } - const results = new Set(member.vaults.map(v => v.id)); - for (const group of this.getGroupsForMember(member)) { - for (const vault of group.vaults) { - results.add(vault.id); - } - } - return this.vaults.filter(v => results.has(v.id)); - } - /** Check whether the given `account` has read access to a `vault` */ - canRead(vault, account) { - const member = this.getMember(account); - return (member && - [member, ...this.getGroupsForMember(member)].some(({ vaults }) => vaults.some(v => v.id === vault.id))); - } - /** Check whether the given `account` has write access to a `vault` */ - canWrite(vault, acc) { - const member = this.getMember(acc); - return (member && - member.role !== OrgRole.Suspended && - [member, ...this.getGroupsForMember(member)].some(({ vaults }) => vaults.some(v => v.id === vault.id && !v.readonly))); - } - /** Get the invite with the given `id` */ - getInvite(id) { - return this.invites.find(inv => inv.id === id); - } - /** Remove an invite */ - removeInvite({ id }) { - this.invites = this.invites.filter(inv => inv.id !== id); - } - /** - * Initializes the organization, generating [[publicKey]], [[privateKey]], - * and [[invitesKey]] and adding the given `account` as the organization - * owner. - */ - async initialize(account) { - // Update access to keypair - await this.updateAccessors([account]); - // Generate cryptographic keys - await this.generateKeys(); - // Set minimum date for member update times - this.minMemberUpdated = new Date(); - const orgSignature = await account.signOrg(this); - const member = await this.sign(new OrgMember({ - id: account.id, - name: account.name, - email: account.email, - publicKey: account.publicKey, - orgSignature, - role: OrgRole.Owner, - updated: new Date() - })); - this.members.push(member); - } - /** - * Generates a new [[publicKey]], [[privateKey]] and [[invitesKey]] and - * encrypts the latter two - */ - async generateKeys() { - this.invitesKey = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().generateKey(new _crypto__WEBPACK_IMPORTED_MODULE_1__.AESKeyParams()); - const { privateKey, publicKey } = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().generateKey(new _crypto__WEBPACK_IMPORTED_MODULE_1__.RSAKeyParams()); - this.privateKey = privateKey; - this.publicKey = publicKey; - await this.setData(new OrgSecrets(this).toBytes()); - } - /** - * Regenerates all cryptographic keys and updates all member signatures - */ - async rotateKeys(force = false) { - if (!force) { - // Verify members and groups with current public key - await this.verifyAll(); - } - // Rotate Org key pair - await this.generateKeys(); - // Rotate org encryption key - delete this.encryptedData; - await this.updateAccessors(this.members.filter(m => m.role === OrgRole.Owner)); - // Re-sign all members - await Promise.all(this.members.filter(m => m.role !== OrgRole.Suspended).map(m => this.addOrUpdateMember(m))); - } - /** - * "Unlocks" the organization, granting access to the organizations - * [[privateKey]] and [[invitesKey]] properties. - */ - async unlock(account) { - await super.unlock(account); - if (this.encryptedData) { - const secrets = new OrgSecrets().fromBytes(await this.getData()); - Object.assign(this, secrets); - } - } - lock() { - super.lock(); - delete this.privateKey; - delete this.invitesKey; - this.invites.forEach(invite => invite.lock); - } - /** - * Signs the `member`s public key, id, role and email address so they can be verified later - */ - async sign(member) { - if (!this.privateKey) { - throw "Organisation needs to be unlocked first."; - } - member.signature = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().sign(this.privateKey, (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.concatBytes)([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(member.id), - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(member.email), - new Uint8Array([member.role]), - member.publicKey, - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(member.updated.toISOString()) - ], 0x00), this.signingParams); - return member; - } - /** - * Verifies the `member`s public key, id, role and email address. - * Throws if verification fails. - */ - async verify(member) { - if (!member.signature) { - throw new _error__WEBPACK_IMPORTED_MODULE_4__.Err(_error__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.VERIFICATION_ERROR, "No signed public key provided!"); - } - const verified = member.updated >= this.minMemberUpdated && - (await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().verify(this.publicKey, member.signature, (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.concatBytes)([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(member.id), - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(member.email), - new Uint8Array([member.role]), - member.publicKey, - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(member.updated.toISOString()) - ], 0x00), this.signingParams)); - if (!verified) { - throw new _error__WEBPACK_IMPORTED_MODULE_4__.Err(_error__WEBPACK_IMPORTED_MODULE_4__.ErrorCode.VERIFICATION_ERROR, `Failed to verify public key of ${member.name}!`); - } - } - /** - * Verify all provided `members`, throws if verification fails for any of them. - */ - async verifyAll(members = this.members.filter(m => m.role !== OrgRole.Suspended)) { - // Verify public keys for members and groups - await Promise.all(members.map(async (obj) => this.verify(obj))); - } - /** - * Adds a member to the organization, or updates the existing member with the same id. - */ - async addOrUpdateMember({ id, name, email, publicKey, orgSignature, role }) { - if (!this.privateKey) { - throw "Organisation needs to be unlocked first."; - } - role = typeof role !== "undefined" ? role : OrgRole.Member; - const existing = this.members.find(m => m.id === id); - const updated = new Date(); - if (existing) { - Object.assign(existing, { name, email, publicKey, orgSignature, role, updated }); - await this.sign(existing); - } - else { - this.members.push(await this.sign(new OrgMember({ id, name, email, publicKey, orgSignature, role, updated }))); - } - } - /** - * Removes a member from the organization - */ - async removeMember(member) { - if (!this.privateKey) { - throw "Organisation needs to be unlocked first."; - } - // Remove member from all groups - for (const group of this.getGroupsForMember(member)) { - group.members = group.members.filter(m => m.id !== member.id); - } - // Remove member - this.members = this.members.filter(m => m.id !== member.id); - // Verify remaining members (since we're going to re-sign them) - await this.verifyAll(); - // Bump minimum update date - this.minMemberUpdated = new Date(); - // Re-sign all members - await Promise.all(this.members.filter(m => m.role !== OrgRole.Suspended).map(m => this.addOrUpdateMember(m))); - } - toString() { - return this.name; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Date) -], Org.prototype, "created", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Date) -], Org.prototype, "updated", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Object) -], Org.prototype, "publicKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.Exclude)(), - __metadata("design:type", Object) -], Org.prototype, "privateKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.Exclude)(), - __metadata("design:type", Object) -], Org.prototype, "invitesKey", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Date) -], Org.prototype, "minMemberUpdated", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_crypto__WEBPACK_IMPORTED_MODULE_1__.RSASigningParams), - __metadata("design:type", Object) -], Org.prototype, "signingParams", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(OrgMember), - __metadata("design:type", Array) -], Org.prototype, "members", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(Group), - __metadata("design:type", Array) -], Org.prototype, "groups", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_invite__WEBPACK_IMPORTED_MODULE_5__.Invite), - __metadata("design:type", Array) -], Org.prototype, "invites", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_quota__WEBPACK_IMPORTED_MODULE_6__.OrgQuota), - __metadata("design:type", _quota__WEBPACK_IMPORTED_MODULE_6__.OrgQuota) -], Org.prototype, "quota", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_billing__WEBPACK_IMPORTED_MODULE_7__.BillingInfo), - __metadata("design:type", _billing__WEBPACK_IMPORTED_MODULE_7__.BillingInfo) -], Org.prototype, "billing", void 0); - - -/***/ }), - -/***/ "../core/src/otp.ts": -/*!**************************!*\ - !*** ../core/src/otp.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "hotp": () => (/* binding */ hotp), -/* harmony export */ "totp": () => (/* binding */ totp), -/* harmony export */ "parseURL": () => (/* binding */ parseURL) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); - - - - -function getToken(hmac, digits = 6) { - const offset = hmac[hmac.length - 1] & 0xf; - const bin = new Uint8Array([hmac[offset] & 0x7f, hmac[offset + 1], hmac[offset + 2], hmac[offset + 3]]); - const num = (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.bytesToNum)(bin); - return (num % 10 ** digits).toString().padStart(digits, "0"); -} -async function hotp(secret, counter, { hash, digits } = { digits: 6, hash: "SHA-1" }) { - const hmac = await (0,_platform__WEBPACK_IMPORTED_MODULE_2__.getCryptoProvider)().sign(secret, (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.numToBytes)(counter), new _crypto__WEBPACK_IMPORTED_MODULE_1__.HMACParams({ hash, keySize: secret.length * 8 })); - return getToken(hmac, digits); -} -async function totp(secret, time = Date.now(), { interval, ...opts } = { interval: 30, digits: 6, hash: "SHA-1" }) { - const counter = Math.floor(time / interval / 1000); - return hotp(secret, counter, opts); -} -function parseURL(data) { - const url = new URL(data); - const params = new URLSearchParams(url.search); - const secret = params.get("secret"); - if (!secret || !(0,_encoding__WEBPACK_IMPORTED_MODULE_0__.base32ToBytes)(secret).length) { - throw "Invalid secret"; - } - return { secret }; -} - - -/***/ }), - -/***/ "../core/src/quota.ts": -/*!****************************!*\ - !*** ../core/src/quota.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "AccountQuota": () => (/* binding */ AccountQuota), -/* harmony export */ "OrgQuota": () => (/* binding */ OrgQuota) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); - -class AccountQuota extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(vals) { - super(); - this.items = -1; - this.storage = -1; - this.orgs = -1; - if (vals) { - Object.assign(this, vals); - } - } -} -class OrgQuota extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(vals) { - super(); - this.members = -1; - this.groups = -1; - this.vaults = -1; - this.storage = -1; - if (vals) { - Object.assign(this, vals); - } - } -} - - -/***/ }), - -/***/ "../core/src/randomart.ts": -/*!********************************!*\ - !*** ../core/src/randomart.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "defaults": () => (/* binding */ defaults), -/* harmony export */ "getValues": () => (/* binding */ getValues), -/* harmony export */ "randomArt": () => (/* binding */ randomArt) -/* harmony export */ }); -/** Default options */ -const defaults = { - height: 9, - width: 17, - symbols: [" ", ".", "o", "+", "=", "*", "B", "O", "X", "@", "%", "&", "#", "/", "^", "S", "E"] -}; -// Converts a buffer to a binary moves array -function getMoves(bytes) { - const moves = []; - for (const b of bytes) { - let str = b.toString(2); - while (str.length < 8) { - str = "0" + str; - } - moves.push(str.slice(6, 8), str.slice(4, 6), str.slice(2, 4), str.slice(0, 2)); - } - return moves; -} -// Gets the steps from a set of moves and the box's height and width -function getSteps(moves, width, height) { - let pos = [(width - 1) / 2, (height - 1) / 2]; - const steps = [pos]; - for (const move of moves) { - let [x, y] = pos; - switch (move) { - case "00": - x--, y--; - break; - case "01": - x++, y--; - break; - case "10": - x--, y++; - break; - case "11": - x++, y++; - break; - } - pos = [Math.max(0, Math.min(width - 1, x)), Math.max(0, Math.min(height - 1, y))]; - steps.push(pos); - } - return steps; -} -// Renders the randomart image from a given fingerprint -function getValues(fingerprint, opts = {}) { - const { width, height } = Object.assign({}, defaults, opts); - if (height % 2 !== 1 || width % 2 !== 1) { - throw "The height and width options must be odd numbers"; - } - if (fingerprint.length % 2 !== 0) { - throw "The fingerprint length must be an even number"; - } - const moves = getMoves(fingerprint); - const steps = getSteps(moves, width, height); - const grid = []; - for (let i = 0; i < height; i++) { - grid.push(new Array(width).fill(0)); - } - for (const [x, y] of steps) { - grid[y][x]++; - } - const [x0, y0] = steps[0]; - const [x1, y1] = steps[steps.length - 1]; - grid[y0][x0] = 15; - grid[y1][x1] = 16; - return grid; -} -/** - * Generates a visualisation of a "fingerprint" similar to the ascii-based - * visualization method used by OpenSSH. Generates a "heat map" of values on a - * grid of a given width and height using the "drunken bishop" algorithm - * desribed in [this paper](http://www.dirk-loss.de/sshvis/drunken_bishop.pdf). - */ -function randomArt(fingerprint, opts = {}) { - const options = Object.assign({}, defaults, opts); - const vals = getValues(fingerprint, options); - const symbols = opts.symbols || defaults.symbols; - return { - width: options.width, - height: options.height, - values: vals, - symbols: vals.map(line => line.map(val => symbols[val])) - }; -} - - -/***/ }), - -/***/ "../core/src/session.ts": -/*!******************************!*\ - !*** ../core/src/session.ts ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "SessionInfo": () => (/* binding */ SessionInfo), -/* harmony export */ "Session": () => (/* binding */ Session) -/* harmony export */ }); -/* harmony import */ var _transport__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transport */ "../core/src/transport.ts"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - - -/** Public session info (used for display purposes) */ -class SessionInfo extends _encoding__WEBPACK_IMPORTED_MODULE_1__.Serializable { - constructor() { - super(...arguments); - this.id = ""; - this.account = ""; - this.created = new Date(0); - this.updated = new Date(0); - this.lastUsed = new Date(0); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Date) -], SessionInfo.prototype, "created", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Date) -], SessionInfo.prototype, "updated", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Date) -], SessionInfo.prototype, "lastUsed", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Date) -], SessionInfo.prototype, "expires", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsSerializable)(_platform__WEBPACK_IMPORTED_MODULE_3__.DeviceInfo), - __metadata("design:type", _platform__WEBPACK_IMPORTED_MODULE_3__.DeviceInfo) -], SessionInfo.prototype, "device", void 0); -/** - * A session represents a trusted connection between a [[Server]] and [[Client]] - * which can be used to authenticate requests, allowing both parties to verify - * the other parties identity and check the request/response bodies integrity. - * The authentication flow usually works as follows: - * - * ```ts - * // CLIENT - * - * const request = createRequest(); - * await this.session.authenticate(request); - * - * // SERVER - * - * if (!(await context.session.verify(request))) { - * throw "Failed to verify request!"; - * } - * - * const response = processRequest(request); - * await context.session.authenticate(response); - * - * // CLIENT - * - * if (!(await context.session.verify(response))) { - * throw "Failed to verify response!"; - * } - * - * processResponse(response); - * ``` - * - * ``` - * ┌──────────┐ ┌──────────┐ - * │Client (C)│ │Server (S)│ - * └─────┬────┘ └────┬─────┘ - * ┌──────────────────────────┐ │ │ - * │req = [request body] │ │ req, sid, │ - * │t1 = [timestamp] │ │ t1, sig1 │ ┌──────────────────────────┐ - * │sig1 = HMAC(K, sid|t1|req)│ │──────────────▶│ │=> verify sig1 │ - * └──────────────────────────┘ │ │ │res = [response body] │ - * │ │ │t2 = [timestamp] │ - * ┌──────────────┐ │ res, t2, sig2 │ │sig2 = HMAC(K, sid|t2|res)│ - * │=> verify sig2│ │◁ ─ ─ ─ ─ ─ ─ ─│ └──────────────────────────┘ - * └──────────────┘ │ │ - * │ │ - * ▼ ▼ - * ``` - */ -class Session extends _encoding__WEBPACK_IMPORTED_MODULE_1__.Serializable { - constructor() { - super(...arguments); - /** Unique identifier */ - this.id = ""; - /** Associated [[Account]] */ - this.account = ""; - /** Time of creation */ - this.created = new Date(0); - /** Time of last update */ - this.updated = new Date(0); - /** When this session was last used to authenticate a request */ - this.lastUsed = new Date(0); - } - /** - * Public session info - */ - get info() { - return new SessionInfo().fromRaw({ - id: this.id, - account: this.account, - created: this.created, - updated: this.updated, - lastUsed: this.lastUsed, - expires: this.expires, - device: this.device && this.device.toRaw() - }); - } - /** - * Authenticates a [[Request]] or [[Response]] by signing the session id, - * timestamp and request/response body using the session [[key]]. - */ - async authenticate(r) { - const data = r.params || r.result; - r.auth = await this._sign(data); - } - /** - * Verifies session id, timestamp and request/response body of a given - * [[Request]] or [[Response]] using the session [[key]]. - */ - async verify(r) { - if (!r.auth) { - return false; - } - const data = r.params || r.result; - return this._verify(r.auth, data); - } - async _sign(data) { - const time = new Date(); - const session = this.id; - const message = `${session}_${time.toISOString()}_${(0,_encoding__WEBPACK_IMPORTED_MODULE_1__.marshal)(data)}`; - const signature = await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().sign(this.key, (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.stringToBytes)(message), new _crypto__WEBPACK_IMPORTED_MODULE_2__.HMACParams()); - return new _transport__WEBPACK_IMPORTED_MODULE_0__.RequestAuthentication({ - session, - time, - signature - }); - } - async _verify(auth, data) { - const { signature, time } = auth; - const message = `${this.id}_${time.toISOString()}_${(0,_encoding__WEBPACK_IMPORTED_MODULE_1__.marshal)(data)}`; - return await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().verify(this.key, signature, (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.stringToBytes)(message), new _crypto__WEBPACK_IMPORTED_MODULE_2__.HMACParams()); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Object) -], Session.prototype, "created", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Object) -], Session.prototype, "updated", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Object) -], Session.prototype, "lastUsed", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsDate)(), - __metadata("design:type", Date) -], Session.prototype, "expires", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsBytes)(), - __metadata("design:type", Uint8Array) -], Session.prototype, "key", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.AsSerializable)(_platform__WEBPACK_IMPORTED_MODULE_3__.DeviceInfo), - __metadata("design:type", _platform__WEBPACK_IMPORTED_MODULE_3__.DeviceInfo) -], Session.prototype, "device", void 0); - - -/***/ }), - -/***/ "../core/src/srp.ts": -/*!**************************!*\ - !*** ../core/src/srp.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Client": () => (/* binding */ Client), -/* harmony export */ "Server": () => (/* binding */ Server), -/* harmony export */ "Core": () => (/* binding */ Core) -/* harmony export */ }); -/* harmony import */ var _vendor_jsbn__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../vendor/jsbn */ "../core/vendor/jsbn.js"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./crypto */ "../core/src/crypto.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/** - * This module implements version 6a of the [Secure Remote - * Password](http://srp.stanford.edu/design.html) protocol. - * - * The [[Client]] and [[Server]] classes are the high-level interfaces to be - * used on the client and server side, respectively. The SRP key negotiation - * flow usually happens as follows: - * - * #### First signup - * - * ```ts - * // CLIENT - * - * const u = [username/email]; - * const p = [user password]; - * const i = [iteration count]; - * const s = [random salt]; - * - * const x = PBKDF2(p, s, i); - * - * const client = new Client(); - * await client.initialize(x); - * const v = client.v; - * - * => Send u, v, s, i to server - * ``` - * - * #### Login / create session - * - * ```ts - * // CLIENT => request login for `u` - * - * // SERVER - * - * const { v, s, i } = getAuthInfo(u); - * - * const server = new Server(); - * await server.initialize(v); - * const B = server.B; - * - * // => Send s, i, B to client - * - * // CLIENT - * - * const x = PBKDF2(p, s, i); - * - * const client = new Client(); - * await client.initialize(x); - * await client.setB(B); - * - * const A = client.A; - * const M1 = client.M1; - * - * // Common session key - * const K = client.K; - * - * // => Send A, M1 to server - * - * // SERVER - * - * await server.setA(A); - * if (server.M1 !== M1) { - * throw "Invalid credentials!"; - * } - * - * // Common session key - * const K = server.K; - * - * // => Success! - * - * // [OPTIONAL] (This step is usually not required since even without - * // verifying M2, the client will notice something is wrong as soon as they try - * // to verify an authenticated response from the server.) - * - * M2 = server.M2; - * // => Send M2 to client - * - * // CLIENT - * if (client.M2 !== M2) { - * throw "Something is fishy!"; - * } - * ``` - * - * #### Overview: - * - * ``` - * ┌──────────┐ ┌──────────┐ - * │Client (C)│ │Server (S)│ - * └─────┬────┘ └────┬─────┘ - * ┌───────────────────┐ │ │ - * │u = [email address]│ │ u, A │ - * │a, A = [random*] │ │──────────────▶│ - * └───────────────────┘ │ │ ┌────────────────┐ - * │ │ │b, B = [random*]│ - * ┌───────────────────────┐ │ s, i, B │ └────────────────┘ - * │p = [master password] │ │◁ ─ ─ ─ ─ ─ ─ ─│ - * │x = PBKDF2(p,s,i) │ │ │ - * │K = K_client(x, a, B)* │ │ │ - * │M = M(A, B, K)* │ │ M │ ┌───────────────────────┐ - * └───────────────────────┘ │──────────────▶│ │K' = K_server(v, b, A)*│ - * │ │ │M' = M(A, B, K') │ - * │ │ │=> verify M == M' │ - * ┌───────────────┐ │ sid │ │S = [session id] │ - * │=> store sid, K│ │◀ ─ ─ ─ ─ ─ ─ ─│ │=> store sid, K │ - * └───────────────┘ │ │ └───────────────────────┘ - * │ │ - * ▼ ▼ - * ``` - */ - - - - -async function digest(hash = "SHA-256", ...input) { - return (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().hash((0,_encoding__WEBPACK_IMPORTED_MODULE_1__.concatBytes)(input), new _crypto__WEBPACK_IMPORTED_MODULE_2__.HashParams({ algorithm: hash })); -} -function i2b(i) { - let hex = i.toString(16); - if (hex.length % 2) { - hex = "0" + hex; - } - return (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.hexToBytes)(hex); -} -function b2i(b) { - return new _vendor_jsbn__WEBPACK_IMPORTED_MODULE_0__.BigInteger((0,_encoding__WEBPACK_IMPORTED_MODULE_1__.bytesToHex)(b), 16); -} -/** - * High-level interface for the client side - */ -class Client { - constructor(length = 4096) { - this._srp = new Core(length); - } - /** Verifier value, available after calling [[initialize]] */ - get v() { - return this._v ? i2b(this._v) : null; - } - /** Client-side random initializer, available after calling [[initialize]] */ - get A() { - return this._A ? i2b(this._A) : null; - } - /** Common session key, available after calling [[initialize]] and [[setB]] */ - get K() { - return this._K ? i2b(this._K) : null; - } - /** - * First value used to verify a successful key exchange, available after - * calling [[initialize]] and [[setB]] - */ - get M1() { - return this._M1 ? i2b(this._M1) : null; - } - /** - * Second value used to verify a successful key exchange, available after - * calling [[initialize]] and [[setB]] - */ - get M2() { - return this._M2 ? i2b(this._M2) : null; - } - /** Initialize client using the given secret `x`, generating [[v]] and [[A]] */ - async initialize(x) { - this._x = b2i(x); - this._v = this._srp.v(this._x); - this._a = b2i(await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().randomBytes(32)); - this._A = this._srp.A(this._a); - } - /** - * Apply [[Server.B]] value, calculating [[K]], [[M1]] and [[M2]]. - * Should only be called after [[initialize]] has been called. - */ - async setB(B) { - if (!this._x || !this._a || !this._A) { - throw "not initialized"; - } - this._B = b2i(B); - this._K = await this._getKey(); - this._M1 = await this._srp.M1(this._A, this._B, this._K); - this._M2 = await this._srp.M2(this._A, this._M1, this._K); - } - async _getKey() { - if (!this._x || !this._a || !this._A || !this._B) { - throw "not initialized"; - } - if (this._srp.isZeroWhenModN(this._B)) { - throw "Invalid B value"; - } - const u = await this._srp.u(this._A, this._B); - const S = await this._srp.clientS(this._B, this._x, this._a, u); - const K = await this._srp.K(S); - return K; - } -} -class Server { - constructor(length = 4096) { - this._srp = new Core(length); - } - /** Server-side random initializer, available after calling [[initialize]] */ - get B() { - return this._B ? i2b(this._B) : null; - } - /** Common session key, available after calling [[initialize]] and [[setA]] */ - get K() { - return this._K ? i2b(this._K) : null; - } - /** - * First value used to verify a successful key exchange, available after - * calling [[initialize]] and [[setA]] - */ - get M1() { - return this._M1 ? i2b(this._M1) : null; - } - /** - * Second value used to verify a successful key exchange, available after - * calling [[initialize]] and [[setA]] - */ - get M2() { - return this._M2 ? i2b(this._M2) : null; - } - /** Initialize server using the given verfifier `v`. Generates [[B]]. */ - async initialize(v) { - this._v = b2i(v); - this._b = b2i(await (0,_platform__WEBPACK_IMPORTED_MODULE_3__.getCryptoProvider)().randomBytes(32)); - this._B = await this._srp.B(this._v, this._b); - } - /** - * Apply [[Client.A]] value, calculating [[K]], [[M1]] and [[M2]]. - * Should only be called after [[initialize]] has been called. - */ - async setA(A) { - if (!this._v || !this._b || !this._B) { - throw "not initialized"; - } - this._A = b2i(A); - this._K = await this._getKey(); - this._M1 = await this._srp.M1(this._A, this._B, this._K); - this._M2 = await this._srp.M2(this._A, this._M1, this._K); - } - async _getKey() { - if (!this._v || !this._b || !this._B || !this._A) { - throw "not initialized"; - } - if (this._srp.isZeroWhenModN(this._A)) { - throw "Invalid A value"; - } - const u = await this._srp.u(this._A, this._B); - const S = this._srp.serverS(this._A, this._v, u, this._b); - const K = await this._srp.K(S); - return K; - } -} -/** - * Implements various formulas defined in the [SRP - * specification](http://srp.stanford.edu/design.html), used by [[Client]] and - * [[Server]] classes. - */ -class Core { - constructor(length) { - this._params = getParams(length); - if (!this._params) { - throw "Invalid group length!"; - } - } - /** Creates a hash of all arguments, concatenated */ - async H(...inp) { - const hash = await digest(this._params.hash, ...inp.map(i => i2b(i))); - return b2i(hash); - } - /** - * Calculates verifier `v` from secret `x` according to the formula - * ``` - * v = g ^ x % N - * ``` - */ - v(x) { - return this._params.g.modPow(x, this._params.N); - } - /** Calculates `A` from random value `a`, according to the formula - * ``` - * A = g ^ a % N - * ``` - */ - A(a) { - return this._params.g.modPow(a, this._params.N); - } - /** - * Calculates `B` from `v` and the random value `b` according to the formula - * ``` - * B = (k * v + g ^ b % N) % N - * ``` - */ - async B(v, b) { - const k = await this.k(); - return k - .multiply(v) - .add(this._params.g.modPow(b, this._params.N)) - .mod(this._params.N); - } - /** - * Calculates `u` from `A` and `B` according to the formula - * ``` - * u = H(A | B) - * ``` - */ - async u(A, B) { - return await this.H(A, B); - } - /** - * Calculates `S` from `B`, `x`, `a` and `u` according to the formula - * ``` - * S = (B - k * (g ^ x % N)) ^ (a + u * x) % N - * ``` - */ - async clientS(B, x, a, u) { - const k = await this.k(); - return B.subtract(k.multiply(this._params.g.modPow(x, this._params.N))).modPow(a.add(u.multiply(x)), this._params.N); - } - /** - * Calculates `S` from `A`, `v`, `b` and `u` according to the formula - * ``` - * S = (A * v ^ u % N) ^ b % N - * ``` - */ - serverS(A, v, u, b) { - return A.multiply(v.modPow(u, this._params.N)).modPow(b, this._params.N); - } - /** - * Calculates the multiplier `k = H(N | g)` according to the SRP-6a specification - */ - async k() { - return this.H(this._params.N, this._params.g); - } - /** - * Calculates the shared key `K = H(S)` - */ - async K(S) { - return this.H(S); - } - /** - * Calculates the first verification value `M1 = H(A | B | K)` - */ - async M1(A, B, K) { - return await this.H(A, B, K); - } - /** - * Calculates the second verification value `M2 = H(A | M1 | K)` - */ - async M2(A, M1, K) { - return await this.H(A, M1, K); - } - /** - * This is used to ensure that values are not zero when mod N. - */ - isZeroWhenModN(n) { - return n.mod(this._params.N).equals(_vendor_jsbn__WEBPACK_IMPORTED_MODULE_0__.BigInteger.ZERO); - } -} -function h2i(hex) { - return new _vendor_jsbn__WEBPACK_IMPORTED_MODULE_0__.BigInteger(hex.replace(" ", ""), 16); -} -function getParams(length) { - switch (length) { - case 3072: - return { - length: 3072, - hash: "SHA-256", - g: h2i("05"), - N: h2i("FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF") - }; - case 4096: - return { - length: 4096, - hash: "SHA-256", - g: h2i("05"), - N: h2i("FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34063199 FFFFFFFF FFFFFFFF") - }; - case 6144: - return { - length: 6144, - hash: "SHA-256", - g: h2i("05"), - N: h2i("FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E 6DCC4024 FFFFFFFF FFFFFFFF") - }; - case 8192: - return { - length: 8192, - hash: "SHA-256", - g: h2i("13"), - N: h2i("FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4 38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300 741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568 3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9 22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B 4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A 062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36 4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1 B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92 4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47 9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71 60C980DD 98EDD3DF FFFFFFFF FFFFFFFF") - }; - default: - throw "invalid group length"; - } -} - - -/***/ }), - -/***/ "../core/src/transport.ts": -/*!********************************!*\ - !*** ../core/src/transport.ts ***! - \********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "RequestAuthentication": () => (/* binding */ RequestAuthentication), -/* harmony export */ "Request": () => (/* binding */ Request), -/* harmony export */ "Response": () => (/* binding */ Response), -/* harmony export */ "DirectSender": () => (/* binding */ DirectSender), -/* harmony export */ "RequestProgress": () => (/* binding */ RequestProgress) -/* harmony export */ }); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/* harmony import */ var _event_target__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./event-target */ "../core/src/event-target.ts"); -/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./util */ "../core/src/util.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - -/** Authentication data */ -class RequestAuthentication extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor(vals = {}) { - super(); - /** The id of the [[Session]] used for authentication */ - this.session = ""; - Object.assign(this, vals); - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsDate)(), - __metadata("design:type", Date) -], RequestAuthentication.prototype, "time", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsBytes)(), - __metadata("design:type", Uint8Array) -], RequestAuthentication.prototype, "signature", void 0); -/** RPC request object */ -class Request extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - /** Name of the method call */ - this.method = ""; - /** Arguments for the method */ - this.params = undefined; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(RequestAuthentication), - __metadata("design:type", RequestAuthentication) -], Request.prototype, "auth", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(_platform__WEBPACK_IMPORTED_MODULE_1__.DeviceInfo), - __metadata("design:type", _platform__WEBPACK_IMPORTED_MODULE_1__.DeviceInfo) -], Request.prototype, "device", void 0); -/** RPC response object */ -class Response extends _encoding__WEBPACK_IMPORTED_MODULE_0__.Serializable { - constructor() { - super(...arguments); - /** The result of the RPC call */ - this.result = null; - /** Error info, if an error occurred while processing the request */ - this.error = undefined; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_0__.AsSerializable)(RequestAuthentication), - __metadata("design:type", RequestAuthentication) -], Response.prototype, "auth", void 0); -/** - * Stub implementation of the [[Sender]] interface, passing requests directly - * into a [[Server]] instance. this is useful for testing, where client and - * server instances are managed by the same process - */ -class DirectSender { - constructor(server) { - this.server = server; - } - async send(req) { - await (0,_util__WEBPACK_IMPORTED_MODULE_3__.wait)(10); - return this.server.handle(req); - } -} -class RequestProgress extends _event_target__WEBPACK_IMPORTED_MODULE_2__.EventEmitter { - constructor() { - super(...arguments); - this.completed = new Promise((resolve, reject) => { - this._resolveCompleted = resolve; - this._rejectCompleted = reject; - }); - this._uploadProgress = { loaded: 0, total: 0 }; - this._downloadProgress = { loaded: 0, total: 0 }; - } - get uploadProgress() { - return this._uploadProgress; - } - set uploadProgress(progress) { - this._uploadProgress = progress; - this.dispatch("upload-progress", progress); - this.dispatch("progress", this.progress); - } - get downloadProgress() { - return this._downloadProgress; - } - set downloadProgress(progress) { - this._downloadProgress = progress; - this.dispatch("download-progress", progress); - this.dispatch("progress", this.progress); - } - get progress() { - return { - loaded: this.uploadProgress.loaded + this.downloadProgress.loaded, - total: this.uploadProgress.total + this.downloadProgress.total - }; - } - set error(error) { - this._error = error; - if (error) { - this.dispatch("error", { error }); - this.uploadProgress = this.downloadProgress = { loaded: 0, total: 0 }; - this._rejectCompleted(error); - } - } - get error() { - return this._error; - } - complete() { - this._resolveCompleted(); - } -} - - -/***/ }), - -/***/ "../core/src/util.ts": -/*!***************************!*\ - !*** ../core/src/util.ts ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "uuid": () => (/* binding */ uuid), -/* harmony export */ "chars": () => (/* binding */ chars), -/* harmony export */ "charSets": () => (/* binding */ charSets), -/* harmony export */ "randomString": () => (/* binding */ randomString), -/* harmony export */ "randomNumber": () => (/* binding */ randomNumber), -/* harmony export */ "debounce": () => (/* binding */ debounce), -/* harmony export */ "throttle": () => (/* binding */ throttle), -/* harmony export */ "wait": () => (/* binding */ wait), -/* harmony export */ "resolveLanguage": () => (/* binding */ resolveLanguage), -/* harmony export */ "applyMixins": () => (/* binding */ applyMixins), -/* harmony export */ "escapeRegex": () => (/* binding */ escapeRegex) -/* harmony export */ }); -/* harmony import */ var _platform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./platform */ "../core/src/platform.ts"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); - - -/** Generates a random UUID v4 */ -async function uuid() { - const bytes = await (0,_platform__WEBPACK_IMPORTED_MODULE_0__.getCryptoProvider)().randomBytes(16); - // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` - bytes[6] = (bytes[6] & 0x0f) | 0x40; - bytes[8] = (bytes[8] & 0x3f) | 0x80; - // Canonical representation - // XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - return [ - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.bytesToHex)(bytes.slice(0, 4)), - "-", - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.bytesToHex)(bytes.slice(4, 6)), - "-", - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.bytesToHex)(bytes.slice(6, 8)), - "-", - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.bytesToHex)(bytes.slice(8, 10)), - "-", - (0,_encoding__WEBPACK_IMPORTED_MODULE_1__.bytesToHex)(bytes.slice(10, 16)) - ].join(""); -} -/** Caracters, by category */ -const chars = { - numbers: "0123456789", - lower: "abcdefghijklmnopqrstuvwxyz", - upper: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - other: "/+()%\"=&-!:'*#?;,_.@`~$^[{]}\\|<>" -}; -/** Predefined char sets for generating randing strings */ -const charSets = { - full: chars.numbers + chars.upper + chars.lower + chars.other, - alphanum: chars.numbers + chars.upper + chars.lower, - alpha: chars.lower + chars.upper, - num: chars.numbers, - hexa: chars.numbers + "abcdef" -}; -/** Creates a random string with a given `length`, with characters chosen from a given `charSet` */ -async function randomString(length = 32, charSet = charSets.full) { - const provider = (0,_platform__WEBPACK_IMPORTED_MODULE_0__.getCryptoProvider)(); - let str = ""; - while (str.length < length) { - const [rnd] = await provider.randomBytes(1); - // Prevent modulo bias by rejecting values larger than the highest muliple of `charSet.length` - if (rnd > 255 - (256 % charSet.length)) { - continue; - } - str += charSet[rnd % charSet.length]; - } - return str; -} -/** - * Generates a random number between `min` and `max`. - * Taken from https://github.com/EFForg/OpenWireless/blob/master/app/js/diceware.js - */ -async function randomNumber(min = 0, max = 10) { - if (max < min) { - throw "Upper bound must be greater than or equal to lower bound!"; - } - let rval = 0; - const range = max - min + 1; - const bitsNeeded = Math.ceil(Math.log2(range)); - if (bitsNeeded > 53) { - throw new Error("We cannot generate numbers larger than 53 bits."); - } - const bytesNeeded = Math.ceil(bitsNeeded / 8); - const mask = Math.pow(2, bitsNeeded) - 1; - // Fill a byte array with N random numbers - const byteArray = await (0,_platform__WEBPACK_IMPORTED_MODULE_0__.getCryptoProvider)().randomBytes(bytesNeeded); - let p = (bytesNeeded - 1) * 8; - for (let i = 0; i < bytesNeeded; i++) { - rval += byteArray[i] * Math.pow(2, p); - p -= 8; - } - // Use & to apply the mask and reduce the number of recursive lookups - // tslint:disable-next-line - rval = rval & mask; - if (rval >= range) { - // Integer out of acceptable range - return randomNumber(min, max); - } - // Return an integer that falls within the range - return min + rval; -} -/** - * "Debounces" a function, making sure it is only called once within a certain - * time window - */ -function debounce(fn, delay) { - let timeout; - return function (...args) { - clearTimeout(timeout); - timeout = window.setTimeout(() => fn(...args), delay); - }; -} -// export function throttle(fn: (...args: any[]) => any, delay: number) { -// let throttling = false; -// let lastCall = args: any[]; -// -// return function(...args: any[]) { -// if (!throttling) { -// fn(...args); -// throttling = true; -// setTimeout(() => (throttling = false), delay); -// } -// }; -// } -function throttle(fn, delay) { - let lastCall; - let lastRan; - return (...args) => { - if (!lastRan) { - fn(...args); - lastRan = Date.now(); - } - else { - clearTimeout(lastCall); - lastCall = setTimeout(() => { - if (Date.now() - lastRan >= delay) { - fn(...args); - lastRan = Date.now(); - } - }, delay - (Date.now() - lastRan)); - } - }; -} -/** Returns a promise that resolves after a given `delay`. */ -function wait(delay) { - return new Promise(resolve => setTimeout(resolve, delay)); -} -/** - * Resolves a given locale string to the approprivate available language - */ -function resolveLanguage(locale, supportedLanguages) { - const localeParts = locale.toLowerCase().split("-"); - while (localeParts.length) { - const l = localeParts.join("-"); - if (supportedLanguages[l]) { - return l; - } - localeParts.pop(); - } - return Object.keys(supportedLanguages)[0]; -} -/** - * Applies a number of class `mixins` to a `baseClass` - */ -function applyMixins(baseClass, ...mixins) { - return mixins.reduce((cls, mixin) => mixin(cls), baseClass); -} -/** - * Escapes all regex special characters within a given string. - */ -function escapeRegex(str) { - return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); -} - - -/***/ }), - -/***/ "../core/src/vault.ts": -/*!****************************!*\ - !*** ../core/src/vault.ts ***! - \****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Vault": () => (/* binding */ Vault) -/* harmony export */ }); -/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./container */ "../core/src/container.ts"); -/* harmony import */ var _collection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./collection */ "../core/src/collection.ts"); -/* harmony import */ var _encoding__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./encoding */ "../core/src/encoding.ts"); -/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./error */ "../core/src/error.ts"); -var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); - else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -}; -var __metadata = (undefined && undefined.__metadata) || function (k, v) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); -}; - - - - -/** - * Container for securely storing a collection of [[VaultItem]]s. Vaults can be owned by a single - * user ("private" vaults) or shared between multiple users ("shared" vaults). Shared vaults are - * provisioned and managed through [[Org]]s. - */ -class Vault extends _container__WEBPACK_IMPORTED_MODULE_0__.SharedContainer { - constructor() { - super(...arguments); - /** unique identifier */ - this.id = ""; - /** The [[Org]] this vault belongs to (if a shared vault) */ - this.org = undefined; - /** Vault name */ - this.name = ""; - /** The vault owner (the [[Account]] that created this vault) */ - this.owner = ""; - /** Time of creation */ - this.created = new Date(0); - /** Time of last update */ - this.updated = new Date(0); - /** - * Revision id used for ensuring continuity when synchronizing the vault - * object between client and server - */ - this.revision = ""; - /** - * A collection [[VaultItem]]s representing the senstive data store in this vault - * - * @secret - * - * **IMPORTANT**: This property is considered **secret** - * and should never stored or transmitted in plain text - */ - this.items = new _collection__WEBPACK_IMPORTED_MODULE_1__.VaultItemCollection(); - } - /** - * Unlocks the vault with the given `account`, decrypting the data stored in the vault - * and populating the [[items]] property. For this to be successful, the `account` object - * needs to be unlocked and the account must have access to this vault. - */ - async unlock(account) { - if (!this.accessors.length) { - await this.updateAccessors([account]); - await this.commit(); - } - else { - await super.unlock(account); - this.items.fromBytes(await this.getData()); - } - } - async lock() { - await super.lock(); - this.items = new _collection__WEBPACK_IMPORTED_MODULE_1__.VaultItemCollection(); - } - /** - * Commit changes to `items` by reencrypting the data. - */ - async commit() { - await this.setData(this.items.toBytes()); - } - /** - * Merges in changes from another `vault`. This requires both vaults to be unlocked. - * - * @returns `true` if there have been any "forward changes", i.e. if there - * have been any changes in this vault that may need to be applied to other - * instances. Specifically, this can be used during synchronization with a [[Server]] - * to determine whether an update needs to be pushed back. - */ - merge(vault) { - this.items.merge(vault.items); - this.name = vault.name; - this.revision = vault.revision; - this.org = vault.org; - this.updated = vault.updated; - } - toString() { - return this.org ? `${this.org.name} / ${this.name}` : this.name; - } - clone() { - const clone = super.clone(); - clone.items = this.items.clone(); - return clone; - } -} -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsDate)(), - __metadata("design:type", Object) -], Vault.prototype, "created", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.AsDate)(), - __metadata("design:type", Object) -], Vault.prototype, "updated", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.Exclude)(), - __metadata("design:type", Object) -], Vault.prototype, "items", void 0); -__decorate([ - (0,_encoding__WEBPACK_IMPORTED_MODULE_2__.Exclude)(), - __metadata("design:type", _error__WEBPACK_IMPORTED_MODULE_3__.Err) -], Vault.prototype, "error", void 0); - - -/***/ }), - -/***/ "../locale/src/countries.ts": -/*!**********************************!*\ - !*** ../locale/src/countries.ts ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "countries": () => (/* binding */ countries) -/* harmony export */ }); -const countries = [ - { code: "AF", name: "Afghanistan" }, - { code: "AX", name: "Åland Islands" }, - { code: "AL", name: "Albania" }, - { code: "DZ", name: "Algeria" }, - { code: "AD", name: "Andorra" }, - { code: "AO", name: "Angola" }, - { code: "AI", name: "Anguilla" }, - { code: "AQ", name: "Antarctica" }, - { code: "AG", name: "Antigua & Barbuda" }, - { code: "AR", name: "Argentina" }, - { code: "AM", name: "Armenia" }, - { code: "AW", name: "Aruba" }, - { code: "AC", name: "Ascension Island" }, - { code: "AU", name: "Australia" }, - { code: "AT", name: "Austria" }, - { code: "AZ", name: "Azerbaijan" }, - { code: "BS", name: "Bahamas" }, - { code: "BH", name: "Bahrain" }, - { code: "BD", name: "Bangladesh" }, - { code: "BB", name: "Barbados" }, - { code: "BY", name: "Belarus" }, - { code: "BE", name: "Belgium" }, - { code: "BZ", name: "Belize" }, - { code: "BJ", name: "Benin" }, - { code: "BM", name: "Bermuda" }, - { code: "BT", name: "Bhutan" }, - { code: "BO", name: "Bolivia" }, - { code: "BA", name: "Bosnia & Herzegovina" }, - { code: "BW", name: "Botswana" }, - { code: "BV", name: "Bouvet Island" }, - { code: "BR", name: "Brazil" }, - { code: "IO", name: "British Indian Ocean Territory" }, - { code: "VG", name: "British Virgin Islands" }, - { code: "BN", name: "Brunei" }, - { code: "BG", name: "Bulgaria" }, - { code: "BF", name: "Burkina Faso" }, - { code: "BI", name: "Burundi" }, - { code: "KH", name: "Cambodia" }, - { code: "CM", name: "Cameroon" }, - { code: "CA", name: "Canada" }, - { code: "CV", name: "Cape Verde" }, - { code: "BQ", name: "Caribbean Netherlands" }, - { code: "KY", name: "Cayman Islands" }, - { code: "CF", name: "Central African Republic" }, - { code: "TD", name: "Chad" }, - { code: "CL", name: "Chile" }, - { code: "CN", name: "China" }, - { code: "CO", name: "Colombia" }, - { code: "KM", name: "Comoros" }, - { code: "CG", name: "Congo - Brazzaville" }, - { code: "CD", name: "Congo - Kinshasa" }, - { code: "CK", name: "Cook Islands" }, - { code: "CR", name: "Costa Rica" }, - { code: "CI", name: "Côte d’Ivoire" }, - { code: "HR", name: "Croatia" }, - { code: "CW", name: "Curaçao" }, - { code: "CY", name: "Cyprus" }, - { code: "CZ", name: "Czechia" }, - { code: "DK", name: "Denmark" }, - { code: "DJ", name: "Djibouti" }, - { code: "DM", name: "Dominica" }, - { code: "DO", name: "Dominican Republic" }, - { code: "EC", name: "Ecuador" }, - { code: "EG", name: "Egypt" }, - { code: "SV", name: "El Salvador" }, - { code: "GQ", name: "Equatorial Guinea" }, - { code: "ER", name: "Eritrea" }, - { code: "EE", name: "Estonia" }, - { code: "ET", name: "Ethiopia" }, - { code: "FK", name: "Falkland Islands" }, - { code: "FO", name: "Faroe Islands" }, - { code: "FJ", name: "Fiji" }, - { code: "FI", name: "Finland" }, - { code: "FR", name: "France" }, - { code: "GF", name: "French Guiana" }, - { code: "PF", name: "French Polynesia" }, - { code: "TF", name: "French Southern Territories" }, - { code: "GA", name: "Gabon" }, - { code: "GM", name: "Gambia" }, - { code: "GE", name: "Georgia" }, - { code: "DE", name: "Germany" }, - { code: "GH", name: "Ghana" }, - { code: "GI", name: "Gibraltar" }, - { code: "GR", name: "Greece" }, - { code: "GL", name: "Greenland" }, - { code: "GD", name: "Grenada" }, - { code: "GP", name: "Guadeloupe" }, - { code: "GU", name: "Guam" }, - { code: "GT", name: "Guatemala" }, - { code: "GG", name: "Guernsey" }, - { code: "GN", name: "Guinea" }, - { code: "GW", name: "Guinea-Bissau" }, - { code: "GY", name: "Guyana" }, - { code: "HT", name: "Haiti" }, - { code: "HN", name: "Honduras" }, - { code: "HK", name: "Hong Kong SAR China" }, - { code: "HU", name: "Hungary" }, - { code: "IS", name: "Iceland" }, - { code: "IN", name: "India" }, - { code: "ID", name: "Indonesia" }, - { code: "IR", name: "Iran" }, - { code: "IQ", name: "Iraq" }, - { code: "IE", name: "Ireland" }, - { code: "IM", name: "Isle of Man" }, - { code: "IL", name: "Israel" }, - { code: "IT", name: "Italy" }, - { code: "JM", name: "Jamaica" }, - { code: "JP", name: "Japan" }, - { code: "JE", name: "Jersey" }, - { code: "JO", name: "Jordan" }, - { code: "KZ", name: "Kazakhstan" }, - { code: "KE", name: "Kenya" }, - { code: "KI", name: "Kiribati" }, - { code: "XK", name: "Kosovo" }, - { code: "KW", name: "Kuwait" }, - { code: "KG", name: "Kyrgyzstan" }, - { code: "LA", name: "Laos" }, - { code: "LV", name: "Latvia" }, - { code: "LB", name: "Lebanon" }, - { code: "LS", name: "Lesotho" }, - { code: "LR", name: "Liberia" }, - { code: "LY", name: "Libya" }, - { code: "LI", name: "Liechtenstein" }, - { code: "LT", name: "Lithuania" }, - { code: "LU", name: "Luxembourg" }, - { code: "MO", name: "Macau SAR China" }, - { code: "MK", name: "Macedonia" }, - { code: "MG", name: "Madagascar" }, - { code: "MW", name: "Malawi" }, - { code: "MY", name: "Malaysia" }, - { code: "MV", name: "Maldives" }, - { code: "ML", name: "Mali" }, - { code: "MT", name: "Malta" }, - { code: "MQ", name: "Martinique" }, - { code: "MR", name: "Mauritania" }, - { code: "MU", name: "Mauritius" }, - { code: "YT", name: "Mayotte" }, - { code: "MX", name: "Mexico" }, - { code: "MD", name: "Moldova" }, - { code: "MC", name: "Monaco" }, - { code: "MN", name: "Mongolia" }, - { code: "ME", name: "Montenegro" }, - { code: "MS", name: "Montserrat" }, - { code: "MA", name: "Morocco" }, - { code: "MZ", name: "Mozambique" }, - { code: "MM", name: "Myanmar (Burma)" }, - { code: "NA", name: "Namibia" }, - { code: "NR", name: "Nauru" }, - { code: "NP", name: "Nepal" }, - { code: "NL", name: "Netherlands" }, - { code: "NC", name: "New Caledonia" }, - { code: "NZ", name: "New Zealand" }, - { code: "NI", name: "Nicaragua" }, - { code: "NE", name: "Niger" }, - { code: "NG", name: "Nigeria" }, - { code: "NU", name: "Niue" }, - { code: "NO", name: "Norway" }, - { code: "OM", name: "Oman" }, - { code: "PK", name: "Pakistan" }, - { code: "PS", name: "Palestinian Territories" }, - { code: "PA", name: "Panama" }, - { code: "PG", name: "Papua New Guinea" }, - { code: "PY", name: "Paraguay" }, - { code: "PE", name: "Peru" }, - { code: "PH", name: "Philippines" }, - { code: "PN", name: "Pitcairn Islands" }, - { code: "PL", name: "Poland" }, - { code: "PT", name: "Portugal" }, - { code: "PR", name: "Puerto Rico" }, - { code: "QA", name: "Qatar" }, - { code: "RE", name: "Réunion" }, - { code: "RO", name: "Romania" }, - { code: "RU", name: "Russia" }, - { code: "RW", name: "Rwanda" }, - { code: "WS", name: "Samoa" }, - { code: "SM", name: "San Marino" }, - { code: "ST", name: "São Tomé & Príncipe" }, - { code: "SA", name: "Saudi Arabia" }, - { code: "SN", name: "Senegal" }, - { code: "RS", name: "Serbia" }, - { code: "SC", name: "Seychelles" }, - { code: "SL", name: "Sierra Leone" }, - { code: "SG", name: "Singapore" }, - { code: "SX", name: "Sint Maarten" }, - { code: "SK", name: "Slovakia" }, - { code: "SI", name: "Slovenia" }, - { code: "SB", name: "Solomon Islands" }, - { code: "SO", name: "Somalia" }, - { code: "ZA", name: "South Africa" }, - { code: "GS", name: "South Georgia & South Sandwich Islands" }, - { code: "KR", name: "South Korea" }, - { code: "SS", name: "South Sudan" }, - { code: "ES", name: "Spain" }, - { code: "LK", name: "Sri Lanka" }, - { code: "BL", name: "St. Barthélemy" }, - { code: "SH", name: "St. Helena" }, - { code: "KN", name: "St. Kitts & Nevis" }, - { code: "LC", name: "St. Lucia" }, - { code: "MF", name: "St. Martin" }, - { code: "PM", name: "St. Pierre & Miquelon" }, - { code: "VC", name: "St. Vincent & Grenadines" }, - { code: "SR", name: "Suriname" }, - { code: "SJ", name: "Svalbard & Jan Mayen" }, - { code: "SZ", name: "Swaziland" }, - { code: "SE", name: "Sweden" }, - { code: "CH", name: "Switzerland" }, - { code: "TW", name: "Taiwan" }, - { code: "TJ", name: "Tajikistan" }, - { code: "TZ", name: "Tanzania" }, - { code: "TH", name: "Thailand" }, - { code: "TL", name: "Timor-Leste" }, - { code: "TG", name: "Togo" }, - { code: "TK", name: "Tokelau" }, - { code: "TO", name: "Tonga" }, - { code: "TT", name: "Trinidad & Tobago" }, - { code: "TA", name: "Tristan da Cunha" }, - { code: "TN", name: "Tunisia" }, - { code: "TR", name: "Turkey" }, - { code: "TM", name: "Turkmenistan" }, - { code: "TC", name: "Turks & Caicos Islands" }, - { code: "TV", name: "Tuvalu" }, - { code: "UG", name: "Uganda" }, - { code: "UA", name: "Ukraine" }, - { code: "AE", name: "United Arab Emirates" }, - { code: "GB", name: "United Kingdom" }, - { code: "US", name: "United States" }, - { code: "UY", name: "Uruguay" }, - { code: "UZ", name: "Uzbekistan" }, - { code: "VU", name: "Vanuatu" }, - { code: "VA", name: "Vatican City" }, - { code: "VE", name: "Venezuela" }, - { code: "VN", name: "Vietnam" }, - { code: "WF", name: "Wallis & Futuna" }, - { code: "EH", name: "Western Sahara" }, - { code: "YE", name: "Yemen" }, - { code: "ZM", name: "Zambia" }, - { code: "ZW", name: "Zimbabwe" } -]; - - -/***/ }), - -/***/ "../locale/src/wordlists.ts": -/*!**********************************!*\ - !*** ../locale/src/wordlists.ts ***! - \**********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getWordList": () => (/* binding */ getWordList), -/* harmony export */ "AVAILABLE_LANGUAGES": () => (/* binding */ AVAILABLE_LANGUAGES) -/* harmony export */ }); -const loadWordListPromises = new Map(); -async function getWordList(lang) { - lang = lang.toLowerCase(); - if (loadWordListPromises.has(lang)) { - return loadWordListPromises.get(lang); - } - const promise = (async () => { - try { - const { default: words } = await __webpack_require__("../locale/res/wordlists lazy recursive ^\\.\\/.*\\.json$")(`./${lang}.json`); - return words; - } - catch (e) { - const dashIndex = lang.lastIndexOf("-"); - if (dashIndex !== -1) { - return getWordList(lang.substring(0, dashIndex)); - } - else { - return []; - } - } - })(); - loadWordListPromises.set(lang, promise); - return promise; -} -const AVAILABLE_LANGUAGES = [ - { value: "en", toString: () => "English" }, - { value: "de", toString: () => "Deutsch" }, - { value: "es", toString: () => "Español" }, - { value: "pt", toString: () => "Português" }, - { value: "fr", toString: () => "Français" } -]; - - -/***/ }) - -}]); -//# sourceMappingURL=app_src_elements_app_ts.chunk.js.map \ No newline at end of file diff --git a/cypress/fixtures/v3-client/app_src_elements_app_ts.chunk.js.map b/cypress/fixtures/v3-client/app_src_elements_app_ts.chunk.js.map deleted file mode 100644 index e3f123dc..00000000 --- a/cypress/fixtures/v3-client/app_src_elements_app_ts.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app_src_elements_app_ts.chunk.js","mappings":";;;;;;;;;;;;;;AAAA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,SAAS;AACtB;AACA,cAAc,SAAS;AACvB;AACA,cAAc,SAAS;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC,oBAAoB,QAAQ;AAC5B;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA;AACA,qBAAqB,QAAQ;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,YAAY;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,aAAa;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB,yCAAyC;AACzC,2CAA2C;AAC3C,4DAA4D;AAC5D;AACA;AACA,mDAAmD;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB;AACtB;AACA;AACA;AACA;;AAEA,qBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA,oBAAoB,YAAY;AAChC;AACA,MAAM;AACN;AACA,oBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,2BAA2B,OAAO;AAClC,+BAA+B,OAAO;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,sCAAsC,SAAS;AAC/C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kCAAkC,8BAA8B;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC,UAAU;AACV;AACA;AACA,wBAAwB,cAAc;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA2B,4BAA4B;AACvD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,eAAe;AAC/B;;AAEO;;AAEP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;AC1uDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtCA;AACgI;AAC7B;AACO;AAC3C;AACE;AACC;AACJ;AACQ;AACZ;AACC;AACD;AACA;AACY;AACG;AACD;AACD;AACA;AACvE,8BAA8B,uFAA2B,CAAC,4GAAqC;AAC/F,yCAAyC,0FAA+B,CAAC,yDAA6B;AACtG,yCAAyC,0FAA+B,CAAC,2DAA6B;AACtG,yCAAyC,0FAA+B,CAAC,4DAA6B;AACtG,yCAAyC,0FAA+B,CAAC,wDAA6B;AACtG,yCAAyC,0FAA+B,CAAC,gEAA6B;AACtG,yCAAyC,0FAA+B,CAAC,oDAA6B;AACtG,yCAAyC,0FAA+B,CAAC,qDAA6B;AACtG,yCAAyC,0FAA+B,CAAC,qDAA6B;AA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","sources":["webpack://@padloc/pwa/../core/vendor/jsbn.js","webpack://@padloc/pwa/../locale/res/wordlists|lazy|/^\\.\\/.*\\.json$/|groupOptions: {}|namespace object","webpack://@padloc/pwa/../app/assets/fonts/fonts.css","webpack://@padloc/pwa/../app/assets/fonts/Inconsolata-Regular.ttf","webpack://@padloc/pwa/../app/assets/fonts/Nunito-Bold.ttf","webpack://@padloc/pwa/../app/assets/fonts/Nunito-Light.ttf","webpack://@padloc/pwa/../app/assets/fonts/Nunito-Regular.ttf","webpack://@padloc/pwa/../app/assets/fonts/Nunito-SemiBold.ttf","webpack://@padloc/pwa/../app/assets/fonts/Padlock.eot","webpack://@padloc/pwa/../app/assets/fonts/Padlock.svg","webpack://@padloc/pwa/../app/assets/fonts/Padlock.ttf","webpack://@padloc/pwa/../app/assets/fonts/Padlock.woff","webpack://@padloc/pwa/../app/assets/fonts/fontawesome-webfont.eot","webpack://@padloc/pwa/../app/assets/fonts/fontawesome-webfont.svg","webpack://@padloc/pwa/../app/assets/fonts/fontawesome-webfont.ttf","webpack://@padloc/pwa/../app/assets/fonts/fontawesome-webfont.woff","webpack://@padloc/pwa/../app/assets/fonts/fontawesome-webfont.woff2","webpack://@padloc/pwa/../app/assets/fonts/fonts.css?3c27","webpack://@padloc/pwa/../app/src/elements/alert-dialog.ts","webpack://@padloc/pwa/../app/src/elements/app.ts","webpack://@padloc/pwa/../app/src/elements/attachment-dialog.ts","webpack://@padloc/pwa/../app/src/elements/base-input.ts","webpack://@padloc/pwa/../app/src/elements/base.ts","webpack://@padloc/pwa/../app/src/elements/billing-dialog.ts","webpack://@padloc/pwa/../app/src/elements/billing-info.ts","webpack://@padloc/pwa/../app/src/elements/card-input.ts","webpack://@padloc/pwa/../app/src/elements/choose-plan-dialog.ts","webpack://@padloc/pwa/../app/src/elements/clipboard.ts","webpack://@padloc/pwa/../app/src/elements/create-invites-dialog.ts","webpack://@padloc/pwa/../app/src/elements/create-item-dialog.ts","webpack://@padloc/pwa/../app/src/elements/create-org-dialog.ts","webpack://@padloc/pwa/../app/src/elements/dialog.ts","webpack://@padloc/pwa/../app/src/elements/export-dialog.ts","webpack://@padloc/pwa/../app/src/elements/field-type-dialog.ts","webpack://@padloc/pwa/../app/src/elements/field.ts","webpack://@padloc/pwa/../app/src/elements/generator.ts","webpack://@padloc/pwa/../app/src/elements/group-dialog.ts","webpack://@padloc/pwa/../app/src/elements/group-item.ts","webpack://@padloc/pwa/../app/src/elements/icon.ts","webpack://@padloc/pwa/../app/src/elements/import-dialog.ts","webpack://@padloc/pwa/../app/src/elements/input.ts","webpack://@padloc/pwa/../app/src/elements/invite-dialog.ts","webpack://@padloc/pwa/../app/src/elements/invite-item.ts","webpack://@padloc/pwa/../app/src/elements/item-dialog.ts","webpack://@padloc/pwa/../app/src/elements/items-filter.ts","webpack://@padloc/pwa/../app/src/elements/items-list.ts","webpack://@padloc/pwa/../app/src/elements/loading-button.ts","webpack://@padloc/pwa/../app/src/elements/login.ts","webpack://@padloc/pwa/../app/src/elements/logo.ts","webpack://@padloc/pwa/../app/src/elements/member-dialog.ts","webpack://@padloc/pwa/../app/src/elements/member-item.ts","webpack://@padloc/pwa/../app/src/elements/menu.ts","webpack://@padloc/pwa/../app/src/elements/move-items-dialog.ts","webpack://@padloc/pwa/../app/src/elements/org-view.ts","webpack://@padloc/pwa/../app/src/elements/orgs-list.ts","webpack://@padloc/pwa/../app/src/elements/password-input.ts","webpack://@padloc/pwa/../app/src/elements/premium-dialog.ts","webpack://@padloc/pwa/../app/src/elements/prompt-dialog.ts","webpack://@padloc/pwa/../app/src/elements/qr-dialog.ts","webpack://@padloc/pwa/../app/src/elements/randomart.ts","webpack://@padloc/pwa/../app/src/elements/recover.ts","webpack://@padloc/pwa/../app/src/elements/report-errors-dialog.ts","webpack://@padloc/pwa/../app/src/elements/select.ts","webpack://@padloc/pwa/../app/src/elements/settings.ts","webpack://@padloc/pwa/../app/src/elements/signup.ts","webpack://@padloc/pwa/../app/src/elements/slider.ts","webpack://@padloc/pwa/../app/src/elements/spinner.ts","webpack://@padloc/pwa/../app/src/elements/start-form.ts","webpack://@padloc/pwa/../app/src/elements/start.ts","webpack://@padloc/pwa/../app/src/elements/subscription.ts","webpack://@padloc/pwa/../app/src/elements/tags-input.ts","webpack://@padloc/pwa/../app/src/elements/textarea.ts","webpack://@padloc/pwa/../app/src/elements/toggle-button.ts","webpack://@padloc/pwa/../app/src/elements/toggle.ts","webpack://@padloc/pwa/../app/src/elements/totp.ts","webpack://@padloc/pwa/../app/src/elements/unlock.ts","webpack://@padloc/pwa/../app/src/elements/update-subscription-dialog.ts","webpack://@padloc/pwa/../app/src/elements/upload-dialog.ts","webpack://@padloc/pwa/../app/src/elements/vault-dialog.ts","webpack://@padloc/pwa/../app/src/elements/vault-item.ts","webpack://@padloc/pwa/../app/src/elements/view.ts","webpack://@padloc/pwa/../app/src/elements/virtual-list.ts","webpack://@padloc/pwa/../app/src/globals.ts","webpack://@padloc/pwa/../app/src/lib/ajax.ts","webpack://@padloc/pwa/../app/src/lib/animation.ts","webpack://@padloc/pwa/../app/src/lib/clipboard.ts","webpack://@padloc/pwa/../app/src/lib/dialog.ts","webpack://@padloc/pwa/../app/src/lib/export.ts","webpack://@padloc/pwa/../app/src/lib/import.ts","webpack://@padloc/pwa/../app/src/lib/route.ts","webpack://@padloc/pwa/../app/src/lib/singleton.ts","webpack://@padloc/pwa/../app/src/lib/util.ts","webpack://@padloc/pwa/../app/src/mixins/auto-lock.ts","webpack://@padloc/pwa/../app/src/mixins/auto-sync.ts","webpack://@padloc/pwa/../app/src/mixins/error-handling.ts","webpack://@padloc/pwa/../app/src/mixins/service-worker.ts","webpack://@padloc/pwa/../app/src/mixins/state.ts","webpack://@padloc/pwa/../app/src/styles/config.ts","webpack://@padloc/pwa/../app/src/styles/index.ts","webpack://@padloc/pwa/../app/src/styles/mixins.ts","webpack://@padloc/pwa/../app/src/styles/shared.ts","webpack://@padloc/pwa/../core/src/account.ts","webpack://@padloc/pwa/../core/src/api.ts","webpack://@padloc/pwa/../core/src/app.ts","webpack://@padloc/pwa/../core/src/attachment.ts","webpack://@padloc/pwa/../core/src/auth.ts","webpack://@padloc/pwa/../core/src/billing.ts","webpack://@padloc/pwa/../core/src/client.ts","webpack://@padloc/pwa/../core/src/collection.ts","webpack://@padloc/pwa/../core/src/container.ts","webpack://@padloc/pwa/../core/src/crypto.ts","webpack://@padloc/pwa/../core/src/diceware.ts","webpack://@padloc/pwa/../core/src/event-target.ts","webpack://@padloc/pwa/../core/src/invite.ts","webpack://@padloc/pwa/../core/src/item.ts","webpack://@padloc/pwa/../core/src/legacy.ts","webpack://@padloc/pwa/../core/src/mfa.ts","webpack://@padloc/pwa/../core/src/org.ts","webpack://@padloc/pwa/../core/src/otp.ts","webpack://@padloc/pwa/../core/src/quota.ts","webpack://@padloc/pwa/../core/src/randomart.ts","webpack://@padloc/pwa/../core/src/session.ts","webpack://@padloc/pwa/../core/src/srp.ts","webpack://@padloc/pwa/../core/src/transport.ts","webpack://@padloc/pwa/../core/src/util.ts","webpack://@padloc/pwa/../core/src/vault.ts","webpack://@padloc/pwa/../locale/src/countries.ts","webpack://@padloc/pwa/../locale/src/wordlists.ts"],"sourcesContent":["// Copyright (c) 2005 Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n\n// Basic JavaScript BN library - subset useful for RSA encryption.\n\n// Bits per digit\nvar dbits;\n\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = (canary & 0xffffff) == 0xefcafe;\n\n// (public) Constructor\nexport function BigInteger(a, b, c) {\n if (a != null)\n if (\"number\" == typeof a) this.fromNumber(a, b, c);\n else if (b == null && \"string\" != typeof a) this.fromString(a, 256);\n else this.fromString(a, b);\n}\n\n// return new, unset BigInteger\nfunction nbi() {\n return new BigInteger(null);\n}\n\n// am: Compute w_j += (x*this_i), propagate carries,\n// c is initial carry, returns final carry.\n// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n// We need to select the fastest one that works in this environment.\n\n// am1: use a single mult and divide to get the high bits,\n// max digit bits should be 26 because\n// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\nfunction am1(i, x, w, j, c, n) {\n while (--n >= 0) {\n var v = x * this[i++] + w[j] + c;\n c = Math.floor(v / 0x4000000);\n w[j++] = v & 0x3ffffff;\n }\n return c;\n}\n// am2 avoids a big mult-and-extract completely.\n// Max digit bits should be <= 30 because we do bitwise ops\n// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\nfunction am2(i, x, w, j, c, n) {\n var xl = x & 0x7fff,\n xh = x >> 15;\n while (--n >= 0) {\n var l = this[i] & 0x7fff;\n var h = this[i++] >> 15;\n var m = xh * l + h * xl;\n l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);\n c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);\n w[j++] = l & 0x3fffffff;\n }\n return c;\n}\n// Alternately, set max digit bits to 28 since some\n// browsers slow down when dealing with 32-bit numbers.\nfunction am3(i, x, w, j, c, n) {\n var xl = x & 0x3fff,\n xh = x >> 14;\n while (--n >= 0) {\n var l = this[i] & 0x3fff;\n var h = this[i++] >> 14;\n var m = xh * l + h * xl;\n l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;\n c = (l >> 28) + (m >> 14) + xh * h;\n w[j++] = l & 0xfffffff;\n }\n return c;\n}\nvar inBrowser = typeof navigator !== \"undefined\";\nif (inBrowser && j_lm && navigator.appName == \"Microsoft Internet Explorer\") {\n BigInteger.prototype.am = am2;\n dbits = 30;\n} else if (inBrowser && j_lm && navigator.appName != \"Netscape\") {\n BigInteger.prototype.am = am1;\n dbits = 26;\n} else {\n // Mozilla/Netscape seems to prefer am3\n BigInteger.prototype.am = am3;\n dbits = 28;\n}\n\nBigInteger.prototype.DB = dbits;\nBigInteger.prototype.DM = (1 << dbits) - 1;\nBigInteger.prototype.DV = 1 << dbits;\n\nvar BI_FP = 52;\nBigInteger.prototype.FV = Math.pow(2, BI_FP);\nBigInteger.prototype.F1 = BI_FP - dbits;\nBigInteger.prototype.F2 = 2 * dbits - BI_FP;\n\n// Digit conversions\nvar BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\nvar BI_RC = new Array();\nvar rr, vv;\nrr = \"0\".charCodeAt(0);\nfor (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\nrr = \"a\".charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\nrr = \"A\".charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\nfunction int2char(n) {\n return BI_RM.charAt(n);\n}\nfunction intAt(s, i) {\n var c = BI_RC[s.charCodeAt(i)];\n return c == null ? -1 : c;\n}\n\n// (protected) copy this to r\nfunction bnpCopyTo(r) {\n for (var i = this.t - 1; i >= 0; --i) r[i] = this[i];\n r.t = this.t;\n r.s = this.s;\n}\n\n// (protected) set from integer value x, -DV <= x < DV\nfunction bnpFromInt(x) {\n this.t = 1;\n this.s = x < 0 ? -1 : 0;\n if (x > 0) this[0] = x;\n else if (x < -1) this[0] = x + this.DV;\n else this.t = 0;\n}\n\n// return bigint initialized to value\nfunction nbv(i) {\n var r = nbi();\n r.fromInt(i);\n return r;\n}\n\n// (protected) set from string and radix\nfunction bnpFromString(s, b) {\n var k;\n if (b == 16) k = 4;\n else if (b == 8) k = 3;\n else if (b == 256) k = 8;\n // byte array\n else if (b == 2) k = 1;\n else if (b == 32) k = 5;\n else if (b == 4) k = 2;\n else {\n this.fromRadix(s, b);\n return;\n }\n this.t = 0;\n this.s = 0;\n var i = s.length,\n mi = false,\n sh = 0;\n while (--i >= 0) {\n var x = k == 8 ? s[i] & 0xff : intAt(s, i);\n if (x < 0) {\n if (s.charAt(i) == \"-\") mi = true;\n continue;\n }\n mi = false;\n if (sh == 0) this[this.t++] = x;\n else if (sh + k > this.DB) {\n this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;\n this[this.t++] = x >> (this.DB - sh);\n } else this[this.t - 1] |= x << sh;\n sh += k;\n if (sh >= this.DB) sh -= this.DB;\n }\n if (k == 8 && (s[0] & 0x80) != 0) {\n this.s = -1;\n if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;\n }\n this.clamp();\n if (mi) BigInteger.ZERO.subTo(this, this);\n}\n\n// (protected) clamp off excess high words\nfunction bnpClamp() {\n var c = this.s & this.DM;\n while (this.t > 0 && this[this.t - 1] == c) --this.t;\n}\n\n// (public) return string representation in given radix\nfunction bnToString(b) {\n if (this.s < 0) return \"-\" + this.negate().toString(b);\n var k;\n if (b == 16) k = 4;\n else if (b == 8) k = 3;\n else if (b == 2) k = 1;\n else if (b == 32) k = 5;\n else if (b == 4) k = 2;\n else return this.toRadix(b);\n var km = (1 << k) - 1,\n d,\n m = false,\n r = \"\",\n i = this.t;\n var p = this.DB - ((i * this.DB) % k);\n if (i-- > 0) {\n if (p < this.DB && (d = this[i] >> p) > 0) {\n m = true;\n r = int2char(d);\n }\n while (i >= 0) {\n if (p < k) {\n d = (this[i] & ((1 << p) - 1)) << (k - p);\n d |= this[--i] >> (p += this.DB - k);\n } else {\n d = (this[i] >> (p -= k)) & km;\n if (p <= 0) {\n p += this.DB;\n --i;\n }\n }\n if (d > 0) m = true;\n if (m) r += int2char(d);\n }\n }\n return m ? r : \"0\";\n}\n\n// (public) -this\nfunction bnNegate() {\n var r = nbi();\n BigInteger.ZERO.subTo(this, r);\n return r;\n}\n\n// (public) |this|\nfunction bnAbs() {\n return this.s < 0 ? this.negate() : this;\n}\n\n// (public) return + if this > a, - if this < a, 0 if equal\nfunction bnCompareTo(a) {\n var r = this.s - a.s;\n if (r != 0) return r;\n var i = this.t;\n r = i - a.t;\n if (r != 0) return this.s < 0 ? -r : r;\n while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r;\n return 0;\n}\n\n// returns bit length of the integer x\nfunction nbits(x) {\n var r = 1,\n t;\n if ((t = x >>> 16) != 0) {\n x = t;\n r += 16;\n }\n if ((t = x >> 8) != 0) {\n x = t;\n r += 8;\n }\n if ((t = x >> 4) != 0) {\n x = t;\n r += 4;\n }\n if ((t = x >> 2) != 0) {\n x = t;\n r += 2;\n }\n if ((t = x >> 1) != 0) {\n x = t;\n r += 1;\n }\n return r;\n}\n\n// (public) return the number of bits in \"this\"\nfunction bnBitLength() {\n if (this.t <= 0) return 0;\n return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));\n}\n\n// (protected) r = this << n*DB\nfunction bnpDLShiftTo(n, r) {\n var i;\n for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i];\n for (i = n - 1; i >= 0; --i) r[i] = 0;\n r.t = this.t + n;\n r.s = this.s;\n}\n\n// (protected) r = this >> n*DB\nfunction bnpDRShiftTo(n, r) {\n for (var i = n; i < this.t; ++i) r[i - n] = this[i];\n r.t = Math.max(this.t - n, 0);\n r.s = this.s;\n}\n\n// (protected) r = this << n\nfunction bnpLShiftTo(n, r) {\n var bs = n % this.DB;\n var cbs = this.DB - bs;\n var bm = (1 << cbs) - 1;\n var ds = Math.floor(n / this.DB),\n c = (this.s << bs) & this.DM,\n i;\n for (i = this.t - 1; i >= 0; --i) {\n r[i + ds + 1] = (this[i] >> cbs) | c;\n c = (this[i] & bm) << bs;\n }\n for (i = ds - 1; i >= 0; --i) r[i] = 0;\n r[ds] = c;\n r.t = this.t + ds + 1;\n r.s = this.s;\n r.clamp();\n}\n\n// (protected) r = this >> n\nfunction bnpRShiftTo(n, r) {\n r.s = this.s;\n var ds = Math.floor(n / this.DB);\n if (ds >= this.t) {\n r.t = 0;\n return;\n }\n var bs = n % this.DB;\n var cbs = this.DB - bs;\n var bm = (1 << bs) - 1;\n r[0] = this[ds] >> bs;\n for (var i = ds + 1; i < this.t; ++i) {\n r[i - ds - 1] |= (this[i] & bm) << cbs;\n r[i - ds] = this[i] >> bs;\n }\n if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs;\n r.t = this.t - ds;\n r.clamp();\n}\n\n// (protected) r = this - a\nfunction bnpSubTo(a, r) {\n var i = 0,\n c = 0,\n m = Math.min(a.t, this.t);\n while (i < m) {\n c += this[i] - a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n if (a.t < this.t) {\n c -= a.s;\n while (i < this.t) {\n c += this[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += this.s;\n } else {\n c += this.s;\n while (i < a.t) {\n c -= a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c -= a.s;\n }\n r.s = c < 0 ? -1 : 0;\n if (c < -1) r[i++] = this.DV + c;\n else if (c > 0) r[i++] = c;\n r.t = i;\n r.clamp();\n}\n\n// (protected) r = this * a, r != this,a (HAC 14.12)\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyTo(a, r) {\n var x = this.abs(),\n y = a.abs();\n var i = x.t;\n r.t = i + y.t;\n while (--i >= 0) r[i] = 0;\n for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);\n r.s = 0;\n r.clamp();\n if (this.s != a.s) BigInteger.ZERO.subTo(r, r);\n}\n\n// (protected) r = this^2, r != this (HAC 14.16)\nfunction bnpSquareTo(r) {\n var x = this.abs();\n var i = (r.t = 2 * x.t);\n while (--i >= 0) r[i] = 0;\n for (i = 0; i < x.t - 1; ++i) {\n var c = x.am(i, x[i], r, 2 * i, 0, 1);\n if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {\n r[i + x.t] -= x.DV;\n r[i + x.t + 1] = 1;\n }\n }\n if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);\n r.s = 0;\n r.clamp();\n}\n\n// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n// r != q, this != m. q or r may be null.\nfunction bnpDivRemTo(m, q, r) {\n var pm = m.abs();\n if (pm.t <= 0) return;\n var pt = this.abs();\n if (pt.t < pm.t) {\n if (q != null) q.fromInt(0);\n if (r != null) this.copyTo(r);\n return;\n }\n if (r == null) r = nbi();\n var y = nbi(),\n ts = this.s,\n ms = m.s;\n var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus\n if (nsh > 0) {\n pm.lShiftTo(nsh, y);\n pt.lShiftTo(nsh, r);\n } else {\n pm.copyTo(y);\n pt.copyTo(r);\n }\n var ys = y.t;\n var y0 = y[ys - 1];\n if (y0 == 0) return;\n var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0);\n var d1 = this.FV / yt,\n d2 = (1 << this.F1) / yt,\n e = 1 << this.F2;\n var i = r.t,\n j = i - ys,\n t = q == null ? nbi() : q;\n y.dlShiftTo(j, t);\n if (r.compareTo(t) >= 0) {\n r[r.t++] = 1;\n r.subTo(t, r);\n }\n BigInteger.ONE.dlShiftTo(ys, t);\n t.subTo(y, y); // \"negative\" y so we can replace sub with am later\n while (y.t < ys) y[y.t++] = 0;\n while (--j >= 0) {\n // Estimate quotient digit\n var qd = r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);\n if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) {\n // Try it out\n y.dlShiftTo(j, t);\n r.subTo(t, r);\n while (r[i] < --qd) r.subTo(t, r);\n }\n }\n if (q != null) {\n r.drShiftTo(ys, q);\n if (ts != ms) BigInteger.ZERO.subTo(q, q);\n }\n r.t = ys;\n r.clamp();\n if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder\n if (ts < 0) BigInteger.ZERO.subTo(r, r);\n}\n\n// (public) this mod a\nfunction bnMod(a) {\n var r = nbi();\n this.abs().divRemTo(a, null, r);\n if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r);\n return r;\n}\n\n// Modular reduction using \"classic\" algorithm\nfunction Classic(m) {\n this.m = m;\n}\nfunction cConvert(x) {\n if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n else return x;\n}\nfunction cRevert(x) {\n return x;\n}\nfunction cReduce(x) {\n x.divRemTo(this.m, null, x);\n}\nfunction cMulTo(x, y, r) {\n x.multiplyTo(y, r);\n this.reduce(r);\n}\nfunction cSqrTo(x, r) {\n x.squareTo(r);\n this.reduce(r);\n}\n\nClassic.prototype.convert = cConvert;\nClassic.prototype.revert = cRevert;\nClassic.prototype.reduce = cReduce;\nClassic.prototype.mulTo = cMulTo;\nClassic.prototype.sqrTo = cSqrTo;\n\n// (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n// justification:\n// xy == 1 (mod m)\n// xy = 1+km\n// xy(2-xy) = (1+km)(1-km)\n// x[y(2-xy)] = 1-k^2m^2\n// x[y(2-xy)] == 1 (mod m^2)\n// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n// JS multiply \"overflows\" differently from C/C++, so care is needed here.\nfunction bnpInvDigit() {\n if (this.t < 1) return 0;\n var x = this[0];\n if ((x & 1) == 0) return 0;\n var y = x & 3; // y == 1/x mod 2^2\n y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4\n y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8\n y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16\n // last step - calculate inverse mod DV directly;\n // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n y = (y * (2 - ((x * y) % this.DV))) % this.DV; // y == 1/x mod 2^dbits\n // we really want the negative inverse, and -DV < y < DV\n return y > 0 ? this.DV - y : -y;\n}\n\n// Montgomery reduction\nfunction Montgomery(m) {\n this.m = m;\n this.mp = m.invDigit();\n this.mpl = this.mp & 0x7fff;\n this.mph = this.mp >> 15;\n this.um = (1 << (m.DB - 15)) - 1;\n this.mt2 = 2 * m.t;\n}\n\n// xR mod m\nfunction montConvert(x) {\n var r = nbi();\n x.abs().dlShiftTo(this.m.t, r);\n r.divRemTo(this.m, null, r);\n if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r);\n return r;\n}\n\n// x/R mod m\nfunction montRevert(x) {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n}\n\n// x = x/R mod m (HAC 14.32)\nfunction montReduce(x) {\n while (\n x.t <= this.mt2 // pad x so am has enough room later\n )\n x[x.t++] = 0;\n for (var i = 0; i < this.m.t; ++i) {\n // faster way of calculating u0 = x[i]*mp mod DV\n var j = x[i] & 0x7fff;\n var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;\n // use am to combine the multiply-shift-add into one call\n j = i + this.m.t;\n x[j] += this.m.am(0, u0, x, i, 0, this.m.t);\n // propagate carry\n while (x[j] >= x.DV) {\n x[j] -= x.DV;\n x[++j]++;\n }\n }\n x.clamp();\n x.drShiftTo(this.m.t, x);\n if (x.compareTo(this.m) >= 0) x.subTo(this.m, x);\n}\n\n// r = \"x^2/R mod m\"; x != r\nfunction montSqrTo(x, r) {\n x.squareTo(r);\n this.reduce(r);\n}\n\n// r = \"xy/R mod m\"; x,y != r\nfunction montMulTo(x, y, r) {\n x.multiplyTo(y, r);\n this.reduce(r);\n}\n\nMontgomery.prototype.convert = montConvert;\nMontgomery.prototype.revert = montRevert;\nMontgomery.prototype.reduce = montReduce;\nMontgomery.prototype.mulTo = montMulTo;\nMontgomery.prototype.sqrTo = montSqrTo;\n\n// (protected) true iff this is even\nfunction bnpIsEven() {\n return (this.t > 0 ? this[0] & 1 : this.s) == 0;\n}\n\n// (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\nfunction bnpExp(e, z) {\n if (e > 0xffffffff || e < 1) return BigInteger.ONE;\n var r = nbi(),\n r2 = nbi(),\n g = z.convert(this),\n i = nbits(e) - 1;\n g.copyTo(r);\n while (--i >= 0) {\n z.sqrTo(r, r2);\n if ((e & (1 << i)) > 0) z.mulTo(r2, g, r);\n else {\n var t = r;\n r = r2;\n r2 = t;\n }\n }\n return z.revert(r);\n}\n\n// (public) this^e % m, 0 <= e < 2^32\nfunction bnModPowInt(e, m) {\n var z;\n if (e < 256 || m.isEven()) z = new Classic(m);\n else z = new Montgomery(m);\n return this.exp(e, z);\n}\n\n// protected\nBigInteger.prototype.copyTo = bnpCopyTo;\nBigInteger.prototype.fromInt = bnpFromInt;\nBigInteger.prototype.fromString = bnpFromString;\nBigInteger.prototype.clamp = bnpClamp;\nBigInteger.prototype.dlShiftTo = bnpDLShiftTo;\nBigInteger.prototype.drShiftTo = bnpDRShiftTo;\nBigInteger.prototype.lShiftTo = bnpLShiftTo;\nBigInteger.prototype.rShiftTo = bnpRShiftTo;\nBigInteger.prototype.subTo = bnpSubTo;\nBigInteger.prototype.multiplyTo = bnpMultiplyTo;\nBigInteger.prototype.squareTo = bnpSquareTo;\nBigInteger.prototype.divRemTo = bnpDivRemTo;\nBigInteger.prototype.invDigit = bnpInvDigit;\nBigInteger.prototype.isEven = bnpIsEven;\nBigInteger.prototype.exp = bnpExp;\n\n// public\nBigInteger.prototype.toString = bnToString;\nBigInteger.prototype.negate = bnNegate;\nBigInteger.prototype.abs = bnAbs;\nBigInteger.prototype.compareTo = bnCompareTo;\nBigInteger.prototype.bitLength = bnBitLength;\nBigInteger.prototype.mod = bnMod;\nBigInteger.prototype.modPowInt = bnModPowInt;\n\n// \"constants\"\nBigInteger.ZERO = nbv(0);\nBigInteger.ONE = nbv(1);\n\n// Copyright (c) 2005-2009 Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n\n// Extended JavaScript BN functions, required for RSA private ops.\n\n// Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n// Version 1.2: square() API, isProbablePrime fix\n\n// (public)\nfunction bnClone() {\n var r = nbi();\n this.copyTo(r);\n return r;\n}\n\n// (public) return value as integer\nfunction bnIntValue() {\n if (this.s < 0) {\n if (this.t == 1) return this[0] - this.DV;\n else if (this.t == 0) return -1;\n } else if (this.t == 1) return this[0];\n else if (this.t == 0) return 0;\n // assumes 16 < DB < 32\n return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];\n}\n\n// (public) return value as byte\nfunction bnByteValue() {\n return this.t == 0 ? this.s : (this[0] << 24) >> 24;\n}\n\n// (public) return value as short (assumes DB>=16)\nfunction bnShortValue() {\n return this.t == 0 ? this.s : (this[0] << 16) >> 16;\n}\n\n// (protected) return x s.t. r^x < DV\nfunction bnpChunkSize(r) {\n return Math.floor((Math.LN2 * this.DB) / Math.log(r));\n}\n\n// (public) 0 if this == 0, 1 if this > 0\nfunction bnSigNum() {\n if (this.s < 0) return -1;\n else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n else return 1;\n}\n\n// (protected) convert to radix string\nfunction bnpToRadix(b) {\n if (b == null) b = 10;\n if (this.signum() == 0 || b < 2 || b > 36) return \"0\";\n var cs = this.chunkSize(b);\n var a = Math.pow(b, cs);\n var d = nbv(a),\n y = nbi(),\n z = nbi(),\n r = \"\";\n this.divRemTo(d, y, z);\n while (y.signum() > 0) {\n r = (a + z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d, y, z);\n }\n return z.intValue().toString(b) + r;\n}\n\n// (protected) convert from radix string\nfunction bnpFromRadix(s, b) {\n this.fromInt(0);\n if (b == null) b = 10;\n var cs = this.chunkSize(b);\n var d = Math.pow(b, cs),\n mi = false,\n j = 0,\n w = 0;\n for (var i = 0; i < s.length; ++i) {\n var x = intAt(s, i);\n if (x < 0) {\n if (s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n continue;\n }\n w = b * w + x;\n if (++j >= cs) {\n this.dMultiply(d);\n this.dAddOffset(w, 0);\n j = 0;\n w = 0;\n }\n }\n if (j > 0) {\n this.dMultiply(Math.pow(b, j));\n this.dAddOffset(w, 0);\n }\n if (mi) BigInteger.ZERO.subTo(this, this);\n}\n\n// (protected) alternate constructor\nfunction bnpFromNumber(a, b, c) {\n if (\"number\" == typeof b) {\n // new BigInteger(int,int,RNG)\n if (a < 2) this.fromInt(1);\n else {\n this.fromNumber(a, c);\n if (!this.testBit(a - 1))\n // force MSB set\n this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);\n if (this.isEven()) this.dAddOffset(1, 0); // force odd\n while (!this.isProbablePrime(b)) {\n this.dAddOffset(2, 0);\n if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);\n }\n }\n } else {\n // new BigInteger(int,RNG)\n var x = new Array(),\n t = a & 7;\n x.length = (a >> 3) + 1;\n b.nextBytes(x);\n if (t > 0) x[0] &= (1 << t) - 1;\n else x[0] = 0;\n this.fromString(x, 256);\n }\n}\n\n// (public) convert to bigendian byte array\nfunction bnToByteArray() {\n var i = this.t,\n r = new Array();\n r[0] = this.s;\n var p = this.DB - ((i * this.DB) % 8),\n d,\n k = 0;\n if (i-- > 0) {\n if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) r[k++] = d | (this.s << (this.DB - p));\n while (i >= 0) {\n if (p < 8) {\n d = (this[i] & ((1 << p) - 1)) << (8 - p);\n d |= this[--i] >> (p += this.DB - 8);\n } else {\n d = (this[i] >> (p -= 8)) & 0xff;\n if (p <= 0) {\n p += this.DB;\n --i;\n }\n }\n if ((d & 0x80) != 0) d |= -256;\n if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k;\n if (k > 0 || d != this.s) r[k++] = d;\n }\n }\n return r;\n}\n\nfunction bnEquals(a) {\n return this.compareTo(a) == 0;\n}\nfunction bnMin(a) {\n return this.compareTo(a) < 0 ? this : a;\n}\nfunction bnMax(a) {\n return this.compareTo(a) > 0 ? this : a;\n}\n\n// (protected) r = this op a (bitwise)\nfunction bnpBitwiseTo(a, op, r) {\n var i,\n f,\n m = Math.min(a.t, this.t);\n for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]);\n if (a.t < this.t) {\n f = a.s & this.DM;\n for (i = m; i < this.t; ++i) r[i] = op(this[i], f);\n r.t = this.t;\n } else {\n f = this.s & this.DM;\n for (i = m; i < a.t; ++i) r[i] = op(f, a[i]);\n r.t = a.t;\n }\n r.s = op(this.s, a.s);\n r.clamp();\n}\n\n// (public) this & a\nfunction op_and(x, y) {\n return x & y;\n}\nfunction bnAnd(a) {\n var r = nbi();\n this.bitwiseTo(a, op_and, r);\n return r;\n}\n\n// (public) this | a\nfunction op_or(x, y) {\n return x | y;\n}\nfunction bnOr(a) {\n var r = nbi();\n this.bitwiseTo(a, op_or, r);\n return r;\n}\n\n// (public) this ^ a\nfunction op_xor(x, y) {\n return x ^ y;\n}\nfunction bnXor(a) {\n var r = nbi();\n this.bitwiseTo(a, op_xor, r);\n return r;\n}\n\n// (public) this & ~a\nfunction op_andnot(x, y) {\n return x & ~y;\n}\nfunction bnAndNot(a) {\n var r = nbi();\n this.bitwiseTo(a, op_andnot, r);\n return r;\n}\n\n// (public) ~this\nfunction bnNot() {\n var r = nbi();\n for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i];\n r.t = this.t;\n r.s = ~this.s;\n return r;\n}\n\n// (public) this << n\nfunction bnShiftLeft(n) {\n var r = nbi();\n if (n < 0) this.rShiftTo(-n, r);\n else this.lShiftTo(n, r);\n return r;\n}\n\n// (public) this >> n\nfunction bnShiftRight(n) {\n var r = nbi();\n if (n < 0) this.lShiftTo(-n, r);\n else this.rShiftTo(n, r);\n return r;\n}\n\n// return index of lowest 1-bit in x, x < 2^31\nfunction lbit(x) {\n if (x == 0) return -1;\n var r = 0;\n if ((x & 0xffff) == 0) {\n x >>= 16;\n r += 16;\n }\n if ((x & 0xff) == 0) {\n x >>= 8;\n r += 8;\n }\n if ((x & 0xf) == 0) {\n x >>= 4;\n r += 4;\n }\n if ((x & 3) == 0) {\n x >>= 2;\n r += 2;\n }\n if ((x & 1) == 0) ++r;\n return r;\n}\n\n// (public) returns index of lowest 1-bit (or -1 if none)\nfunction bnGetLowestSetBit() {\n for (var i = 0; i < this.t; ++i) if (this[i] != 0) return i * this.DB + lbit(this[i]);\n if (this.s < 0) return this.t * this.DB;\n return -1;\n}\n\n// return number of 1 bits in x\nfunction cbit(x) {\n var r = 0;\n while (x != 0) {\n x &= x - 1;\n ++r;\n }\n return r;\n}\n\n// (public) return number of set bits\nfunction bnBitCount() {\n var r = 0,\n x = this.s & this.DM;\n for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x);\n return r;\n}\n\n// (public) true iff nth bit is set\nfunction bnTestBit(n) {\n var j = Math.floor(n / this.DB);\n if (j >= this.t) return this.s != 0;\n return (this[j] & (1 << n % this.DB)) != 0;\n}\n\n// (protected) this op (1<>= this.DB;\n }\n if (a.t < this.t) {\n c += a.s;\n while (i < this.t) {\n c += this[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += this.s;\n } else {\n c += this.s;\n while (i < a.t) {\n c += a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += a.s;\n }\n r.s = c < 0 ? -1 : 0;\n if (c > 0) r[i++] = c;\n else if (c < -1) r[i++] = this.DV + c;\n r.t = i;\n r.clamp();\n}\n\n// (public) this + a\nfunction bnAdd(a) {\n var r = nbi();\n this.addTo(a, r);\n return r;\n}\n\n// (public) this - a\nfunction bnSubtract(a) {\n var r = nbi();\n this.subTo(a, r);\n return r;\n}\n\n// (public) this * a\nfunction bnMultiply(a) {\n var r = nbi();\n this.multiplyTo(a, r);\n return r;\n}\n\n// (public) this^2\nfunction bnSquare() {\n var r = nbi();\n this.squareTo(r);\n return r;\n}\n\n// (public) this / a\nfunction bnDivide(a) {\n var r = nbi();\n this.divRemTo(a, r, null);\n return r;\n}\n\n// (public) this % a\nfunction bnRemainder(a) {\n var r = nbi();\n this.divRemTo(a, null, r);\n return r;\n}\n\n// (public) [this/a,this%a]\nfunction bnDivideAndRemainder(a) {\n var q = nbi(),\n r = nbi();\n this.divRemTo(a, q, r);\n return new Array(q, r);\n}\n\n// (protected) this *= n, this >= 0, 1 < n < DV\nfunction bnpDMultiply(n) {\n this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);\n ++this.t;\n this.clamp();\n}\n\n// (protected) this += n << w words, this >= 0\nfunction bnpDAddOffset(n, w) {\n if (n == 0) return;\n while (this.t <= w) this[this.t++] = 0;\n this[w] += n;\n while (this[w] >= this.DV) {\n this[w] -= this.DV;\n if (++w >= this.t) this[this.t++] = 0;\n ++this[w];\n }\n}\n\n// A \"null\" reducer\nfunction NullExp() {}\nfunction nNop(x) {\n return x;\n}\nfunction nMulTo(x, y, r) {\n x.multiplyTo(y, r);\n}\nfunction nSqrTo(x, r) {\n x.squareTo(r);\n}\n\nNullExp.prototype.convert = nNop;\nNullExp.prototype.revert = nNop;\nNullExp.prototype.mulTo = nMulTo;\nNullExp.prototype.sqrTo = nSqrTo;\n\n// (public) this^e\nfunction bnPow(e) {\n return this.exp(e, new NullExp());\n}\n\n// (protected) r = lower n words of \"this * a\", a.t <= n\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyLowerTo(a, n, r) {\n var i = Math.min(this.t + a.t, n);\n r.s = 0; // assumes a,this >= 0\n r.t = i;\n while (i > 0) r[--i] = 0;\n var j;\n for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);\n for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i);\n r.clamp();\n}\n\n// (protected) r = \"this * a\" without lower n words, n > 0\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyUpperTo(a, n, r) {\n --n;\n var i = (r.t = this.t + a.t - n);\n r.s = 0; // assumes a,this >= 0\n while (--i >= 0) r[i] = 0;\n for (i = Math.max(n - this.t, 0); i < a.t; ++i) r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);\n r.clamp();\n r.drShiftTo(1, r);\n}\n\n// Barrett modular reduction\nfunction Barrett(m) {\n // setup Barrett\n this.r2 = nbi();\n this.q3 = nbi();\n BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);\n this.mu = this.r2.divide(m);\n this.m = m;\n}\n\nfunction barrettConvert(x) {\n if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m);\n else if (x.compareTo(this.m) < 0) return x;\n else {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n }\n}\n\nfunction barrettRevert(x) {\n return x;\n}\n\n// x = x mod m (HAC 14.42)\nfunction barrettReduce(x) {\n x.drShiftTo(this.m.t - 1, this.r2);\n if (x.t > this.m.t + 1) {\n x.t = this.m.t + 1;\n x.clamp();\n }\n this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);\n this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);\n while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1);\n x.subTo(this.r2, x);\n while (x.compareTo(this.m) >= 0) x.subTo(this.m, x);\n}\n\n// r = x^2 mod m; x != r\nfunction barrettSqrTo(x, r) {\n x.squareTo(r);\n this.reduce(r);\n}\n\n// r = x*y mod m; x,y != r\nfunction barrettMulTo(x, y, r) {\n x.multiplyTo(y, r);\n this.reduce(r);\n}\n\nBarrett.prototype.convert = barrettConvert;\nBarrett.prototype.revert = barrettRevert;\nBarrett.prototype.reduce = barrettReduce;\nBarrett.prototype.mulTo = barrettMulTo;\nBarrett.prototype.sqrTo = barrettSqrTo;\n\n// (public) this^e % m (HAC 14.85)\nfunction bnModPow(e, m) {\n var i = e.bitLength(),\n k,\n r = nbv(1),\n z;\n if (i <= 0) return r;\n else if (i < 18) k = 1;\n else if (i < 48) k = 3;\n else if (i < 144) k = 4;\n else if (i < 768) k = 5;\n else k = 6;\n if (i < 8) z = new Classic(m);\n else if (m.isEven()) z = new Barrett(m);\n else z = new Montgomery(m);\n\n // precomputation\n var g = new Array(),\n n = 3,\n k1 = k - 1,\n km = (1 << k) - 1;\n g[1] = z.convert(this);\n if (k > 1) {\n var g2 = nbi();\n z.sqrTo(g[1], g2);\n while (n <= km) {\n g[n] = nbi();\n z.mulTo(g2, g[n - 2], g[n]);\n n += 2;\n }\n }\n\n var j = e.t - 1,\n w,\n is1 = true,\n r2 = nbi(),\n t;\n i = nbits(e[j]) - 1;\n while (j >= 0) {\n if (i >= k1) w = (e[j] >> (i - k1)) & km;\n else {\n w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);\n if (j > 0) w |= e[j - 1] >> (this.DB + i - k1);\n }\n\n n = k;\n while ((w & 1) == 0) {\n w >>= 1;\n --n;\n }\n if ((i -= n) < 0) {\n i += this.DB;\n --j;\n }\n if (is1) {\n // ret == 1, don't bother squaring or multiplying it\n g[w].copyTo(r);\n is1 = false;\n } else {\n while (n > 1) {\n z.sqrTo(r, r2);\n z.sqrTo(r2, r);\n n -= 2;\n }\n if (n > 0) z.sqrTo(r, r2);\n else {\n t = r;\n r = r2;\n r2 = t;\n }\n z.mulTo(r2, g[w], r);\n }\n\n while (j >= 0 && (e[j] & (1 << i)) == 0) {\n z.sqrTo(r, r2);\n t = r;\n r = r2;\n r2 = t;\n if (--i < 0) {\n i = this.DB - 1;\n --j;\n }\n }\n }\n return z.revert(r);\n}\n\n// (public) gcd(this,a) (HAC 14.54)\nfunction bnGCD(a) {\n var x = this.s < 0 ? this.negate() : this.clone();\n var y = a.s < 0 ? a.negate() : a.clone();\n if (x.compareTo(y) < 0) {\n var t = x;\n x = y;\n y = t;\n }\n var i = x.getLowestSetBit(),\n g = y.getLowestSetBit();\n if (g < 0) return x;\n if (i < g) g = i;\n if (g > 0) {\n x.rShiftTo(g, x);\n y.rShiftTo(g, y);\n }\n while (x.signum() > 0) {\n if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x);\n if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y);\n if (x.compareTo(y) >= 0) {\n x.subTo(y, x);\n x.rShiftTo(1, x);\n } else {\n y.subTo(x, y);\n y.rShiftTo(1, y);\n }\n }\n if (g > 0) y.lShiftTo(g, y);\n return y;\n}\n\n// (protected) this % n, n < 2^26\nfunction bnpModInt(n) {\n if (n <= 0) return 0;\n var d = this.DV % n,\n r = this.s < 0 ? n - 1 : 0;\n if (this.t > 0)\n if (d == 0) r = this[0] % n;\n else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n;\n return r;\n}\n\n// (public) 1/this % m (HAC 14.61)\nfunction bnModInverse(m) {\n var ac = m.isEven();\n if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\n var u = m.clone(),\n v = this.clone();\n var a = nbv(1),\n b = nbv(0),\n c = nbv(0),\n d = nbv(1);\n while (u.signum() != 0) {\n while (u.isEven()) {\n u.rShiftTo(1, u);\n if (ac) {\n if (!a.isEven() || !b.isEven()) {\n a.addTo(this, a);\n b.subTo(m, b);\n }\n a.rShiftTo(1, a);\n } else if (!b.isEven()) b.subTo(m, b);\n b.rShiftTo(1, b);\n }\n while (v.isEven()) {\n v.rShiftTo(1, v);\n if (ac) {\n if (!c.isEven() || !d.isEven()) {\n c.addTo(this, c);\n d.subTo(m, d);\n }\n c.rShiftTo(1, c);\n } else if (!d.isEven()) d.subTo(m, d);\n d.rShiftTo(1, d);\n }\n if (u.compareTo(v) >= 0) {\n u.subTo(v, u);\n if (ac) a.subTo(c, a);\n b.subTo(d, b);\n } else {\n v.subTo(u, v);\n if (ac) c.subTo(a, c);\n d.subTo(b, d);\n }\n }\n if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\n if (d.compareTo(m) >= 0) return d.subtract(m);\n if (d.signum() < 0) d.addTo(m, d);\n else return d;\n if (d.signum() < 0) return d.add(m);\n else return d;\n}\n\nvar lowprimes = [\n 2,\n 3,\n 5,\n 7,\n 11,\n 13,\n 17,\n 19,\n 23,\n 29,\n 31,\n 37,\n 41,\n 43,\n 47,\n 53,\n 59,\n 61,\n 67,\n 71,\n 73,\n 79,\n 83,\n 89,\n 97,\n 101,\n 103,\n 107,\n 109,\n 113,\n 127,\n 131,\n 137,\n 139,\n 149,\n 151,\n 157,\n 163,\n 167,\n 173,\n 179,\n 181,\n 191,\n 193,\n 197,\n 199,\n 211,\n 223,\n 227,\n 229,\n 233,\n 239,\n 241,\n 251,\n 257,\n 263,\n 269,\n 271,\n 277,\n 281,\n 283,\n 293,\n 307,\n 311,\n 313,\n 317,\n 331,\n 337,\n 347,\n 349,\n 353,\n 359,\n 367,\n 373,\n 379,\n 383,\n 389,\n 397,\n 401,\n 409,\n 419,\n 421,\n 431,\n 433,\n 439,\n 443,\n 449,\n 457,\n 461,\n 463,\n 467,\n 479,\n 487,\n 491,\n 499,\n 503,\n 509,\n 521,\n 523,\n 541,\n 547,\n 557,\n 563,\n 569,\n 571,\n 577,\n 587,\n 593,\n 599,\n 601,\n 607,\n 613,\n 617,\n 619,\n 631,\n 641,\n 643,\n 647,\n 653,\n 659,\n 661,\n 673,\n 677,\n 683,\n 691,\n 701,\n 709,\n 719,\n 727,\n 733,\n 739,\n 743,\n 751,\n 757,\n 761,\n 769,\n 773,\n 787,\n 797,\n 809,\n 811,\n 821,\n 823,\n 827,\n 829,\n 839,\n 853,\n 857,\n 859,\n 863,\n 877,\n 881,\n 883,\n 887,\n 907,\n 911,\n 919,\n 929,\n 937,\n 941,\n 947,\n 953,\n 967,\n 971,\n 977,\n 983,\n 991,\n 997\n];\nvar lplim = (1 << 26) / lowprimes[lowprimes.length - 1];\n\n// (public) test primality with certainty >= 1-.5^t\nfunction bnIsProbablePrime(t) {\n var i,\n x = this.abs();\n if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {\n for (i = 0; i < lowprimes.length; ++i) if (x[0] == lowprimes[i]) return true;\n return false;\n }\n if (x.isEven()) return false;\n i = 1;\n while (i < lowprimes.length) {\n var m = lowprimes[i],\n j = i + 1;\n while (j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n m = x.modInt(m);\n while (i < j) if (m % lowprimes[i++] == 0) return false;\n }\n return x.millerRabin(t);\n}\n\n// (protected) true if probably prime (HAC 4.24, Miller-Rabin)\nfunction bnpMillerRabin(t) {\n var n1 = this.subtract(BigInteger.ONE);\n var k = n1.getLowestSetBit();\n if (k <= 0) return false;\n var r = n1.shiftRight(k);\n t = (t + 1) >> 1;\n if (t > lowprimes.length) t = lowprimes.length;\n var a = nbi();\n for (var i = 0; i < t; ++i) {\n //Pick bases at random, instead of starting at 2\n a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);\n var y = a.modPow(r, this);\n if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n var j = 1;\n while (j++ < k && y.compareTo(n1) != 0) {\n y = y.modPowInt(2, this);\n if (y.compareTo(BigInteger.ONE) == 0) return false;\n }\n if (y.compareTo(n1) != 0) return false;\n }\n }\n return true;\n}\n\n// protected\nBigInteger.prototype.chunkSize = bnpChunkSize;\nBigInteger.prototype.toRadix = bnpToRadix;\nBigInteger.prototype.fromRadix = bnpFromRadix;\nBigInteger.prototype.fromNumber = bnpFromNumber;\nBigInteger.prototype.bitwiseTo = bnpBitwiseTo;\nBigInteger.prototype.changeBit = bnpChangeBit;\nBigInteger.prototype.addTo = bnpAddTo;\nBigInteger.prototype.dMultiply = bnpDMultiply;\nBigInteger.prototype.dAddOffset = bnpDAddOffset;\nBigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\nBigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\nBigInteger.prototype.modInt = bnpModInt;\nBigInteger.prototype.millerRabin = bnpMillerRabin;\n\n// public\nBigInteger.prototype.clone = bnClone;\nBigInteger.prototype.intValue = bnIntValue;\nBigInteger.prototype.byteValue = bnByteValue;\nBigInteger.prototype.shortValue = bnShortValue;\nBigInteger.prototype.signum = bnSigNum;\nBigInteger.prototype.toByteArray = bnToByteArray;\nBigInteger.prototype.equals = bnEquals;\nBigInteger.prototype.min = bnMin;\nBigInteger.prototype.max = bnMax;\nBigInteger.prototype.and = bnAnd;\nBigInteger.prototype.or = bnOr;\nBigInteger.prototype.xor = bnXor;\nBigInteger.prototype.andNot = bnAndNot;\nBigInteger.prototype.not = bnNot;\nBigInteger.prototype.shiftLeft = bnShiftLeft;\nBigInteger.prototype.shiftRight = bnShiftRight;\nBigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\nBigInteger.prototype.bitCount = bnBitCount;\nBigInteger.prototype.testBit = bnTestBit;\nBigInteger.prototype.setBit = bnSetBit;\nBigInteger.prototype.clearBit = bnClearBit;\nBigInteger.prototype.flipBit = bnFlipBit;\nBigInteger.prototype.add = bnAdd;\nBigInteger.prototype.subtract = bnSubtract;\nBigInteger.prototype.multiply = bnMultiply;\nBigInteger.prototype.divide = bnDivide;\nBigInteger.prototype.remainder = bnRemainder;\nBigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\nBigInteger.prototype.modPow = bnModPow;\nBigInteger.prototype.modInverse = bnModInverse;\nBigInteger.prototype.pow = bnPow;\nBigInteger.prototype.gcd = bnGCD;\nBigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n// JSBN-specific extension\nBigInteger.prototype.square = bnSquare;\n\n// Expose the Barrett function\nBigInteger.prototype.Barrett = Barrett;\n\n// BigInteger interfaces not implemented in jsbn:\n\n// BigInteger(int signum, byte[] magnitude)\n// double doubleValue()\n// float floatValue()\n// int hashCode()\n// long longValue()\n// static BigInteger valueOf(long val)\n\n// Random number generator - requires a PRNG backend, e.g. prng4.js\n\n// For best results, put code like\n// \n// in your main HTML document.\n\nvar rng_state;\nvar rng_pool;\nvar rng_pptr;\n\n// Mix in a 32-bit integer into the pool\nfunction rng_seed_int(x) {\n rng_pool[rng_pptr++] ^= x & 255;\n rng_pool[rng_pptr++] ^= (x >> 8) & 255;\n rng_pool[rng_pptr++] ^= (x >> 16) & 255;\n rng_pool[rng_pptr++] ^= (x >> 24) & 255;\n if (rng_pptr >= rng_psize) rng_pptr -= rng_psize;\n}\n\n// Mix in the current time (w/milliseconds) into the pool\nfunction rng_seed_time() {\n rng_seed_int(new Date().getTime());\n}\n\n// Initialize the pool with junk if needed.\nif (rng_pool == null) {\n rng_pool = new Array();\n rng_pptr = 0;\n var t;\n if (typeof window !== \"undefined\" && window.crypto) {\n if (window.crypto.getRandomValues) {\n // Use webcrypto if available\n var ua = new Uint8Array(32);\n window.crypto.getRandomValues(ua);\n for (t = 0; t < 32; ++t) rng_pool[rng_pptr++] = ua[t];\n } else if (navigator.appName == \"Netscape\" && navigator.appVersion < \"5\") {\n // Extract entropy (256 bits) from NS4 RNG if available\n var z = window.crypto.random(32);\n for (t = 0; t < z.length; ++t) rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;\n }\n }\n while (rng_pptr < rng_psize) {\n // extract some randomness from Math.random()\n t = Math.floor(65536 * Math.random());\n rng_pool[rng_pptr++] = t >>> 8;\n rng_pool[rng_pptr++] = t & 255;\n }\n rng_pptr = 0;\n rng_seed_time();\n //rng_seed_int(window.screenX);\n //rng_seed_int(window.screenY);\n}\n\nfunction rng_get_byte() {\n if (rng_state == null) {\n rng_seed_time();\n rng_state = prng_newstate();\n rng_state.init(rng_pool);\n for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) rng_pool[rng_pptr] = 0;\n rng_pptr = 0;\n //rng_pool = null;\n }\n // TODO: allow reseeding after first request\n return rng_state.next();\n}\n\nfunction rng_get_bytes(ba) {\n var i;\n for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();\n}\n\nexport function SecureRandom() {}\n\nSecureRandom.prototype.nextBytes = rng_get_bytes;\n\n// prng4.js - uses Arcfour as a PRNG\n\nfunction Arcfour() {\n this.i = 0;\n this.j = 0;\n this.S = new Array();\n}\n\n// Initialize arcfour context from key, an array of ints, each from [0..255]\nfunction ARC4init(key) {\n var i, j, t;\n for (i = 0; i < 256; ++i) this.S[i] = i;\n j = 0;\n for (i = 0; i < 256; ++i) {\n j = (j + this.S[i] + key[i % key.length]) & 255;\n t = this.S[i];\n this.S[i] = this.S[j];\n this.S[j] = t;\n }\n this.i = 0;\n this.j = 0;\n}\n\nfunction ARC4next() {\n var t;\n this.i = (this.i + 1) & 255;\n this.j = (this.j + this.S[this.i]) & 255;\n t = this.S[this.i];\n this.S[this.i] = this.S[this.j];\n this.S[this.j] = t;\n return this.S[(t + this.S[this.i]) & 255];\n}\n\nArcfour.prototype.init = ARC4init;\nArcfour.prototype.next = ARC4next;\n\n// Plug in your RNG constructor here\nfunction prng_newstate() {\n return new Arcfour();\n}\n\n// Pool size must be a multiple of 4 and greater than 32.\n// An array of bytes the size of the pool will be passed to init()\nvar rng_psize = 256;\n","var map = {\n\t\"./de.json\": [\n\t\t\"../locale/res/wordlists/de.json\",\n\t\t\"locale_res_wordlists_de_json\"\n\t],\n\t\"./en.json\": [\n\t\t\"../locale/res/wordlists/en.json\",\n\t\t\"locale_res_wordlists_en_json\"\n\t],\n\t\"./es.json\": [\n\t\t\"../locale/res/wordlists/es.json\",\n\t\t\"locale_res_wordlists_es_json\"\n\t],\n\t\"./fr.json\": [\n\t\t\"../locale/res/wordlists/fr.json\",\n\t\t\"locale_res_wordlists_fr_json\"\n\t],\n\t\"./pt.json\": [\n\t\t\"../locale/res/wordlists/pt.json\",\n\t\t\"locale_res_wordlists_pt_json\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__.t(id, 3 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = \"../locale/res/wordlists lazy recursive ^\\\\.\\\\/.*\\\\.json$\";\nmodule.exports = webpackAsyncContext;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../pwa/node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../pwa/node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../pwa/node_modules/css-loader/dist/runtime/getUrl.js\";\nimport ___CSS_LOADER_URL_IMPORT_0___ from \"./Nunito-Light.ttf\";\nimport ___CSS_LOADER_URL_IMPORT_1___ from \"./Nunito-Regular.ttf\";\nimport ___CSS_LOADER_URL_IMPORT_2___ from \"./Nunito-SemiBold.ttf\";\nimport ___CSS_LOADER_URL_IMPORT_3___ from \"./Nunito-Bold.ttf\";\nimport ___CSS_LOADER_URL_IMPORT_4___ from \"./Inconsolata-Regular.ttf\";\nimport ___CSS_LOADER_URL_IMPORT_5___ from \"./Padlock.eot\";\nimport ___CSS_LOADER_URL_IMPORT_6___ from \"./Padlock.woff\";\nimport ___CSS_LOADER_URL_IMPORT_7___ from \"./Padlock.ttf\";\nimport ___CSS_LOADER_URL_IMPORT_8___ from \"./Padlock.svg\";\nimport ___CSS_LOADER_URL_IMPORT_9___ from \"./fontawesome-webfont.eot\";\nimport ___CSS_LOADER_URL_IMPORT_10___ from \"./fontawesome-webfont.woff2\";\nimport ___CSS_LOADER_URL_IMPORT_11___ from \"./fontawesome-webfont.woff\";\nimport ___CSS_LOADER_URL_IMPORT_12___ from \"./fontawesome-webfont.ttf\";\nimport ___CSS_LOADER_URL_IMPORT_13___ from \"./fontawesome-webfont.svg\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\nvar ___CSS_LOADER_URL_REPLACEMENT_1___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);\nvar ___CSS_LOADER_URL_REPLACEMENT_2___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_2___);\nvar ___CSS_LOADER_URL_REPLACEMENT_3___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_3___);\nvar ___CSS_LOADER_URL_REPLACEMENT_4___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_4___);\nvar ___CSS_LOADER_URL_REPLACEMENT_5___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_5___);\nvar ___CSS_LOADER_URL_REPLACEMENT_6___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_6___);\nvar ___CSS_LOADER_URL_REPLACEMENT_7___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_7___);\nvar ___CSS_LOADER_URL_REPLACEMENT_8___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_8___, { hash: \"#Padlock\" });\nvar ___CSS_LOADER_URL_REPLACEMENT_9___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_9___);\nvar ___CSS_LOADER_URL_REPLACEMENT_10___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_10___);\nvar ___CSS_LOADER_URL_REPLACEMENT_11___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_11___);\nvar ___CSS_LOADER_URL_REPLACEMENT_12___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_12___);\nvar ___CSS_LOADER_URL_REPLACEMENT_13___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_13___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@font-face {\\n font-family: \\\"Nunito\\\";\\n font-style: normal;\\n font-weight: 300;\\n src: local(\\\"Nunito Light\\\"), local(\\\"Nunito-Light\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_0___ + \") format(\\\"truetype\\\");\\n}\\n@font-face {\\n font-family: \\\"Nunito\\\";\\n font-style: normal;\\n font-weight: 400;\\n src: local(\\\"Nunito Regular\\\"), local(\\\"Nunito-Regular\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_1___ + \") format(\\\"truetype\\\");\\n}\\n@font-face {\\n font-family: \\\"Nunito\\\";\\n font-style: normal;\\n font-weight: 600;\\n src: local(\\\"Nunito SemiBold\\\"), local(\\\"Nunito-SemiBold\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_2___ + \") format(\\\"truetype\\\");\\n}\\n@font-face {\\n font-family: \\\"Nunito\\\";\\n font-style: normal;\\n font-weight: 700;\\n src: local(\\\"Nunito Bold\\\"), local(\\\"Nunito-Bold\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_3___ + \") format(\\\"truetype\\\");\\n}\\n@font-face {\\n font-family: \\\"Inconsolata\\\";\\n font-style: normal;\\n font-weight: 400;\\n src: local(\\\"Inconsolata Regular\\\"), local(\\\"Inconsolata-Regular\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_4___ + \") format(\\\"truetype\\\");\\n}\\n\\n@font-face {\\n font-family: \\\"Padlock\\\";\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \");\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_5___ + \") format(\\\"embedded-opentype\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_6___ + \") format(\\\"woff\\\"),\\n url(\" + ___CSS_LOADER_URL_REPLACEMENT_7___ + \") format(\\\"truetype\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_8___ + \") format(\\\"svg\\\");\\n font-weight: normal;\\n font-style: normal;\\n}\\n\\n@font-face {\\n font-family: \\\"FontAwesome\\\";\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_9___ + \");\\n src: url(\" + ___CSS_LOADER_URL_REPLACEMENT_9___ + \") format(\\\"embedded-opentype\\\"),\\n url(\" + ___CSS_LOADER_URL_REPLACEMENT_10___ + \") format(\\\"woff2\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_11___ + \") format(\\\"woff\\\"),\\n url(\" + ___CSS_LOADER_URL_REPLACEMENT_12___ + \") format(\\\"truetype\\\"), url(\" + ___CSS_LOADER_URL_REPLACEMENT_13___ + \") format(\\\"svg\\\");\\n font-weight: normal;\\n font-style: normal;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./../app/assets/fonts/fonts.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,6GAA6F;AACjG;AACA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,iHAAmG;AACvG;AACA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,mHAAsG;AAC1G;AACA;IACI,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,2GAA0F;AAC9F;AACA;IACI,0BAA0B;IAC1B,kBAAkB;IAClB,gBAAgB;IAChB,2HAAkH;AACtH;;AAEA;IACI,sBAAsB;IACtB,4CAAyB;IACzB;yHACuF;IACvF,mBAAmB;IACnB,kBAAkB;AACtB;;AAEA;IACI,0BAA0B;IAC1B,4CAAqC;IACrC;;2HAEuG;IACvG,mBAAmB;IACnB,kBAAkB;AACtB\",\"sourcesContent\":[\"@font-face {\\n font-family: \\\"Nunito\\\";\\n font-style: normal;\\n font-weight: 300;\\n src: local(\\\"Nunito Light\\\"), local(\\\"Nunito-Light\\\"), url(./Nunito-Light.ttf) format(\\\"truetype\\\");\\n}\\n@font-face {\\n font-family: \\\"Nunito\\\";\\n font-style: normal;\\n font-weight: 400;\\n src: local(\\\"Nunito Regular\\\"), local(\\\"Nunito-Regular\\\"), url(./Nunito-Regular.ttf) format(\\\"truetype\\\");\\n}\\n@font-face {\\n font-family: \\\"Nunito\\\";\\n font-style: normal;\\n font-weight: 600;\\n src: local(\\\"Nunito SemiBold\\\"), local(\\\"Nunito-SemiBold\\\"), url(./Nunito-SemiBold.ttf) format(\\\"truetype\\\");\\n}\\n@font-face {\\n font-family: \\\"Nunito\\\";\\n font-style: normal;\\n font-weight: 700;\\n src: local(\\\"Nunito Bold\\\"), local(\\\"Nunito-Bold\\\"), url(./Nunito-Bold.ttf) format(\\\"truetype\\\");\\n}\\n@font-face {\\n font-family: \\\"Inconsolata\\\";\\n font-style: normal;\\n font-weight: 400;\\n src: local(\\\"Inconsolata Regular\\\"), local(\\\"Inconsolata-Regular\\\"), url(./Inconsolata-Regular.ttf) format(\\\"truetype\\\");\\n}\\n\\n@font-face {\\n font-family: \\\"Padlock\\\";\\n src: url(\\\"./Padlock.eot\\\");\\n src: url(\\\"./Padlock.eot\\\") format(\\\"embedded-opentype\\\"), url(\\\"./Padlock.woff\\\") format(\\\"woff\\\"),\\n url(\\\"./Padlock.ttf\\\") format(\\\"truetype\\\"), url(\\\"./Padlock.svg#Padlock\\\") format(\\\"svg\\\");\\n font-weight: normal;\\n font-style: normal;\\n}\\n\\n@font-face {\\n font-family: \\\"FontAwesome\\\";\\n src: url(\\\"./fontawesome-webfont.eot\\\");\\n src: url(\\\"./fontawesome-webfont.eot\\\") format(\\\"embedded-opentype\\\"),\\n url(\\\"./fontawesome-webfont.woff2\\\") format(\\\"woff2\\\"), url(\\\"./fontawesome-webfont.woff\\\") format(\\\"woff\\\"),\\n url(\\\"./fontawesome-webfont.ttf\\\") format(\\\"truetype\\\"), url(\\\"./fontawesome-webfont.svg\\\") format(\\\"svg\\\");\\n font-weight: normal;\\n font-style: normal;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","export default __webpack_public_path__ + \"4d410e4977b3525f9fca202da60d43ed.ttf\";","export default __webpack_public_path__ + \"e21224eb684dfa21443683a3fc963a3b.ttf\";","export default __webpack_public_path__ + \"d0adc2b29b7472077dc7439642f1439a.ttf\";","export default __webpack_public_path__ + \"c6d06da41ec4b66d90868ce6bf337cbd.ttf\";","export default __webpack_public_path__ + \"2f14cbb7792a42471b1b64de35797d7a.ttf\";","export default __webpack_public_path__ + \"e3a2c12708311d5e47193da456ccdcba.eot\";","export default __webpack_public_path__ + \"49d0dfccb2c7333add0c1277ce21fa1e.svg\";","export default __webpack_public_path__ + \"5503c8e2713e276d4a2cdff45e6991c9.ttf\";","export default __webpack_public_path__ + \"021f830e3290aad20514c75c92ab00c9.woff\";","export default __webpack_public_path__ + \"3d1a8e52672c4af418771bcd7e4111f5.eot\";","export default __webpack_public_path__ + \"9659db92dbc9c899169660fa07a18838.svg\";","export default __webpack_public_path__ + \"ecbe95f309be4cee7aa3f894386282f6.ttf\";","export default __webpack_public_path__ + \"2f7fbbd7d8eee807e437e660436c6033.woff\";","export default __webpack_public_path__ + \"f862b0f4608b4f0fb945113ef8dcdfa3.woff2\";","import api from \"!../../../pwa/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../pwa/node_modules/css-loader/dist/cjs.js!./fonts.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { element, html, property, css } from \"./base\";\nimport { Dialog } from \"./dialog\";\n\nconst defaultButtonLabel = $l(\"OK\");\n\nexport type AlertType = \"info\" | \"warning\" | \"destructive\" | \"choice\" | \"question\" | \"success\";\nexport interface AlertOptions {\n message?: string;\n title?: string;\n options?: string[];\n type?: AlertType;\n icon?: string;\n preventDismiss?: boolean;\n hideIcon?: boolean;\n vertical?: boolean;\n preventAutoClose?: boolean;\n}\n\n@element(\"pl-alert-dialog\")\nexport class AlertDialog extends Dialog {\n @property()\n buttonLabel: string = defaultButtonLabel;\n @property()\n dialogTitle: string = \"\";\n @property()\n message: string = \"\";\n @property({ reflect: true, attribute: \"type\" })\n type: AlertType = \"info\";\n @property()\n icon = \"\";\n @property()\n options: string[] = [];\n @property({ attribute: \"hide-icon\", reflect: true })\n hideIcon: boolean = false;\n @property({ reflect: true })\n vertical: boolean = false;\n\n static styles = [\n ...Dialog.styles,\n css`\n :host([hide-icon]) .info-icon {\n display: none;\n }\n\n :host([hide-icon]) .info-text,\n :host([hide-icon]) .info-title {\n text-align: center;\n }\n\n .info-text:not(.small) {\n font-size: var(--font-size-default);\n }\n `\n ];\n\n renderContent() {\n const { message, dialogTitle, options, icon, vertical } = this;\n\n return html`\n
    \n
    \n \n
    \n
    ${dialogTitle}
    \n
    ${message}
    \n
    \n
    \n\n
    2 ? \"vertical\" : \"\"}\">\n ${options.map(\n (o: any, i: number) =>\n html`\n \n `\n )}\n
    \n
    \n `;\n }\n\n done(i: number = -1) {\n super.done(i);\n }\n\n show({\n message = \"\",\n title = \"\",\n options = [\"OK\"],\n type = \"info\",\n preventDismiss = false,\n hideIcon = false,\n vertical = false,\n icon,\n preventAutoClose\n }: AlertOptions = {}): Promise {\n this.message = message;\n this.dialogTitle = title;\n this.type = type;\n this.preventDismiss = preventDismiss;\n this.options = options;\n this.hideIcon = hideIcon;\n this.vertical = vertical;\n this.icon = icon || this._icon(type);\n if (typeof preventAutoClose !== \"undefined\") {\n this.preventAutoClose = preventAutoClose;\n }\n\n return super.show();\n }\n\n private _icon(type: string) {\n switch (type) {\n case \"info\":\n return \"info-round\";\n case \"warning\":\n return \"error\";\n case \"success\":\n return \"success\";\n case \"question\":\n case \"choice\":\n case \"destructive\":\n return \"question\";\n default:\n return \"\";\n }\n }\n\n private _buttonClass(i: number) {\n if (i === 0) {\n return this.type === \"destructive\" ? \"negative\" : this.type !== \"choice\" ? \"primary\" : \"\";\n } else {\n return \"\";\n }\n }\n}\n","import \"../../assets/fonts/fonts.css\";\nimport { Plan, PlanType } from \"@padloc/core/src/billing\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { biometricAuth } from \"@padloc/core/src/platform\";\nimport { VaultItem } from \"@padloc/core/src/item\";\nimport { config, shared, mixins } from \"../styles\";\nimport { app, router } from \"../globals\";\nimport { StateMixin } from \"../mixins/state\";\nimport { AutoLock } from \"../mixins/auto-lock\";\nimport { ErrorHandling } from \"../mixins/error-handling\";\nimport { AutoSync } from \"../mixins/auto-sync\";\nimport { ServiceWorker } from \"../mixins/service-worker\";\nimport { BaseElement, html, css, property, query, listen } from \"./base\";\nimport \"./icon\";\nimport { Input } from \"./input\";\nimport { View } from \"./view\";\nimport { ItemsList } from \"./items-list\";\nimport { Settings } from \"./settings\";\nimport { OrgView } from \"./org-view\";\nimport { OrgsList } from \"./orgs-list\";\nimport { Start } from \"./start\";\nimport { alert, confirm, prompt, clearDialogs, dialog } from \"../lib/dialog\";\nimport { Dialog } from \"./dialog\";\nimport { clearClipboard } from \"../lib/clipboard\";\nimport { Menu } from \"./menu\";\nimport { InviteDialog } from \"./invite-dialog\";\nimport { ItemDialog } from \"./item-dialog\";\nimport { CreateOrgDialog } from \"./create-org-dialog\";\nimport { ChoosePlanDialog } from \"./choose-plan-dialog\";\nimport { PremiumDialog } from \"./premium-dialog\";\nimport { CreateItemDialog } from \"./create-item-dialog\";\nimport { TOTPElement } from \"./totp\";\n\nexport class App extends ServiceWorker(StateMixin(AutoSync(ErrorHandling(AutoLock(BaseElement))))) {\n @property()\n locked = true;\n @property()\n loggedIn = false;\n\n @property({ type: Boolean, reflect: true, attribute: \"singleton-container\" })\n readonly singletonContainer = true;\n\n get router() {\n return router;\n }\n\n @property()\n protected _ready = false;\n\n @query(\"pl-start\")\n private _startView: Start;\n @query(\"pl-settings\")\n private _settings: Settings;\n @query(\"pl-org-view\")\n private _orgView: OrgView;\n @query(\"pl-items-list\")\n private _items: ItemsList;\n @query(\"pl-orgs-list\")\n private _orgs: OrgsList;\n @query(\"pl-menu\")\n private _menu: Menu;\n\n @dialog(\"pl-invite-dialog\")\n private _inviteDialog: InviteDialog;\n\n @dialog(\"pl-item-dialog\")\n private _itemDialog: ItemDialog;\n\n @dialog(\"pl-choose-plan-dialog\")\n private _choosePlanDialog: ChoosePlanDialog;\n\n @dialog(\"pl-create-org-dialog\")\n private _createOrgDialog: CreateOrgDialog;\n\n @dialog(\"pl-premium-dialog\")\n private _premiumDialog: PremiumDialog;\n\n @dialog(\"pl-create-item-dialog\")\n private _createItemDialog: CreateItemDialog;\n\n @property()\n private _view: View | null;\n\n @property({ reflect: true, attribute: \"menu-open\" })\n private _menuOpen: boolean = false;\n\n shouldUpdate() {\n return this._ready;\n }\n\n constructor() {\n super();\n this.load();\n }\n\n async load() {\n await app.loaded;\n // Try syncing account so user can unlock with new password in case it has changed\n if (app.state.loggedIn) {\n app.fetchAccount();\n }\n this._ready = true;\n this._routeChanged();\n const spinner = document.querySelector(\".spinner\") as HTMLElement;\n spinner.style.display = \"none\";\n }\n\n static styles = [\n config.cssVars,\n shared,\n css`\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n }\n\n :host {\n background: linear-gradient(\n var(--color-gradient-highlight-to) 0%,\n var(--color-gradient-highlight-from) 100%\n );\n overflow: hidden;\n color: var(--color-foreground);\n position: fixed;\n width: 100%;\n height: 100%;\n animation: fadeIn 0.5s;\n display: flex;\n flex-direction: column;\n --menu-width: 250px;\n }\n\n .main {\n flex: 1;\n position: relative;\n perspective: 1000px;\n }\n\n .wrapper {\n display: flex;\n transform-origin: 0 center;\n transition: transform 0.4s cubic-bezier(0.6, 0, 0.2, 1);\n ${mixins.fullbleed()}\n ${mixins.gradientDark()}\n }\n\n pl-menu {\n width: var(--menu-width);\n }\n\n .views {\n flex: 1;\n position: relative;\n margin: var(--gutter-size);\n margin-left: 0;\n background: var(--color-quaternary);\n border-radius: var(--border-radius);\n overflow: hidden;\n }\n\n .views > * {\n transition: opacity 0.4s;\n border-radius: var(--border-radius);\n ${mixins.fullbleed()}\n }\n\n .views > :not(.showing) {\n opacity: 0;\n z-index: -1;\n pointer-events: none;\n }\n\n .wrapper:not(.active),\n :host(.dialog-open) .wrapper {\n transform: translate3d(0, 0, -150px) rotateX(5deg);\n border-radius: var(--border-radius);\n }\n\n :host(.dialog-open.hide-app) {\n background: transparent;\n }\n\n :host(.dialog-open.hide-app) .main > * {\n opacity: 0;\n }\n\n .offline {\n background: var(--color-negative);\n color: var(--color-tertiary);\n padding: 8px;\n text-align: center;\n z-index: 100;\n font-weight: 600;\n font-size: var(--font-size-small);\n position: relative;\n }\n\n .offline pl-icon {\n position: absolute;\n right: 0;\n bottom: 0;\n font-size: var(--font-size-micro);\n margin: 4px;\n width: 30px;\n height: 30px;\n }\n\n .menu-scrim {\n ${mixins.fullbleed()}\n z-index: 10;\n background: var(--color-tertiary);\n opacity: 0.3;\n transition: opacity 0.3s;\n display: none;\n }\n\n @supports (-webkit-overflow-scrolling: touch) {\n .offline {\n padding-top: max(calc(env(safe-area-inset-top) - 8px), 8px);\n margin-bottom: calc(-1 * max(env(safe-area-inset-top), 8px) + 8px);\n }\n }\n\n @media (max-width: 700px) {\n .views {\n transition: transform 0.3s cubic-bezier(0.6, 0, 0.2, 1);\n ${mixins.fullbleed()}\n }\n\n .views {\n margin: 0;\n }\n\n .views,\n .views > * {\n border-radius: 0;\n }\n\n :host([menu-open]) .views {\n transform: translate(var(--menu-width), 0);\n }\n\n pl-menu {\n transition: transform 0.3s cubic-bezier(0.6, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.6, 0, 0.2, 1);\n }\n\n .menu-scrim {\n display: block;\n }\n\n :host(:not([menu-open])) .menu-scrim {\n opacity: 0;\n pointer-events: none;\n }\n\n :host(:not([menu-open])) pl-menu {\n opacity: 0;\n transform: translate(-100px, 0);\n }\n }\n\n @media (min-width: 1200px) {\n .wrapper {\n border-radius: 8px;\n overflow: hidden;\n box-shadow: rgba(0, 0, 0, 0.5) 0 1px 3px;\n margin: auto;\n overflow: hidden;\n top: 20px;\n left: 20px;\n right: 20px;\n bottom: 20px;\n max-width: 1200px;\n max-height: 900px;\n }\n }\n `\n ];\n\n render() {\n return html`\n
    \n ${$l(\"o f f l i n e\")}\n\n \n
    \n\n
    \n \n\n
    \n \n\n
    \n \n\n \n\n \n\n \n\n this._closeMenu(e)}\n @click=${(e: MouseEvent) => this._closeMenu(e)}\n >
    \n
    \n
    \n\n \n \n `;\n }\n\n stateChanged() {\n this.locked = this.state.locked;\n this.loggedIn = this.state.loggedIn;\n super.stateChanged();\n }\n\n updated(changes: Map) {\n if (changes.has(\"locked\")) {\n if (this.locked) {\n this._locked();\n } else {\n this._unlocked();\n }\n }\n\n if (changes.has(\"loggedIn\")) {\n if (this.loggedIn) {\n this._loggedIn();\n } else {\n this._loggedOut();\n }\n }\n }\n\n protected _locked() {\n this.$(\".wrapper\").classList.remove(\"active\");\n clearDialogs();\n clearClipboard();\n this._routeChanged();\n }\n\n protected _unlocked(instant = false) {\n setTimeout(\n async () => {\n if (!this.$(\".wrapper\")) {\n await this.updateComplete;\n }\n\n this.$(\".wrapper\").classList.add(\"active\");\n if (typeof router.params.next !== \"undefined\") {\n router.go(router.params.next, {}, true);\n } else {\n this._routeChanged();\n }\n },\n instant ? 0 : 600\n );\n }\n\n protected _loggedIn() {}\n protected _loggedOut() {}\n\n @listen(\"toggle-menu\")\n _toggleMenu() {\n this._menuOpen = !this._menuOpen;\n }\n\n _closeMenu(e: MouseEvent) {\n this._menuOpen = false;\n e.preventDefault();\n }\n\n @listen(\"dialog-open\")\n _dialogOpen(e: CustomEvent) {\n const dialog = e.target as Dialog;\n this.classList.add(\"dialog-open\");\n if (dialog.hideApp) {\n this.classList.add(\"hide-app\");\n }\n }\n\n @listen(\"dialog-close\")\n _dialogClose() {\n this.classList.remove(\"dialog-open\");\n this.classList.remove(\"hide-app\");\n }\n\n @listen(\"route-changed\", router)\n async _routeChanged() {\n if (!this._ready) {\n return;\n }\n\n Dialog.closeAll();\n\n await app.loaded;\n\n const path = router.path;\n\n let match;\n\n if (path === \"recover\") {\n this._startView.recover();\n return;\n }\n\n if (!app.account) {\n if (path === \"login\") {\n this._startView.login();\n } else if ((match = path.match(/^signup(?:\\/([^\\/]+))?$/))) {\n const [, step] = match;\n this._startView.signup(step);\n } else {\n const params = router.params;\n\n if (path) {\n params.next = path;\n }\n\n if ((match = path.match(/^invite\\/([^\\/]+)\\/([^\\/]+)$/))) {\n const [, org, id] = match;\n params.invite = org + \",\" + id;\n }\n\n router.go(params.verify ? \"signup\" : \"login\", params, true);\n }\n return;\n }\n\n if (this.state.locked) {\n if (path === \"unlock\") {\n this._startView.unlock();\n } else {\n router.go(\"unlock\", path ? { next: path, nobio: \"1\", ...router.params } : undefined, true);\n }\n return;\n }\n\n if (path === \"settings\") {\n this._openView(this._settings);\n this._menu.selected = \"settings\";\n } else if ((match = path.match(/^orgs?(?:\\/([^\\/]+))?$/))) {\n const [, id] = match;\n const org = id && app.getOrg(id);\n if (id && !org) {\n router.go(\"orgs\", undefined, true);\n return;\n }\n\n if (org) {\n this._orgView.orgId = id || \"\";\n this._openView(this._orgView);\n this._menu.selected = `orgs/${id}`;\n } else {\n this._openView(this._orgs);\n this._menu.selected = \"orgs\";\n }\n } else if ((match = path.match(/^items(?:\\/([^\\/]+))?$/))) {\n const [, id] = match;\n\n const { vault, tag, favorites, attachments, recent, host } = router.params;\n this._items.selected = id || \"\";\n this._items.vault = vault || \"\";\n this._items.tag = tag || \"\";\n this._items.favorites = favorites === \"true\";\n this._items.attachments = attachments === \"true\";\n this._items.recent = recent === \"true\";\n this._items.host = host === \"true\";\n this._openView(this._items);\n\n this._menu.selected = vault\n ? `vault/${vault}`\n : tag\n ? `tag/${tag}`\n : favorites\n ? \"favorites\"\n : recent\n ? \"recent\"\n : attachments\n ? \"attachments\"\n : host\n ? \"host\"\n : \"items\";\n\n const item = id && app.getItem(id);\n if (item) {\n const { newitem, edit, addattachment, ...rest } = router.params;\n router.params = rest;\n this._itemDialog.isNew = typeof newitem !== \"undefined\";\n this._itemDialog.show(item.item.id);\n if (typeof edit !== \"undefined\") {\n this._itemDialog.edit();\n if (this._itemDialog.isNew && typeof addattachment !== \"undefined\") {\n this._itemDialog.addAttachment();\n }\n }\n app.updateLastUsed(item.item);\n }\n } else if ((match = path.match(/^invite\\/([^\\/]+)\\/([^\\/]+)$/))) {\n const [, orgId, id] = match;\n const invite = await app.getInvite(orgId, id);\n const org = app.getOrg(orgId);\n if (invite) {\n if (org && org.isAdmin(app.account!)) {\n await org.unlock(app.account!);\n await invite.unlock(org.invitesKey);\n }\n this._inviteDialog.show(invite);\n } else {\n await alert($l(\"Could not find invite! Did you use the correct link?\"), { type: \"warning\" });\n router.go(\"items\", undefined, true);\n }\n } else if ((match = path.match(/^plans?\\/(.+)\\/?$/))) {\n const billingProvider = app.state.billingProvider;\n if (!billingProvider) {\n router.go(\"items\", undefined, true);\n return;\n }\n\n const planType = parseInt(match[1]);\n if (planType === PlanType.Premium) {\n await this._premiumDialog.show();\n router.go(\"items\", undefined, true);\n } else {\n const plan = billingProvider!.plans.find(p => p.type === planType);\n if (plan && plan.type !== PlanType.Free) {\n const org = await this._createOrgDialog.show(plan);\n if (org) {\n router.go(`orgs/${org.id}`);\n } else {\n router.go(\"items\", undefined, true);\n }\n } else {\n router.go(\"items\", undefined, true);\n }\n }\n } else {\n router.go(\"items\", undefined, true);\n }\n }\n\n private async _openView(view: View | null) {\n if (view === this._view) {\n return;\n }\n\n if (view) {\n view.classList.add(\"showing\");\n view.active = true;\n }\n\n if (this._view) {\n this._view.classList.remove(\"showing\");\n this._view.active = false;\n }\n\n this._view = view;\n }\n\n @listen(\"keydown\", document)\n _keydown(event: KeyboardEvent) {\n if (this.state.locked || Input.activeInput) {\n return;\n }\n\n const control = event.ctrlKey || event.metaKey;\n\n // ESCAPE -> Back\n if (event.key === \"Escape\") {\n if (Dialog.openDialogs.size) {\n Dialog.closeAll();\n }\n }\n // CTRL/CMD (+ Shift) + F -> Search (All)\n else if (control && event.key === \"f\") {\n event.preventDefault();\n const { vault, tags, recent, favorites, attachments, ...rest } = router.params;\n router.go(\"items\", event.shiftKey ? rest : { vault, tags, recent, favorites, attachments, ...rest });\n this._items.search();\n }\n }\n\n @listen(\"backbutton\", document)\n _androidBack() {\n if (!this.locked && router.canGoBack) {\n router.back();\n } else {\n navigator.Backbutton && navigator.Backbutton.goBack();\n }\n }\n\n @listen(\"create-item\")\n async _newItem() {\n const vault = (router.params.vault && app.getVault(router.params.vault)) || undefined;\n await this._createItemDialog.show(vault);\n }\n\n @listen(\"create-org\")\n async _createOrg() {\n let plan: Plan | null = null;\n\n if (app.billingEnabled) {\n plan = await this._choosePlanDialog.show();\n if (!plan) {\n return;\n }\n }\n\n const org = await this._createOrgDialog.show(plan);\n if (org) {\n router.go(`orgs/${org.id}`);\n }\n }\n\n @listen(\"get-premium\")\n async _getPremium(e: CustomEvent) {\n const message = e.detail && (e.detail.message as string);\n const icon = (e.detail && e.detail.icon) || \"error\";\n\n const confirmed = !message || (await confirm(message, $l(\"Get Premium\"), $l(\"Cancel\"), { icon }));\n\n if (confirmed) {\n await this._premiumDialog.show();\n }\n\n this._routeChanged();\n }\n\n private _showOfflineAlert() {\n alert(\n $l(\n \"It looks like the app cannot connect to the Padloc servers right now, probably due \" +\n \"to a missing internet connection. You can still access your vaults and even create \" +\n \"or edit Vault Items but your changes won't be synchronized until you're back online.\"\n ),\n { title: $l(\"You're Offline\") }\n );\n }\n\n @listen(\"enable-biometric-auth\")\n async _enableBiometricAuth(e: CustomEvent) {\n const confirmed = await confirm(\n (e.detail && e.detail.message) || $l(\"Do you want to enable biometric unlock for this device?\"),\n $l(\"Setup\"),\n $l(\"Cancel\"),\n {\n title: $l(\"Biometric Unlock\")\n }\n );\n\n if (!confirmed) {\n app.forgetMasterKey();\n return;\n }\n\n try {\n const authenticated = await biometricAuth();\n\n if (!authenticated) {\n alert($l(\"Biometric authentication failed! Canceling Setup.\"), {\n title: $l(\"Setup Failed\"),\n type: \"warning\"\n });\n app.forgetMasterKey();\n return;\n }\n } catch (e) {\n alert($l(\"Biometric unlock failed! Canceling Setup. (Reason: {0})\", e.message), {\n title: $l(\"Setup Failed\"),\n type: \"warning\"\n });\n app.forgetMasterKey();\n return;\n }\n\n if (app.account!.locked) {\n const password = await prompt($l(\"Please enter your master password!\"), {\n title: $l(\"Biometric Unlock\"),\n label: $l(\"Enter Master Password\"),\n type: \"password\",\n validate: async pwd => {\n try {\n await app.account!.unlock(pwd);\n } catch (e) {\n throw $l(\"Wrong password! Please try again!\");\n }\n\n return pwd;\n }\n });\n\n if (!password) {\n app.forgetMasterKey();\n return;\n }\n\n await app.unlock(password);\n }\n\n await app.rememberMasterKey();\n\n await alert($l(\"Biometric unlock activated successfully!\"), {\n title: $l(\"Biometric Unlock\"),\n type: \"success\",\n preventAutoClose: true\n });\n }\n\n @listen(\"field-dragged\")\n protected async _fieldDragged({\n detail: { event, item, index }\n }: CustomEvent<{ item: VaultItem; index: number; event: DragEvent }>) {\n const field = item.fields[index];\n const target = event.target as HTMLElement;\n target.classList.add(\"dragging\");\n target.addEventListener(\"dragend\", () => target.classList.remove(\"dragging\"), { once: true });\n const totp: TOTPElement | null =\n target.querySelector(\"pl-totp\") || (target.shadowRoot && target.shadowRoot.querySelector(\"pl-totp\"));\n event.dataTransfer!.setData(\"text/plain\", field.type === \"totp\" && totp ? totp.token : field.value);\n }\n}\n\nwindow.customElements.define(\"pl-app\", App);\n","import { TemplateResult } from \"lit-element\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { VaultItemID } from \"@padloc/core/src/item\";\nimport { Attachment, AttachmentInfo } from \"@padloc/core/src/attachment\";\nimport { saveFile } from \"@padloc/core/src/platform\";\nimport { app } from \"../globals\";\nimport { mixins } from \"../styles\";\nimport { mediaType, fileIcon, fileSize } from \"../lib/util\";\nimport { confirm, prompt } from \"../lib/dialog\";\nimport { element, html, css, property } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport \"./icon\";\nimport { View } from \"./view\";\n\n@element(\"pl-attachment-dialog\")\nexport class AttachmentDialog extends Dialog<{ info?: AttachmentInfo; file?: File; item: VaultItemID }, void> {\n static styles = [\n ...Dialog.styles,\n ...View.styles,\n css`\n .inner {\n background: none;\n box-shadow: none;\n border-radius: 0;\n ${mixins.fullbleed()}\n max-width: none;\n display: flex;\n flex-direction: column;\n }\n\n .scrim {\n background: var(--color-secondary);\n }\n\n :host([open]) .scrim {\n opacity: 1;\n }\n\n header {\n box-shadow: rgba(0, 0, 0, 0.15) 0px 1px 3px;\n }\n\n header > .name {\n flex: 1;\n font-weight: bold;\n text-align: center;\n ${mixins.ellipsis()}\n }\n\n .info,\n .preview {\n flex: 1;\n position: relative;\n }\n\n .preview.image {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n }\n\n .preview.image img {\n width: 100%;\n height: 100%;\n object-fit: scale-down;\n }\n\n .preview.text,\n .preview.code {\n margin: 0;\n background: var(--color-quaternary);\n font-size: var(--font-size-tiny);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .preview code {\n padding: 16px;\n padding-bottom: 80px;\n max-width: 100%;\n max-height: 100%;\n box-sizing: border-box;\n ${mixins.scroll()}\n }\n\n .preview.text {\n white-space: normal;\n }\n\n .preview.text code {\n max-width: 600px;\n }\n\n .info {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--color-tertiary);\n }\n\n .info > pl-icon {\n width: 100px;\n height: 100px;\n font-size: 80px;\n }\n\n .controls {\n display: flex;\n align-items: center;\n padding: 12px;\n background: var(--color-tertiarty);\n border-radius: var(--border-radius);\n }\n\n .mime-type {\n font-weight: bold;\n margin-top: 8px;\n }\n\n .error {\n font-size: var(--font-size-small);\n margin-bottom: 12px;\n color: var(--color-negative);\n font-weight: bold;\n }\n\n .size {\n font-size: var(--font-size-small);\n margin-bottom: 12px;\n }\n `\n ];\n\n @property()\n info: AttachmentInfo | null = null;\n\n @property()\n itemId: VaultItemID | null = null;\n\n readonly preventDismiss = true;\n\n @property()\n private _progress: { loaded: number; total: number } | null = null;\n\n @property()\n private _error = \"\";\n\n @property()\n private _objectUrl?: string;\n\n @property()\n private _attachment: Attachment | null = null;\n\n @property()\n private _preview: TemplateResult | null = null;\n\n get _item() {\n const found = (this.itemId && app.getItem(this.itemId)) || null;\n return found && found.item;\n }\n\n get _vault() {\n const found = (this.itemId && app.getItem(this.itemId)) || null;\n return found && found.vault;\n }\n\n show({ info, item }: { info: AttachmentInfo; item: VaultItemID }) {\n this.info = info;\n this.itemId = item;\n this._error = \"\";\n this._progress = null;\n this._preview = null;\n this._attachment = null;\n this._download();\n return super.show();\n }\n\n done() {\n if (this._objectUrl) {\n URL.revokeObjectURL(this._objectUrl);\n }\n this._objectUrl = undefined;\n this._preview = null;\n this._attachment = null;\n super.done();\n }\n\n private async _delete() {\n this.open = false;\n const confirmed = await confirm(\n $l(\"Are you sure you want to delete this attachment?\"),\n $l(\"Delete\"),\n $l(\"Cancel\"),\n {\n title: $l(\"Delete Attachment\"),\n type: \"destructive\"\n }\n );\n if (confirmed) {\n await app.deleteAttachment(this.itemId!, this.info!);\n this.done();\n } else {\n this.open = true;\n }\n }\n\n async _download() {\n this._progress = null;\n this._error = \"\";\n\n const att = await app.downloadAttachment(this.info!);\n const download = att.downloadProgress!;\n const handler = () => (this._progress = download.progress);\n\n download.addEventListener(\"progress\", handler);\n try {\n await download.completed;\n } catch (e) {}\n download.removeEventListener(\"progress\", handler);\n\n this._progress = null;\n\n if (download.error) {\n this._error = $l(\"Download failed!\");\n } else {\n this._attachment = att;\n this._preview = await this._getPreview(att);\n }\n }\n\n private async _getPreview(att: Attachment) {\n if (!this.info) {\n return null;\n }\n\n const mType = mediaType(this.info.type);\n\n switch (mType) {\n case \"pdf\":\n this._objectUrl = await att.toObjectURL();\n return html`\n \n `;\n case \"image\":\n this._objectUrl = await att.toObjectURL();\n return html`\n
    \n \n
    \n `;\n case \"text\":\n case \"code\":\n const text = await att.toText();\n return html`
    ${text}
    `;\n default:\n return null;\n }\n }\n\n private async _saveToDisk() {\n if (!this._attachment || !this.info) {\n throw \"Need to download attachment first!\";\n }\n\n this.open = false;\n const confirmed = await confirm(\n $l(\n \"Do you want to save this file to your disk? WARNING: Doing \" +\n \"this will leave the file exposed and unprotected on your \" +\n \"harddrive!\"\n ),\n $l(\"Save\"),\n $l(\"Cancel\"),\n { title: $l(\"Save To Disk\"), type: \"warning\" }\n );\n this.open = true;\n\n if (confirmed) {\n saveFile(this.info.name, this.info.type, await this._attachment.getData());\n }\n }\n\n private async _edit() {\n if (!this.info) {\n return;\n }\n this.open = false;\n await prompt(\"\", {\n title: $l(\"Edit Name\"),\n confirmLabel: $l(\"Save\"),\n value: this.info.name,\n label: $l(\"Attachment Name\"),\n validate: async (name: string) => {\n if (!name) {\n throw $l(\"Please enter an attachment name!\");\n }\n if (name !== this.info!.name) {\n this.info!.name = name;\n await app.updateItem(this._item!, {});\n }\n return name;\n }\n });\n this.open = true;\n }\n\n renderContent() {\n if (!this.info) {\n return html``;\n }\n\n return html`\n
    \n
    ${this.info.name}
    \n this.done()}>\n
    \n\n ${this._preview ||\n html`\n
    \n \n \n\n
    ${this.info.type || $l(\"Unknown File Type\")}
    \n\n
    ${this._error}
    \n\n
    \n ${this._progress\n ? $l(\n \"downloading... {0}/{1}\",\n fileSize(this._progress.loaded),\n fileSize(this._progress.total)\n )\n : fileSize(this.info.size)}\n
    \n
    \n `}\n\n
    \n \n
    \n \n \n
    \n `;\n }\n}\n","import { TemplateResult } from \"lit-html\";\nimport { BaseElement, html, css, query, property } from \"./base\";\nimport { shared } from \"../styles\";\n\nlet activeInput: BaseInput | null = null;\n\n// On touch devices, blur active input when tapping on a non-input\ndocument.addEventListener(\"touchend\", () => {\n if (activeInput) {\n activeInput.blur();\n }\n});\n\nexport abstract class BaseInput extends BaseElement {\n @property()\n autocapitalize: string = \"off\";\n\n @property({ reflect: true })\n disabled: boolean = false;\n\n @property({ reflect: true })\n focused: boolean = false;\n\n @property({ reflect: true })\n invalid: boolean = false;\n\n @property()\n placeholder: string = \"\";\n\n @property()\n label: string = \"\";\n\n @property({ attribute: \"no-tab\" })\n noTab: boolean = false;\n\n @property({ reflect: true })\n readonly: boolean = false;\n\n @property({ reflect: true })\n required: boolean = false;\n\n @property({ attribute: \"select-on-focus\" })\n selectOnFocus: boolean = false;\n\n @property()\n get value(): string {\n return (this._inputElement && this._inputElement.value) || \"\";\n }\n set value(val: string) {\n (async () => {\n if (!this._inputElement) {\n await this.updateComplete;\n }\n const oldValue = this._inputElement.value;\n this._inputElement.value = val;\n this.requestUpdate(\"value\", oldValue);\n })();\n }\n\n @query(\".input-element\")\n protected _inputElement: HTMLInputElement;\n\n private _prevValue: string = this.value;\n\n static get activeInput() {\n return activeInput;\n }\n\n protected abstract _renderInput(): TemplateResult;\n\n async focus() {\n if (!this._inputElement) {\n await this.updateComplete;\n }\n this._inputElement.focus();\n }\n\n async blur() {\n if (!this._inputElement) {\n await this.updateComplete;\n }\n this._inputElement.blur();\n }\n\n selectAll() {\n try {\n this._inputElement.setSelectionRange(0, this.value.length);\n } catch (e) {\n this._inputElement.select();\n }\n }\n\n protected _focused(e: FocusEvent) {\n e.stopPropagation();\n this.focused = true;\n activeInput = this;\n\n this.dispatch(\"focus\");\n\n if (this.selectOnFocus) {\n setTimeout(() => this.selectAll(), 10);\n }\n }\n\n protected _blurred(e: FocusEvent) {\n e.stopPropagation();\n this.focused = false;\n\n this.dispatch(\"blur\");\n\n if (activeInput === this) {\n activeInput = null;\n }\n }\n\n protected _changeHandler(e: Event) {\n e.stopPropagation();\n this.dispatch(\"change\", { prevValue: this._prevValue, value: this.value }, true, true);\n this._prevValue = this.value;\n }\n\n protected _touchend(e: Event) {\n e.stopPropagation();\n }\n\n static styles = [\n shared,\n css`\n :host {\n display: block;\n position: relative;\n font-size: inherit;\n font-weight: inherit;\n font-family: inherit;\n background: var(--shade-2-color);\n border-radius: var(--border-radius);\n padding: 12px 10px;\n }\n\n input {\n box-sizing: border-box;\n text-overflow: ellipsis;\n box-shadow: none;\n }\n\n .input-element {\n text-align: inherit;\n width: 100%;\n min-height: inherit;\n line-height: inherit;\n caret-color: currentColor;\n cursor: inherit;\n }\n\n textarea {\n overflow-wrap: break-word;\n }\n\n ::-webkit-search-cancel-button {\n display: none;\n }\n\n ::-webkit-placeholder {\n text-shadow: inherit;\n color: inherit;\n opacity: 0.5;\n }\n\n label {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n padding: 12px 10px;\n opacity: 0.5;\n transition: transform 0.2s, color 0.2s, opacity 0.5s;\n cursor: text;\n pointer-events: none;\n }\n\n label[float] {\n transform: scale(0.8) translate(0, -32px);\n color: var(--color-highlight);\n font-weight: bold;\n opacity: 1;\n }\n\n .input-element[disabled] {\n opacity: 1;\n -webkit-text-fill-color: currentColor;\n }\n\n @supports (-webkit-overflow-scrolling: touch) {\n input[type=\"date\"],\n input[type=\"month\"] {\n display: block;\n min-height: 1.5em;\n }\n }\n `\n ];\n\n render() {\n const { value, focused, label, placeholder } = this;\n\n return html`\n ${this._renderInput()}\n\n \n `;\n }\n}\n","import \"reflect-metadata\";\nimport { EventTarget, Event } from \"@padloc/core/src/event-target\";\nimport { LitElement, html, css, svg } from \"lit-element\";\nimport { UpdatingElement, PropertyDeclaration } from \"lit-element/lib/updating-element\";\nexport { html, css, svg };\n\nexport interface BasePrototype extends BaseElement {}\n\nexport interface ListenerDeclaration {\n name: string;\n handler: (e?: Event) => void;\n target?: string | EventTarget;\n}\n\nexport interface Listener {\n name: string;\n target: EventTarget;\n handler: (e: Event) => void;\n}\n\nexport interface Observer {\n props: string[];\n handler: (changed: Map) => void;\n}\n\nexport class BaseElement extends LitElement {\n private static _listeners?: ListenerDeclaration[];\n private static _observers?: Observer[];\n\n private _$: { [id: string]: HTMLElement } = {};\n private _$$: { [id: string]: NodeList } = {};\n private _listeners: Listener[] = [];\n\n /**\n * Find first element macthing the selector in the element's shadow root, caching the result\n * @param selector query selector string\n */\n $(sel: string, cached = false): HTMLElement {\n if (!cached || !this._$[sel]) {\n const e = this.renderRoot!.querySelector(sel);\n if (e) {\n this._$[sel] = e as HTMLElement;\n }\n }\n return this._$[sel];\n }\n\n /**\n * Find first element macthing the selector in the element's shadow root, caching the result\n * @param selector query selector string\n */\n $$(sel: string, cached = false): NodeList {\n if (!cached || !this._$[sel]) {\n const e = this.renderRoot!.querySelectorAll(sel);\n if (e) {\n this._$$[sel] = e;\n }\n }\n return this._$$[sel];\n }\n\n /**\n * Fires a custom event with the specified name\n * @param name Name of the event\n * @param detail Optional event detail object\n * @param bubbles Optional - if the event bubbles. Default is TRUE.\n * @param composed Optional - if the event bubbles past the shadow root. Default is TRUE.\n */\n dispatch(name: string, detail?: any, bubbles: boolean = true, composed: boolean = true) {\n if (name) {\n const init: any = {\n bubbles: typeof bubbles === \"boolean\" ? bubbles : true,\n composed: typeof composed === \"boolean\" ? composed : true\n };\n if (detail) {\n init.detail = detail;\n }\n this.dispatchEvent(new CustomEvent(name, init));\n }\n }\n\n get node(): HTMLElement {\n return (this as any) as HTMLElement;\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n const declarations = (this.constructor)._listeners;\n if (!declarations) {\n return;\n }\n\n for (const decl of declarations) {\n (async () => {\n let targets: EventTarget[] = [];\n\n if (!decl.target) {\n targets = [(this as any) as EventTarget];\n } else if (typeof decl.target === \"string\") {\n // a string target property indicates that the target is a child of this element,\n // so we have to make sure the renderRoot is created first\n await this.updateComplete;\n targets = (this.$$(decl.target) as any) as EventTarget[];\n } else if (typeof decl.target.addEventListener === \"function\") {\n targets = [decl.target];\n }\n\n if (!targets.length) {\n throw \"invalid event target: \" + decl.target;\n }\n\n const handler = (e: Event) => {\n decl.handler.call(this, e);\n };\n for (const target of targets) {\n target.addEventListener(decl.name, handler);\n this._listeners.push({\n target,\n handler,\n name: decl.name\n });\n }\n })();\n }\n }\n\n disconnectedCallback() {\n let listener;\n while ((listener = this._listeners.pop())) {\n listener.target.removeEventListener(listener.name, listener.handler);\n }\n }\n\n updated(changed: Map): void {\n let proto = this;\n\n do {\n const observers = (proto.constructor)._observers;\n if (!observers) {\n return;\n }\n\n for (const observer of observers) {\n if (observer.props.some(p => changed.has(p))) {\n observer.handler.call(this, changed);\n }\n }\n } while (proto instanceof BaseElement && (proto = Object.getPrototypeOf(proto)));\n }\n}\n\n/**\n * Decorator for defining a new custom element\n * @param name tag name of custom element\n */\nexport function element(name: string) {\n return (c: any) => {\n if (name) {\n window.customElements.define(name, c);\n }\n };\n}\n\nexport function property(options?: PropertyDeclaration) {\n return (proto: Object, name: string) => {\n options = options || {};\n if (!options.type) {\n // @ts-ignore\n options.type = getType(proto, name);\n }\n (proto.constructor as typeof UpdatingElement).createProperty(name, options);\n };\n}\n\nfunction getType(prototype: any, propertyName: string): any {\n if (Reflect.hasMetadata) {\n if (Reflect.hasMetadata(\"design:type\", prototype, propertyName)) {\n return Reflect.getMetadata(\"design:type\", prototype, propertyName);\n }\n }\n return null;\n}\n\n/**\n * Decorator to create a getter for the specified selector\n * @param selector selector to find the element\n */\nexport function query(selector: string, cached = false) {\n return (prototype: BasePrototype, propertyName: string) => {\n Object.defineProperty(prototype, propertyName, {\n get() {\n return (this as BasePrototype).$(selector, cached);\n },\n enumerable: true,\n configurable: true\n });\n };\n}\n\n/**\n * Decorator to create a getter that returns a nodelist of all\n * elements matching the selector\n * @param selector selector query\n */\nexport function queryAll(selector: string, cached = false) {\n return (prototype: BasePrototype, propertyName: string) => {\n Object.defineProperty(prototype, propertyName, {\n get() {\n return (this as BasePrototype).$$(selector, cached);\n },\n enumerable: true,\n configurable: true\n });\n };\n}\n\n/**\n * Decorator to add event handlers\n * @param name name of event, e.g. 'click'\n * @param selector EventTarget or a selector to the node to listen to e.g. '#myButton'\n */\nexport function listen(name: string, target?: string | EventTarget) {\n return (prototype: any, methodName: string) => {\n const { constructor } = prototype;\n if (!constructor.hasOwnProperty(\"_listeners\")) {\n Object.defineProperty(constructor, \"_listeners\", { value: [] });\n }\n constructor._listeners.push({\n name,\n target,\n handler: prototype[methodName]\n });\n };\n}\n\n/**\n * Decortator to define an observer that gets called back\n * whenever any of the specified property is updated\n * @param properties list of properties to observe\n */\nexport function observe(...properties: string[]) {\n return (prototype: any, methodName: string) => {\n const { constructor } = prototype;\n if (!constructor.hasOwnProperty(\"_observers\")) {\n Object.defineProperty(constructor, \"_observers\", { value: [] });\n }\n constructor._observers.push({\n props: properties,\n handler: prototype[methodName]\n });\n };\n}\n","import { countries } from \"@padloc/locale/src/countries\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { BillingInfo, BillingAddress, UpdateBillingParams } from \"@padloc/core/src/billing\";\nimport { loadScript } from \"../lib/util\";\nimport { app } from \"../globals\";\nimport { element, html, property, query, css } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport { Input } from \"./input\";\nimport { Select } from \"./select\";\nimport Nunito from \"../../assets/fonts/Nunito-Regular.ttf\";\n\ninterface Params {\n condensed?: boolean;\n title?: string;\n message?: string;\n submitLabel?: string;\n billingInfo: BillingInfo;\n}\n\n@element(\"pl-billing-dialog\")\nexport class BillingDialog extends Dialog {\n @property()\n condensed: boolean = false;\n\n @property()\n dialogTitle = \"\";\n\n @property()\n message = \"\";\n\n @property()\n submitLabel = \"\";\n\n readonly preventDismiss = true;\n\n @property()\n private _error = \"\";\n\n @property()\n private _billingInfo: BillingInfo;\n\n @property()\n private _editingPaymentMethod: boolean = false;\n\n @property()\n private _isBusiness: boolean = false;\n\n @query(\"#submitButton\")\n private _submitButton: LoadingButton;\n\n @query(\"#emailInput\")\n private _emailInput: Input;\n\n @query(\"#nameInput\")\n private _nameInput: Input;\n\n @query(\"#streetInput\")\n private _streetInput: Input;\n\n @query(\"#zipInput\")\n private _zipInput: Input;\n\n @query(\"#cityInput\")\n private _cityInput: Input;\n\n @query(\"#countrySelect\")\n private _countrySelect: Select<{ code: string; name: string }>;\n\n @query(\"#couponInput\")\n private _couponInput: Input;\n\n private _stripe: any;\n private _cardElement: any;\n\n async show({ condensed, title, message, submitLabel, billingInfo }: Params) {\n this.condensed = condensed || false;\n this.dialogTitle = title || $l(\"Update Billing Info\");\n this.message = message || \"\";\n this.submitLabel = submitLabel || $l(\"Save\");\n this._billingInfo = billingInfo;\n this._editingPaymentMethod = !this._billingInfo || !this._billingInfo.paymentMethod;\n // $l(\n // \"Add your billing info now so you're all set to keep using Padloc once the trial period is over. Don't worry, you won't be charged yet!\"\n // )\n if (app.state.billingProvider && !this._stripe) {\n this._initStripe();\n }\n return super.show();\n }\n\n private async _initStripe() {\n const stripePubKey = app.state.billingProvider && app.state.billingProvider.config.publicKey;\n\n if (!stripePubKey) {\n return;\n }\n\n const Stripe = await loadScript(\"https://js.stripe.com/v3/\", \"Stripe\");\n\n const stripe = (this._stripe = Stripe(stripePubKey));\n const elements = stripe.elements({\n fonts: [\n {\n src: `local(\"Nunito Regular\"), local(\"Nunito-Regular\"), url(${Nunito}) format(\"truetype\")`,\n family: \"Nunito\",\n style: \"normal\",\n weight: 400\n }\n ]\n });\n const card = (this._cardElement = elements.create(\"card\", {\n iconStyle: \"solid\",\n hidePostalCode: true,\n style: {\n base: {\n fontFamily: '\"Nunito\", \"Helvetica Neue\", Helvetica, sans-serif',\n fontSmoothing: \"antialiased\",\n fontSize: \"18px\"\n }\n }\n }));\n const cardElement = document.createElement(\"div\");\n this.appendChild(cardElement);\n card.mount(cardElement);\n\n let cardEmpty = true;\n card.addEventListener(\"change\", (e: any) => {\n this._error = (e.error && e.error.message) || \"\";\n cardEmpty = e.empty;\n });\n card.addEventListener(\"blur\", () => {\n if (cardEmpty) {\n this._editingPaymentMethod = !this._billingInfo || !this._billingInfo.paymentMethod;\n }\n });\n }\n\n private async _editPaymentMethod() {\n this._editingPaymentMethod = true;\n await this.updateComplete;\n this._cardElement.focus();\n }\n\n private async _submit() {\n if (this._submitButton.state === \"loading\") {\n return;\n }\n\n this._error = \"\";\n\n let paymentMethod;\n\n if (this._editingPaymentMethod) {\n this._submitButton.start();\n\n const { token, error } = await this._stripe.createToken(this._cardElement);\n\n if (error) {\n this._error = error.message;\n this._submitButton.fail();\n return;\n }\n\n this._submitButton.success();\n\n paymentMethod = {\n name: `${token.card.brand} •••• •••• •••• ${token.card.last4}`,\n source: token.id\n };\n }\n\n const address = new BillingAddress().fromRaw({\n name: this._nameInput.value,\n street: this._streetInput.value,\n postalCode: this._zipInput.value,\n city: this._cityInput.value,\n country: this._countrySelect.selected.code\n });\n\n const coupon = this._couponInput.value;\n\n this.done(\n new UpdateBillingParams({\n account: this._billingInfo!.account,\n org: this._billingInfo!.org,\n email: this._emailInput.value,\n address,\n paymentMethod,\n coupon\n })\n );\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: var(--color-quaternary);\n }\n\n h1 {\n display: block;\n text-align: center;\n }\n\n label {\n font-weight: bold;\n margin: 8px 16px;\n font-size: var(--font-size-small);\n }\n\n .card-wrapper {\n padding: 14px 0 14px 12px;\n }\n\n .city-wrapper {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: 8px;\n margin: 8px;\n }\n\n .city-wrapper > * {\n margin: 0;\n }\n\n .payment-method {\n display: flex;\n align-items: center;\n padding: 5px;\n font-weight: bold;\n }\n\n .message {\n font-size: var(--font-size-small);\n padding: 0 20px 10px 20px;\n }\n\n .skip-button {\n background: none;\n color: var(--color-tertiary);\n margin-top: 8px;\n }\n\n .discount {\n padding: 12px;\n }\n\n .discount .name {\n font-weight: bold;\n }\n\n .discount .coupon {\n opacity: 0.7;\n font-family: var(--font-family-mono);\n }\n\n .payment-disabled-message {\n padding: 30px;\n text-align: center;\n }\n `\n ];\n\n renderContent() {\n const billingInfo = this._billingInfo || new BillingInfo();\n\n let { email, address, paymentMethod, discount } = billingInfo;\n\n email = email || (app.account!.billing && app.account!.billing.email) || app.account!.email;\n const name = address.name || app.account!.name;\n\n const countryOptions = [\n { code: \"\", toString: () => $l(\"Select A Country\") },\n ...countries.map(c => Object.assign(c, { toString: () => c.name }))\n ];\n\n return html`\n
    \n \n
    ${this.dialogTitle}
    \n this.done()}>\n
    \n\n
    \n ${!app.billingEnabled\n ? html`\n
    \n ${$l(\n 'To update your billing info and payment method, please log in through our website (found under \"Settings\") ' +\n \"or contact us at \"\n )}\n support@padloc.app!\n
    \n `\n : html`\n
    \n ${this.message}\n
    \n\n \n\n
    \n \n
    \n\n
    \n ${this._error}\n
    \n\n ${paymentMethod\n ? html`\n
    \n \n
    \n ${paymentMethod.name}\n
    \n \n
    \n `\n : html``}\n\n
    \n \n\n \n\n \n\n \n\n
    \n \n\n \n
    \n\n c.code === address.country)}\n >\n\n \n\n (this._isBusiness = e.detail.value)}\n >\n\n \n
    \n\n \n\n
    \n ${discount && discount.name}\n (${discount && discount.coupon})\n
    \n\n \n\n
    \n \n ${this.submitLabel}\n \n\n \n
    \n `}\n
    \n `;\n }\n\n renderAfter() {\n return html`\n \n `;\n }\n}\n","import { countries } from \"@padloc/locale/src/countries\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { BillingInfo } from \"@padloc/core/src/billing\";\nimport { shared } from \"../styles\";\nimport { dialog, alert } from \"../lib/dialog\";\nimport { app } from \"../globals\";\nimport { BaseElement, element, property, html, css, query } from \"./base\";\nimport \"./icon\";\nimport { LoadingButton } from \"./loading-button\";\nimport { BillingDialog } from \"./billing-dialog\";\n\n@element(\"pl-billing-info\")\nexport class BillingInfoElement extends BaseElement {\n @property()\n billing: BillingInfo | null = null;\n\n @query(\"#editButton\")\n private _editButton: LoadingButton;\n\n @dialog(\"pl-billing-dialog\")\n private _billingDialog: BillingDialog;\n\n private async _update() {\n if (this._editButton.state === \"loading\") {\n return;\n }\n\n const billingInfo = this.billing!;\n\n const params = await this._billingDialog.show({ billingInfo });\n if (params) {\n this._editButton.start();\n try {\n await app.updateBilling(params);\n this._editButton.success();\n } catch (e) {\n this._editButton.fail();\n alert(e.message || $l(\"Something went wrong. Please try again later!\"), { type: \"warning\" });\n throw e;\n }\n }\n }\n\n static styles = [\n shared,\n css`\n :host {\n padding: 8px;\n display: grid;\n grid-template-columns: 36px 1fr;\n position: relative;\n }\n\n .payment-method,\n .billing-email,\n .discount {\n font-weight: bold;\n }\n\n .data {\n margin: 8px 6px;\n }\n\n .edit-button {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 1;\n }\n\n .missing {\n opacity: 0.7;\n cursor: pointer;\n }\n\n .data-icon {\n width: 36px;\n }\n `\n ];\n\n render() {\n if (!this.billing) {\n return html``;\n }\n\n const billing = this.billing!;\n const country = countries.find(c => c.code === billing.address.country);\n const postalCode = billing.address.postalCode;\n const city = billing.address.city;\n\n return html`\n \n \n \n\n \n\n
    \n ${billing.paymentMethod\n ? html`\n
    \n ${billing.paymentMethod.name}\n
    \n `\n : html`\n
    \n ${$l(\"Add Payment Method\")}\n
    \n `}\n
    \n\n ${billing.email || billing.address.name\n ? html`\n \n\n
    \n
    ${billing.email}
    \n
    ${billing.address.name}
    \n
    ${billing.address.street}
    \n
    \n ${postalCode ? `${postalCode}, ` : \"\"} ${city ? `${city}, ` : \"\"}\n ${country ? `${country.name}` : \"\"}\n
    \n
    \n `\n : html``}\n ${billing.discount\n ? html`\n \n\n
    \n ${billing.discount.name}\n
    \n `\n : html``}\n `;\n }\n}\n","import { loadScript } from \"../lib/util\";\nimport { shared } from \"../styles\";\nimport { BaseElement, element, html, property, css } from \"./base\";\nimport Nunito from \"../../assets/fonts/Nunito-Regular.ttf\";\n\n@element(\"pl-card-input\")\nexport class CardInput extends BaseElement {\n @property()\n stripePubKey = \"pk_test_jTF9rjIV9LyiyJ6ir2ARE8Oy\";\n\n @property()\n error = \"\";\n\n private _stripe: any;\n private _cardElement: any;\n\n async getToken() {\n this.error = \"\";\n\n const { token, error } = await this._stripe.createToken(this._cardElement);\n\n if (error) {\n this.error = error.message;\n this.dispatch(\"change\", { error: this.error });\n throw error;\n }\n\n return token.id;\n }\n\n async connectedCallback() {\n super.connectedCallback();\n\n const Stripe = await loadScript(\"https://js.stripe.com/v3/\", \"Stripe\");\n\n const stripe = (this._stripe = Stripe(this.stripePubKey));\n const elements = stripe.elements({\n fonts: [\n {\n src: `local(\"Nunito Regular\"), local(\"Nunito-Regular\"), url(${Nunito}) format(\"truetype\")`,\n family: \"Nunito\",\n style: \"normal\",\n weight: 400\n }\n ]\n });\n const card = (this._cardElement = elements.create(\"card\", {\n iconStyle: \"solid\",\n hidePostalCode: true,\n style: {\n base: {\n fontFamily: '\"Nunito\", \"Helvetica Neue\", Helvetica, sans-serif',\n fontSmoothing: \"antialiased\",\n fontSize: \"18px\"\n },\n invalid: {\n // color: \"#ff6666\",\n // textShadow: \"none\"\n }\n }\n }));\n const cardElement = document.createElement(\"div\");\n this.appendChild(cardElement);\n card.mount(cardElement);\n card.addEventListener(\"change\", (e: any) => {\n this.error = (e.error && e.error.message) || \"\";\n this.dispatch(\"change\", { error: this.error });\n });\n }\n\n static styles = [\n shared,\n css`\n :host {\n display: block;\n padding: 14px 0 14px 12px;\n border-radius: var(--border-radius);\n background: var(--color-shade-1);\n }\n\n :host(.item) {\n background: var(--color-tertiary);\n border: solid 1px var(--color-shade-1);\n border-bottom-width: 3px;\n margin: var(--gutter-size);\n }\n `\n ];\n\n render() {\n return html`\n \n `;\n }\n}\n","import { unsafeHTML } from \"lit-html/directives/unsafe-html\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { Plan, PlanType } from \"@padloc/core/src/billing\";\nimport { Org } from \"@padloc/core/src/org\";\nimport { mixins } from \"../styles\";\nimport { app } from \"../globals\";\nimport { element, html, property, css } from \"./base\";\nimport { Dialog } from \"./dialog\";\n\n@element(\"pl-choose-plan-dialog\")\nexport class ChoosePlanDialog extends Dialog {\n @property()\n private _plans: Plan[] = [];\n\n @property()\n private _org?: Org;\n\n async show(org?: Org) {\n const result = super.show();\n this._org = org;\n if (!app.state.billingProvider) {\n this.done();\n } else {\n this._plans = app.state.billingProvider.plans\n .filter(p => [PlanType.Family, PlanType.Team, PlanType.Business].includes(p.type))\n .sort((a, b) => a.type - b.type);\n }\n return result;\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n h2 {\n color: var(--color-tertiary);\n margin: 0;\n }\n\n .outer {\n padding: 0;\n }\n\n .inner {\n background: transparent;\n box-shadow: none;\n max-width: 100%;\n width: 100%;\n ${mixins.scroll()}\n scroll-snap-type: x mandatory;\n white-space: nowrap;\n padding: 12px 24px;\n text-align: center;\n display: block;\n }\n\n .plans {\n min-width: 100%;\n display: flex;\n padding: 20px 50px;\n box-sizing: border-box;\n justify-content: center;\n }\n\n .plan {\n flex: 1;\n white-space: normal;\n width: 100%;\n max-width: 330px;\n background: var(--color-tertiary);\n border-radius: var(--border-radius);\n overflow: hidden;\n display: inline-flex;\n flex-direction: column;\n cursor: pointer;\n scroll-snap-align: center;\n text-align: center;\n will-change: transform;\n }\n\n .plan:not(:last-child) {\n margin-right: 12px;\n }\n\n .plan-header {\n text-align: center;\n padding: 20px;\n background: var(--color-highlight);\n color: var(--color-highlight-text);\n display: flex;\n flex-direction: column;\n position: relative;\n }\n\n /*\n .plan-header::before {\n content: \"\";\n ${mixins.fullbleed()}\n background: linear-gradient(rgba(255, 255, 255, 0.2) 0%, rgba(0, 0, 0, 0.2) 100%);\n }\n */\n\n .plan-name {\n font-size: 2rem;\n margin-bottom: 10px;\n font-weight: bold;\n }\n\n .plan-description {\n font-size: 1.1rem;\n }\n\n .plan-trial {\n font-size: 1.5rem;\n margin-top: 8px;\n }\n\n .plan-then {\n font-size: var(--font-size-small);\n margin: 4px 0 -4px 0;\n }\n\n .plan-price {\n letter-spacing: 0.1em;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n font-weight: bold;\n font-size: 1.2rem;\n margin-top: 8px;\n }\n\n .plan-price-currency {\n line-height: 1em;\n margin-top: 0.4em;\n }\n\n .plan-price-dollars {\n font-size: 3em;\n line-height: 1em;\n }\n\n .plan-price-cents {\n font-size: 1.5em;\n line-height: 1em;\n margin-top: 0.2em;\n }\n\n .plan-unit {\n font-size: var(--font-size-small);\n }\n\n .plan-fineprint {\n font-size: var(--font-size-tiny);\n opacity: 0.8;\n }\n\n .features {\n font-size: var(--font-size-small);\n }\n\n .features > * {\n margin: 0;\n padding: 10px 15px;\n border: none;\n border-radius: 0;\n }\n\n .features > :not(:last-child) {\n border-bottom: solid 1px var(--color-shade-1);\n }\n\n .plan button {\n margin: 8px;\n background: var(--color-highlight);\n color: var(--color-highlight-text);\n font-weight: bold;\n }\n\n .tabs {\n color: var(--color-tertiary);\n justify-content: center;\n }\n `\n ];\n\n private _renderPlan(plan: Plan) {\n const monthlyPrice = Math.round(plan.cost / 12);\n\n const trialDaysLeft = this._org && this._org.billing ? this._org.billing.trialDaysLeft : 30;\n\n return html`\n this.done(plan)}\n >\n
    \n
    \n ${plan.name}\n
    \n
    \n ${unsafeHTML(plan.description.replace(/\\*\\*(.+)\\*\\*/g, \"$1\"))}\n
    \n
    \n
    \n ${$l(\"Free For {0} Days\", trialDaysLeft.toString())}\n
    \n
    \n ${$l(\"then\")}\n
    \n
    \n
    \n $\n
    \n
    \n ${Math.floor(monthlyPrice / 100)}\n
    \n
    \n .${(monthlyPrice % 100).toString().padEnd(2, \"0\")}\n
    \n
    \n
    \n ${$l(\"per user / month\")}\n
    \n
    \n
    \n ${$l(\"USD, billed annually\")}\n
    \n
    \n\n
      \n ${plan.features.map(\n feature => html`\n
    • \n ${unsafeHTML(feature.replace(/\\*\\*(.+)\\*\\*/g, \"$1\"))}\n
    • \n `\n )}\n
    \n\n
    \n\n \n \n `;\n }\n //\n // renderBefore() {\n // return html`\n //

    ${$l(\"Choose A Plan\")}

    \n // `;\n // }\n\n renderContent() {\n const plans = this._plans;\n return html`\n ${plans.map(plan => this._renderPlan(plan))}\n `;\n }\n}\n","import { styleMap } from \"lit-html/directives/style-map\";\nimport { VaultItem, Field } from \"@padloc/core/src/item\";\nimport { setClipboard } from \"@padloc/core/src/platform\";\nimport { shared, mixins } from \"../styles\";\nimport { BaseElement, element, html, css, property } from \"./base\";\nimport \"./icon\";\n\n@element(\"pl-clipboard\")\nexport class Clipboard extends BaseElement {\n @property() item: VaultItem | null = null;\n @property() field: Field | null = null;\n @property() private _tMinusClear: number = 0;\n\n private _interval: number;\n private _resolve: (() => void) | null = null;\n\n shouldUpdate() {\n return !!this.item && !!this.field;\n }\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n justify-content: center;\n transition: transform 0.5s cubic-bezier(1, -0.3, 0, 1.3);\n position: fixed;\n left: 70px;\n right: 70px;\n bottom: 15px;\n z-index: 100;\n pointer-events: none;\n }\n\n .inner {\n display: flex;\n align-items: center;\n border-radius: var(--border-radius);\n color: var(--color-background);\n text-shadow: rgba(0, 0, 0, 0.2) 0 1px 0;\n max-width: 100%;\n box-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px;\n ${mixins.gradientHighlight(true)}\n pointer-events: auto;\n }\n\n pl-icon {\n flex: none;\n }\n\n :host(:not(.showing)) {\n transform: translateY(150%);\n }\n\n .content {\n flex: 1;\n padding: 15px;\n }\n\n .name {\n font-weight: bold;\n flex-grow: 1;\n font-size: var(--font-size-tiny);\n line-height: 15px;\n margin: 4px 4px 4px 0;\n text-align: center;\n }\n\n .clear-button {\n padding: 0;\n width: 36px;\n height: 36px;\n margin: 4px;\n line-height: normal;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n border-radius: 100%;\n font-size: 10px;\n flex: none;\n background: transparent;\n position: relative;\n font-weight: bold;\n }\n\n .countdown {\n ${mixins.fullbleed()}\n width: 32px;\n height: 32px;\n margin: auto;\n border-radius: 100%;\n }\n\n .countdown circle {\n transform-origin: center center;\n transform: rotate(-90deg);\n fill: none;\n stroke: currentColor;\n stroke-width: 0.8;\n stroke-dasharray: 25;\n stroke-linecap: round;\n transition: stroke-dashoffset 1s linear;\n }\n\n @supports (-webkit-overflow-scrolling: touch) {\n :host {\n left: 80px;\n right: 80px;\n bottom: calc(env(safe-area-inset-bottom) / 1.5);\n }\n }\n `\n ];\n\n render() {\n const { item, field, _tMinusClear } = this;\n return html`\n
    \n \n\n
    ${item!.name} / ${field!.name}
    \n\n \n
    \n `;\n }\n\n async set(item: VaultItem, field: Field, duration = 60) {\n clearInterval(this._interval);\n\n this.item = item;\n this.field = field;\n\n const value = await field.transform();\n setClipboard(value);\n\n const tStart = Date.now();\n\n this._tMinusClear = duration;\n this._interval = window.setInterval(() => {\n const dt = tStart + duration * 1000 - Date.now();\n if (dt <= 0) {\n this.clear();\n } else {\n this._tMinusClear = Math.floor(dt / 1000);\n }\n }, 1000);\n\n setTimeout(() => this.classList.add(\"showing\"), 10);\n\n return new Promise(resolve => {\n this._resolve = resolve;\n });\n }\n\n clear() {\n clearInterval(this._interval);\n setClipboard(\" \");\n this.classList.remove(\"showing\");\n this._resolve && this._resolve();\n this._resolve = null;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { Org } from \"@padloc/core/src/org\";\nimport { Invite } from \"@padloc/core/src/invite\";\nimport { app } from \"../globals\";\nimport { element, property, html, css, query } from \"./base\";\nimport { Input } from \"./input\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport \"./icon\";\n\n@element(\"pl-create-invites-dialog\")\nexport class CreateInvitesDialog extends Dialog {\n @property()\n private _emails: string[] = [];\n\n @property()\n private _error: string = \"\";\n\n private _org: Org;\n\n private _maxEmails = 50;\n\n @query(\"pl-input\")\n private _emailInput: Input;\n\n @query(\"#submitButton\")\n private _submitButton: LoadingButton;\n\n private _isValid(email: string) {\n return /\\S+@\\S+\\.\\S+/.test(email);\n }\n\n private _input() {\n const emails = this._emailInput.value.split(/[,;\\s]+/);\n this._emails = [...new Set([...this._emails, ...emails.slice(0, -1).filter(e => !!e)])];\n this._emailInput.value = emails[emails.length - 1];\n this.requestUpdate();\n }\n\n private _enter() {\n const emails = this._emailInput.value.split(/[,;\\s]+/);\n this._emails = [...new Set([...this._emails, ...emails.filter(e => !!e)])];\n this._emailInput.value = \"\";\n this.requestUpdate();\n }\n\n private _keydown(e: KeyboardEvent) {\n if (e.key === \"Backspace\" && !this._emailInput.value) {\n this._emails.pop();\n this.requestUpdate();\n }\n }\n\n private _remove(email: string) {\n this._emails = this._emails.filter(e => e !== email);\n }\n\n private async _submit() {\n if (this._submitButton.state === \"loading\") {\n return;\n }\n\n if (!this._emails.length) {\n this._error = $l(\"Please enter at least one email address!\");\n this.rumble();\n return;\n }\n\n if (this._emails.length > this._maxEmails) {\n this._error = $l(\"You have entered too many email addresses! Please delete some before submitting!\");\n this.rumble();\n return;\n }\n\n if (this._emails.some(email => !this._isValid(email))) {\n this._error = $l(\"Some of the emails you entered appear to be invalid!\");\n this.rumble();\n return;\n }\n\n this._error = \"\";\n\n this._submitButton.start();\n\n try {\n const invites = await app.createInvites(this._org, this._emails);\n this._submitButton.success();\n this.done(invites);\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong! Please try again later!\");\n this._submitButton.fail();\n this.rumble();\n }\n }\n\n async show(org: Org) {\n this._org = org;\n this._emails = [];\n this._error = \"\";\n return super.show();\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n :host {\n text-align: center;\n }\n\n .inner {\n background: var(--color-quaternary);\n }\n\n .message {\n font-size: var(--font-size-small);\n margin: 8px 20px;\n }\n\n .tags {\n flex-wrap: wrap;\n margin: 8px;\n padding: 12px 12px 6px 12px;\n justify-content: center;\n position: relative;\n }\n\n .tags > * {\n margin-bottom: 6px;\n }\n\n .tag > pl-icon {\n font-size: var(--font-size-micro);\n margin: 0 -3px 0 0;\n }\n\n pl-input {\n text-align: left;\n background: transparent;\n font-size: var(--font-size-small);\n padding: 4px 8px;\n }\n\n .email-count {\n font-weight: bold;\n position: absolute;\n bottom: 8px;\n right: 8px;\n margin: 0;\n font-size: var(--font-size-tiny);\n }\n\n .email-count[warning] {\n color: var(--color-negative);\n }\n\n .error.item {\n padding: 8px;\n color: var(--color-negative);\n }\n `\n ];\n\n renderContent() {\n return html`\n
    \n
    ${$l(\"Invite New Members\")}
    \n
    \n\n
    \n
    \n ${$l(\n \"Please enter up to {0} email addresses of the persons you would like to invite, separated by spaces or commas!\",\n this._maxEmails.toString()\n )}\n
    \n\n
    this._emailInput.focus()}>\n ${this._emails.map(\n email => html`\n
    \n
    ${email}
    \n this._remove(email)}>\n
    \n `\n )}\n\n \n\n
    this._maxEmails}>\n ${this._emails.length}/${this._maxEmails}\n
    \n
    \n\n
    ${this._error}
    \n
    \n\n
    \n
    \n \n ${$l(\"Submit\")}\n \n \n
    \n
    \n `;\n }\n}\n","import { Vault } from \"@padloc/core/src/vault\";\nimport { VaultItem, Field, ItemTemplate, ITEM_TEMPLATES } from \"@padloc/core/src/item\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { app, router } from \"../globals\";\nimport { alert } from \"../lib/dialog\";\nimport { element, html, css, query, property } from \"./base\";\nimport { Select } from \"./select\";\nimport { Dialog } from \"./dialog\";\n\n@element(\"pl-create-item-dialog\")\nexport class CreateItemDialog extends Dialog {\n @query(\"#vaultSelect\")\n private _vaultSelect: Select;\n\n @property()\n private _template: ItemTemplate = ITEM_TEMPLATES[0];\n\n readonly preventDismiss = true;\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: var(--color-quaternary);\n max-width: 500px;\n }\n\n pl-input,\n pl-select {\n text-align: center;\n }\n\n .templates {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n grid-gap: 8px;\n margin: var(--gutter-size);\n }\n\n .template {\n padding: 4px;\n display: flex;\n align-items: center;\n margin: 0;\n font-weight: 600;\n }\n\n .vault-select,\n .template[active] {\n background: var(--color-primary);\n color: var(--color-tertiary);\n font-weight: bold;\n text-shadow: rgba(0, 0, 0, 0.15) 0 2px 0;\n }\n\n .icon {\n margin-right: 4px;\n }\n\n .message {\n text-align: center;\n margin: 20px;\n }\n `\n ];\n\n renderContent() {\n return html`\n
    \n
    ${$l(\"New Vault Item\")}
    \n
    \n\n
    \n app.hasWritePermissions(v))}\n >\n\n
    \n ${$l(\"What kind of item you would like to add?\")}\n
    \n\n
    \n ${ITEM_TEMPLATES.map(\n template => html`\n (this._template = template)}\n ?active=${this._template === template}\n >\n \n
    ${template.toString()}
    \n
    \n `\n )}\n
    \n \n\n
    \n
    \n \n\n \n
    \n
    \n `;\n }\n\n private async _enter() {\n const vault = this._vaultSelect.selected!;\n const quota = app.getItemsQuota(vault);\n if (quota !== -1 && vault.items.size >= quota) {\n this.done();\n if (app.billingEnabled) {\n this.dispatch(\"get-premium\", {\n message: $l(\n \"You have reached the maximum number of items for this account. \" +\n \"Upgrade to Premium to get unlimited items for your private vault!\"\n ),\n icon: \"list\"\n });\n } else {\n alert($l(\"You have reached the maximum number of items for this account!\"), { type: \"warning\" });\n }\n return;\n }\n\n const item = await app.createItem(\n \"\",\n vault,\n this._template.fields.map(f => new Field({ ...f, value: \"\" }))\n );\n this.done(item);\n\n const params = { ...router.params, edit: \"true\", newitem: \"true\" } as any;\n if (this._template.attachment) {\n params.addattachment = \"true\";\n }\n router.go(`items/${item.id}`, params);\n }\n\n async show(vault: Vault = app.mainVault!) {\n await this.updateComplete;\n this._vaultSelect.selected = vault;\n return super.show();\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { Org } from \"@padloc/core/src/org\";\nimport { Plan, BillingInfo, UpdateBillingParams } from \"@padloc/core/src/billing\";\nimport { dialog } from \"../lib/dialog\";\nimport { app } from \"../globals\";\nimport { element, html, property, css, query } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport \"./card-input\";\nimport { BillingDialog } from \"./billing-dialog\";\nimport { ChoosePlanDialog } from \"./choose-plan-dialog\";\nimport { Input } from \"./input\";\n\n@element(\"pl-create-org-dialog\")\nexport class CreateOrgDialog extends Dialog {\n @property()\n plan: Plan | null = null;\n\n @property()\n quantity: number = 1;\n\n @property()\n private _updateBillingParams: UpdateBillingParams | null = null;\n\n @property()\n private _error = \"\";\n\n @property()\n private _org: Org | null = null;\n\n @query(\"#nameInput\")\n private _nameInput: Input;\n\n @query(\"#quantityInput\")\n private _quantityInput: Input;\n\n @query(\"#submitButton\")\n private _submitButton: LoadingButton;\n\n @dialog(\"pl-billing-dialog\")\n private _billingDialog: BillingDialog;\n\n @dialog(\"pl-choose-plan-dialog\")\n private _choosePlanDialog: ChoosePlanDialog;\n\n async show(plan: Plan | null) {\n this.plan = plan;\n this.quantity = (plan && plan.min) || 1;\n this._updateBillingParams = null;\n this._org = null;\n this._error = \"\";\n return super.show();\n }\n\n private async _submit() {\n if (this._submitButton.state === \"loading\") {\n return;\n }\n\n const name = this._nameInput.value;\n\n if (!name) {\n this._error = $l(\"Please enter an organization name!\");\n return;\n }\n\n this._error = \"\";\n this._submitButton.start();\n\n if (!this._org) {\n try {\n this._org = await app.createOrg(name);\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this._submitButton.fail();\n return;\n }\n }\n\n if (this.plan) {\n const params = this._updateBillingParams || new UpdateBillingParams();\n params.plan = this.plan.id;\n params.members = this.quantity;\n params.org = this._org.id;\n try {\n await app.updateBilling(params);\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this._submitButton.fail();\n return;\n }\n }\n\n const org = (this._org = app.getOrg(this._org.id)!);\n\n // Create first vault and group\n if (org.quota.groups) {\n const everyone = await app.createGroup(org, \"Everyone\", [org.getMember(app.account!)!]);\n await app.createVault(\"Main\", org, [], [{ name: everyone.name, readonly: false }]);\n } else {\n await app.createVault(\"Main\", org, [{ id: app.account!.id, readonly: false }]);\n }\n\n this._submitButton.success();\n this.done(org);\n }\n\n private async _updateQuantity() {\n const quantity = parseInt(this._quantityInput.value);\n const { min, max } = this.plan!;\n if (!isNaN(quantity) && quantity >= min && quantity <= max) {\n this.quantity = quantity;\n }\n }\n\n private async _updateBillingInfo() {\n this.open = false;\n const billingInfo = new BillingInfo();\n billingInfo.address.name = this._nameInput.value;\n const billing = await this._billingDialog.show({\n billingInfo\n });\n\n if (billing) {\n this._updateBillingParams = billing;\n this._error = \"\";\n }\n\n this.open = true;\n }\n\n private async _changePlan() {\n this.open = false;\n const plan = await this._choosePlanDialog.show();\n if (plan) {\n this.plan = plan;\n }\n this.open = true;\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: var(--color-quaternary);\n text-align: center;\n }\n\n .plan {\n text-align: center;\n padding: 20px;\n background: var(--color-highlight);\n color: var(--color-highlight-text);\n display: flex;\n flex-direction: column;\n position: relative;\n }\n\n .plan-name {\n font-size: 1.7rem;\n margin-bottom: 8px;\n font-weight: bold;\n }\n\n .plan-trial {\n font-size: 1.2rem;\n margin-bottom: 8px;\n }\n\n .plan-then {\n font-size: var(--font-size-tiny);\n margin-bottom: 8px;\n }\n\n .plan-price {\n letter-spacing: 0.1em;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n font-weight: bold;\n font-size: 1rem;\n margin: 5px;\n }\n\n .plan-price-currency {\n line-height: 1em;\n margin-top: 0.4em;\n }\n\n .plan-price-dollars {\n font-size: 3em;\n line-height: 1em;\n }\n\n .plan-price-cents {\n font-size: 1.5em;\n line-height: 1em;\n margin-top: 0.2em;\n }\n\n .plan-unit {\n font-size: var(--font-size-small);\n }\n\n .plan-fineprint {\n font-size: var(--font-size-tiny);\n opacity: 0.7;\n margin: 4px 0 -4px 0;\n }\n\n pl-loading-button {\n font-weight: bold;\n }\n\n pl-loading-button.primary {\n margin: 8px;\n background: var(--color-highlight);\n color: var(--color-highlight-text);\n font-weight: bold;\n border-bottom: solid 3px var(--color-shade-2);\n }\n\n .error {\n color: var(--color-negative);\n padding: 8px;\n text-align: center;\n }\n\n .payment-method {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n font-weight: bold;\n }\n\n .quantity-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 8px;\n }\n\n .quantity-label {\n font-weight: bold;\n padding: 12px;\n font-size: 1.2em;\n text-align: left;\n }\n\n .quantity-input {\n width: 60px;\n margin: 0;\n font-weight: bold;\n font-size: 1.5rem;\n }\n\n .quantity-minmax {\n font-size: var(--font-size-micro);\n opacity: 0.5;\n text-align: right;\n padding: 12px;\n }\n\n .edit-plan-icon {\n position: absolute;\n top: 8px;\n right: 8px;\n }\n `\n ];\n\n private _renderBilling(plan: Plan) {\n const monthlyPrice = Math.round((this.quantity * plan.cost) / 12);\n const paymentMethod = this._updateBillingParams && this._updateBillingParams.paymentMethod;\n\n return html`\n
    \n \n\n
    \n ${plan.name}\n
    \n\n
    \n\n
    \n ${$l(\"Free For {0} Days\", (30).toString())}\n
    \n\n
    \n ${$l(\"then\")}\n
    \n\n
    \n
    $
    \n
    \n ${Math.floor(monthlyPrice / 100)}\n
    \n
    \n .${(monthlyPrice % 100).toString().padEnd(2, \"0\")}\n
    \n
    \n\n
    \n ${$l(\"per month\")}\n
    \n\n
    \n (${$l(\"USD, billed annually\")})\n
    \n\n
    \n
    \n\n
    \n
    \n
    ${$l(\"{0} min\", plan.min.toString())}
    \n
    ${$l(\"{0} max\", plan.max.toString())}
    \n
    \n (this._quantityInput.value = this.quantity.toString())}\n >\n
    \n ${$l(\"Seats\")}\n
    \n
    \n\n
    \n \n ${paymentMethod\n ? html`\n
    \n ${paymentMethod.name}\n
    \n `\n : html`\n
    \n ${$l(\"Add Billing Info\")}\n
    \n `}\n
    \n `;\n }\n\n renderContent() {\n const plan = this.plan;\n const color = (plan && plan.color) || \"var(--color-primary)\";\n\n return html`\n
    \n \n
    ${$l(\"Create Organization\")}
    \n \n
    \n\n
    \n \n\n ${plan ? this._renderBilling(plan) : html``}\n\n
    \n ${this._error}\n
    \n\n \n ${$l(\"Create\")}\n \n
    \n `;\n }\n}\n","import { shared, mixins } from \"../styles\";\nimport { animateElement } from \"../lib/animation\";\nimport { BaseElement, element, html, css, property, observe, listen } from \"./base\";\nimport { Input } from \"./input\";\n\n@element(\"pl-dialog\")\nexport class Dialog extends BaseElement {\n static openDialogs = new Set>();\n\n static closeAll() {\n for (const dialog of Dialog.openDialogs) {\n if (!dialog.preventAutoClose) {\n dialog.done();\n }\n }\n }\n\n @property()\n open: boolean = false;\n @property()\n preventDismiss: boolean = false;\n @property()\n preventAutoClose: boolean = false;\n @property()\n dismissOnTapOutside: boolean = true;\n\n readonly hideApp: boolean = false;\n\n isShowing: boolean = false;\n private _hideTimeout?: number;\n private _resolve: ((result?: R) => void) | null;\n\n protected done(result?: R) {\n this._resolve && this._resolve(result);\n this._resolve = null;\n this.open = false;\n Dialog.openDialogs.delete(this);\n }\n\n async show(_input: I = (undefined as any) as I) {\n Dialog.openDialogs.add(this);\n this.open = true;\n\n return new Promise(resolve => {\n this._resolve = resolve;\n });\n }\n\n static styles = [\n shared,\n css`\n :host {\n display: block;\n ${mixins.fullbleed()}\n z-index: 10;\n }\n\n :host(:not([open])) {\n pointer-events: none;\n }\n\n .outer {\n height: 100%;\n display: flex;\n position: relative;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 12px;\n box-sizing: border-box;\n transition: transform 400ms cubic-bezier(0.08, 0.85, 0.3, 1.15) 0s,\n opacity 200ms cubic-bezier(0.6, 0, 0.2, 1) 0s;\n }\n\n .scrim {\n display: block;\n background: #000000;\n opacity: 0;\n transition: opacity 400ms cubic-bezier(0.6, 0, 0.2, 1);\n ${mixins.fullbleed()}\n position: fixed;\n }\n\n :host([open]) .scrim {\n opacity: 0.8;\n }\n\n .inner {\n position: relative;\n width: 100%;\n max-height: 100%;\n box-sizing: border-box;\n max-width: var(--pl-dialog-max-width, 400px);\n z-index: 1;\n border-radius: var(--border-radius);\n box-shadow: rgba(0, 0, 0, 0.25) 0 0 5px;\n overflow: hidden;\n background: var(--color-tertiary);\n display: flex;\n flex-direction: column;\n }\n\n .content {\n flex: 1;\n ${mixins.scroll()}\n }\n\n .footer {\n background: var(--color-tertiary);\n margin: 0;\n border-top: solid 1px var(--color-shade-1);\n }\n\n .actions {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n grid-gap: var(--gutter-size);\n margin: var(--gutter-size);\n }\n\n .actions.vertical {\n grid-template-columns: 1fr;\n }\n\n :host(:not([open])) .outer {\n opacity: 0;\n transform: scale(0.8);\n transition: transform 200ms cubic-bezier(0.6, 0, 0.2, 1), opacity 200ms cubic-bezier(0.6, 0, 0.2, 1);\n }\n\n @supports (-webkit-overflow-scrolling: touch) {\n .outer {\n padding-top: max(env(safe-area-inset-top), 12px);\n padding-bottom: max(env(safe-area-inset-bottom), 12px);\n }\n }\n `\n ];\n\n render() {\n return html`\n
    \n\n
    \n ${this.renderBefore()}\n
    e.stopPropagation()}>\n ${this.renderContent()}\n
    \n ${this.renderAfter()}\n
    \n `;\n }\n\n protected renderBefore() {\n return html`\n \n `;\n }\n\n protected renderContent() {\n return html`\n \n `;\n }\n\n protected renderAfter() {\n return html`\n \n `;\n }\n\n @listen(\"backbutton\", window)\n _back(e: Event) {\n if (this.open) {\n this.dismiss();\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n rumble() {\n animateElement(this.$(\"#inner\"), { animation: \"rumble\", duration: 200, clear: true });\n }\n\n @observe(\"open\")\n _openChanged() {\n clearTimeout(this._hideTimeout);\n\n // Set _display: block_ if we're showing. If we're hiding\n // we need to wait until the transitions have finished before we\n // set _display: none_.\n if (this.open) {\n if (Input.activeInput) {\n Input.activeInput.blur();\n }\n this.style.display = \"\";\n this.offsetLeft;\n this.isShowing = true;\n this.setAttribute(\"open\", \"\");\n } else {\n this.removeAttribute(\"open\");\n this._hideTimeout = window.setTimeout(() => {\n this.style.display = \"none\";\n this.isShowing = false;\n }, 400);\n }\n\n this.dispatch(this.open ? \"dialog-open\" : \"dialog-close\", { dialog: this }, true, true);\n }\n\n private _tappedOutside() {\n if (this.dismissOnTapOutside) {\n this.dismiss();\n }\n }\n\n dismiss() {\n if (!this.preventDismiss) {\n this.dispatch(\"dialog-dismiss\");\n this.done();\n }\n }\n}\n","import { Vault } from \"@padloc/core/src/vault\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { saveFile } from \"@padloc/core/src/platform\";\nimport { stringToBytes } from \"@padloc/core/src/encoding\";\nimport { CSV, PBES2, ImportFormat } from \"../lib/import\";\nimport { supportedFormats, asCSV, asPBES2Container } from \"../lib/export\";\nimport { app } from \"../globals\";\nimport { prompt } from \"../lib/dialog\";\nimport { element, html, css, query } from \"./base\";\nimport { Select } from \"./select\";\nimport { Dialog } from \"./dialog\";\n\n@element(\"pl-export-dialog\")\nexport class ExportDialog extends Dialog {\n @query(\"#formatSelect\")\n private _formatSelect: Select;\n @query(\"#vaultSelect\")\n private _vaultSelect: Select;\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n display: flex;\n flex-direction: column;\n }\n\n pl-input,\n pl-select,\n button {\n text-align: center;\n margin: 0 10px 10px 10px;\n background: var(--shade-2-color);\n border-radius: 8px;\n }\n\n h1 {\n display: block;\n text-align: center;\n }\n\n .csv-note {\n font-size: var(--font-size-micro);\n text-align: center;\n padding: 0px 20px 20px 20px;\n }\n `\n ];\n\n renderContent() {\n return html`\n

    ${$l(\"Export Data\")}

    \n\n this.requestUpdate()}\n >\n \n\n this.requestUpdate()}\n >\n\n
    \n ${$l(\n \"WARNING: Exporting to CSV format will save your data without encyryption of any \" +\n \"kind which means it can be read by anyone. We strongly recommend exporting your data as \" +\n \"a secure, encrypted file, instead!\"\n )}\n
    \n\n \n `;\n }\n\n async show() {\n await this.updateComplete;\n this._formatSelect.selected = PBES2;\n this._vaultSelect.selected = app.mainVault!;\n return super.show();\n }\n\n private async _export() {\n const vault = this._vaultSelect.selected!;\n const items = [...vault.items];\n\n const date = new Date().toISOString().substr(0, 10);\n let data = \"\";\n let fileName = \"\";\n let type = \"text/plain\";\n\n switch (this._formatSelect.selected.format) {\n case CSV.format:\n data = await asCSV(items);\n fileName = `${vault.name.replace(/ /g, \"_\")}_${date}.csv`;\n type = \"text/csv\";\n break;\n\n case PBES2.format:\n this.open = false;\n const password = await prompt($l(\"Please choose a password to protect this backup with!\"), {\n title: $l(\"Choose Password\"),\n type: \"password\",\n placeholder: \"Enter Password\",\n validate: async val => {\n if (!val) {\n throw $l(\"Please choose a password!\");\n }\n return val;\n }\n });\n\n if (!password) {\n this.open = true;\n return;\n }\n\n const repeated = await prompt($l(\"Please repeat the password!\"), {\n title: $l(\"Choose Password\"),\n type: \"password\",\n placeholder: \"Repeat Password\",\n validate: async val => {\n if (val !== password) {\n throw $l(\"Password not repeated correctly!\");\n }\n return val;\n }\n });\n\n if (!repeated) {\n this.open = true;\n return;\n }\n\n data = await asPBES2Container(items, password);\n fileName = `${vault.name.replace(/ /g, \"_\")}_${date}.pbes2`;\n break;\n\n default:\n return;\n }\n saveFile(fileName, type, stringToBytes(data));\n this.done();\n }\n}\n","import { FieldDef, FIELD_DEFS } from \"@padloc/core/src/item\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { element, html, css } from \"./base\";\nimport { Dialog } from \"./dialog\";\n\n@element(\"pl-field-type-dialog\")\nexport class FieldTypeDialog extends Dialog {\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: var(--color-quaternary);\n max-width: 440px;\n }\n\n .field-defs {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n grid-gap: 8px;\n margin: 8px;\n }\n\n .field-def {\n padding: 8px;\n display: flex;\n align-items: center;\n margin: 0;\n font-weight: 600;\n }\n\n .icon {\n margin-right: 4px;\n }\n\n .message {\n text-align: center;\n margin: 20px;\n }\n `\n ];\n\n renderContent() {\n return html`\n
    \n \n
    ${$l(\"Choose A Field Type\")}
    \n \n
    \n\n
    \n
    \n ${$l(\"What kind of field you would like to add?\")}\n
    \n
    \n ${[...Object.values(FIELD_DEFS)].map(\n fieldDef => html`\n
    this.done(fieldDef)}>\n \n
    ${fieldDef.name}
    \n
    \n `\n )}\n
    \n
    \n `;\n }\n}\n","import { FieldType, FIELD_DEFS } from \"@padloc/core/src/item\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { shared } from \"../styles\";\nimport { BaseElement, element, html, css, property, query, observe } from \"./base\";\nimport \"./icon\";\nimport { Input } from \"./input\";\nimport { Textarea } from \"./textarea\";\nimport \"./input\";\nimport \"./textarea\";\nimport \"./totp\";\n\n@element(\"pl-field\")\nexport class FieldElement extends BaseElement {\n @property()\n editing: boolean = false;\n\n @property()\n name: string = \"\";\n\n @property()\n value: string = \"\";\n\n @property()\n type: FieldType = FieldType.Note;\n\n @property()\n private _masked: boolean = false;\n\n @query(\".name-input\")\n private _nameInput: Input;\n\n @query(\".value-input\")\n private _valueInput: Input | Textarea;\n\n private get _fieldDef() {\n return FIELD_DEFS[this.type] || FIELD_DEFS.text;\n }\n\n private get _fieldActions() {\n const actions = [{ icon: \"copy\", action: () => this.dispatch(\"copy-clipboard\") }];\n\n if (this._fieldDef.mask) {\n actions.push({ icon: this._masked ? \"show\" : \"hide\", action: () => (this._masked = !this._masked) });\n }\n\n return actions;\n }\n\n focus() {\n const inputToFocus = this._nameInput.value ? this._valueInput : this._nameInput;\n inputToFocus.focus();\n }\n\n @observe(\"type\")\n _typeChanged() {\n this._masked = this._fieldDef.mask;\n }\n\n @observe(\"editing\")\n _editingChanged() {\n if (!this.editing) {\n this.setAttribute(\"draggable\", \"true\");\n } else {\n this.removeAttribute(\"draggable\");\n }\n }\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n border-radius: 8px;\n min-height: 80px;\n opacity: 0.999;\n }\n\n .field-buttons {\n display: flex;\n flex-direction: column;\n margin: 4px;\n }\n\n .field-buttons.right {\n margin-left: -4px;\n }\n\n .field-buttons.left {\n margin-right: -4px;\n }\n\n :host(:not(:hover)) .field-buttons.right {\n visibility: hidden;\n }\n\n .field-header {\n display: flex;\n margin-bottom: 4px;\n font-size: var(--font-size-tiny);\n font-weight: bold;\n color: var(--color-highlight);\n align-items: center;\n position: relative;\n }\n\n .field-header pl-icon {\n border-radius: 0;\n font-size: 10px;\n width: 10px;\n height: 11px;\n position: absolute;\n left: 8px;\n top: 8px;\n }\n\n .field-value {\n display: flex;\n }\n\n .field-value > :not(:first-child) {\n margin-left: 4px;\n }\n\n .value-input,\n .value-display {\n font-family: var(--font-family-mono);\n font-size: 110%;\n padding: 4px 8px;\n line-height: 1.4em;\n flex: 1;\n width: 0;\n }\n\n .value-display {\n white-space: pre-wrap;\n overflow-wrap: break-word;\n user-select: text;\n cursor: text;\n }\n\n .fields-container {\n margin: 8px;\n width: 0;\n }\n\n .name-input {\n flex: 1;\n min-width: 0;\n padding: 0 10px 0 24px;\n line-height: 30px;\n }\n\n .name-input,\n .value-input {\n height: auto;\n box-sizing: border-box;\n background: none;\n }\n\n .value-input {\n border: dashed 1px var(--color-shade-2);\n }\n\n .name-input[readonly] {\n border: none;\n }\n\n :host([draggable]),\n :host([draggable]) .name-input {\n cursor: grab;\n }\n\n :host([draggable]):active {\n cursor: grabbing;\n }\n\n @supports (-webkit-overflow-scrolling: touch) {\n .field-header pl-icon {\n top: 11px;\n }\n\n .drag-handle {\n display: none;\n }\n }\n `\n ];\n\n private _renderDisplayValue() {\n const format = this._fieldDef.format || ((value: string, _masked: boolean) => value);\n switch (this.type) {\n case \"totp\":\n return html`\n \n `;\n default:\n return html`\n
    ${format(this.value, this._masked)}
    \n `;\n }\n }\n\n private _renderEditValue() {\n switch (this.type) {\n case \"note\":\n return html`\n (this.value = this._valueInput.value)}\n autosize\n .value=${this.value}\n >\n \n `;\n\n case \"totp\":\n return html`\n (this.value = this._valueInput.value)}\n .value=${this.value}\n >\n \n this.dispatch(\"get-totp-qr\")}>\n `;\n case \"password\":\n return html`\n (this.value = this._valueInput.value)}\n .value=${this.value}\n >\n \n this.dispatch(\"generate\")}>\n `;\n\n default:\n let inputType: string;\n switch (this.type) {\n case \"email\":\n case \"url\":\n case \"date\":\n case \"month\":\n inputType = this.type;\n break;\n case \"pin\":\n case \"credit\":\n inputType = \"number\";\n break;\n case \"phone\":\n inputType = \"tel\";\n break;\n default:\n inputType = \"text\";\n }\n return html`\n (this.value = this._valueInput.value)}\n .value=${this.value}\n >\n \n `;\n }\n }\n\n render() {\n return html`\n
    \n this.setAttribute(\"draggable\", \"true\")}\n @mouseout=${() => this.removeAttribute(\"draggable\")}\n >\n \n\n this.dispatch(\"remove\")}> \n
    \n\n
    \n
    \n \n\n (this.name = this._nameInput.value)}\n ?readonly=${!this.editing}\n >\n \n
    \n\n
    \n ${this.editing ? this._renderEditValue() : this._renderDisplayValue()}\n
    \n
    \n\n
    \n ${this._fieldActions.map(\n ({ icon, action }) => html`\n \n `\n )}\n
    \n `;\n }\n}\n","import { randomString, chars } from \"@padloc/core/src/util\";\nimport { generatePassphrase, AVAILABLE_LANGUAGES } from \"@padloc/core/src/diceware\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { animateElement } from \"../lib/animation\";\nimport { app } from \"../globals\";\nimport { html, css, property, query, listen } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { Slider } from \"./slider\";\nimport { ToggleButton } from \"./toggle-button\";\nimport { Select } from \"./select\";\nimport \"./icon\";\n\nexport type GeneratorMode = \"words\" | \"chars\";\n\ninterface SeparatorOption {\n value: string;\n toString(): string;\n}\n\nconst separators = [\n {\n value: \"-\",\n toString: () => $l(\"Dash\") + \" ( - )\"\n },\n {\n value: \"_\",\n toString: () => $l(\"Underscore\") + \" ( _ )\"\n },\n {\n value: \"/\",\n toString: () => $l(\"Slash\") + \" ( / )\"\n },\n {\n value: \" \",\n toString: () => $l(\"Space\") + \" ( )\"\n }\n];\n\nexport class Generator extends Dialog {\n @property()\n value: string = \"\";\n\n @property()\n mode: GeneratorMode = \"words\";\n\n @query(\"#separator\")\n private _separator: Select;\n @query(\"#language\")\n private _language: Select<{ value: string }>;\n @query(\"#wordCount\")\n private _wordCount: Slider;\n\n @query(\"#lower\")\n private _lower: ToggleButton;\n @query(\"#upper\")\n private _upper: ToggleButton;\n @query(\"#numbers\")\n private _numbers: ToggleButton;\n @query(\"#other\")\n private _other: ToggleButton;\n @query(\"#length\")\n private _length: Slider;\n\n @query(\".result\")\n private _result: HTMLDivElement;\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: var(--color-quaternary);\n display: flex;\n flex-direction: column;\n }\n\n .header {\n background: var(--color-tertiary);\n text-align: center;\n font-weight: bold;\n }\n\n .header-title {\n font-size: 120%;\n padding: 20px 20px 10px 20px;\n }\n\n .charsets {\n display: flex;\n }\n\n .charsets > * {\n flex: 1;\n }\n\n pl-toggle-button {\n display: block;\n border-bottom: solid 1px rgba(0, 0, 0, 0.1);\n }\n\n pl-slider {\n display: flex;\n height: var(--row-height);\n border-bottom: solid 1px rgba(0, 0, 0, 0.1);\n }\n\n .controls > pl-select {\n margin-top: calc(2 * var(--gutter-size));\n }\n\n .result {\n font-family: var(--font-family-mono);\n text-align: center;\n font-size: 120%;\n overflow-wrap: break-word;\n font-weight: bold;\n padding: 20px;\n margin: var(--gutter-size);\n cursor: pointer;\n }\n\n .result > .hint {\n margin: 8px 0 -12px 0;\n font-size: var(--font-size-micro);\n color: var(--color-shade-3);\n }\n\n .arrow {\n display: block;\n margin: -10px auto;\n font-size: 120%;\n }\n `\n ];\n\n renderContent() {\n const { value } = this;\n return html`\n
    \n
    ${$l(\"Generate Password\")}
    \n
    \n this._selectMode(\"words\")}\n >\n ${$l(\"passphrase\")}\n
    \n this._selectMode(\"chars\")}\n >\n ${$l(\"random string\")}\n
    \n \n \n\n
    \n
    \n \n\n \n\n \n
    \n\n
    \n \n\n \n\n \n\n \n\n \n
    \n\n \n\n
    this._generate()}>\n
    \n ${value}\n
    \n\n
    \n ${$l(\"Click To Shuffle\")}\n
    \n
    \n
    \n\n
    \n
    \n \n \n
    \n
    \n `;\n }\n\n firstUpdated() {\n this._lower.active = this._upper.active = this._numbers.active = true;\n }\n\n async show(): Promise {\n await this.updateComplete;\n this._generate();\n return super.show();\n }\n\n @listen(\"change\")\n async _generate() {\n const separator = (this._separator && this._separator.selected && this._separator.selected.value) || \"-\";\n const language =\n (this._language && this._language.selected && this._language.selected.value) || app.state.device.locale;\n\n switch (this.mode) {\n case \"words\":\n this.value = await generatePassphrase(this._wordCount.value, separator, [language]);\n break;\n case \"chars\":\n let charSet = \"\";\n this._lower.active && (charSet += chars.lower);\n this._upper.active && (charSet += chars.upper);\n this._numbers.active && (charSet += chars.numbers);\n this._other.active && (charSet += chars.other);\n this.value = charSet ? await randomString(this._length.value, charSet) : \"\";\n break;\n }\n\n animateElement(this._result, { animation: \"bounce\" });\n }\n\n private _confirm() {\n this.done(this.value);\n }\n\n private _selectMode(mode: GeneratorMode) {\n this.mode = mode;\n this._generate();\n }\n}\n\nwindow.customElements.define(\"pl-generator\", Generator);\n","import { Org, OrgMember, Group } from \"@padloc/core/src/org\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { app } from \"../globals\";\nimport { prompt } from \"../lib/dialog\";\nimport { element, html, css, property, query } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport { Input } from \"./input\";\nimport \"./toggle-button\";\nimport \"./member-item\";\n\ntype InputType = { group: Group | null; org: Org };\n\n@element(\"pl-group-dialog\")\nexport class GroupDialog extends Dialog {\n @property()\n group: Group | null = null;\n\n @property()\n org: Org | null = null;\n\n @query(\"#saveButton\")\n private _saveButton: LoadingButton;\n\n @query(\"#nameInput\")\n private _nameInput: Input;\n\n @query(\"#filterMembersInput\")\n private _filterMembersInput: Input;\n\n @property()\n private _membersFilter: string = \"\";\n\n @property()\n private _error: string = \"\";\n\n private _members = new Set();\n\n private _getCurrentMembers(): Set {\n const members = new Set();\n\n if (!this.group || !this.org) {\n return members;\n }\n\n for (const member of this.org.getMembersForGroup(this.group!)) {\n members.add(member.id);\n }\n\n return members;\n }\n\n private get _hasChanged() {\n if (!this._nameInput) {\n return false;\n }\n const currentMembers = this._getCurrentMembers();\n const membersChanged =\n this._members.size !== currentMembers.size ||\n [...this._members.values()].some(group => !currentMembers.has(group));\n\n const nameChanged = this.group ? this.group.name !== this._nameInput.value : !!this._nameInput.value;\n\n return this._members.size && this._nameInput.value && (membersChanged || nameChanged);\n }\n\n async show({ org, group }: InputType): Promise {\n this.org = org;\n this.group = group;\n this._members = this._getCurrentMembers();\n this._error = \"\";\n await this.updateComplete;\n this._nameInput.value = group ? group.name : \"\";\n this._clearMembersFilter();\n if (group) {\n setTimeout(() => this._nameInput.focus(), 100);\n }\n await super.show();\n }\n\n _toggleMember(member: OrgMember) {\n if (this._members.has(member.id)) {\n this._members.delete(member.id);\n } else {\n this._members.add(member.id);\n }\n\n this.requestUpdate();\n }\n\n private async _save() {\n if (this._saveButton.state === \"loading\") {\n return;\n }\n\n this._error = \"\";\n this._saveButton.start();\n\n try {\n const org = this.org!;\n const members = [...this._members.values()].map(id => org.getMember({ id })!);\n\n if (this.group) {\n await app.updateGroup(org, this.group, members, this._nameInput.value);\n } else {\n await app.createGroup(org, this._nameInput.value, members);\n }\n\n this._saveButton.success();\n this.done();\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this._saveButton.fail();\n throw e;\n }\n }\n\n private async _deleteGroup() {\n this.open = false;\n\n const deleted = await prompt($l(\"Are you sure you want to delete this group?\"), {\n type: \"destructive\",\n title: $l(\"Delete Group\"),\n placeholder: $l(\"Type 'DELETE' to confirm\"),\n confirmLabel: $l(\"Delete\"),\n validate: async val => {\n if (val !== \"DELETE\") {\n throw $l(\"Type 'DELETE' to confirm\");\n }\n\n await app.updateOrg(this.org!.id, async org => {\n org.groups = org.groups.filter(group => group.name !== this.group!.name);\n });\n\n return val;\n }\n });\n\n if (deleted) {\n this.done();\n } else {\n this.open = true;\n }\n }\n\n private _updateMembersFilter() {\n this._membersFilter = this._filterMembersInput.value;\n }\n\n private _clearMembersFilter() {\n this._membersFilter = this._filterMembersInput.value = \"\";\n }\n\n shouldUpdate() {\n return !!this.org;\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: var(--color-quaternary);\n }\n\n pl-toggle-button {\n display: block;\n padding: 0 15px 0 0;\n }\n\n .delete-button {\n color: var(--color-negative);\n font-size: var(--font-size-default);\n }\n `\n ];\n\n renderContent() {\n const org = this.org!;\n const memFilter = this._membersFilter.toLowerCase();\n const members = memFilter\n ? org.members.filter(\n ({ name, email }) => email.toLowerCase().includes(memFilter) || name.toLowerCase().includes(memFilter)\n )\n : org.members;\n // members.sort((a, b) => this._members.has(a.id) - this._members.has(b.id));\n const canEdit = org.isAdmin(app.account!);\n const canDelete = this.group && canEdit;\n\n return html`\n
    \n \n this.requestUpdate()}\n >\n \n
    \n\n
    \n
    \n \n \n \n
    \n\n ${members.map(\n member => html`\n this._toggleMember(member)}\n .active=${this._members.has(member.id)}\n ?disabled=${!canEdit}\n >\n \n \n `\n )}\n\n
    \n ${this._error}\n
    \n
    \n\n
    \n
    \n \n ${this.group ? $l(\"Save\") : $l(\"Create Group\")}\n \n\n \n
    \n
    \n `;\n }\n}\n","import { Group } from \"@padloc/core/src/org\";\nimport { shared } from \"../styles\";\nimport { BaseElement, element, html, css, property } from \"./base\";\nimport \"./icon\";\n\n@element(\"pl-group-item\")\nexport class GroupItem extends BaseElement {\n @property()\n group: Group;\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n align-items: center;\n padding: 4px 0;\n }\n\n .icon {\n font-size: 120%;\n margin: 8px;\n background: #eee;\n border: solid 1px #ddd;\n width: 45px;\n height: 45px;\n }\n\n .tags {\n margin: 4px 0;\n }\n\n .group-name {\n font-weight: bold;\n margin-bottom: 4px;\n }\n\n .group-info {\n flex: 1;\n width: 0;\n }\n `\n ];\n\n render() {\n return html`\n \n\n
    \n
    ${this.group.name}
    \n\n
    \n
    \n \n\n
    ${this.group.members.length}
    \n
    \n\n
    \n \n\n
    ${this.group.vaults.length}
    \n
    \n
    \n
    \n `;\n }\n}\n","import { BaseElement, element, html, css, property } from \"./base\";\n\n@element(\"pl-icon\")\nexport class PlIcon extends BaseElement {\n @property({ reflect: true })\n icon: string = \"\";\n\n static styles = [\n css`\n :host {\n display: inline-block;\n text-align: center;\n font-family: \"FontAwesome\";\n color: inherit;\n font-size: inherit;\n position: relative;\n height: 40px;\n width: 40px;\n font-weight: normal !important;\n border-radius: 100%;\n overflow: hidden;\n }\n\n div {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n margin: auto;\n height: 0;\n line-height: 0;\n }\n\n :host([icon=\"add\"]) > div::before {\n content: \"\\\\f067\";\n }\n\n :host([icon=\"menu\"]) > div::before {\n content: \"\\\\f0c9\";\n }\n\n :host([icon=\"close\"]) > div::before {\n content: \"\\\\f00d\";\n }\n\n :host([icon=\"more\"]) > div::before {\n content: \"\\\\f141\";\n }\n\n :host([icon=\"delete\"]) > div::before {\n content: \"\\\\f2ed\";\n }\n\n :host([icon=\"copy\"]) > div::before {\n /* content: \"\\\\f24d\"; */\n content: \"\\\\f0c5\";\n }\n\n :host([icon=\"edit\"]) > div::before {\n content: \"\\\\f303\";\n }\n\n :host([icon=\"forward\"]) > div::before {\n content: \"\\\\f054\";\n }\n\n :host([icon=\"backward\"]) > div::before {\n content: \"\\\\f053\";\n }\n\n :host([icon=\"check\"]) > div::before {\n content: \"\\\\f00c\";\n }\n\n :host([icon=\"cancel\"]) > div::before {\n content: \"\\\\f00d\";\n }\n\n :host([icon=\"generate\"]) > div::before {\n content: \"\\\\f522\";\n }\n\n :host([icon=\"tag\"]) > div::before {\n content: \"\\\\f02b\";\n }\n\n :host([icon=\"tags\"]) > div::before {\n content: \"\\\\f02c\";\n }\n\n :host([icon=\"dropdown\"]) > div::before {\n content: \"\\\\f0d7\";\n }\n\n :host([icon=\"dropup\"]) > div::before {\n content: \"\\\\f0d8\";\n }\n\n :host([icon=\"settings\"]) > div::before {\n content: \"\\\\f013\";\n }\n\n :host([icon=\"cloud\"]) > div::before {\n content: \"\\\\f0c2\";\n }\n\n :host([icon=\"lock\"]) > div::before {\n content: \"\\\\f023\";\n }\n\n :host([icon=\"refresh\"]) > div::before {\n content: \"\\\\f2f1\";\n }\n\n :host([icon=\"unlock\"]) > div::before {\n content: \"\\\\f13e\";\n }\n\n :host([icon=\"export\"]) > div::before {\n content: \"\\\\f093\";\n }\n\n :host([icon=\"import\"]) > div::before {\n content: \"\\\\f019\";\n }\n\n :host([icon=\"search\"]) > div::before {\n content: \"\\\\f002\";\n }\n\n :host([icon=\"info\"]) > div::before {\n content: \"\\\\f129\";\n }\n\n :host([icon=\"info-round\"]) > div::before {\n content: \"\\\\f05a\";\n }\n\n :host([icon=\"download\"]) > div::before {\n content: \"\\\\f019\";\n }\n\n :host([icon=\"upload\"]) > div::before {\n content: \"\\\\f093\";\n }\n\n :host([icon=\"show\"]) > div::before {\n content: \"\\\\f06e\";\n }\n\n :host([icon=\"hide\"]) > div::before {\n content: \"\\\\f070\";\n }\n\n :host([icon=\"checked\"]) > div::before {\n content: \"\\\\f14a\";\n }\n\n :host([icon=\"checkall\"]) > div::before {\n content: \"\\\\f560\";\n }\n\n :host([icon=\"success\"]) > div::before {\n content: \"\\\\f058\";\n }\n\n :host([icon=\"unchecked\"]) > div::before {\n content: \"\\\\f146\";\n }\n\n :host([icon=\"share\"]) > div::before {\n content: \"\\\\f045\";\n }\n\n :host([icon=\"logout\"]) > div::before {\n content: \"\\\\f2f5\";\n }\n\n :host([icon=\"mail\"]) > div::before {\n content: \"\\\\f0e0\";\n }\n\n :host([icon=\"user\"]) > div::before {\n content: \"\\\\f007\";\n }\n\n :host([icon=\"record\"]) > div::before {\n content: \"\\\\f15b\";\n }\n\n :host([icon=\"mobile\"]) > div::before {\n content: \"\\\\f10b\";\n font-size: 140%;\n }\n\n :host([icon=\"database\"]) > div::before {\n content: \"\\\\f1c0\";\n }\n\n :host([icon=\"time\"]) > div::before {\n content: \"\\\\f017\";\n }\n\n :host([icon=\"error\"]) > div::before {\n content: \"\\\\f071\";\n }\n\n :host([icon=\"question\"]) > div::before {\n content: \"\\\\f059\";\n }\n\n :host([icon=\"desktop\"]) > div::before {\n content: \"\\\\f109\";\n }\n\n :host([icon=\"group\"]) > div::before {\n content: \"\\\\f509\";\n }\n\n :host([icon=\"members\"]) > div::before {\n content: \"\\\\f0c0\";\n }\n\n :host([icon=\"vaults\"]) > div::before {\n content: \"\\\\f1b3\";\n }\n\n :host([icon=\"vault\"]) > div::before {\n content: \"\\\\f1b2\";\n }\n\n :host([icon=\"share\"]) > div::before {\n content: \"\\\\f064\";\n }\n\n :host([icon=\"invite\"]) > div::before {\n content: \"\\\\f234\";\n }\n\n :host([icon=\"trusted\"]) > div::before {\n content: \"\\\\f4fc\";\n }\n\n :host([icon=\"removeuser\"]) > div::before {\n content: \"\\\\f506\";\n }\n\n :host([icon=\"org\"]) > div::before {\n content: \"\\\\f0c0\";\n }\n\n // :host([icon=\"logo\"]) > div::before {\n // content: \"\\\\f447\";\n // }\n\n :host([icon=\"list\"]) > div::before {\n content: \"\\\\f550\";\n }\n\n :host([icon=\"remove\"]) > div::before {\n content: \"\\\\f056\";\n }\n\n :host([icon=\"password\"]) > div::before {\n content: \"\\\\f069\";\n }\n\n :host([icon=\"admins\"]) > div::before {\n content: \"\\\\f509\";\n }\n\n :host([icon=\"archive\"]) > div::before {\n content: \"\\\\f187\";\n }\n\n :host([icon=\"attachment\"]) > div::before {\n content: \"\\\\f0c6\";\n }\n\n :host([icon=\"file\"]) > div::before {\n content: \"\\\\f15b\";\n }\n\n :host([icon=\"file-video\"]) > div::before {\n content: \"\\\\f1c8\";\n }\n\n :host([icon=\"file-pdf\"]) > div::before {\n content: \"\\\\f1c1\";\n }\n\n :host([icon=\"file-image\"]) > div::before {\n content: \"\\\\f1c5\";\n }\n\n :host([icon=\"file-csv\"]) > div::before {\n content: \"\\\\f6dd\";\n }\n\n :host([icon=\"file-code\"]) > div::before {\n content: \"\\\\f1c9\";\n }\n\n :host([icon=\"file-archive\"]) > div::before {\n content: \"\\\\f1c6\";\n }\n\n :host([icon=\"file-audio\"]) > div::before {\n content: \"\\\\f1c7\";\n }\n\n :host([icon=\"file-text\"]) > div::before {\n content: \"\\\\f15c\";\n }\n\n :host([icon=\"file-certificate\"]) > div::before {\n content: \"\\\\f56c\";\n }\n\n :host([icon=\"arrow-down\"]) > div::before {\n content: \"\\\\f309\";\n }\n\n :host([icon=\"favorite\"]) > div::before {\n content: \"\\\\f005\";\n }\n\n :host([icon=\"qrcode\"]) > div::before {\n content: \"\\\\f029\";\n }\n\n :host([icon=\"credit\"]) > div::before {\n content: \"\\\\f09d\";\n }\n\n :host([icon=\"address\"]) > div::before {\n content: \"\\\\f2bb\";\n }\n\n :host([icon=\"discount\"]) > div::before {\n content: \"\\\\f295\";\n }\n\n :host([icon=\"dollar\"]) > div::before {\n content: \"\\\\f155\";\n }\n\n :host([icon=\"storage\"]) > div::before {\n content: \"\\\\f49e\";\n }\n\n :host([icon=\"hirarchy\"]) > div::before {\n content: \"\\\\f0e8\";\n }\n\n :host([icon=\"web\"]) > div::before {\n content: \"\\\\f57d\";\n }\n\n :host([icon=\"bank\"]) > div::before {\n content: \"\\\\f53d\";\n }\n\n :host([icon=\"login\"]) > div::before {\n content: \"\\\\f2f6\";\n }\n\n :host([icon=\"sim\"]) > div::before {\n content: \"\\\\f7c4\";\n }\n\n :host([icon=\"wifi\"]) > div::before {\n content: \"\\\\f1eb\";\n }\n\n :host([icon=\"passport\"]) > div::before {\n content: \"\\\\f5ab\";\n }\n\n :host([icon=\"note\"]) > div::before {\n content: \"\\\\f036\";\n }\n\n :host([icon=\"custom\"]) > div::before {\n content: \"\\\\f249\";\n }\n\n :host([icon=\"email\"]) > div::before {\n content: \"\\\\f1fa\";\n }\n\n :host([icon=\"fingerprint\"]) > div::before {\n content: \"\\\\f577\";\n }\n\n :host([icon=\"totp\"]) > div::before {\n content: \"\\\\f1da\";\n }\n\n :host([icon=\"month\"]) > div::before {\n content: \"\\\\f133\";\n }\n\n :host([icon=\"date\"]) > div::before {\n content: \"\\\\f073\";\n }\n\n :host([icon=\"phone\"]) > div::before {\n content: \"\\\\f095\";\n }\n\n :host([icon=\"text\"]) > div::before {\n content: \"\\\\f031\";\n }\n\n :host([icon=\"clipboard\"]) > div::before {\n content: \"\\\\f328\";\n }\n\n :host([icon=\"logo\"]) > div::before {\n font-family: \"Padlock\";\n content: \"\\\\0041\";\n font-size: 110%;\n }\n `\n ];\n\n render() {\n return html`\n
    \n `;\n }\n}\n","import { Vault } from \"@padloc/core/src/vault\";\nimport { VaultItem } from \"@padloc/core/src/item\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport * as imp from \"../lib/import\";\nimport { prompt, alert } from \"../lib/dialog\";\nimport { app } from \"../globals\";\nimport { element, html, css, query, property } from \"./base\";\nimport { Select } from \"./select\";\nimport { Dialog } from \"./dialog\";\n\n@element(\"pl-import-dialog\")\nexport class ImportDialog extends Dialog {\n @property()\n private _rawData: string = \"\";\n\n @property()\n private _items: VaultItem[] = [];\n\n @query(\"#formatSelect\")\n private _formatSelect: Select;\n @query(\"#vaultSelect\")\n private _vaultSelect: Select;\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n display: flex;\n flex-direction: column;\n }\n\n pl-input,\n pl-select,\n button {\n text-align: center;\n margin: 0 10px 10px 10px;\n background: var(--shade-2-color);\n border-radius: 8px;\n }\n\n h1 {\n display: block;\n text-align: center;\n }\n\n .csv-note {\n font-size: var(--font-size-micro);\n text-align: center;\n padding: 0px 20px 20px 20px;\n }\n `\n ];\n\n renderContent() {\n return html`\n

    ${$l(\"Import Data\")}

    \n\n \n\n
    \n ${$l(\n \"IMPORTANT: Before importing, please make sure that your CSV data \" +\n \"is structured according to Padlocks specific requirements!\"\n )}\n ${$l(\"Learn More\")}\n
    \n\n \n\n \n `;\n }\n\n async show(input: string) {\n await this.updateComplete;\n const result = super.show();\n this._rawData = input;\n this._formatSelect.selected = imp.guessFormat(input) || imp.CSV;\n this._parseString();\n this._vaultSelect.selected = app.mainVault!;\n return result;\n }\n\n private async _parseString(): Promise {\n const rawStr = this._rawData;\n\n switch (this._formatSelect.selected!.format) {\n case imp.PADLOCK_LEGACY.format:\n this.open = false;\n const pwd = await prompt($l(\"This file is protected by a password.\"), {\n title: $l(\"Enter Password\"),\n placeholder: $l(\"Enter Password\"),\n type: \"password\",\n validate: async (pwd: string) => {\n try {\n this._items = await imp.asPadlockLegacy(rawStr, pwd);\n } catch (e) {\n throw $l(\"Wrong Password\");\n }\n return pwd;\n }\n });\n this.open = true;\n\n if (pwd === null) {\n this.done();\n }\n break;\n case imp.LASTPASS.format:\n this._items = await imp.asLastPass(rawStr);\n break;\n case imp.CSV.format:\n this._items = await imp.asCSV(rawStr);\n break;\n case imp.PBES2.format:\n this.open = false;\n const pwd2 = await prompt($l(\"This file is protected by a password.\"), {\n title: $l(\"Enter Password\"),\n placeholder: $l(\"Enter Password\"),\n type: \"password\",\n validate: async (pwd: string) => {\n try {\n this._items = await imp.asPBES2Container(rawStr, pwd);\n } catch (e) {\n throw $l(\"Wrong Password\");\n }\n return pwd;\n }\n });\n this.open = true;\n\n if (pwd2 === null) {\n this.done();\n }\n break;\n default:\n this._items = [];\n }\n }\n\n private async _import() {\n const vault = this._vaultSelect.selected!;\n const quota = app.getItemsQuota(vault);\n\n if (quota !== -1 && vault.items.size + this._items.length > quota) {\n this.done();\n if (app.billingEnabled) {\n this.dispatch(\"get-premium\", {\n message: $l(\n \"The number of imported items exceeds your remaining quota. \" +\n \"Upgrade to Premium to get unlimited items for your private vault!\"\n ),\n icon: \"list\"\n });\n } else {\n alert($l(\"The number of imported items exceeds your remaining quota.\"), { type: \"warning\" });\n }\n return;\n }\n\n app.addItems(this._items, vault);\n // this.dispatch(\"data-imported\", { items: items });\n this.done();\n alert($l(\"Successfully imported {0} items.\", this._items.length.toString()), { type: \"success\" });\n }\n}\n","import { element, html, listen, property } from \"./base\";\nimport { BaseInput } from \"./base-input\";\n\n@element(\"pl-input\")\nexport class Input extends BaseInput {\n @property()\n type: string = \"\";\n\n @property()\n pattern: string = \"\";\n\n get validationMessage() {\n return this._inputElement.validationMessage;\n }\n\n @listen(\"keydown\")\n _keydown(e: KeyboardEvent) {\n if (e.key === \"Enter\") {\n this.checkValidity();\n this.dispatch(\"enter\");\n e.preventDefault();\n e.stopPropagation();\n } else if (e.key === \"Escape\") {\n this.dispatch(\"escape\");\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n _renderInput() {\n const { placeholder, readonly, noTab, disabled, autocapitalize, required, type, pattern } = this;\n\n return html`\n \n `;\n }\n\n checkValidity() {\n return this._inputElement && this._inputElement.checkValidity();\n }\n\n reportValidity() {\n return this._inputElement && this._inputElement.reportValidity();\n }\n}\n","import { until } from \"lit-html/directives/until\";\nimport { Invite } from \"@padloc/core/src/invite\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { formatDateFromNow } from \"../lib/util\";\nimport { app, router } from \"../globals\";\nimport { alert, dialog } from \"../lib/dialog\";\nimport { element, html, css, property, query } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport { Input } from \"./input\";\nimport { MemberDialog } from \"./member-dialog\";\n\n@element(\"pl-invite-dialog\")\nexport class InviteDialog extends Dialog {\n @property()\n invite: Invite | null = null;\n\n @query(\"#acceptButton\")\n private _acceptButton: LoadingButton;\n @query(\"#resendButton\")\n private _resendButton: LoadingButton;\n @query(\"#deleteButton\")\n private _deleteButton: LoadingButton;\n @query(\"#confirmButton\")\n private _confirmButton: LoadingButton;\n @query(\"#codeInput\")\n private _codeInput: Input;\n\n @dialog(\"pl-member-dialog\")\n private _memberDialog: MemberDialog;\n\n @property()\n private _error: string = \"\";\n\n private _pollInterval = 5000;\n\n private get _enableActions(): boolean {\n return !!this.invite && !this.invite.expired && !this.invite.accepted;\n }\n\n async show(invite: Invite): Promise {\n this._error = \"\";\n this.invite = invite;\n setTimeout(() => this._refresh(), this._pollInterval);\n return super.show();\n }\n\n dismiss() {\n super.dismiss();\n router.go(`orgs/${this.invite!.org!.id}`);\n }\n\n private async _refresh() {\n if (!this.invite || !this.open || this.invite.accepted) {\n return;\n }\n\n const invite = await app.getInvite(this.invite.org!.id, this.invite.id);\n if (invite) {\n invite.secret = this.invite.secret;\n invite.expires = this.invite.expires;\n this.invite = invite;\n }\n setTimeout(() => this._refresh(), this._pollInterval);\n }\n\n shouldUpdate() {\n return !!this.invite;\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n :host {\n text-align: center;\n }\n\n .invite-text {\n font-size: var(--font-size-small);\n margin: 20px;\n }\n\n .invite-text.small {\n font-size: var(--font-size-tiny);\n }\n\n .invite-text.error {\n color: var(--color-error);\n text-shadow: none;\n font-weight: bold;\n }\n\n .invite-email {\n font-size: 120%;\n margin: 15px;\n font-weight: bold;\n }\n\n .invite-code {\n font-size: 200%;\n font-family: var(--font-family-mono);\n text-transform: uppercase;\n margin: 20px;\n letter-spacing: 5px;\n font-weight: bold;\n user-select: text;\n cursor: text;\n }\n\n .tags {\n justify-content: center;\n overflow: visible;\n margin: 20px 0;\n }\n\n .tag.org {\n font-size: var(--font-size-small);\n padding: 4px 16px;\n }\n\n .code-input {\n border-radius: 8px;\n margin: 15px;\n }\n `\n ];\n\n renderContent() {\n const { email, expires, expired, org, accepted, purpose } = this.invite!;\n const forMe = email === app.account!.email;\n\n const status = expired\n ? { icon: \"time\", class: \"warning\", text: $l(\"This invite has expired\") }\n : accepted\n ? { icon: \"check\", class: \"\", text: $l(\"Accepted\") }\n : {\n icon: \"time\",\n class: \"\",\n text: until(\n (async () => {\n return $l(\"expires {0}\", await formatDateFromNow(expires));\n })()\n )\n };\n\n return html`\n
    \n \n\n
    \n ${purpose === \"confirm_membership\" ? $l(\"Confirm Membership\") : $l(\"Organization Invite\")}\n
    \n\n this.dismiss()}>\n
    \n\n
    \n
    \n
    \n \n\n
    ${org!.name}
    \n
    \n
    \n\n ${forMe ? this._inviteeBody() : this._adminBody()}\n\n
    \n
    \n \n\n
    ${status.text}
    \n
    \n
    \n\n
    \n ${$l(\n \"Please wait for an admin to complete the process. \" +\n \"You will be notified as soon as you receive access.\"\n )}\n
    \n\n
    \n ${this._error}\n
    \n\n
    \n ${forMe ? this._inviteeActions() : this._adminActions()}\n
    \n
    \n `;\n }\n\n private _inviteeBody() {\n const { org, purpose } = this.invite!;\n const { _enableActions } = this;\n return html`\n
    \n ${$l(\n purpose === \"confirm_membership\"\n ? \"Please confirm your membership for the {0} organization.\"\n : \"You've been invited to join the {0} organization.\",\n org!.name\n )}\n
    \n\n this._accept()}\n label=\"${$l(\"Enter Confirmation Code\")}\"\n >\n \n\n
    \n ${$l(\n \"If you haven't received the confirmation code yet, please ask the organization owner \" +\n \"to provide it to you!\"\n )}\n
    \n `;\n }\n\n _inviteeActions() {\n return html`\n this._accept()}\n >\n ${$l(this.invite!.purpose === \"confirm_membership\" ? \"Confirm\" : \"Accept\")}\n \n `;\n }\n\n _adminBody() {\n const { _enableActions } = this;\n const { email, secret, purpose } = this.invite!;\n return html`\n
    \n ${$l(\n purpose === \"confirm_membership\"\n ? \"A membership confirmation request was sent to:\"\n : \"An invite was sent to:\"\n )}\n
    \n\n
    ${email}
    \n\n
    \n ${$l(\n \"They will also need the following confirmation code, which \" +\n \"you should communicate to them separately:\"\n )}\n
    \n\n
    ${secret}
    \n `;\n }\n\n _adminActions() {\n const { accepted, expired, purpose } = this.invite!;\n return html`\n this._confirm()}\n >\n \n\n
    ${$l(purpose === \"confirm_membership\" ? \"Confirm\" : \"Add Member\")}
    \n \n\n this._delete()}>\n \n\n
    ${$l(\"Delete\")}
    \n
    \n\n this._resend()}>\n \n\n
    ${$l(\"Resend\")}
    \n
    \n `;\n }\n\n private async _delete() {\n if (this._deleteButton.state === \"loading\") {\n return;\n }\n this._deleteButton.start();\n try {\n await app.deleteInvite(this.invite!);\n this._deleteButton.success();\n this.dismiss();\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this._deleteButton.fail();\n throw e;\n }\n this.dismiss();\n }\n\n private async _resend() {\n if (this._resendButton.state === \"loading\") {\n return;\n }\n this._resendButton.start();\n let org = app.getOrg(this.invite!.org!.id)!;\n try {\n await app.deleteInvite(this.invite!);\n this.invite = (await app.createInvites(org!, [this.invite!.email], this.invite!.purpose))[0];\n router.go(`invite/${this.invite.org.id}/${this.invite.id}`, undefined, true);\n this._resendButton.success();\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this._resendButton.fail();\n throw e;\n }\n }\n\n private async _accept() {\n if (this._acceptButton.state === \"loading\") {\n return;\n }\n\n if (!this._codeInput.value) {\n this._error = $l(\"Please enter a confirmation code!\");\n this.rumble();\n return;\n }\n\n this._acceptButton.start();\n try {\n const success = await app.acceptInvite(this.invite!, this._codeInput.value.toLowerCase());\n if (success) {\n this._acceptButton.success();\n this.dismiss();\n alert(\n $l(\n \"You have successfully accepted the invite. You'll be notified once you've been granted access.\"\n ),\n { type: \"success\" }\n );\n } else {\n this._acceptButton.fail();\n this._error = $l(\"Wrong confirmation code. Please try again!\");\n this.rumble();\n return;\n }\n } catch (e) {\n this._acceptButton.fail();\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this.rumble();\n }\n }\n\n private async _confirm() {\n if (this._confirmButton.state === \"loading\") {\n return;\n }\n this._confirmButton.start();\n try {\n const member = await app.confirmInvite(this.invite!);\n this._confirmButton.success();\n\n this.open = false;\n\n await this._memberDialog.show({ org: app.getOrg(this.invite!.org!.id)!, member });\n\n this.dismiss();\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this._confirmButton.fail();\n throw e;\n }\n }\n}\n","import { until } from \"lit-html/directives/until\";\nimport { Invite } from \"@padloc/core/src/invite\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { formatDateFromNow } from \"../lib/util\";\nimport { shared } from \"../styles\";\nimport { app } from \"../globals\";\nimport { dialog, alert } from \"../lib/dialog\";\nimport { BaseElement, element, html, css, property, query } from \"./base\";\nimport { LoadingButton } from \"./loading-button\";\nimport { MemberDialog } from \"./member-dialog\";\nimport \"./icon\";\n\n@element(\"pl-invite-item\")\nexport class InviteItem extends BaseElement {\n @property()\n invite: Invite;\n\n @query(\".confirm-button\")\n private _confirmButton: LoadingButton;\n\n @dialog(\"pl-member-dialog\")\n private _memberDialog: MemberDialog;\n\n private async _confirm() {\n if (this._confirmButton.state === \"loading\") {\n return;\n }\n this._confirmButton.start();\n try {\n const member = await app.confirmInvite(this.invite!);\n this._confirmButton.success();\n await this._memberDialog.show({ org: app.getOrg(this.invite!.org!.id)!, member });\n } catch (e) {\n this._confirmButton.fail();\n alert(e.message || $l(\"Something went wrong. Please try again later!\"), { type: \"warning\" });\n }\n }\n\n shoudUpdate() {\n return !!this.invite;\n }\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n align-items: center;\n padding: 4px 0;\n }\n\n .icon {\n font-size: 120%;\n margin: 10px;\n background: #eee;\n border: solid 1px #ddd;\n width: 45px;\n height: 45px;\n }\n\n .tags {\n margin: 4px 0;\n }\n\n .invite-info {\n flex: 1;\n width: 0;\n }\n\n .invite:hover {\n background: #fafafa;\n }\n\n .invite .tags {\n padding: 0;\n margin: 0;\n }\n\n .invite-email {\n font-weight: bold;\n margin-bottom: 4px;\n }\n\n .invite-code {\n text-align: center;\n margin: 12px;\n }\n\n .invite-code-label {\n font-weight: bold;\n font-size: var(--font-size-micro);\n }\n\n .invite-code-value {\n font-size: 140%;\n font-family: var(--font-family-mono);\n font-weight: bold;\n text-transform: uppercase;\n cursor: text;\n user-select: text;\n letter-spacing: 2px;\n }\n\n .confirm-button {\n padding: 6px 8px;\n margin: 12px;\n font-size: var(--font-size-small);\n align-self: center;\n }\n\n @media (max-width: 400px) {\n .invite-code {\n display: none;\n }\n }\n `\n ];\n\n render() {\n const inv = this.invite!;\n const account = app.account!;\n const org = app.getOrg(inv.org.id)!;\n\n const status = inv.expired\n ? { icon: \"time\", class: \"warning\", text: $l(\"expired\") }\n : inv.accepted\n ? { icon: \"check\", class: \"highlight\", text: $l(\"accepted\") }\n : {\n icon: \"time\",\n class: \"\",\n text: (async () => $l(\"{0}\", await formatDateFromNow(inv.expires, false)))()\n };\n\n let secret = Promise.resolve(\"\");\n\n if (org.isAdmin(account)) {\n const unlockOrg = org.unlock(account);\n secret = (async () => {\n await unlockOrg;\n await inv.unlock(org.invitesKey);\n return inv.secret;\n })();\n }\n\n return html`\n \n\n
    \n
    ${inv.email}
    \n\n
    \n
    \n \n\n
    ${until(status.text)}
    \n
    \n
    \n
    \n\n \n ${$l(\"Confirm\")}\n \n\n
    \n
    ${$l(\"Confirmation Code:\")}
    \n\n
    ${until(secret)}
    \n
    \n `;\n }\n}\n","import { until } from \"lit-html/directives/until\";\nimport { repeat } from \"lit-html/directives/repeat\";\nimport { VaultItemID, Field } from \"@padloc/core/src/item\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { AttachmentInfo } from \"@padloc/core/src/attachment\";\nimport { parseURL } from \"@padloc/core/src/otp\";\nimport { formatDateFromNow, fileIcon, fileSize } from \"../lib/util\";\nimport { alert, confirm, dialog } from \"../lib/dialog\";\nimport { app, router } from \"../globals\";\nimport { setClipboard } from \"../lib/clipboard\";\nimport { animateCascade } from \"../lib/animation\";\nimport { element, html, css, property, query, queryAll, observe } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport \"./icon\";\nimport { Input } from \"./input\";\nimport { TagsInput } from \"./tags-input\";\nimport { MoveItemsDialog } from \"./move-items-dialog\";\nimport { FieldElement } from \"./field\";\nimport \"./field\";\nimport { Generator } from \"./generator\";\nimport { AttachmentDialog } from \"./attachment-dialog\";\nimport { UploadDialog } from \"./upload-dialog\";\nimport { QRDialog } from \"./qr-dialog\";\nimport { FieldTypeDialog } from \"./field-type-dialog\";\nimport { View } from \"./view\";\n\n@element(\"pl-item-dialog\")\nexport class ItemDialog extends Dialog {\n @property()\n itemId: VaultItemID = \"\";\n\n @property()\n isNew: boolean = false;\n\n get _item() {\n const found = (this.itemId && app.getItem(this.itemId)) || null;\n return found && found.item;\n }\n\n get _vault() {\n const found = (this.itemId && app.getItem(this.itemId)) || null;\n return found && found.vault;\n }\n\n @property({ reflect: true, attribute: \"editing\" })\n private _editing: boolean = false;\n\n @property()\n private _fields: Field[] = [];\n\n @query(\"#nameInput\")\n private _nameInput: Input;\n\n @query(\"pl-tags-input\")\n private _tagsInput: TagsInput;\n\n @queryAll(\"pl-field\")\n private _fieldInputs: FieldElement[];\n\n @query(\"input[type='file']\")\n private _fileInput: HTMLInputElement;\n\n @dialog(\"pl-move-items-dialog\")\n private _moveItemsDialog: MoveItemsDialog;\n\n @dialog(\"pl-generator\")\n private _generator: Generator;\n\n @dialog(\"pl-attachment-dialog\")\n private _attachmentDialog: AttachmentDialog;\n\n @dialog(\"pl-upload-dialog\")\n private _uploadDialog: UploadDialog;\n\n @dialog(\"pl-qr-dialog\")\n private _qrDialog: QRDialog;\n\n @dialog(\"pl-field-type-dialog\")\n private _fieldTypeDialog: FieldTypeDialog;\n\n private _draggingIndex = -1;\n\n private _dragOverIndex = -1;\n\n async show(itemId: string) {\n this._editing = false;\n this.itemId = itemId;\n await this.updateComplete;\n this._itemChanged();\n // Workaround for weird bug where name input is sometimes empty after opening dialog\n setTimeout(() => this._itemChanged(), 200);\n const promise = super.show();\n await this.updateComplete;\n animateCascade(this.$$(\".content > *\"));\n return promise;\n }\n\n async addAttachment() {\n await this.updateComplete;\n\n if (this._vault!.id === app.mainVault!.id && !app.account!.quota.storage && app.billingEnabled) {\n this.dispatch(\"get-premium\", {\n message: $l(\"Upgrade to Premium now and get 1GB of encrypted file storage!\"),\n icon: \"storage\"\n });\n this.done();\n return;\n }\n\n this._fileInput.click();\n }\n\n dismiss() {\n super.dismiss();\n router.go(\"items\");\n }\n\n done() {\n super.done();\n this.itemId = \"\";\n this._itemChanged();\n }\n\n static styles = [\n ...Dialog.styles,\n ...View.styles,\n css`\n .inner {\n max-width: 500px;\n background: var(--color-quaternary);\n display: flex;\n flex-direction: column;\n min-height: 500px;\n max-height: 100%;\n }\n\n .content {\n padding-bottom: 50px;\n }\n\n .content > * {\n margin: 12px;\n }\n\n .name {\n padding: 0 8px;\n margin: 0 8px;\n line-height: 40px;\n text-align: center;\n }\n\n :host([editing]) .name {\n border: dashed 1px var(--color-shade-3);\n text-align: left;\n }\n\n pl-field {\n position: relative;\n }\n\n .content > pl-tags-input {\n margin: 12px 16px;\n }\n\n :host(:not([editing])) pl-field:hover {\n background: #eee;\n }\n\n .updated {\n text-align: center;\n font-size: var(--font-size-tiny);\n color: var(--color-shade-4);\n font-weight: 600;\n margin: 30px;\n }\n\n .updated::before {\n font-family: FontAwesome;\n font-size: 80%;\n content: \"\\\\f303\";\n display: inline-block;\n margin-right: 4px;\n }\n\n .attachment {\n display: flex;\n align-items: center;\n padding: 12px;\n margin: 12px;\n }\n\n .attachment-body {\n flex: 1;\n width: 0;\n }\n\n .attachment .file-icon {\n font-size: 150%;\n margin: 0 4px 0 -4px;\n }\n\n .attachment-name {\n font-size: var(--font-size-small);\n font-weight: bold;\n line-height: 1.5em;\n }\n\n .attachment-size {\n font-size: var(--font-size-tiny);\n }\n\n .attachment-remove {\n margin: 0 8px 0 -8px;\n }\n\n .favorite {\n color: var(--color-secondary);\n opacity: 0.3;\n cursor: pointer;\n transition: transform 0.2s cubic-bezier(0.05, 0.7, 0.03, 3) 0s;\n transform: scale(0.9);\n }\n\n .favorite:hover {\n opacity: 0.6;\n }\n\n .favorite[active] {\n color: var(--color-negative);\n opacity: 1;\n transform: scale(1);\n }\n\n .editing {\n text-align: center;\n padding: 8px;\n margin: 0 0 0 12px;\n box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;\n border-radius: var(--border-radius);\n background: rgba(255, 255, 255, 0.9);\n }\n\n .actions {\n grid-template-columns: 1fr 1fr;\n }\n\n .actions > button {\n font-size: var(--font-size-small);\n background: none;\n padding: 10px 8px 10px 0;\n border: dashed 1px;\n font-weight: bold;\n }\n\n .actions > button.negative {\n color: var(--color-negative);\n border-color: var(--color-negative);\n }\n\n .save-button,\n .cancel-button {\n flex: 1;\n max-width: 200px;\n min-width: 120px;\n }\n\n :host(.dragging) .content > * {\n will-change: transform;\n transition: transform 0.2s;\n }\n\n pl-field.dragover::after {\n content: \"\";\n display: block;\n height: 30px;\n border: dashed 2px var(--color-primary);\n width: 100%;\n box-sizing: border-box;\n position: absolute;\n bottom: -45px;\n border-radius: var(--border-radius);\n }\n\n pl-field.dragover ~ * {\n transform: translate3d(0, 40px, 0);\n }\n\n @media (max-width: 700px) {\n .outer {\n padding: 0;\n }\n\n .inner {\n border-radius: 0;\n max-width: 100%;\n width: 100%;\n height: 100%;\n }\n\n .scrim {\n display: none;\n }\n }\n `\n ];\n\n renderContent() {\n if (app.state.locked || !this._item || !this._vault) {\n return html``;\n }\n\n const { updated, updatedBy } = this._item!;\n const vault = this._vault!;\n const org = vault.org && app.getOrg(vault.org.id);\n const readonly = !app.hasWritePermissions(vault);\n const updatedByMember = org && org.getMember({ id: updatedBy });\n const attachments = this._item!.attachments || [];\n const isFavorite = app.account!.favorites.has(this.itemId);\n\n return html`\n
    \n \n \n \n this._setFavorite(!isFavorite)}\n >\n
    \n\n
    \n \n\n ${repeat(\n this._fields,\n field => `${this.itemId}_${field.name}_${field.type}`,\n (field: Field, index: number) => html`\n this._editField(index)}\n @copy-clipboard=${() => setClipboard(this._item!, field)}\n @remove=${() => this._removeField(index)}\n @generate=${() => this._generateValue(index)}\n @get-totp-qr=${() => this._getTotpQR(index)}\n @dragstart=${(e: DragEvent) => this._dragstart(e, index)}\n @dragenter=${(e: DragEvent) => this._dragenter(e, index)}\n @dragover=${(e: DragEvent) => this._dragover(e)}\n @dragend=${(e: DragEvent) => this._dragend(e)}\n @drop=${(e: DragEvent) => this._drop(e)}\n >\n \n `\n )}\n ${attachments.map(\n a => html`\n this._openAttachment(a)}\n >\n \n this._deleteAttachment(a)}\n >\n
    \n
    ${a.name}
    \n
    ${fileSize(a.size)}
    \n
    \n
    \n `\n )}\n\n
    \n \n\n \n\n \n\n \n
    \n\n
    \n ${until(formatDateFromNow(updated!))}\n ${updatedByMember && \" \" + $l(\"by {0}\", updatedByMember.email)}\n
    \n \n\n
    \n
    \n\n this.edit()} ?disabled=${readonly}> \n
    \n\n
    \n \n\n
    \n\n \n
    \n\n \n `;\n }\n\n async edit() {\n if (!app.hasWritePermissions(this._vault!)) {\n return;\n }\n this._editing = true;\n await this.updateComplete;\n setTimeout(() => this._nameInput.focus(), 100);\n }\n\n async cancelEdit() {\n if (this.isNew) {\n app.deleteItems([this._item!]);\n this.dismiss();\n } else {\n this._fields = this._getFields();\n await this.updateComplete;\n this._editing = false;\n this._itemChanged();\n }\n this.isNew = false;\n }\n\n save() {\n app.updateItem(this._item!, {\n name: this._nameInput.value,\n fields: this._getFields(),\n tags: this._tagsInput.tags\n });\n this._editing = false;\n this._itemChanged();\n this.isNew = false;\n }\n\n @observe(\"_editing\")\n _editingChanged() {\n this.dismissOnTapOutside = !this._editing;\n }\n\n private _getFields() {\n return [...this._fieldInputs].map((fieldEl: FieldElement) => {\n return new Field({\n name: fieldEl.name,\n value: fieldEl.value,\n type: fieldEl.type\n });\n });\n }\n\n private _itemChanged() {\n if (this._item) {\n this._nameInput.value = this._item.name;\n this._fields = this._item.fields.map(f => new Field({ ...f }));\n this._tagsInput.tags = [...this._item.tags];\n } else {\n this._nameInput.value = \"\";\n this._fields = [];\n this._tagsInput.tags = [];\n }\n }\n\n private _removeField(index: number) {\n this._fields = this._fields.filter((_, i) => i !== index);\n }\n\n private async _deleteItem() {\n this.open = false;\n const confirmed = await confirm($l(\"Are you sure you want to delete this item?\"), $l(\"Delete\"), $l(\"Cancel\"), {\n type: \"destructive\"\n });\n if (confirmed) {\n app.deleteItems([this._item!]);\n router.go(\"items\");\n } else {\n this.open = true;\n }\n }\n\n private async _addField() {\n this.open = false;\n const fieldDef = await this._fieldTypeDialog.show();\n this.open = true;\n\n if (!fieldDef) {\n return;\n }\n\n this._fields.push(new Field({ name: fieldDef.name, value: \"\", type: fieldDef.type }));\n this.requestUpdate();\n await this.updateComplete;\n setTimeout(() => this._fieldInputs[this._fields.length - 1].focus(), 100);\n }\n\n private async _move() {\n if (!app.hasWritePermissions(this._vault!)) {\n return;\n }\n this.open = false;\n if (this._item!.attachments.length) {\n await alert($l(\"Items with attachments cannot be moved!\"), { type: \"warning\" });\n } else {\n const movedItems = await this._moveItemsDialog.show([{ item: this._item!, vault: this._vault! }]);\n if (movedItems && movedItems.length) {\n router.go(`items/${movedItems[0].id}`);\n }\n }\n this.open = true;\n }\n\n private async _editField(index: number) {\n if (!app.hasWritePermissions(this._vault!)) {\n return;\n }\n this._editing = true;\n await this.updateComplete;\n this._fieldInputs[index].focus();\n }\n\n private async _generateValue(index: number) {\n this.open = false;\n const value = await this._generator.show();\n this.open = true;\n if (value) {\n this._fields[index].value = value;\n }\n }\n\n private async _attachFile() {\n const file = this._fileInput.files![0];\n this._fileInput.value = \"\";\n if (!file) {\n return;\n }\n\n if (file.size > 5e6) {\n alert($l(\"The selected file is too large! Only files of up to 5 MB are supported.\"), {\n type: \"warning\"\n });\n return;\n }\n\n this.open = false;\n const att = await this._uploadDialog.show({ item: this.itemId, file });\n if (att) {\n await alert($l(\"File uploaded successfully!\"), { type: \"success\" });\n }\n this.open = true;\n }\n\n private async _openAttachment(info: AttachmentInfo) {\n if (this._editing) {\n return;\n }\n this.open = false;\n await this._attachmentDialog.show({ item: this.itemId, info });\n this.open = true;\n }\n\n private async _getTotpQR(index: number): Promise {\n this.open = false;\n const data = await this._qrDialog.show();\n if (data) {\n try {\n const { secret } = parseURL(data);\n this._fields[index].value = secret;\n } catch (e) {\n await alert(\"Invalid Code! Please try again!\", { type: \"warning\" });\n return this._getTotpQR(index);\n }\n }\n this.open = true;\n }\n\n private _setFavorite(favorite: boolean) {\n app.toggleFavorite(this.itemId, favorite);\n this.requestUpdate();\n }\n\n private async _deleteAttachment(a: AttachmentInfo) {\n this.open = false;\n const confirmed = await confirm(\n $l(\"Are you sure you want to delete this attachment?\"),\n $l(\"Delete\"),\n $l(\"Cancel\"),\n {\n title: $l(\"Delete Attachment\"),\n type: \"destructive\"\n }\n );\n this.open = true;\n if (confirmed) {\n await app.deleteAttachment(this.itemId!, a);\n this.requestUpdate();\n }\n }\n\n private _drop(e: DragEvent) {\n // console.log(\"drop\", e, this._draggingIndex, this._dragOverIndex);\n e.preventDefault();\n e.stopPropagation();\n return false;\n }\n\n private async _dragstart(event: DragEvent, index: number) {\n // console.log(\"dragstart\", event);\n this._draggingIndex = index;\n this.dispatch(\"field-dragged\", { item: this._item, index, event });\n (event.target as HTMLElement).classList.add(\"dragging\");\n this.classList.add(\"dragging\");\n }\n\n private _dragenter(e: DragEvent, index: number) {\n // console.log(\"dragenter\", e);\n e.dataTransfer!.dropEffect = \"move\";\n\n this._dragOverIndex = index;\n\n for (const [i, field] of this._fieldInputs.entries()) {\n field.classList.toggle(\n \"dragover\",\n i === index && i !== this._draggingIndex && i !== this._draggingIndex - 1\n );\n }\n }\n\n private _dragover(e: DragEvent) {\n e.preventDefault();\n }\n\n private _dragend(_e: DragEvent) {\n // console.log(\"dragend\", e, this._draggingIndex, this._dragOverIndex);\n\n if (this._draggingIndex !== -1 || this._dragOverIndex !== -1) {\n const field = this._fields[this._draggingIndex];\n this._fields.splice(this._draggingIndex, 1);\n const targetIndex =\n this._dragOverIndex >= this._draggingIndex ? this._dragOverIndex : this._dragOverIndex + 1;\n this._fields.splice(targetIndex, 0, field);\n this.requestUpdate();\n }\n\n for (const field of this._fieldInputs) {\n field.classList.remove(\"dragging\");\n field.classList.remove(\"dragover\");\n }\n this.classList.remove(\"dragging\");\n this._dragOverIndex = -1;\n this._draggingIndex = -1;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { VaultID } from \"@padloc/core/src/vault\";\nimport { Tag } from \"@padloc/core/src/item\";\nimport { StateMixin } from \"../mixins/state\";\nimport { shared, mixins } from \"../styles\";\nimport { app, router } from \"../globals\";\nimport { BaseElement, element, css, property, html } from \"./base\";\n\n@element(\"pl-items-filter\")\nexport class ItemsFilter extends StateMixin(BaseElement) {\n @property()\n vault: VaultID = \"\";\n\n @property()\n tag: Tag = \"\";\n\n @property()\n favorites: boolean = false;\n\n @property()\n attachments: boolean = false;\n\n @property()\n recent: boolean = false;\n\n @property()\n host: string = \"\";\n\n @property()\n searching: boolean = false;\n\n @property({ reflect: true, attribute: \"selecting\" })\n private _selecting: Boolean = false;\n\n static styles = [\n shared,\n css`\n :host {\n display: block;\n text-align: center;\n overflow: visible;\n }\n\n button {\n display: flex;\n margin: 0 auto;\n align-items: center;\n font-weight: bold;\n padding: 6px 12px;\n border-radius: 20px;\n line-height: normal;\n box-sizing: border-box;\n overflow: hidden;\n max-width: 100%;\n background: var(--color-shade-1);\n border-bottom: solid 2px var(--color-shade-2);\n margin-bottom: -2px;\n font-size: var(--font-size-small);\n }\n\n button.vault {\n background: var(--color-primary);\n color: var(--color-tertiary);\n text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0;\n border-bottom: solid 2px var(--color-shade-4);\n }\n\n button.filter-tag {\n background: var(--color-secondary);\n color: var(--color-tertiary);\n text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0;\n border-bottom: solid 2px #222;\n }\n\n button.favorites,\n button.host {\n background: var(--color-negative);\n color: var(--color-tertiary);\n text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0;\n border-bottom: solid 2px var(--color-shade-4);\n }\n\n button pl-icon {\n font-size: 85%;\n width: 20px;\n height: 20px;\n margin-right: -6px;\n }\n\n button pl-icon.search-icon {\n margin-right: 3px;\n margin-left: -4px;\n }\n\n .list pl-icon {\n margin-left: -4px;\n margin-right: 2px;\n margin-top: 1px;\n font-size: 80%;\n width: 25px;\n }\n\n button > div,\n .option > div {\n ${mixins.ellipsis()}\n }\n\n .scrim {\n z-index: 10;\n border-top: solid 3px #f2f2f2;\n background: rgba(255, 255, 255, 0.5);\n ${mixins.fullbleed()}\n top: 60px;\n will-change: opacity;\n transition: opacity 200ms cubic-bezier(0.6, 0, 0.2, 1);\n }\n\n :host(:not([selecting])) .scrim {\n opacity: 0;\n pointer-events: none;\n }\n\n :host(:not([selecting])) .list {\n transform: translate3d(0, -100%, 0);\n }\n\n .list {\n padding: 12px 6px 6px 6px;\n background: var(--color-tertiary);\n box-sizing: border-box;\n max-height: 100%;\n width: 100%;\n font-size: var(--font-size-tiny);\n border-bottom: solid 3px var(--color-shade-1);\n will-change: transform;\n transition: transform 200ms cubic-bezier(0.6, 0, 0.2, 1);\n ${mixins.scroll()}\n }\n\n .list button {\n margin-bottom: 6px;\n border-bottom: none;\n padding: 5px 10px;\n text-shadow: none;\n }\n\n h4 {\n margin: 16px 10px 10px 10px;\n text-align: center;\n opacity: 0.8;\n }\n\n .no-tags {\n font-size: var(--font-size-micro);\n padding: 5px 10px 15px 10px;\n opacity: 0.5;\n }\n\n .count {\n opacity: 0.7;\n margin-left: 6px;\n margin-right: 2px;\n font-size: var(--font-size-tiny);\n }\n\n @supports (-webkit-overflow-scrolling: touch) {\n .scrim {\n top: calc(50px + max(env(safe-area-inset-top), 8px));\n }\n }\n `\n ];\n\n render() {\n if (!app.mainVault || !app.account) {\n return html``;\n }\n const { vault: vaultId, tag, favorites, attachments, recent, host } = this;\n const vault = app.getVault(vaultId);\n const cl = favorites\n ? \"favorites\"\n : recent\n ? \"recent\"\n : vault\n ? \"vault\"\n : attachments\n ? \"attachments\"\n : tag\n ? \"filter-tag\"\n : host\n ? \"host\"\n : \"all\";\n const label = favorites\n ? $l(\"Favorites\")\n : recent\n ? $l(\"Recently Used\")\n : attachments\n ? $l(\"Attachments\")\n : host\n ? this.state.currentHost\n : vault\n ? vault.name\n : tag || $l(\"All Items\");\n\n const count = app.count;\n\n return html`\n \n\n
    this._dismiss()}>\n
    \n \n\n \n\n \n\n \n\n \n\n \n\n ${app.orgs.map(org => {\n const vaults = app.vaults.filter(v => v.org && v.org.id === org.id);\n\n return html`\n

    ${org.name}

    \n\n ${vaults.map(\n vault => html`\n \n `\n )}\n `;\n })}\n\n

    ${$l(\"Tags\")}

    \n\n
    \n ${$l(\"You don't have any tags yet.\")}\n
    \n\n ${app.state.tags.map(\n ([tag, count]) => html`\n \n `\n )}\n
    \n
    \n `;\n }\n\n _select({\n tag,\n vault,\n favorites,\n recent,\n attachments,\n host\n }: {\n tag?: Tag;\n vault?: VaultID;\n favorites?: boolean;\n recent?: boolean;\n attachments?: boolean;\n host?: boolean;\n }) {\n const params: any = {};\n if (tag) {\n params.tag = tag;\n }\n if (vault) {\n params.vault = vault;\n }\n if (favorites) {\n params.favorites = favorites;\n }\n if (attachments) {\n params.attachments = attachments;\n }\n if (recent) {\n params.recent = recent;\n }\n if (host) {\n params.host = host;\n }\n router.go(\"items\", params);\n }\n\n _dismiss() {\n this._selecting = false;\n }\n}\n","import { VaultItem, Field, Tag } from \"@padloc/core/src/item\";\nimport { Vault, VaultID } from \"@padloc/core/src/vault\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { debounce, wait, escapeRegex } from \"@padloc/core/src/util\";\nimport { AttachmentInfo } from \"@padloc/core/src/attachment\";\nimport { cache } from \"lit-html/directives/cache\";\nimport { StateMixin } from \"../mixins/state\";\nimport { setClipboard } from \"../lib/clipboard\";\nimport { app, router } from \"../globals\";\nimport { dialog, confirm } from \"../lib/dialog\";\nimport { mixins } from \"../styles\";\nimport { fileIcon, fileSize } from \"../lib/util\";\nimport { element, html, css, property, query, listen, observe } from \"./base\";\nimport { View } from \"./view\";\nimport { Input } from \"./input\";\nimport { MoveItemsDialog } from \"./move-items-dialog\";\nimport { AttachmentDialog } from \"./attachment-dialog\";\nimport \"./icon\";\nimport \"./items-filter\";\nimport \"./virtual-list\";\nimport \"./totp\";\n\ninterface ListItem {\n item: VaultItem;\n vault: Vault;\n section?: string;\n firstInSection?: boolean;\n lastInSection?: boolean;\n warning?: boolean;\n}\n\nfunction filterByString(fs: string, rec: VaultItem) {\n if (!fs) {\n return true;\n }\n const content = [rec.name, ...rec.tags, ...rec.fields.map(f => f.name), ...rec.fields.map(f => f.value)]\n .join(\" \")\n .toLowerCase();\n return content.search(escapeRegex(fs.toLowerCase())) !== -1;\n}\n\n@element(\"pl-items-list\")\nexport class ItemsList extends StateMixin(View) {\n @property()\n selected: string = \"\";\n\n @property()\n multiSelect: boolean = false;\n\n @property()\n vault: VaultID = \"\";\n\n @property()\n tag: Tag = \"\";\n\n @property()\n favorites: boolean = false;\n\n @property()\n attachments: boolean = false;\n\n @property()\n recent: boolean = false;\n\n @property()\n host: boolean = false;\n\n @property()\n private _listItems: ListItem[] = [];\n // @property()\n // private _firstVisibleIndex: number = 0;\n // @property()\n // private _lastVisibleIndex: number = 0;\n\n // @query(\"#main\")\n // private _main: HTMLElement;\n @query(\"#filterInput\")\n private _filterInput: Input;\n\n @property()\n private _filterShowing: boolean = false;\n\n private _cachedBounds: DOMRect | ClientRect | null = null;\n // private _selected = new Map();\n\n @dialog(\"pl-move-items-dialog\")\n private _moveItemsDialog: MoveItemsDialog;\n\n @dialog(\"pl-attachment-dialog\")\n private _attachmentDialog: AttachmentDialog;\n\n private _multiSelect = new Map();\n\n private _updateItems = debounce(() => {\n this._listItems = this._getItems();\n }, 50);\n\n @observe(\"vault\")\n @observe(\"tag\")\n @observe(\"favorites\")\n @observe(\"attachments\")\n @observe(\"recent\")\n @observe(\"host\")\n async stateChanged() {\n // Clear items from selection that are no longer in list (due to filtering)\n for (const id of this._multiSelect.keys()) {\n if (!this._listItems.some(i => i.item.id === id)) {\n this._multiSelect.delete(id);\n }\n }\n\n // When the app is getting locked, give the lock animation some time to finish\n if (this._listItems.length && this.state.locked) {\n await wait(500);\n }\n\n this._updateItems();\n }\n\n async search() {\n this._filterShowing = true;\n await this.updateComplete;\n this._filterInput.focus();\n }\n\n cancelFilter() {\n this._filterInput.value = \"\";\n this._filterInput.blur();\n this._filterShowing = false;\n this._updateItems();\n }\n\n selectItem(item: ListItem) {\n if (this.multiSelect) {\n if (this._multiSelect.has(item.item.id)) {\n this._multiSelect.delete(item.item.id);\n } else {\n this._multiSelect.set(item.item.id, item);\n }\n this.requestUpdate();\n } else {\n router.go(`items/${item.item.id}`);\n }\n }\n\n selectAll() {\n this.multiSelect = true;\n for (const item of this._listItems) {\n this._multiSelect.set(item.item.id, item);\n }\n this.requestUpdate();\n }\n\n clearSelection() {\n this._multiSelect.clear();\n this.requestUpdate();\n }\n\n cancelMultiSelect() {\n this._multiSelect.clear();\n this.multiSelect = false;\n this.requestUpdate();\n }\n\n firstUpdated() {\n this._resizeHandler();\n }\n\n static styles = [\n ...View.styles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n position: relative;\n background: var(--color-quaternary);\n border-radius: var(--border-radius);\n }\n\n header {\n overflow: visible;\n z-index: 10;\n }\n\n header pl-input {\n font-size: var(--font-size-default);\n padding: 0 0 0 10px;\n }\n\n pl-items-filter {\n min-width: 0;\n }\n\n main {\n padding-bottom: 70px;\n position: relative;\n }\n\n .section-header {\n grid-column: 1/-1;\n font-weight: bold;\n display: flex;\n align-items: flex-end;\n height: 35px;\n box-sizing: border-box;\n padding: 0 10px 5px 10px;\n background: var(--color-quaternary);\n display: flex;\n z-index: 1;\n position: -webkit-sticky;\n position: sticky;\n top: -3px;\n margin-bottom: -8px;\n font-size: var(--font-size-small);\n }\n\n .item {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n margin: 6px;\n cursor: pointer;\n /*\n box-shadow: rgba(0, 0, 0, 0.1) 0 1px 8px;\n border: none;\n */\n }\n\n .item-body {\n flex: 1;\n min-width: 0;\n }\n\n .item .tags {\n padding: 0;\n }\n\n .item .tags .tag-name {\n max-width: 60px;\n }\n\n .item-header {\n height: 24px;\n margin: 12px 12px 8px 12px;\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .item-name {\n ${mixins.ellipsis()}\n font-weight: 600;\n flex: 1;\n min-width: 0;\n line-height: 24px;\n }\n\n .item-fields {\n position: relative;\n display: flex;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0 0 6px 6px;\n }\n\n .item-fields::after {\n content: \"\";\n display: block;\n width: 6px;\n flex: none;\n /*\n position: absolute;\n z-index: 1;\n right: 0;\n top: 0;\n bottom: 0;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));\n */\n }\n\n .item-field {\n cursor: pointer;\n font-size: var(--font-size-tiny);\n position: relative;\n flex: 1;\n border-radius: 8px;\n max-width: calc(60%);\n opacity: 0.999;\n }\n\n .item-field.dragging {\n background: var(--color-tertiary);\n }\n\n .item-field.dragging::after {\n background: none;\n }\n\n .item-field > * {\n transition: transform 0.2s cubic-bezier(1, -0.3, 0, 1.3), opacity 0.2s;\n }\n\n .item-field:not(.copied) .copied-message,\n .item-field.copied .item-field-label {\n opacity: 0;\n transform: scale(0);\n }\n\n .copied-message {\n ${mixins.fullbleed()}\n border-radius: inherit;\n font-weight: bold;\n color: var(--color-primary);\n text-align: center;\n line-height: 45px;\n }\n\n .copied-message::before {\n font-family: \"FontAwesome\";\n content: \"\\\\f00c\\\\ \";\n }\n\n .item-field-label {\n padding: 4px 6px;\n pointer-events: none;\n min-width: 0;\n }\n\n .item-field-name {\n font-size: var(--font-size-micro);\n color: var(--color-primary);\n margin-bottom: 2px;\n font-weight: 600;\n ${mixins.ellipsis()}\n line-height: 16px;\n height: 16px;\n }\n\n .item-field-name pl-icon {\n font-size: 9px;\n color: var(--color-primary);\n display: inline-block;\n height: 10px;\n width: 10px;\n border-radius: 0;\n position: relative;\n top: 1px;\n }\n\n .item-field-value {\n font-weight: 600;\n line-height: 19px;\n height: 19px;\n ${mixins.ellipsis()}\n }\n\n .item-field-value > * {\n vertical-align: middle;\n }\n\n .item-field.attachment {\n display: flex;\n align-items: center;\n }\n\n .attachment .file-icon {\n display: inline-block;\n height: 1em;\n width: 1em;\n font-size: 90%;\n border-radius: 0;\n vertical-align: middle;\n }\n\n .item:focus:not([selected]) {\n border-color: var(--color-highlight);\n color: #4ca8d9;\n }\n\n .item[selected] {\n background: #e6e6e6;\n border-color: #ddd;\n }\n\n .item-check {\n position: relative;\n width: 30px;\n height: 30px;\n box-sizing: border-box;\n border: solid 3px transparent;\n background: var(--color-shade-1);\n border-radius: 30px;\n margin: 12px;\n margin-right: 0;\n }\n\n .item-check::after {\n content: \"\";\n display: block;\n ${mixins.fullbleed()}\n background: var(--color-negative);\n border-radius: inherit;\n transition: transform 0.2s, opacity 0.2s;\n transition-timing-function: cubic-bezier(1, -0.3, 0, 1.3);\n }\n\n .item-check:not([checked])::after {\n opacity: 0;\n transform: scale(0);\n }\n\n .selected-count {\n text-align: center;\n display: block;\n margin-left: 12px;\n background: rgba(255, 255, 255, 0.9);\n border-radius: var(--border-radius);\n padding: 12px 4px;\n line-height: 1.2em;\n font-size: var(--font-size-tiny);\n font-weight: bold;\n box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;\n }\n\n pl-virtual-list {\n padding: 6px;\n padding-bottom: 65px;\n ${mixins.fullbleed()}\n ${mixins.scroll()}\n }\n `\n ];\n\n render() {\n const placeholder = this._listItems.length\n ? {}\n : this._filterShowing\n ? {\n icon: \"search\",\n text: $l(\"Your search did not match any items.\")\n }\n : this.vault\n ? {\n icon: \"vault\",\n text: $l(\"This vault does not have any items yet.\")\n }\n : this.attachments\n ? {\n icon: \"attachment\",\n text: $l(\"You don't have any attachments yet.\")\n }\n : this.favorites\n ? {\n icon: \"favorite\",\n text: $l(\"You don't have any favorites yet.\")\n }\n : this.recent\n ? {\n icon: \"time\",\n text: $l(\"You don't have any recently used items!\")\n }\n : {\n icon: \"list\",\n text: $l(\"You don't have any items yet.\")\n };\n return html`\n
    \n this.dispatch(\"toggle-menu\")}\n ?hidden=${this._filterShowing}\n >\n\n
    \n\n \n\n
    \n\n \n \n\n this.search()}\n ?hidden=${this._filterShowing}\n >\n\n this.cancelFilter()}\n ?hidden=${!this._filterShowing}\n >\n
    \n\n
    \n this._renderItem(item)}\n .guard=${({ item, vault }: ListItem) => [\n item.name,\n item.tags,\n item.fields,\n vault,\n item.id === this.selected,\n this.multiSelect,\n this._multiSelect.has(item.id)\n ]}\n >\n
    \n\n
    \n \n\n
    ${placeholder.text}
    \n
    \n\n
    \n (this.multiSelect = true)}>\n\n
    \n\n this.dispatch(\"create-item\")}>\n
    \n\n
    \n (this._multiSelect.size ? this.clearSelection() : this.selectAll())}\n >\n \n\n this.cancelMultiSelect()}>\n\n
    ${$l(\"{0} items selected\", this._multiSelect.size.toString())}
    \n\n this._moveItems()}>\n\n this._deleteItems()}>\n
    \n `;\n }\n\n @listen(\"resize\", window)\n _resizeHandler() {\n delete this._cachedBounds;\n }\n //\n // private _scrollToIndex(i: number) {\n // const el = this.$(`pl-item-item[index=\"${i}\"]`);\n // if (el) {\n // this._main.scrollTop = el.offsetTop - 6;\n // }\n // }\n //\n // private _scrollToSelected() {\n // const selected = this._selected.values()[0];\n // const i = this._listItems.indexOf(selected);\n // if (i !== -1 && (i < this._firstVisibleIndex || i > this._lastVisibleIndex)) {\n // this._scrollToIndex(i);\n // }\n // }\n\n // private async _animateItems(delay = 100) {\n // await this.updateComplete;\n // this._main.style.opacity = \"0\";\n // setTimeout(() => {\n // this._scrollHandler();\n // const elements = Array.from(this.$$(\".list-item\"));\n // const animated = elements.slice(this._firstVisibleIndex, this._lastVisibleIndex + 1);\n //\n // animateCascade(animated, { clear: true });\n // this._main.style.opacity = \"1\";\n // }, delay);\n // }\n\n private async _deleteItems() {\n let selected = [...this._multiSelect.values()];\n\n if (selected.some(({ vault }) => !app.hasWritePermissions(vault))) {\n const proceed = await confirm(\n $l(\n \"Some items in your selection are from Vaults you don't have write access \" +\n \"to and cannot be deleted. Do you want to proceed deleting the other items?\"\n ),\n $l(\"Yes\"),\n $l(\"No\")\n );\n if (!proceed) {\n return;\n }\n selected = selected.filter(({ vault }) => app.hasWritePermissions(vault));\n }\n\n const confirmed = await confirm(\n $l(\"Are you sure you want to delete these items? This action can not be undone!\"),\n $l(\"Delete {0} Items\", selected.length.toString()),\n $l(\"Cancel\"),\n { type: \"destructive\" }\n );\n if (confirmed) {\n await app.deleteItems(selected.map(i => i.item));\n this.cancelMultiSelect();\n }\n }\n\n private async _moveItems() {\n let selected = [...this._multiSelect.values()];\n if (selected.some(({ item }) => !!item.attachments.length)) {\n const proceed = await confirm(\n $l(\n \"Some items in your selection have attachments and cannot be moved. \" +\n \"Do you want to proceed moving the other items?\"\n ),\n $l(\"Yes\"),\n $l(\"No\")\n );\n if (!proceed) {\n return;\n }\n selected = selected.filter(({ item }) => !item.attachments.length);\n }\n\n if (selected.some(({ vault }) => !app.hasWritePermissions(vault))) {\n const proceed = await confirm(\n $l(\n \"Some items in your selection are from Vaults you don't have write \" +\n \"access to and cannot be moved. Do you want to proceed moving the other items?\"\n ),\n $l(\"Yes\"),\n $l(\"No\")\n );\n if (!proceed) {\n return;\n }\n selected = selected.filter(({ vault }) => app.hasWritePermissions(vault));\n }\n\n const movedItems = await this._moveItemsDialog.show(selected);\n if (movedItems) {\n this.cancelMultiSelect();\n }\n }\n\n private _copyField({ item }: ListItem, index: number, e: Event) {\n e.stopPropagation();\n setClipboard(item, item.fields[index]);\n const fieldEl = e.target as HTMLElement;\n fieldEl.classList.add(\"copied\");\n setTimeout(() => fieldEl.classList.remove(\"copied\"), 1000);\n app.updateLastUsed(item);\n this.dispatch(\"field-clicked\", { item, index });\n }\n\n private async _dragFieldStart({ item }: ListItem, index: number, event: DragEvent) {\n this.dispatch(\"field-dragged\", { item, index, event });\n return true;\n }\n\n private _openAttachment(a: AttachmentInfo, item: VaultItem, e: MouseEvent) {\n e.stopPropagation();\n this._attachmentDialog.show({ info: a, item: item.id });\n }\n\n private _getItems(): ListItem[] {\n const { vault: vaultId, tag, favorites, attachments, recent, host } = this;\n const filter = (this._filterInput && this._filterInput.value) || \"\";\n const recentThreshold = new Date(Date.now() - app.settings.recentLimit * 24 * 60 * 60 * 1000);\n\n let items: ListItem[] = [];\n\n if (host) {\n items = this.app.getItemsForHost(this.app.state.currentHost);\n } else {\n for (const vault of this.state.vaults) {\n // Filter by vault\n if (vaultId && vault.id !== vaultId) {\n continue;\n }\n\n for (const item of vault.items) {\n if (\n // filter by tag\n (!tag || item.tags.includes(tag)) &&\n (!favorites || app.account!.favorites.has(item.id)) &&\n (!attachments || !!item.attachments.length) &&\n (!recent ||\n (app.state.lastUsed.has(item.id) && app.state.lastUsed.get(item.id)! > recentThreshold)) &&\n filterByString(filter || \"\", item)\n ) {\n items.push({\n vault,\n item,\n section: \"\",\n firstInSection: false,\n lastInSection: false\n });\n }\n }\n }\n }\n\n items.sort((a, b) => {\n const x = a.item.name.toLowerCase();\n const y = b.item.name.toLowerCase();\n return x > y ? 1 : x < y ? -1 : 0;\n });\n\n return items;\n }\n\n private _renderItem(li: ListItem) {\n const { item, vault, warning } = li;\n const tags = [];\n\n if (!this.vault && app.mainVault && vault.id !== app.mainVault.id) {\n tags.push({ name: vault.name, icon: \"\", class: \"highlight\" });\n }\n\n if (warning) {\n tags.push({ icon: \"error\", class: \"warning\", name: \"\" });\n }\n\n if (item.tags.length === 1) {\n const t = item.tags.find(t => t === router.params.tag) || item.tags[0];\n tags.push({\n name: t,\n class: \"\"\n });\n } else if (item.tags.length) {\n tags.push({\n icon: \"tag\",\n name: item.tags.length.toString(),\n class: \"\"\n });\n }\n\n const attCount = (item.attachments && item.attachments.length) || 0;\n if (attCount) {\n tags.push({\n name: attCount.toString(),\n icon: \"attachment\",\n class: \"\"\n });\n }\n\n if (app.account!.favorites.has(item.id)) {\n tags.push({\n name: \"\",\n icon: \"favorite\",\n class: \"warning\"\n });\n }\n\n return html`\n
    this.selectItem(li)}}\">\n ${cache(\n this.multiSelect\n ? html`\n
    \n `\n : \"\"\n )}\n\n
    \n
    \n
    \n ${item.name || $l(\"No Name\")}\n
    \n\n
    \n ${tags.map(\n tag => html`\n
    \n ${tag.icon\n ? html`\n \n `\n : \"\"}\n ${tag.name\n ? html`\n
    \n ${tag.name}\n
    \n `\n : \"\"}\n
    \n `\n )}\n
    \n
    \n\n
    \n ${item.fields.map((f: Field, i: number) => {\n return html`\n this._copyField(li, i, e)}\n draggable=\"true\"\n @dragstart=${(e: DragEvent) => this._dragFieldStart(li, i, e)}\n >\n
    \n
    \n \n ${f.name || $l(\"Unnamed\")}\n
    \n ${f.type === \"totp\"\n ? html`\n \n `\n : html`\n
    \n ${f.format(true)}\n
    \n `}\n
    \n\n
    ${$l(\"copied\")}
    \n
    \n `;\n })}\n ${item.attachments.map(\n a => html`\n this._openAttachment(a, item, e)}\n >\n
    \n
    \n \n ${a.name}\n
    \n
    \n \n ${fileSize(a.size)}\n
    \n
    \n
    \n `\n )}\n ${cache(\n !item.fields.length && !item.attachments.length\n ? html`\n
    \n
    \n
    \n ${$l(\"No Fields\")}\n
    \n
    ${$l(\"This item has no fields.\")}
    \n
    \n
    \n `\n : \"\"\n )}\n \n \n \n `;\n }\n}\n","import { shared, mixins } from \"../styles\";\nimport { BaseElement, element, html, css, property, listen } from \"./base\";\nimport \"./icon\";\nimport \"./spinner\";\n\ntype ButtonState = \"idle\" | \"loading\" | \"success\" | \"fail\";\n\n@element(\"pl-loading-button\")\nexport class LoadingButton extends BaseElement {\n @property({ reflect: true })\n state: ButtonState = \"idle\";\n @property()\n noTab: boolean = false;\n\n private _stopTimeout: number;\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n padding: 12px 15px;\n }\n\n :host([state=\"loading\"]) button {\n cursor: progress;\n }\n\n button {\n background: transparent;\n position: relative;\n flex: 1;\n height: auto;\n padding: 0;\n }\n\n button > * {\n transition: transform 0.2s cubic-bezier(1, -0.3, 0, 1.3), opacity 0.2s;\n will-change: transform;\n }\n\n button > :not(.label) {\n ${mixins.absoluteCenter()}\n }\n\n button > .label {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n :host(.vertical) .label {\n flex-direction: column;\n }\n\n button.loading .label,\n button.success .label,\n button.fail .label,\n button:not(.loading) .spinner,\n button:not(.success) .icon-success,\n button:not(.fail) .icon-fail {\n opacity: 0.5;\n transform: scale(0);\n }\n\n button pl-icon {\n font-size: 120%;\n }\n\n pl-spinner {\n width: 30px;\n height: 30px;\n }\n\n :host(.icon) {\n background: transparent !important;\n border-radius: 100% !important;\n padding: 0;\n line-height: 0;\n }\n\n :host(:not(.icon)) ::slotted(pl-icon:first-child) {\n margin: -10px 0 -10px -10px;\n }\n `\n ];\n\n render() {\n const { state, noTab } = this;\n return html`\n \n `;\n }\n\n static get is() {\n return \"pl-loading-button\";\n }\n\n @listen(\"click\")\n _click(e: MouseEvent) {\n if (this.state === \"loading\") {\n e.stopPropagation();\n }\n }\n\n start() {\n clearTimeout(this._stopTimeout);\n this.state = \"loading\";\n }\n\n stop() {\n this.state = \"idle\";\n }\n\n success() {\n this.state = \"success\";\n this._stopTimeout = window.setTimeout(() => this.stop(), 1000);\n }\n\n fail() {\n this.state = \"fail\";\n this._stopTimeout = window.setTimeout(() => this.stop(), 1000);\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { RetrieveMFATokenResponse } from \"@padloc/core/src/api\";\nimport { ErrorCode } from \"@padloc/core/src/error\";\nimport { MFAPurpose } from \"@padloc/core/src/mfa\";\nimport { app, router } from \"../globals\";\nimport { element, html, css, property, query } from \"./base\";\nimport { StartForm } from \"./start-form\";\nimport { Input } from \"./input\";\nimport { PasswordInput } from \"./password-input\";\nimport { LoadingButton } from \"./loading-button\";\nimport { alert, confirm, prompt } from \"../lib/dialog\";\nimport \"./logo\";\n\n@element(\"pl-login\")\nexport class Login extends StartForm {\n @property()\n private _errorMessage: string;\n\n @query(\"#emailInput\")\n private _emailInput: Input;\n @query(\"#passwordInput\")\n private _passwordInput: PasswordInput;\n @query(\"#loginButton\")\n private _loginButton: LoadingButton;\n\n private _failedCount = 0;\n\n async reset() {\n await this.updateComplete;\n this._emailInput.value = router.params.email || \"\";\n this._passwordInput.value = \"\";\n this._loginButton.stop();\n this._failedCount = 0;\n super.reset();\n if (router.params.verifying) {\n this._verifyEmail();\n }\n }\n\n static styles = [\n ...StartForm.styles,\n css`\n .hint {\n font-size: var(--font-size-tiny);\n box-sizing: border-box;\n transition: max-height 0.3s;\n max-height: 100px;\n margin: 40px 0 -20px 0;\n }\n\n button.signup {\n background: none;\n border: none;\n height: auto;\n line-height: normal;\n font-weight: bold;\n height: var(--row-height);\n }\n `\n ];\n\n render() {\n return html`\n
    \n\n
    \n \n\n this._submit()}\n >\n \n\n this._submit()}\n >\n \n\n this._submit()}>\n ${$l(\"Login\")}\n \n\n ${this._errorMessage\n ? html`\n
    ${this._errorMessage}
    \n `\n : \"\"}\n\n
    \n ${$l(\"New to Padloc?\")}\n
    \n\n \n \n\n
    \n `;\n }\n\n private async _verifyEmail() {\n router.params = { ...router.params, email: this._emailInput.value, verifying: \"1\" };\n\n const res: RetrieveMFATokenResponse | null = await prompt(\n $l(\"Please enter the confirmation code sent to your email address to proceed!\"),\n {\n title: $l(\"One Last Step!\"),\n placeholder: $l(\"Enter Verification Code\"),\n confirmLabel: $l(\"Submit\"),\n type: \"number\",\n pattern: \"[0-9]*\",\n validate: async (code: string) => {\n try {\n return app.retrieveMFAToken(this._emailInput.value, code, MFAPurpose.Login);\n } catch (e) {\n if (e.code === ErrorCode.MFA_TRIES_EXCEEDED) {\n alert($l(\"Maximum number of tries exceeded! Please resubmit and try again!\"), {\n type: \"warning\"\n });\n return null;\n }\n throw e.message ||\n `Something went wrong while we were processing your request. Please try again later! (Error Code: ${e.code})`;\n }\n }\n }\n );\n\n if (res) {\n this._verificationToken = res.token;\n }\n\n const { email, verifying, ...rest } = router.params;\n router.params = rest;\n\n return res;\n }\n\n private async _accountDoesntExist(email: string) {\n const signup = await confirm(\n $l(\"An account with this email address does not exist!\"),\n $l(\"Sign Up\"),\n $l(\"Cancel\"),\n {\n icon: \"info\"\n }\n );\n if (signup) {\n router.go(\"signup\", { email });\n }\n }\n\n private async _submit(): Promise {\n if (this._loginButton.state === \"loading\") {\n return;\n }\n\n if (!this._emailInput.reportValidity()) {\n return;\n }\n\n this._emailInput.blur();\n this._passwordInput.blur();\n\n const email = this._emailInput.value;\n let password = this._passwordInput.value;\n\n if (this._emailInput.invalid) {\n this._errorMessage = $l(\"Please enter a valid email address!\");\n this.rumble();\n this._emailInput.focus();\n return;\n }\n\n if (!password) {\n this._errorMessage = $l(\"Please enter your master password!\");\n this.rumble();\n this._passwordInput.focus();\n return;\n }\n\n this._errorMessage = \"\";\n this._loginButton.start();\n try {\n await app.login(email, password, this._verificationToken);\n this._loginButton.success();\n this.done();\n } catch (e) {\n switch (e.code) {\n case ErrorCode.MFA_REQUIRED:\n this._loginButton.stop();\n\n await app.requestMFACode(email, MFAPurpose.Login);\n const verify = await this._verifyEmail();\n\n if (!verify) {\n return;\n }\n\n if (!verify.hasAccount) {\n if (verify.hasLegacyAccount) {\n this._migrateAccount(email, password, verify.legacyToken!, verify.token);\n } else {\n this._accountDoesntExist(email);\n }\n return;\n }\n\n return this._submit();\n case ErrorCode.INVALID_CREDENTIALS:\n this._errorMessage = $l(\"Wrong username or password. Please try again!\");\n this._loginButton.fail();\n this.rumble();\n\n this._failedCount++;\n if (this._failedCount > 2) {\n const recover = await confirm(\n $l(\"Can't remember your master password?\"),\n $l(\"Recover Account\"),\n $l(\"Try Again\")\n );\n if (recover) {\n router.go(\"recover\", { email });\n }\n } else {\n this._passwordInput.focus();\n }\n return;\n case ErrorCode.NOT_FOUND:\n this._loginButton.fail();\n this._accountDoesntExist(email);\n return;\n default:\n this._loginButton.fail();\n throw e;\n }\n }\n }\n}\n","import { BaseElement, element, html, css, svg, property } from \"./base\";\n\n@element(\"pl-logo\")\nexport class Logo extends BaseElement {\n @property({ reflect: true })\n reveal: boolean = false;\n\n static styles = [\n css`\n :host {\n position: relative;\n display: block;\n width: 200px;\n height: 52px;\n }\n\n :host([reveal]) .padloc > * {\n stroke-dashoffset: 0;\n }\n\n svg {\n width: 100%;\n height: 100%;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-width: 7;\n }\n\n .padloc > * {\n transition: stroke-dashoffset 1.4s cubic-bezier(0.57, 0.25, 0, 0.99);\n stroke-dashoffset: 0;\n }\n\n .p {\n stroke-dashoffset: 234px;\n stroke-dasharray: 234px;\n transition-delay: 0s;\n }\n\n .a {\n stroke-dashoffset: 190px;\n stroke-dasharray: 190px;\n transition-delay: 0.1s;\n }\n\n .d {\n stroke-dashoffset: 232px;\n stroke-dasharray: 232px;\n transition-delay: 0.2s;\n }\n\n .l {\n stroke-dashoffset: 155px;\n stroke-dasharray: 155px;\n transition-delay: 0.3s;\n }\n\n .o {\n stroke-dashoffset: 168px;\n stroke-dasharray: 168px;\n transition-delay: 0.4s;\n }\n\n .c {\n stroke-dashoffset: 237px;\n stroke-dasharray: 237px;\n transition-delay: 0.5s;\n }\n `\n ];\n\n _logo() {\n return svg`\n \n \n\n \n \n \n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n `;\n }\n render() {\n return html`\n ${this._logo()}\n `;\n }\n}\n","import { Org, OrgMember, OrgRole, Group } from \"@padloc/core/src/org\";\nimport { VaultID } from \"@padloc/core/src/vault\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { mixins } from \"../styles\";\nimport { app } from \"../globals\";\nimport { confirm, choose } from \"../lib/dialog\";\nimport { element, html, css, property, query } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport \"./icon\";\nimport \"./toggle-button\";\nimport \"./group-item\";\nimport \"./member-item\";\nimport \"./vault-item\";\n\ntype InputType = { member: OrgMember; org: Org };\n\n@element(\"pl-member-dialog\")\nexport class MemberDialog extends Dialog {\n @property()\n org: Org | null = null;\n\n @property()\n member: OrgMember | null = null;\n\n @query(\"#saveButton\")\n private _saveButton: LoadingButton;\n\n @property()\n private _error: string = \"\";\n\n private _vaults = new Map();\n private _groups = new Set();\n\n private _getCurrentVaults(): Map {\n const vaults = new Map();\n\n if (!this.org || !this.member) {\n return vaults;\n }\n\n for (const vault of this.org.vaults) {\n const v = this.member && this.member.vaults.find(v => v.id === vault!.id);\n vaults.set(vault.id, {\n read: !!v,\n write: !!v && !v.readonly\n });\n }\n\n return vaults;\n }\n\n private _getCurrentGroups() {\n return this.org && this.member\n ? new Set(this.org.getGroupsForMember(this.member).map(g => g.name))\n : new Set();\n }\n\n private get _hasChanged() {\n if (!this.org || !this.member) {\n return false;\n }\n\n const currentVaults = this._getCurrentVaults();\n const vaultsChanged = this.org.vaults.some(({ id }) => {\n const c = currentVaults.get(id)!;\n const s = this._vaults.get(id)!;\n return c.read !== s.read || c.write !== s.write;\n });\n\n const currentGroups = this._getCurrentGroups();\n const groupsChanged =\n currentGroups.size !== this._groups.size ||\n [...this._groups.values()].some(name => !currentGroups.has(name));\n\n return vaultsChanged || groupsChanged;\n }\n\n async show({ member, org }: InputType): Promise {\n this.member = member;\n this.org = org;\n this._groups = this._getCurrentGroups();\n this._vaults = this._getCurrentVaults();\n this._error = \"\";\n await this.updateComplete;\n return super.show();\n }\n\n _toggleGroup(group: Group) {\n if (this._groups.has(group.name)) {\n this._groups.delete(group.name);\n } else {\n this._groups.add(group.name);\n }\n this.requestUpdate();\n }\n\n private _toggleVault({ id }: { id: VaultID }) {\n const { read } = this._vaults.get(id)!;\n this._vaults.set(id, read ? { read: false, write: false } : { read: true, write: true });\n this.requestUpdate();\n }\n\n private _toggleRead({ id }: { id: VaultID }, event?: Event) {\n if (event) {\n event.stopImmediatePropagation();\n }\n\n const sel = this._vaults.get(id)!;\n sel.read = !sel.read;\n if (!sel.read) {\n sel.write = false;\n }\n\n this.requestUpdate();\n }\n\n private _toggleWrite({ id }: { id: VaultID }, event?: Event) {\n if (event) {\n event.stopImmediatePropagation();\n }\n\n const sel = this._vaults.get(id)!;\n sel.write = !sel.write;\n if (sel.write) {\n sel.read = true;\n }\n\n this.requestUpdate();\n }\n\n private async _save() {\n if (this._saveButton.state === \"loading\") {\n return;\n }\n\n this._error = \"\";\n this._saveButton.start();\n\n const vaults = [...this._vaults.entries()]\n .filter(([, { read }]) => read)\n .map(([id, { write }]) => ({ id, readonly: !write }));\n\n try {\n await app.updateMember(this.org!, this.member!, {\n vaults,\n groups: [...this._groups]\n });\n this._saveButton.success();\n this.done();\n } catch (e) {\n this._saveButton.fail();\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n throw e;\n }\n }\n\n private async _showOptions() {\n const isAdmin = this.member!.role === OrgRole.Admin;\n\n this.open = false;\n const choice = await choose(\n \"\",\n [$l(\"Remove\"), $l(\"Suspend\"), isAdmin ? $l(\"Remove Admin\") : $l(\"Make Admin\")],\n {\n hideIcon: true,\n type: \"destructive\"\n }\n );\n\n switch (choice) {\n case 0:\n this._removeMember();\n break;\n case 1:\n this._suspendMember();\n break;\n case 2:\n isAdmin ? this._removeAdmin() : this._makeAdmin();\n break;\n default:\n this.open = true;\n }\n }\n\n private async _removeMember() {\n this.open = false;\n const confirmed = await confirm(\n $l(\"Are you sure you want to remove this member from this organization?\"),\n $l(\"Remove\"),\n $l(\"Cancel\"),\n {\n type: \"destructive\",\n title: $l(\"Remove Member\")\n }\n );\n this.open = true;\n\n if (confirmed) {\n this._saveButton.start();\n\n try {\n await app.removeMember(this.org!, this.member!);\n\n this._saveButton.success();\n this.done();\n } catch (e) {\n this._saveButton.fail();\n throw e;\n }\n }\n }\n\n private async _makeAdmin() {\n this.open = false;\n\n const confirmed = await confirm(\n $l(\n \"Are you sure you want to make this member an admin? \" +\n \"Admins can manage vaults, groups and permissions.\"\n ),\n $l(\"Make Admin\"),\n $l(\"Cancel\")\n );\n\n this.open = true;\n\n if (confirmed) {\n this._saveButton.start();\n\n try {\n this.member = await app.updateMember(this.org!, this.member!, { role: OrgRole.Admin });\n this._saveButton.success();\n } catch (e) {\n this._saveButton.fail();\n throw e;\n }\n }\n }\n\n private async _removeAdmin() {\n this.open = false;\n\n const confirmed = await confirm(\n $l(\"Are you sure you want to remove this member as admin?\"),\n $l(\"Remove Admin\"),\n $l(\"Cancel\"),\n { type: \"destructive\" }\n );\n\n this.open = true;\n\n if (confirmed) {\n this._saveButton.start();\n\n try {\n this.member = await app.updateMember(this.org!, this.member!, { role: OrgRole.Member });\n this._saveButton.success();\n } catch (e) {\n this._saveButton.fail();\n throw e;\n }\n }\n }\n\n private async _suspendMember() {\n this.open = false;\n\n const confirmed = await confirm(\n $l(\"Are you sure you want to suspend this member?\"),\n $l(\"Suspend Member\"),\n $l(\"Cancel\"),\n { type: \"destructive\" }\n );\n\n this.open = true;\n\n if (confirmed) {\n this._saveButton.start();\n\n try {\n this.member = await app.updateMember(this.org!, this.member!, { role: OrgRole.Suspended });\n this._saveButton.success();\n this.done();\n } catch (e) {\n this._saveButton.fail();\n throw e;\n }\n }\n }\n\n shouldUpdate() {\n return !!this.org && !!this.member;\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: var(--color-quaternary);\n }\n\n pl-toggle-button {\n display: block;\n padding: 0 15px 0 0;\n }\n\n .more-button {\n font-size: var(--font-size-small);\n align-self: flex-start;\n width: 30px;\n height: 30px;\n margin-top: 5px;\n }\n\n .subheader {\n margin: 8px;\n font-weight: bold;\n display: flex;\n align-items: flex-end;\n padding: 0 8px;\n font-size: var(--font-size-small);\n }\n\n .subheader .permission {\n width: 50px;\n font-size: var(--font-size-tiny);\n text-align: center;\n ${mixins.ellipsis()}\n }\n\n .item {\n display: flex;\n align-items: center;\n }\n\n .item pl-toggle {\n margin-right: 14px;\n }\n `\n ];\n\n renderContent() {\n const org = this.org!;\n const member = this.member!;\n const accountIsOwner = org.isOwner(app.account!);\n const accountIsAdmin = org.isAdmin(app.account!);\n const memberIsOwner = org.isOwner(member);\n\n return html`\n
    \n \n \n
    \n\n
    \n
    \n
    ${$l(\"Groups\")}
    \n
    \n\n ${org.groups.map(\n group => html`\n this._toggleGroup(group)}\n .active=${this._groups.has(group.name)}\n >\n \n \n `\n )}\n\n
    \n
    ${$l(\"Vaults\")}
    \n
    \n
    ${$l(\"read\")}
    \n
    ${$l(\"write\")}
    \n
    \n\n ${org.vaults.map(\n vault => html`\n
    this._toggleVault(vault)} ?disabled=${!accountIsAdmin}>\n \n this._toggleRead(vault, e)}\n >\n this._toggleWrite(vault, e)}\n >\n
    \n `\n )}\n\n
    \n ${this._error}\n
    \n
    \n\n
    \n
    \n \n ${$l(\"Save\")}\n \n\n \n
    \n
    \n `;\n }\n}\n","import { Org, OrgMember, OrgRole } from \"@padloc/core/src/org\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { shared } from \"../styles\";\nimport { BaseElement, element, html, css, property } from \"./base\";\nimport \"./randomart\";\nimport \"./icon\";\n\n@element(\"pl-member-item\")\nexport class MemberItem extends BaseElement {\n @property()\n member: OrgMember;\n\n @property()\n org: Org;\n\n @property()\n hideRole: boolean = false;\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n align-items: center;\n padding: 8px;\n }\n\n pl-fingerprint {\n color: var(--color-secondary);\n --color-background: var(--color-tertiary);\n width: 45px;\n height: 45px;\n border-radius: 100%;\n border: solid 1px var(--border-color);\n margin-right: 8px;\n }\n\n .member-info {\n flex: 1;\n width: 0;\n }\n\n .name-wrapper {\n display: flex;\n }\n\n .name-wrapper > .tags {\n margin: 0 0 0 4px;\n }\n\n .member-name {\n font-weight: bold;\n flex: 1;\n width: 0;\n }\n\n .member-email {\n font-size: 90%;\n }\n `\n ];\n\n render() {\n const isAdmin = this.member.role === OrgRole.Admin;\n const isOwner = this.member.role === OrgRole.Owner;\n const isSuspended = this.member.role === OrgRole.Suspended;\n const groups = (this.org && this.org.getGroupsForMember(this.member).filter(g => g.name !== \"Everyone\")) || [];\n\n return html`\n \n\n
    \n
    \n
    ${this.member.name}
    \n\n
    \n ${groups.map(\n group => html`\n
    \n \n ${group.name}\n
    \n `\n )}\n ${!this.hideRole && isOwner\n ? html`\n
    ${$l(\"Owner\")}
    \n `\n : !this.hideRole && isAdmin\n ? html`\n
    ${$l(\"Admin\")}
    \n `\n : !this.hideRole && isSuspended\n ? html`\n
    ${$l(\"Suspended\")}
    \n `\n : \"\"}\n
    \n
    \n\n
    ${this.member.email}
    \n
    \n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { PlanType, SubscriptionStatus } from \"@padloc/core/src/billing\";\nimport { ErrorCode } from \"@padloc/core/src/error\";\nimport { Vault } from \"@padloc/core/src/vault\";\nimport { app, router } from \"../globals\";\nimport { shared, mixins } from \"../styles\";\nimport { dialog, alert } from \"../lib/dialog\";\nimport { StateMixin } from \"../mixins/state\";\nimport { BaseElement, element, property, html, css } from \"./base\";\nimport \"./logo\";\nimport \"./spinner\";\nimport { ReportErrorsDialog } from \"./report-errors-dialog\";\n\n@element(\"pl-menu\")\nexport class Menu extends StateMixin(BaseElement) {\n @property()\n selected: string = \"items\";\n\n @dialog(\"pl-report-errors-dialog\")\n _reportErrorsDialog: ReportErrorsDialog;\n\n private _goTo(path: string, params?: any) {\n this.dispatch(\"toggle-menu\");\n router.go(path, params);\n }\n\n private _lock() {\n this.dispatch(\"toggle-menu\");\n app.lock();\n }\n\n private _getPremium(e?: MouseEvent) {\n e && e.stopPropagation();\n this.dispatch(\"get-premium\");\n this.dispatch(\"toggle-menu\");\n }\n\n private _reportErrors() {\n this._reportErrorsDialog.show();\n }\n\n private _displayVaultError(vault: Vault, e?: Event) {\n e && e.stopPropagation();\n\n const error = vault.error!;\n\n switch (error.code) {\n case ErrorCode.UNSUPPORTED_VERSION:\n alert(\n $l(\n \"A newer version of Padloc is required to synchronize this vault. Please update to the latest version now!\"\n ),\n {\n title: \"Update Required\",\n type: \"warning\"\n }\n );\n return;\n case ErrorCode.MISSING_ACCESS:\n alert($l(\"This vault could not be synchronized because you no longer have access to it.\"), {\n title: \"Sync Failed\",\n type: \"warning\"\n });\n return;\n default:\n alert(\n error.message ||\n $l(\n \"An unknown error occured while synchronizing this vault. If this problem persists please contact customer support.\"\n ),\n {\n title: \"Sync Failed\",\n type: \"warning\"\n }\n );\n return;\n }\n }\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n flex-direction: column;\n color: var(--color-tertiary);\n font-size: var(--font-size-small);\n }\n\n .scroller {\n flex: 1;\n height: 0;\n ${mixins.scroll()}\n padding: 10px 0;\n }\n\n li {\n background: transparent;\n border: none;\n display: flex;\n align-items: center;\n height: 40px;\n margin: 2px 10px;\n padding-right: 10px;\n border-radius: 8px;\n overflow: hidden;\n height: 40px;\n font-weight: 600;\n --color-highlight: var(--color-tertiary);\n --color-foreground: var(--color-secondary);\n }\n\n li:not(.sub-item) {\n margin-top: 8px;\n }\n\n li[selected] {\n background: var(--color-highlight);\n box-shadow: rgba(0, 0, 0, 0.1) 0 1px 1px;\n color: var(--color-foreground);\n font-weight: bold;\n }\n\n li div {\n flex: 1;\n ${mixins.ellipsis()}\n }\n\n h3 {\n font-size: 100%;\n margin-top: 30px;\n padding: 0 20px;\n opacity: 0.8;\n font-weight: normal;\n }\n\n .sub-item {\n height: 35px;\n font-size: var(--font-size-tiny);\n margin-left: 20px;\n }\n\n .sub-item pl-icon {\n width: 30px;\n height: 30px;\n font-size: 90%;\n }\n\n .favorites,\n .host {\n --color-highlight: var(--color-negative);\n --color-foreground: var(--color-tertiary);\n }\n\n .vault {\n --color-highlight: var(--color-primary);\n --color-foreground: var(--color-tertiary);\n }\n\n .new {\n opacity: 0.6;\n }\n\n pl-logo {\n height: 30px;\n margin: 15px auto 0 auto;\n opacity: 0.25;\n }\n\n .version {\n text-align: center;\n margin-bottom: 15px;\n font-size: var(--font-size-micro);\n font-weight: 600;\n opacity: 0.3;\n }\n\n .no-tags {\n font-size: var(--font-size-micro);\n padding: 0 20px;\n opacity: 0.5;\n width: 100px;\n }\n\n .footer {\n padding: 5px;\n display: flex;\n align-items: center;\n box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 15px 0px;\n z-index: 1;\n }\n\n .footer pl-icon {\n width: 30px;\n height: 30px;\n font-size: var(--font-size-tiny);\n }\n\n .syncing {\n width: 20px;\n height: 20px;\n margin: 5px;\n }\n\n .get-premium {\n background: var(--color-negative);\n }\n\n li .detail {\n margin-left: 2px;\n flex: none;\n opacity: 0.7;\n font-weight: semi-bold;\n padding: 2px 6px;\n margin-right: -4px;\n opacity: 1;\n border-radius: var(--border-radius);\n display: flex;\n }\n\n li .detail pl-icon {\n height: 20px;\n width: 20px;\n }\n\n .detail.warning {\n color: white;\n opacity: 1;\n background: var(--color-negative);\n }\n\n .separator {\n height: 2px;\n background: var(--color-shade-2);\n border-radius: 100%;\n margin: 8px 16px;\n }\n\n .errors-button {\n background: var(--color-negative);\n padding: 0;\n padding-right: 8px;\n display: flex;\n align-items: center;\n font-weight: bold;\n }\n\n .subsection-header {\n margin: 12px 8px 6px 26px;\n opacity: 0.7;\n font-size: var(--font-size-tiny);\n }\n\n @supports (-webkit-overflow-scrolling: touch) {\n pl-logo {\n margin-top: max(env(safe-area-inset-top), 15px);\n }\n\n .footer {\n padding-bottom: max(calc(env(safe-area-inset-bottom) / 3), 5px);\n padding-left: max(calc(env(safe-area-inset-bottom) / 3), 5px);\n }\n }\n `\n ];\n\n render() {\n const mainVault = app.mainVault;\n const account = app.account;\n\n if (!mainVault || !account) {\n return html``;\n }\n\n const itemsQuota = app.getItemsQuota();\n\n const tags = app.state.tags;\n\n const count = app.count;\n\n const showSettingsWarning =\n app.billingEnabled &&\n account.billing &&\n (!account.billing.subscription || account.billing.subscription.status === SubscriptionStatus.Inactive);\n\n const showUpgradeButton =\n app.billingEnabled &&\n (!account.billing ||\n !account.billing.subscription ||\n account.billing.subscription.plan.type === PlanType.Free) &&\n itemsQuota !== -1;\n\n return html`\n
    \n \n\n
    v${process.env.PL_VERSION}
    \n\n
    \n\n
    \n `\n : itemsQuota !== -1\n ? html`\n
    \n ${mainVault.items.size} / ${itemsQuota}\n
    \n `\n : html`\n
    \n ${mainVault.items.size}\n
    \n `}\n
  • \n\n ${app.orgs.map(org => {\n const vaults = app.vaults.filter(v => v.org && v.org.id === org.id);\n\n return html`\n
    \n
    ${org.name}
    \n ${vaults.map(vault => {\n return html`\n this._goTo(\"items\", { vault: vault.id })}\n ?selected=${this.selected === `vault/${vault.id}`}\n >\n \n
    ${vault.name}
    \n\n ${vault.error\n ? html`\n this._displayVaultError(vault, e)}\n >\n \n
    \n `\n : html`\n
    \n ${vault.items.size}\n
    \n `}\n \n `;\n })}\n \n `;\n })}\n\n
    \n
    ${$l(\"Tags\")}
    \n ${tags.map(\n ([tag, count]) => html`\n this._goTo(\"items\", { tag })}\n ?selected=${this.selected === `tag/${tag}`}\n >\n \n\n
    ${tag}
    \n\n
    ${count}
    \n \n `\n )}\n
    \n\n
  • this.dispatch(\"create-item\")}>\n \n\n
    ${$l(\"New Vault Item\")}
    \n
  • \n\n
    \n\n
  • this._goTo(\"orgs\")}>\n \n\n
    \n ${$l(\"Orgs & Teams\")}\n
    \n
  • \n\n ${app.orgs.map(\n org => html`\n this._goTo(`orgs/${org.id}`)}\n >\n \n\n
    ${org.name}
    \n\n
    \n \n
    \n \n `\n )}\n\n
  • this.dispatch(\"create-org\")}>\n \n\n
    ${$l(\"New Organization\")}
    \n
  • \n\n
    \n\n this._goTo(\"settings\")}\n ?selected=${this.selected === \"settings\"}\n >\n \n\n
    ${$l(\"Settings\")}
    \n\n
    \n \n
    \n \n\n
  • \n \n\n
    ${$l(\"Get Premium\")}
    \n
  • \n \n \n \n\n
    \n \n app.synchronize()}>\n
    \n \n \n
    \n `;\n }\n}\n","import { Vault } from \"@padloc/core/src/vault\";\nimport { VaultItem } from \"@padloc/core/src/item\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { app } from \"../globals\";\nimport { element, property, html, css, query } from \"./base\";\nimport { Select } from \"./select\";\nimport { Dialog } from \"./dialog\";\n\n@element(\"pl-move-items-dialog\")\nexport class MoveItemsDialog extends Dialog<{ vault: Vault; item: VaultItem }[], VaultItem[]> {\n @property()\n items: { vault: Vault; item: VaultItem }[] = [];\n @property()\n vaults: Vault[] = [];\n\n @query(\"#vaultSelect\")\n private _vaultSelect: Select;\n\n static styles = [\n ...Dialog.styles,\n css`\n pl-input,\n pl-select {\n text-align: center;\n margin: 12px;\n }\n\n .actions {\n margin: 12px;\n grid-gap: 12px;\n }\n\n h1 {\n display: block;\n text-align: center;\n }\n\n .message {\n margin: 8px;\n text-align: center;\n }\n `\n ];\n\n renderContent() {\n const itemsDescription =\n this.items.length === 1 ? `'${this.items[0].item.name}'` : $l(\"{0} Items\", this.items.length.toString());\n\n return html`\n

    ${$l(\"Move {0} To\", itemsDescription)}

    \n\n
    \n ${$l(\"No target vaults available!\")}\n
    \n\n \n \n\n
    \n \n \n
    \n `;\n }\n\n private async _enter() {\n this.done(\n await app.moveItems(\n this.items.map(i => i.item),\n this._vaultSelect.selected!\n )\n );\n }\n\n async show(items: { vault: Vault; item: VaultItem }[]) {\n this.items = items;\n const sourceVaults = this.items.reduce((sv, i) => sv.add(i.vault), new Set());\n this.vaults =\n sourceVaults.size === 1\n ? app.vaults.filter(v => app.hasWritePermissions(v) && v !== sourceVaults.values().next().value)\n : app.vaults.filter(v => app.hasWritePermissions(v));\n // this._vaultSelect.options = vaults;\n await this.updateComplete;\n this._vaultSelect.selected = this.vaults[0];\n return super.show();\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { Invite } from \"@padloc/core/src/invite\";\nimport { OrgMember, OrgRole, Group } from \"@padloc/core/src/org\";\nimport { BillingInfo } from \"@padloc/core/src/billing\";\nimport { StateMixin } from \"../mixins/state\";\nimport { mixins } from \"../styles\";\nimport { dialog, alert, choose, confirm, prompt } from \"../lib/dialog\";\nimport { app, router } from \"../globals\";\nimport { element, html, css, property, query, observe } from \"./base\";\nimport { View } from \"./view\";\nimport { Input } from \"./input\";\nimport { VaultDialog } from \"./vault-dialog\";\nimport { GroupDialog } from \"./group-dialog\";\nimport { MemberDialog } from \"./member-dialog\";\nimport { CreateInvitesDialog } from \"./create-invites-dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport \"./billing-info\";\nimport \"./subscription\";\nimport \"./member-item\";\nimport \"./group-item\";\nimport \"./vault-item\";\nimport \"./invite-item\";\nimport \"./icon\";\n\n@element(\"pl-org-view\")\nexport class OrgView extends StateMixin(View) {\n @property()\n orgId: string = \"\";\n\n @query(\"#filterMembersInput\")\n private _filterMembersInput: Input;\n\n @query(\"#rotateKeysButton\")\n private _rotateKeysButton: LoadingButton;\n\n @dialog(\"pl-vault-dialog\")\n private _vaultDialog: VaultDialog;\n\n @dialog(\"pl-group-dialog\")\n private _groupDialog: GroupDialog;\n\n @dialog(\"pl-member-dialog\")\n private _memberDialog: MemberDialog;\n\n @dialog(\"pl-create-invites-dialog\")\n private _createInvitesDialog: CreateInvitesDialog;\n\n private get _org() {\n return app.getOrg(this.orgId);\n }\n\n @property()\n private _page: \"members\" | \"groups\" | \"vaults\" | \"invites\" | \"settings\" = \"members\";\n\n @property()\n private _membersFilter: string = \"\";\n\n private async _createInvite() {\n const invites = await this._createInvitesDialog.show(this._org!);\n if (invites) {\n if (invites.length === 1) {\n router.go(`invite/${invites[0].org!.id}/${invites[0].id}`);\n } else {\n alert($l(\"Successfully created {0} invites!\", invites.length.toString()));\n this._page = \"invites\";\n }\n }\n }\n\n private _showInvite(invite: Invite) {\n router.go(`invite/${invite.org!.id}/${invite.id}`);\n }\n\n private async _createVault() {\n await this._vaultDialog.show({ org: this._org!, vault: null });\n }\n\n private async _showGroup(group: Group) {\n await this._groupDialog.show({ org: this._org!, group });\n }\n\n private async _createGroup() {\n await this._groupDialog.show({ org: this._org!, group: null });\n }\n\n private async _showVault(vault: { id: string; name: string }) {\n await this._vaultDialog.show({ org: this._org!, vault: vault });\n }\n\n private _updateMembersFilter() {\n this._membersFilter = this._filterMembersInput.value;\n }\n\n private async _showMember(member: OrgMember) {\n const org = this._org!;\n\n if (member.role === OrgRole.Suspended) {\n if (!org.isOwner(app.account!)) {\n return;\n }\n\n const invite = org.invites.find(invite => invite.email === member.email);\n\n if (invite) {\n this._showInvite(invite);\n } else {\n const choice = await choose(\"\", [$l(\"Remove Member\"), $l(\"Unsuspend\")], { type: \"destructive\" });\n\n switch (choice) {\n case 0:\n const confirmed = await confirm(\n $l(\"Are you sure you want to remove this member from this organization?\"),\n $l(\"Remove\"),\n $l(\"Cancel\"),\n {\n type: \"destructive\",\n title: $l(\"Remove Member\")\n }\n );\n\n if (confirmed) {\n await app.removeMember(org, member);\n }\n break;\n case 1:\n const [invite] = await app.createInvites(org, [member.email], \"confirm_membership\");\n router.go(`invite/${invite.org!.id}/${invite.id}`);\n break;\n }\n }\n } else {\n await this._memberDialog.show({ org: org, member });\n }\n }\n\n private async _deleteOrg() {\n const deleted = await prompt(\n $l(\n \"Are you sure you want to delete this organization? \" +\n \"All associated vaults and the data within them will be lost! \" +\n \"This action can not be undone.\"\n ),\n {\n type: \"destructive\",\n title: $l(\"Delete Organization\"),\n confirmLabel: $l(\"Delete\"),\n placeholder: $l(\"Type 'DELETE' to confirm\"),\n validate: async val => {\n if (val !== \"DELETE\") {\n throw $l(\"Type 'DELETE' to confirm\");\n }\n\n await app.deleteOrg(this._org!.id);\n\n return val;\n }\n }\n );\n\n if (deleted) {\n router.go(\"\");\n alert(\"Organization deleted successfully.\", { type: \"success\" });\n }\n }\n\n private async _changeName() {\n await prompt(\"\", {\n title: $l(\"Rename Organization\"),\n confirmLabel: $l(\"Save\"),\n label: $l(\"Company Name\"),\n value: this._org!.name,\n validate: async name => {\n if (!name) {\n throw $l(\"Please enter a name!\");\n }\n\n await app.updateOrg(this._org!.id, async org => (org.name = name));\n\n return name;\n }\n });\n }\n\n private async _rotateKeys() {\n if (this._rotateKeysButton.state === \"loading\") {\n return;\n }\n\n const confirmed = await confirm(\n $l(\n \"Do you want to rotate this organizations cryptographic keys? All organization \" +\n \"memberships will have to be reconfirmed but no data will be lost.\"\n ),\n $l(\"Confirm\")\n );\n\n if (!confirmed) {\n return;\n }\n\n this._rotateKeysButton.start();\n\n try {\n await app.rotateOrgKeys(this._org!);\n this._rotateKeysButton.success();\n alert(\n $l(\n \"The organizations cryptographic keys have been rotated successfully and \" +\n \"membership confirmation requests for all members have been sent out.\"\n ),\n { type: \"success\" }\n );\n } catch (e) {\n this._rotateKeysButton.fail();\n alert(e.message || $l(\"Something went wrong. Please try again later!\"), { type: \"warning\" });\n }\n }\n\n @observe(\"orgId\")\n _orgChanged() {\n this._page = \"members\";\n this._clearMembersFilter();\n }\n\n private _clearMembersFilter() {\n this._membersFilter = this._filterMembersInput.value = \"\";\n }\n\n shouldUpdate() {\n return !!this._org;\n }\n\n static styles = [\n ...View.styles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n background: var(--color-quaternary);\n border-radius: var(--border-radius);\n }\n\n .wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n max-width: 500px;\n margin: 0 auto;\n }\n\n .subview {\n position: relative;\n ${mixins.fullbleed()}\n ${mixins.scroll()}\n }\n\n header {\n display: block;\n border: none;\n }\n\n .header-inner {\n display: flex;\n align-items: center;\n margin-bottom: 10px;\n }\n\n .header-inner .title {\n text-align: center;\n }\n\n header > .tabs {\n margin: -10px;\n }\n\n .tabs .spacer {\n padding: 0;\n }\n\n .new-button {\n display: flex;\n font-weight: bold;\n align-items: center;\n justify-content: center;\n padding: 8px;\n }\n\n .new-button > pl-icon {\n font-size: 80%;\n width: 30px;\n height: 30px;\n }\n\n .settings {\n padding: 8px;\n }\n\n .settings > button,\n .settings > pl-loading-button {\n text-align: center;\n display: block;\n font-weight: bold;\n }\n\n .settings .item {\n margin: 8px 0;\n }\n\n .settings h3 {\n margin: 18px 8px 12px 8px;\n text-align: center;\n }\n\n .settings button {\n width: 100%;\n }\n\n .error.item button {\n width: 100%;\n margin-top: 8px;\n }\n `\n ];\n\n render() {\n const org = this._org!;\n const isOwner = org.isOwner(app.account!);\n const isAdmin = isOwner || org.isAdmin(app.account!);\n const invites = org.invites;\n const groups = org.groups;\n const vaults = org.vaults;\n const memFilter = this._membersFilter.toLowerCase();\n const members = memFilter\n ? org.members.filter(\n ({ name, email }) => email.toLowerCase().includes(memFilter) || name.toLowerCase().includes(memFilter)\n )\n : org.members;\n\n const billing = org.billing || Object.assign(new BillingInfo(), { org: org.id });\n\n return html`\n
    \n
    \n this.dispatch(\"toggle-menu\")}>\n
    ${org.name}
    \n \n
    \n\n
    \n
    \n\n
    (this._page = \"members\")}>\n \n
    ${$l(\"Members\")}
    \n
    \n\n (this._page = \"groups\")}\n ?hidden=${!org.groups.length && !org.quota.groups}\n >\n \n
    ${$l(\"Groups\")}
    \n
    \n\n
    (this._page = \"vaults\")}>\n \n
    ${$l(\"Vaults\")}
    \n
    \n\n (this._page = \"settings\")}\n ?hidden=${!isOwner}\n >\n \n
    ${$l(\"Settings\")}
    \n \n\n
    \n \n
    \n\n
    \n
    \n
    \n ${org.frozen\n ? html`\n
    \n ${$l(\n \"This organization currently does not have an active subscription \" +\n 'and has been put in \"frozen\" state as a result. While in this state, ' +\n \"you won't be able to make any changes to members, groups or vaults of this \" +\n \"organization.\"\n )}\n \n
    \n `\n : \"\"}\n\n
    \n \n \n \n
    \n
      \n \n \n
      ${$l(\"Invite New Members\")}
      \n \n\n ${invites.map(\n inv => html`\n
    • this._showInvite(inv)}>\n \n
    • \n `\n )}\n ${members.map(\n member => html`\n
    • this._showMember(member)}>\n \n
    • \n `\n )}\n\n
    • \n \n
      ${$l(\"Invite New Members\")}
      \n
    • \n
    \n
    \n\n
    \n ${org.frozen\n ? html`\n
    \n ${$l(\n \"This organization currently does not have an active subscription \" +\n 'and has been put in \"frozen\" state as a result. While in this state, ' +\n \"you won't be able to make any changes to members, groups or vaults of this \" +\n \"organization.\"\n )}\n \n
    \n `\n : \"\"}\n
      \n ${groups.map(\n group => html`\n
    • this._showGroup(group)} class=\"item tap\">\n \n
    • \n `\n )}\n
    • \n \n
      ${$l(\"New Group\")}
      \n
    • \n
    \n
    \n\n
    \n ${org.frozen\n ? html`\n
    \n ${$l(\n \"This organization currently does not have an active subscription \" +\n 'and has been put in \"frozen\" state as a result. While in this state, ' +\n \"you won't be able to make any changes to members, groups or vaults of this \" +\n \"organization.\"\n )}\n \n
    \n `\n : \"\"}\n
      \n ${vaults.map(\n vault => html`\n
    • this._showVault(vault)} class=\"item tap\">\n \n
    • \n `\n )}\n
    • \n \n
      ${$l(\"New Vault\")}
      \n
    • \n
    \n
    \n\n
    \n ${org.frozen\n ? html`\n
    \n ${$l(\n \"This organization currently does not have an active subscription \" +\n 'and has been put in \"frozen\" state as a result. While in this state, ' +\n \"you won't be able to make any changes to members, groups or vaults of this \" +\n \"organization.\"\n )}\n
    \n `\n : \"\"}\n ${app.billingEnabled\n ? html`\n

    ${$l(\"Subscription\")}

    \n\n \n\n

    ${$l(\"Billing Info\")}

    \n\n \n `\n : \"\"}\n\n

    ${$l(\"Security\")}

    \n\n ${$l(\"Rotate Cryptographic Keys\")}\n\n

    ${$l(\"General\")}

    \n\n \n\n \n
    \n
    \n
    \n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { StateMixin } from \"../mixins/state\";\nimport { app, router } from \"../globals\";\nimport { element, html, css } from \"./base\";\nimport { View } from \"./view\";\nimport \"./icon\";\n\n@element(\"pl-orgs-list\")\nexport class OrgsList extends StateMixin(View) {\n static styles = [\n ...View.styles,\n css`\n :host {\n background: var(--color-quaternary);\n display: flex;\n flex-direction: column;\n }\n\n .orgs {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n grid-gap: 12px;\n margin: 12px;\n }\n\n .orgs > * {\n margin: 0;\n }\n\n .org {\n padding: 16px;\n display: flex;\n align-items: center;\n }\n\n .org-icon {\n font-size: 120%;\n margin-right: 12px;\n background: #eee;\n border: solid 1px #ddd;\n width: 50px;\n height: 50px;\n }\n\n .org .tags {\n margin: 4px 0;\n }\n\n .org-name {\n font-weight: bold;\n margin-bottom: 4px;\n font-size: 120%;\n font-weight: 600;\n }\n\n .org-info {\n flex: 1;\n width: 0;\n }\n\n .new-org {\n background: none;\n border: dashed 1px;\n font-weight: bold;\n }\n `\n ];\n\n render() {\n return html`\n
    \n this.dispatch(\"toggle-menu\")}>\n\n
    ${$l(\"Orgs & Teams\")}
    \n\n \n
    \n\n
    \n
    \n ${app.orgs.map(\n org => html`\n
    router.go(`orgs/${org.id}`)}>\n \n\n
    \n
    ${org.name}
    \n\n
    \n
    \n \n\n
    ${org.members.length}
    \n
    \n\n
    \n \n\n
    ${org.groups.length}
    \n
    \n\n
    \n \n\n
    ${org.vaults.length}
    \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n `\n )}\n
    \n\n
    \n \n\n
    \n ${$l(\n \"Organizations allow you to securely share passwords, documents and other data \" +\n \"within your family, team or any other kind of group!\"\n )}\n
    \n\n \n
    \n\n
    \n
    \n\n this.dispatch(\"create-org\")}>\n
    \n
    \n `;\n }\n}\n","import { element, html, css } from \"./base\";\nimport { Input } from \"./input\";\nimport \"./icon\";\n\n@element(\"pl-password-input\")\nexport class PasswordInput extends Input {\n constructor() {\n super();\n this.type = \"password\";\n }\n\n static styles = [\n ...Input.styles,\n css`\n input {\n font-size: 120%;\n font-family: var(--font-family-mono);\n }\n\n .mask-icon {\n position: absolute;\n z-index: 1;\n right: 5px;\n top: 0;\n bottom: 0;\n margin: auto;\n opacity: 0.8;\n }\n `\n ];\n\n render() {\n return html`\n ${super.render()}\n\n \n \n `;\n }\n\n _toggleMasked() {\n this.type = this.type === \"password\" ? \"text\" : \"password\";\n }\n}\n","import { unsafeHTML } from \"lit-html/directives/unsafe-html\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { BillingInfo, Plan, PlanType, UpdateBillingParams } from \"@padloc/core/src/billing\";\nimport { dialog } from \"../lib/dialog\";\nimport { mixins } from \"../styles\";\nimport { app } from \"../globals\";\nimport { element, html, property, css, query } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport \"./card-input\";\nimport { BillingDialog } from \"./billing-dialog\";\n\n@element(\"pl-premium-dialog\")\nexport class PremiumDialog extends Dialog {\n @property()\n plan: Plan | null = null;\n\n @property()\n private _error = \"\";\n\n @property()\n private _updateBillingParams: UpdateBillingParams | null = null;\n\n @query(\"#submitButton\")\n private _submitButton: LoadingButton;\n\n @dialog(\"pl-billing-dialog\")\n private _billingDialog: BillingDialog;\n\n private async _submit() {\n if (this._submitButton.state === \"loading\") {\n return;\n }\n\n this._error = \"\";\n this._submitButton.start();\n\n const params =\n this._updateBillingParams ||\n new UpdateBillingParams({\n account: app.account!.id\n });\n\n params.plan = this.plan!.id;\n\n try {\n await app.updateBilling(params);\n this._submitButton.success();\n this.done();\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this._submitButton.fail();\n return;\n }\n }\n\n async show() {\n const result = super.show();\n const plan =\n app.state.billingProvider && app.state.billingProvider.plans.find(p => p.type === PlanType.Premium);\n if (plan) {\n this.plan = plan;\n this._error = \"\";\n this._updateBillingParams = null;\n } else {\n this.done();\n }\n return result;\n }\n\n private async _updateBillingInfo() {\n this.open = false;\n const billing = await this._billingDialog.show({\n billingInfo: Object.assign(new BillingInfo(), { account: app.account!.id })\n });\n if (billing) {\n this._updateBillingParams = billing;\n this._error = \"\";\n }\n this.open = true;\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n .plan {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .inner {\n background: var(--color-quaternary);\n text-align: center;\n }\n\n .plan-header {\n text-align: center;\n padding: 20px;\n /* background: linear-gradient(180deg, #59c6ff 0%, #077cb9 100%); */\n background: var(--color-highlight);\n color: var(--color-highlight-text);\n display: flex;\n flex-direction: column;\n position: relative;\n }\n\n .close-icon {\n position: absolute;\n top: 8px;\n right: 8px;\n }\n\n .plan-name {\n font-size: 2rem;\n margin-bottom: 10px;\n font-weight: bold;\n }\n\n .plan-trial {\n font-size: 1.5rem;\n margin-bottom: 10px;\n }\n\n .plan-then {\n font-size: var(--font-size-small);\n margin-bottom: 10px;\n }\n\n .plan-price {\n letter-spacing: 0.1em;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n font-weight: bold;\n font-size: 1.2rem;\n margin: 5px;\n }\n\n .plan-price-currency {\n line-height: 1em;\n margin-top: 0.4em;\n }\n\n .plan-price-dollars {\n font-size: 3em;\n line-height: 1em;\n }\n\n .plan-price-cents {\n font-size: 1.5em;\n line-height: 1em;\n margin-top: 0.2em;\n }\n\n .plan-unit {\n font-size: var(--font-size-small);\n margin-bottom: 15px;\n }\n\n .plan-fineprint {\n font-size: var(--font-size-tiny);\n opacity: 0.8;\n }\n\n .quantity {\n font-size: 1.6rem;\n margin-top: 20px;\n }\n\n pl-loading-button {\n font-weight: bold;\n }\n\n pl-loading-button.primary {\n margin: 8px;\n background: var(--color-highlight);\n color: var(--color-highlight-text);\n font-weight: bold;\n border-bottom: solid 3px var(--color-shade-2);\n }\n\n .error {\n color: var(--color-negative);\n padding: 8px;\n text-align: center;\n }\n\n .payment-method {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n font-weight: bold;\n margin-bottom: 0;\n }\n\n .change-plan {\n background: transparent;\n color: var(--color-tertiary);\n font-weight: bold;\n margin: 4px;\n }\n\n .features {\n font-size: var(--font-size-small);\n margin-top: 8px;\n flex: 1;\n ${mixins.scroll()}\n }\n\n .features > * {\n padding: 10px 15px;\n }\n\n .features > :not(:last-child) {\n border-bottom: solid 1px var(--color-shade-1);\n }\n `\n ];\n\n renderContent() {\n if (!this.plan || !app.account) {\n return html``;\n }\n\n const plan = this.plan;\n const monthlyPrice = Math.round(plan.cost / 12);\n const paymentMethod =\n (this._updateBillingParams && this._updateBillingParams.paymentMethod) ||\n (app.account.billing && app.account.billing.paymentMethod);\n\n const trialDaysLeft = app.account.billing ? app.account.billing.trialDaysLeft : 30;\n\n return html`\n \n
    \n this.done()}>\n\n
    \n ${plan.name}\n
    \n\n
    \n\n
    \n ${$l(\"Free For {0} Days\", trialDaysLeft.toString())}\n
    \n\n
    \n ${$l(\"then\")}\n
    \n\n
    \n
    $
    \n
    \n ${Math.floor(monthlyPrice / 100)}\n
    \n
    \n .${(monthlyPrice % 100).toString().padEnd(2, \"0\")}\n
    \n
    \n\n
    \n ${$l(\"per month\")}\n
    \n\n
    \n\n
    \n ${$l(\"USD, billed annually\")}\n
    \n
    \n\n
      \n ${plan.features.map(\n feature => html`\n
    • \n ${unsafeHTML(feature.replace(/\\*\\*(.+)\\*\\*/g, \"$1\"))}\n
    • \n `\n )}\n
    \n\n
    \n \n ${paymentMethod\n ? html`\n
    \n ${paymentMethod.name}\n
    \n `\n : html`\n
    \n ${$l(\"Add Billing Info\")}\n
    \n `}\n
    \n\n
    \n ${this._error}\n
    \n\n \n ${trialDaysLeft ? $l(\"Start Trial\") : $l(\"Buy Now\")}\n \n \n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { element, html, css, property, query } from \"./base\";\nimport { Input } from \"./input\";\nimport { LoadingButton } from \"./loading-button\";\nimport { Dialog } from \"./dialog\";\n\nconst defaultConfirmLabel = $l(\"OK\");\nconst defaultCancelLabel = $l(\"Cancel\");\nconst defaultType = \"text\";\nconst defaultPlaceholder = \"\";\n\nexport interface PromptOptions {\n title?: string;\n message?: string;\n placeholder?: string;\n label?: string;\n type?: string;\n pattern?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n preventDismiss?: boolean;\n validate?: (val: string, input: Input) => Promise;\n value?: string;\n preventAutoClose?: boolean;\n}\n\n@element(\"pl-prompt-dialog\")\nexport class PromptDialog extends Dialog {\n @property()\n confirmLabel: string = defaultConfirmLabel;\n @property()\n cancelLabel: string = defaultCancelLabel;\n @property()\n title: string = \"\";\n @property()\n message: string = \"\";\n @property()\n placeholder: string = defaultPlaceholder;\n @property()\n label: string = \"\";\n @property()\n preventDismiss: boolean = true;\n @property({ reflect: true })\n type: string = defaultType;\n @property()\n pattern: string = \"\";\n @property()\n validate?: (val: string, input: Input) => Promise;\n @property()\n private _validationMessage: string = \"\";\n\n @query(\"#confirmButton\")\n private _confirmButton: LoadingButton;\n @query(\"pl-input\")\n private _input: Input;\n\n static styles = [\n ...Dialog.styles,\n css`\n h1 {\n display: block;\n text-align: center;\n }\n\n .message {\n margin: 20px;\n text-align: center;\n }\n\n pl-input {\n text-align: center;\n margin: 8px;\n }\n\n .validation-message {\n position: relative;\n margin-top: 15px;\n font-weight: bold;\n font-size: var(--font-size-small);\n color: var(--color-error);\n text-shadow: none;\n text-align: center;\n }\n `\n ];\n\n renderContent() {\n return html`\n
    \n

    ${this.title}

    \n\n
    ${this.message}
    \n\n this._confirmButton.click()}\n >\n \n\n
    \n this._confirm()}\n >\n ${this.confirmLabel}\n \n\n \n
    \n
    \n `;\n }\n\n renderAfter() {\n return html`\n
    ${this._validationMessage}
    \n `;\n }\n\n done(val: string | null) {\n this._validationMessage = \"\";\n super.done(val);\n }\n\n async show({\n title = \"\",\n message = \"\",\n placeholder = defaultPlaceholder,\n label = \"\",\n value = \"\",\n type = defaultType,\n pattern = \"\",\n confirmLabel = defaultConfirmLabel,\n cancelLabel = defaultCancelLabel,\n preventDismiss = true,\n preventAutoClose = false,\n validate\n }: PromptOptions = {}) {\n this.title = title;\n this.message = message;\n this.type = type;\n this.pattern = pattern;\n this.placeholder = placeholder;\n this.label = label;\n this.confirmLabel = confirmLabel;\n this.cancelLabel = cancelLabel;\n this.preventDismiss = preventDismiss;\n this.preventAutoClose = preventAutoClose;\n this.validate = validate;\n this._validationMessage = \"\";\n await this.updateComplete;\n this._confirmButton.stop();\n this._input.value = value;\n\n setTimeout(() => this._input.focus(), 300);\n\n return super.show();\n }\n\n private async _confirm() {\n let val = this._input.value;\n if (this.validate) {\n this._confirmButton.start();\n try {\n val = await this.validate(val, this._input);\n this._confirmButton.success();\n this.done(val);\n } catch (e) {\n this.rumble();\n this._validationMessage = e;\n this._confirmButton.fail();\n }\n } else {\n this.done(val);\n }\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { scanQR, stopScanQR } from \"@padloc/core/src/platform\";\nimport { mixins } from \"../styles\";\nimport { alert } from \"../lib/dialog\";\nimport { element, html, css } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { View } from \"./view\";\nimport \"./icon\";\n\n@element(\"pl-qr-dialog\")\nexport class QRDialog extends Dialog {\n readonly hideApp = true;\n\n static styles = [\n ...Dialog.styles,\n ...View.styles,\n css`\n .inner {\n ${mixins.fullbleed()}\n border-radius: 0;\n max-width: 100%;\n display: flex;\n flex-direction: column;\n background: transparent;\n }\n\n .scrim {\n background: transparent;\n }\n\n .seeker {\n ${mixins.fullbleed()}\n width: 300px;\n height: 300px;\n border: solid 3px var(--color-negative);\n border-radius: var(--border-radius);\n margin: auto;\n }\n `\n ];\n\n renderContent() {\n return html`\n
    \n \n
    \n ${$l(\"Scan QR Code\")}\n
    \n this.done()}>\n
    \n \n
    \n `;\n }\n\n async show() {\n scanQR().then(\n (res: string) => this.done(res),\n (err: Error) => {\n this.done();\n alert($l(\"Failed to scan QR code. Error: \" + err.toString()), {\n type: \"warning\"\n });\n }\n );\n return super.show();\n }\n\n done(data?: string) {\n stopScanQR();\n super.done(data);\n }\n}\n","import { randomArt } from \"@padloc/core/src/randomart\";\nimport { getCryptoProvider as getProvider } from \"@padloc/core/src/platform\";\nimport { svg } from \"lit-html\";\nimport { until } from \"lit-html/directives/until\";\nimport { BaseElement, html, css, element, property } from \"./base\";\n\n@element(\"pl-fingerprint\")\nexport class Fingerprint extends BaseElement {\n @property()\n key!: Uint8Array;\n\n private async _grid() {\n const size = 11;\n const fingerprint = await getProvider().fingerprint(this.key);\n const art = randomArt(fingerprint, { width: size, height: size });\n const rects = [];\n for (const [x, line] of art.values.entries()) {\n for (const [y, val] of line.entries()) {\n rects.push(svg``);\n }\n }\n return svg`\n \n ${rects}\n \n `;\n }\n\n shouldUpdate() {\n return !!this.key;\n }\n\n static styles = [\n css`\n :host {\n display: block;\n width: 100px;\n height: 100px;\n position: relative;\n overflow: hidden;\n background: var(--color-background);\n color: var(--color-foreground);\n }\n\n svg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n pointer-events: none;\n }\n `\n ];\n\n render() {\n return html`\n ${until(this._grid())}\n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { ErrorCode } from \"@padloc/core/src/error\";\nimport { MFAPurpose } from \"@padloc/core/src/mfa\";\nimport { app, router } from \"../globals\";\nimport { element, html, css, property, query } from \"./base\";\nimport { StartForm } from \"./start-form\";\nimport { Input } from \"./input\";\nimport { LoadingButton } from \"./loading-button\";\nimport { alert, choose, prompt } from \"../lib/dialog\";\nimport { passwordStrength } from \"../lib/util\";\n\n@element(\"pl-recover\")\nexport class Recover extends StartForm {\n @property()\n private _weakPassword = false;\n\n private get _email() {\n return router.params.email || \"\";\n }\n\n @query(\"#emailInput\")\n private _emailInput: Input;\n @query(\"#passwordInput\")\n private _passwordInput: Input;\n @query(\"#repeatPasswordInput\")\n private _repeatPasswordInput: Input;\n @query(\"#submitButton\")\n private _submitButton: LoadingButton;\n\n async reset() {\n this._passwordInput.value = \"\";\n this._repeatPasswordInput.value = \"\";\n this._submitButton.stop();\n super.reset();\n }\n\n static styles = [\n ...StartForm.styles,\n css`\n h1 {\n display: block;\n text-align: center;\n margin: 10px;\n }\n\n .title {\n width: 300px;\n margin: 10px auto 30px auto;\n font-size: var(--font-size-small);\n font-weight: bold;\n letter-spacing: 0.5px;\n padding: 0 10px;\n }\n\n #submitButton {\n margin-bottom: 30px;\n }\n\n .login {\n text-decoration: underline;\n cursor: pointer;\n }\n\n .recovery-notes {\n text-align: left;\n padding: 20px;\n margin: 10px;\n }\n\n .recovery-notes ul {\n list-style: disc;\n }\n\n .recovery-notes li {\n margin: 10px 20px 0 20px;\n background: transparent;\n border: none;\n }\n\n .back-button {\n display: flex;\n align-items: center;\n padding: 4px 8px 4px 4px;\n background: transparent;\n align-self: flex-start;\n margin-top: 20px;\n }\n\n .back-button:not:hover {\n opacity: 0.8;\n }\n\n .back-button pl-icon {\n width: 15px;\n height: 15px;\n margin-right: 4px;\n font-size: 0.8em;\n }\n `\n ];\n\n render() {\n return html`\n
    \n\n
    \n \n\n

    ${$l(\"Recover Account\")}

    \n\n
    \n ${$l(\"Please enter your email address and new master password.\")}\n
    \n\n this._submit()}\n >\n \n\n this._updatePwdStrength()}\n @enter=${() => this._submit()}\n >\n \n\n
    ${$l(\"WARNING: Weak Password!\")}
    \n\n this._submit()}\n >\n \n\n
    \n ${$l(\n \"IMPORTANT, READ CAREFULLY: Padloc is designed in a way that makes it impossible \" +\n \"for us to access the data encrypted in any of your vaults even if we wanted to. \" +\n \"While this is essential to ensuring the security of your data, it also has the \" +\n \"following implications:\"\n )}\n
      \n
    • \n ${$l(\n \"Any data stored in your private vault can not be recovered and will be permantently lost.\"\n )}\n
    • \n
    • \n ${$l(\n \"All your organization memberships will be suspended temporarily until \" +\n \"confirmed by the organization owner.\"\n )}\n
    • \n
    • \n ${$l(\n \"All members of organizations you own will be suspended temporarily until \" +\n \"confirmed by you.\"\n )}\n
    • \n
    \n
    \n\n this._submit()}>\n ${$l(\"Recover Account\")}\n \n \n\n
    \n `;\n }\n\n private async _submit() {\n if (this._submitButton.state === \"loading\") {\n return;\n }\n\n this._emailInput.blur();\n this._passwordInput.blur();\n\n if (this._emailInput.invalid) {\n await alert(this._emailInput.validationMessage || $l(\"Please enter a valid email address!\"), {\n type: \"warning\"\n });\n return;\n }\n\n if (!this._passwordInput.value) {\n await alert($l(\"Please enter a master password!\"), { type: \"warning\" });\n return;\n }\n\n if (this._passwordInput.value !== this._repeatPasswordInput.value) {\n await alert($l(\"You didn't repeat your master password correctly. Try again!\"), { type: \"warning\" });\n return;\n }\n\n const email = this._emailInput.value;\n const password = this._passwordInput.value;\n\n const strength = await passwordStrength(password);\n if (strength.score < 2) {\n const choice = await choose(\n $l(\n \"The password you entered is weak which makes it easier for attackers to break \" +\n \"the encryption used to protect your data. Try to use a longer password or include a \" +\n \"variation of uppercase, lowercase and special characters as well as numbers!\"\n ),\n [$l(\"Learn More\"), $l(\"Choose Different Password\"), $l(\"Use Anyway\")],\n {\n type: \"warning\",\n title: $l(\"WARNING: Weak Password\"),\n hideIcon: true,\n preventDismiss: true\n }\n );\n switch (choice) {\n case 0:\n this._openPwdHowTo();\n return;\n case 1:\n this._passwordInput.focus();\n return;\n }\n }\n\n await app.requestMFACode(email, MFAPurpose.Recover);\n\n return this._recover(email, password);\n }\n\n private async _recover(email: string, password: string): Promise {\n this._submitButton.start();\n\n const verify = await prompt(\n $l(\n \"To complete the account recovery process, please enter \" +\n \"the confirmation code sent to your email address!\"\n ),\n {\n placeholder: \"Enter Verification Code\",\n confirmLabel: \"Submit\",\n validate: async (code: string) => {\n try {\n return await app.retrieveMFAToken(email, code, MFAPurpose.Recover);\n } catch (e) {\n if (e.code === ErrorCode.MFA_TRIES_EXCEEDED) {\n alert($l(\"Maximum number of tries exceeded! Please resubmit and try again!\"), {\n type: \"warning\"\n });\n return \"\";\n }\n throw e.message || e.code || e.toString();\n }\n }\n }\n );\n\n if (!verify) {\n this._submitButton.stop();\n return;\n }\n\n try {\n await app.recoverAccount({ email, password, verify: verify.token });\n this._submitButton.success();\n await alert($l(\"Account recovery successful!\"), { type: \"success\" });\n router.go(\"login\");\n } catch (e) {\n this._submitButton.fail();\n throw e;\n }\n }\n\n private async _updatePwdStrength() {\n const pwd = this._passwordInput.value;\n const result = await passwordStrength(pwd);\n const score = result.score;\n this._weakPassword = score < 3;\n }\n\n private _openPwdHowTo() {\n window.open(\"https://padlock.io/howto/choose-master-password/\", \"_system\");\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { app } from \"../globals\";\nimport { element, html, css } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { composeEmail } from \"@padloc/core/src/platform\";\n\n@element(\"pl-report-errors-dialog\")\nexport class ReportErrorsDialog extends Dialog {\n private _reportErrors() {\n const email = process.env.PL_SUPPORT_EMAIL || \"\";\n const subject = \"Padloc Error Report\";\n const message = `\n\n----- enter your comment above -----\n\nIMPORTANT: Please verify that the message below does not contain any sensitive data before sending this email!\n\nThe following errors occurred:\n\n${app.state._errors.join(\"\\n\\n\")}\n\nDevice Info:\n\n${JSON.stringify(app.state.device.toRaw(), null, 4)}\n`;\n composeEmail(email, subject, message);\n this._dismissErrors();\n }\n\n private _dismissErrors() {\n app.setState({ _errors: [] });\n this.done();\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n .message {\n margin: 18px;\n }\n `\n ];\n\n renderContent() {\n return html`\n
    \n
    \n ${$l(\"Report Errors\")}\n
    \n
    \n\n
    \n
    ${$l(\"{0} Errors Detected\", app.state._errors.length.toString())}
    \n
    \n ${$l(\n \"Padloc has registered {0} errors during your use of the app. \" +\n \"These errors may not have any impact on functionality and can often be ignored, \" +\n \"but reporting them may help us diagnose problems, identify possible failure \" +\n \"modes and generally improve the stability of the app.\",\n app.state._errors.length.toString()\n )}\n
    \n
    \n \n \n
    \n
    \n `;\n }\n}\n","import { shared } from \"../styles\";\nimport { BaseElement, element, html, css, property, query, observe } from \"./base\";\n\n@element(\"pl-select\")\nexport class Select extends BaseElement {\n @property()\n options: T[] = [];\n @property()\n selected: T;\n @property()\n label: string = \"\";\n @property()\n icon: string = \"\";\n\n @query(\"select\")\n private _select: HTMLSelectElement;\n\n static styles = [\n shared,\n css`\n :host {\n display: block;\n position: relative;\n padding: 0;\n height: var(--row-height);\n padding: 0 15px;\n background: var(--shade-2-color);\n border-radius: var(--border-radius);\n }\n\n select {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n cursor: pointer;\n }\n\n select.pad-left {\n padding-left: 30px;\n }\n\n option {\n background-color: var(--color-tertiary);\n color: var(--color-secondary);\n }\n\n label {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n padding: 13px;\n opacity: 0.5;\n transition: transform 0.2s, color 0.2s, opacity 0.5s;\n cursor: text;\n pointer-events: none;\n }\n\n label[float] {\n transform: scale(0.8) translate(0, -32px);\n color: var(--color-highlight);\n font-weight: bold;\n opacity: 1;\n }\n\n pl-icon {\n position: absolute;\n width: 20px;\n height: 20px;\n top: 0;\n bottom: 0;\n margin: auto;\n pointer-events: none;\n }\n\n pl-icon.right {\n right: 12px;\n }\n\n pl-icon.left {\n left: 14px;\n }\n `\n ];\n\n render() {\n const { options, selected, label, icon } = this;\n\n return html`\n ${icon\n ? html`\n \n `\n : \"\"}\n\n this._changed()}\n >\n ${options.map(\n o => html`\n \n `\n )}\n \n\n \n\n \n `;\n }\n\n @observe(\"options\")\n @observe(\"selected\")\n async _propsChanged() {\n if (!this.selected) {\n this.selected = this.options[0];\n }\n await this.updateComplete;\n this._select.selectedIndex = this.options.indexOf(this.selected);\n }\n\n private _changed() {\n this.selected = this.options[this._select.selectedIndex];\n this.dispatch(\"change\");\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { BillingInfo } from \"@padloc/core/src/billing\";\nimport { composeEmail } from \"@padloc/core/src/platform\";\nimport { mixins } from \"../styles\";\nimport { alert, confirm, prompt, dialog } from \"../lib/dialog\";\nimport { app, router } from \"../globals\";\nimport { StateMixin } from \"../mixins/state\";\nimport { element, html, css, query, listen } from \"./base\";\nimport { View } from \"./view\";\nimport \"./icon\";\nimport { Slider } from \"./slider\";\nimport { ToggleButton } from \"./toggle-button\";\nimport { ImportDialog } from \"./import-dialog\";\nimport { ExportDialog } from \"./export-dialog\";\nimport \"./billing-info\";\nimport \"./randomart\";\nimport \"./subscription\";\n\n@element(\"pl-settings\")\nexport class Settings extends StateMixin(View) {\n @query(\"input[type='file']\")\n private _fileInput: HTMLInputElement;\n\n @dialog(\"pl-import-dialog\")\n private _importDialog: ImportDialog;\n\n @dialog(\"pl-export-dialog\")\n private _exportDialog: ExportDialog;\n\n shouldUpdate() {\n return !!app.account;\n }\n\n static styles = [\n ...View.styles,\n css`\n :host {\n background: var(--color-quaternary);\n display: flex;\n flex-direction: column;\n }\n\n h3 {\n margin: 18px 8px 12px 8px;\n text-align: center;\n }\n\n .wrapper {\n max-width: 500px;\n margin: 0 auto;\n padding: 0 8px 8px 8px;\n }\n\n button {\n display: block;\n }\n\n .item {\n width: 100%;\n box-sizing: border-box;\n margin: 12px 0;\n }\n\n .account {\n font-size: 110%;\n display: flex;\n align-items: center;\n }\n\n pl-fingerprint {\n width: 60px;\n height: 60px;\n border-radius: 100%;\n border: solid 1px var(--border-color);\n margin: 15px;\n }\n\n .account-info {\n flex: 1;\n min-width: 0;\n padding-right: 18px;\n }\n\n .account-email {\n ${mixins.ellipsis()}\n }\n\n .account-email {\n font-weight: bold;\n ${mixins.ellipsis()}\n }\n\n .account pl-icon {\n width: 50px;\n height: 50px;\n margin: 5px;\n }\n `\n ];\n\n render() {\n const { settings, billingEnabled } = app;\n const account = app.account!;\n const billing = account.billing || new BillingInfo();\n\n return html`\n
    \n this.dispatch(\"toggle-menu\")}>\n\n
    ${$l(\"Settings\")}
    \n\n \n
    \n\n
    \n
    \n

    ${$l(\"Profile\")}

    \n\n
    \n \n\n
    \n
    ${account.name}
    \n\n
    ${account.email}
    \n
    \n\n this._editAccount()}>\n
    \n\n

    ${$l(\"Security\")}

    \n\n \n\n \n\n ${billingEnabled\n ? html`\n

    ${$l(\"Subscription\")}

    \n\n \n\n

    ${$l(\"Billing Info\")}

    \n\n \n `\n : html``}\n\n

    ${$l(\"Auto Lock\")}

    \n\n \n \n\n \n \n\n ${app.supportsBiometricUnlock\n ? html`\n

    ${$l(\"Biometric Unlock\")}

    \n \n \n `\n : \"\"}\n\n

    ${$l(\"Import / Export\")}

    \n\n \n\n \n\n

    ${$l(\"Support\")}

    \n\n \n\n \n\n

    ${$l(\"Danger Zone\")}

    \n\n \n
    \n
    \n\n this._importFile()} />\n `;\n }\n\n @listen(\"change\")\n _updateSettings() {\n app.setSettings({\n autoLock: (this.$(\"#autoLockButton\") as ToggleButton).active,\n autoLockDelay: (this.$(\"#autoLockDelaySlider\") as Slider).value\n });\n }\n\n private _editAccount() {\n const account = app.account!;\n prompt(\"\", {\n title: $l(\"Edit Profile\"),\n confirmLabel: $l(\"Save\"),\n value: account.name,\n label: $l(\"Name\"),\n validate: async (name: string) => {\n if (!name) {\n throw $l(\"Please enter a name!\");\n }\n if (name !== account.name) {\n await app.updateAccount(async account => (account.name = name));\n }\n return name;\n }\n });\n }\n\n private async _logout() {\n const confirmed = await confirm($l(\"Do you really want to log out?\"), $l(\"Log Out\"));\n if (confirmed) {\n app.logout();\n }\n }\n\n //* Opens the change password dialog and resets the corresponding input elements\n private async _changePassword() {\n const success = await prompt($l(\"Please enter your current password!\"), {\n title: $l(\"Change Master Password\"),\n label: $l(\"Enter Current Password\"),\n type: \"password\",\n validate: async pwd => {\n try {\n await app.account!.unlock(pwd);\n } catch (e) {\n throw $l(\"Wrong password! Please try again!\");\n }\n\n return pwd;\n }\n });\n\n if (!success) {\n return;\n }\n\n const newPwd = await prompt($l(\"Now choose a new master password!\"), {\n title: $l(\"Change Master Password\"),\n label: $l(\"Enter New Password\"),\n type: \"password\",\n validate: async (val: string) => {\n if (val === \"\") {\n throw $l(\"Please enter a password!\");\n }\n return val;\n }\n });\n\n if (newPwd === null) {\n return;\n }\n\n const confirmed = await prompt($l(\"Please confirm your new password!\"), {\n title: $l(\"Change Master Password\"),\n label: $l(\"Repeat New Password\"),\n type: \"password\",\n validate: async pwd => {\n if (pwd !== newPwd) {\n throw \"Wrong password! Please try again!\";\n }\n\n return pwd;\n }\n });\n\n if (!confirmed) {\n return;\n }\n\n await app.changePassword(newPwd);\n alert($l(\"Master password changed successfully.\"), { type: \"success\" });\n }\n\n private _openWebsite() {\n window.open(\"https://padloc.app\", \"_system\");\n }\n\n private _sendMail() {\n const email = process.env.PL_SUPPORT_EMAIL || \"\";\n const subject = \"Padloc Support Request\";\n const message = `\n\n----- enter your message above -----\n\nNOTE: Below we have included some information about your device that may help\nus analyse any problems you may be having. If you're not comfortable sharing\nthis data simply delete this of the email!\n\nDevice Info: ${JSON.stringify(app.state.device.toRaw(), null, 4)}\n`;\n\n composeEmail(email, subject, message);\n }\n\n private async _import() {\n this._fileInput.click();\n }\n\n private async _importFile() {\n const file = this._fileInput.files![0];\n const reader = new FileReader();\n reader.onload = async () => {\n await this._importDialog.show(reader.result as string);\n this._fileInput.value = \"\";\n };\n\n reader.readAsText(file);\n }\n\n private _export() {\n this._exportDialog.show();\n }\n\n private async _deleteAccount() {\n const success = await prompt($l(\"Please enter your master password to proceed.\"), {\n title: $l(\"Delete Account\"),\n label: $l(\"Enter Master Password\"),\n type: \"password\",\n validate: async pwd => {\n try {\n await app.account!.unlock(pwd);\n } catch (e) {\n throw $l(\"Wrong password! Please try again!\");\n }\n\n return pwd;\n }\n });\n\n if (!success) {\n return;\n }\n\n const deleted = await prompt(\n $l(\n \"Are you sure you want to delete this account? \" +\n \"All associated vaults and the data within them will be lost and any active subscriptions will be canceled immediately. \" +\n \"This action can not be undone!\"\n ),\n {\n type: \"destructive\",\n title: $l(\"Delete Account\"),\n confirmLabel: $l(\"Delete\"),\n placeholder: $l(\"Type 'DELETE' to confirm\"),\n validate: async val => {\n if (val !== \"DELETE\") {\n throw $l(\"Type 'DELETE' to confirm\");\n }\n\n try {\n await app.deleteAccount();\n } catch (e) {\n throw e.message || $l(\"Something went wrong. Please try again later!\");\n }\n\n return val;\n }\n }\n );\n\n if (deleted) {\n router.go(\"\");\n }\n }\n\n private async _toggleBiometricUnlock(e: Event) {\n e.stopPropagation();\n const toggle = e.target as ToggleButton;\n console.log(toggle.active);\n if (toggle.active) {\n this.dispatch(\"enable-biometric-auth\");\n } else {\n const confirmed = await confirm($l(\"Are you sure you want to disable biometric unlock?\"));\n if (confirmed) {\n await app.forgetMasterKey();\n } else {\n toggle.active = true;\n }\n }\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { ErrorCode } from \"@padloc/core/src/error\";\nimport { generatePassphrase } from \"@padloc/core/src/diceware\";\nimport { MFAPurpose } from \"@padloc/core/src/mfa\";\nimport { passwordStrength, isTouch } from \"../lib/util\";\nimport { app, router } from \"../globals\";\nimport { element, html, css, property, query } from \"./base\";\nimport { StartForm } from \"./start-form\";\nimport { Input } from \"./input\";\nimport { PasswordInput } from \"./password-input\";\nimport { LoadingButton } from \"./loading-button\";\nimport { Generator } from \"./generator\";\nimport { alert, choose, prompt, dialog } from \"../lib/dialog\";\nimport { mixins } from \"../styles\";\nimport \"./logo\";\n\nconst steps = [\"\", \"verify\", \"password\"];\n\n@element(\"pl-signup\")\nexport class Signup extends StartForm {\n protected get _verificationToken() {\n return router.params.verify || router.params.token || \"\";\n }\n\n @property()\n private _password: string = \"\";\n\n private get _email() {\n return router.params.email || \"\";\n }\n\n private get _name() {\n return router.params.name || \"\";\n }\n\n private get _invite() {\n const inviteString = router.params.invite;\n if (inviteString) {\n const [org, id] = inviteString.split(\",\");\n return { org, id };\n } else {\n return undefined;\n }\n }\n\n private _step = \"start\";\n\n @query(\"#emailInput\")\n private _emailInput: Input;\n @query(\"#nameInput\")\n private _nameInput: Input;\n @query(\"#codeInput\")\n private _codeInput: Input;\n @query(\"#repeatPasswordInput\")\n private _repeatPasswordInput: PasswordInput;\n @query(\"#submitEmailButton\")\n private _submitEmailButton: LoadingButton;\n @query(\"#verifyEmailButton\")\n private _verifyEmailButton: LoadingButton;\n @query(\"#submitPasswordButton\")\n private _submitPasswordButton: LoadingButton;\n\n @dialog(\"pl-generator\")\n private _generator: Generator;\n\n async reset() {\n this._repeatPasswordInput.value = \"\";\n this._codeInput.value = \"\";\n this._submitEmailButton.stop();\n this._verifyEmailButton.stop();\n this._submitPasswordButton.stop();\n setTimeout(() => (this._logo.reveal = true), 500);\n }\n\n async goToStep(step = \"\") {\n const i = steps.indexOf(step);\n if (i === -1) {\n return;\n }\n const iPrev = steps.indexOf(this._step);\n\n const wrappers = this.$$(\".wrapper\");\n const wrapper = wrappers[i] as HTMLElement;\n const prevWrapper = wrappers[iPrev] as HTMLElement;\n wrapper.removeAttribute(\"hidden\");\n this._animateIn(wrapper.querySelectorAll(\".animate\"));\n if (prevWrapper && prevWrapper !== wrapper) {\n this._animateOut(prevWrapper.querySelectorAll(\".animate\"));\n setTimeout(() => prevWrapper.setAttribute(\"hidden\", \"\"), 1000);\n }\n this._step = step;\n\n if (step === \"password\" && !this._password) {\n this._generatePassphrase();\n }\n\n setTimeout(() => this.requestUpdate(), 10);\n }\n\n private async _generatePassphrase() {\n this._password = await generatePassphrase(4, \" \", [app.state.device.locale]);\n const wrapper = this.$(\".master-password\");\n wrapper.classList.add(\"reveal\");\n setTimeout(() => wrapper.classList.remove(\"reveal\"), 2000);\n }\n\n static styles = [\n ...StartForm.styles,\n css`\n h1 {\n display: block;\n text-align: center;\n margin: 20px 10px;\n }\n\n .master-password-form {\n max-width: 500px;\n }\n\n .title {\n max-width: 310px;\n margin: 30px auto;\n font-size: var(--font-size-small);\n font-weight: bold;\n letter-spacing: 0.5px;\n padding: 0 10px;\n }\n\n #submitButton {\n margin-bottom: 30px;\n }\n\n .login-wrapper {\n font-size: var(--font-size-small);\n padding: 8px;\n margin: 8px 0;\n opacity: 0.7;\n }\n\n .link {\n text-decoration: underline;\n cursor: pointer;\n font-weight: bold;\n }\n\n pl-input:not([focused]) + .hint {\n color: rgba(0, 0, 0, 0.2);\n text-shadow: none;\n }\n\n .master-password {\n position: relative;\n background: var(--shade-2-color);\n font-family: var(--font-family-mono);\n font-size: 120%;\n padding: 20px;\n overflow-wrap: break-word;\n }\n\n .master-password-cover {\n ${mixins.fullbleed()}\n height: 2em;\n line-height: 2em;\n margin: auto;\n font-weight: bold;\n text-shadow: none;\n color: rgba(0, 0, 0, 0.3);\n }\n\n .master-password:hover {\n background: var(--shade-3-color);\n }\n\n .master-password > * {\n transition: transform 0.2s cubic-bezier(1, -0.3, 0, 1.3), opacity 0.2s;\n }\n\n .master-password:not(:hover):not(.reveal) .master-password-value,\n .master-password:hover .master-password-cover,\n .master-password.reveal .master-password-cover {\n opacity: 0;\n transform: scale(0);\n }\n\n .hint.subtle {\n opacity: 0.5;\n }\n\n [focused] + .hint.subtle {\n opacity: 1;\n }\n\n .password-actions {\n margin: -20px 0 30px 0;\n }\n\n .password-action {\n padding: 6px 10px;\n margin: 0 4px;\n font-size: var(--font-size-tiny);\n font-weight: 600;\n }\n `\n ];\n\n render() {\n return html`\n \n\n \n\n \n `;\n }\n\n private async _submitEmail() {\n if (this._submitEmailButton.state === \"loading\") {\n return;\n }\n\n if (!this._emailInput.reportValidity()) {\n return;\n }\n\n const email = this._emailInput.value;\n const name = this._nameInput.value;\n\n if (this._verificationToken) {\n router.go(\"signup/password\", { ...router.params, email, name });\n } else {\n this._submitEmailButton.start();\n try {\n await app.requestMFACode(email, MFAPurpose.Signup);\n this._submitEmailButton.success();\n router.go(\"signup/verify\", { ...router.params, email, name });\n } catch (e) {\n this._submitEmailButton.fail();\n throw e;\n }\n }\n }\n\n private async _verifyEmail() {\n if (this._verifyEmailButton.state === \"loading\") {\n return;\n }\n\n this._verifyEmailButton.start();\n try {\n const verify = await app.retrieveMFAToken(this._email, this._codeInput.value, MFAPurpose.Signup);\n\n if (verify.hasAccount) {\n this._verifyEmailButton.stop();\n this._accountExists();\n return;\n }\n\n if (verify.hasLegacyAccount) {\n const migrated = await this._migrateAccount(\n this._email,\n \"\",\n verify.legacyToken!,\n verify.token,\n this._name\n );\n if (migrated) {\n this._verifyEmailButton.success();\n } else {\n const { verify, ...params } = router.params;\n router.go(\"signup\", params);\n this._emailInput.focus();\n }\n return;\n }\n\n router.go(\"signup/password\", { ...router.params, token: verify.token });\n this._verifyEmailButton.success();\n } catch (e) {\n if (e.code === ErrorCode.MFA_TRIES_EXCEEDED) {\n alert($l(\"Maximum number of tries exceeded! Please resubmit and try again!\"), { type: \"warning\" });\n router.go(\"signup\");\n return;\n }\n this._verifyEmailButton.fail();\n throw e;\n }\n }\n\n private async _submitPassword() {\n if (this._submitPasswordButton.state === \"loading\") {\n return;\n }\n\n if (this._password !== this._repeatPasswordInput.value) {\n await alert($l(\"You didn't repeat your master password correctly. Try again!\"), { type: \"warning\" });\n return;\n }\n\n const email = this._email;\n const name = this._name;\n const password = this._password;\n\n this._submitPasswordButton.start();\n\n try {\n await app.signup({ email, password, name, verify: this._verificationToken, invite: this._invite });\n this._submitPasswordButton.success();\n this.done();\n } catch (e) {\n this._submitPasswordButton.fail();\n switch (e.code) {\n case ErrorCode.ACCOUNT_EXISTS:\n this._accountExists();\n return;\n default:\n throw e;\n }\n }\n\n this._password = \"\";\n }\n\n private async _accountExists() {\n const choice = await choose(\n $l(\"An account with this email address already exists!\"),\n [$l(\"Login\"), $l(\"Change Email\")],\n { type: \"warning\" }\n );\n if (choice === 0) {\n router.go(\"login\");\n } else {\n const { verify, ...params } = router.params;\n router.go(\"signup\", params);\n this._emailInput.focus();\n }\n }\n\n private async _editMasterPassword(): Promise {\n const choice = await choose(\n $l(\"We recommend using a randomly generated password that is both strong and easy to remember.\"),\n [$l(\"Keep This One\"), $l(\"Generate Another\"), $l(\"Choose My Own\")],\n { title: $l(\"Want A Different Master Password?\") }\n );\n\n let newPwd;\n\n switch (choice) {\n case 0:\n break;\n case 1:\n newPwd = await this._generator.show();\n break;\n case 2:\n newPwd = await prompt(\n $l(\"We recommend using a randomly generated password that is both strong and easy to remember.\"),\n { title: $l(\"Choose Own Master Password\"), label: $l(\"Enter Master Password\"), type: \"password\" }\n );\n break;\n }\n\n if (newPwd) {\n const strength = await passwordStrength(newPwd);\n\n if (strength.score < 2) {\n const choice = await choose(\n $l(\n \"The password you entered is weak which makes it easier for attackers to break \" +\n \"the encryption used to protect your data. Try to use a longer password or include a \" +\n \"variation of uppercase, lowercase and special characters as well as numbers!\"\n ),\n [$l(\"Choose Different Password\"), $l(\"Use Anyway\")],\n {\n type: \"warning\",\n title: $l(\"WARNING: Weak Password\"),\n hideIcon: true,\n preventDismiss: true\n }\n );\n if (choice === 0) {\n return this._editMasterPassword();\n }\n }\n\n this._password = newPwd;\n }\n }\n}\n","import { BaseElement, element, html, css, property, query } from \"./base\";\nimport { shared } from \"../styles\";\n\n@element(\"pl-slider\")\nexport class Slider extends BaseElement {\n @property() min: number = 1;\n @property() max: number = 10;\n @property() value: number = this.min;\n @property() unit: string = \"\";\n @property() step: number = 1;\n @property() label: string = \"\";\n @property() hideValue: boolean = false;\n\n @query(\"input\") private _input: HTMLInputElement;\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n align-items: center;\n height: var(--row-height);\n padding: 0 15px;\n font-size: inherit;\n --track-color: var(--slider-track-color, rgba(0, 0, 0, 0.1));\n --knob-color: var(--slider-knob-color, var(--color-highlight));\n --track-size: var(--slider-track-size, 2px);\n --knob-size: var(--slider-knob-size, 25px);\n }\n\n input[type=\"range\"] {\n -webkit-appearance: none;\n width: 100%;\n margin: 0;\n padding: 0;\n flex: 1;\n height: auto;\n min-height: var(--knob-size);\n }\n\n input[type=\"range\"]:focus {\n outline: none;\n }\n\n label {\n margin-right: 10px;\n }\n\n label:empty {\n display: none;\n }\n\n .value-display {\n margin-left: 10px;\n }\n\n input[type=\"range\"]::-webkit-slider-runnable-track {\n width: 100%;\n cursor: pointer;\n border-radius: 100%;\n height: 0.2em;\n background: var(--shade-2);\n }\n\n input[type=\"range\"]::-webkit-slider-thumb {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n height: var(--knob-size);\n width: var(--knob-size);\n margin-top: calc(0.5 * var(--track-size) - 0.5 * var(--knob-size));\n position: relative;\n border-radius: 100%;\n background: var(--knob-color);\n cursor: pointer;\n border: none;\n box-sizing: border-box;\n background-clip: content-box;\n }\n\n input[type=\"range\"]:active::-webkit-slider-thumb {\n transform: scale(1.1);\n }\n\n input[type=\"range\"]::-moz-range-track {\n width: 100%;\n height: var(--track-size);\n cursor: pointer;\n background: var(--track-color);\n border-radius: 100%;\n }\n\n input[type=\"range\"]::-moz-range-thumb {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n height: var(--knob-size);\n width: var(--knob-size);\n margin-top: calc(0.5 * var(--track-size) - 0.5 * var(--knob-size));\n position: relative;\n border-radius: 100%;\n background: var(--knob-color);\n cursor: pointer;\n border: none;\n box-sizing: border-box;\n background-clip: content-box;\n }\n\n input[type=\"range\"]:active::-moz-range-thumb {\n transform: scale(1.1);\n }\n `\n ];\n\n render() {\n return html`\n \n\n this._inputChange()}\n />\n\n ${this.value}${this.unit}\n `;\n }\n\n private _inputChange() {\n const prev = this.value;\n this.value = parseFloat(this._input.value);\n this.dispatch(\"change\", { prev: prev, value: this.value }, true, true);\n }\n}\n","import { BaseElement, element, html, css, svg, property, query, observe } from \"./base\";\n\n@element(\"pl-spinner\")\nexport class Spinner extends BaseElement {\n static styles = [\n css`\n @keyframes spin {\n from {\n stroke-dashoffset: 240;\n }\n\n to {\n stroke-dashoffset: 40;\n }\n }\n\n @keyframes rotate {\n to {\n transform: rotate(360deg);\n }\n }\n\n :host {\n display: block;\n width: 40px;\n height: 40px;\n position: relative;\n transition: opacity 0.3s;\n will-change: opacity;\n }\n\n :host(:not([active])) {\n opacity: 0;\n }\n\n svg {\n width: 100%;\n height: 100%;\n }\n\n circle {\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-width: 10;\n stroke-dasharray: 252;\n transform-origin: center center;\n will-change: transform;\n }\n\n circle.spinning {\n animation: spin 1.5s cubic-bezier(0.44, 0.22, 0.64, 0.86) alternate infinite,\n rotate linear 1.2s infinite;\n }\n `\n ];\n\n @property({ reflect: true })\n active: boolean = false;\n\n @query(\"circle\")\n private _circle: SVGCircleElement;\n\n private _stopTimeout: number;\n\n @observe(\"active\")\n _activeChanged() {\n clearTimeout(this._stopTimeout);\n\n if (this.active) {\n this._circle.classList.add(\"spinning\");\n } else {\n this._stopTimeout = window.setTimeout(() => this._circle.classList.remove(\"spinning\"), 300);\n }\n }\n\n render() {\n return html`\n ${svg`\n \n \n \n `}\n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { GetLegacyDataParams } from \"@padloc/core/src/api\";\nimport { VaultItem } from \"@padloc/core/src/item\";\nimport { mixins, shared } from \"../styles\";\nimport { BaseElement, css, query } from \"./base\";\nimport { animateElement, animateCascade } from \"../lib/animation\";\nimport { alert, confirm, prompt } from \"../lib/dialog\";\nimport { importLegacyContainer } from \"../lib/import\";\nimport { app } from \"../globals\";\nimport { Logo } from \"./logo\";\nimport \"./icon\";\n\nconst styles = css`\n @keyframes reveal {\n from {\n transform: translate(0, 30px);\n opacity: 0;\n }\n }\n\n @keyframes fade {\n to {\n transform: translate(0, -200px);\n opacity: 0;\n }\n }\n\n :host,\n .wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n ${mixins.fullbleed()}\n ${mixins.scroll()}\n }\n\n form {\n width: 100%;\n max-width: 400px;\n }\n\n form > * {\n border-radius: 8px;\n margin: 12px;\n }\n\n pl-logo {\n margin: 40px auto 30px auto;\n }\n\n pl-loading-button {\n overflow: hidden;\n font-weight: bold;\n }\n\n .hint {\n font-size: var(--font-size-small);\n box-sizing: border-box;\n padding: 0 10px;\n margin-bottom: 30px;\n transition: color 0.2s;\n }\n\n .hint.warning {\n color: #ffc107;\n font-weight: bold;\n margin: 0;\n padding: 0;\n text-shadow: none;\n }\n`;\n\nexport abstract class StartForm extends BaseElement {\n static styles = [shared, styles];\n\n protected _verificationToken: string;\n\n @query(\"pl-logo\")\n protected _logo: Logo;\n\n protected _animateIn(nodes: Iterable) {\n return animateCascade(nodes, {\n animation: \"reveal\",\n duration: 1000,\n fullDuration: 1500,\n initialDelay: 300,\n fill: \"backwards\",\n clear: 3000\n });\n }\n\n protected _animateOut(nodes: Iterable) {\n animateCascade(nodes, {\n animation: \"fade\",\n duration: 400,\n fullDuration: 600,\n initialDelay: 0,\n fill: \"forwards\",\n easing: \"cubic-bezier(1, 0, 0.2, 1)\",\n clear: 3000\n });\n }\n\n reset() {\n this._animateIn(this.$$(\".animate\"));\n this.requestUpdate();\n this._logo && setTimeout(() => (this._logo.reveal = true), 500);\n }\n\n done() {\n this._animateOut(this.$$(\".animate\"));\n }\n\n rumble() {\n animateElement(this.$(\"form\"), { animation: \"rumble\", duration: 200, clear: true });\n }\n\n protected async _migrateAccount(\n email: string,\n password: string,\n legacyToken: string,\n signupToken: string,\n name = \"\"\n ): Promise {\n const choice = await alert(\n $l(\n \"You don't have a Padloc 3 account yet but we've found \" +\n \"an account from an older version. \" +\n \"Would you like to migrate your account to Padloc 3 now?\"\n ),\n {\n title: \"Account Migration\",\n icon: \"user\",\n options: [$l(\"Migrate\"), $l(\"Learn More\"), $l(\"Cancel\")]\n }\n );\n\n if (choice === 1) {\n window.open(\"https://padloc.app/help/migrate-v3\", \"_system\");\n return this._migrateAccount(email, password, legacyToken, signupToken, name);\n } else if (choice === 2) {\n return false;\n }\n\n const legacyData = await app.api.getLegacyData(\n new GetLegacyDataParams({\n email,\n verify: legacyToken\n })\n );\n\n let items: VaultItem[] | null = null;\n try {\n if (!password) {\n throw \"No password provided\";\n }\n await legacyData.unlock(password);\n items = await importLegacyContainer(legacyData);\n } catch (e) {\n password = await prompt($l(\"Please enter your master password!\"), {\n title: $l(\"Migrating Account\"),\n placeholder: $l(\"Enter Master Password\"),\n confirmLabel: $l(\"Submit\"),\n type: \"password\",\n preventAutoClose: true,\n validate: async (password: string) => {\n try {\n await legacyData.unlock(password);\n items = await importLegacyContainer(legacyData);\n } catch (e) {\n throw $l(\"Wrong password! Please try again!\");\n }\n return password;\n }\n });\n }\n\n if (items && password) {\n await app.signup({ email, password, verify: signupToken, name });\n await app.addItems(items, app.mainVault!);\n const deleteLegacy = await confirm(\n $l(\n \"Your account and all associated data was migrated successfully! Do you want to delete your old account now?\"\n ),\n $l(\"Yes\"),\n $l(\"No\"),\n { title: $l(\"Delete Legacy Account\"), icon: \"delete\", preventAutoClose: true }\n );\n\n if (deleteLegacy) {\n await app.api.deleteLegacyAccount();\n }\n\n await alert(\n $l(\n \"All done! Please note that you won't be able to access your Padloc 3 account \" +\n \"with older versions of the app, so please make sure you have the latest version installed \" +\n \"on all your devices! (You can find download links for all platforms at \" +\n \"https://padloc.app/downloads/). Enjoy using Padloc 3!\"\n ),\n {\n title: $l(\"Migration Complete\"),\n type: \"success\"\n }\n );\n return true;\n } else {\n alert($l(\"Unfortunately we could not complete migration of your data.\"), {\n type: \"warning\"\n });\n return false;\n }\n }\n}\n","import { app } from \"../globals\";\nimport { shared, mixins } from \"../styles\";\nimport { StateMixin } from \"../mixins/state\";\nimport { BaseElement, element, html, css, property, query } from \"./base\";\nimport { Unlock } from \"./unlock\";\nimport { Login } from \"./login\";\nimport { Signup } from \"./signup\";\nimport { Recover } from \"./recover\";\n\n@element(\"pl-start\")\nexport class Start extends StateMixin(BaseElement) {\n @property({ reflect: true })\n open: boolean = false;\n\n @query(\"pl-unlock\")\n private _unlockForm: Unlock;\n @query(\"pl-login\")\n private _loginForm: Login;\n @query(\"pl-signup\")\n private _signupForm: Signup;\n @query(\"pl-recover\")\n private _recoverForm: Recover;\n\n async unlock() {\n await this.updateComplete;\n this._showForm(this._unlockForm);\n }\n\n async login() {\n await this.updateComplete;\n this._showForm(this._loginForm);\n }\n\n async signup(step?: string) {\n await this.updateComplete;\n this._signupForm.goToStep(step);\n this._showForm(this._signupForm);\n }\n\n async recover() {\n await this.updateComplete;\n this._showForm(this._recoverForm);\n }\n\n stateChanged() {\n this.open = !app.state.locked;\n }\n\n async _showForm(form: Unlock | Login | Signup | Recover) {\n for (const f of [this._unlockForm, this._loginForm, this._signupForm, this._recoverForm]) {\n if (f === form) {\n f.classList.add(\"showing\");\n f.reset();\n } else {\n f.classList.remove(\"showing\");\n f.done();\n }\n }\n }\n\n static styles = [\n shared,\n css`\n :host {\n --color-background: var(--color-primary);\n --color-foreground: var(--color-tertiary);\n --color-highlight: var(--color-secondary);\n color: var(--color-foreground);\n display: flex;\n flex-direction: column;\n z-index: 5;\n text-align: center;\n text-shadow: rgba(0, 0, 0, 0.15) 0 2px 0;\n background: linear-gradient(180deg, #59c6ff 0%, #077cb9 100%);\n transition: transform 0.4s cubic-bezier(1, 0, 0.2, 1);\n ${mixins.fullbleed()}\n ${mixins.scroll()}\n }\n\n main {\n ${mixins.fullbleed()}\n background: transparent;\n min-height: 510px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n .form:not(.showing) {\n opacity: 0;\n transition: opacity 1s;\n pointer-events: none;\n }\n\n :host([open]) {\n pointer-events: none;\n }\n\n :host([open]) {\n transition-delay: 0.4s;\n transform: translate3d(0, -100%, 0);\n }\n `\n ];\n\n render() {\n return html`\n \n\n \n\n \n\n \n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { Org } from \"@padloc/core/src/org\";\nimport { PlanType, SubscriptionStatus, UpdateBillingParams } from \"@padloc/core/src/billing\";\nimport { shared } from \"../styles\";\nimport { dialog, alert, choose, confirm } from \"../lib/dialog\";\nimport { fileSize, loadScript } from \"../lib/util\";\nimport { app } from \"../globals\";\nimport { StateMixin } from \"../mixins/state\";\nimport { BaseElement, element, property, html, css, query } from \"./base\";\nimport \"./icon\";\nimport { LoadingButton } from \"./loading-button\";\nimport { UpdateSubscriptionDialog } from \"./update-subscription-dialog\";\nimport { BillingDialog } from \"./billing-dialog\";\n\n@element(\"pl-subscription\")\nexport class OrgSubscription extends StateMixin(BaseElement) {\n @property()\n org: Org | null = null;\n\n @dialog(\"pl-update-subscription-dialog\")\n private _updateSubscriptionDialog: UpdateSubscriptionDialog;\n\n @dialog(\"pl-billing-dialog\")\n private _billingDialog: BillingDialog;\n\n @query(\"#editButton\")\n private _editButton: LoadingButton;\n\n @query(\"#paymentButton\")\n private _paymentButton: LoadingButton;\n\n @query(\"#authButton\")\n private _authButton: LoadingButton;\n\n @query(\"#downgradeButton\")\n private _downgradeButton: LoadingButton;\n\n private get _billing() {\n return this.org ? this.org.billing : app.account && app.account.billing;\n }\n\n private get _subscription() {\n return this._billing && this._billing.subscription;\n }\n\n private async _update() {\n const sub = this._subscription;\n\n if (this.org) {\n if (!sub) {\n this._updatePlan();\n return;\n }\n } else {\n if (!sub || sub.plan.type === PlanType.Free) {\n this.dispatch(\"get-premium\");\n return;\n }\n }\n\n const canceled = sub.status === SubscriptionStatus.Canceled;\n const choices = canceled ? [$l(\"Resume Subscription\")] : [$l(\"Cancel Subscription\")];\n\n if (this.org) {\n choices.push($l(\"Update Plan\"));\n }\n\n const choice = await choose(\"\", choices);\n\n switch (choice) {\n case 0:\n return canceled ? this._resumeSubscription() : this._cancelSubscription();\n case 1:\n return this._updateSubscriptionDialog.show(this.org!);\n }\n }\n\n private _updatePlan() {\n this.org ? this._updateSubscriptionDialog.show(this.org) : this.dispatch(\"get-premium\");\n }\n\n private async _downgrade() {\n if (this.org) {\n throw \"Can only downgrade subscription for private account!\";\n }\n\n if (this._downgradeButton.state === \"loading\") {\n return;\n }\n\n const confirmed = await confirm(\n $l(\"Are you sure you want to downgrade to the Free Plan?\"),\n $l(\"Downgrade\"),\n $l(\"Cancel\"),\n { type: \"destructive\", title: \"Downgrade\" }\n );\n\n if (!confirmed) {\n return;\n }\n\n this._downgradeButton.start();\n try {\n await app.updateBilling(new UpdateBillingParams({ planType: PlanType.Free }));\n this._downgradeButton.success();\n } catch (e) {\n this._downgradeButton.fail();\n alert(e.message || $l(\"Something went wrong. Please try again later!\"), { type: \"warning\" });\n }\n }\n\n private async _updateBilling() {\n if (this._paymentButton.state === \"loading\") {\n return;\n }\n\n const billingInfo = this._billing!;\n\n const params = await this._billingDialog.show({ billingInfo });\n if (params) {\n this._paymentButton.start();\n try {\n await app.updateBilling(params);\n this._paymentButton.success();\n } catch (e) {\n this._paymentButton.fail();\n alert(e.message || $l(\"Something went wrong. Please try again later!\"), { type: \"warning\" });\n throw e;\n }\n }\n }\n\n private async _do(fn: () => Promise) {\n if (this._editButton.state === \"loading\") {\n return;\n }\n\n this._editButton.start();\n try {\n await fn();\n this._editButton.success();\n } catch (e) {\n this._editButton.fail();\n alert(e.message || $l(\"Something went wrong. Please try again later!\"), { type: \"warning\" });\n }\n }\n\n private async _cancelSubscription() {\n this._do(() =>\n app.updateBilling(new UpdateBillingParams({ org: (this.org && this.org.id) || undefined, cancel: true }))\n );\n }\n\n private async _resumeSubscription() {\n this._do(() =>\n app.updateBilling(new UpdateBillingParams({ org: (this.org && this.org.id) || undefined, cancel: false }))\n );\n }\n\n private async _authenticatePayment() {\n const stripePubKey = app.state.billingProvider && app.state.billingProvider.config.publicKey;\n\n if (!stripePubKey || this._authButton.state === \"loading\") {\n return;\n }\n\n this._authButton.start();\n\n let error: string = \"\";\n try {\n const Stripe = await loadScript(\"https://js.stripe.com/v3/\", \"Stripe\");\n const stripe = Stripe(stripePubKey);\n const result = await stripe.handleCardPayment(this._subscription!.paymentRequiresAuth);\n error = result.error && result.error.message;\n await app.updateBilling(new UpdateBillingParams());\n } catch (e) {\n error = e.message || $l(\"Something went wrong. Please try again later!\");\n }\n\n if (error) {\n alert(error);\n this._authButton.fail();\n } else {\n this._authButton.success();\n }\n }\n\n static styles = [\n shared,\n css`\n :host {\n display: block;\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n .quota {\n margin: 0 12px 12px 12px;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n }\n\n .quota-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 4px;\n font-weight: bold;\n text-align: center;\n }\n\n .quota-item[warning] {\n color: var(--color-negative);\n }\n\n .quota-item pl-icon {\n font-size: 150%;\n }\n\n .quota-item .label {\n font-size: var(--font-size-small);\n }\n\n .edit-button {\n position: absolute;\n top: 12px;\n right: 12px;\n z-index: 1;\n }\n\n .missing {\n opacity: 0.7;\n cursor: pointer;\n }\n\n .plan-name {\n font-size: 150%;\n font-weight: bold;\n margin: 16px 8px;\n text-align: center;\n }\n\n button {\n font-weight: bold;\n }\n\n .premium-button {\n margin: 0 12px 12px 12px;\n }\n `\n ];\n\n render() {\n if (!app.account) {\n return html``;\n }\n\n const account = app.account!;\n const billing = this.org ? this.org.billing : account.billing;\n const sub = billing && billing.subscription;\n\n const trialDays =\n sub && sub.trialEnd\n ? Math.max(0, Math.ceil((sub.trialEnd.getTime() - Date.now()) / 1000 / 60 / 60 / 24))\n : 0;\n\n const periodDays =\n sub && sub.periodEnd\n ? Math.max(0, Math.ceil((sub.periodEnd.getTime() - Date.now()) / 1000 / 60 / 60 / 24))\n : 0;\n\n const privateItemQuota = app.getItemsQuota();\n const privateItemCount = (app.mainVault && app.mainVault.items.size) || 0;\n\n return html`\n
    \n ${(sub && sub.plan.name) || $l(\"No Plan Selected\")}\n
    \n\n
    \n ${this.org\n ? html`\n = this.org.quota.members}\n >\n \n\n
    \n ${this.org.quota.members === -1\n ? $l(\"Unlimited\")\n : `${this.org.members.length} / ${this.org.quota.members}`}\n
    \n
    \n\n = this.org.quota.groups}\n >\n \n\n
    \n ${this.org.quota.groups === -1\n ? $l(\"Unlimited\")\n : `${this.org.groups.length} / ${this.org.quota.groups}`}\n
    \n \n\n = this.org.quota.vaults}\n >\n \n\n
    \n ${this.org.quota.vaults === -1\n ? $l(\"Unlimited\")\n : `${this.org.vaults.length} / ${this.org.quota.vaults}`}\n
    \n \n\n = this.org.quota.storage * 1e9 - 5e6}\n >\n \n\n
    \n ${this.org.quota.storage === -1\n ? $l(\"Unlimited\")\n : `${fileSize(this.org.usedStorage)} / ${this.org.quota.storage} GB`}\n
    \n \n `\n : html`\n = privateItemQuota}\n >\n \n\n
    \n ${privateItemQuota === -1\n ? $l(\"Unlimited\")\n : `${privateItemCount} / ${privateItemQuota}`}\n
    \n \n\n
    = account.quota.storage * 1e9 - 5e6}>\n \n\n
    \n ${fileSize(account.usedStorage)} / ${account.quota.storage} GB\n
    \n
    \n `}\n ${sub\n ? html`\n
    \n \n\n
    \n ${$l(\"{0} / Year\", ((sub.members * sub.plan.cost) / 100).toFixed(2))}\n
    \n
    \n\n ${sub.status === SubscriptionStatus.Canceled\n ? html`\n
    \n \n\n
    \n ${$l(\"Canceled ({0} days left)\", periodDays.toString())}\n
    \n
    \n `\n : sub.status === SubscriptionStatus.Inactive\n ? html`\n
    \n \n\n
    \n ${sub.paymentRequiresAuth ? $l(\"Authentication Required\") : $l(\"Inactive\")}\n
    \n
    \n `\n : sub.status === SubscriptionStatus.Trialing\n ? html`\n
    \n \n\n
    \n ${$l(\"Trialing ({0} days left)\", trialDays.toString())}\n
    \n
    \n `\n : html``}\n `\n : \"\"}\n \n\n ${sub && sub.paymentError\n ? html`\n
    ${sub.paymentError}
    \n `\n : \"\"}\n ${!sub\n ? html`\n \n `\n : sub.paymentRequiresAuth\n ? html`\n ${$l(\"Complete Payment\")}\n `\n : sub.status === SubscriptionStatus.Inactive\n ? html`\n \n ${$l(\"Add Payment Method\")}\n \n\n \n ${$l(\"Downgrade To Free Plan\")}\n \n `\n : this.org || sub.plan.type !== PlanType.Free\n ? html`\n \n \n \n `\n : html`\n \n `}\n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { Vault } from \"@padloc/core/src/vault\";\nimport { Tag } from \"@padloc/core/src/item\";\nimport { app } from \"../globals\";\nimport { shared } from \"../styles\";\nimport { BaseElement, element, html, css, property, query } from \"./base\";\nimport { Input } from \"./input\";\nimport \"./icon\";\n\n@element(\"pl-tags-input\")\nexport class TagsInput extends BaseElement {\n @property()\n editing: boolean = false;\n @property()\n vault: Vault | null = null;\n @property()\n tags: Tag[] = [];\n @property()\n _showResults: Boolean = false;\n\n @query(\"pl-input\")\n private _input: Input;\n\n private _focusTimeout: number = 0;\n\n static styles = [\n shared,\n css`\n :host {\n display: block;\n position: relative;\n z-index: 1;\n overflow: visible;\n font-size: var(--font-size-small);\n overflow: visible;\n }\n\n .wrapper {\n flex-wrap: wrap;\n overflow: visible;\n margin-top: -6px;\n }\n\n .wrapper > * {\n margin-top: 6px;\n }\n\n .tags.small .tag {\n padding: 5px 7px;\n }\n\n .results {\n padding: 0;\n border-radius: 8px;\n margin-top: 0;\n flex-direction: column;\n align-items: flex-start;\n }\n\n .results .tag {\n padding: 6px 8px;\n margin-top: 6px;\n }\n\n .input-wrapper {\n font-size: var(--font-size-micro);\n padding: 0 4px;\n height: 24px;\n line-height: 24px;\n background: var(--color-tertiary);\n border: solid 1px var(--color-shade-4);\n border-radius: 8px;\n align-self: stretch;\n position: relative;\n min-width: 80px;\n overflow: hidden;\n }\n\n .input-wrapper pl-input {\n font-size: inherit;\n position: absolute;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n padding-left: 20px;\n top: 0;\n font-weight: bold;\n pointer-events: none;\n }\n\n .add-tag {\n height: 26px;\n overflow: visible;\n }\n\n .add-tag .input-wrapper pl-icon {\n height: 25px;\n }\n `\n ];\n\n render() {\n const { tags, editing, vault, _showResults } = this;\n const { value } = this._input || { value: \"\" };\n const results = app.state.tags\n .filter(([t]) => !this.tags.includes(t) && t !== value && t.toLowerCase().startsWith(value))\n .map(([t]) => t);\n if (value) {\n results.push(value);\n }\n\n return html`\n
    \n
    this._vaultClicked()}>\n \n\n
    ${vault}
    \n
    \n\n ${tags.map(\n tag => html`\n
    this._tagClicked(tag)}>\n \n\n
    ${tag}
    \n\n \n
    \n `\n )}\n\n
    \n
    this._input.focus()}>\n \n\n this._addTag(value)}\n @input=${() => this.requestUpdate()}\n @focus=${() => this._focusChanged()}\n @blur=${() => this._focusChanged()}\n >\n \n
    \n\n
    \n ${results.map(\n res => html`\n
    this._addTag(res)}>\n \n\n
    ${res}
    \n
    \n `\n )}\n
    \n
    \n
    \n `;\n }\n\n private _addTag(tag: Tag) {\n if (!tag || this.tags.includes(tag)) {\n return;\n }\n this.tags.push(tag);\n this._input.value = \"\";\n this._showResults = false;\n this.requestUpdate();\n }\n\n private _tagClicked(tag: Tag) {\n if (this.editing) {\n this.tags = this.tags.filter(t => t !== tag);\n }\n }\n\n private _vaultClicked() {\n this.dispatch(\"move\");\n }\n\n _focusChanged() {\n clearTimeout(this._focusTimeout);\n setTimeout(() => (this._showResults = this._input.focused), this._input.focused ? 0 : 200);\n }\n}\n","// @ts-ignore\nimport autosize from \"autosize/src/autosize\";\nimport { element, html, property } from \"./base\";\nimport { BaseInput } from \"./base-input\";\n\n@element(\"pl-textarea\")\nexport class Textarea extends BaseInput {\n @property()\n autosize: boolean = false;\n\n updated() {\n if (this.autosize) {\n setTimeout(() => autosize(this._inputElement));\n }\n }\n\n _renderInput() {\n const { placeholder, readonly, noTab, disabled, autocapitalize, required } = this;\n\n return html`\n \n `;\n }\n}\n","import { shared, mixins } from \"../styles\";\nimport { BaseElement, element, html, css, property, query } from \"./base\";\nimport { Toggle } from \"./toggle\";\n\n@element(\"pl-toggle-button\")\nexport class ToggleButton extends BaseElement {\n @property()\n active: boolean = false;\n @property({ reflect: true })\n reverse: boolean = false;\n @property()\n label: string = \"\";\n\n @query(\"pl-toggle\")\n _toggle: Toggle;\n\n static styles = [\n shared,\n css`\n :host {\n display: block;\n font-size: inherit;\n padding: 12px 15px;\n }\n\n button {\n background: transparent;\n display: flex;\n width: 100%;\n align-items: center;\n height: 100%;\n padding: 0;\n line-height: normal;\n text-align: left;\n }\n\n button > div {\n flex: 1;\n ${mixins.ellipsis()}\n }\n\n :host(:not([reverse])) button > div {\n padding-left: 0.5em;\n }\n\n :host([reverse]) button > div {\n padding-right: 0.5em;\n }\n\n :host([reverse]) button {\n flex-direction: row-reverse;\n }\n\n pl-toggle {\n display: inline-block;\n pointer-events: none;\n }\n `\n ];\n\n render() {\n const { active, label } = this;\n return html`\n \n`;\n }\n\n toggle() {\n this._toggle.toggle();\n }\n}\n","import { BaseElement, element, html, css, property, listen } from \"./base\";\nimport { shared } from \"../styles\";\n\n@element(\"pl-toggle\")\nexport class Toggle extends BaseElement {\n @property({ reflect: true })\n active: boolean = false;\n @property() notap: boolean = false;\n\n static styles = [\n shared,\n css`\n :host {\n --width: var(--toggle-width, 36px);\n --height: var(--toggle-height, 24px);\n --gutter-width: var(--toggle-gutter-width, 2px);\n --color-off: var(--toggle-color-off, var(--color-foreground));\n --color-on: var(--toggle-color-on, var(--color-highlight));\n --color-knob: var(--toggle-color-knob, var(--color-background));\n\n display: inline-block;\n width: var(--width);\n height: var(--height);\n background: var(--color-off);\n border-radius: var(--height);\n\n transition: background 0.5s ease;\n }\n\n .knob {\n --size: calc(var(--height) - 2 * var(--gutter-width));\n display: block;\n height: var(--size);\n width: var(--size);\n margin: var(--gutter-width);\n background: var(--color-knob);\n border-radius: var(--size);\n\n transition: transform 0.5s cubic-bezier(1, -0.5, 0, 1.5) -0.2s, background 0.5s, opacity 0.5s;\n }\n\n :host([active]) {\n background: var(--color-on);\n }\n\n :host([active]) .knob {\n --dx: calc(var(--width) - var(--height));\n transform: translate(var(--dx), 0);\n }\n `\n ];\n\n render() {\n return html`\n
    \n `;\n }\n\n @listen(\"click\")\n _click() {\n if (!this.notap) {\n this.toggle();\n }\n }\n\n toggle() {\n this.active = !this.active;\n this.dispatch(\"change\", { value: this.active, prevValue: !this.active }, true, true);\n }\n}\n","import { styleMap } from \"lit-html/directives/style-map.js\";\nimport { hotp } from \"@padloc/core/src/otp\";\nimport { base32ToBytes } from \"@padloc/core/src/encoding\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { shared } from \"../styles\";\nimport { BaseElement, element, html, svg, css, property, observe } from \"./base\";\nimport \"./icon\";\n\n@element(\"pl-totp\")\nexport class TOTPElement extends BaseElement {\n @property()\n secret: string = \"\";\n\n @property()\n interval = 30;\n\n @property()\n token = \"\";\n\n @property()\n private _error = \"\";\n\n @property()\n private _age = 0;\n\n private _counter = 0;\n private _updateTimeout = -1;\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n align-items: center;\n user-select: text;\n -webkit-user-select: text;\n font: inherit;\n white-space: normal !important;\n }\n\n .countdown {\n width: 1em;\n height: 1em;\n margin-left: 0.3em;\n border-radius: 100%;\n }\n\n .countdown circle {\n transform-origin: center center;\n transform: rotate(-90deg);\n fill: none;\n stroke: currentColor;\n stroke-width: 8;\n stroke-dasharray: 25;\n transition: stroke-dashoffset 1s linear;\n }\n\n .countdown circle.bg {\n opacity: 0.2;\n }\n\n .error {\n color: var(--color-negative);\n }\n `\n ];\n\n @observe(\"secret\")\n private async _update(updInt = 2000) {\n window.clearTimeout(this._updateTimeout);\n\n if (!this.secret) {\n this.token = \"\";\n this._age = 0;\n return;\n }\n\n const time = Date.now();\n\n const counter = Math.floor(time / 1000 / this.interval);\n if (counter !== this._counter) {\n try {\n this.token = await hotp(base32ToBytes(this.secret), counter);\n this._error = \"\";\n } catch (e) {\n this.token = \"\";\n this._error = $l(\"Invalid Code\");\n this._age = 0;\n return;\n }\n this._counter = counter;\n }\n\n this._age = ((Date.now() / 1000) % this.interval) / this.interval;\n\n if (updInt) {\n this._updateTimeout = window.setTimeout(() => this._update(updInt), updInt);\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._update();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.clearTimeout(this._updateTimeout);\n }\n\n render() {\n return html`\n ${this._error\n ? html`\n ${this._error}\n `\n : html`\n \n ${this.token.substring(0, 3)} ${this.token.substring(3, 6)}\n \n `}\n ${svg`\n \n \n \n \n `}\n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { ErrorCode } from \"@padloc/core/src/error\";\nimport { biometricAuth } from \"@padloc/core/src/platform\";\nimport { app, router } from \"../globals\";\nimport { isTouch } from \"../lib/util\";\nimport { element, property, html, css, query, listen } from \"./base\";\nimport { StartForm } from \"./start-form\";\nimport { PasswordInput } from \"./password-input\";\nimport { LoadingButton } from \"./loading-button\";\nimport { alert, confirm, choose } from \"../lib/dialog\";\nimport \"./logo\";\n\n@element(\"pl-unlock\")\nexport class Unlock extends StartForm {\n @property()\n private _errorMessage: string;\n\n @query(\"#passwordInput\")\n private _passwordInput: PasswordInput;\n\n @query(\"#unlockButton\")\n private _unlockButton: LoadingButton;\n\n @query(\"#bioauthButton\")\n private _bioauthButton: LoadingButton;\n\n private _failedCount = 0;\n\n async reset() {\n if (!this._passwordInput) {\n return;\n }\n this._passwordInput.value = \"\";\n this._errorMessage = \"\";\n this._unlockButton.stop();\n this._failedCount = 0;\n super.reset();\n\n if (!isTouch()) {\n setTimeout(() => this._passwordInput.focus(), 100);\n }\n\n if (\n app.account &&\n app.account.locked &&\n app.supportsBiometricUnlock &&\n app.remembersMasterKey &&\n !(\"nobio\" in router.params)\n ) {\n this._bioAuth();\n }\n\n setTimeout(() => {\n this._bioauthButton.classList.toggle(\"show\", app.supportsBiometricUnlock);\n }, 1000);\n }\n\n static styles = [\n ...StartForm.styles,\n css`\n .current-account {\n font-size: var(--font-size-tiny);\n margin: 30px;\n }\n\n .logout {\n text-decoration: underline;\n cursor: pointer;\n }\n\n .account {\n position: relative;\n }\n\n .account pl-icon {\n position: absolute;\n right: 5px;\n top: 6px;\n }\n\n .bioauth-button {\n background: transparent;\n width: 50px;\n transition: transform 0.5s cubic-bezier(1, -0.3, 0, 1.3), opacity 0.5s;\n position: absolute;\n bottom: 12px;\n left: 0;\n right: 0;\n margin: auto;\n }\n\n .bioauth-button:not(.show) {\n opacity: 0;\n transform: scale(0);\n }\n\n .bioauth-button pl-icon {\n font-size: 140%;\n width: 50px;\n height: 50px;\n }\n\n @supports (-webkit-overflow-scrolling: touch) {\n .bioauth-button {\n bottom: max(env(safe-area-inset-bottom), 12px);\n }\n }\n `\n ];\n\n render() {\n const email = app.account && app.account.email;\n return html`\n
    \n\n
    \n \n\n
    \n \n \n
    \n\n this._submit()}\n >\n \n\n this._submit()}>\n ${$l(\"Unlock\")}\n \n\n
    ${this._errorMessage}
    \n \n\n
    \n\n \n \n \n `;\n }\n\n private async _submit() {\n if (this._unlockButton.state === \"loading\") {\n return;\n }\n\n this._passwordInput.blur();\n\n if (!this._passwordInput.value) {\n this._errorMessage = $l(\"Please enter your master password!\");\n this.rumble();\n this._passwordInput.focus();\n return;\n }\n\n this._errorMessage = \"\";\n this._unlockButton.start();\n try {\n await app.unlock(this._passwordInput.value);\n this._unlockButton.success();\n this.done();\n } catch (e) {\n this._unlockButton.fail();\n if (e.code !== ErrorCode.DECRYPTION_FAILED) {\n throw e;\n }\n this._errorMessage = $l(\"Wrong password! Please try again.\");\n this.rumble();\n\n this._failedCount++;\n if (this._failedCount > 2) {\n const recover = await confirm(\n $l(\"Can't remember your master password?\"),\n $l(\"Recover Account\"),\n $l(\"Try Again\")\n );\n if (recover) {\n router.go(\"recover\", { email: app.account!.email });\n }\n } else {\n this._passwordInput.focus();\n }\n }\n }\n\n private async _showMenu() {\n const choice = await choose(\"\", [$l(\"Logout / Switch Account\"), $l(\"Forgot Password\")]);\n switch (choice) {\n case 0:\n this._logout();\n break;\n case 1:\n router.go(\"recover\", { email: app.account!.email });\n break;\n }\n }\n\n private async _logout() {\n const confirmed = await confirm($l(\"Are you sure you want to log out of this account?\"));\n if (confirmed) {\n await app.logout();\n router.go(\"login\");\n }\n }\n\n private async _bioAuth() {\n if (this._bioauthButton.state === \"loading\") {\n return;\n }\n\n this._bioauthButton.start();\n\n try {\n if (app.remembersMasterKey) {\n const authenticated = await biometricAuth();\n\n if (!authenticated) {\n this._bioauthButton.fail();\n return;\n }\n\n try {\n await app.unlockWithRememberedMasterKey();\n } catch (e) {\n this.dispatch(\"enable-biometric-auth\", {\n message: $l(\"Biometric unlock expired. Complete setup to reeneable.\")\n });\n }\n\n this._bioauthButton.success();\n } else {\n this.dispatch(\"enable-biometric-auth\");\n this._bioauthButton.stop();\n }\n } catch (error) {\n this._bioauthButton.fail();\n alert($l(\"Biometric unlock failed! Reason: {0}\", error.message), {\n title: $l(\"Failed To Unlock\"),\n type: \"warning\"\n });\n }\n }\n\n @listen(\"visibilitychange\", document)\n _focused() {\n setTimeout(() => {\n if (app.state.locked && this.classList.contains(\"showing\") && document.visibilityState !== \"hidden\") {\n this._passwordInput && this._passwordInput.focus();\n }\n }, 100);\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { Org } from \"@padloc/core/src/org\";\nimport { Plan, UpdateBillingParams } from \"@padloc/core/src/billing\";\nimport { dialog } from \"../lib/dialog\";\nimport { app } from \"../globals\";\nimport { element, html, property, css, query } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport \"./card-input\";\nimport { ChoosePlanDialog } from \"./choose-plan-dialog\";\nimport { Input } from \"./input\";\n\n@element(\"pl-update-subscription-dialog\")\nexport class UpdateSubscriptionDialog extends Dialog {\n @property()\n org: Org | null = null;\n\n @property()\n plan: Plan | null = null;\n\n @property()\n quantity: number = 1;\n\n @property()\n private _error = \"\";\n\n @query(\"#quantityInput\")\n private _quantityInput: Input;\n\n @query(\"#submitButton\")\n private _submitButton: LoadingButton;\n\n @dialog(\"pl-choose-plan-dialog\")\n private _choosePlanDialog: ChoosePlanDialog;\n\n async show(org: Org) {\n const promise = super.show();\n this._error = \"\";\n this.org = org;\n const sub = org.billing && org.billing.subscription;\n if (sub) {\n this.plan = sub.plan;\n this.quantity = sub.members;\n } else {\n this._changePlan();\n }\n return promise;\n }\n\n private async _submit() {\n if (this._submitButton.state === \"loading\") {\n return;\n }\n\n this._error = \"\";\n this._submitButton.start();\n\n const params = new UpdateBillingParams({\n plan: this.plan!.id,\n members: this.quantity,\n org: this.org!.id\n });\n try {\n await app.updateBilling(params);\n this._submitButton.success();\n this.done();\n } catch (e) {\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n this._submitButton.fail();\n }\n }\n\n private async _updateQuantity() {\n const quantity = parseInt(this._quantityInput.value);\n const { min, max } = this.plan!;\n if (!isNaN(quantity) && quantity >= min && quantity <= max) {\n this.quantity = quantity;\n }\n }\n\n private async _changePlan() {\n this.open = false;\n const plan = await this._choosePlanDialog.show(this.org || undefined);\n if (plan) {\n this.plan = plan;\n this.quantity = plan.min;\n }\n this.open = true;\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: transparent;\n box-shadow: none;\n background: var(--color-quaternary);\n text-align: center;\n }\n\n .plan {\n text-align: center;\n padding: 20px;\n background: var(--color-highlight);\n color: var(--color-highlight-text);\n display: flex;\n flex-direction: column;\n position: relative;\n }\n\n .plan-name {\n font-size: 1.7rem;\n margin-bottom: 8px;\n font-weight: bold;\n }\n\n .plan-price {\n letter-spacing: 0.1em;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n font-weight: bold;\n font-size: 1rem;\n margin: 5px;\n }\n\n .plan-price-currency {\n line-height: 1em;\n margin-top: 0.4em;\n }\n\n .plan-price-dollars {\n font-size: 3em;\n line-height: 1em;\n }\n\n .plan-price-cents {\n font-size: 1.5em;\n line-height: 1em;\n margin-top: 0.2em;\n }\n\n .plan-unit {\n font-size: var(--font-size-small);\n }\n\n .plan-fineprint {\n font-size: var(--font-size-tiny);\n opacity: 0.7;\n margin: 4px 0 -4px 0;\n }\n\n pl-loading-button {\n font-weight: bold;\n }\n\n pl-loading-button.primary {\n background: var(--color-highlight);\n color: var(--color-highlight-text);\n font-weight: bold;\n border-bottom: solid 3px var(--color-shade-2);\n }\n\n .quantity-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 8px;\n }\n\n .quantity-label {\n font-weight: bold;\n padding: 12px;\n font-size: 1.2em;\n text-align: left;\n }\n\n .quantity-input {\n width: 60px;\n margin: 0;\n font-weight: bold;\n font-size: 1.5rem;\n }\n\n .quantity-minmax {\n font-size: var(--font-size-micro);\n opacity: 0.5;\n text-align: right;\n padding: 12px;\n }\n\n .edit-plan-icon {\n position: absolute;\n top: 8px;\n right: 8px;\n }\n `\n ];\n\n renderContent() {\n const plan = this.plan;\n\n if (!plan) {\n return html``;\n }\n\n const color = plan.color;\n const monthlyPrice = Math.round((this.quantity * plan.cost) / 12);\n\n return html`\n
    \n

    ${$l(\"Update Subscription\")}

    \n\n
    \n \n\n
    \n ${plan.name}\n
    \n\n
    \n
    $
    \n
    \n ${Math.floor(monthlyPrice / 100)}\n
    \n
    \n .${(monthlyPrice % 100).toString().padEnd(2, \"0\")}\n
    \n
    \n\n
    \n ${$l(\"per month\")}\n
    \n\n
    \n (${$l(\"USD, billed annually\")})\n
    \n\n
    \n
    \n\n
    \n
    \n
    ${$l(\"{0} min\", plan.min.toString())}
    \n
    ${$l(\"{0} max\", plan.max.toString())}
    \n
    \n (this._quantityInput.value = this.quantity.toString())}\n >\n
    \n ${$l(\"Seats\")}\n
    \n
    \n\n
    \n ${this._error}\n
    \n\n
    \n \n ${$l(\"Update\")}\n \n\n \n
    \n
    \n `;\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { VaultItemID } from \"@padloc/core/src/item\";\nimport { Attachment } from \"@padloc/core/src/attachment\";\nimport { ErrorCode } from \"@padloc/core/src/error\";\nimport { app } from \"../globals\";\nimport { fileIcon, fileSize } from \"../lib/util\";\nimport { element, html, css, property, query } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport \"./icon\";\nimport { LoadingButton } from \"./loading-button\";\nimport { Input } from \"./input\";\n\n@element(\"pl-upload-dialog\")\nexport class UploadDialog extends Dialog<{ file: File; item: VaultItemID }, Attachment> {\n static styles = [\n ...Dialog.styles,\n css`\n h1 {\n margin: 0 0 8px 0;\n }\n\n .file-info {\n display: flex;\n margin: 12px 0;\n align-items: center;\n }\n\n .file-info pl-icon {\n width: 80px;\n height: 80px;\n font-size: 60px;\n margin: 4px;\n }\n\n .name {\n font-weight: bold;\n height: auto;\n padding: 8px 12px;\n margin-right: 12px;\n margin-left: -6px;\n }\n\n .size,\n .error {\n margin-top: 8px;\n font-weight: bold;\n font-size: var(--font-size-small);\n }\n\n .error {\n color: var(--color-negative);\n }\n `\n ];\n\n @property()\n file: File | null = null;\n\n @property()\n itemId: VaultItemID | null = null;\n\n readonly preventDismiss = true;\n\n @property()\n private _progress: { loaded: number; total: number } | null = null;\n\n @property()\n private _error = \"\";\n\n @query(\"#nameInput\")\n private _nameInput: Input;\n\n @query(\"#uploadButton\")\n private _uploadButton: LoadingButton;\n\n get _item() {\n const found = (this.itemId && app.getItem(this.itemId)) || null;\n return found && found.item;\n }\n\n get _vault() {\n const found = (this.itemId && app.getItem(this.itemId)) || null;\n return found && found.vault;\n }\n\n show({ item, file }: { file: File; item: VaultItemID }) {\n this._error = \"\";\n this._progress = null;\n this.file = file;\n this.itemId = item;\n return super.show();\n }\n\n async upload() {\n if (this._uploadButton.state === \"loading\") {\n return;\n }\n\n this._progress = null;\n this._error = \"\";\n\n if (!this._nameInput.value) {\n this._error = $l(\"Please enter a name!\");\n return;\n }\n\n this._uploadButton.start();\n\n const att = await app.createAttachment(this.itemId!, this.file!, this._nameInput.value);\n\n const upload = att.uploadProgress!;\n\n const handler = () => (this._progress = upload.progress);\n\n upload.addEventListener(\"progress\", handler);\n try {\n await upload.completed;\n } catch (e) {}\n upload.removeEventListener(\"progress\", handler);\n\n this._progress = null;\n\n if (upload.error) {\n this._uploadButton.fail();\n this._error =\n upload.error.code === ErrorCode.STORAGE_QUOTA_EXCEEDED\n ? $l(\"Storage limit exceeded!\")\n : $l(\"Upload failed! Please try again!\");\n } else {\n this._uploadButton.success();\n this.done(att);\n }\n }\n\n renderContent() {\n if (!this.file) {\n return html``;\n }\n\n return html`\n
    \n \n\n
    \n

    ${$l(\"Upload Attachment\")}

    \n\n \n\n
    \n ${this._progress\n ? $l(\n \"uploading... {0}/{1}\",\n fileSize(this._progress.loaded),\n fileSize(this._progress.total)\n )\n : (this.file.type || $l(\"Unkown File Type\")) + \" - \" + fileSize(this.file.size)}\n
    \n\n
    ${this._error}
    \n
    \n
    \n\n
    \n \n
    ${this._error ? $l(\"Retry Upload\") : $l(\"Upload\")}
    \n
    \n\n \n
    \n `;\n }\n}\n","import { VaultID } from \"@padloc/core/src/vault\";\nimport { Org, Group, OrgMember } from \"@padloc/core/src/org\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { mixins } from \"../styles\";\nimport { app } from \"../globals\";\nimport { prompt } from \"../lib/dialog\";\nimport { element, html, css, property, query } from \"./base\";\nimport { Dialog } from \"./dialog\";\nimport { LoadingButton } from \"./loading-button\";\nimport { Input } from \"./input\";\nimport \"./icon\";\nimport \"./group-item\";\nimport \"./member-item\";\nimport \"./toggle\";\n\ntype InputType = { vault: { id: VaultID; name: string } | null; org: Org };\n\n@element(\"pl-vault-dialog\")\nexport class VaultDialog extends Dialog {\n @property()\n org: Org | null = null;\n\n @property()\n vault: { id: VaultID; name: string } | null = null;\n\n @query(\"#nameInput\")\n private _nameInput: Input;\n\n @query(\"#saveButton\")\n private _saveButton: LoadingButton;\n\n @query(\"#filterInput\")\n private _filterInput: Input;\n\n @property()\n private _filterString: string = \"\";\n\n @property()\n private _error: string = \"\";\n\n private _members = new Map();\n\n private _groups = new Map();\n\n private _getCurrentMembers(): Map {\n const members = new Map();\n\n if (!this.org) {\n return members;\n }\n\n for (const member of this.org.members) {\n const v = this.vault && member.vaults.find(v => v.id === this.vault!.id);\n members.set(member.id, {\n read: !!v,\n write: !!v && !v.readonly\n });\n }\n\n return members;\n }\n\n private _getCurrentGroups(): Map {\n const groups = new Map();\n\n if (!this.org) {\n return groups;\n }\n\n for (const group of this.org.groups) {\n const v = this.vault && group.vaults.find(v => v.id === this.vault!.id);\n groups.set(group.name, {\n read: !!v,\n write: !!v && !v.readonly\n });\n }\n\n return groups;\n }\n\n private get _hasChanged() {\n if (!this.org || !this._nameInput) {\n return false;\n }\n\n const currentGroups = this._getCurrentGroups();\n const groupsChanged = this.org.groups.some(({ name }) => {\n const c = currentGroups.get(name)!;\n const s = this._groups.get(name)!;\n return c.read !== s.read || c.write !== s.write;\n });\n\n const currentMembers = this._getCurrentMembers();\n const membersChanged = this.org.members.some(({ id }) => {\n const c = currentMembers.get(id)!;\n const s = this._members.get(id)!;\n return c.read !== s.read || c.write !== s.write;\n });\n\n const nameChanged = this.vault ? this.vault.name !== this._nameInput.value : !!this._nameInput.value;\n\n return (\n (this._groups.size || this._members.size) &&\n this._nameInput.value &&\n (groupsChanged || membersChanged || nameChanged)\n );\n }\n\n async show({ vault, org }: InputType): Promise {\n this._error = \"\";\n this.vault = vault;\n this.org = org;\n this._members = this._getCurrentMembers();\n this._groups = this._getCurrentGroups();\n await this.updateComplete;\n this._nameInput.value = this.vault ? this.vault.name : \"\";\n return super.show();\n }\n\n private _toggle(obj: Group | OrgMember) {\n if (obj instanceof Group) {\n const { read } = this._groups.get(obj.name)!;\n this._groups.set(obj.name, read ? { read: false, write: false } : { read: true, write: true });\n } else {\n const { read } = this._members.get(obj.id)!;\n this._members.set(obj.id, read ? { read: false, write: false } : { read: true, write: true });\n }\n this.requestUpdate();\n }\n\n private _toggleRead(obj: Group | OrgMember, event?: Event) {\n if (event) {\n event.stopImmediatePropagation();\n }\n\n const sel = obj instanceof Group ? this._groups.get(obj.name)! : this._members.get(obj.id)!;\n sel.read = !sel.read;\n if (!sel.read) {\n sel.write = false;\n }\n\n this.requestUpdate();\n }\n\n private _toggleWrite(obj: Group | OrgMember, event?: Event) {\n if (event) {\n event.stopImmediatePropagation();\n }\n\n const sel = obj instanceof Group ? this._groups.get(obj.name)! : this._members.get(obj.id)!;\n sel.write = !sel.write;\n if (sel.write) {\n sel.read = true;\n }\n\n this.requestUpdate();\n }\n\n // _toggleReadonly(group: Group) {\n // this._selection.get(group.id)!.readonly = !this._selection.get(group.id)!.readonly;\n // }\n\n private async _save() {\n this._error = \"\";\n\n const groups = [...this._groups.entries()]\n .filter(([, { read }]) => read)\n .map(([name, { write }]) => ({ name, readonly: !write }));\n\n const members = [...this._members.entries()]\n .filter(([, { read }]) => read)\n .map(([id, { write }]) => ({ id, readonly: !write }));\n\n if (!members.length && !groups.length) {\n this._error = \"You have to assign at least one member or group!\";\n return;\n }\n\n if (this._saveButton.state === \"loading\") {\n return;\n }\n\n this._saveButton.start();\n\n try {\n if (this.vault) {\n await app.updateVaultAccess(this.org!.id, this.vault.id, this._nameInput.value, members, groups);\n } else {\n await app.createVault(this._nameInput.value, this.org!, members, groups);\n }\n\n this._saveButton.success();\n this.done();\n } catch (e) {\n this._saveButton.fail();\n this._error = e.message || $l(\"Something went wrong. Please try again later!\");\n throw e;\n }\n\n this.requestUpdate();\n }\n\n private async _deleteVault() {\n this.open = false;\n const deleted = await prompt(\n $l(\n \"Are you sure you want to delete this vault? \" +\n \"All the data stored in it will be lost! \" +\n \"This action can not be undone.\"\n ),\n {\n type: \"destructive\",\n title: $l(\"Delete Vault\"),\n confirmLabel: $l(\"Delete\"),\n placeholder: $l(\"Type 'DELETE' to confirm\"),\n validate: async val => {\n if (val !== \"DELETE\") {\n throw $l(\"Type 'DELETE' to confirm\");\n }\n\n await app.deleteVault(this.vault!.id);\n\n return val;\n }\n }\n );\n\n if (deleted) {\n this.done();\n } else {\n this.open = true;\n }\n }\n\n private _updateFilter() {\n this._filterString = this._filterInput.value;\n }\n\n private _clearFilter() {\n this._filterString = this._filterInput.value = \"\";\n }\n\n shouldUpdate() {\n return !!this.org;\n }\n\n static styles = [\n ...Dialog.styles,\n css`\n .inner {\n background: var(--color-quaternary);\n }\n\n .delete-button {\n color: var(--color-negative);\n font-size: var(--font-size-default);\n }\n\n .subheader {\n margin: 8px;\n font-weight: bold;\n display: flex;\n align-items: flex-end;\n padding: 0 8px;\n font-size: var(--font-size-small);\n }\n\n .subheader .permission {\n width: 50px;\n text-align: center;\n font-size: var(--font-size-tiny);\n ${mixins.ellipsis()}\n }\n\n .item {\n display: flex;\n align-items: center;\n }\n\n .item pl-toggle {\n margin-right: 14px;\n }\n `\n ];\n\n renderContent() {\n const org = this.org!;\n const isAdmin = org.isAdmin(app.account!);\n\n const filter = this._filterString.toLowerCase();\n\n const members = filter\n ? org.members.filter(\n ({ name, email }) => email.toLowerCase().includes(filter) || name.toLowerCase().includes(filter)\n )\n : org.members;\n\n const groups = filter ? org.groups.filter(({ name }) => name.toLowerCase().includes(filter)) : org.groups;\n\n return html`\n
    \n \n this.requestUpdate()}\n >\n \n
    \n\n
    \n
    \n \n \n \n
    \n\n
    \n
    ${$l(\"Groups\")}
    \n
    \n
    ${$l(\"read\")}
    \n
    ${$l(\"write\")}
    \n
    \n\n ${groups.map(\n group => html`\n
    this._toggle(group)} ?disabled=${!isAdmin}>\n \n this._toggleRead(group, e)}\n >\n this._toggleWrite(group, e)}\n >\n
    \n `\n )}\n\n
    \n
    ${$l(\"Members\")}
    \n
    \n
    ${$l(\"read\")}
    \n
    ${$l(\"write\")}
    \n
    \n\n ${members.map(\n member => html`\n
    this._toggle(member)} ?disabled=${!isAdmin}>\n \n this._toggleRead(member, e)}\n >\n this._toggleWrite(member, e)}\n >\n
    \n `\n )}\n\n
    \n ${this._error}\n
    \n
    \n\n
    \n
    \n \n ${this.vault ? $l(\"Save\") : $l(\"Create Vault\")}\n \n\n \n
    \n
    \n `;\n }\n}\n","import { VaultID } from \"@padloc/core/src/vault\";\nimport { shared } from \"../styles\";\nimport { BaseElement, element, html, css, property } from \"./base\";\nimport \"./icon\";\n\n@element(\"pl-vault-item\")\nexport class VaultItem extends BaseElement {\n @property()\n vault: { id: VaultID; name: string };\n\n @property()\n groups: number = 0;\n\n @property()\n members: number = 0;\n\n static styles = [\n shared,\n css`\n :host {\n display: flex;\n align-items: center;\n padding: 4px 0;\n }\n\n .icon {\n font-size: 120%;\n margin: 8px;\n background: #eee;\n border: solid 1px #ddd;\n width: 45px;\n height: 45px;\n }\n\n .tags {\n margin: 4px 0;\n }\n\n .vault-name {\n font-weight: bold;\n margin-bottom: 4px;\n }\n\n .vault-info {\n flex: 1;\n width: 0;\n }\n `\n ];\n\n render() {\n return html`\n \n\n
    \n
    ${this.vault.name}
    \n\n
    \n
    \n \n\n
    ${this.groups}
    \n
    \n\n
    \n \n\n
    ${this.members}
    \n
    \n
    \n
    \n `;\n }\n}\n","import { BaseElement, property, observe, css } from \"./base\";\nimport { shared } from \"../styles\";\n\nexport class View extends BaseElement {\n static styles = [\n shared,\n css`\n @supports (-webkit-overflow-scrolling: touch) {\n header {\n padding-top: max(env(safe-area-inset-top), 8px);\n }\n\n .fabs {\n margin: calc(env(safe-area-inset-bottom) / 3);\n }\n }\n `\n ];\n\n @property()\n active: boolean = false;\n\n @observe(\"active\")\n _activeChanged() {\n if (this.active) {\n this._activated();\n } else {\n this._deactivated();\n }\n }\n\n protected _activated() {}\n\n protected _deactivated() {}\n}\n","import { TemplateResult } from \"lit-html\";\nimport { guard } from \"lit-html/directives/guard\";\nimport { BaseElement, element, property, html, css, observe, listen } from \"./base\";\nimport { mixins } from \"../styles\";\n\n@element(\"pl-virtual-list\")\nexport class VirtualList extends BaseElement {\n @property()\n data: T[] = [];\n\n @property()\n minItemWidth: number;\n\n @property()\n itemHeight: number;\n\n @property()\n renderItem: (data: T) => TemplateResult;\n\n @property()\n buffer: number = 1;\n\n @property()\n guard?: (data: T) => any[];\n\n get firstIndex() {\n return this._firstIndex;\n }\n get lastIndex() {\n return this._lastIndex;\n }\n\n private _firstIndex: number;\n private _lastIndex: number;\n private _height: number;\n private _width: number;\n private _canvasHeight: number;\n private _itemWidth: number;\n private _itemsPerRow: number;\n\n private _elements: {\n data: T | null;\n x: number;\n y: number;\n }[] = [];\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"scroll\", () => this._updateIndizes(), { passive: true });\n this._updateBounds();\n }\n\n @observe(\"data\", \"itemMinWidth\", \"minItemWidth\", \"itemHeight\")\n @listen(\"resize\", window)\n _updateBounds() {\n const { width, height } = getComputedStyle(this);\n this._width = parseInt(width!);\n this._height = parseInt(height!);\n this._itemsPerRow = Math.floor(this._width / (this.minItemWidth || this._width));\n this._itemWidth = this._width / this._itemsPerRow;\n const rowCount = Math.ceil(this.data.length / this._itemsPerRow);\n this._canvasHeight = rowCount * this.itemHeight;\n const elementCount = Math.ceil(this._height / this.itemHeight + 2 * this.buffer) * this._itemsPerRow;\n\n const els = [];\n for (let i = 0; i < elementCount; i++) {\n els.push({ data: null, x: 0, y: 0 });\n }\n this._elements = els;\n this._updateIndizes();\n this._updateElements();\n }\n\n _updateIndizes() {\n const oldFirstIndex = this._firstIndex;\n const oldLastIndex = this._lastIndex;\n this._firstIndex = Math.max(Math.floor(this.scrollTop / this.itemHeight - this.buffer) * this._itemsPerRow, 0);\n this._lastIndex = Math.min(this._firstIndex + this._elements.length, this.data.length) - 1;\n if (this._firstIndex !== oldFirstIndex || this._lastIndex !== oldLastIndex) {\n this._updateElements();\n }\n }\n\n _updateElements() {\n for (let i = this._firstIndex; i <= this._lastIndex; i++) {\n const elIndex = i % this._elements.length;\n Object.assign(this._elements[elIndex], {\n data: this.data[i],\n x: (i % this._itemsPerRow) * this._itemWidth,\n y: Math.floor(i / this._itemsPerRow) * this.itemHeight\n });\n }\n this.requestUpdate();\n }\n\n createRenderRoot() {\n return this;\n }\n\n static styles = [\n css`\n :host {\n ${mixins.scroll()}\n overflow-y: auto !important;\n overflow-x: hidden !important;\n }\n\n ::slotted(.content) {\n position: relative;\n }\n\n ::slotted(.cell) {\n position: absolute;\n will-change: transform;\n transition: transform 0.5s;\n }\n `\n ];\n\n render() {\n const { _itemWidth: w, itemHeight: h } = this;\n return html`\n
    \n ${this._elements.map(({ x, y, data }) => {\n const render = () => {\n return data !== null\n ? html`\n \n ${this.renderItem(data)}\n
    \n `\n : html``;\n };\n\n const deps = [x, y, data, w, h];\n this.guard && data && deps.push(...this.guard(data));\n return this.guard ? guard(deps, render) : render();\n })}\n \n `;\n }\n}\n\n@element(\"virtual-list-test\")\nexport class VirtualListTest extends BaseElement {\n data: { i: number }[] = [];\n\n constructor() {\n super();\n for (let i = 0; i < 10000; i++) {\n this.data.push({ i });\n }\n }\n\n static styles = [\n css`\n pl-virtual-list {\n ${mixins.fullbleed()}\n overflow-y: auto;\n }\n\n .item {\n border: solid 1px;\n margin: 5px;\n text-align: center;\n line-height: 90px;\n }\n `\n ];\n\n render() {\n return html`\n \n html`\n
    ${item.i}
    \n `}\n >\n `;\n }\n}\n","import { App } from \"@padloc/core/src/app\";\nimport { getPlatform } from \"@padloc/core/src/platform\";\nimport { Router } from \"./lib/route\";\nimport { AjaxSender } from \"./lib/ajax\";\n\nconst sender = new AjaxSender(process.env.PL_SERVER_URL!);\nexport const app = (window.app = new App(sender));\nexport const router = (window.router = new Router());\nwindow.getPlatform = getPlatform;\n","import { Err, ErrorCode } from \"@padloc/core/src/error\";\nimport { marshal, unmarshal } from \"@padloc/core/src/encoding\";\nimport { Request, Response, Sender, RequestProgress } from \"@padloc/core/src/transport\";\n\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n\nexport async function request(\n method: Method,\n url: string,\n body?: string,\n headers?: Map,\n progress?: RequestProgress\n): Promise {\n let req = new XMLHttpRequest();\n\n return new Promise((resolve, reject) => {\n req.onreadystatechange = () => {\n if (req.readyState === 4) {\n if (!req.status) {\n reject(new Err(ErrorCode.FAILED_CONNECTION));\n } else {\n resolve(req);\n }\n }\n };\n\n try {\n req.open(method, url, true);\n if (headers) {\n headers.forEach((value, key) => req.setRequestHeader(key, value));\n }\n if (progress) {\n req.onprogress = (pg: { loaded: number; total: number }) => (progress.downloadProgress = pg);\n req.upload.onprogress = (pg: { loaded: number; total: number }) => (progress.uploadProgress = pg);\n }\n req.send(body);\n } catch (e) {\n reject(new Err(ErrorCode.FAILED_CONNECTION));\n }\n });\n}\n\nexport class AjaxSender implements Sender {\n constructor(public url: string) {}\n\n async send(req: Request, progress?: RequestProgress): Promise {\n const body = marshal(req.toRaw());\n const res = await request(\n \"POST\",\n this.url,\n body,\n new Map([[\"Content-Type\", \"application/json\"], [\"Accept\", \"application/json\"]]),\n progress\n );\n try {\n return new Response().fromRaw(unmarshal(res.responseText));\n } catch (e) {\n throw new Err(ErrorCode.SERVER_ERROR);\n }\n }\n}\n","const defaults = {\n animation: \"slideIn\",\n duration: 500,\n easing: \"ease\",\n delay: 0,\n fill: \"backwards\",\n initialDelay: 0,\n fullDuration: 1000,\n clear: false,\n direction: \"normal\"\n};\n\nconst clearAnimation = new Map();\n\nexport function animateElement(el: HTMLElement, opts = {}) {\n const { animation, duration, direction, easing, delay, fill, clear } = Object.assign({}, defaults, opts);\n clearTimeout(clearAnimation.get(el));\n el.style.animation = \"\";\n el.offsetLeft;\n el.style.animation = `${animation} ${direction} ${duration}ms ${easing} ${delay}ms ${fill}`;\n if (clear) {\n const clearDelay = typeof clear === \"number\" ? clear : 0;\n clearAnimation.set(el, window.setTimeout(() => (el.style.animation = \"\"), delay + duration + clearDelay));\n }\n\n return new Promise(resolve => setTimeout(resolve, delay + duration));\n}\n\nexport function animateCascade(nodes: Iterable, opts = {}) {\n const els = Array.from(nodes);\n const { fullDuration, duration, initialDelay } = Object.assign({}, defaults, opts);\n const dt = Math.max(30, Math.floor((fullDuration - duration) / els.length));\n\n const promises = [];\n for (const [i, e] of els.entries()) {\n promises.push(animateElement(e as HTMLElement, Object.assign(opts, { delay: initialDelay + i * dt })));\n }\n\n return Promise.all(promises);\n}\n","import { VaultItem, Field } from \"@padloc/core/src/item\";\nimport \"../elements/clipboard\";\nimport { Clipboard } from \"../elements/clipboard\";\nimport { getSingleton } from \"./singleton\"\n\nexport async function setClipboard(item: VaultItem, field: Field, duration?: number) {\n const singleton = getSingleton(\"pl-clipboard\") as Clipboard;\n return singleton.set(item, field, duration);\n}\n\nexport function clearClipboard() {\n const singleton = getSingleton(\"pl-clipboard\") as Clipboard;\n singleton.clear();\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { BaseElement } from \"../elements/base\";\nimport \"../elements/generator\";\nimport \"../elements/alert-dialog\";\nimport \"../elements/prompt-dialog\";\nimport \"../elements/export-dialog\";\nimport { AlertDialog, AlertOptions } from \"../elements/alert-dialog\";\nimport { PromptDialog, PromptOptions } from \"../elements/prompt-dialog\";\nimport { getSingleton } from \"./singleton\";\n\nlet lastDialogPromise = Promise.resolve();\nlet currentDialog: any;\n\nexport const getDialog = getSingleton;\n\nexport function lineUpDialog(d: string | any, fn: (d: any) => Promise): Promise {\n const dialog = typeof d === \"string\" ? getSingleton(d) : d;\n const promise = lastDialogPromise.then(() => {\n currentDialog = dialog;\n return fn(dialog);\n });\n\n lastDialogPromise = promise;\n\n return promise;\n}\n\nexport function alert(message: string, options?: AlertOptions, instant = false): Promise {\n options = options || {};\n options.message = message;\n return instant\n ? getDialog(\"pl-alert-dialog\").show(options)\n : lineUpDialog(\"pl-alert-dialog\", (dialog: AlertDialog) => dialog.show(options));\n}\n\nexport function confirm(\n message: string,\n confirmLabel = $l(\"Confirm\"),\n cancelLabel = $l(\"Cancel\"),\n options: any = {},\n instant?: boolean\n) {\n options.options = [confirmLabel, cancelLabel];\n options.type = options.type || \"question\";\n options.horizontal = typeof options.horizontal !== \"undefined\" ? options.horizontal : true;\n return alert(message, options, instant).then(choice => choice === 0);\n}\n\nexport function prompt(message: string, opts: PromptOptions = {}, instant = false) {\n opts.message = message;\n return instant\n ? getDialog(\"pl-prompt-dialog\").show(opts)\n : lineUpDialog(\"pl-prompt-dialog\", (dialog: PromptDialog) => dialog.show(opts));\n}\n\nexport function choose(message: string, options: string[], opts: AlertOptions = {}): Promise {\n opts.options = options;\n return alert(message, {\n ...opts,\n options,\n type: \"choice\",\n vertical: true\n });\n}\n\nexport function generate() {\n return lineUpDialog(\"pl-generator\", dialog => dialog.show());\n}\n\nexport function clearDialogs() {\n if (currentDialog) {\n currentDialog.open = false;\n }\n lastDialogPromise = Promise.resolve();\n}\n\nexport function dialog(name: string) {\n return (prototype: BaseElement, propertyName: string) => {\n Object.defineProperty(prototype, propertyName, {\n get() {\n return getDialog(name);\n },\n enumerable: true,\n configurable: true\n });\n };\n}\n","import { VaultItem } from \"@padloc/core/src/item\";\nimport { PBES2Container } from \"@padloc/core/src/container\";\nimport { marshal, stringToBytes } from \"@padloc/core/src/encoding\";\nimport { loadPapa, ImportFormat, CSV, PBES2 } from \"./import\";\n\nexport const supportedFormats: ImportFormat[] = [CSV, PBES2];\nexport { CSV, PBES2 } from \"./import\";\n\nfunction itemsToTable(items: VaultItem[]) {\n // Array of column names\n let cols = [\"name\", \"tags\"];\n // Column indizes associated with field/column names\n let colInds = {};\n // Two dimensional array, starting with column names\n let table = [cols];\n\n // Fill up columns array with distinct field names\n for (let item of items) {\n for (let field of item.fields) {\n if (!colInds[field.name]) {\n colInds[field.name] = cols.length;\n cols.push(field.name);\n }\n }\n }\n\n // Creates an array of empty strings with the length of the `cols` array\n function emptyRow() {\n var l = cols.length;\n var row: string[] = [];\n while (l--) {\n row.push(\"\");\n }\n return row;\n }\n\n // Add a row for each item\n items.forEach(function (item) {\n // Create an empty row to be filled with item name, category and field values\n var row = emptyRow();\n // VaultItem name and category are always the first and second column respectively\n row[0] = item.name;\n row[1] = item.tags.join(\",\");\n\n // Fill up columns with corrensponding field values if the fields exist on the item. All\n // other columns remain empty\n item.fields.forEach(function (item) {\n row[colInds[item.name]] = item.value;\n });\n\n // Add row to table\n table.push(row);\n });\n\n return table;\n}\n\nexport async function asCSV(items: VaultItem[]): Promise {\n const papa = await loadPapa();\n return papa.unparse(itemsToTable(items));\n}\n\nexport async function asPBES2Container(items: VaultItem[], password: string): Promise {\n for (const item of items) {\n item.attachments = [];\n }\n\n const container = new PBES2Container();\n await container.unlock(password);\n await container.setData(stringToBytes(marshal({ items: items.map((item) => item.toRaw()) })));\n return container.toJSON();\n}\n","import { unmarshal, bytesToString } from \"@padloc/core/src/encoding\";\nimport { PBES2Container } from \"@padloc/core/src/container\";\nimport { validateLegacyContainer, parseLegacyContainer } from \"@padloc/core/src/legacy\";\nimport { VaultItem, Field, createVaultItem, FieldType } from \"@padloc/core/src/item\";\nimport { Err, ErrorCode } from \"@padloc/core/src/error\";\nimport { uuid } from \"@padloc/core/src/util\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\n\nexport interface ImportFormat {\n format: \"csv\" | \"padlock-legacy\" | \"lastpass\" | \"padloc\";\n toString(): string;\n}\n\nexport const CSV: ImportFormat = {\n format: \"csv\",\n toString() {\n return \"CSV\";\n }\n};\n\nexport const PADLOCK_LEGACY: ImportFormat = {\n format: \"padlock-legacy\",\n toString() {\n return \"Padlock (v2)\";\n }\n};\n\nexport const LASTPASS: ImportFormat = {\n format: \"lastpass\",\n toString() {\n return \"LastPass\";\n }\n};\n\nexport const PBES2: ImportFormat = {\n format: \"padloc\",\n toString() {\n return \"Encrypted Container\";\n }\n};\n\nexport const supportedFormats: ImportFormat[] = [CSV, PADLOCK_LEGACY, LASTPASS, PBES2];\n\nexport function loadPapa(): Promise {\n return import(/* webpackChunkName: \"papaparse\" */ \"papaparse\");\n}\n\n/**\n * Takes a data table (represented by a two-dimensional array) and converts it\n * into an array of items\n * @param Array data Two-dimensional array containing tabular item data; The first 'row'\n * should contain field names. All other rows represent items, containing\n * the item name, field values and optionally a list of tags.\n * @param Integer nameColIndex Index of the column containing the item names. Defaults to 0\n * @param Integer tagsColIndex Index of the column containing the item categories. If left empty\n * no categories will be used\n */\nexport async function fromTable(data: string[][], nameColIndex?: number, tagsColIndex?: number): Promise {\n // Use first row for column names\n const colNames = data[0];\n\n if (nameColIndex === undefined) {\n const i = colNames.indexOf(\"name\");\n nameColIndex = i !== -1 ? i : 0;\n }\n\n if (tagsColIndex === undefined) {\n tagsColIndex = colNames.indexOf(\"tags\");\n if (tagsColIndex === -1) {\n tagsColIndex = colNames.indexOf(\"category\");\n }\n }\n\n // All subsequent rows should contain values\n let items = data.slice(1).map(function(row) {\n // Construct an array of field object from column names and values\n let fields: Field[] = [];\n for (let i = 0; i < row.length; i++) {\n // Skip name column, category column (if any) and empty fields\n if (i != nameColIndex && i != tagsColIndex && row[i]) {\n const name = colNames[i];\n const value = row[i];\n fields.push(\n new Field().fromRaw({\n name,\n value\n })\n );\n }\n }\n\n const name = row[nameColIndex!];\n const tags = row[tagsColIndex!];\n return createVaultItem(name, fields, (tags && tags.split(\",\")) || []);\n });\n\n return Promise.all(items);\n}\n\nexport async function isCSV(data: string): Promise {\n const papa = await loadPapa();\n return papa.parse(data).errors.length === 0;\n}\n\nexport async function asCSV(data: string, nameColIndex?: number, tagsColIndex?: number): Promise {\n const papa = await loadPapa();\n const parsed = papa.parse(data);\n if (parsed.errors.length) {\n throw new Err(ErrorCode.INVALID_CSV);\n }\n return fromTable(parsed.data, nameColIndex, tagsColIndex);\n}\n\n/**\n * Checks if a given string represents a Padlock enrypted backup\n */\nexport function isPadlockV1(data: string): boolean {\n try {\n return validateLegacyContainer(unmarshal(data));\n } catch (e) {\n return false;\n }\n}\n\nexport async function asPadlockLegacy(data: string, password: string): Promise {\n const container = parseLegacyContainer(unmarshal(data));\n await container.unlock(password);\n return importLegacyContainer(container);\n}\n\nexport async function importLegacyContainer(container: PBES2Container) {\n const records = unmarshal(bytesToString(await container.getData())) as any[];\n const items = records\n .filter(({ removed }) => !removed)\n .map(async ({ name = \"Unnamed\", fields = [], tags, category, updated }) => {\n return new VaultItem().fromRaw({\n id: await uuid(),\n name,\n fields,\n tags: tags || [category],\n updated,\n updatedBy: \"\",\n attachments: []\n });\n });\n\n return Promise.all(items);\n}\n\nexport function isPBES2Container(data: string) {\n try {\n new PBES2Container().fromRaw(unmarshal(data));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport async function asPBES2Container(data: string, password: string): Promise {\n const container = new PBES2Container().fromRaw(unmarshal(data));\n await container.unlock(password);\n\n const raw = unmarshal(bytesToString(await container.getData())) as any;\n\n const items = raw.items.map((item: any) => {\n // Due to a bug in < v1.3.4 items were not serialized properly, so we may\n // need this additional step\n if (typeof item === \"string\") {\n try {\n item = unmarshal(item);\n } catch (e) {}\n }\n return new VaultItem().fromRaw(item);\n });\n\n return items;\n}\n\n/*\n * Lastpass secure notes are exported by putting non-standard fields into the 'extra' column. Every line\n * represents a field in the following format:\n *\n * field_name:data\n *\n * We're parsing that information to retrieve the individual fields\n */\nfunction lpParseNotes(str: string): Field[] {\n let lines = str.split(\"\\n\");\n let fields = lines\n .filter(line => !!line)\n .map(line => {\n let split = line.indexOf(\":\");\n return new Field({\n name: line.substring(0, split),\n value: line.substring(split + 1),\n type: FieldType.Text\n });\n });\n return fields;\n}\n\n/*\n * Parses a single row in a LastPass CSV file. Apart from extracting the default fields, we also parse\n * the 'extra' column for 'special notes' and remove any special fields that are not needed outside of\n * LastPass\n */\nasync function lpParseRow(row: string[]): Promise {\n const nameIndex = 4;\n const categoryIndex = 5;\n const urlIndex = 0;\n const usernameIndex = 1;\n const passwordIndex = 2;\n const notesIndex = 3;\n\n let fields: Field[] = [\n new Field({ name: $l(\"Username\"), value: row[usernameIndex], type: FieldType.Username }),\n new Field({ name: $l(\"Password\"), value: row[passwordIndex], type: FieldType.Password }),\n new Field({ name: $l(\"URL\"), value: row[urlIndex], type: FieldType.Url })\n ];\n let notes = row[notesIndex];\n\n if (row[urlIndex] === \"http://sn\") {\n // The 'http://sn' url indicates that this line represents a 'secure note', which means\n // we'll have to parse the 'extra' column to retrieve the individual fields\n fields.push(...lpParseNotes(notes));\n // In case of 'secure notes' we don't want the url and NoteType field\n fields = fields.filter(f => f.name != \"url\" && f.name != \"NoteType\");\n } else {\n // We've got a regular 'site' item, so the 'extra' column simply contains notes\n fields.push(new Field({ name: $l(\"Notes\"), value: notes, type: FieldType.Note }));\n }\n\n const dir = row[categoryIndex];\n // Create a basic item using the standard fields\n return createVaultItem(row[nameIndex], fields, dir ? [dir] : []);\n}\n\nexport async function asLastPass(data: string): Promise {\n const papa = await loadPapa();\n let items = papa\n .parse(data)\n .data // Remove first row as it only contains field names\n .slice(1)\n // Filter out empty rows\n .filter((row: string[]) => row.length > 1)\n .map(lpParseRow);\n\n return Promise.all(items);\n}\n\n/**\n * Checks if a given string represents a LastPass CSV file\n */\nexport function isLastPass(data: string): boolean {\n return data.split(\"\\n\")[0] === \"url,username,password,extra,name,grouping,fav\";\n}\n\nexport function guessFormat(data: string): ImportFormat | null {\n return isPBES2Container(data)\n ? PBES2\n : isPadlockV1(data)\n ? PADLOCK_LEGACY\n : isLastPass(data)\n ? LASTPASS\n : isCSV(data)\n ? CSV\n : null;\n}\n","import { EventEmitter } from \"@padloc/core/src/event-target\";\n\nexport class Router extends EventEmitter {\n history: string[] = [];\n\n constructor(public basePath = \"/\") {\n super();\n window.addEventListener(\"popstate\", () => {\n this._pathChanged();\n });\n this._pathChanged();\n }\n\n private _pathChanged() {\n const index = (history.state && history.state.historyIndex) || 0;\n const path = this.path;\n const direction = this.history.length - 1 < index ? \"forward\" : \"backward\";\n\n if (this.history.length === index) {\n this.history.push(path);\n } else\n while (this.history.length - 1 > index) {\n this.history.pop();\n }\n\n this.dispatch(\"route-changed\", { path, direction });\n }\n\n get path() {\n return window.location.pathname.replace(new RegExp(\"^\" + this.basePath), \"\");\n }\n\n get params() {\n const params = {};\n for (const [key, value] of new URLSearchParams(window.location.search)) {\n params[key] = value;\n }\n return params;\n }\n\n set params(params: { [prop: string]: string }) {\n history.replaceState(\n { historyIndex: this.history.length - 1 },\n \"\",\n this.basePath + this.path + \"?\" + new URLSearchParams(params).toString()\n );\n this.dispatch(\"params-changed\", { params });\n }\n\n get canGoBack() {\n return this.history.length > 1;\n }\n\n go(path: string, params?: { [prop: string]: string }, replace = false) {\n params = params || this.params;\n\n // Clean out properties with value undefined\n for (const [key, value] of Object.entries(params)) {\n if (typeof value === \"undefined\") {\n delete params[key];\n }\n }\n\n const queryString = new URLSearchParams(params).toString();\n\n if (path !== this.path || queryString !== window.location.search) {\n let url = this.basePath + path;\n if (queryString) {\n url += \"?\" + queryString;\n }\n\n if (replace) {\n history.replaceState({ historyIndex: this.history.length - 1 }, \"\", url);\n } else {\n history.pushState({ historyIndex: this.history.length }, \"\", url);\n }\n this._pathChanged();\n }\n }\n\n forward() {\n history.forward();\n }\n\n back(alternate = \"\") {\n if (this.canGoBack) {\n history.back();\n } else {\n this.go(alternate);\n }\n }\n}\n","const singletons = {};\nlet container: HTMLElement;\n\nexport function getSingleton(elName: string) {\n if (!container) {\n container = document.querySelector(\"[singleton-container]\") as HTMLElement;\n }\n\n let el = singletons[elName];\n\n if (!el) {\n singletons[elName] = el = document.createElement(elName);\n container.appendChild(el);\n }\n\n return el;\n}\n","const loaded: Map> = new Map>();\nexport function loadScript(src: string, global?: string): Promise {\n if (loaded.has(src)) {\n return loaded.get(src)!;\n }\n\n const s = document.createElement(\"script\");\n s.src = src;\n s.type = \"text/javascript\";\n const p = new Promise((resolve, reject) => {\n s.onload = () => resolve(global ? window[global] : undefined);\n s.onerror = (e: string | Event) => reject(e);\n document.head.appendChild(s);\n });\n\n loaded.set(src, p);\n return p;\n}\n\nexport async function formatDateFromNow(date: Date | string | number, addSuffix = true) {\n const { distanceInWordsToNow } = await import(/* webpackChunkName: \"date-fns\" */ \"date-fns\");\n return distanceInWordsToNow(date, { addSuffix });\n}\n\nexport async function passwordStrength(pwd: string): Promise<{ score: number }> {\n // @ts-ignore\n const { default: zxcvbn } = await import(/* webpackChunkName: \"zxcvbn\" */ \"zxcvbn\");\n return zxcvbn(pwd);\n}\n\nexport function toggleAttribute(el: Element, attr: string, on: boolean) {\n if (on) {\n el.setAttribute(attr, \"\");\n } else {\n el.removeAttribute(attr);\n }\n}\n\nexport function mediaType(mimeType: string) {\n const match = mimeType.match(/(.*)\\/(.*)/);\n const [, type, subtype] = match || [\"\", \"\", \"\"];\n\n switch (type) {\n case \"video\":\n return \"video\";\n case \"audio\":\n return \"audio\";\n case \"image\":\n return \"image\";\n case \"text\":\n switch (subtype) {\n case \"csv\":\n // return \"csv\";\n case \"plain\":\n return \"text\";\n default:\n return \"code\";\n }\n case \"application\":\n switch (subtype) {\n case \"pdf\":\n return \"pdf\";\n case \"json\":\n return \"code\";\n case \"pkcs8\":\n case \"pkcs10\":\n case \"pkix-cert\":\n case \"pkix-crl\":\n case \"pkcs7-mime\":\n case \"x-x509-ca-cert\":\n case \"x-x509-user-cert\":\n case \"x-pkcs12\":\n case \"x-pkcs7-certificates\":\n case \"x-pkcs7-mime\":\n case \"x-pkcs7-crl\":\n case \"x-pem-file\":\n case \"x-pkcs12\":\n case \"x-pkcs7-certreqresp\":\n return \"certificate\";\n case \"zip\":\n case \"x-7z-compressed\":\n case \"x-freearc\":\n case \"x-bzip\":\n case \"x-bzip2\":\n case \"java-archive\":\n case \"x-rar-compressed\":\n case \"x-tar\":\n return \"archive\";\n }\n default:\n return \"\";\n }\n}\n\nexport function fileIcon(mimeType: string) {\n const mType = mediaType(mimeType);\n return mType ? `file-${mType}` : \"file\";\n}\n\nexport function fileSize(size: number = 0) {\n return size < 1e6 ? Math.ceil(size / 10) / 100 + \" KB\" : Math.ceil(size / 10000) / 100 + \" MB\";\n}\n\nexport function mask(value: string): string {\n return value && value.replace(/[^\\n]/g, \"\\u2022\");\n}\n\nexport function isTouch(): boolean {\n return window.matchMedia(\"(hover: none)\").matches;\n}\n","import { app } from \"../globals\";\n\ntype Constructor = new (...args: any[]) => T;\n\nexport function AutoLock>(baseClass: B) {\n return class extends baseClass {\n _pausedAt: Date | null = null;\n _lockTimeout?: number;\n\n get _lockDelay() {\n return app.settings.autoLockDelay * 60 * 1000;\n }\n\n constructor(...args: any[]) {\n super(...args);\n document.addEventListener(\"click\", () => this._startTimer());\n document.addEventListener(\"keydown\", () => this._startTimer());\n document.addEventListener(\"pause\", () => this._pause());\n document.addEventListener(\"resume\", () => this._resume());\n }\n\n _cancelAutoLock() {\n this._pausedAt = null;\n if (this._lockTimeout) {\n clearTimeout(this._lockTimeout);\n }\n // if (this._lockNotificationTimeout) {\n // clearTimeout(this._lockNotificationTimeout);\n // }\n }\n\n // Handler for cordova `pause` event. Records the current time for auto locking when resuming\n _pause() {\n this._pausedAt = new Date();\n }\n\n // Handler for cordova `resume` event. If auto lock is enabled and the specified time has passed\n // since the app was paused, locks the app\n _resume() {\n if (\n app.settings.autoLock &&\n !app.state.locked &&\n this._pausedAt &&\n new Date().getTime() - this._pausedAt.getTime() > this._lockDelay\n ) {\n this._doLock();\n }\n this._startTimer();\n }\n\n _doLock() {\n // if app is currently syncing restart the timer\n if (app.state.syncing) {\n this._startTimer();\n return;\n }\n\n app.lock();\n }\n\n _startTimer() {\n this._cancelAutoLock();\n if (app.settings.autoLock && !app.state.locked) {\n this._lockTimeout = window.setTimeout(() => this._doLock(), this._lockDelay);\n // this._lockNotificationTimeout = setTimeout(() => {\n // if (!this.locked && !this._pausedAt) {\n // this.notify($l(\"Auto-lock in 10 seconds\"), \"info\", 3000);\n // }\n // }, this._lockDelay - 10000);\n }\n }\n };\n}\n","import { app } from \"../globals\";\nimport { ErrorHandling } from \"./error-handling\";\n\ntype Constructor = new (...args: any[]) => T;\n\nexport function AutoSync>(baseClass: B) {\n return class extends baseClass {\n constructor(...args: any[]) {\n super(...args);\n app.loaded.then(() => this.startPeriodicSync());\n }\n\n startPeriodicSync() {\n setTimeout(async () => {\n if (app.state.loggedIn && !app.state.locked) {\n try {\n await app.synchronize();\n } catch (e) {\n await this.handleError(e);\n }\n }\n this.startPeriodicSync();\n }, app.settings.syncInterval * 60 * 1000);\n }\n };\n}\n","import { Err, ErrorCode } from \"@padloc/core/src/error\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { app, router } from \"../globals\";\nimport { alert } from \"../lib/dialog\";\n\ntype Constructor = new (...args: any[]) => T;\n\nexport interface ErrorHandling {\n handleError(error: any): Promise;\n}\n\nexport function ErrorHandling>(baseClass: B) {\n return class extends baseClass implements ErrorHandling {\n constructor(...args: any[]) {\n super(...args);\n window.addEventListener(\"error\", (e: ErrorEvent) => this.handleError(e.error));\n window.addEventListener(\"unhandledrejection\", (e: PromiseRejectionEvent) => this.handleError(e.reason));\n }\n\n async handleError(error: any) {\n error =\n error instanceof Err\n ? error\n : error instanceof Error\n ? new Err(ErrorCode.UNKNOWN_ERROR, error.message, { error })\n : new Err(ErrorCode.UNKNOWN_ERROR, error.toString());\n\n switch (error.code) {\n case ErrorCode.FAILED_CONNECTION:\n // A failed connection is interpreted as the user simply being offline,\n // which is indicated in another place in the UI\n return true;\n case ErrorCode.INVALID_SESSION:\n case ErrorCode.SESSION_EXPIRED:\n await app.logout();\n await alert($l(\"Your session has expired. Please log in again!\"), { preventAutoClose: true });\n router.go(\"login\");\n return true;\n\n // These are expected to occur during a user lifecycle and can be ingored.\n case ErrorCode.ACCOUNT_EXISTS:\n case ErrorCode.MFA_REQUIRED:\n case ErrorCode.MFA_FAILED:\n case ErrorCode.MFA_TRIES_EXCEEDED:\n case ErrorCode.ORG_FROZEN:\n case ErrorCode.ORG_QUOTA_EXCEEDED:\n case ErrorCode.MEMBER_QUOTA_EXCEEDED:\n case ErrorCode.GROUP_QUOTA_EXCEEDED:\n case ErrorCode.VAULT_QUOTA_EXCEEDED:\n case ErrorCode.STORAGE_QUOTA_EXCEEDED:\n case ErrorCode.BILLING_ERROR:\n case ErrorCode.OUTDATED_REVISION:\n case ErrorCode.MISSING_ACCESS:\n case ErrorCode.INVALID_CREDENTIALS:\n return true;\n\n case ErrorCode.UNSUPPORTED_VERSION:\n await alert(\n error.message ||\n $l(\n \"Some data associated with your account was saved with a newer version of \" +\n \"Padloc and cannot be decoded. Please install the latest version Padloc!\"\n ),\n { title: $l(\"Update Required\"), type: \"warning\" }\n );\n\n default:\n app.state._errors.push(error);\n app.publish();\n }\n\n return false;\n }\n };\n}\n","import { Workbox } from \"workbox-window\";\nimport { translate as $l } from \"@padloc/locale/src/translate\";\nimport { confirm } from \"../lib/dialog\";\n\ntype Constructor = new (...args: any[]) => T;\n\nexport function ServiceWorker>(baseClass: B) {\n return class extends baseClass {\n constructor(...args: any[]) {\n super(...args);\n if (!process.env.PL_DISABLE_SW) {\n this.initSW();\n }\n }\n\n private _wb: Workbox;\n\n private async _updateReady() {\n const confirmed = await confirm(\n $l(\"A new update is ready to install! Do you want to install it now?\"),\n $l(\"Install & Reload\"),\n $l(\"Later\"),\n { preventAutoClose: true }\n );\n\n if (confirmed) {\n // set up a listener that will reload the page as soon as the\n // previously waiting service worker has taken control.\n this._wb.addEventListener(\"controlling\", () => {\n window.location.reload();\n });\n\n // Send a message telling the service worker to skip waiting.\n // This will trigger the `controlling` event handler above.\n this._wb.messageSW({ type: \"INSTALL_UPDATE\" });\n }\n }\n\n initSW() {\n if (!(\"serviceWorker\" in navigator)) {\n return;\n }\n\n this._wb = new Workbox(\"/sw.js\");\n\n // Add an event listener to detect when the registered\n // service worker has installed but is waiting to activate.\n this._wb.addEventListener(\"waiting\", () => {\n setTimeout(() => {\n this._updateReady();\n }, 1000);\n });\n\n this._wb.register();\n }\n\n checkForUpdates() {\n this._wb.register();\n }\n };\n}\n","import { BaseElement } from \"../elements/base\";\nimport { app } from \"../globals\";\n\ntype Constructor = new (...args: any[]) => T;\n\nexport const StateMixin = >(baseElement: T) =>\n class extends baseElement {\n get app() {\n return app;\n }\n\n get state() {\n return app.state;\n }\n\n _stateHandler = this.stateChanged.bind(this);\n\n connectedCallback() {\n super.connectedCallback();\n\n app.subscribe(this._stateHandler);\n this.stateChanged();\n }\n\n disconnectedCallback() {\n app.unsubscribe(this._stateHandler);\n\n super.disconnectedCallback();\n }\n\n /**\n * The `stateChanged()` method will be called when the state is updated.\n */\n protected stateChanged() {\n this.requestUpdate();\n }\n };\n","import { css } from \"lit-element\";\n\nexport const narrowWidth = 700;\nexport const wideWidth = 1200;\n\nexport const cssVars = css`\n :host {\n --font-family: \"Nunito\";\n --font-family-fallback: sans-serif;\n --font-family-mono: \"Inconsolata\";\n\n --font-size-micro: 12px;\n --font-size-tiny: 14px;\n --font-size-small: 16px;\n --font-size-default: 18px;\n --font-weight-thin: 100;\n --font-weight-light: 300;\n --font-weight-regular: 400;\n --font-weight-bold: 700;\n\n --color-primary: #3bb7f9;\n --color-secondary: #444;\n --color-tertiary: #ffffff;\n --color-quaternary: #fafafa;\n /* --color-negative: #D7322D; */\n --color-negative: #ff6666;\n\n --color-background: var(--color-tertiary);\n --color-foreground: var(--color-secondary);\n --color-highlight: var(--color-primary);\n --color-error: var(--color-negative);\n\n --color-shade-1: rgba(0, 0, 0, 0.05);\n --color-shade-2: rgba(0, 0, 0, 0.1);\n --color-shade-3: rgba(0, 0, 0, 0.15);\n --color-shade-4: rgba(0, 0, 0, 0.2);\n\n --color-gradient-highlight-from: rgb(7, 124, 185);\n --color-gradient-highlight-to: rgb(89, 198, 255);\n --color-gradient-warning-from: #f25b00;\n --color-gradient-warning-to: #f49300;\n --color-gradient-dark-from: #222;\n --color-gradient-dark-to: #555;\n\n --color-scrim: rgba(255, 255, 255, 0.9);\n\n --color-btn-front: var(--color-foreground);\n --color-btn-back: var(--shade-3-color);\n\n --row-height: 50px;\n\n --gutter-size: 8px;\n --border-radius: 8px;\n --border-color: rgba(0, 0, 0, 0.1);\n\n --toaster-easing: cubic-bezier(1, -0.3, 0, 1.3);\n\n --shade-1-color: transparent;\n --shade-2-color: var(--color-shade-1);\n --shade-3-color: var(--color-shade-2);\n --shade-4-color: var(--color-shade-3);\n --shade-5-color: var(--color-shade-4);\n\n --narrow-width: 700px;\n --wide-width: 1200px;\n }\n`;\n","import * as mixins from \"./mixins\";\nimport * as config from \"./config\";\n\nimport { shared } from \"./shared\";\n\nexport { mixins, config, shared };\n","import { css } from \"lit-element\";\n\nexport const unselectable = () => css`\n cursor: default;\n user-select: none;\n`;\n\nexport const positionSticky = () => css`\n position: -webkit-sticky;\n position: -moz-sticky;\n position: -o-sticky;\n position: -ms-sticky;\n position: sticky;\n`;\n\nexport const fullbleed = () => css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n`;\n\nexport const scroll = (direction?: \"vertical\" | \"horizontal\") => css`\n ${direction === \"vertical\" ? css`overflow-y` : direction === \"horizontal\" ? css`overflow-x` : css`overflow`}: auto;\n -webkit-overflow-scrolling: touch;\n`;\n\nexport const ellipsis = () => css`\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nexport const absoluteCenter = () => css`\n ${fullbleed()};\n margin: auto;\n`;\n\nexport const shade1 = () => css`\n background: var(--shade-1-color);\n`;\n\nexport const shade2 = () => css`\n background: var(--shade-2-color);\n`;\n\nexport const shade3 = () => css`\n background: var(--shade-3-color);\n`;\n\nexport const shade4 = () => css`\n background: var(--shade-4-color);\n`;\n\nexport const shade5 = () => css`\n background: var(--shade-5-color);\n`;\n\nexport const card = () => css`\n background: var(--color-background);\n /* box-shadow: rgba(0, 0, 0, 0.2) 0 0 1px; */\n border-radius: var(--border-radius);\n border: solid 1px rgba(0, 0, 0, 0.1);\n border-bottom-width: 2px;\n overflow: hidden;\n`;\n\nexport const gradientHighlight = (horizontal = false) => css`\n background: linear-gradient(\n ${horizontal ? css`90deg` : css`0`},\n var(--color-gradient-highlight-from) 0%,\n var(--color-gradient-highlight-to) 100%\n );\n`;\n\nexport const gradientWarning = (horizontal = false) => css`\n background: linear-gradient(\n ${horizontal ? css`90deg` : css`0`},\n var(--color-gradient-warning-from) 0%,\n var(--color-gradient-warning-to) 100%\n );\n`;\n\nexport const gradientDark = (horizontal = false) => css`\n background: linear-gradient(\n ${horizontal ? css`90deg` : css`0`},\n var(--color-gradient-dark-from) 0%,\n var(--color-gradient-dark-to) 100%\n );\n`;\n\nexport const textShadow = () => css`\n text-shadow: rgba(0, 0, 0, 0.2) 0px 2px 0px;\n`;\n","import { css } from \"lit-element\";\nimport * as mixins from \"./mixins\";\n\nexport const shared = css`\n :host {\n user-select: none;\n -webkit-user-select: none;\n }\n\n input,\n textarea {\n user-select: auto;\n -webkit-user-select: auto;\n }\n\n input[type=\"number\"]::-webkit-outer-spin-button,\n input[type=\"number\"]::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n\n :host,\n html,\n button,\n input,\n textarea {\n font-family: var(--font-family), var(--font-family-fallback);\n font-weight: var(--font-weight-regular);\n font-size: var(--font-size-default);\n -webkit-font-smoothing: antialiased;\n -webkit-tap-highlight-color: transparent;\n }\n\n ::selection {\n background: var(--color-secondary);\n color: var(--color-tertiary);\n }\n\n a {\n text-decoration: underline;\n color: inherit;\n }\n\n button,\n a.button {\n display: inline-block;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n border: none;\n margin: 0;\n padding: 12px 15px;\n cursor: pointer;\n text-align: center;\n text-shadow: inherit;\n }\n\n button.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n button.icon pl-icon {\n width: 30px;\n height: 20px;\n margin-left: -8px;\n font-size: 90%;\n }\n\n button.arrow,\n a.button.arrow {\n padding-right: 30px;\n }\n\n button.arrow::before,\n a.button.arrow::before {\n font-family: \"FontAwesome\";\n content: \"\\\\f054\";\n display: block;\n position: absolute;\n top: 0;\n right: 15px;\n bottom: 0;\n }\n\n button,\n pl-loading-button,\n pl-toggle-button,\n a.button {\n background: var(--color-btn-back);\n border-radius: var(--border-radius);\n }\n\n button.primary,\n pl-loading-button.primary,\n a.button.primary {\n background: var(--color-highlight);\n color: var(--color-tertiary);\n font-weight: bold;\n }\n\n button.negative,\n pl-loading-button.negative,\n a.button.negative {\n background: var(--color-negative);\n color: var(--color-tertiary);\n font-weight: bold;\n }\n\n button.transparent {\n background: none;\n }\n\n button.light {\n color: var(--color-tertiary);\n }\n\n input,\n select {\n border: none;\n -webkit-appearance: none;\n -mox-appearance: none;\n appearance: none;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n text-shadow: inherit;\n color: inherit;\n border-radius: 0;\n background: transparent;\n margin: 0;\n padding: 0;\n }\n\n textarea {\n font-weight: inherit;\n font-family: inherit;\n font-size: inherit;\n color: inherit;\n border: none;\n background: transparent;\n margin: 0;\n display: block;\n padding: 0;\n border-radius: 0;\n appearance: none;\n resize: none;\n }\n\n textarea[nowrap] {\n white-space: pre;\n word-wrap: normal;\n overflow-x: scroll;\n }\n\n strong {\n font-weight: var(--font-weight-bold);\n }\n\n h1,\n h2 {\n font-weight: normal;\n }\n\n h1 {\n font-size: 150%;\n margin: 20px;\n }\n\n h2 {\n font-size: 120%;\n margin: 10px 20px 5px 20px;\n }\n\n ::-webkit-search-cancel-button {\n display: none;\n }\n\n *:focus {\n outline: none;\n }\n\n ::-webkit-input-placeholder {\n text-shadow: inherit;\n color: inherit;\n opacity: 0.6;\n }\n\n ::-webkit-scrollbar {\n display: none;\n }\n\n [hidden] {\n display: none !important;\n }\n\n [invisible] {\n opacity: 0;\n }\n\n [disabled] {\n opacity: 0.5;\n pointer-events: none !important;\n }\n\n section {\n margin: 10px 5px;\n }\n\n section > button {\n width: 100%;\n }\n\n header {\n display: flex;\n font-size: 120%;\n padding: 10px;\n background: var(--color-tertiary);\n border-bottom: solid 3px var(--color-shade-1);\n align-items: center;\n font-weight: bold;\n min-height: 40px;\n }\n\n header pl-input {\n height: auto;\n background: transparent;\n padding: 0 5px;\n }\n\n header .title {\n padding: 0 5px;\n text-align: center;\n }\n\n main {\n flex: 1;\n box-sizing: border-box;\n ${mixins.scroll()}\n overflow-x: hidden;\n position: relative;\n }\n\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n .item {\n border-radius: var(--border-radius);\n background: var(--color-tertiary);\n border: solid 1px var(--color-shade-1);\n border-bottom-width: 3px;\n margin: var(--gutter-size);\n /*box-shadow: 0px 5px 5px -5px var(--color-shade-2), 0 0 2px var(--color-shade-1);*/\n }\n\n .item.error {\n background: var(--color-negative);\n color: var(--color-tertiary);\n padding: 8px;\n text-align: center;\n }\n\n .item.padded {\n padding: 8px;\n }\n\n code {\n font-family: var(--font-family-mono);\n }\n\n pre {\n font: inherit;\n margin: 0;\n }\n\n pl-dialog .message {\n padding: 15px;\n text-align: center;\n }\n\n pl-dialog button,\n pl-dialog pl-loading-button {\n width: 100%;\n box-sizing: border-box;\n font-weight: bold;\n }\n\n .layout {\n display: flex;\n }\n\n .layout.vertical {\n flex-direction: column;\n }\n\n .layout.align-center {\n align-items: center;\n }\n\n .layout.justify-center {\n justify-content: center;\n }\n\n .spacer,\n .flex,\n [flex] {\n flex: 1;\n }\n\n .tap {\n position: relative;\n cursor: pointer;\n }\n\n .tap::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: currentColor;\n opacity: 0;\n transition: opacity 1s;\n pointer-events: none;\n border-radius: inherit;\n }\n\n .tap:active::after {\n opacity: 0.3;\n transition: none;\n }\n\n .tap::before {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: currentColor;\n opacity: 0;\n pointer-events: none;\n border-radius: inherit;\n }\n\n .tap:not(:active):hover::before {\n opacity: 0.1;\n }\n\n .tiles > :nth-child(8n + 1),\n .tiles-1 {\n ${mixins.shade1()}\n }\n\n .tiles > :nth-child(8n + 2),\n .tiles-2 {\n ${mixins.shade2()}\n }\n\n .tiles > :nth-child(8n + 3),\n .tiles-3 {\n ${mixins.shade3()}\n }\n\n .tiles > :nth-child(8n + 4),\n .tiles-4 {\n ${mixins.shade4()}\n }\n\n .tiles > :nth-child(8n + 5),\n .tiles-5 {\n ${mixins.shade5()}\n }\n\n .tiles > :nth-child(8n + 6),\n .tiles-6 {\n ${mixins.shade4()}\n }\n\n .tiles > :nth-child(8n + 7),\n .tiles-7 {\n ${mixins.shade3()}\n }\n\n .tiles > :nth-child(8n + 8),\n .tiles-8 {\n ${mixins.shade2()}\n }\n\n .ellipsis {\n ${mixins.ellipsis()}\n }\n\n pl-icon[spin] {\n animation: spin 1s infinite;\n transform-origin: center 49%;\n }\n\n .info {\n display: flex;\n align-items: center;\n }\n\n .info-icon {\n width: 80px;\n height: 80px;\n font-size: 46px;\n margin: 10px 0 10px 10px;\n }\n\n .info-body {\n padding: 20px 15px 20px 10px;\n flex: 1;\n width: 0;\n }\n\n .info-title {\n font-size: 120%;\n font-weight: bold;\n margin-bottom: 5px;\n }\n\n .info-text {\n font-size: var(--font-size-small);\n }\n\n .tags {\n display: flex;\n overflow-x: auto;\n margin: 8px 0;\n align-items: center;\n -webkit-overflow-scrolling: touch;\n }\n\n .tags::after {\n content: \"\";\n display: block;\n width: 1px;\n flex: none;\n }\n\n .tag {\n color: var(--color-tertiary);\n /*text-shadow: rgba(0, 0, 0, 0.2) 0 1px 0;*/\n font-weight: bold;\n border-radius: var(--border-radius);\n font-size: var(--font-size-tiny);\n padding: 5px 8px;\n line-height: normal;\n text-align: center;\n background: var(--color-secondary);\n }\n\n .tag:not(:last-child) {\n margin-right: 6px;\n }\n\n .tag > * {\n display: inline-block;\n vertical-align: top;\n }\n\n .tag pl-icon {\n width: 20px;\n height: 20px;\n }\n\n .tag pl-icon:first-child {\n margin-left: -2px;\n }\n\n .tag pl-icon:last-child {\n margin-right: -2px;\n }\n\n .tag.ghost {\n border: dashed 1px;\n background: transparent;\n color: var(--color-foreground);\n }\n\n .tag.highlight {\n background: var(--color-highlight);\n }\n\n .tag.warning {\n background: var(--color-negative);\n }\n\n .tags.tiny .tag {\n font-size: 12px;\n padding: 4px 6px;\n line-height: 14px;\n border-radius: 6px;\n }\n\n .tags.tiny pl-icon {\n font-size: 10px;\n width: 14px;\n height: 14px;\n }\n\n .tags.small .tag {\n font-size: var(--font-size-micro);\n padding: 4px 6px;\n line-height: 16px;\n }\n\n .tags.small pl-icon {\n font-size: 10px;\n width: 16px;\n height: 16px;\n }\n\n .record-tag.store-tag {\n ${mixins.gradientDark(true)}\n text-shadow: rgba(0, 0, 0, 0.1) 0 1px 0;\n }\n\n .fabs {\n position: absolute;\n z-index: 2;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n display: flex;\n align-items: center;\n }\n\n .fab {\n pointer-events: auto;\n border-radius: 45px;\n margin: 12px;\n box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;\n color: var(--color-tertiary);\n width: 45px;\n height: 45px;\n text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0px;\n background: var(--color-secondary);\n }\n\n button.fab {\n width: auto;\n padding: 4px 20px;\n font-weight: bold;\n }\n\n .fab.primary {\n background: var(--color-primary);\n }\n\n .fab.light {\n background: var(--color-tertiary);\n color: var(--color-secondary);\n text-shadow: none;\n }\n\n .fab:not(:last-child) {\n margin-right: 0;\n }\n\n .fab.destructive {\n background: var(--color-negative);\n }\n\n .centering {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .empty-placeholder {\n ${mixins.fullbleed()}\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 20px;\n }\n\n .empty-placeholder pl-icon {\n width: 100px;\n height: 100px;\n font-size: 50px;\n }\n\n .empty-placeholder > div {\n width: 300px;\n margin-bottom: 20px;\n }\n\n .input-wrapper {\n display: flex;\n align-items: center;\n padding: 0 10px;\n }\n\n .input-wrapper pl-input {\n padding: 0;\n background: transparent;\n }\n\n .tabs {\n display: flex;\n margin: 0 auto;\n width: auto;\n ${mixins.scroll(\"horizontal\")}\n font-size: var(--font-size-default);\n font-weight: bold;\n }\n\n .tabs > * {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 10px 15px;\n border-bottom: solid 3px var(--color-shade-1);\n }\n\n .tabs > * > pl-icon {\n margin-left: -10px;\n font-size: 90%;\n width: 35px;\n height: 35px;\n }\n\n .tabs > *[active] {\n color: var(--color-highlight);\n border-color: var(--color-highlight);\n }\n\n .search-wrapper {\n display: flex;\n align-items: center;\n position: sticky;\n top: var(--gutter-size);\n z-index: 5;\n }\n\n .search-wrapper pl-icon {\n opacity: 0.5;\n margin-left: 5px;\n }\n\n .search-wrapper pl-input {\n font-size: var(--font-size-small);\n height: auto;\n flex: 1;\n background: transparent;\n padding-left: 5px;\n }\n\n .note {\n padding: 0;\n font-size: var(--font-size-small);\n font-weight: bold;\n padding: 8px;\n box-shadow: rgba(0, 0, 0, 0.3) 0 0 3px 0;\n text-shadow: rgba(0, 0, 0, 0.2) 0 2px 0;\n background: var(--color-primary);\n }\n\n .note.error {\n background: var(--color-negative);\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes slideIn {\n from {\n transform: translate(0, 50px);\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes rumble {\n 25% {\n transform: translate(5px, 0);\n }\n 50% {\n transform: translate(-5px, -3px);\n }\n 75% {\n transform: translate(5px, 2px);\n }\n }\n\n @keyframes bounce {\n from,\n 20%,\n 40%,\n to {\n animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n\n 0% {\n transform: scale3d(0.5, 0.5, 0.5);\n }\n\n 33% {\n transform: scale3d(1.05, 1.05, 1.05);\n }\n\n 66% {\n transform: scale3d(0.98, 0.98, 0.98);\n }\n\n to {\n transform: scale3d(1, 1, 1);\n }\n }\n\n @media (min-width: 701px) {\n .menu-button {\n visibility: hidden;\n }\n\n .narrow {\n display: none !important;\n }\n }\n\n @media (max-width: 700px) {\n .wide {\n display: none;\n }\n }\n`;\n","import { stringToBytes, concatBytes, Serializable, AsSerializable, AsBytes, AsDate, AsSet, Exclude } from \"./encoding\";\nimport { RSAPublicKey, RSAPrivateKey, RSAKeyParams, HMACKey, HMACParams, HMACKeyParams } from \"./crypto\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\nimport { Err, ErrorCode } from \"./error\";\nimport { PBES2Container } from \"./container\";\nimport { Storable } from \"./storage\";\nimport { SessionInfo } from \"./session\";\nimport { VaultID } from \"./vault\";\nimport { Org, OrgID } from \"./org\";\nimport { AccountQuota } from \"./quota\";\nimport { BillingInfo } from \"./billing\";\nimport { VaultItemID } from \"./item\";\n\n/** Unique identifier for [[Account]] objects */\nexport type AccountID = string;\n\nexport class AccountSecrets extends Serializable {\n constructor({ signingKey, privateKey, favorites }: Partial = {}) {\n super();\n Object.assign(this, { signingKey, privateKey, favorites });\n }\n\n @AsBytes()\n signingKey!: Uint8Array;\n\n @AsBytes()\n privateKey!: Uint8Array;\n\n @AsSet()\n favorites = new Set();\n}\n\n/**\n * The `Account` object represents an individual Padloc user and holds general\n * account information as well as cryptographic keys necessary for accessing\n * [[Vaults]] and signing/verifying [[Org]]anization details.\n *\n * The [[privateKey]] and [[signingKey]] properties are considered secret and\n * therefore need to be encrypted at rest. For this, the [[Account]] object\n * serves as a [[PBESContainer]] which is unlocked by the users **master\n * password**.\n */\nexport class Account extends PBES2Container implements Storable {\n /** Unique account ID */\n id: AccountID = \"\";\n\n /** The users email address */\n email = \"\";\n\n /** The users display name */\n name = \"\";\n\n /** When the account was created */\n @AsDate()\n created = new Date();\n\n /** when the account was last updated */\n @AsDate()\n updated = new Date();\n\n /** The accounts public key */\n @AsBytes()\n publicKey!: RSAPublicKey;\n\n /**\n * The accounts private key\n *\n * @secret\n * **IMPORTANT**: This property is considered **secret**\n * and should never stored or transmitted in plain text\n */\n @Exclude()\n privateKey!: RSAPrivateKey;\n\n /**\n * HMAC key used for signing and verifying organization details\n *\n * **IMPORTANT**: This property is considered **secret**\n * and should never stored or transmitted in plain text\n *\n * @secret\n */\n @Exclude()\n signingKey!: HMACKey;\n\n /** List of currently active sessions */\n @AsSerializable(SessionInfo)\n sessions: SessionInfo[] = [];\n\n /** ID of the accounts main or \"private\" [[Vault]]. */\n mainVault: {\n id: VaultID;\n name?: string;\n revision?: string;\n } = { id: \"\" };\n\n /** IDs of all organizations this account is a member of */\n orgs: {\n id: OrgID;\n name?: string;\n revision?: string;\n }[] = [];\n\n /**\n * Revision id used for ensuring continuity when synchronizing the account\n * object between client and server\n */\n revision: string = \"\";\n\n @AsSerializable(AccountQuota)\n quota: AccountQuota = new AccountQuota();\n\n billingDisabled = false;\n\n @AsSerializable(BillingInfo)\n billing?: BillingInfo;\n\n usedStorage: number = 0;\n\n @Exclude()\n favorites = new Set();\n\n /**\n * Whether or not this Account object is current \"locked\" or, in other words,\n * whether the `privateKey` and `signingKey` properties have been decrypted.\n */\n get locked(): boolean {\n return !this.privateKey;\n }\n\n get masterKey() {\n return this._key;\n }\n\n set masterKey(key: Uint8Array | undefined) {\n this._key = key;\n }\n\n /**\n * Generates the accounts [[privateKey]], [[publicKey]] and [[signingKey]] and\n * encrypts [[privateKey]] and [[singingKey]] using the master password.\n */\n async initialize(password: string) {\n const { publicKey, privateKey } = await getProvider().generateKey(new RSAKeyParams());\n this.publicKey = publicKey;\n this.privateKey = privateKey;\n this.signingKey = await getProvider().generateKey(new HMACKeyParams());\n await this.setPassword(password);\n }\n\n /** Updates the master password by reencrypting the [[privateKey]] and [[signingKey]] properties */\n async setPassword(password: string) {\n await super.unlock(password);\n await this._commitSecrets();\n this.updated = new Date();\n }\n\n /**\n * \"Unlocks\" the account by decrypting and extracting [[privateKey]] and\n * [[signingKey]] from [[encryptedData]]\n */\n async unlock(password: string) {\n await super.unlock(password);\n await this._loadSecrets();\n }\n\n /**\n * Unlocks the account by providing the encryption key directly rather than\n * deriving it fro the master password\n */\n async unlockWithMasterKey(key: Uint8Array) {\n this._key = key;\n await this._loadSecrets();\n }\n\n /**\n * \"Locks\" the account by deleting all sensitive data from the object\n */\n lock() {\n super.lock();\n delete this.privateKey;\n delete this.signingKey;\n delete this.favorites;\n }\n\n clone() {\n const clone = super.clone();\n clone.copySecrets(this);\n return clone;\n }\n\n toString() {\n return this.name || this.email;\n }\n\n /**\n * Creates a signature that can be used later to verify an organizations id and public key\n */\n async signOrg({ id, publicKey }: { id: string; publicKey: Uint8Array }) {\n return getProvider().sign(this.signingKey, concatBytes([stringToBytes(id), publicKey], 0x00), new HMACParams());\n }\n\n /**\n * Verifies an organizations id an public key, using the signature stored\n * in the [[Member]] object associated with the account.\n */\n async verifyOrg(org: Org): Promise {\n if (!this.signingKey) {\n throw \"Account needs to be unlocked first\";\n }\n\n const member = org.getMember(this);\n\n if (!member) {\n throw new Err(ErrorCode.VERIFICATION_ERROR, \"Account is not a member.\");\n }\n\n const verified = await getProvider().verify(\n this.signingKey,\n member.orgSignature,\n concatBytes([stringToBytes(org.id), org.publicKey], 0x00),\n new HMACParams()\n );\n\n if (!verified) {\n throw new Err(ErrorCode.VERIFICATION_ERROR, `Failed to verify public key of ${org.name}!`);\n }\n }\n\n async toggleFavorite(id: VaultItemID, favorite: boolean) {\n favorite ? this.favorites.add(id) : this.favorites.delete(id);\n await this._commitSecrets();\n }\n\n copySecrets(account: Account) {\n this.privateKey = account.privateKey;\n this.signingKey = account.signingKey;\n this.favorites = account.favorites;\n this._key = account._key;\n }\n\n private async _loadSecrets() {\n const secrets = new AccountSecrets().fromBytes(await this.getData());\n if (!secrets.favorites) {\n secrets.favorites = new Set();\n }\n Object.assign(this, secrets);\n }\n\n private async _commitSecrets() {\n const secrets = new AccountSecrets(this);\n await this.setData(secrets.toBytes());\n }\n}\n","import { Session, SessionID } from \"./session\";\nimport { Account, AccountID } from \"./account\";\nimport { Auth } from \"./auth\";\nimport { Vault, VaultID } from \"./vault\";\nimport { Org, OrgID } from \"./org\";\nimport { Invite, InviteID } from \"./invite\";\nimport { Serializable, SerializableConstructor, AsBytes, AsSerializable } from \"./encoding\";\nimport { Attachment, AttachmentID } from \"./attachment\";\nimport { BillingProviderInfo, UpdateBillingParams } from \"./billing\";\nimport { PBKDF2Params } from \"./crypto\";\nimport { PBES2Container } from \"./container\";\nimport { RequestProgress } from \"./transport\";\nimport { MFAPurpose, MFAType } from \"./mfa\";\n\n/**\n * Api parameters for creating a new Account to be used with [[API.createAccount]].\n */\nexport class CreateAccountParams extends Serializable {\n /** The [[Account]] object containing the relevant information */\n @AsSerializable(Account)\n account!: Account;\n\n /**\n * An [[Auth]] object container the verifier and authentication params\n * required for subsequent authentication\n */\n @AsSerializable(Auth)\n auth!: Auth;\n\n /**\n * The verification token obtained from [[API.completeEmailVerification]].\n */\n verify: string = \"\";\n\n /**\n * The corresponding [[InviteID]] and [[OrgID]] if signup was initiated\n * through an invite link.\n *\n * @optional\n */\n invite?: {\n id: InviteID;\n org: OrgID;\n } = undefined;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for initiating account recovery to be used with [[API.recoverAccount]]\n */\nexport class RecoverAccountParams extends Serializable {\n /** The newly initialized [[Account]] object */\n @AsSerializable(Account)\n account!: Account;\n\n /** The new authentication parameters */\n @AsSerializable(Auth)\n auth!: Auth;\n\n /** An email verification token obtained from [[API.completeEmailVerification]] */\n verify: string = \"\";\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for requesting email verfication through [[API.requestEmailVerification]]\n * @deprecated since v3.1.0\n */\nexport class RequestEmailVerificationParams extends Serializable {\n /** The email address to be verified */\n email = \"\";\n\n /** The purpose of the email verification */\n purpose: MFAPurpose = MFAPurpose.Signup;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for completing email verification through [[API.completeEmailVerification]]\n * @deprecated since v3.1.0\n */\nexport class CompleteEmailVerificationParams extends Serializable {\n /** The email address to be verified */\n email: string = \"\";\n\n /** The verification code received via email after calling [[API.requestEmailVerification]] */\n code: string = \"\";\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for requesting Multi-Factor Authenticatino via [[API.requestMFACode]]\n */\nexport class RequestMFACodeParams extends Serializable {\n /** The accounts email address */\n email = \"\";\n\n /** The purpose of the email verification */\n purpose: MFAPurpose = MFAPurpose.Login;\n\n type: MFAType = MFAType.Email;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for retrieving MFA token via [[API.retrieveMFAToken]]\n */\nexport class RetrieveMFATokenParams extends Serializable {\n /** The email address to be verified */\n email: string = \"\";\n\n /** The verification code received via email after calling [[API.requestEmailVerification]] */\n code: string = \"\";\n\n purpose: MFAPurpose = MFAPurpose.Login;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\nexport class RetrieveMFATokenResponse extends Serializable {\n /** The verification token which can be used to authenticate certain requests */\n token: string = \"\";\n\n /** Whether the user already has an account */\n hasAccount: boolean = false;\n\n /** Whether the user has a legacy account */\n hasLegacyAccount: boolean = false;\n\n /** Token for getting legacy data. */\n legacyToken?: string = undefined;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for initiating authentication through [[API.initAuth]]\n */\nexport class InitAuthParams extends Serializable {\n /** The email address of the [[Account]] in question */\n email = \"\";\n\n /**\n * The verification token obtained from [[API.completeEmailVerification]].\n */\n verify?: string = undefined;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * The response object received from [[API.initAuth]]\n */\nexport class InitAuthResponse extends Serializable {\n /** The account id */\n account: AccountID = \"\";\n\n /** The key derivation parameters used for authentication */\n @AsSerializable(PBKDF2Params)\n keyParams: PBKDF2Params = new PBKDF2Params();\n\n /** A random value used for SRP session negotiation */\n @AsBytes()\n B!: Uint8Array;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for creating a new [[Session]] through [[API.createSession]]\n */\nexport class CreateSessionParams extends Serializable {\n /** The id of the [[Account]] to create the session for */\n account: AccountID = \"\";\n\n /** Verification value used for SRP session negotiation */\n @AsBytes()\n M!: Uint8Array;\n\n /** Random value used form SRP session negotiation */\n @AsBytes()\n A!: Uint8Array;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for fetching an [[Invite]]\n */\nexport class GetInviteParams extends Serializable {\n /** The organization id */\n org: OrgID = \"\";\n\n /** The invite id */\n id: InviteID = \"\";\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\n/**\n * Parameters for fetching an [[Attachment]]\n */\nexport class GetAttachmentParams extends Serializable {\n /** The vault id */\n vault: VaultID = \"\";\n\n /** The attachment id */\n id: AttachmentID = \"\";\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n}\n\nexport class DeleteAttachmentParams extends GetAttachmentParams {}\n\nexport class GetLegacyDataParams extends Serializable {\n constructor(vals: Partial = {}) {\n super();\n Object.assign(this, vals);\n }\n\n email: string = \"\";\n verify?: string = undefined;\n}\n\ninterface HandlerDefinition {\n method: string;\n input?: SerializableConstructor;\n output?: SerializableConstructor;\n}\n\n/**\n * Decorator for defining request handler methods\n */\nfunction Handler(\n input: SerializableConstructor | StringConstructor | undefined,\n output: SerializableConstructor | StringConstructor | undefined\n) {\n return (proto: API, method: string) => {\n if (!proto.handlerDefinitions) {\n proto.handlerDefinitions = [];\n }\n proto.handlerDefinitions.push({\n method,\n input: input === String ? undefined : (input as SerializableConstructor | undefined),\n output: output === String ? undefined : (output as SerializableConstructor | undefined)\n });\n };\n}\n\nexport type PromiseWithProgress = Promise & { progress?: RequestProgress };\n\n/**\n * Transport-agnostic interface defining communication\n * between [[Client]] and [[Server]] instances.\n */\nexport class API {\n handlerDefinitions!: HandlerDefinition[];\n\n /**\n * Request verification of a given email address. This will send a verification code\n * to the email in question which can then be exchanged for a verification token via\n * [[completeEmailVerification]].\n * @deprecated since v3.1.0\n */\n @Handler(RequestEmailVerificationParams, undefined)\n requestEmailVerification(_params: RequestEmailVerificationParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Complete the email verification process by providing a verification code received\n * via email. Returns a verification token that can be used in other api calls like\n * [[createAccount]] or [[recoverAccount]].\n * @deprecated since v3.1.0\n */\n @Handler(CompleteEmailVerificationParams, String)\n completeEmailVerification(_params: CompleteEmailVerificationParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Request verification of a given email address. This will send a verification code\n * to the email in question which can then be exchanged for a verification token via\n * [[completeEmailVerification]].\n */\n @Handler(RequestMFACodeParams, undefined)\n requestMFACode(_params: RequestMFACodeParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Complete the email verification process by providing a verification code received\n * via email. Returns a verification token that can be used in other api calls like\n * [[createAccount]] or [[recoverAccount]].\n */\n @Handler(RetrieveMFATokenParams, RetrieveMFATokenResponse)\n retrieveMFAToken(_params: RetrieveMFATokenParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Initiate the login procedure for a given account by requesting the authentication params\n * which are required for proceeding with [[createSession]].\n */\n @Handler(InitAuthParams, InitAuthResponse)\n initAuth(_params: InitAuthParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Update the authentication params stored on the server. This is usually used\n * in case a users master password has changed.\n */\n @Handler(Auth, undefined)\n updateAuth(_params: Auth): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Create new [[Session]] which can be used to authenticate future request\n */\n @Handler(CreateSessionParams, Session)\n createSession(_params: CreateSessionParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Revoke a [[Session]], effectively logging out any client authenticated with it\n */\n @Handler(String, undefined)\n revokeSession(_id: SessionID): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Create a new [[Account]]\n */\n @Handler(CreateAccountParams, Account)\n createAccount(_params: CreateAccountParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Get the [[Account]] associated with the current session\n *\n * @authentication_required\n */\n @Handler(undefined, Account)\n getAccount(): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Update the [[Account]] associated with the current session.\n *\n * @authentication_required\n */\n @Handler(Account, Account)\n updateAccount(_account: Account): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Initiate account recovery\n */\n @Handler(RecoverAccountParams, Account)\n recoverAccount(_params: RecoverAccountParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Delete current account\n */\n @Handler(undefined, undefined)\n deleteAccount(): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Create a new [[Org]]\n *\n * @authentication_required\n */\n @Handler(Org, Org)\n createOrg(_params: Org): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Get the [[Org]] for a given `id`.\n *\n * @authentication_required\n *\n * Requires the authenticated account to be a member of the given organization\n */\n @Handler(undefined, Org)\n getOrg(_id: OrgID): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Updates a given [[Org]]\n *\n * @authentication_required\n *\n * Updating members, organization name or pubic/private keys requires the [[OrgRole.Owner]]\n * role, while any other changes require the [[OrgRole.Admin]] role.\n */\n @Handler(Org, Org)\n updateOrg(_org: Org): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n @Handler(String, undefined)\n deleteOrg(_id: OrgID): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Create a new vault\n *\n * @authentication_required\n *\n * Requires the [[OrgRole.Admin]] role on the associated organization\n */\n @Handler(Vault, Vault)\n createVault(_vault: Vault): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Get the [[Vault]] with the given `id`\n *\n * @authentiation_required\n *\n * If the vault belongs to an organization, the authenticated account needs to\n * be assigned to the given vault either directly or through a [[Group]].\n * Otherwise, only access to the accounts private vault is allowed.\n */\n @Handler(String, Vault)\n getVault(_id: VaultID): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Update the given [[Vault]]\n *\n * @authentiation_required\n *\n * If vault belongs to an organization, the authenticated account needs to\n * be be assigned to the given vault either directly or through a [[Group]]\n * and have explicit write access. Otherwise, only access to the accounts\n * private vault is allowed.\n */\n @Handler(Vault, Vault)\n updateVault(_vault: Vault): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Delete the [[Vault]] with the given `id`\n *\n * @authentication_required\n *\n * Requires at least the [[OrgRole.Admin]] role on the organization the vault\n * belongs to. Private vaults cannot be deleted.\n */\n @Handler(String, undefined)\n deleteVault(_id: VaultID): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Get an [[Invite]].\n *\n * @authentication_required\n *\n * Requires the authenticated account to either be an [[OrgRole.Owner]] of\n * the associated organization or the recipient of the invite.\n */\n @Handler(GetInviteParams, Invite)\n getInvite(_params: GetInviteParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n /**\n * Accept an [[Invite]]\n *\n * @authentication_required\n *\n * Requires the authenticated account to be the recipient of the invite.\n */\n @Handler(Invite, undefined)\n acceptInvite(_invite: Invite): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n @Handler(Attachment, String)\n createAttachment(_attachment: Attachment): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n @Handler(GetAttachmentParams, Attachment)\n getAttachment(_attachment: GetAttachmentParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n @Handler(DeleteAttachmentParams, undefined)\n deleteAttachment(_attachment: DeleteAttachmentParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n @Handler(UpdateBillingParams, undefined)\n updateBilling(_params: UpdateBillingParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n @Handler(undefined, BillingProviderInfo)\n getBillingProviders(): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n @Handler(GetLegacyDataParams, PBES2Container)\n getLegacyData(_params: GetLegacyDataParams): PromiseWithProgress {\n throw \"Not implemented\";\n }\n\n @Handler(undefined, undefined)\n deleteLegacyAccount(): PromiseWithProgress {\n throw \"Not implemented\";\n }\n}\n","import { loadLanguage, translate as $l } from \"@padloc/locale/src/translate\";\nimport { Storage, Storable } from \"./storage\";\nimport {\n Serializable,\n Serialize,\n AsDate,\n AsSerializable,\n bytesToBase64,\n base64ToBytes,\n stringToBytes\n} from \"./encoding\";\nimport { Invite, InvitePurpose } from \"./invite\";\nimport { Vault, VaultID } from \"./vault\";\nimport { Org, OrgID, OrgType, OrgMember, OrgRole, Group } from \"./org\";\nimport { VaultItem, VaultItemID, Field, Tag, createVaultItem } from \"./item\";\nimport { Account, AccountID } from \"./account\";\nimport { Auth } from \"./auth\";\nimport { MFAPurpose } from \"./mfa\";\nimport { Session, SessionID } from \"./session\";\nimport {\n API,\n RequestMFACodeParams,\n RetrieveMFATokenParams,\n CreateAccountParams,\n InitAuthParams,\n InitAuthResponse,\n CreateSessionParams,\n RecoverAccountParams,\n GetInviteParams,\n GetAttachmentParams,\n DeleteAttachmentParams\n} from \"./api\";\nimport { Client } from \"./client\";\nimport { Sender } from \"./transport\";\nimport {\n DeviceInfo,\n getDeviceInfo,\n isKeyStoreAvailable,\n keyStoreSet,\n keyStoreGet,\n keyStoreDelete,\n getCryptoProvider,\n getStorage\n} from \"./platform\";\nimport { uuid, throttle } from \"./util\";\nimport { Client as SRPClient } from \"./srp\";\nimport { Err, ErrorCode } from \"./error\";\nimport { Attachment, AttachmentInfo } from \"./attachment\";\nimport { BillingProviderInfo, UpdateBillingParams } from \"./billing\";\nimport { SimpleContainer } from \"./container\";\nimport { AESKeyParams, PBKDF2Params } from \"./crypto\";\n\n/** Various usage stats */\nexport class Stats extends Serializable {\n /** Time of last sync */\n @AsDate()\n lastSync?: Date;\n}\n\n/** Various application settings */\nexport class Settings extends Serializable {\n /** Whether to lock app automatically after a certain period of inactivity */\n autoLock: boolean = true;\n /** Duration after which auto-lock is triggered, in minutes */\n autoLockDelay: number = 5;\n /** Interval for automatic sync, in minutes */\n syncInterval: number = 1;\n /** Time threshold used for filtering \"recent\" items, in days */\n recentLimit: number = 7;\n}\n\nexport interface HashedItem {\n hosts: string[];\n}\n\nexport class Index extends Serializable {\n @AsSerializable(PBKDF2Params)\n hashParams = new PBKDF2Params({ iterations: 1 });\n\n items: HashedItem[] = [];\n\n async fromItems(items: VaultItem[]) {\n const crypto = getCryptoProvider();\n\n if (!this.hashParams.salt.length) {\n this.hashParams.salt = await crypto.randomBytes(16);\n }\n\n this.items = (\n await Promise.all(\n items.map(async item => ({\n hosts: (\n await Promise.all(\n item.fields\n .filter(f => f.type === \"url\")\n .map(async f => {\n // try to parse host from url. if url is not valid,\n // assume the url field contains just the domain.\n let host = f.value;\n try {\n host = new URL(f.value).host;\n } catch (e) {}\n\n if (!host) {\n return null;\n }\n\n const hashedHost = await crypto.deriveKey(stringToBytes(host), this.hashParams);\n\n return bytesToBase64(hashedHost);\n })\n )\n ).filter(h => h !== null) as string[]\n }))\n )\n ).filter(item => item.hosts.length);\n }\n\n async matchHost(host: string) {\n const hashedHost = bytesToBase64(await getCryptoProvider().deriveKey(stringToBytes(host), this.hashParams));\n return this.items.filter(item => item.hosts.some(h => h === hashedHost)).length;\n }\n\n async fuzzyMatchHost(host: string) {\n // Try exact match first, then try to add/remove \"www.\"\n return (\n (await this.matchHost(host)) ||\n (host.startsWith(\"www.\") ? this.matchHost(host.slice(4)) : this.matchHost(\"www.\" + host))\n );\n }\n\n async matchUrl(url: string) {\n try {\n const { host } = new URL(url);\n return this.fuzzyMatchHost(host);\n } catch (e) {\n return 0;\n }\n }\n}\n\n/** Application state */\nexport class AppState extends Storable {\n id = \"app-state\";\n\n /** Application Settings */\n @AsSerializable(Settings)\n settings = new Settings();\n\n /** Usage data */\n @AsSerializable(Stats)\n stats = new Stats();\n\n /** Info about current device */\n @AsSerializable(DeviceInfo)\n device = new DeviceInfo();\n\n /** Current [[Session]] */\n @AsSerializable(Session)\n session: Session | null = null;\n\n /** Currently logged in [[Account]] */\n @AsSerializable(Account)\n account: Account | null = null;\n\n /** All organizations the current [[account]] is a member of. */\n @AsSerializable(Org)\n orgs: Org[] = [];\n\n /** All vaults the current [[account]] has access to. */\n @AsSerializable(Vault)\n vaults: Vault[] = [];\n\n /** Whether a sync is currently in process. */\n syncing = false;\n\n /** Whether the app has an internet connection at the moment */\n online = true;\n\n @AsSerializable(SimpleContainer)\n rememberedMasterKey: SimpleContainer | null = null;\n\n @AsSerializable(BillingProviderInfo)\n billingProvider: BillingProviderInfo | null = null;\n\n currentHost: string = \"\";\n\n @AsSerializable(Index)\n index: Index = new Index();\n\n /** IDs of most recently used items. The most recently used item is last */\n @Serialize({\n arrayDeserializeIndividually: false,\n fromRaw: (raw: [string, string][]) => new Map(raw.map(([id, date]) => [id, new Date(date)])),\n toRaw: (val: any) => [...val]\n })\n lastUsed = new Map();\n\n _errors: Err[] = [];\n\n /** All [[Tag]]s found within the users [[Vault]]s */\n get tags() {\n const tags = new Map();\n\n for (const vault of this.vaults) {\n for (const item of vault.items) {\n for (const tag of item.tags) {\n if (!tags.has(tag)) {\n tags.set(tag, 0);\n }\n\n tags.set(tag, tags.get(tag)! + 1);\n }\n }\n }\n\n return [...tags.entries()];\n }\n\n /** Whether the app is in \"locked\" state */\n get locked() {\n return !this.account || this.account.locked;\n }\n\n /** Whether a user is logged in */\n get loggedIn() {\n return !!this.session;\n }\n}\n\n/**\n * The `App` class is *the* user-facing top level component encapsulating all\n * functionality of the Padloc client app. It is responsible for managing\n * state, client-side persistence and synchronization with the [[Server]] and\n * exposes methods for manipulating a users [[Account]], [[Org]]anizations and\n * [[Vault]]s.\n *\n * [[App]] is completely platform-agnostic and can be used in any environment\n * capable of running JavaScript. It does however rely on platform-specific\n * providers for a number of features like storage and encryption which can\n * be \"plugged in\" as needed.\n *\n * ### Encryption\n *\n * The `@padloc/core` module does not provide or depend on any specific\n * implementation of cryptographic primitives but instead relies on\n * the [[CryptoProvider]] interface to provide those.\n *\n * Users of the [[App]] class (and of the `@padloc/core` package in general)\n * are responsible for ensuring that a secure implemenation of the\n * [[CryptoProvider]] interface is available before using any methods that\n * require cryptographic functionality. This is done through the\n * `crypto.setProvider` function (see example below).\n *\n * ### Platform API\n *\n * Certain functionality requires access to some platform APIs. For this,\n * an implementation of the [[Platform]] interface can be provided via\n * `platform.setPlatform`.\n *\n * ### Persistent Storage\n *\n * Persistent storage is provided by an implementation of the [[Storage]]\n * interface.\n *\n * ### Data Transport\n *\n * The [[Sender]] interface handles communication with the [[Server]] instance\n * through a RPC [[Request]]-[[Response]] cycle. The implementation provided\n * should match the [[Receiver]] implementation used in the [[Server]]\n * instance.\n *\n * ### Initialization Example\n *\n * ```ts\n * @import { setProvider } from \"@padloc/core/src/crypto\";\n * @import { setPlatform } from \"@padloc/core/src/platform\";\n *\n * setProvider(new NodeCryptoProvider());\n * setPlatform(new NodePlatform());\n *\n * const app = new App(new LevelDBStorage(), new HTTPSender());\n *\n * app.loaded.then(() => console.log(\"app ready!\");\n * ```\n */\nexport class App {\n /** App version */\n version = \"3.0\";\n\n /** API client for RPC calls */\n api: API;\n\n /** Application state */\n state = new AppState();\n\n /** Promise that is resolved when the app has been fully loaded */\n loaded: Promise;\n\n storage: Storage;\n\n constructor(\n /** Data transport provider */\n sender: Sender,\n storage = getStorage()\n ) {\n this.storage = storage;\n this.api = new Client(this.state, sender, (_req, _res, err) => {\n const online = !err || err.code !== ErrorCode.FAILED_CONNECTION;\n if (online !== this.state.online) {\n this.setState({ online });\n }\n });\n this.loaded = this.load();\n }\n\n /** Promise that resolves once all current synchronization processes are complete */\n get syncComplete() {\n return Promise.all([...this._activeSyncPromises.values(), ...this._queuedSyncPromises.values()]);\n }\n\n /** Current account */\n get account() {\n return this.state.account;\n }\n\n /** Current session */\n get session() {\n return this.state.session;\n }\n\n /** The current accounts organizations */\n get orgs() {\n return this.state.orgs.sort();\n }\n\n /** The current accounts vaults */\n get vaults() {\n return this.state.vaults.sort();\n }\n\n /** Application settings */\n get settings() {\n return this.state.settings;\n }\n\n /** The current users main, or \"private\" [[Vault]] */\n get mainVault(): Vault | null {\n return (this.account && this.getVault(this.account.mainVault.id)) || null;\n }\n\n get online() {\n return this.state.online;\n }\n\n get supportsBiometricUnlock() {\n return this.state.device.supportsBioAuth && this.state.device.supportsKeyStore;\n }\n\n get remembersMasterKey() {\n return !!this.state.rememberedMasterKey;\n }\n\n get billingEnabled() {\n return !!this.state.billingProvider && !(this.state.account && this.state.account.billingDisabled);\n }\n\n get count() {\n const count = {\n favorites: 0,\n attachments: 0,\n recent: 0,\n total: 0,\n currentHost: this.state.currentHost ? this.getItemsForHost(this.state.currentHost).length : 0\n };\n\n const recentThreshold = new Date(Date.now() - this.settings.recentLimit * 24 * 60 * 60 * 1000);\n for (const vault of this.vaults) {\n for (const item of vault.items) {\n count.total++;\n if (this.account && this.account.favorites.has(item.id)) {\n count.favorites++;\n }\n if (item.attachments.length) {\n count.attachments++;\n }\n if (this.state.lastUsed.has(item.id) && this.state.lastUsed.get(item.id)! > recentThreshold) {\n count.recent++;\n }\n }\n }\n\n return count;\n }\n\n private _queuedSyncPromises = new Map>();\n private _activeSyncPromises = new Map>();\n\n private _subscriptions: Array<(state: AppState) => void> = [];\n\n private _cachedAuthInfo = new Map();\n\n /** Save application state to persistent storage */\n async save() {\n await this.loaded;\n if (!this.state.locked) {\n await this.state.index.fromItems(\n this.state.vaults.reduce((items, v) => [...items, ...v.items], [] as VaultItem[])\n );\n }\n\n await this.storage.save(this.state);\n }\n\n /** Load application state from persistent storage */\n async load() {\n // Try to load app state from persistent storage.\n try {\n this.setState(await this.storage.get(AppState, this.state.id));\n } catch (e) {}\n\n // Update device info\n const { id, ...rest } = await getDeviceInfo();\n Object.assign(this.state.device, rest);\n\n try {\n await loadLanguage(this.state.device.locale);\n } catch (e) {\n // Failed to load language, so we'll fallback to default (English)\n }\n\n // If no device id has been set yet, generate a new one\n if (!this.state.device.id) {\n this.state.device.id = await uuid();\n }\n\n // Save back to storage\n await this.storage.save(this.state);\n\n this.loadBillingProvider();\n\n // Notify state change\n this.publish();\n }\n\n async reload() {\n const masterKey = this.account && this.account.masterKey;\n await this.load();\n if (masterKey) {\n await this.unlockWithMasterKey(masterKey);\n }\n }\n\n /**\n * Unlocks the current [[Account]] and all available [[Vaults]].\n */\n async unlock(password: string) {\n if (!this.account) {\n throw \"Unlocking only works if the user is logged in!\";\n }\n\n // Unlock account using the master password\n await this.account.unlock(password);\n\n await this._unlocked();\n }\n\n /**\n * Locks the app and wipes all sensitive information from memory.\n */\n async lock() {\n [this.account!, ...this.state.orgs, ...this.state.vaults].forEach(each => each.lock());\n this.publish();\n }\n\n /**\n * Synchronizes the current account and all of the accounts organizations\n * and vaults\n */\n async synchronize() {\n this.setState({ syncing: true });\n await this.fetchAccount();\n await this.fetchOrgs();\n await this.syncVaults();\n await this.save();\n this.setStats({ lastSync: new Date() });\n this.publish();\n }\n\n /**\n * Notifies of changes to the app [[state]] via the provided function\n *\n * @returns A unsubscribe function\n */\n subscribe(fn: (state: AppState) => void) {\n this._subscriptions.push(fn);\n return () => this.unsubscribe(fn);\n }\n\n /**\n * Unsubscribes a function previously subscribed through [[subscribe]].\n */\n unsubscribe(fn: (state: AppState) => void) {\n this._subscriptions = this._subscriptions.filter(f => f === fn);\n }\n\n /**\n * Notifies all subscribers of a [[state]] change\n */\n publish = throttle(() => {\n for (const fn of this._subscriptions) {\n fn(this.state);\n }\n }, 1000);\n\n /**\n * Updates the app [[state]]\n */\n setState(state: Partial) {\n Object.assign(this.state, state);\n this.publish();\n }\n\n /** Update usage data */\n async setStats(obj: Partial) {\n Object.assign(this.state.stats, obj);\n await this.save();\n this.publish();\n }\n\n /** Update application settings */\n async setSettings(obj: Partial) {\n Object.assign(this.state.settings, obj);\n await this.save();\n this.publish();\n }\n\n /*\n * ===============================\n * ACCOUNT & SESSION MANGAGEMENT\n * ===============================\n */\n\n /** Request email verification for a given `email`. */\n async requestMFACode(email: string, purpose: MFAPurpose) {\n return this.api.requestMFACode(new RequestMFACodeParams({ email, purpose }));\n }\n\n /** Complete email with the given `code` */\n async retrieveMFAToken(email: string, code: string, purpose: MFAPurpose) {\n return this.api.retrieveMFAToken(new RetrieveMFATokenParams({ email, code, purpose }));\n }\n\n /**\n * Creates a new Padloc [[Account]] and signs in the user.\n */\n async signup({\n /** The desired email address */\n email,\n /** The users master password */\n password,\n /** The desired display name */\n name,\n /** Verification token obtained trough [[completeEmailVerification]] */\n verify,\n /** Information about the [[Invite]] object if signup was initiated through invite link */\n invite\n }: {\n email: string;\n password: string;\n name: string;\n verify: string;\n invite?: { id: string; org: string };\n }) {\n // Inialize account object\n const account = new Account();\n account.email = email;\n account.name = name;\n await account.initialize(password);\n\n // Initialize auth object\n const auth = new Auth(email);\n const authKey = await auth.getAuthKey(password);\n\n // Calculate verifier\n const srp = new SRPClient();\n await srp.initialize(authKey);\n auth.verifier = srp.v!;\n\n // Send off request to server\n await this.api.createAccount(\n new CreateAccountParams({\n account,\n auth,\n verify,\n invite\n })\n );\n\n // Sign into new account\n await this.login(email, password);\n }\n\n /**\n * Log in user, creating a new [[Session]], loading [[Account]] info and\n * fetching all of the users [[Org]]anizations and [[Vault]]s.\n */\n async login(email: string, password: string, verify?: string) {\n if (!this._cachedAuthInfo.has(email)) {\n // Fetch authentication info\n this._cachedAuthInfo.set(email, await this.api.initAuth(new InitAuthParams({ email, verify })));\n }\n\n const { account: accId, keyParams, B } = this._cachedAuthInfo.get(email)!;\n\n const auth = new Auth(email);\n auth.keyParams = keyParams;\n\n // Generate auth secret\n const authKey = await auth.getAuthKey(password);\n\n // Initialize SRP object\n const srp = new SRPClient();\n await srp.initialize(authKey);\n await srp.setB(B);\n\n // Create session object\n const session = await this.api.createSession(\n new CreateSessionParams({ account: accId, A: srp.A!, M: srp.M1! })\n );\n\n // Apply session key and update state\n session.key = srp.K!;\n this.setState({ session });\n\n // Fetch and unlock account object\n const account = await this.api.getAccount();\n await account.unlock(password);\n this.setState({ account });\n\n // Save application state\n await this.save();\n\n // Load organizations and vaults\n await this.synchronize();\n }\n\n /**\n * Logs out user and clears all sensitive information\n */\n async logout() {\n await this._logout();\n this.publish();\n }\n\n async deleteAccount() {\n await this.api.deleteAccount();\n await this._logout();\n }\n\n private async _logout() {\n this._cachedAuthInfo.clear();\n\n if (await this.canRememberMasterKey()) {\n await this.forgetMasterKey();\n }\n\n // Revoke session\n try {\n await this.api.revokeSession(this.state.session!.id);\n } catch (e) {}\n\n // Reset application state\n this.setState({\n account: null,\n session: null,\n vaults: [],\n orgs: [],\n index: new Index()\n });\n await this.save();\n }\n\n /**\n * Updates the users master password\n */\n async changePassword(password: string) {\n // TODO: Add option to rotate keys\n\n await this.updateAccount(async account => {\n // Update account object\n await account.setPassword(password);\n\n // Update auth object\n const auth = new Auth(account.email);\n auth.account = account.id;\n const authKey = await auth.getAuthKey(password);\n const srp = new SRPClient();\n await srp.initialize(authKey);\n auth.verifier = srp.v!;\n await this.api.updateAuth(auth);\n });\n\n if (await this.canRememberMasterKey()) {\n await this.forgetMasterKey();\n }\n }\n\n /**\n * Fetches the users [[Account]] info from the [[Server]]\n */\n async fetchAccount() {\n const account = await this.api.getAccount();\n\n // Copy over secret properties so we don't have to\n // unlock the account object again.\n if (this.account) {\n account.copySecrets(this.account);\n }\n\n // Update and save state\n this.setState({ account });\n await this.save();\n }\n\n /**\n * Updates the users [[Account]] information\n * @param transform A function applying the changes to the account\n */\n async updateAccount(transform: (account: Account) => Promise) {\n if (!this.account) {\n throw \"User needs to be logged in in order to update their account!\";\n }\n\n // Create a clone of the current account to prevent inconsistencies in\n // case something goes wrong.\n let account = this.account.clone();\n\n // Apply changes\n await transform(account);\n\n // Send request to server\n try {\n account = await this.api.updateAccount(account);\n } catch (e) {\n // If account has been updated since last fetch,\n // get the current version and then retry\n if (e.code === ErrorCode.OUTDATED_REVISION) {\n await this.fetchAccount();\n await this.updateAccount(transform);\n } else {\n throw e;\n }\n }\n\n // Copy over secret properties so we don't have to unlock the\n // account object again.\n account.copySecrets(this.account!);\n\n // Update and save state\n this.setState({ account });\n await this.save();\n }\n\n /**\n * Revokes the given [[Session]]\n */\n async revokeSession({ id }: { id: SessionID }) {\n await this.api.revokeSession(id);\n await this.fetchAccount();\n }\n\n /**\n * Initiates account recovery allowing a user to regain control of their\n * account in case they forget their master password. This results in the\n * following:\n *\n * - All of the accounts cryptographic keys are rotated.\n * - The accounts sensitive data is encrypted with the new master password.\n * - The accounts authentication info is updated to reflect the password change.\n * - The accounts private vault is reset (and the data within it lost).\n * - The cryptographic keys of all [[Org]]anizations owned by the account will be\n * rotated and all members suspended until reconfirmed.\n * - The accounts memberships to any [[Org]]ganizations not owned by it will be\n * suspended until reconfirmed.\n *\n * The user will automatically get logged in during this process\n * so a separate login is not necessary.\n */\n async recoverAccount({\n /** Account email */\n email,\n /** New master password */\n password,\n /** Verification token obtained trough [[completeEmailVerification]] */\n verify\n }: {\n email: string;\n password: string;\n verify: string;\n }) {\n // Log out user (if logged in)\n await this._logout();\n\n // Initialize account with new password\n let account = new Account();\n account.email = email;\n await account.initialize(password);\n\n // Initialize auth object with new password\n const auth = new Auth(email);\n const authKey = await auth.getAuthKey(password);\n const srp = new SRPClient();\n await srp.initialize(authKey);\n auth.verifier = srp.v!;\n\n // Send account recovery request to the server, updating account and\n // authentication info. This will also suspend the accounts membership\n // to any organizations not owned by them.\n await this.api.recoverAccount(\n new RecoverAccountParams({\n account,\n auth,\n verify\n })\n );\n\n // Sign in user using the new password\n await this.login(email, password);\n\n // Rotate keys of all owned organizations. Suspend all other members\n // and create invites to reconfirm the membership.\n for (const org of this.state.orgs.filter(o => o.isOwner(account))) {\n await this.rotateOrgKeys(org);\n }\n }\n\n async rotateOrgKeys(org: Org) {\n const account = this.account!;\n\n return this.updateOrg(org.id, async org => {\n // Rotate org encryption key\n delete org.encryptedData;\n await org.updateAccessors([account]);\n\n // Rotate other cryptographic keys\n await org.generateKeys();\n\n org.invites = [];\n\n // Suspend members and create confirmation invites\n for (const member of org.members.filter(m => m.id !== account.id)) {\n member.role = OrgRole.Suspended;\n const invite = new Invite(member.email, \"confirm_membership\");\n await invite.initialize(org, this.account!);\n org.invites.push(invite);\n }\n\n // Update own membership\n await org.addOrUpdateMember({\n id: account.id,\n email: account.email,\n name: account.name,\n publicKey: account.publicKey,\n orgSignature: await account.signOrg(org),\n role: OrgRole.Owner\n });\n });\n }\n\n canRememberMasterKey() {\n return isKeyStoreAvailable();\n }\n\n async rememberMasterKey() {\n if (!this.account || this.account.locked) {\n throw \"App needs to be unlocked first\";\n }\n const key = await getCryptoProvider().generateKey(new AESKeyParams());\n await keyStoreSet(\"master_key_encryption_key\", bytesToBase64(key));\n const container = new SimpleContainer();\n await container.unlock(key);\n await container.setData(this.account.masterKey!);\n this.setState({ rememberedMasterKey: container });\n await this.save();\n }\n\n async forgetMasterKey() {\n try {\n await keyStoreDelete(\"master_key_encryption_key\");\n } catch (e) {}\n this.setState({ rememberedMasterKey: null });\n await this.save();\n }\n\n async unlockWithRememberedMasterKey() {\n const encryptedMasterKey = this.state.rememberedMasterKey!;\n const key = base64ToBytes(await keyStoreGet(\"master_key_encryption_key\"));\n await encryptedMasterKey.unlock(key);\n const masterKey = await encryptedMasterKey.getData();\n await this.unlockWithMasterKey(masterKey);\n }\n\n async unlockWithMasterKey(key: Uint8Array) {\n await this.account!.unlockWithMasterKey(key);\n await this._unlocked();\n }\n\n /**\n * ==================\n * VAULT MANAGEMENT\n * ==================\n */\n\n /** Get the [[Vault]] with the given `id` */\n getVault(id: VaultID) {\n return this.state.vaults.find(vault => vault.id === id);\n }\n\n /** Locally update the given `vault` object */\n putVault(vault: Vault) {\n this.setState({\n vaults: [...this.state.vaults.filter(v => v.id !== vault.id), vault]\n });\n }\n\n isMainVault(vault: Vault) {\n return vault && this.account && this.account.mainVault.id === vault.id;\n }\n\n /** Create a new [[Vault]] */\n async createVault(\n name: string,\n org: Org,\n members: { id: AccountID; readonly: boolean }[] = [],\n groups: { name: string; readonly: boolean }[] = []\n ): Promise {\n let vault = new Vault();\n vault.name = name;\n vault.org = { id: org.id, name: org.name };\n vault = await this.api.createVault(vault);\n\n await this.fetchOrg(org);\n\n await this.updateOrg(org.id, async (org: Org) => {\n groups.forEach(({ name, readonly }) => {\n const group = org.getGroup(name);\n if (!group) {\n setTimeout(() => {\n throw `Group not found: ${name}`;\n });\n return;\n }\n group.vaults.push({ id: vault.id, readonly });\n });\n members.forEach(({ id, readonly }) => {\n const member = org.getMember({ id });\n if (!member) {\n setTimeout(() => {\n throw `Member not found: ${id}`;\n });\n return;\n }\n member.vaults.push({ id: vault.id, readonly });\n });\n });\n\n await this.synchronize();\n return vault;\n }\n\n /** Update [[Vault]] name and access (not the vaults contents) */\n async updateVaultAccess(\n /** Organization owning the vault */\n orgId: OrgID,\n /** The vault id */\n id: VaultID,\n /** The new vault name */\n name: string,\n /** Organization members that should have access to the vault */\n members: { id: AccountID; readonly: boolean }[] = [],\n /** Groups that should have access to the vault */\n groups: { name: string; readonly: boolean }[] = []\n ) {\n if (!members.length && !groups.length) {\n throw new Error(\"You have to assign at least one member or group!\");\n }\n\n await this.updateOrg(orgId, async (org: Org) => {\n // Update name (the name of the actual [[Vault]] name will be\n // updated in the background)\n org.vaults.find(v => v.id === id)!.name = name;\n\n // Update group access\n for (const group of org.groups) {\n // remove previous vault entry\n group.vaults = group.vaults.filter(v => v.id !== id);\n // update vault entry\n const selection = groups.find(g => g.name === group.name);\n if (selection) {\n group.vaults.push({ id, readonly: selection.readonly });\n }\n }\n\n // Update member access\n for (const member of org.members) {\n // remove previous vault entry\n member.vaults = member.vaults.filter(v => v.id !== id);\n // update vault entry\n const selection = members.find(m => m.id === member.id);\n if (selection) {\n member.vaults.push({ id, readonly: selection.readonly });\n }\n }\n });\n\n this.synchronize();\n }\n\n /** Commit changes to vault object and save locally */\n async saveVault(vault: Vault): Promise {\n await vault.commit();\n this.putVault(vault);\n await this.save();\n }\n\n /** Delete [[Vault]] */\n async deleteVault(id: VaultID) {\n await this.api.deleteVault(id);\n await this.synchronize();\n }\n\n /** Synchronize the given [[Vault]] */\n async syncVault(vault: { id: VaultID; name?: string; revision?: string }): Promise {\n return this._queueSync(vault, (vault: { id: VaultID }) => this._syncVault(vault));\n }\n\n /** Synchronize all vaults the current user has access to. */\n async syncVaults() {\n if (!this.account) {\n return;\n }\n\n // Sync private vault\n const promises = [this.syncVault(this.account.mainVault)] as Promise[];\n\n // Sync vaults assigned to through organizations\n for (const org of this.state.orgs) {\n // Sync all vaults for this organization\n for (const vault of org.getVaultsForMember(this.account)) {\n promises.push(this.syncVault(vault));\n }\n }\n\n // clean up vaults the user no longer has access to\n const removeVaults = new Set();\n for (const vault of this.state.vaults) {\n const org = vault.org && this.getOrg(vault.org.id);\n if (\n vault.id !== this.account.mainVault.id &&\n (!org || !org.vaults.find(v => v.id === vault.id) || !org.canRead(vault, this.account))\n ) {\n removeVaults.add(vault.id);\n }\n }\n\n await this.setState({\n vaults: this.state.vaults.filter(v => !removeVaults.has(v.id))\n });\n\n await Promise.all(promises);\n }\n\n async fetchVault({ id, revision }: { id: VaultID; revision?: string }): Promise {\n if (!this.account) {\n console.error(\"need to be logged in to fetch vault!\");\n return null;\n }\n\n let localVault = this.getVault(id);\n\n if (localVault && revision && localVault.revision === revision) {\n return localVault;\n }\n\n let remoteVault: Vault | null = null;\n let result: Vault;\n\n try {\n // Fetch and unlock remote vault\n remoteVault = await this.api.getVault(id);\n } catch (e) {\n if (localVault && e.code !== ErrorCode.FAILED_CONNECTION) {\n localVault.error = e;\n }\n }\n\n if (!remoteVault) {\n return null;\n }\n\n try {\n await remoteVault.unlock(this.account);\n } catch (e) {\n if (localVault) {\n localVault.error = e;\n return localVault;\n } else {\n remoteVault.error = e;\n this.putVault(remoteVault);\n return remoteVault;\n }\n }\n\n // Merge changes\n if (localVault) {\n result = this.getVault(id)!;\n try {\n await result.unlock(this.account);\n result.merge(remoteVault);\n } catch (e) {\n result = remoteVault;\n }\n } else {\n result = remoteVault;\n }\n\n // Migrate favorites from \"old\" favoriting mechanism\n for (const item of result.items) {\n if (item.favorited && item.favorited.includes(this.account.id)) {\n this.account.favorites.add(item.id);\n item.favorited = item.favorited.filter(acc => acc !== this.account!.id);\n result.items.update(item);\n }\n }\n\n await this.saveVault(result);\n\n return result;\n }\n\n async updateVault({ id }: { id: VaultID }, tries = 0): Promise {\n if (!this.account) {\n throw \"need to be logged in to update vault!\";\n }\n\n let vault = this.getVault(id)!;\n const org = vault.org && this.getOrg(vault.org.id);\n\n const accessors = (org ? org.getAccessors(vault) : [this.account]) as OrgMember[];\n\n const accessorsChanged =\n vault.accessors.length !== accessors.length ||\n accessors.some(a => vault.accessors.some(b => a.id !== b.id));\n\n if ((org && org.isSuspended(this.account)) || (!vault.items.hasChanges && !accessorsChanged)) {\n // No changes - skipping update\n return vault;\n }\n\n if (org && !org.canWrite(vault, this.account)) {\n // User does'nt have write access; dismiss changes and bail out;\n vault.items.clearChanges();\n return vault;\n }\n\n const updateStarted = new Date();\n vault = vault.clone();\n\n vault.items.clearChanges();\n await vault.commit();\n\n try {\n // // Make sure the organization revision matches the one the vault is based on\n if (vault.org && (!org || org.revision !== vault.org.revision)) {\n if (tries > 3) {\n throw new Err(\n ErrorCode.OUTDATED_REVISION,\n $l(\n \"Local changes to this vault could not be synchronized because there was a problem \" +\n \"retrieving information for this vaults organization. If this problem persists \" +\n \"please contact customer support!\"\n )\n );\n }\n\n // Get the latest organization and vault info, then try again\n await this.fetchOrg({ id: vault.org.id });\n await this.fetchVault({ id });\n return this.updateVault(vault, tries + 1);\n }\n } catch (e) {\n this.getVault(vault.id)!.error = e;\n return null;\n }\n\n // Update accessors\n if (org) {\n try {\n if (org.frozen) {\n throw new Err(\n ErrorCode.ORG_FROZEN,\n $l(\"Synching local changes failed because the organization this vault belongs to is frozen.\")\n );\n }\n\n if (!org.canWrite(vault, this.account)) {\n throw new Err(\n ErrorCode.INSUFFICIENT_PERMISSIONS,\n $l(\"Synching local changes failed because you don't have write permissions for this vault.\")\n );\n }\n\n // Look up which members should have access to this vault\n const accessors = org.getAccessors(vault);\n\n // Verify member details\n await this.account.verifyOrg(org);\n await org.verifyAll(accessors);\n\n // Update accessors\n await vault.updateAccessors(accessors);\n } catch (e) {\n this.getVault(vault.id)!.error = e;\n return null;\n }\n } else {\n await vault.updateAccessors([this.account]);\n }\n\n // Push updated vault object to [[Server]]\n try {\n vault = await this.api.updateVault(vault);\n await vault.unlock(this.account);\n\n const existing = this.getVault(vault.id)!;\n\n // Clear changes that happened before the sync started (retaining any changes made while\n // the sync was in progress)\n existing.items.clearChanges(updateStarted);\n\n // Merge changes back into existing vault (also updating revisision etc.)\n existing.merge(vault);\n\n // Comit changes and update local state\n await existing.commit();\n this.putVault(existing);\n\n if (org) {\n org.revision = vault.org!.revision!;\n org.vaults.find(v => v.id === vault!.id)!.revision = vault.revision;\n this.putOrg(org);\n this.account.orgs.find(o => o.id === org.id)!.revision = org.revision;\n } else {\n this.account.mainVault.revision = vault.revision;\n }\n\n await this.save();\n\n return existing;\n } catch (e) {\n // The server will reject the update if the vault revision does\n // not match the current revision on the server, in which case we'll\n // have to fetch the current vault version and try again.\n if (e.code === ErrorCode.OUTDATED_REVISION) {\n await this.fetchVault({ id });\n return this.updateVault({ id });\n }\n\n if (e.code !== ErrorCode.FAILED_CONNECTION) {\n this.getVault(vault.id)!.error = e;\n }\n\n return vault;\n }\n }\n\n /** Whether the current user has write permissions to the given `vault`. */\n hasWritePermissions(vault: Vault) {\n // No organization means its the users private vault so they naturally have write access\n if (!vault.org) {\n return true;\n }\n\n const org = this.getOrg(vault.org.id)!;\n return org.canWrite(vault, this.account!);\n }\n\n private async _syncVault(vault: { id: VaultID; revision?: string }): Promise {\n await this.fetchVault(vault);\n return this.updateVault(vault);\n }\n\n /**\n * =======================\n * Vault Item Management\n * =======================\n */\n\n /** Get the [[VaultItem]] and [[Vault]] for the given item `id` */\n getItem(id: VaultItemID): { item: VaultItem; vault: Vault } | null {\n for (const vault of this.state.vaults) {\n const item = vault.items.get(id);\n if (item) {\n return { item, vault };\n }\n }\n\n return null;\n }\n\n /** Adds a number of `items` to the given `vault` */\n async addItems(items: VaultItem[], { id }: { id: VaultID }) {\n const vault = this.getVault(id)!;\n vault.items.update(...items);\n await this.saveVault(vault);\n this.syncVault(vault);\n }\n\n /** Creates a new [[VaultItem]] */\n async createItem(name: string, vault: { id: VaultID }, fields?: Field[], tags?: Tag[]): Promise {\n const item = await createVaultItem(name || \"\", fields, tags);\n if (this.account) {\n item.updatedBy = this.account.id;\n }\n\n await this.addItems([item], vault);\n\n return item;\n }\n\n /** Update a given [[VaultItem]]s name, fields, tags and attachments */\n async updateItem(\n item: VaultItem,\n upd: {\n name?: string;\n fields?: Field[];\n tags?: Tag[];\n attachments?: AttachmentInfo[];\n }\n ) {\n const { vault } = this.getItem(item.id)!;\n vault.items.update(new VaultItem({ ...item, ...upd, updatedBy: this.account!.id }));\n await this.saveVault(vault);\n await this.syncVault(vault);\n }\n\n async toggleFavorite(id: VaultItemID, favorite: boolean) {\n await this.updateAccount(acc => acc.toggleFavorite(id, favorite));\n }\n\n async updateLastUsed(item: VaultItem) {\n this.state.lastUsed.set(item.id, new Date());\n this.publish();\n }\n\n /** Delete a number of `items` */\n async deleteItems(items: VaultItem[]) {\n const attachments: AttachmentInfo[] = [];\n\n // Group items by vault\n const grouped = new Map();\n for (const item of items) {\n const { vault } = this.getItem(item.id)!;\n\n if (!grouped.has(vault)) {\n grouped.set(vault, []);\n }\n\n grouped.get(vault)!.push(item);\n attachments.push(...item.attachments);\n }\n\n const promises: Promise[] = [];\n\n // Delete all attachments for this item\n promises.push(...attachments.map(att => this.api.deleteAttachment(new DeleteAttachmentParams(att))));\n\n // Remove items from their respective vaults\n for (const [vault, items] of grouped.entries()) {\n promises.push(\n (async () => {\n vault.items.remove(...items);\n await this.saveVault(vault);\n await this.syncVault(vault);\n })()\n );\n }\n\n await Promise.all(promises);\n }\n\n /** Move `items` from their current vault to the `target` vault */\n async moveItems(items: VaultItem[], target: Vault) {\n if (items.some(item => !!item.attachments.length)) {\n throw \"Items with attachments cannot be moved!\";\n }\n const newItems = await Promise.all(items.map(async item => new VaultItem({ ...item, id: await uuid() })));\n await this.addItems(newItems, target);\n await this.deleteItems(items);\n return newItems;\n }\n\n getItemsForHost(host: string) {\n const items: { vault: Vault; item: VaultItem }[] = [];\n for (const vault of this.vaults) {\n for (const item of vault.items) {\n if (\n item.fields.some(field => {\n if (field.type !== \"url\") {\n return false;\n }\n\n // Try to parse host from url. If field value is not a valid URL,\n // assume its the bare host name\n let h = field.value;\n try {\n h = new URL(field.value).host;\n } catch (e) {}\n\n // If host doesn't match exactly, try with/without \"www.\"\n return h === host || (host.startsWith(\"www.\") ? host.slice(4) === h : \"www.\" + host === h);\n })\n ) {\n items.push({ vault, item });\n }\n }\n }\n return items;\n }\n\n getItemsForUrl(url: string) {\n try {\n const { host } = new URL(url);\n return this.getItemsForHost(host);\n } catch (e) {\n return [];\n }\n }\n\n /*\n * =========================\n * ORGANIZATION MANAGEMENT\n * =========================\n */\n\n /** Get the organization with the given `id` */\n getOrg(id: OrgID) {\n return this.state.orgs.find(org => org.id === id);\n }\n\n /** Update the given organization locally */\n putOrg(org: Org) {\n this.setState({\n orgs: [...this.state.orgs.filter(v => v.id !== org.id), org]\n });\n }\n\n /** Create a new [[Org]]ganization */\n async createOrg(name: string, type: OrgType = OrgType.Business): Promise {\n let org = new Org();\n org.name = name;\n org.type = type;\n org = await this.api.createOrg(org);\n await org.initialize(this.account!);\n org = await this.api.updateOrg(org);\n await this.fetchAccount();\n return this.fetchOrg(org);\n }\n\n /** Fetch all organizations the current account is a member of */\n async fetchOrgs() {\n if (!this.account) {\n return;\n }\n\n try {\n await Promise.all(this.account.orgs.map(org => this.fetchOrg(org)));\n } catch (e) {}\n\n // Remove orgs that the account is no longer a member of\n this.setState({ orgs: this.state.orgs.filter(org => this.account!.orgs.some(o => o.id === org.id)) });\n }\n\n /** Fetch the [[Org]]anization object with the given `id` */\n async fetchOrg({ id, revision }: { id: OrgID; revision?: string }) {\n const existing = this.getOrg(id);\n\n if (existing && existing.revision === revision) {\n return existing;\n }\n\n const org = await this.api.getOrg(id);\n\n // Verify that the updated organization object has a `minMemberUpdated`\n // property equal to or higher than the previous (local) one.\n if (existing && org.minMemberUpdated < existing.minMemberUpdated) {\n throw new Err(ErrorCode.VERIFICATION_ERROR, \"'minMemberUpdated' property may not decrease!\");\n }\n\n this.putOrg(org);\n await this.save();\n return org;\n }\n\n /**\n * Update the organization with the given `id`.\n *\n * @param transform Function applying the changes\n */\n async updateOrg(id: OrgID, transform: (org: Org) => Promise): Promise {\n // Create a clone of the existing org object\n let org = this.getOrg(id)!.clone();\n\n // Apply changes\n await transform(org);\n\n try {\n org = await this.api.updateOrg(org);\n } catch (e) {\n // If organizaton has been updated since last fetch,\n // get the current version and then retry\n if (e.code === ErrorCode.OUTDATED_REVISION) {\n await this.fetchOrg({ id });\n return this.updateOrg(id, transform);\n } else {\n throw e;\n }\n }\n\n // Update and save app state\n this.putOrg(org);\n await this.save();\n return org;\n }\n\n async deleteOrg(id: OrgID) {\n await this.api.deleteOrg(id);\n await this.synchronize();\n }\n\n /** Creates a new [[Group]] in the given `org` */\n async createGroup(org: Org, name: string, members: OrgMember[]) {\n const group = new Group();\n group.name = name;\n group.members = members.map(({ id }) => ({ id }));\n await this.updateOrg(org.id, async (org: Org) => {\n if (org.getGroup(name)) {\n throw \"A group with this name already exists!\";\n }\n org.groups.push(group);\n });\n return group;\n }\n\n /**\n * Updates a [[Group]]s name and members\n */\n async updateGroup(org: Org, { name }: Group, members: OrgMember[], newName?: string) {\n await this.updateOrg(org.id, async org => {\n const group = org.getGroup(name);\n if (!group) {\n throw \"Group not found!\";\n }\n if (newName && newName !== name && org.getGroup(newName)) {\n throw \"Another group with this name already exists!\";\n }\n if (newName) {\n group.name = newName;\n }\n group.members = members.map(({ id }) => ({ id }));\n });\n }\n\n /**\n * Update a members assigned [[Vault]]s, [[Group]]s and [[OrgRole]].\n */\n async updateMember(\n org: Org,\n { id }: OrgMember,\n {\n vaults,\n groups,\n role\n }: {\n vaults?: { id: VaultID; readonly: boolean }[];\n groups?: string[];\n role?: OrgRole;\n }\n ): Promise {\n await this.updateOrg(org.id, async org => {\n const member = org.getMember({ id })!;\n\n // Update assigned vaults\n if (vaults) {\n member.vaults = vaults;\n }\n\n // Update assigned groups\n if (groups) {\n // Remove member from all groups\n for (const group of org.groups) {\n group.members = group.members.filter(m => m.id !== id);\n }\n\n // Add them back to the assigned groups\n for (const name of groups) {\n const group = org.getGroup(name)!;\n group.members.push({ id });\n }\n }\n\n // Update member role\n if (role && member.role !== role) {\n await org.unlock(this.account!);\n await org.addOrUpdateMember({ ...member, role });\n }\n });\n\n return this.getOrg(org.id)!.getMember({ id })!;\n }\n\n /**\n * Removes a member from the given `org`\n */\n async removeMember(org: Org, member: OrgMember) {\n await this.updateOrg(org.id, async org => {\n await org.unlock(this.account!);\n await org.removeMember(member);\n });\n }\n\n /*\n * ===================\n * INVITE MANAGEMENT\n * ===================\n */\n\n /**\n * Create a new [[Invite]]\n */\n async createInvites({ id }: Org, emails: string[], purpose?: InvitePurpose) {\n let invites: Invite[] = [];\n await this.updateOrg(id, async (org: Org) => {\n await org.unlock(this.account!);\n invites = [];\n for (const email of emails) {\n const invite = new Invite(email, purpose);\n await invite.initialize(org, this.account!);\n invites.push(invite);\n }\n org.invites = [...org.invites.filter(a => !invites.some(b => a.email === b.email)), ...invites];\n });\n return invites!;\n }\n\n /**\n * Get an [[Invite]] based on the organization id and invite id.\n */\n async getInvite(orgId: string, id: string) {\n let invite = null;\n try {\n invite = await this.api.getInvite(new GetInviteParams({ org: orgId, id }));\n } catch (e) {}\n return invite;\n }\n\n /**\n * Accept an [[Invite]]\n *\n * @param secret The secret confirmation code, provided to the user by the organization owner\n */\n async acceptInvite(invite: Invite, secret: string) {\n const success = await invite.accept(this.account!, secret);\n if (success) {\n await this.api.acceptInvite(invite);\n }\n return success;\n }\n\n /**\n * Confirm an [[Invite]] after it has been accepted by the invitee.\n * This will verify the invitees information and then add them to\n * the organization.\n *\n * @returns The newly created member object.\n */\n async confirmInvite(invite: Invite): Promise {\n // Verify invitee information\n if (!(await invite.verifyInvitee())) {\n throw new Err(ErrorCode.VERIFICATION_ERROR, \"Failed to verify invitee information!\");\n }\n\n // Add member and update organization\n await this.updateOrg(invite.org!.id, async (org: Org) => {\n await org.unlock(this.account!);\n await org.addOrUpdateMember(invite.invitee!);\n org.removeInvite(invite);\n });\n\n return this.getOrg(invite.org!.id)!.getMember({ id: invite.invitee!.id })!;\n }\n\n /**\n * Deletes an [[Invite]]\n */\n async deleteInvite(invite: Invite): Promise {\n await this.updateOrg(\n invite.org!.id,\n async org => (org.invites = org.invites.filter(inv => inv.id !== invite.id))\n );\n }\n\n /**\n * =============\n * ATTACHMENTS\n * =============\n */\n\n async createAttachment(itemId: VaultItemID, file: File, name?: string): Promise {\n const { vault, item } = this.getItem(itemId)!;\n\n const att = new Attachment({ vault: vault.id });\n await att.fromFile(file);\n if (name) {\n att.name = name;\n }\n\n const promise = this.api.createAttachment(att);\n\n att.uploadProgress = promise.progress;\n\n promise.then(id => {\n att.id = id;\n this.updateItem(item, { attachments: [...item.attachments, att.info] });\n promise.progress!.complete();\n });\n\n return att;\n }\n\n async downloadAttachment(att: AttachmentInfo) {\n const attachment = new Attachment(att);\n\n const promise = this.api.getAttachment(new GetAttachmentParams({ id: att.id, vault: att.vault }));\n\n attachment.downloadProgress = promise.progress;\n\n promise.then(att => {\n attachment.fromRaw(att.toRaw());\n attachment.type = att.type;\n attachment.name = att.name;\n promise.progress!.complete();\n });\n\n return attachment;\n }\n\n async deleteAttachment(itemId: VaultItemID, att: Attachment | AttachmentInfo): Promise {\n const { item } = this.getItem(itemId)!;\n try {\n await this.api.deleteAttachment(new DeleteAttachmentParams(att));\n } catch (e) {\n if (e.code !== ErrorCode.NOT_FOUND) {\n throw e;\n }\n }\n await this.updateItem(item, { attachments: item.attachments.filter(a => a.id !== att.id) });\n }\n\n /**\n * =========\n * BILLING\n * =========\n */\n\n async updateBilling(params: UpdateBillingParams) {\n params.provider = (this.state.billingProvider && this.state.billingProvider.type) || \"\";\n await this.api.updateBilling(params);\n params.org ? await this.fetchOrg({ id: params.org }) : await this.fetchAccount();\n }\n\n async loadBillingProvider() {\n const providers = await this.api.getBillingProviders();\n this.setState({ billingProvider: providers[0] || null });\n }\n\n getItemsQuota(vault: Vault = this.mainVault!) {\n return this.isMainVault(vault) && !this.orgs.some(org => !org.frozen) ? this.account!.quota.items : -1;\n }\n\n /**\n * ================\n * HELPER METHODS\n * ================\n */\n\n private async _queueSync(obj: { id: string }, fn: (obj: { id: string }) => Promise): Promise {\n let queued = this._queuedSyncPromises.get(obj.id);\n let active = this._activeSyncPromises.get(obj.id);\n\n if (queued) {\n // There is already a queued sync promise, so just return that one\n return queued;\n }\n\n if (active) {\n // There is already a synchronization in process. wait for the current sync to finish\n // before starting a new one.\n const next = () => {\n this._queuedSyncPromises.delete(obj.id);\n return this._queueSync(obj, fn);\n };\n queued = active.then(next, next);\n this._queuedSyncPromises.set(obj.id, queued);\n return queued;\n }\n\n active = fn(obj).then(\n (result: any) => {\n this._activeSyncPromises.delete(obj.id);\n this.setState({ syncing: !!this._activeSyncPromises.size });\n return result;\n },\n e => {\n this._activeSyncPromises.delete(obj.id);\n this.setState({ syncing: !!this._activeSyncPromises.size });\n throw e;\n }\n );\n\n this._activeSyncPromises.set(obj.id, active);\n this.setState({ syncing: !!this._activeSyncPromises.size });\n\n return active;\n }\n\n private async _unlocked() {\n // Unlock all vaults\n await Promise.all(\n this.state.vaults.map(async vault => {\n try {\n await vault.unlock(this.account!);\n } catch (e) {\n vault.error = e;\n }\n })\n );\n\n // Notify state change\n this.publish();\n\n // Trigger sync\n this.synchronize();\n }\n}\n","import { Serializable, AsBytes } from \"./encoding\";\nimport { SimpleContainer } from \"./container\";\nimport { VaultID } from \"./vault\";\nimport { AESKeyParams } from \"./crypto\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\nimport { Err, ErrorCode } from \"./error\";\nimport { RequestProgress } from \"./transport\";\n\nfunction readFile(blob: File): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = new Uint8Array(reader.result as ArrayBuffer);\n resolve(result);\n };\n\n reader.onerror = e => {\n reader.abort();\n reject(e);\n };\n\n reader.readAsArrayBuffer(blob);\n });\n}\n\nfunction readAsText(blob: File): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as string);\n };\n\n reader.onerror = e => {\n reader.abort();\n reject(e);\n };\n\n reader.readAsText(blob);\n });\n}\n\nfunction readFileAsDataURL(blob: File): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as string);\n };\n\n reader.onerror = e => {\n reader.abort();\n reject(e);\n };\n\n reader.readAsDataURL(blob);\n });\n}\n\nexport type AttachmentID = string;\n\nexport class AttachmentInfo extends Serializable {\n constructor(vals: Partial = {}) {\n super();\n Object.assign(this, vals);\n }\n\n id: AttachmentID = \"\";\n vault: VaultID = \"\";\n name: string = \"\";\n size: number = 0;\n type: string = \"\";\n\n @AsBytes()\n key!: Uint8Array;\n}\n\nexport class Attachment extends SimpleContainer {\n id: AttachmentID = \"\";\n vault: VaultID = \"\";\n name: string = \"\";\n size: number = 0;\n type: string = \"\";\n uploadProgress?: RequestProgress;\n downloadProgress?: RequestProgress;\n\n constructor({ key, ...info }: Partial = {}) {\n super();\n Object.assign(this, {\n _key: key,\n ...info\n });\n }\n\n get info(): AttachmentInfo {\n return new AttachmentInfo({\n id: this.id,\n vault: this.vault,\n name: this.name,\n type: this.type,\n size: this.size,\n key: this._key\n });\n }\n\n get loaded(): boolean {\n return !!this.encryptedData;\n }\n\n async fromFile(file: File) {\n this.type = file.type;\n this.size = file.size;\n this.name = file.name;\n\n const data = await readFile(file);\n\n this._key = await getProvider().generateKey({\n algorithm: \"AES\",\n keySize: this.encryptionParams.keySize\n } as AESKeyParams);\n\n await this.setData(data);\n return this;\n }\n\n async toFile(): Promise {\n const data = await this.getData();\n return new File([data], this.name, { type: this.type });\n }\n\n async toDataURL(): Promise {\n const file = await this.toFile();\n return readFileAsDataURL(file);\n }\n\n async toObjectURL(): Promise {\n const file = await this.toFile();\n return URL.createObjectURL(file);\n }\n\n async toText(): Promise {\n const file = await this.toFile();\n return readAsText(file);\n }\n\n validate() {\n return typeof this.id === \"string\" && typeof this.vault === \"string\" && typeof this.size === \"number\";\n }\n}\n\nexport interface AttachmentStorage {\n put(a: Attachment): Promise;\n get(vault: VaultID, id: AttachmentID): Promise;\n delete(vault: VaultID, id: AttachmentID): Promise;\n deleteAll(vault: VaultID): Promise;\n getUsage(vault: VaultID): Promise;\n}\n\nexport class MemoryAttachmentStorage implements AttachmentStorage {\n private _storage = new Map();\n\n async put(a: Attachment): Promise {\n this._storage.set(`${a.vault}_${a.id}`, a);\n }\n\n async get(vault: VaultID, id: AttachmentID): Promise {\n const att = this._storage.get(`${vault}_${id}`);\n if (!att) {\n throw new Err(ErrorCode.NOT_FOUND);\n }\n return att;\n }\n\n async delete(vault: VaultID, id: AttachmentID): Promise {\n this._storage.delete(`${vault}_${id}`);\n }\n\n async deleteAll(vault: VaultID): Promise {\n for (const key of this._storage.keys()) {\n if (key.startsWith(vault)) {\n this._storage.delete(key);\n }\n }\n }\n\n async getUsage(vault: VaultID): Promise {\n let size = 0;\n for (const [key, att] of this._storage.entries()) {\n if (key.startsWith(vault)) {\n size += att.size;\n }\n }\n return size;\n }\n}\n","import { Serializable, stringToBytes, AsBytes, AsSerializable } from \"./encoding\";\nimport { PBKDF2Params } from \"./crypto\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\nimport { DeviceInfo } from \"./platform\";\nimport { Storable } from \"./storage\";\nimport { AccountID } from \"./account\";\n\n/**\n * Contains authentication data needed for SRP session negotiation\n */\nexport class Auth extends Serializable implements Storable {\n /** Id of the [[Account]] the authentication data belongs to */\n account: AccountID = \"\";\n\n /** Verifier used for SRP session negotiation */\n @AsBytes()\n verifier?: Uint8Array;\n\n /**\n * Key derivation params used by the client to compute session key from the\n * users master password\n * */\n @AsSerializable(PBKDF2Params)\n keyParams = new PBKDF2Params();\n\n @AsSerializable(DeviceInfo)\n trustedDevices: DeviceInfo[] = [];\n\n get id() {\n return this.email;\n }\n\n constructor(public email: string = \"\") {\n super();\n }\n\n /**\n * Generate the session key from the users master `password`\n */\n async getAuthKey(password: string) {\n // If no salt is set yet (i.e. during initialization),\n // generate a random value\n if (!this.keyParams.salt.length) {\n this.keyParams.salt = await getProvider().randomBytes(16);\n }\n return getProvider().deriveKey(stringToBytes(password), this.keyParams);\n }\n}\n","import { AccountID } from \"./account\";\nimport { OrgID } from \"./org\";\nimport { Serializable, AsSerializable, AsDate } from \"./encoding\";\n\nexport enum PlanType {\n Free,\n Premium,\n Family,\n Team,\n Business\n}\n\nexport class Plan extends Serializable {\n id = \"\";\n type: PlanType = PlanType.Free;\n name = \"Free\";\n description = \"\";\n items: number = -1;\n storage: number = 0;\n groups: number = 0;\n vaults: number = 0;\n min: number = 0;\n max: number = 0;\n available = false;\n cost: number = 0;\n features: string[] = [];\n default = false;\n color = \"\";\n}\n\nexport class PaymentMethod extends Serializable {\n id = \"\";\n name = \"\";\n}\n\nexport enum SubscriptionStatus {\n Trialing = \"trialing\",\n Active = \"active\",\n Inactive = \"inactive\",\n Canceled = \"canceled\"\n}\n\nexport class Subscription extends Serializable {\n id = \"\";\n account: AccountID = \"\";\n org: OrgID = \"\";\n status: SubscriptionStatus = SubscriptionStatus.Active;\n items: number = -1;\n storage: number = 0;\n groups: number = 0;\n vaults: number = 0;\n members: number = 0;\n\n paymentError?: string = undefined;\n paymentRequiresAuth?: string = undefined;\n currentInvoice: string = \"\";\n\n @AsDate()\n periodEnd: Date = new Date(0);\n\n @AsDate()\n trialEnd?: Date;\n\n @AsSerializable(Plan)\n plan: Plan = new Plan();\n}\n\nexport class BillingAddress extends Serializable {\n name = \"\";\n street = \"\";\n postalCode = \"\";\n city = \"\";\n country = \"\";\n\n constructor(params?: Partial) {\n super();\n if (params) {\n Object.assign(this, params);\n }\n }\n}\n\nexport class Discount extends Serializable {\n name = \"\";\n coupon = \"\";\n}\n\nexport class BillingInfo extends Serializable {\n customerId: string = \"\";\n account: AccountID = \"\";\n org: OrgID = \"\";\n email: string = \"\";\n\n @AsSerializable(Subscription)\n subscription: Subscription | null = null;\n\n @AsSerializable(PaymentMethod)\n paymentMethod: PaymentMethod | null = null;\n\n @AsSerializable(BillingAddress)\n address: BillingAddress = new BillingAddress();\n\n @AsSerializable(Discount)\n discount: Discount | null = null;\n\n @AsDate()\n firstTrialStarted?: Date;\n\n get trialDaysLeft() {\n const daysSinceFirstTrial = this.firstTrialStarted\n ? Math.floor((Date.now() - this.firstTrialStarted.getTime()) / 24 / 60 / 60 / 1000)\n : 0;\n return Math.max(0, 30 - daysSinceFirstTrial);\n }\n}\n\nexport class UpdateBillingParams extends Serializable {\n provider: string = \"\";\n account?: AccountID = undefined;\n org?: OrgID = undefined;\n email?: string = undefined;\n plan?: string = undefined;\n planType?: PlanType = undefined;\n members?: number = undefined;\n paymentMethod?: { name: string } & any = undefined;\n coupon?: string = undefined;\n cancel?: boolean = undefined;\n\n @AsSerializable(BillingAddress)\n address?: BillingAddress;\n\n constructor(params?: Partial) {\n super();\n if (params) {\n Object.assign(this, params);\n }\n }\n}\n\nexport class BillingProviderInfo extends Serializable {\n type: string = \"\";\n config: {\n [param: string]: string;\n } = {};\n\n @AsSerializable(Plan)\n plans: Plan[] = [];\n}\n\nexport interface BillingProvider {\n update(params: UpdateBillingParams): Promise;\n delete(billingInfo: BillingInfo): Promise;\n getInfo(): BillingProviderInfo;\n}\n//\n// const stubPlans: Plan[] = [\n// {\n// id: \"personal\",\n// name: \"Personal\",\n// description: \"Basic Setup For Personal Use\",\n// storage: -1,\n// available: true,\n// default: true\n// },\n// {\n// id: \"shared\",\n// name: \"Shared\",\n// description: \"Basic Setup For Sharing\",\n// storage: -1,\n// vaults: -1,\n// available: true,\n// orgType: 1\n// },\n// {\n// id: \"advanced\",\n// name: \"Advanced\",\n// description: \"Advanced Setup For Sharing\",\n// storage: -1,\n// groups: -1,\n// vaults: -1,\n// available: true,\n// orgType: 2\n// }\n// ].map(p => {\n// const plan = new Plan();\n// Object.assign(plan, p);\n// return plan;\n// });\n","import { API, PromiseWithProgress } from \"./api\";\nimport { Sender, Request, Response, RequestProgress } from \"./transport\";\nimport { DeviceInfo } from \"./platform\";\nimport { Session } from \"./session\";\nimport { Account } from \"./account\";\nimport { Err, ErrorCode } from \"./error\";\nimport { Serializable } from \"./encoding\";\n\n/**\n * Client state, keeping track of [[session]], [[account]] and [[device]] info\n */\nexport interface ClientState {\n /** Current session */\n session: Session | null;\n /** Currently logged in account */\n account: Account | null;\n /** info about current device */\n device: DeviceInfo;\n}\n\n/**\n * Client-side interface for Client-Server communication. Manages serialization,\n * authentication and some state like current session and account.\n */\nexport class Client extends API {\n online = true;\n\n constructor(\n /** Object for storing state */\n public state: ClientState,\n /** [[Sender]] implementation used for sending/receiving requests */\n private sender: Sender,\n private hook?: (req: Request, res: Response | null, err: Err | null) => void\n ) {\n super();\n\n for (const { method, output } of this.handlerDefinitions) {\n this[method] = (input: Serializable | string | undefined) => {\n const progress = new RequestProgress();\n const promise = this.call(\n method,\n typeof input === \"undefined\" ? [] : [input instanceof Serializable ? input.toRaw() : input],\n progress\n ).then(res => {\n return output\n ? Array.isArray(res.result)\n ? res.result.map(each => new output().fromRaw(each))\n : new output().fromRaw(res.result)\n : res.result;\n }) as PromiseWithProgress;\n promise.progress = progress;\n return promise;\n };\n }\n }\n\n /** The current session */\n get session() {\n return this.state.session;\n }\n\n /** Generic method for making an RPC call */\n async call(method: string, params?: any[], progress?: RequestProgress) {\n const { session } = this.state;\n\n const req = new Request();\n req.method = method;\n req.params = params;\n req.device = this.state.device;\n\n if (session) {\n await session.authenticate(req);\n }\n\n let res;\n\n try {\n res = await this.sender.send(req, progress);\n } catch (e) {\n if (progress) {\n progress.error = e;\n }\n this.hook && this.hook(req, null, e);\n throw e;\n }\n\n if (res.error) {\n const err = new Err((res.error.code as any) as ErrorCode, res.error.message);\n if (progress) {\n progress.error = err;\n }\n this.hook && this.hook(req, res, err);\n throw err;\n }\n\n if (session && !(await session.verify(res))) {\n const err = new Err(ErrorCode.INVALID_RESPONSE);\n if (progress) {\n progress.error = err;\n }\n this.hook && this.hook(req, res, err);\n throw err;\n }\n\n this.hook && this.hook(req, res, null);\n return res;\n }\n}\n","import { Serializable } from \"./encoding\";\nimport { VaultItem } from \"./item\";\n\n/**\n * A collection of vault items items, used for consolidating changes made independently\n * across multiple instances through \"merging\".\n */\nexport class VaultItemCollection extends Serializable implements Iterable {\n /** Number of items in this VaultItemCollection */\n get size() {\n return this._items.size;\n }\n\n get hasChanges() {\n return !!this._changes.size;\n }\n\n /** Aggregated list of tags assigned to the items in this collection */\n get tags(): string[] {\n const tags = new Set();\n for (const r of this) {\n for (const t of r.tags) {\n tags.add(t);\n }\n }\n return [...tags];\n }\n\n private _items: Map;\n private _changes = new Map();\n\n constructor(items: VaultItem[] = []) {\n super();\n this._items = new Map(items.map(item => [item.id, item] as [string, VaultItem]));\n }\n\n /** Get an item with a given `id` */\n get(id: string) {\n return this._items.get(id) || null;\n }\n\n /**\n * Updates one or more items based on their id. If no item with the same id\n * exists, the item will be added to the collection\n */\n update(...items: VaultItem[]) {\n for (const item of items) {\n item.updated = new Date();\n this._items.set(item.id, item);\n this._changes.set(item.id, item.updated);\n }\n }\n\n /**\n * Removes one or more items based on their id.\n */\n remove(...items: VaultItem[]) {\n for (const item of items) {\n this._items.delete(item.id);\n this._changes.set(item.id, new Date());\n }\n }\n\n /**\n * Merges in changes from another [[VaultItemCollection]] instance.\n */\n merge(coll: VaultItemCollection) {\n // Delete any items from this collection that don't\n // exist in the other collection and haven't been changed recently\n for (const item of this) {\n if (!this._changes.has(item.id) && !coll.get(item.id)) {\n this._items.delete(item.id);\n }\n }\n\n // Get changes items from other collection (but only if they haven't recently changed locally)\n for (const item of coll) {\n if (!this._changes.has(item.id)) {\n this._items.set(item.id, item);\n }\n }\n }\n\n clearChanges(before?: Date) {\n for (const [id, changed] of this._changes.entries()) {\n if (!before || changed <= before) {\n this._changes.delete(id);\n }\n }\n }\n\n protected _toRaw(version: string) {\n return {\n items: Array.from(this).map(item => item.toRaw(version)),\n changes: [...this._changes]\n };\n }\n\n protected _fromRaw({ items, changes }: any) {\n this._items = new Map(\n items.map((item: any) => [item.id, new VaultItem().fromRaw(item)] as [string, VaultItem])\n );\n this._changes = new Map(\n changes && changes.map(([id, date]: [string, string]) => [id, new Date(date)])\n );\n }\n\n [Symbol.iterator]() {\n return this._items.values();\n }\n}\n","import { Serializable, stringToBytes, AsBytes, AsSerializable } from \"./encoding\";\nimport { Err, ErrorCode } from \"./error\";\nimport {\n PBKDF2Params,\n AESKey,\n AESEncryptionParams,\n AESKeyParams,\n RSAEncryptionParams,\n RSAPrivateKey,\n RSAPublicKey\n} from \"./crypto\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\n\n/**\n * Base class for all **Container** implementations. In general, a **Container** is\n * an object for holding data encrypted using a symmetric cipher. Implementations\n * vary mostly in how the encryption key is generated. Sub classes must implement\n * the [[unlock]] method and may likely also want to augment [[lock]], [[validate]],\n * [[_fromRaw]] and [[_toRaw]].\n */\nexport abstract class BaseContainer extends Serializable {\n /** Parameters used for encryption of content data */\n @AsSerializable(AESEncryptionParams)\n encryptionParams: AESEncryptionParams = new AESEncryptionParams();\n\n /** Encrypted data */\n @AsBytes()\n encryptedData?: Uint8Array;\n\n /**\n * The key used for encryption. Sub classes must set this property in the [[unlock]] method.\n */\n protected _key?: AESKey;\n\n /**\n * Encrypts the provided `data` and stores it in the container\n */\n async setData(data: Uint8Array) {\n if (!this._key) {\n throw new Err(ErrorCode.ENCRYPTION_FAILED, \"No encryption key provided!\");\n }\n\n // Generate random initialization vector\n this.encryptionParams.iv = await getProvider().randomBytes(16);\n\n // Generate additional authenticated data.\n // Note: Without knowing anything about the nature of the encrypted data,\n // we can't really choose a meaningful value for this. In the future,\n // we may want to provide the option to pass this as an argument but for now\n // a random value should be sufficient.\n this.encryptionParams.additionalData = await getProvider().randomBytes(16);\n\n // Encrypt the data and store it.\n this.encryptedData = await getProvider().encrypt(this._key, data, this.encryptionParams);\n }\n\n /**\n * Decrypts and extracts the plain text data from the container. This will\n * usually require unlocking the container first.\n */\n async getData(): Promise {\n if (!this.encryptedData || !this._key) {\n throw new Err(ErrorCode.DECRYPTION_FAILED);\n }\n return await getProvider().decrypt(this._key, this.encryptedData, this.encryptionParams);\n }\n\n /**\n * Unlocks the container, making it possible to extract the plain text\n * data via [[getData]]. The type of **secret** provided will differ based\n * on the encryption scheme used by implemenations.\n */\n abstract unlock(secret: unknown): Promise;\n\n /**\n * Locks the container, removing the possibility to extract the plain text data\n * via [[getData]] until the container is unlocked again. Subclasses extending\n * this class must take care to delete any keys or other sensitive data\n * that may have been stored temporarily after unlocking the container.\n */\n lock() {\n delete this._key;\n }\n\n clone() {\n const clone = super.clone();\n clone._key = this._key;\n return clone;\n }\n}\n\n/**\n * Most basic **Container** implementation where the encryption key is\n * simply passed explicitly.\n */\nexport class SimpleContainer extends BaseContainer {\n async unlock(key: AESKey) {\n this._key = key;\n }\n}\n\n/**\n * Password-based **Container** that uses the\n * [PBES2](https://tools.ietf.org/html/rfc2898#section-6.2) encryption scheme,\n * deriving the encryption key from a user-provided passphrase.\n */\nexport class PBES2Container extends BaseContainer {\n /** Parameters used for key derivation */\n @AsSerializable(PBKDF2Params)\n keyParams: PBKDF2Params = new PBKDF2Params();\n\n /**\n * Unlocks the container using the given **password**\n */\n async unlock(password: string) {\n if (!this.keyParams.salt.length) {\n this.keyParams.salt = await getProvider().randomBytes(16);\n }\n this._key = await getProvider().deriveKey(stringToBytes(password), this.keyParams);\n }\n}\n\n/**\n * Represents an individual with access to a [[SharedContainer]]. Each accessor is mapped\n * to an entity owning a public/private key pair via their `id`.\n */\nexport class Accessor extends Serializable {\n /**\n * Identifier used to map an `Accessor` to the owner of the public key used to encrypt the shared key.\n */\n id: string = \"\";\n\n /** Shared key encrypted with the public key of the entity associated with the `Accessor` object */\n @AsBytes()\n encryptedKey: Uint8Array = new Uint8Array();\n}\n\n/**\n * The `SharedContainer` is used to securely share data between a number of\n * accessors using a shared-key encryption scheme where the content data is\n * encrypted using a randomly generated shared key that is then encrypted with\n * each accessors public key and stored along the encrypted data. Accessors can\n * then retrieve the shared key by decrypting it using their private key and\n * use it to recover the original data.\n */\nexport class SharedContainer extends BaseContainer {\n /** Parameters used to wrap the shared encryption key */\n @AsSerializable(RSAEncryptionParams)\n keyParams: RSAEncryptionParams = new RSAEncryptionParams();\n\n /** The ids and encrypted keys of all accessors */\n @AsSerializable(Accessor)\n accessors: Accessor[] = [];\n\n /**\n * Unlocks the container using the id and private key of a given accessor.\n * The id is used to look up the corresponding encrypted key while the\n * private key is used to decrypt it.\n */\n async unlock({ id, privateKey }: { id: string; privateKey: RSAPrivateKey }) {\n if (this._key) {\n // Container is already unlocked, no need to unlock it again\n return;\n }\n\n // Find accessor object with the same id\n const accessor = this.accessors.find(a => a.id === id);\n\n if (!accessor || !accessor.encryptedKey) {\n // No corresponding accessor found.\n throw new Err(ErrorCode.MISSING_ACCESS, \"You no longer have access to this vault.\");\n }\n\n // Decrypt shared key using provided private key\n this._key = await getProvider().decrypt(privateKey, accessor.encryptedKey, this.keyParams);\n }\n\n /**\n * Updates the containers accessors, generating a new shared key and encrypting\n * it with the public keys of the provided **subjects**. Non-empty containers\n * need to be unlocked first.\n */\n async updateAccessors(subjects: { id: string; publicKey: RSAPublicKey }[]) {\n // Get existing data so we can reencrypt it after rotating the key\n let data: Uint8Array | null = null;\n\n // If the container already contains data, we need to reencrypt it after generating a new key\n if (this.encryptedData) {\n if (!this._key) {\n throw \"Non-empty containers need to be unlocked before accessors can be updated!\";\n }\n data = await this.getData();\n }\n\n // Updating the accessors also requires generating a new shared key\n this._key = await getProvider().generateKey(new AESKeyParams());\n\n // Reencrypt data with new key\n if (data) {\n await this.setData(data);\n }\n\n // Encrypt the shared key with the public key of each accessor and store it along with their id\n this.accessors = await Promise.all(\n subjects.map(async ({ id, publicKey }) => {\n const accessor = new Accessor();\n accessor.id = id;\n accessor.encryptedKey = await getProvider().encrypt(publicKey, this._key!, this.keyParams);\n return accessor;\n })\n );\n }\n}\n","import { Serializable, AsBytes } from \"./encoding\";\n\n// Default number of pbkdf2 iterations\nexport const PBKDF2_ITER_DEFAULT = 5e4;\n// Maximum number of pbkdf2 iterations\nexport const PBKDF2_ITER_MAX = 1e7;\n\nexport type AESKey = Uint8Array;\nexport type HMACKey = Uint8Array;\nexport type SymmetricKey = AESKey | HMACKey;\nexport type RSAPublicKey = Uint8Array;\nexport type RSAPrivateKey = Uint8Array;\n\nexport class AESEncryptionParams extends Serializable {\n algorithm: \"AES-GCM\" | \"AES-CCM\" = \"AES-GCM\";\n tagSize: 64 | 96 | 128 = 128;\n keySize: 256 = 256;\n\n @AsBytes()\n iv: Uint8Array = new Uint8Array();\n\n @AsBytes()\n additionalData = new Uint8Array();\n\n validate() {\n return (\n [\"AES-GCM\", \"AES-CCM\"].includes(this.algorithm) &&\n [64, 96, 128].includes(this.tagSize) &&\n [256].includes(this.keySize)\n );\n }\n}\n\nexport class AESKeyParams extends Serializable {\n algorithm: \"AES\" = \"AES\";\n keySize: 256 = 256;\n\n validate() {\n return this.algorithm === \"AES\" && this.keySize === 256;\n }\n}\n\nexport class HMACKeyParams extends Serializable {\n algorithm: \"HMAC\" = \"HMAC\";\n keySize: 256 = 256;\n\n validate() {\n return this.algorithm === \"HMAC\" && this.keySize === 256;\n }\n}\n\nexport class RSAKeyParams extends Serializable {\n algorithm: \"RSA\" = \"RSA\";\n modulusLength: 2048 = 2048;\n hash: \"SHA-256\" = \"SHA-256\";\n\n @AsBytes()\n publicExponent: Uint8Array = new Uint8Array([0x01, 0x00, 0x01]);\n\n validate() {\n return (\n this.algorithm === \"RSA\" &&\n this.modulusLength === 2048 &&\n this.hash === \"SHA-256\" &&\n this.publicExponent instanceof Uint8Array\n );\n }\n}\n\nexport class PBKDF2Params extends Serializable {\n algorithm: \"PBKDF2\" = \"PBKDF2\";\n hash: \"SHA-256\" = \"SHA-256\";\n keySize: 256 = 256;\n iterations: number = PBKDF2_ITER_DEFAULT;\n\n @AsBytes()\n salt: Uint8Array = new Uint8Array();\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n\n validate() {\n return (\n this.algorithm === \"PBKDF2\" &&\n this.hash === \"SHA-256\" &&\n this.keySize === 256 &&\n typeof this.iterations === \"number\" &&\n this.iterations < PBKDF2_ITER_MAX &&\n this.salt instanceof Uint8Array\n );\n }\n}\n\nexport class RSAEncryptionParams extends Serializable {\n algorithm: \"RSA-OAEP\" = \"RSA-OAEP\";\n hash: \"SHA-256\" = \"SHA-256\";\n\n validate() {\n return this.algorithm === \"RSA-OAEP\" && this.hash === \"SHA-256\";\n }\n}\n\nexport class RSASigningParams extends Serializable {\n algorithm: \"RSA-PSS\" = \"RSA-PSS\";\n hash: \"SHA-256\" = \"SHA-256\";\n saltLength: 32 = 32;\n\n validate() {\n return this.algorithm === \"RSA-PSS\" && this.hash === \"SHA-256\" && this.saltLength === 32;\n }\n}\n\nexport class HMACParams extends Serializable {\n algorithm: \"HMAC\" = \"HMAC\";\n hash: \"SHA-1\" | \"SHA-256\" = \"SHA-256\";\n keySize: number = 256;\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n\n validate() {\n return this.algorithm === \"HMAC\" && this.hash === \"SHA-256\" && this.keySize === 256;\n }\n}\n\nexport class HashParams extends Serializable {\n algorithm: \"SHA-1\" | \"SHA-256\" = \"SHA-256\";\n\n constructor(props?: Partial) {\n super();\n props && Object.assign(this, props);\n }\n\n validate() {\n return [\"SHA-1\", \"SHA-256\"].includes(this.algorithm);\n }\n}\n\n/**\n * CryptoProvider provides a unified interface for cryptographic primitives\n * accross all platforms. This is usually a thin wrapper around the\n * native crypto module provided by the platform.\n */\nexport interface CryptoProvider {\n /**\n * Generates an Array of `n` random bytes\n */\n randomBytes(n: number): Promise;\n\n /**\n * Creates a digest of the provided **input** using the algorithm specified in **params**\n * For algorithms that should be supported, see [[HashParams]].\n */\n hash(input: Uint8Array, params: HashParams): Promise;\n\n /**\n * Generates a random key or key pair for the algorithm specified in **params**\n */\n generateKey(params: AESKeyParams): Promise;\n generateKey(params: HMACKeyParams): Promise;\n generateKey(params: RSAKeyParams): Promise<{ privateKey: RSAPrivateKey; publicKey: RSAPublicKey }>;\n\n /**\n * Derives a key from a given `password` using the provided key derivation **params**\n * `password` should be the byte array representation of a UTF-8 encoded password.\n */\n deriveKey(password: Uint8Array, params: PBKDF2Params): Promise;\n\n /**\n * Encrypts `data` with `key` using the cipher and parameters specified in `params`\n */\n encrypt(key: AESKey, data: Uint8Array, params: AESEncryptionParams): Promise;\n encrypt(publicKey: RSAPublicKey, data: Uint8Array, params: RSAEncryptionParams): Promise;\n\n /**\n * Decrypts `data` with `key` using the cipher and parameters specified in `params`\n */\n decrypt(key: AESKey, data: Uint8Array, params: AESEncryptionParams): Promise;\n decrypt(privateKey: RSAPrivateKey, data: Uint8Array, params: RSAEncryptionParams): Promise;\n\n /**\n * Creates a signature from `data` with `key` using the algorithm and parameters specified in `params`\n */\n sign(key: HMACKey, data: Uint8Array, params: HMACParams): Promise;\n sign(key: RSAPrivateKey, data: Uint8Array, params: RSASigningParams): Promise;\n\n /**\n * Verifies `signature` with `data` and `key` using the algorithm and parameters specified in `params`\n */\n verify(key: HMACKey, signature: Uint8Array, data: Uint8Array, params: HMACParams): Promise;\n verify(key: RSAPublicKey, signature: Uint8Array, data: Uint8Array, params: RSASigningParams): Promise;\n\n /**\n * Creates a fingerprint from a given rsa public key\n */\n fingerprint(key: RSAPublicKey): Promise;\n}\n","import { getWordList } from \"@padloc/locale/src/wordlists\";\nimport { randomNumber } from \"./util\";\n\nexport { AVAILABLE_LANGUAGES } from \"@padloc/locale/src/wordlists\";\n\n/**\n * Generates a passphrase consisting of a number of words randomly selected\n * from a word list. Motivated by http://world.std.com/~reinhold/diceware.html\n */\nexport async function generatePassphrase(nWords = 4, separator = \"-\", languages = [\"en\"]) {\n const words = [];\n const list: string[] = [];\n\n for (const lang of languages) {\n list.push(...(await getWordList(lang)));\n }\n\n // Fall back to englisch if no word lists were found for provided languages\n if (!list.length) {\n list.push(...(await getWordList(\"en\")));\n }\n\n for (let i = 0; i < nWords; i++) {\n words.push(list[await randomNumber(0, list.length - 1)]);\n }\n\n return words.join(separator);\n}\n","export interface Event {\n type: string;\n detail?: any;\n}\n\nexport type Listener = ((e: Event) => void) | { handle: (e: Event) => void };\n\nexport interface EventTarget {\n addEventListener(eventName: string, listener: Listener): any;\n removeEventListener(eventName: string, listener: Listener): any;\n}\n\nexport class EventEmitter implements EventTarget {\n private _listeners = new Map>();\n\n addEventListener(eventName: string, listener: Listener) {\n if (!this._listeners.has(eventName)) {\n this._listeners.set(eventName, new Set());\n }\n this._listeners.get(eventName)!.add(listener);\n }\n\n removeEventListener(eventName: string, listener: Listener) {\n const listeners = this._listeners.get(eventName);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n dispatchEvent(e: Event) {\n const listeners = this._listeners.get(e.type);\n if (listeners) {\n for (const listener of listeners) {\n if (typeof listener === \"function\") {\n listener(e);\n } else {\n listener.handle(e);\n }\n }\n }\n }\n\n dispatch(type: string, detail?: any) {\n this.dispatchEvent({ type, detail });\n }\n}\n","import { PBKDF2Params, HMACParams, HMACKey } from \"./crypto\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\nimport { SimpleContainer } from \"./container\";\nimport {\n stringToBytes,\n bytesToString,\n bytesToHex,\n marshal,\n unmarshal,\n concatBytes,\n Serializable,\n AsSerializable,\n AsDate,\n AsBytes\n} from \"./encoding\";\nimport { Account, AccountID } from \"./account\";\nimport { Org, OrgID } from \"./org\";\nimport { uuid } from \"./util\";\nimport { Err, ErrorCode } from \"./error\";\n\nexport type InvitePurpose = \"join_org\" | \"confirm_membership\";\n\n/**\n * Unique identifier for [[Invite]]s.\n */\nexport type InviteID = string;\n\nclass OrgInfo extends Serializable {\n id: OrgID = \"\";\n name: string = \"\";\n\n @AsBytes()\n publicKey!: Uint8Array;\n\n /**\n * Signature created using the HMAC key derived from [[secret]]\n * Used by invitee to verify organization details.\n */\n @AsBytes()\n signature!: Uint8Array;\n\n constructor(vals: Partial) {\n super();\n Object.assign(this, vals);\n }\n}\n\nclass InviteeInfo extends Serializable {\n id: AccountID = \"\";\n name: string = \"\";\n email: string = \"\";\n\n @AsBytes()\n publicKey!: Uint8Array;\n /**\n * Signature created using the HMAC key derived from [[Invite.secret]]\n * Used by organization owner to verify invitee details.\n */\n @AsBytes()\n signature!: Uint8Array;\n /**\n * Signature of organization details created using the invitee accounts\n * own secret signing key. Will be stored on the [[Member]] object to\n * allow the member to verify the organization details at a later time.\n */\n @AsBytes()\n orgSignature!: Uint8Array;\n\n constructor(vals: Partial) {\n super();\n Object.assign(this, vals);\n }\n}\n\n/**\n * The `Invite` class encapsules most of the logic and information necessary to\n * perform a key exchange between an [[Org]] and [[Account]] before adding the\n * [[Account]] as a member. A secret HMAC key is used to sign and verify the public keys\n * of both invitee and organization. This key is derived from a [[secret]], which\n * needs to be communicated between the organization owner and invitee directly.\n *\n * The invite flow generally works as follows:\n *\n * ```ts\n * // ORG OWNER\n *\n * const invite = new Invite(\"bob@example.com\", \"add_member\");\n *\n * // Generates random secret and signs organization details\n * await invite.intialize(org, orgOwnerAccount);\n *\n * console.log(\"invite secret: \", invite.secret);\n *\n * // => Invite object is send to server, which sends an email to the invitee\n *\n * // INVITEE\n * // => Invitee fetches `invite` object from server, asks org owner for `secret` (in person)\n *\n * // Verifies organization info and signs own public key\n *\n * const success = await invite.accept(inviteeAccount, secret);\n *\n * if (!success) {\n * throw \"Verification failed! Incorrect secret?\";\n * }\n *\n * // => Sends updated invite object to server\n *\n * // ORG OWNER\n *\n * // => Fetches updated invite object\n *\n * // Verify invitee details.\n * if (!(await invite.verifyInvitee())) {\n * throw \"Failed to verify invitee details!\";\n * }\n *\n * // DONE!\n * await org.addOrUpdateMember(invite.invitee);\n * ```\n */\nexport class Invite extends SimpleContainer {\n /** Unique identfier */\n id: InviteID = \"\";\n\n /** Time of creation */\n @AsDate()\n created = new Date();\n\n /**\n * Expiration time used to limit invite procedure to a certain time\n * window. This property is also stored in [[encryptedData]] along\n * with the invite secret to prevent tempering.\n */\n @AsDate()\n expires = new Date();\n\n /**\n * Organization info, including HMAC signature used for verification.\n * Set during initialization\n */\n @AsSerializable(OrgInfo)\n org!: OrgInfo;\n\n /**\n * Invitee info, including HMAC signature used for verification\n * Set when the invitee successfully accepts the invite\n */\n @AsSerializable(InviteeInfo)\n invitee!: InviteeInfo;\n\n /** Info about who created the invite. */\n invitedBy?: {\n id: AccountID;\n name: string;\n email: string;\n } = undefined;\n\n /**\n * Random secret used for deriving the HMAC key that is used to sign and\n * verify organization and invitee details. It is encrypted at rest with an\n * AES key only available to organization admins. The invitee does not have\n * access to this property directly but needs to request it from the\n * organization owner directly.\n *\n * @secret\n * **IMPORTANT**: This property is considered **secret**\n * and should never stored or transmitted in plain text\n */\n set secret(s: string) {\n this._secret = s;\n this._signingKey = null;\n }\n get secret() {\n return this._secret;\n }\n\n /** Whether this invite has expired */\n get expired(): boolean {\n return new Date() > new Date(this.expires);\n }\n\n /** Whether this invite has been accepted by the invitee */\n get accepted(): boolean {\n return !!this.invitee;\n }\n\n private _secret: string = \"\";\n private _signingKey: HMACKey | null = null;\n\n /** Key derivation paramaters used for deriving the HMAC signing key from [[secret]]. */\n @AsSerializable(PBKDF2Params)\n signingKeyParams = new PBKDF2Params({\n iterations: 1e6\n });\n\n /**\n * Parameters used for signing organization and initee details.\n */\n @AsSerializable(HMACParams)\n signingParams = new HMACParams();\n\n constructor(\n /** invitee email */\n public email = \"\",\n /** purpose of the invite */\n public purpose: InvitePurpose = \"join_org\"\n ) {\n super();\n }\n\n /**\n * Initializes the invite by generating a random [[secret]] and [[id]] and\n * signing and storing the organization details.\n *\n * @param org The organization this invite is for\n * @param invitor Account creating the invite\n * @param duration Number of hours until this invite expires\n */\n async initialize(org: Org, invitor: Account, duration = 12) {\n this.id = await uuid();\n this.invitedBy = { id: invitor.id, email: invitor.email, name: invitor.name };\n\n // Generate secret\n this.secret = bytesToHex(await getProvider().randomBytes(4));\n // Set expiration time (12 hours from now)\n this.expires = new Date(Date.now() + 1000 * 60 * 60 * duration);\n\n // Encrypt secret and expiration date (the expiration time is also stored/transmitted\n // in plain text, encrypting it will allow verifying it wasn't tempered with later)\n this._key = org.invitesKey;\n await this.setData(stringToBytes(marshal({ secret: this.secret, expires: this.expires })));\n\n // Initialize signing params\n this.signingKeyParams.salt = await getProvider().randomBytes(16);\n\n // Create org signature using key derived from secret (see `_getSigningKey`)\n this.org = new OrgInfo({\n id: org.id,\n name: org.name,\n publicKey: org.publicKey,\n signature: await this._sign(concatBytes([stringToBytes(org.id), org.publicKey], 0x00))\n });\n }\n\n /**\n * \"Unlocks\" the invite with the dedicated key (owned by the respective [[Org]]).\n * This grants access to the [[secret]] property and verfies that [[expires]] has\n * not been tempered with.\n */\n async unlock(key: Uint8Array) {\n await super.unlock(key);\n const { secret, expires } = unmarshal(bytesToString(await this.getData()));\n this.secret = secret;\n\n // Verify that expiration time has not been tempered with\n if (this.expires.getTime() !== new Date(expires).getTime()) {\n throw new Err(ErrorCode.VERIFICATION_ERROR);\n }\n }\n\n lock() {\n super.lock();\n delete this.secret;\n delete this._signingKey;\n }\n\n /**\n * Accepts the invite by verifying the organization details and, if successful,\n * signing and storing the invitees own information. Throws if verification\n * is unsuccessful.\n */\n async accept(account: Account, secret: string): Promise {\n this.secret = secret;\n\n // Verify org signature\n if (!(await this.verifyOrg())) {\n this.secret = \"\";\n return false;\n }\n\n this.invitee = new InviteeInfo({\n id: account.id,\n name: account.name,\n email: account.email,\n publicKey: account.publicKey,\n // this is used by the organization owner to verify the invitees public key\n signature: await this._sign(\n concatBytes([stringToBytes(account.id), stringToBytes(account.email), account.publicKey], 0x00)\n ),\n // this is used by member later to verify the organization public key\n orgSignature: await account.signOrg(this.org)\n });\n\n return true;\n }\n\n /** Verifies the organization information. */\n async verifyOrg(): Promise {\n if (!this.org) {\n throw \"Invite needs to be initialized first!\";\n }\n\n return (\n this.expires > new Date() &&\n this._verify(this.org.signature, concatBytes([stringToBytes(this.org.id), this.org.publicKey], 0x00))\n );\n }\n\n /** Verifies the invitee information. */\n async verifyInvitee(): Promise {\n if (!this.invitee) {\n throw \"Invite needs to be accepted first!\";\n }\n\n return (\n this.expires > new Date() &&\n this._verify(\n this.invitee.signature,\n concatBytes(\n [stringToBytes(this.invitee.id), stringToBytes(this.invitee.email), this.invitee.publicKey],\n 0x00\n )\n )\n );\n }\n\n private async _getSigningKey() {\n if (!this._signingKey) {\n this._signingKey = (await getProvider().deriveKey(\n stringToBytes(this.secret),\n this.signingKeyParams\n )) as HMACKey;\n }\n return this._signingKey;\n }\n\n private async _sign(val: Uint8Array): Promise {\n return getProvider().sign(await this._getSigningKey(), val, this.signingParams);\n }\n\n private async _verify(sig: Uint8Array, val: Uint8Array): Promise {\n return await getProvider().verify(await this._getSigningKey(), sig, val, this.signingParams);\n }\n}\n","import { translate as $l } from \"@padloc/locale/src/translate\";\nimport { base32ToBytes, Serializable, AsSerializable, AsDate } from \"./encoding\";\nimport { totp } from \"./otp\";\nimport { uuid } from \"./util\";\nimport { AccountID } from \"./account\";\nimport { AttachmentInfo } from \"./attachment\";\n\n/** A tag that can be assigned to a [[VaultItem]] */\nexport type Tag = string;\n\n/** Unique identifier for [[VaultItem]]s */\nexport type VaultItemID = string;\n\nexport enum FieldType {\n Username = \"username\",\n Password = \"password\",\n Url = \"url\",\n Email = \"email\",\n Date = \"date\",\n Month = \"month\",\n Credit = \"credit\",\n Phone = \"phone\",\n Pin = \"pin\",\n Totp = \"totp\",\n Note = \"note\",\n Text = \"text\"\n}\n\n/**\n * Field definition containing meta data for a certain field type\n */\nexport interface FieldDef {\n /** content type */\n type: FieldType;\n /** regular expression describing pattern of field contents */\n pattern: string;\n /** whether the field should be masked when displayed */\n mask: boolean;\n /** whether the field value can have multiple lines */\n multiline: boolean;\n /** icon used for display */\n icon: string;\n /** display name */\n name: string;\n /** display formatting */\n format?: (value: string, masked: boolean) => string;\n /** for values that need to be prepared before being copied / filled */\n transform?: (value: string) => Promise;\n}\n\n/** Available field types and respective meta data */\nexport const FIELD_DEFS: { [t in FieldType]: FieldDef } = {\n [FieldType.Username]: {\n type: FieldType.Username,\n pattern: \".*\",\n mask: false,\n multiline: false,\n icon: \"user\",\n get name() {\n return $l(\"Username\");\n }\n },\n [FieldType.Password]: {\n type: FieldType.Password,\n pattern: \".*\",\n mask: true,\n multiline: true,\n icon: \"lock\",\n get name() {\n return $l(\"Password\");\n },\n format(value, masked) {\n return masked ? value.replace(/./g, \"\\u2022\") : value;\n }\n },\n [FieldType.Url]: {\n type: FieldType.Url,\n pattern: \".*\",\n mask: false,\n multiline: false,\n icon: \"web\",\n get name() {\n return $l(\"URL\");\n }\n },\n [FieldType.Email]: {\n type: FieldType.Email,\n pattern: \".*\",\n mask: false,\n multiline: false,\n icon: \"email\",\n get name() {\n return $l(\"Email Address\");\n }\n },\n [FieldType.Date]: {\n type: FieldType.Date,\n pattern: \"\\\\d\\\\d\\\\d\\\\d-\\\\d\\\\d-\\\\d\\\\d\",\n mask: false,\n multiline: false,\n icon: \"date\",\n get name() {\n return $l(\"Date\");\n },\n format(value) {\n return new Date(value).toLocaleDateString();\n }\n },\n [FieldType.Month]: {\n type: FieldType.Month,\n pattern: \"\\\\d\\\\d\\\\d\\\\d-\\\\d\\\\d\",\n mask: false,\n multiline: false,\n icon: \"month\",\n get name() {\n return $l(\"Month\");\n }\n },\n [FieldType.Credit]: {\n type: FieldType.Credit,\n pattern: \"\\\\d*\",\n mask: true,\n multiline: false,\n icon: \"credit\",\n get name() {\n return $l(\"Credit Card Number\");\n },\n format(value, masked) {\n const parts = [];\n\n for (let i = 0; i < value.length; i += 4) {\n const part = value.slice(i, i + 4);\n parts.push(masked && i < value.length - 4 ? part.replace(/./g, \"\\u2022\") : part);\n }\n\n return parts.join(\" \");\n }\n },\n [FieldType.Phone]: {\n type: FieldType.Phone,\n pattern: \".*\",\n mask: false,\n multiline: false,\n icon: \"phone\",\n get name() {\n return $l(\"Phone Number\");\n }\n },\n [FieldType.Pin]: {\n type: FieldType.Pin,\n pattern: \"\\\\d*\",\n mask: true,\n multiline: false,\n icon: \"lock\",\n get name() {\n return $l(\"PIN\");\n },\n format(value, masked) {\n return masked ? value.replace(/./g, \"\\u2022\") : value;\n }\n },\n [FieldType.Totp]: {\n type: FieldType.Totp,\n pattern: \".*\",\n mask: false,\n multiline: false,\n icon: \"totp\",\n get name() {\n return $l(\"2FA Token\");\n },\n async transform(value: string) {\n return await totp(base32ToBytes(value));\n }\n },\n [FieldType.Note]: {\n type: FieldType.Note,\n pattern: \".*\",\n mask: false,\n multiline: true,\n icon: \"note\",\n get name() {\n return $l(\"Note\");\n }\n },\n [FieldType.Text]: {\n type: FieldType.Text,\n pattern: \".*\",\n mask: false,\n multiline: false,\n icon: \"text\",\n get name() {\n return $l(\"Other\");\n }\n }\n};\n\nexport class Field extends Serializable {\n constructor(vals: Partial = {}) {\n super();\n Object.assign(this, vals);\n }\n\n /**\n * field type, determining meta data via the corresponding field definition\n * in [[FIELD_DEFS]]\n */\n type: FieldType = FieldType.Text;\n /** field name */\n name: string = \"\";\n /** field content */\n value: string = \"\";\n\n get def(): FieldDef {\n return FIELD_DEFS[this.type] || FIELD_DEFS[FieldType.Text];\n }\n\n get icon() {\n return this.def.icon;\n }\n\n async transform() {\n return this.def.transform ? await this.def.transform(this.value) : this.value;\n }\n\n format(masked: boolean) {\n return this.def.format ? this.def.format(this.value, masked) : this.value;\n }\n\n protected _fromRaw(raw: any) {\n if (!raw.type) {\n raw.type = guessFieldType(raw);\n }\n return super._fromRaw(raw);\n }\n}\n\n/** Normalizes a tag value by removing invalid characters */\nexport function normalizeTag(tag: string): Tag {\n return tag.replace(\",\", \"\");\n}\n\n/** Represents an entry within a vault */\nexport class VaultItem extends Serializable {\n constructor(vals: Partial = {}) {\n super();\n Object.assign(this, vals);\n }\n\n /** unique identfier */\n id: VaultItemID = \"\";\n\n /** item name */\n name: string = \"\";\n\n /** item fields */\n @AsSerializable(Field)\n fields: Field[] = [];\n\n /** array of tags assigned with this item */\n tags: Tag[] = [];\n\n /** Date and time of last update */\n @AsDate()\n updated: Date = new Date();\n\n /** [[Account]] the item was last updated by */\n updatedBy: AccountID = \"\";\n\n /**\n * @DEPRECATED\n * Accounts that have favorited this item\n */\n favorited: AccountID[] = [];\n\n /** attachments associated with this item */\n @AsSerializable(AttachmentInfo)\n attachments: AttachmentInfo[] = [];\n}\n\n/** Creates a new vault item */\nexport async function createVaultItem(name: string, fields: Field[] = [], tags: Tag[] = []): Promise {\n return new VaultItem({\n name,\n fields,\n tags,\n id: await uuid()\n });\n}\n\nconst matchUsername = /username/i;\nconst matchPassword = /password/i;\nconst matchUrl = /url/i;\nconst matchNote = /\\n/;\n\n/** Guesses the most appropriate field type based on field name and value */\nexport function guessFieldType({ name = \"\", value = \"\", masked }: any): FieldType {\n return masked || name.match(matchPassword)\n ? FieldType.Password\n : name.match(matchUsername)\n ? FieldType.Username\n : name.match(matchUrl)\n ? FieldType.Url\n : value.match(matchNote)\n ? FieldType.Note\n : FieldType.Text;\n}\n\nexport interface ItemTemplate {\n fields: { name: string; type: FieldType }[];\n icon: string;\n toString(): string;\n attachment?: boolean;\n}\n\nexport const ITEM_TEMPLATES: ItemTemplate[] = [\n {\n toString: () => $l(\"Website / App\"),\n icon: \"web\",\n fields: [\n {\n get name() {\n return $l(\"Username\");\n },\n type: FieldType.Username\n },\n {\n get name() {\n return $l(\"Password\");\n },\n type: FieldType.Password\n },\n {\n get name() {\n return $l(\"URL\");\n },\n type: FieldType.Url\n }\n ]\n },\n {\n toString: () => $l(\"Computer\"),\n icon: \"desktop\",\n fields: [\n {\n get name() {\n return $l(\"Username\");\n },\n type: FieldType.Username\n },\n {\n get name() {\n return $l(\"Password\");\n },\n type: FieldType.Password\n }\n ]\n },\n {\n toString: () => $l(\"Credit Card\"),\n icon: \"credit\",\n fields: [\n {\n get name() {\n return $l(\"Card Number\");\n },\n type: FieldType.Credit\n },\n {\n get name() {\n return $l(\"Card Owner\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"Valid Until\");\n },\n type: FieldType.Month\n },\n {\n get name() {\n return $l(\"CVC\");\n },\n type: FieldType.Pin\n },\n {\n get name() {\n return $l(\"PIN\");\n },\n type: FieldType.Pin\n }\n ]\n },\n {\n toString: () => $l(\"Bank Account\"),\n icon: \"bank\",\n fields: [\n {\n get name() {\n return $l(\"Account Owner\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"IBAN\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"BIC\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"Card PIN\");\n },\n type: FieldType.Pin\n }\n ]\n },\n {\n toString: () => $l(\"WIFI Password\"),\n icon: \"wifi\",\n fields: [\n {\n get name() {\n return $l(\"Name\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"Password\");\n },\n type: FieldType.Password\n }\n ]\n },\n {\n toString: () => $l(\"Passport\"),\n icon: \"passport\",\n fields: [\n {\n get name() {\n return $l(\"Full Name\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"Passport Number\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"Country\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"Birthdate\");\n },\n type: FieldType.Date\n },\n {\n get name() {\n return $l(\"Birthplace\");\n },\n type: FieldType.Text\n },\n {\n get name() {\n return $l(\"Issued On\");\n },\n type: FieldType.Date\n },\n {\n get name() {\n return $l(\"Expires\");\n },\n type: FieldType.Date\n }\n ]\n },\n {\n toString: () => $l(\"Note\"),\n icon: \"note\",\n fields: [\n {\n get name() {\n return $l(\"Note\");\n },\n type: FieldType.Note\n }\n ]\n },\n {\n toString: () => $l(\"Document\"),\n icon: \"attachment\",\n fields: [],\n attachment: true\n },\n {\n toString: () => $l(\"Custom\"),\n icon: \"custom\",\n fields: []\n }\n];\n","import { sjcl } from \"../vendor/sjcl\";\nimport { Err, ErrorCode } from \"./error\";\nimport { PBKDF2_ITER_MAX } from \"./crypto\";\nimport { PBES2Container } from \"./container\";\n\n/**\n * Interface representing legacy container structure (i.e. encryption format\n * used in Padlock versions 1.x and 2.x)\n */\nexport interface LegacyContainer {\n version?: 1;\n cipher: \"aes\";\n mode: \"ccm\";\n iv: string;\n adata: string;\n ts: 64 | 96 | 128;\n keySize: 256;\n salt: string;\n iter: number;\n ct: string;\n}\n\n/**\n * Validates legacy container structure\n */\nexport function validateLegacyContainer(obj: any): boolean {\n return (\n typeof obj === \"object\" &&\n (obj.version === undefined || obj.version === 1) && // has a valid version\n [128, 192, 256].includes(obj.keySize) &&\n typeof obj.iter == \"number\" && // valid PBKDF2 iteration count\n obj.iter <= PBKDF2_ITER_MAX && // sane pbkdf2 iteration count\n typeof obj.salt == \"string\" &&\n [\"aes\"].includes(obj.cipher) && // valid cipher\n [\"ccm\", \"ocb2\"].includes(obj.mode) && // exiting mode\n typeof obj.iv == \"string\" && // valid initialisation vector\n typeof obj.ct == \"string\" && // valid cipher text\n typeof obj.adata == \"string\" && // valid authorisation data\n [64, 96, 128].includes(obj.ts) // valid authorisation tag length\n );\n}\n\n/**\n * Transforms a legacy container object into an instance of [[PBES2Container]]\n */\nexport function parseLegacyContainer(raw: LegacyContainer): PBES2Container {\n if (!validateLegacyContainer(raw)) {\n throw new Err(ErrorCode.ENCODING_ERROR);\n }\n\n if (raw.version === undefined) {\n // Legacy versions of Padlock had a bug where the base64-encoded\n // `adata` value was not converted to a BitArray before being\n // passed to `sjcl.mode.ccm.encrypt/decrypt` and the raw string was\n // passed instead. This went unnoticed as the functions in question\n // quietly accepted the string and simply treated it as an array.\n // So in order to successfully decrypt legacy containers we have to\n // perfom this conversion first.\n raw.adata = sjcl.codec.base64.fromBits(raw.adata);\n }\n\n return new PBES2Container().fromRaw({\n encryptionParams: {\n algorithm: \"AES-CCM\",\n tagSize: raw.ts,\n keySize: raw.keySize,\n iv: raw.iv,\n additionalData: raw.adata\n },\n keyParams: {\n algorithm: \"PBKDF2\",\n hash: \"SHA-256\",\n keySize: raw.keySize,\n iterations: raw.iter,\n salt: raw.salt\n },\n encryptedData: raw.ct\n });\n}\n","import { Serializable, bytesToBase64, AsDate } from \"./encoding\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\nimport { Storable } from \"./storage\";\nimport { randomNumber } from \"./util\";\n\nexport enum MFAPurpose {\n Signup,\n Login,\n Recover,\n GetLegacyData\n}\n\nexport enum MFAType {\n Email\n}\n\n/**\n * Class for storing email verification data. Email verificatiion is used\n * to prove ownership of the email address in question and as a authentication\n * mechanism.\n */\nexport class MFARequest extends Serializable implements Storable {\n /** Time of creation */\n @AsDate()\n created = new Date();\n\n /**\n * MFA verification code. This code is sent to the user via email\n * through [[API.requestMFACode]]\n */\n code: string = \"\";\n\n /**\n * MFA token that can be exchanged for the MFA code via [[API.retrieveMFAToken]]\n */\n token: string = \"\";\n\n /**\n * Number of failed tries\n */\n tries: number = 0;\n\n get id() {\n return `${this.email}_${this.purpose}`;\n }\n\n constructor(\n /** The email to be verified */\n public email: string,\n /** The verification purpose */\n public purpose: MFAPurpose,\n public type: MFAType = MFAType.Email\n ) {\n super();\n }\n\n async init() {\n const len = 6;\n // Create random 6-digit verification code\n this.code = (await randomNumber(0, Math.pow(10, len) - 1)).toString().padStart(len, \"0\");\n // Create random 16-byte verification token\n this.token = bytesToBase64(await getProvider().randomBytes(16));\n this.tries = 0;\n }\n}\n","import { stringToBytes, Serializable, concatBytes, AsSerializable, AsBytes, AsDate, Exclude } from \"./encoding\";\nimport { RSAPrivateKey, RSAPublicKey, AESKey, RSAKeyParams, AESKeyParams, RSASigningParams } from \"./crypto\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\nimport { SharedContainer } from \"./container\";\nimport { Err, ErrorCode } from \"./error\";\nimport { Storable } from \"./storage\";\nimport { Vault, VaultID } from \"./vault\";\nimport { Account, AccountID } from \"./account\";\nimport { Invite, InviteID } from \"./invite\";\nimport { OrgQuota } from \"./quota\";\nimport { BillingInfo } from \"./billing\";\n\n/** Role of a member within an organization, each associated with certain priviliges */\nexport enum OrgRole {\n /**\n * Organization owner. Can manage members, groups and vaults. Owners have\n * access to the secret [[Org.privateKey]] and [[Org.invitesKey]]\n * properties.\n */\n Owner,\n /**\n * Organization admin. Can manage groups and vaults.\n */\n Admin,\n /**\n * Basic organization member. Can read public organization data and read/write\n * certain [[Vault]]s they have been assigned to directly or via [[Group]]s.\n */\n Member,\n /**\n * Suspended members can read public organization data and access [[Vaults]] they\n * have been assigned to, but are excluded from any updates to those vaults.\n * Member information (like public key and email address) of suspended members\n * are considered unverified, and need to be updated and verified via a\n * membership confirmation [[Invite]].\n */\n Suspended\n}\n\n/**\n * Represents an [[Account]]s membership to an [[Org]]\n */\nexport class OrgMember extends Serializable {\n /** id of the corresponding [[Account]] */\n id: AccountID = \"\";\n\n /** name of the corresponding [[Account]] */\n name = \"\";\n\n /** email address of the corresponding [[Account]] */\n email = \"\";\n\n /** public key of the corresponding [[Account]] */\n @AsBytes()\n publicKey!: RSAPublicKey;\n\n /** signature used by other members to verify [[id]], [[email]] and [[publicKey]] */\n @AsBytes()\n signature!: Uint8Array;\n\n /** signature used by the member to verify [[Org.id]] and [[Org.publickey]] of the organization */\n @AsBytes()\n orgSignature!: Uint8Array;\n\n /** vaults assigned to this member */\n vaults: {\n id: VaultID;\n readonly: boolean;\n }[] = [];\n\n /** the members organization role */\n role: OrgRole = OrgRole.Member;\n\n /** time the member was last updated */\n @AsDate()\n updated = new Date(0);\n\n constructor({ id, name, email, publicKey, signature, orgSignature, role, updated }: Partial = {}) {\n super();\n Object.assign(this, { id, name, email, publicKey, signature, orgSignature, updated });\n this.role = typeof role !== \"undefined\" && role in OrgRole ? role : OrgRole.Member;\n }\n}\n\n/**\n * A group of members, used to manage [[Vault]] access for multiple members at once.\n */\nexport class Group extends Serializable {\n constructor(vals: Partial = {}) {\n super();\n Object.assign(this, vals);\n }\n\n /** display name */\n name = \"\";\n /** members assigned to this group */\n members: { id: AccountID }[] = [];\n /** [[Vault]]s assigned to this group */\n vaults: {\n id: VaultID;\n readonly: boolean;\n }[] = [];\n}\n\n/** Unique identifier for [[Org]]s */\nexport type OrgID = string;\n\nexport enum OrgType {\n Basic,\n Team,\n Business\n}\n\nexport class OrgSecrets extends Serializable {\n constructor({ invitesKey, privateKey }: Partial = {}) {\n super();\n Object.assign(this, { invitesKey, privateKey });\n }\n\n @AsBytes()\n invitesKey!: Uint8Array;\n\n @AsBytes()\n privateKey!: Uint8Array;\n}\n\n/**\n * Organizations are the central component of Padlocs secure data sharing architecture.\n *\n * All shared [[Vault]]s are provisioned and managed in the context of an organization,\n * while the [[Org]] class itself is responsible for managing, signing and verifying\n * public keys, identities and priviliges for all of it's members.\n *\n * Vaults can be assigned to members direcly or indirectly through [[Group]]s. In both\n * cases, this access can be declared *readonly*.\n *\n * Before being added to an organization, members need to go throug a key exchange\n * procedure designed to allow verification of organization and member details\n * by both parties. See [[Invite]] class for details.\n *\n * The [[privateKey]] and [[invitesKey]] properties are considered secret and are only\n * accessible to members with the [[OrgRole.Owner]] role. To protect this information\n * from unauthorized access, [[Org]] extends the [[SharedContainer]] class, encrypting\n * this data at rest.\n *\n * #### Organization Structure\n * ```\n * ┌──────────────┐ ┌──────────────┐ ┌──────────────┐\n * │ │ ╱│ │╲ │ │\n * │ Account │┼─────────○─│ Membership │──┼────────┼│ Organization │\n * │ │ ╲│ │╱ │ │\n * └──────────────┘ └───┬──────┬───┘ └──────────────┘\n * ╲│╱ ╲│╱ ┼\n * ○ ○ ○\n * │ │ ╱│╲\n * │ │ ┌──────────────┐\n * │ │ ╱│ │\n * │ └──────────────○─│ Group │\n * │ ╲│ │\n * ○ └──────────────┘\n * ╱│╲ ╲│╱\n * ┌──────────────┐ ○\n * │ │╲ │\n * │ Shared Vault │─○──────────────────────┘\n * │ │╱\n * └──────────────┘\n * ```\n */\nexport class Org extends SharedContainer implements Storable {\n /** Unique identier */\n id: OrgID = \"\";\n\n type: OrgType = OrgType.Basic;\n\n /** [[Account]] which created this organization */\n owner: AccountID = \"\";\n\n /** Organization name */\n name: string = \"\";\n\n /** Creation date */\n @AsDate()\n created: Date = new Date();\n\n /** Last updated */\n @AsDate()\n updated: Date = new Date();\n\n /** Public key used for verifying member signatures */\n @AsBytes()\n publicKey!: RSAPublicKey;\n\n /**\n * Private key used for signing member details\n *\n * @secret\n * **IMPORTANT**: This property is considered **secret**\n * and should never stored or transmitted in plain text\n */\n @Exclude()\n privateKey!: RSAPrivateKey;\n\n /**\n * AES key used as encryption key for [[Invite]]s\n *\n * @secret\n * **IMPORTANT**: This property is considered **secret**\n * and should never stored or transmitted in plain text\n */\n @Exclude()\n invitesKey!: AESKey;\n\n /**\n * Minimum accepted update time for organization members.\n * Any members with a [[OrgMember.updated]] value lower than\n * this should be considered invalid.\n *\n * In order to prevent an attacker from rolling back this value, all\n * clients should verify that updated organization object always have a\n * [[Org.minMemberUpdated]] value equal to or higher than the previous one.\n */\n @AsDate()\n minMemberUpdated: Date = new Date();\n\n /** Parameters for creating member signatures */\n @AsSerializable(RSASigningParams)\n signingParams = new RSASigningParams();\n\n /** Array of organization members */\n @AsSerializable(OrgMember)\n members: OrgMember[] = [];\n\n /** This organizations [[Group]]s. */\n @AsSerializable(Group)\n groups: Group[] = [];\n\n /** Shared [[Vault]]s owned by this organization */\n vaults: { id: VaultID; name: string; revision?: string }[] = [];\n\n /** Pending [[Invite]]s */\n @AsSerializable(Invite)\n invites: Invite[] = [];\n\n /**\n * Revision id used for ensuring continuity when synchronizing the account\n * object between client and server\n */\n revision: string = \"\";\n\n /**\n * Whether the organization is in \"frozen\" state. If an organization is\n * frozen, groups, members and vaults assoziated with the Organization can\n * not be updated.\n */\n frozen = false;\n\n @AsSerializable(OrgQuota)\n quota: OrgQuota = new OrgQuota();\n\n @AsSerializable(BillingInfo)\n billing?: BillingInfo;\n\n usedStorage: number = 0;\n\n /** Whether the given [[Account]] is an [[OrgRole.Owner]] */\n isOwner(m: { id: AccountID }) {\n const member = this.getMember(m);\n return !!member && member.role <= OrgRole.Owner;\n }\n\n /** Whether the given [[Account]] is an [[OrgRole.Admin]] */\n isAdmin(m: { id: AccountID }) {\n const member = this.getMember(m);\n return !!member && member.role <= OrgRole.Admin;\n }\n\n /** Whether the given [[Account]] is currently suspended */\n isSuspended(m: { id: AccountID }) {\n const member = this.getMember(m);\n return !!member && member.role === OrgRole.Suspended;\n }\n\n /** Get the [[OrgMember]] object for this [[Account]] */\n getMember({ id }: { id: AccountID }) {\n return this.members.find(m => m.id === id);\n }\n\n /** Whether the given [[Account]] is an organization member */\n isMember(acc: { id: AccountID }) {\n return !!this.getMember(acc);\n }\n\n /** Get group with the given `name` */\n getGroup(name: string) {\n return [...this.groups].find(g => g.name === name);\n }\n\n /** Get all members of a given `group` */\n getMembersForGroup(group: Group): OrgMember[] {\n return (\n group.members\n .map(m => this.getMember(m))\n // Filter out undefined members\n .filter(m => !!m) as OrgMember[]\n );\n }\n\n /** Get all [[Group]]s the given [[Account]] is a member of */\n getGroupsForMember({ id }: { id: AccountID }) {\n return this.groups.filter(g => g.members.some(m => m.id === id));\n }\n\n /** Get all groups assigned to a given [[Vault]] */\n getGroupsForVault({ id }: { id: VaultID }): Group[] {\n return this.groups.filter(group => group.vaults.some(v => v.id === id));\n }\n\n /** Get all members directly assigned to a given [[Vault]] */\n getMembersForVault({ id }: { id: VaultID }): OrgMember[] {\n return this.members.filter(member => member.role !== OrgRole.Suspended && member.vaults.some(v => v.id === id));\n }\n\n /** Get all membes that have acess to a given `vault`, either directly or through a [[Group]] */\n getAccessors(vault: Vault) {\n const results = new Set(this.getMembersForVault(vault));\n\n for (const group of this.getGroupsForVault(vault)) {\n for (const m of group.members) {\n const member = this.getMember(m);\n if (member && member.role !== OrgRole.Suspended) {\n results.add(member);\n }\n }\n }\n\n return [...results];\n }\n\n /** Get all vaults the given member has access to */\n getVaultsForMember(acc: OrgMember | Account) {\n const member = this.getMember(acc);\n\n if (!member) {\n throw \"A member with this id does not exist!\";\n }\n\n const results = new Set(member.vaults.map(v => v.id));\n\n for (const group of this.getGroupsForMember(member)) {\n for (const vault of group.vaults) {\n results.add(vault.id);\n }\n }\n\n return this.vaults.filter(v => results.has(v.id));\n }\n\n /** Check whether the given `account` has read access to a `vault` */\n canRead(vault: { id: VaultID }, account: { id: AccountID }) {\n const member = this.getMember(account);\n\n return (\n member &&\n [member, ...this.getGroupsForMember(member)].some(({ vaults }) => vaults.some(v => v.id === vault.id))\n );\n }\n\n /** Check whether the given `account` has write access to a `vault` */\n canWrite(vault: { id: VaultID }, acc: { id: AccountID }) {\n const member = this.getMember(acc);\n\n return (\n member &&\n member.role !== OrgRole.Suspended &&\n [member, ...this.getGroupsForMember(member)].some(({ vaults }) =>\n vaults.some(v => v.id === vault.id && !v.readonly)\n )\n );\n }\n\n /** Get the invite with the given `id` */\n getInvite(id: InviteID) {\n return this.invites.find(inv => inv.id === id);\n }\n\n /** Remove an invite */\n removeInvite({ id }: Invite) {\n this.invites = this.invites.filter(inv => inv.id !== id);\n }\n\n /**\n * Initializes the organization, generating [[publicKey]], [[privateKey]],\n * and [[invitesKey]] and adding the given `account` as the organization\n * owner.\n */\n async initialize(account: Account) {\n // Update access to keypair\n await this.updateAccessors([account]);\n\n // Generate cryptographic keys\n await this.generateKeys();\n\n // Set minimum date for member update times\n this.minMemberUpdated = new Date();\n\n const orgSignature = await account.signOrg(this);\n const member = await this.sign(\n new OrgMember({\n id: account.id,\n name: account.name,\n email: account.email,\n publicKey: account.publicKey,\n orgSignature,\n role: OrgRole.Owner,\n updated: new Date()\n })\n );\n this.members.push(member);\n }\n\n /**\n * Generates a new [[publicKey]], [[privateKey]] and [[invitesKey]] and\n * encrypts the latter two\n */\n async generateKeys() {\n this.invitesKey = await getProvider().generateKey(new AESKeyParams());\n const { privateKey, publicKey } = await getProvider().generateKey(new RSAKeyParams());\n this.privateKey = privateKey;\n this.publicKey = publicKey;\n await this.setData(new OrgSecrets(this).toBytes());\n }\n\n /**\n * Regenerates all cryptographic keys and updates all member signatures\n */\n async rotateKeys(force = false) {\n if (!force) {\n // Verify members and groups with current public key\n await this.verifyAll();\n }\n\n // Rotate Org key pair\n await this.generateKeys();\n\n // Rotate org encryption key\n delete this.encryptedData;\n await this.updateAccessors(this.members.filter(m => m.role === OrgRole.Owner));\n\n // Re-sign all members\n await Promise.all(this.members.filter(m => m.role !== OrgRole.Suspended).map(m => this.addOrUpdateMember(m)));\n }\n\n /**\n * \"Unlocks\" the organization, granting access to the organizations\n * [[privateKey]] and [[invitesKey]] properties.\n */\n async unlock(account: Account) {\n await super.unlock(account);\n if (this.encryptedData) {\n const secrets = new OrgSecrets().fromBytes(await this.getData());\n Object.assign(this, secrets);\n }\n }\n\n lock() {\n super.lock();\n delete this.privateKey;\n delete this.invitesKey;\n this.invites.forEach(invite => invite.lock);\n }\n\n /**\n * Signs the `member`s public key, id, role and email address so they can be verified later\n */\n async sign(member: OrgMember): Promise {\n if (!this.privateKey) {\n throw \"Organisation needs to be unlocked first.\";\n }\n\n member.signature = await getProvider().sign(\n this.privateKey,\n concatBytes(\n [\n stringToBytes(member.id),\n stringToBytes(member.email),\n new Uint8Array([member.role]),\n member.publicKey,\n stringToBytes(member.updated.toISOString())\n ],\n 0x00\n ),\n this.signingParams\n );\n return member;\n }\n\n /**\n * Verifies the `member`s public key, id, role and email address.\n * Throws if verification fails.\n */\n async verify(member: OrgMember): Promise {\n if (!member.signature) {\n throw new Err(ErrorCode.VERIFICATION_ERROR, \"No signed public key provided!\");\n }\n\n const verified =\n member.updated >= this.minMemberUpdated &&\n (await getProvider().verify(\n this.publicKey,\n member.signature,\n concatBytes(\n [\n stringToBytes(member.id),\n stringToBytes(member.email),\n new Uint8Array([member.role]),\n member.publicKey,\n stringToBytes(member.updated.toISOString())\n ],\n 0x00\n ),\n this.signingParams\n ));\n\n if (!verified) {\n throw new Err(ErrorCode.VERIFICATION_ERROR, `Failed to verify public key of ${member.name}!`);\n }\n }\n\n /**\n * Verify all provided `members`, throws if verification fails for any of them.\n */\n async verifyAll(members: OrgMember[] = this.members.filter(m => m.role !== OrgRole.Suspended)) {\n // Verify public keys for members and groups\n await Promise.all(members.map(async obj => this.verify(obj)));\n }\n\n /**\n * Adds a member to the organization, or updates the existing member with the same id.\n */\n async addOrUpdateMember({\n id,\n name,\n email,\n publicKey,\n orgSignature,\n role\n }: {\n id: string;\n name: string;\n email: string;\n publicKey: Uint8Array;\n orgSignature: Uint8Array;\n role?: OrgRole;\n }) {\n if (!this.privateKey) {\n throw \"Organisation needs to be unlocked first.\";\n }\n\n role = typeof role !== \"undefined\" ? role : OrgRole.Member;\n\n const existing = this.members.find(m => m.id === id);\n const updated = new Date();\n\n if (existing) {\n Object.assign(existing, { name, email, publicKey, orgSignature, role, updated });\n await this.sign(existing);\n } else {\n this.members.push(\n await this.sign(new OrgMember({ id, name, email, publicKey, orgSignature, role, updated }))\n );\n }\n }\n\n /**\n * Removes a member from the organization\n */\n async removeMember(member: { id: AccountID }) {\n if (!this.privateKey) {\n throw \"Organisation needs to be unlocked first.\";\n }\n\n // Remove member from all groups\n for (const group of this.getGroupsForMember(member)) {\n group.members = group.members.filter(m => m.id !== member.id);\n }\n\n // Remove member\n this.members = this.members.filter(m => m.id !== member.id);\n\n // Verify remaining members (since we're going to re-sign them)\n await this.verifyAll();\n\n // Bump minimum update date\n this.minMemberUpdated = new Date();\n\n // Re-sign all members\n await Promise.all(this.members.filter(m => m.role !== OrgRole.Suspended).map(m => this.addOrUpdateMember(m)));\n }\n\n toString() {\n return this.name;\n }\n}\n","import { numToBytes, bytesToNum } from \"./encoding\";\nimport { HMACParams } from \"./crypto\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\nimport { base32ToBytes } from \"./encoding\";\n\nexport interface HOTPOpts {\n digits: number;\n hash: \"SHA-1\" | \"SHA-256\";\n}\n\nexport interface TOTPOpts extends HOTPOpts {\n interval: number;\n}\n\nfunction getToken(hmac: Uint8Array, digits: number = 6): string {\n const offset = hmac[hmac.length - 1] & 0xf;\n const bin = new Uint8Array([hmac[offset] & 0x7f, hmac[offset + 1], hmac[offset + 2], hmac[offset + 3]]);\n const num = bytesToNum(bin);\n return (num % 10 ** digits).toString().padStart(digits, \"0\");\n}\n\nexport async function hotp(\n secret: Uint8Array,\n counter: number,\n { hash, digits }: HOTPOpts = { digits: 6, hash: \"SHA-1\" }\n) {\n const hmac = await getProvider().sign(\n secret,\n numToBytes(counter),\n new HMACParams({ hash, keySize: secret.length * 8 })\n );\n return getToken(hmac, digits);\n}\n\nexport async function totp(\n secret: Uint8Array,\n time: number = Date.now(),\n { interval, ...opts }: TOTPOpts = { interval: 30, digits: 6, hash: \"SHA-1\" }\n) {\n const counter = Math.floor(time / interval / 1000);\n return hotp(secret, counter, opts);\n}\n\nexport function parseURL(data: string) {\n const url = new URL(data);\n const params = new URLSearchParams(url.search);\n const secret = params.get(\"secret\");\n\n if (!secret || !base32ToBytes(secret).length) {\n throw \"Invalid secret\";\n }\n\n return { secret };\n}\n","import { Serializable } from \"./encoding\";\n\nexport class AccountQuota extends Serializable {\n items = -1;\n storage = -1;\n orgs = -1;\n\n constructor(vals?: Partial) {\n super();\n if (vals) {\n Object.assign(this, vals);\n }\n }\n}\n\nexport class OrgQuota extends Serializable {\n members = -1;\n groups = -1;\n vaults = -1;\n storage = -1;\n\n constructor(vals?: Partial) {\n super();\n if (vals) {\n Object.assign(this, vals);\n }\n }\n}\n","/**\n * Options for generating a fingerprint graphic\n */\nexport interface Options {\n /** target height (number of cells) */\n height: number;\n /** target width (number of cells) */\n width: number;\n /** symbols to be mapped against calculated values */\n symbols: string[];\n}\n\n/**\n * Represents a \"fingerprint\" visualization of a certain [[height]] and [[width]],\n * the [[values]] property contains the raw values generated using the [drunken\n * bishop](http://www.dirk-loss.de/sshvis/drunken_bishop.pdf) while [[symbols]]\n * represents the same values by mapping the on the symbols defined in [[Options.symbols]].\n */\nexport interface Fingerprint {\n width: number;\n height: number;\n values: number[][];\n symbols: string[][];\n}\n\ntype Move = \"00\" | \"01\" | \"10\" | \"11\";\ntype Position = [number, number];\n\n/** Default options */\nexport const defaults: Options = {\n height: 9,\n width: 17,\n symbols: [\" \", \".\", \"o\", \"+\", \"=\", \"*\", \"B\", \"O\", \"X\", \"@\", \"%\", \"&\", \"#\", \"/\", \"^\", \"S\", \"E\"]\n};\n\n// Converts a buffer to a binary moves array\nfunction getMoves(bytes: Uint8Array): Move[] {\n const moves = [];\n for (const b of bytes) {\n let str = b.toString(2);\n while (str.length < 8) {\n str = \"0\" + str;\n }\n moves.push(str.slice(6, 8), str.slice(4, 6), str.slice(2, 4), str.slice(0, 2));\n }\n return moves as Move[];\n}\n\n// Gets the steps from a set of moves and the box's height and width\nfunction getSteps(moves: Move[], width: number, height: number): Position[] {\n let pos: Position = [(width - 1) / 2, (height - 1) / 2];\n const steps = [pos];\n\n for (const move of moves) {\n let [x, y] = pos;\n\n switch (move) {\n case \"00\":\n x--, y--;\n break;\n case \"01\":\n x++, y--;\n break;\n case \"10\":\n x--, y++;\n break;\n case \"11\":\n x++, y++;\n break;\n }\n\n pos = [Math.max(0, Math.min(width - 1, x)), Math.max(0, Math.min(height - 1, y))];\n steps.push(pos);\n }\n\n return steps;\n}\n\n// Renders the randomart image from a given fingerprint\nexport function getValues(fingerprint: Uint8Array, opts: Partial = {}): number[][] {\n const { width, height } = Object.assign({}, defaults, opts);\n\n if (height % 2 !== 1 || width % 2 !== 1) {\n throw \"The height and width options must be odd numbers\";\n }\n\n if (fingerprint.length % 2 !== 0) {\n throw \"The fingerprint length must be an even number\";\n }\n\n const moves = getMoves(fingerprint);\n const steps = getSteps(moves, width, height);\n const grid: number[][] = [];\n for (let i = 0; i < height; i++) {\n grid.push(new Array(width).fill(0));\n }\n\n for (const [x, y] of steps) {\n grid[y][x]++;\n }\n\n const [x0, y0] = steps[0];\n const [x1, y1] = steps[steps.length - 1];\n grid[y0][x0] = 15;\n grid[y1][x1] = 16;\n return grid;\n}\n\n/**\n * Generates a visualisation of a \"fingerprint\" similar to the ascii-based\n * visualization method used by OpenSSH. Generates a \"heat map\" of values on a\n * grid of a given width and height using the \"drunken bishop\" algorithm\n * desribed in [this paper](http://www.dirk-loss.de/sshvis/drunken_bishop.pdf).\n */\nexport function randomArt(fingerprint: Uint8Array, opts: Partial = {}): Fingerprint {\n const options = Object.assign({}, defaults, opts);\n const vals = getValues(fingerprint, options);\n const symbols = opts.symbols || defaults.symbols;\n return {\n width: options.width,\n height: options.height,\n values: vals,\n symbols: vals.map(line => line.map(val => symbols[val]))\n };\n}\n","import { Request, Response, RequestAuthentication } from \"./transport\";\nimport { marshal, Serializable, stringToBytes, AsDate, AsSerializable, AsBytes } from \"./encoding\";\nimport { HMACParams } from \"./crypto\";\nimport { Storable } from \"./storage\";\nimport { DeviceInfo } from \"./platform\";\nimport { AccountID } from \"./account\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\n\n/** Unique identifier for [[Session]]s */\nexport type SessionID = string;\n\n/** Public session info (used for display purposes) */\nexport class SessionInfo extends Serializable {\n id: string = \"\";\n account: AccountID = \"\";\n\n @AsDate()\n created: Date = new Date(0);\n\n @AsDate()\n updated: Date = new Date(0);\n\n @AsDate()\n lastUsed: Date = new Date(0);\n\n @AsDate()\n expires?: Date;\n\n @AsSerializable(DeviceInfo)\n device?: DeviceInfo;\n}\n\n/**\n * A session represents a trusted connection between a [[Server]] and [[Client]]\n * which can be used to authenticate requests, allowing both parties to verify\n * the other parties identity and check the request/response bodies integrity.\n * The authentication flow usually works as follows:\n *\n * ```ts\n * // CLIENT\n *\n * const request = createRequest();\n * await this.session.authenticate(request);\n *\n * // SERVER\n *\n * if (!(await context.session.verify(request))) {\n * throw \"Failed to verify request!\";\n * }\n *\n * const response = processRequest(request);\n * await context.session.authenticate(response);\n *\n * // CLIENT\n *\n * if (!(await context.session.verify(response))) {\n * throw \"Failed to verify response!\";\n * }\n *\n * processResponse(response);\n * ```\n *\n * ```\n * ┌──────────┐ ┌──────────┐\n * │Client (C)│ │Server (S)│\n * └─────┬────┘ └────┬─────┘\n * ┌──────────────────────────┐ │ │\n * │req = [request body] │ │ req, sid, │\n * │t1 = [timestamp] │ │ t1, sig1 │ ┌──────────────────────────┐\n * │sig1 = HMAC(K, sid|t1|req)│ │──────────────▶│ │=> verify sig1 │\n * └──────────────────────────┘ │ │ │res = [response body] │\n * │ │ │t2 = [timestamp] │\n * ┌──────────────┐ │ res, t2, sig2 │ │sig2 = HMAC(K, sid|t2|res)│\n * │=> verify sig2│ │◁ ─ ─ ─ ─ ─ ─ ─│ └──────────────────────────┘\n * └──────────────┘ │ │\n * │ │\n * ▼ ▼\n * ```\n */\nexport class Session extends Serializable implements Storable {\n /** Unique identifier */\n id: string = \"\";\n\n /** Associated [[Account]] */\n account: AccountID = \"\";\n\n /** Time of creation */\n @AsDate()\n created = new Date(0);\n\n /** Time of last update */\n @AsDate()\n updated = new Date(0);\n\n /** When this session was last used to authenticate a request */\n @AsDate()\n lastUsed = new Date(0);\n\n /** Expiration time */\n @AsDate()\n expires?: Date;\n\n /** Session key used to sign/verify requests and responses */\n @AsBytes()\n key?: Uint8Array;\n\n /** Info about the device the client is running on */\n @AsSerializable(DeviceInfo)\n device?: DeviceInfo;\n\n /**\n * Public session info\n */\n get info(): SessionInfo {\n return new SessionInfo().fromRaw({\n id: this.id,\n account: this.account,\n created: this.created,\n updated: this.updated,\n lastUsed: this.lastUsed,\n expires: this.expires,\n device: this.device && this.device.toRaw()\n });\n }\n\n /**\n * Authenticates a [[Request]] or [[Response]] by signing the session id,\n * timestamp and request/response body using the session [[key]].\n */\n async authenticate(r: Request | Response): Promise {\n const data = (r).params || (r).result;\n r.auth = await this._sign(data);\n }\n\n /**\n * Verifies session id, timestamp and request/response body of a given\n * [[Request]] or [[Response]] using the session [[key]].\n */\n async verify(r: Request | Response): Promise {\n if (!r.auth) {\n return false;\n }\n\n const data = (r).params || (r).result;\n\n return this._verify(r.auth, data);\n }\n\n private async _sign(data: any): Promise {\n const time = new Date();\n const session = this.id;\n const message = `${session}_${time.toISOString()}_${marshal(data)}`;\n const signature = await getProvider().sign(this.key!, stringToBytes(message), new HMACParams());\n return new RequestAuthentication({\n session,\n time,\n signature\n });\n }\n\n private async _verify(auth: RequestAuthentication, data: any): Promise {\n const { signature, time } = auth;\n const message = `${this.id}_${time.toISOString()}_${marshal(data)}`;\n return await getProvider().verify(this.key!, signature, stringToBytes(message), new HMACParams());\n }\n}\n","/**\n * This module implements version 6a of the [Secure Remote\n * Password](http://srp.stanford.edu/design.html) protocol.\n *\n * The [[Client]] and [[Server]] classes are the high-level interfaces to be\n * used on the client and server side, respectively. The SRP key negotiation\n * flow usually happens as follows:\n *\n * #### First signup\n *\n * ```ts\n * // CLIENT\n *\n * const u = [username/email];\n * const p = [user password];\n * const i = [iteration count];\n * const s = [random salt];\n *\n * const x = PBKDF2(p, s, i);\n *\n * const client = new Client();\n * await client.initialize(x);\n * const v = client.v;\n *\n * => Send u, v, s, i to server\n * ```\n *\n * #### Login / create session\n *\n * ```ts\n * // CLIENT => request login for `u`\n *\n * // SERVER\n *\n * const { v, s, i } = getAuthInfo(u);\n *\n * const server = new Server();\n * await server.initialize(v);\n * const B = server.B;\n *\n * // => Send s, i, B to client\n *\n * // CLIENT\n *\n * const x = PBKDF2(p, s, i);\n *\n * const client = new Client();\n * await client.initialize(x);\n * await client.setB(B);\n *\n * const A = client.A;\n * const M1 = client.M1;\n *\n * // Common session key\n * const K = client.K;\n *\n * // => Send A, M1 to server\n *\n * // SERVER\n *\n * await server.setA(A);\n * if (server.M1 !== M1) {\n * throw \"Invalid credentials!\";\n * }\n *\n * // Common session key\n * const K = server.K;\n *\n * // => Success!\n *\n * // [OPTIONAL] (This step is usually not required since even without\n * // verifying M2, the client will notice something is wrong as soon as they try\n * // to verify an authenticated response from the server.)\n *\n * M2 = server.M2;\n * // => Send M2 to client\n *\n * // CLIENT\n * if (client.M2 !== M2) {\n * throw \"Something is fishy!\";\n * }\n * ```\n *\n * #### Overview:\n *\n * ```\n * ┌──────────┐ ┌──────────┐\n * │Client (C)│ │Server (S)│\n * └─────┬────┘ └────┬─────┘\n * ┌───────────────────┐ │ │\n * │u = [email address]│ │ u, A │\n * │a, A = [random*] │ │──────────────▶│\n * └───────────────────┘ │ │ ┌────────────────┐\n * │ │ │b, B = [random*]│\n * ┌───────────────────────┐ │ s, i, B │ └────────────────┘\n * │p = [master password] │ │◁ ─ ─ ─ ─ ─ ─ ─│\n * │x = PBKDF2(p,s,i) │ │ │\n * │K = K_client(x, a, B)* │ │ │\n * │M = M(A, B, K)* │ │ M │ ┌───────────────────────┐\n * └───────────────────────┘ │──────────────▶│ │K' = K_server(v, b, A)*│\n * │ │ │M' = M(A, B, K') │\n * │ │ │=> verify M == M' │\n * ┌───────────────┐ │ sid │ │S = [session id] │\n * │=> store sid, K│ │◀ ─ ─ ─ ─ ─ ─ ─│ │=> store sid, K │\n * └───────────────┘ │ │ └───────────────────────┘\n * │ │\n * ▼ ▼\n * ```\n */\nimport { BigInteger } from \"../vendor/jsbn\";\nimport { bytesToHex, hexToBytes, concatBytes } from \"./encoding\";\nimport { HashParams } from \"./crypto\";\nimport { getCryptoProvider as getProvider } from \"./platform\";\n\nasync function digest(hash: \"SHA-1\" | \"SHA-256\" = \"SHA-256\", ...input: Uint8Array[]): Promise {\n return getProvider().hash(concatBytes(input), new HashParams({ algorithm: hash }));\n}\n\nfunction i2b(i: BigInteger): Uint8Array {\n let hex = i.toString(16);\n if (hex.length % 2) {\n hex = \"0\" + hex;\n }\n return hexToBytes(hex);\n}\n\nfunction b2i(b: Uint8Array): BigInteger {\n return new BigInteger(bytesToHex(b), 16);\n}\n\n/**\n * High-level interface for the client side\n */\nexport class Client {\n /** Verifier value, available after calling [[initialize]] */\n get v() {\n return this._v ? i2b(this._v) : null;\n }\n\n /** Client-side random initializer, available after calling [[initialize]] */\n get A() {\n return this._A ? i2b(this._A) : null;\n }\n\n /** Common session key, available after calling [[initialize]] and [[setB]] */\n get K() {\n return this._K ? i2b(this._K) : null;\n }\n\n /**\n * First value used to verify a successful key exchange, available after\n * calling [[initialize]] and [[setB]]\n */\n get M1() {\n return this._M1 ? i2b(this._M1) : null;\n }\n\n /**\n * Second value used to verify a successful key exchange, available after\n * calling [[initialize]] and [[setB]]\n */\n get M2() {\n return this._M2 ? i2b(this._M2) : null;\n }\n\n private _srp: Core;\n private _x?: BigInteger;\n private _v?: BigInteger;\n private _a?: BigInteger;\n private _A?: BigInteger;\n private _B?: BigInteger;\n private _K?: BigInteger;\n private _M1?: BigInteger;\n private _M2?: BigInteger;\n\n constructor(length: SRPGroupLength = 4096) {\n this._srp = new Core(length);\n }\n\n /** Initialize client using the given secret `x`, generating [[v]] and [[A]] */\n async initialize(x: Uint8Array) {\n this._x = b2i(x);\n this._v = this._srp.v(this._x);\n this._a = b2i(await getProvider().randomBytes(32));\n this._A = this._srp.A(this._a);\n }\n\n /**\n * Apply [[Server.B]] value, calculating [[K]], [[M1]] and [[M2]].\n * Should only be called after [[initialize]] has been called.\n */\n async setB(B: Uint8Array) {\n if (!this._x || !this._a || !this._A) {\n throw \"not initialized\";\n }\n this._B = b2i(B);\n this._K = await this._getKey();\n this._M1 = await this._srp.M1(this._A, this._B, this._K);\n this._M2 = await this._srp.M2(this._A, this._M1, this._K);\n }\n\n private async _getKey(): Promise {\n if (!this._x || !this._a || !this._A || !this._B) {\n throw \"not initialized\";\n }\n\n if (this._srp.isZeroWhenModN(this._B)) {\n throw \"Invalid B value\";\n }\n\n const u = await this._srp.u(this._A, this._B);\n const S = await this._srp.clientS(this._B, this._x, this._a, u);\n const K = await this._srp.K(S);\n return K;\n }\n}\n\nexport class Server {\n /** Server-side random initializer, available after calling [[initialize]] */\n get B() {\n return this._B ? i2b(this._B) : null;\n }\n\n /** Common session key, available after calling [[initialize]] and [[setA]] */\n get K() {\n return this._K ? i2b(this._K) : null;\n }\n\n /**\n * First value used to verify a successful key exchange, available after\n * calling [[initialize]] and [[setA]]\n */\n get M1() {\n return this._M1 ? i2b(this._M1) : null;\n }\n\n /**\n * Second value used to verify a successful key exchange, available after\n * calling [[initialize]] and [[setA]]\n */\n get M2() {\n return this._M2 ? i2b(this._M2) : null;\n }\n\n private _srp: Core;\n private _v?: BigInteger;\n private _b?: BigInteger;\n private _B?: BigInteger;\n private _A?: BigInteger;\n private _K?: BigInteger;\n private _M1?: BigInteger;\n private _M2?: BigInteger;\n\n constructor(length: SRPGroupLength = 4096) {\n this._srp = new Core(length);\n }\n\n /** Initialize server using the given verfifier `v`. Generates [[B]]. */\n async initialize(v: Uint8Array) {\n this._v = b2i(v);\n this._b = b2i(await getProvider().randomBytes(32));\n this._B = await this._srp.B(this._v, this._b);\n }\n\n /**\n * Apply [[Client.A]] value, calculating [[K]], [[M1]] and [[M2]].\n * Should only be called after [[initialize]] has been called.\n */\n async setA(A: Uint8Array) {\n if (!this._v || !this._b || !this._B) {\n throw \"not initialized\";\n }\n this._A = b2i(A);\n this._K = await this._getKey();\n this._M1 = await this._srp.M1(this._A, this._B, this._K);\n this._M2 = await this._srp.M2(this._A, this._M1, this._K);\n }\n\n private async _getKey() {\n if (!this._v || !this._b || !this._B || !this._A) {\n throw \"not initialized\";\n }\n\n if (this._srp.isZeroWhenModN(this._A)) {\n throw \"Invalid A value\";\n }\n\n const u = await this._srp.u(this._A, this._B);\n const S = this._srp.serverS(this._A, this._v, u, this._b);\n const K = await this._srp.K(S);\n return K;\n }\n}\n\n/**\n * Implements various formulas defined in the [SRP\n * specification](http://srp.stanford.edu/design.html), used by [[Client]] and\n * [[Server]] classes.\n */\nexport class Core {\n private _params: SRPParams;\n\n constructor(length: SRPGroupLength) {\n this._params = getParams(length);\n if (!this._params) {\n throw \"Invalid group length!\";\n }\n }\n\n /** Creates a hash of all arguments, concatenated */\n async H(...inp: BigInteger[]): Promise {\n const hash = await digest(this._params.hash, ...inp.map(i => i2b(i)));\n return b2i(hash);\n }\n\n /**\n * Calculates verifier `v` from secret `x` according to the formula\n * ```\n * v = g ^ x % N\n * ```\n */\n v(x: BigInteger): BigInteger {\n return this._params.g.modPow(x, this._params.N);\n }\n\n /** Calculates `A` from random value `a`, according to the formula\n * ```\n * A = g ^ a % N\n * ```\n */\n A(a: BigInteger) {\n return this._params.g.modPow(a, this._params.N);\n }\n\n /**\n * Calculates `B` from `v` and the random value `b` according to the formula\n * ```\n * B = (k * v + g ^ b % N) % N\n * ```\n */\n async B(v: BigInteger, b: BigInteger): Promise {\n const k = await this.k();\n return k\n .multiply(v)\n .add(this._params.g.modPow(b, this._params.N))\n .mod(this._params.N);\n }\n\n /**\n * Calculates `u` from `A` and `B` according to the formula\n * ```\n * u = H(A | B)\n * ```\n */\n async u(A: BigInteger, B: BigInteger): Promise {\n return await this.H(A, B);\n }\n\n /**\n * Calculates `S` from `B`, `x`, `a` and `u` according to the formula\n * ```\n * S = (B - k * (g ^ x % N)) ^ (a + u * x) % N\n * ```\n */\n async clientS(B: BigInteger, x: BigInteger, a: BigInteger, u: BigInteger): Promise {\n const k = await this.k();\n return B.subtract(k.multiply(this._params.g.modPow(x, this._params.N))).modPow(\n a.add(u.multiply(x)),\n this._params.N\n );\n }\n\n /**\n * Calculates `S` from `A`, `v`, `b` and `u` according to the formula\n * ```\n * S = (A * v ^ u % N) ^ b % N\n * ```\n */\n serverS(A: BigInteger, v: BigInteger, u: BigInteger, b: BigInteger) {\n return A.multiply(v.modPow(u, this._params.N)).modPow(b, this._params.N);\n }\n\n /**\n * Calculates the multiplier `k = H(N | g)` according to the SRP-6a specification\n */\n async k(): Promise {\n return this.H(this._params.N, this._params.g);\n }\n\n /**\n * Calculates the shared key `K = H(S)`\n */\n async K(S: BigInteger): Promise {\n return this.H(S);\n }\n\n /**\n * Calculates the first verification value `M1 = H(A | B | K)`\n */\n async M1(A: BigInteger, B: BigInteger, K: BigInteger): Promise {\n return await this.H(A, B, K);\n }\n\n /**\n * Calculates the second verification value `M2 = H(A | M1 | K)`\n */\n async M2(A: BigInteger, M1: BigInteger, K: BigInteger): Promise {\n return await this.H(A, M1, K);\n }\n\n /**\n * This is used to ensure that values are not zero when mod N.\n */\n isZeroWhenModN(n: BigInteger) {\n return n.mod(this._params.N).equals(BigInteger.ZERO);\n }\n}\n\ntype SRPGroupLength = 3072 | 4096 | 6144 | 8192;\n\ninterface SRPParams {\n length: SRPGroupLength;\n hash: \"SHA-1\" | \"SHA-256\";\n g: BigInteger;\n N: BigInteger;\n}\n\nfunction h2i(hex: string): BigInteger {\n return new BigInteger(hex.replace(\" \", \"\"), 16);\n}\n\nfunction getParams(length: SRPGroupLength): SRPParams {\n switch (length) {\n case 3072:\n return {\n length: 3072,\n hash: \"SHA-256\",\n g: h2i(\"05\"),\n N: h2i(\n \"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF\"\n )\n };\n case 4096:\n return {\n length: 4096,\n hash: \"SHA-256\",\n g: h2i(\"05\"),\n N: h2i(\n \"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34063199 FFFFFFFF FFFFFFFF\"\n )\n };\n case 6144:\n return {\n length: 6144,\n hash: \"SHA-256\",\n g: h2i(\"05\"),\n N: h2i(\n \"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E 6DCC4024 FFFFFFFF FFFFFFFF\"\n )\n };\n case 8192:\n return {\n length: 8192,\n hash: \"SHA-256\",\n g: h2i(\"13\"),\n N: h2i(\n \"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4 38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300 741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568 3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9 22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B 4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A 062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36 4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1 B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92 4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47 9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71 60C980DD 98EDD3DF FFFFFFFF FFFFFFFF\"\n )\n };\n\n default:\n throw \"invalid group length\";\n }\n}\n","import { Serializable, AsSerializable, AsDate, AsBytes } from \"./encoding\";\nimport { Server } from \"./server\";\nimport { DeviceInfo } from \"./platform\";\nimport { EventEmitter } from \"./event-target\";\nimport { wait } from \"./util\";\n\n/** Authentication data */\nexport class RequestAuthentication extends Serializable {\n /** The id of the [[Session]] used for authentication */\n session: string = \"\";\n /** A time stamp of the request/response time */\n\n @AsDate()\n time!: Date;\n\n /** The signature used to verify the authentiation */\n @AsBytes()\n signature!: Uint8Array;\n\n constructor(vals: Partial = {}) {\n super();\n Object.assign(this, vals);\n }\n}\n\n/** RPC request object */\nexport class Request extends Serializable {\n /** Name of the method call */\n method: string = \"\";\n /** Arguments for the method */\n\n params?: any[] = undefined;\n\n /** Data used to authenticate the request */\n @AsSerializable(RequestAuthentication)\n auth?: RequestAuthentication;\n\n /** Info about the device the request is coming from */\n @AsSerializable(DeviceInfo)\n device?: DeviceInfo;\n}\n\n/** RPC response object */\nexport class Response extends Serializable {\n /** The result of the RPC call */\n result: any = null;\n\n /** Error info, if an error occurred while processing the request */\n error?: Error = undefined;\n\n /** Data used to authenticate the response */\n @AsSerializable(RequestAuthentication)\n auth?: RequestAuthentication;\n}\n\n/** Error info */\nexport interface Error {\n /** Error code */\n code: number | string;\n /** Error message */\n message: string;\n}\n\n/** Generic interface for sending [[Request]]s */\nexport interface Sender {\n send(req: Request, progress?: RequestProgress): Promise;\n}\n\n/** Generic interface for receiving [[Request]]s and processing them into a [[Response]] */\nexport interface Receiver {\n listen(handler: (req: Request) => Promise): void;\n}\n\n/**\n * Stub implementation of the [[Sender]] interface, passing requests directly\n * into a [[Server]] instance. this is useful for testing, where client and\n * server instances are managed by the same process\n */\nexport class DirectSender implements Sender {\n constructor(private server: Server) {}\n\n async send(req: Request) {\n await wait(10);\n return this.server.handle(req);\n }\n}\n\ninterface Progress {\n loaded: number;\n total: number;\n}\n\nexport class RequestProgress extends EventEmitter {\n completed: Promise = new Promise((resolve, reject) => {\n this._resolveCompleted = resolve;\n this._rejectCompleted = reject;\n });\n\n get uploadProgress() {\n return this._uploadProgress;\n }\n\n set uploadProgress(progress: Progress) {\n this._uploadProgress = progress;\n this.dispatch(\"upload-progress\", progress);\n this.dispatch(\"progress\", this.progress);\n }\n\n get downloadProgress() {\n return this._downloadProgress;\n }\n\n set downloadProgress(progress: Progress) {\n this._downloadProgress = progress;\n this.dispatch(\"download-progress\", progress);\n this.dispatch(\"progress\", this.progress);\n }\n\n get progress() {\n return {\n loaded: this.uploadProgress.loaded + this.downloadProgress.loaded,\n total: this.uploadProgress.total + this.downloadProgress.total\n };\n }\n\n set error(error: Error | undefined) {\n this._error = error;\n if (error) {\n this.dispatch(\"error\", { error });\n this.uploadProgress = this.downloadProgress = { loaded: 0, total: 0 };\n this._rejectCompleted(error);\n }\n }\n\n get error() {\n return this._error;\n }\n\n private _uploadProgress: Progress = { loaded: 0, total: 0 };\n private _downloadProgress: Progress = { loaded: 0, total: 0 };\n\n private _error?: Error;\n\n private _resolveCompleted!: () => void;\n private _rejectCompleted!: (err: Error) => void;\n\n complete() {\n this._resolveCompleted();\n }\n}\n","import { getCryptoProvider as getProvider } from \"./platform\";\nimport { bytesToHex } from \"./encoding\";\n\n/** Generates a random UUID v4 */\nexport async function uuid(): Promise {\n const bytes = await getProvider().randomBytes(16);\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n // Canonical representation\n // XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n return [\n bytesToHex(bytes.slice(0, 4)),\n \"-\",\n bytesToHex(bytes.slice(4, 6)),\n \"-\",\n bytesToHex(bytes.slice(6, 8)),\n \"-\",\n bytesToHex(bytes.slice(8, 10)),\n \"-\",\n bytesToHex(bytes.slice(10, 16))\n ].join(\"\");\n}\n\n/** Caracters, by category */\nexport const chars = {\n numbers: \"0123456789\",\n lower: \"abcdefghijklmnopqrstuvwxyz\",\n upper: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\n other: \"/+()%\\\"=&-!:'*#?;,_.@`~$^[{]}\\\\|<>\"\n};\n\n/** Predefined char sets for generating randing strings */\nexport const charSets = {\n full: chars.numbers + chars.upper + chars.lower + chars.other,\n alphanum: chars.numbers + chars.upper + chars.lower,\n alpha: chars.lower + chars.upper,\n num: chars.numbers,\n hexa: chars.numbers + \"abcdef\"\n};\n\n/** Creates a random string with a given `length`, with characters chosen from a given `charSet` */\nexport async function randomString(length = 32, charSet = charSets.full) {\n const provider = getProvider();\n let str = \"\";\n while (str.length < length) {\n const [rnd] = await provider.randomBytes(1);\n // Prevent modulo bias by rejecting values larger than the highest muliple of `charSet.length`\n if (rnd > 255 - (256 % charSet.length)) {\n continue;\n }\n str += charSet[rnd % charSet.length];\n }\n return str;\n}\n\n/**\n * Generates a random number between `min` and `max`.\n * Taken from https://github.com/EFForg/OpenWireless/blob/master/app/js/diceware.js\n */\nexport async function randomNumber(min: number = 0, max: number = 10): Promise {\n if (max < min) {\n throw \"Upper bound must be greater than or equal to lower bound!\";\n }\n\n let rval = 0;\n const range = max - min + 1;\n const bitsNeeded = Math.ceil(Math.log2(range));\n if (bitsNeeded > 53) {\n throw new Error(\"We cannot generate numbers larger than 53 bits.\");\n }\n\n const bytesNeeded = Math.ceil(bitsNeeded / 8);\n const mask = Math.pow(2, bitsNeeded) - 1;\n\n // Fill a byte array with N random numbers\n const byteArray = await getProvider().randomBytes(bytesNeeded);\n\n let p = (bytesNeeded - 1) * 8;\n for (let i = 0; i < bytesNeeded; i++) {\n rval += byteArray[i] * Math.pow(2, p);\n p -= 8;\n }\n\n // Use & to apply the mask and reduce the number of recursive lookups\n // tslint:disable-next-line\n rval = rval & mask;\n\n if (rval >= range) {\n // Integer out of acceptable range\n return randomNumber(min, max);\n }\n\n // Return an integer that falls within the range\n return min + rval;\n}\n\n/**\n * \"Debounces\" a function, making sure it is only called once within a certain\n * time window\n */\nexport function debounce(fn: (...args: any[]) => any, delay: number) {\n let timeout: number;\n\n return function(...args: any[]) {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => fn(...args), delay);\n };\n}\n\n// export function throttle(fn: (...args: any[]) => any, delay: number) {\n// let throttling = false;\n// let lastCall = args: any[];\n//\n// return function(...args: any[]) {\n// if (!throttling) {\n// fn(...args);\n// throttling = true;\n// setTimeout(() => (throttling = false), delay);\n// }\n// };\n// }\n\nexport function throttle(fn: (...args: any[]) => any, delay: number) {\n let lastCall: any;\n let lastRan: number;\n return (...args: any[]) => {\n if (!lastRan) {\n fn(...args);\n lastRan = Date.now();\n } else {\n clearTimeout(lastCall);\n lastCall = setTimeout(() => {\n if (Date.now() - lastRan >= delay) {\n fn(...args);\n lastRan = Date.now();\n }\n }, delay - (Date.now() - lastRan));\n }\n };\n}\n\n/** Returns a promise that resolves after a given `delay`. */\nexport function wait(delay: number): Promise {\n return new Promise(resolve => setTimeout(resolve, delay));\n}\n\n/**\n * Resolves a given locale string to the approprivate available language\n */\nexport function resolveLanguage(locale: string, supportedLanguages: { [lang: string]: any }): string {\n const localeParts = locale.toLowerCase().split(\"-\");\n\n while (localeParts.length) {\n const l = localeParts.join(\"-\");\n if (supportedLanguages[l]) {\n return l;\n }\n\n localeParts.pop();\n }\n\n return Object.keys(supportedLanguages)[0];\n}\n\n/**\n * Applies a number of class `mixins` to a `baseClass`\n */\nexport function applyMixins(baseClass: any, ...mixins: ((cls: any) => any)[]): any {\n return mixins.reduce((cls, mixin) => mixin(cls), baseClass);\n}\n\n/**\n * Escapes all regex special characters within a given string.\n */\nexport function escapeRegex(str: string) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { SharedContainer } from \"./container\";\nimport { Storable } from \"./storage\";\nimport { VaultItemCollection } from \"./collection\";\nimport { Account, AccountID } from \"./account\";\nimport { OrgID } from \"./org\";\nimport { Exclude, AsDate } from \"./encoding\";\nimport { Err } from \"./error\";\n\n/** Unique identifier for [[Vault]] objects */\nexport type VaultID = string;\n\n/**\n * Container for securely storing a collection of [[VaultItem]]s. Vaults can be owned by a single\n * user (\"private\" vaults) or shared between multiple users (\"shared\" vaults). Shared vaults are\n * provisioned and managed through [[Org]]s.\n */\nexport class Vault extends SharedContainer implements Storable {\n /** unique identifier */\n id: VaultID = \"\";\n\n /** The [[Org]] this vault belongs to (if a shared vault) */\n org?: { id: OrgID; name: string; revision?: string } = undefined;\n\n /** Vault name */\n name = \"\";\n\n /** The vault owner (the [[Account]] that created this vault) */\n owner: AccountID = \"\";\n\n /** Time of creation */\n @AsDate()\n created = new Date(0);\n\n /** Time of last update */\n @AsDate()\n updated = new Date(0);\n\n /**\n * Revision id used for ensuring continuity when synchronizing the vault\n * object between client and server\n */\n revision: string = \"\";\n\n /**\n * A collection [[VaultItem]]s representing the senstive data store in this vault\n *\n * @secret\n *\n * **IMPORTANT**: This property is considered **secret**\n * and should never stored or transmitted in plain text\n */\n @Exclude()\n items = new VaultItemCollection();\n\n @Exclude()\n error?: Err;\n\n /**\n * Unlocks the vault with the given `account`, decrypting the data stored in the vault\n * and populating the [[items]] property. For this to be successful, the `account` object\n * needs to be unlocked and the account must have access to this vault.\n */\n async unlock(account: Account) {\n if (!this.accessors.length) {\n await this.updateAccessors([account]);\n await this.commit();\n } else {\n await super.unlock(account);\n this.items.fromBytes(await this.getData());\n }\n }\n\n async lock() {\n await super.lock();\n this.items = new VaultItemCollection();\n }\n\n /**\n * Commit changes to `items` by reencrypting the data.\n */\n async commit() {\n await this.setData(this.items.toBytes());\n }\n\n /**\n * Merges in changes from another `vault`. This requires both vaults to be unlocked.\n *\n * @returns `true` if there have been any \"forward changes\", i.e. if there\n * have been any changes in this vault that may need to be applied to other\n * instances. Specifically, this can be used during synchronization with a [[Server]]\n * to determine whether an update needs to be pushed back.\n */\n merge(vault: Vault) {\n this.items.merge(vault.items);\n this.name = vault.name;\n this.revision = vault.revision;\n this.org = vault.org;\n this.updated = vault.updated;\n }\n\n toString() {\n return this.org ? `${this.org.name} / ${this.name}` : this.name;\n }\n\n clone() {\n const clone = super.clone();\n clone.items = this.items.clone();\n return clone;\n }\n}\n","export const countries = [\n { code: \"AF\", name: \"Afghanistan\" },\n { code: \"AX\", name: \"Åland Islands\" },\n { code: \"AL\", name: \"Albania\" },\n { code: \"DZ\", name: \"Algeria\" },\n { code: \"AD\", name: \"Andorra\" },\n { code: \"AO\", name: \"Angola\" },\n { code: \"AI\", name: \"Anguilla\" },\n { code: \"AQ\", name: \"Antarctica\" },\n { code: \"AG\", name: \"Antigua & Barbuda\" },\n { code: \"AR\", name: \"Argentina\" },\n { code: \"AM\", name: \"Armenia\" },\n { code: \"AW\", name: \"Aruba\" },\n { code: \"AC\", name: \"Ascension Island\" },\n { code: \"AU\", name: \"Australia\" },\n { code: \"AT\", name: \"Austria\" },\n { code: \"AZ\", name: \"Azerbaijan\" },\n { code: \"BS\", name: \"Bahamas\" },\n { code: \"BH\", name: \"Bahrain\" },\n { code: \"BD\", name: \"Bangladesh\" },\n { code: \"BB\", name: \"Barbados\" },\n { code: \"BY\", name: \"Belarus\" },\n { code: \"BE\", name: \"Belgium\" },\n { code: \"BZ\", name: \"Belize\" },\n { code: \"BJ\", name: \"Benin\" },\n { code: \"BM\", name: \"Bermuda\" },\n { code: \"BT\", name: \"Bhutan\" },\n { code: \"BO\", name: \"Bolivia\" },\n { code: \"BA\", name: \"Bosnia & Herzegovina\" },\n { code: \"BW\", name: \"Botswana\" },\n { code: \"BV\", name: \"Bouvet Island\" },\n { code: \"BR\", name: \"Brazil\" },\n { code: \"IO\", name: \"British Indian Ocean Territory\" },\n { code: \"VG\", name: \"British Virgin Islands\" },\n { code: \"BN\", name: \"Brunei\" },\n { code: \"BG\", name: \"Bulgaria\" },\n { code: \"BF\", name: \"Burkina Faso\" },\n { code: \"BI\", name: \"Burundi\" },\n { code: \"KH\", name: \"Cambodia\" },\n { code: \"CM\", name: \"Cameroon\" },\n { code: \"CA\", name: \"Canada\" },\n { code: \"CV\", name: \"Cape Verde\" },\n { code: \"BQ\", name: \"Caribbean Netherlands\" },\n { code: \"KY\", name: \"Cayman Islands\" },\n { code: \"CF\", name: \"Central African Republic\" },\n { code: \"TD\", name: \"Chad\" },\n { code: \"CL\", name: \"Chile\" },\n { code: \"CN\", name: \"China\" },\n { code: \"CO\", name: \"Colombia\" },\n { code: \"KM\", name: \"Comoros\" },\n { code: \"CG\", name: \"Congo - Brazzaville\" },\n { code: \"CD\", name: \"Congo - Kinshasa\" },\n { code: \"CK\", name: \"Cook Islands\" },\n { code: \"CR\", name: \"Costa Rica\" },\n { code: \"CI\", name: \"Côte d’Ivoire\" },\n { code: \"HR\", name: \"Croatia\" },\n { code: \"CW\", name: \"Curaçao\" },\n { code: \"CY\", name: \"Cyprus\" },\n { code: \"CZ\", name: \"Czechia\" },\n { code: \"DK\", name: \"Denmark\" },\n { code: \"DJ\", name: \"Djibouti\" },\n { code: \"DM\", name: \"Dominica\" },\n { code: \"DO\", name: \"Dominican Republic\" },\n { code: \"EC\", name: \"Ecuador\" },\n { code: \"EG\", name: \"Egypt\" },\n { code: \"SV\", name: \"El Salvador\" },\n { code: \"GQ\", name: \"Equatorial Guinea\" },\n { code: \"ER\", name: \"Eritrea\" },\n { code: \"EE\", name: \"Estonia\" },\n { code: \"ET\", name: \"Ethiopia\" },\n { code: \"FK\", name: \"Falkland Islands\" },\n { code: \"FO\", name: \"Faroe Islands\" },\n { code: \"FJ\", name: \"Fiji\" },\n { code: \"FI\", name: \"Finland\" },\n { code: \"FR\", name: \"France\" },\n { code: \"GF\", name: \"French Guiana\" },\n { code: \"PF\", name: \"French Polynesia\" },\n { code: \"TF\", name: \"French Southern Territories\" },\n { code: \"GA\", name: \"Gabon\" },\n { code: \"GM\", name: \"Gambia\" },\n { code: \"GE\", name: \"Georgia\" },\n { code: \"DE\", name: \"Germany\" },\n { code: \"GH\", name: \"Ghana\" },\n { code: \"GI\", name: \"Gibraltar\" },\n { code: \"GR\", name: \"Greece\" },\n { code: \"GL\", name: \"Greenland\" },\n { code: \"GD\", name: \"Grenada\" },\n { code: \"GP\", name: \"Guadeloupe\" },\n { code: \"GU\", name: \"Guam\" },\n { code: \"GT\", name: \"Guatemala\" },\n { code: \"GG\", name: \"Guernsey\" },\n { code: \"GN\", name: \"Guinea\" },\n { code: \"GW\", name: \"Guinea-Bissau\" },\n { code: \"GY\", name: \"Guyana\" },\n { code: \"HT\", name: \"Haiti\" },\n { code: \"HN\", name: \"Honduras\" },\n { code: \"HK\", name: \"Hong Kong SAR China\" },\n { code: \"HU\", name: \"Hungary\" },\n { code: \"IS\", name: \"Iceland\" },\n { code: \"IN\", name: \"India\" },\n { code: \"ID\", name: \"Indonesia\" },\n { code: \"IR\", name: \"Iran\" },\n { code: \"IQ\", name: \"Iraq\" },\n { code: \"IE\", name: \"Ireland\" },\n { code: \"IM\", name: \"Isle of Man\" },\n { code: \"IL\", name: \"Israel\" },\n { code: \"IT\", name: \"Italy\" },\n { code: \"JM\", name: \"Jamaica\" },\n { code: \"JP\", name: \"Japan\" },\n { code: \"JE\", name: \"Jersey\" },\n { code: \"JO\", name: \"Jordan\" },\n { code: \"KZ\", name: \"Kazakhstan\" },\n { code: \"KE\", name: \"Kenya\" },\n { code: \"KI\", name: \"Kiribati\" },\n { code: \"XK\", name: \"Kosovo\" },\n { code: \"KW\", name: \"Kuwait\" },\n { code: \"KG\", name: \"Kyrgyzstan\" },\n { code: \"LA\", name: \"Laos\" },\n { code: \"LV\", name: \"Latvia\" },\n { code: \"LB\", name: \"Lebanon\" },\n { code: \"LS\", name: \"Lesotho\" },\n { code: \"LR\", name: \"Liberia\" },\n { code: \"LY\", name: \"Libya\" },\n { code: \"LI\", name: \"Liechtenstein\" },\n { code: \"LT\", name: \"Lithuania\" },\n { code: \"LU\", name: \"Luxembourg\" },\n { code: \"MO\", name: \"Macau SAR China\" },\n { code: \"MK\", name: \"Macedonia\" },\n { code: \"MG\", name: \"Madagascar\" },\n { code: \"MW\", name: \"Malawi\" },\n { code: \"MY\", name: \"Malaysia\" },\n { code: \"MV\", name: \"Maldives\" },\n { code: \"ML\", name: \"Mali\" },\n { code: \"MT\", name: \"Malta\" },\n { code: \"MQ\", name: \"Martinique\" },\n { code: \"MR\", name: \"Mauritania\" },\n { code: \"MU\", name: \"Mauritius\" },\n { code: \"YT\", name: \"Mayotte\" },\n { code: \"MX\", name: \"Mexico\" },\n { code: \"MD\", name: \"Moldova\" },\n { code: \"MC\", name: \"Monaco\" },\n { code: \"MN\", name: \"Mongolia\" },\n { code: \"ME\", name: \"Montenegro\" },\n { code: \"MS\", name: \"Montserrat\" },\n { code: \"MA\", name: \"Morocco\" },\n { code: \"MZ\", name: \"Mozambique\" },\n { code: \"MM\", name: \"Myanmar (Burma)\" },\n { code: \"NA\", name: \"Namibia\" },\n { code: \"NR\", name: \"Nauru\" },\n { code: \"NP\", name: \"Nepal\" },\n { code: \"NL\", name: \"Netherlands\" },\n { code: \"NC\", name: \"New Caledonia\" },\n { code: \"NZ\", name: \"New Zealand\" },\n { code: \"NI\", name: \"Nicaragua\" },\n { code: \"NE\", name: \"Niger\" },\n { code: \"NG\", name: \"Nigeria\" },\n { code: \"NU\", name: \"Niue\" },\n { code: \"NO\", name: \"Norway\" },\n { code: \"OM\", name: \"Oman\" },\n { code: \"PK\", name: \"Pakistan\" },\n { code: \"PS\", name: \"Palestinian Territories\" },\n { code: \"PA\", name: \"Panama\" },\n { code: \"PG\", name: \"Papua New Guinea\" },\n { code: \"PY\", name: \"Paraguay\" },\n { code: \"PE\", name: \"Peru\" },\n { code: \"PH\", name: \"Philippines\" },\n { code: \"PN\", name: \"Pitcairn Islands\" },\n { code: \"PL\", name: \"Poland\" },\n { code: \"PT\", name: \"Portugal\" },\n { code: \"PR\", name: \"Puerto Rico\" },\n { code: \"QA\", name: \"Qatar\" },\n { code: \"RE\", name: \"Réunion\" },\n { code: \"RO\", name: \"Romania\" },\n { code: \"RU\", name: \"Russia\" },\n { code: \"RW\", name: \"Rwanda\" },\n { code: \"WS\", name: \"Samoa\" },\n { code: \"SM\", name: \"San Marino\" },\n { code: \"ST\", name: \"São Tomé & Príncipe\" },\n { code: \"SA\", name: \"Saudi Arabia\" },\n { code: \"SN\", name: \"Senegal\" },\n { code: \"RS\", name: \"Serbia\" },\n { code: \"SC\", name: \"Seychelles\" },\n { code: \"SL\", name: \"Sierra Leone\" },\n { code: \"SG\", name: \"Singapore\" },\n { code: \"SX\", name: \"Sint Maarten\" },\n { code: \"SK\", name: \"Slovakia\" },\n { code: \"SI\", name: \"Slovenia\" },\n { code: \"SB\", name: \"Solomon Islands\" },\n { code: \"SO\", name: \"Somalia\" },\n { code: \"ZA\", name: \"South Africa\" },\n { code: \"GS\", name: \"South Georgia & South Sandwich Islands\" },\n { code: \"KR\", name: \"South Korea\" },\n { code: \"SS\", name: \"South Sudan\" },\n { code: \"ES\", name: \"Spain\" },\n { code: \"LK\", name: \"Sri Lanka\" },\n { code: \"BL\", name: \"St. Barthélemy\" },\n { code: \"SH\", name: \"St. Helena\" },\n { code: \"KN\", name: \"St. Kitts & Nevis\" },\n { code: \"LC\", name: \"St. Lucia\" },\n { code: \"MF\", name: \"St. Martin\" },\n { code: \"PM\", name: \"St. Pierre & Miquelon\" },\n { code: \"VC\", name: \"St. Vincent & Grenadines\" },\n { code: \"SR\", name: \"Suriname\" },\n { code: \"SJ\", name: \"Svalbard & Jan Mayen\" },\n { code: \"SZ\", name: \"Swaziland\" },\n { code: \"SE\", name: \"Sweden\" },\n { code: \"CH\", name: \"Switzerland\" },\n { code: \"TW\", name: \"Taiwan\" },\n { code: \"TJ\", name: \"Tajikistan\" },\n { code: \"TZ\", name: \"Tanzania\" },\n { code: \"TH\", name: \"Thailand\" },\n { code: \"TL\", name: \"Timor-Leste\" },\n { code: \"TG\", name: \"Togo\" },\n { code: \"TK\", name: \"Tokelau\" },\n { code: \"TO\", name: \"Tonga\" },\n { code: \"TT\", name: \"Trinidad & Tobago\" },\n { code: \"TA\", name: \"Tristan da Cunha\" },\n { code: \"TN\", name: \"Tunisia\" },\n { code: \"TR\", name: \"Turkey\" },\n { code: \"TM\", name: \"Turkmenistan\" },\n { code: \"TC\", name: \"Turks & Caicos Islands\" },\n { code: \"TV\", name: \"Tuvalu\" },\n { code: \"UG\", name: \"Uganda\" },\n { code: \"UA\", name: \"Ukraine\" },\n { code: \"AE\", name: \"United Arab Emirates\" },\n { code: \"GB\", name: \"United Kingdom\" },\n { code: \"US\", name: \"United States\" },\n { code: \"UY\", name: \"Uruguay\" },\n { code: \"UZ\", name: \"Uzbekistan\" },\n { code: \"VU\", name: \"Vanuatu\" },\n { code: \"VA\", name: \"Vatican City\" },\n { code: \"VE\", name: \"Venezuela\" },\n { code: \"VN\", name: \"Vietnam\" },\n { code: \"WF\", name: \"Wallis & Futuna\" },\n { code: \"EH\", name: \"Western Sahara\" },\n { code: \"YE\", name: \"Yemen\" },\n { code: \"ZM\", name: \"Zambia\" },\n { code: \"ZW\", name: \"Zimbabwe\" }\n];\n","const loadWordListPromises = new Map>();\n\nexport async function getWordList(lang: string): Promise {\n lang = lang.toLowerCase();\n\n if (loadWordListPromises.has(lang)) {\n return loadWordListPromises.get(lang)!;\n }\n\n const promise = (async () => {\n try {\n const { default: words } = await import(`../res/wordlists/${lang}.json`);\n\n return words;\n } catch (e) {\n const dashIndex = lang.lastIndexOf(\"-\");\n if (dashIndex !== -1) {\n return getWordList(lang.substring(0, dashIndex));\n } else {\n return [];\n }\n }\n })();\n\n loadWordListPromises.set(lang, promise);\n\n return promise;\n}\n\nexport const AVAILABLE_LANGUAGES = [\n { value: \"en\", toString: () => \"English\" },\n { value: \"de\", toString: () => \"Deutsch\" },\n { value: \"es\", toString: () => \"Español\" },\n { value: \"pt\", toString: () => \"Português\" },\n { value: \"fr\", toString: () => \"Français\" }\n];\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/cypress/fixtures/v3-client/c6d06da41ec4b66d90868ce6bf337cbd.ttf b/cypress/fixtures/v3-client/c6d06da41ec4b66d90868ce6bf337cbd.ttf deleted file mode 100644 index 1e3b1766b29fd67fec5c21b5bee0a7755138d8fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108828 zcmdSCd3;<~kuQGFy}j>!d(|%Ws(s&ONiEBgY)Q7f$d(k_*pAn%b{4WgVnP-m3ouC_ z$peNZWPmWtdkNqyP9O={z=TI82_%rP2403?Lg0lN2u7{zOgkUqm|RKq{R093eYphHcoB%*q-YKCANR9Bz68} zY|GZw*Q82^B=)H_lH~f~)Rv~!vwri*gA!{yg7&-jp10>n^Enf^-uA2{*<5=sxwx{o z)pSf^>+ZnyI}RK$A0goZ%eH5 z&yr*bp10?+Bc_Wyo%sC{+E<>x=e+%i)X*M@jW^>R4<9*v(ZvUz{oHPeP5g%>MPEO1 z;r=5%of{5IZ0#S>{_~PU+PpBy&XFIJ6v-=vq#`LU)kqyukJK-%m5MUq;eo#1?#}kw z>O^I6B&_-zCMG$W>zKdFABl(BLipDa?`X5~&vYo>VL<7c-U8n{wC{QwE8W=D#?HyU z_Jdn`dT;IP>zlo`ue|J%TYGzF`|vSWUOrcL>#etz&0TWqz`(8B2g>Bf{(7VG?!L0B zva+hJJIX66Dz=tamJdYw$^)&znz4PI`^IW&wwKkGmDNg;ER`*sl#k0#OHrvrI*@Uc zFq7h85|hU#?s0CM%>=;^Ofsldtf2yzcpHPq2g1!h#rw@;{^)IxIT(U z|E0qfX23_}k%jqhDqNPW{r`=lZqM zeHP=s!hTs-fZGb-pU~eg|Fi)99s~ZI0Y|^UKRVtyzLufK3r2hDk3J4X{z(B`$Gal` ztN?zXH{=X^UT|2y8>AT>+>m~l2Uiz)1pfpv{>lOUQ|k<3RWizF)+`G90Hl}><* zD<>qgneCDoD`Gk)FV{FsjmrueXI5-i@X)!rj6-cm$HK`HD2%RTFUmg zYOz`@pH3HU$Lgk%d1@Ma!e9Mn-<(YA>4u9(@%R^>r1s6*YCW5FWN=g+~e^ zgyaWd5k2N;?CfYy#g(Pvq@uW@ueP?Yq8I|@b0sCA5dM97iC}Rxm)G|6)Rs59=C4(3 zWuZ_R{hR+5kZ54>t5UVpE_F%IXM#n{qQscl(v=3j&4f*p#)Oy@is>3ju`!ETu^g1F zK&cfdHJcZs^zB;a@cMQwIdYTY#b)r8*$NCV>OdZb)tZ{lj+*wGwx)(S;n;pE97nnY zqOI1`$98$~UXRxoDLcz`I#~BjIitQ}S97R%IqVy9<)|SKUe@G+YvC`-ebCS~QoVHf zv3l?@0};|-#I$6VEH<-czhsk`)yDRNqm`YQ+`$Puvs$HHgpClfWZm1e+zH7Onvi6< zQl6a4sFGAyi}zJ0suG>CK)VBTJwbShSH)5V+O4gMb7#CNlKTQ(r`#C~s@d=RLZ*uB zU1$1=y+JFx-dn|4+1wqsZ>fx9huf3Gs$cmQq*LYP5XfgwiEI&IALLC zv&2U!O_r6FCCcK7IA)g>JR$Lsk-qk0wrSHX+184g7LQB(ufI)B48P~dUjvay;1B0r z*4L4J?3+`YKKo5pId$jvzQ@j(UA=Q}Sd}kO!@FmDHV4Zy{g=%@-9L2o0*o-Jf8o#a zW%75VwA7htgZ+UHnvQ~tWs`CRFfQ%FNVxnq@1kConaT7^ODXDMiaKcGa)28WysNQv zDix1u;y~wHizUv=Z<(69W#90n^**1|Z-j#PsmwadHanw-CkMk40?m!>N;SV_mpF~lCTR)Bg!p}#qgI1&PO)LN48G-@-Z7T zGvdn<@MVt#32nDIkGh!CVRt&NkQhd$Fo<5e-MUM%S}|USgO9v&!o(Cs-UUn)$>7w{ zCHF$Wm@NvXy2-4V@F>ZQhb{Xgu)qGGxl9;cTqms^86NCU)mA0q;Y2L#ww7^5hEB3t zHOUHlO_Q^cFef_U7TnO))hI*!u8em1kk40rc);ZHRMZW0Cn{}rm&2@-l$DnGyv~@( z=4Q6Jt43BJ$jyZGWSx>w;<03-OL1H6Xs`O+9=p>vY}@gvgUb+#tb_gq;2bpaN^{b; zjzyVO(Xl=Z)UazL$u3zKOu+xfQ#{3HHCt`4J0N_`7Ccn4+E#d`WU=UvoXZsZe7-r~?A9$)>&Mrw&InqR zrYgOlh9vA{or|q1IQ+kbI_!Fj-EH0L3wT1&cfa&^P)h!@%VxKp>&KMwZJYo2-$b`% z=GKb^bL$F7eKF^r=W|QulI;tSY#s>k`b-TZ85du{2{Y_@w$sEI3$aO`SCWFNH{=VU zp{v7U4b`>g%dvR8tJ3eQiu=!p2akX0@ozFU`@7qOw7UQ9yB`>3C9HVOb>cuVazJScp$xF!#vg$k0xlN z5EIdKG?k23l$93awooDtWfI93xt#tGyIl54)Yp&@!Et5&_9R~Fi-Y( zx8LOt1pIg1E8`-@=PCx3?0YYEsV&7 z>lnsG<2@nUH27=*{8=3iXTtsRe`@XH><99z{Juv`m*bOh+F`W{iZ*5Hfj7k@EBm2_ zGztP+=A9(!LtNBXO665hv>hbsHR9>YG^Bs=>tBeD>=Ld$?`3`b^GP9VfWJg=8W&^_jcZu?>@nEVhP-cs zAHnHzI5EbYoVV?iY_{Npo4H)lPMEK-FA61nMp`7jE z&W^Z{ED4V$%JSX*X)*|wl4A`azJ58$zHSMPXkKx= zf(}JskY|roF}qop>8oMEG01b~XNrp{2QkaNK96_5WOgvS)oec~x!tavkmbP%mHB+8 zola&lg(e{Ft(IL7!bKK{^eOEj4!hOvfX!@$JhMTOE_tS8cdYnG5L18RT&A`dF0A66 z#XGjoZQZhY((mG{aLAt1QP*qVaetKyy8n7R#7OnDnbI>0z&stp9sy z#C#jWW}j1atF2X4t*YDa@|r@M+MoOzDW}-$Y8^J0$6s1hROo@&!XSQXD|6>#Ph5xz-U}yq20o>%~|)q=8Hy?y|{}4fc&h z22S2;3Kpxp6Ba6#NH&}9VX5I#JCUrkL*5j)Lb|X_;){u8gbJ;f43~&p1%HSqR?|LI zoqc_IS)vB3s%zq9YB}5?sx8ph*csDhh~IC>`7*PqrV{RuoV2HPq`=?Hgg-vklX3uK zEs+ij4`|U+)ntbFsDv3P+@LEoC?h*@g=@GO&J8zSSRxgZRWq;f$4u<7!vec zuD~8*E&TKQp@2COkS|ulv@Cp+{$zg)(pXKYYmTDq;rI-nVl6+u_Y&mLW770!l zGhg(P6AU)4$;8(fa511mO;SUQmQ>X?YcW|M!Z!u^PvU8LGry}tH&5gX1Kwcug*|88 zv1#LN`$sRU@%vmZU;A{|rSE(Hl{+VIAp_+hc3Abj6^&Z`!EJY5aQIFvwEU_kH-tigKsb9wI1u39*cZY9`Kd@?{(3%1%Co+zX_gMUnNyOPQ{E4sktIB#z=Wul$ z+}n14zOzoMa`um(#rWKVVqy zFDxwl0`PJ^w*>r08vIXy+w_eW zwD!M54=eIU`ZEpwD&S=b&2sVlR|pO|ITr?{AK|?TsXCLy>Je@O=sN|AlcP{rHRD0<_qI9wY{@TNO3_KLxnvG4Q8{FOTRiL6S3S*Fnd|B6#B~QH3j;b61{$# zS*M;SsMxB@gr-`cF_h!|dS71_eO>s^g}0hdIZ?4=r&$J%{3qTz#WA{<^UjNG z2geY2O5TmPR!Uv>SA?w!WCi?LcKEa06hjM7U;!t*sd>Liz}=TjCgX%KE&Rvyxvj}G z*2xiRWlY{3@wz?P8w67a!fe0O>kYfJ-(Xu?e4dDljb(qBC)s|%`kfJk0<*u${*cdE zNPOyHOxn+T{tSCg^c>hx0avApOerA17v8m#dJTjDph~`Y(qs+m>r29yZkwDRq291z zu6l0``Q=Nf2lHQ6{eG3NP2N(R{Ml(~^Ta(>Ku6F7L>%%^m@(X1RC%0Fz`x0E6_OCxCalIJ0e^;lSHLxFb2#SyR_WW)nXo?@yXQ>J z{)B~`f9DDP&V_OLDdUN8woxW(Au_C_G}${_aNo0ZALcIplPhpvO6tnACrSbc!qfC+ zib)|?vNnAy;2MI#^DeZ8&mVtNQZiYcY$prM@ZNX$_0V(|X<9HsNMDgz{Z+D){PVZ^ zBh3znM-6NW2ZEu0aN67f^hO*R+BB2R_2X z_m}$|3iVSrDwrZEOgd_YGh`W~V(C@Qs91VI7!_n=#-u9Dy(EngYE_?h3ItYK(SOk> zBY{9C%!*e+K~+_M}d@xVdfdK{Xs!*+O=ASsD9e)t`&cscordhtnqk(2UG7ym?_SHi5$hw?$@ z1H|A+L&AW@*v!IR#z&JbkSr0#ZKcbCu$4U7Js}Jz6bO3Qr$gX9VJrFNy7}Mf0>wZ7 z16kFzr}7-9(nT~5X)pP&gjSVr;xmN9;s3WT3)lT$`3aE-~a7{$x7VtO%(Gb8CEGaTDnRglS?7YjFyekDaYKxPk zlt`xA`Qk({4*Vsw4B#52V|g@h*;XDc38>{A9ohW?*~nYQw8%{Lc~z*K-T{Z4 zT7r0i;c?}|2F6GN2+!eh<#j^>>d*A8xW~aM*$bhdy`(pX6mQ8MYwDL|)717q!e;js4IZL{I%)e5}jh_=WsF z7`UOF6T*$g7s@873?Atu#lF)f+NEv>Ja zDU*R;mgOL=rMZ1r*kmr_DK9UtDX*@@@Ikez-RWns%6V)iUoi~+I`ifY z8*bTG(pV4IhN2`?|LDMajpgLMpF|XFRxqB)RMXQKDeB)~o&R6UbKgf6aUXHbCSX#) zPspJ>t|aag@THg(aE?g>^EC4W{N)ue|HA@!j_ZF`04KX#a1n8dF?;xmg5dCK5u8>O z_#`gM=MC`lGA(HYc`Z5h2RRqT;qz$Ew7^i{npY3X!7+j`&n_5e5Sri?E%utIP6d;J zI8W>m89SQYD(wGUIFuxYH9>UMWCr_Kyew2=vf5qVM7n*ba@U6^h5UH;+1Y!qJR(Gh ze^pt`C41~XJ1E@{ljrU{SICp=k5xQ(haf3*QUAhA==;A(aj8yflg2Y+#o*VL=2X&T zHrWvSRmS7Yx7D}S#OvY(jF~nJAl>nk%l(idj0-`E z`lngAO}?%dEV^|~u`A#XSWCP5Fs$j3Vkhh$OKEm^gq60gK5`}7dF4p5uIK zzs4FuDzX@wn?AM+1FUKYsBVX|B|ARBUMs%+#_UgSzv*KW*`gB8TNo>!y`NabyCk`Y z=LD}5@LV1TaQG>BrC57HT-IBXjN-f^>%P*(vPo~LOEHcAh^ruU{{#NRG8mSRst156y37n-A`{N-lm}GqQ5wFUNwzN_(psLHS zDWU&*@WC(1)oL)6y@##hR{s-hV=Ac5zx1JNZv5bfZg}ACyYE+hG0g)S^Qmj(o?C9X z@fMPPWRK0Frz%W^%Y^w^Y{4XeYUVjId687)yJ%L~N-fH0ZL`uvN|%|-1cCtsI$=!) zi||fAh4R9>BSWmA5zNHs0&ob$<9>2^zJB<zL&HVMUk_wsF6FS;QN0f1tR#`6%Hz68Q5)m+v{Fs5*Gz z0^7W4eu#fK5J;`-4mmi*C4OTskTh_ZP~GDdi$Y~p-U!h4Jl6u$y94s_s8ps zJ%QQ{gR6G7)m2m82{Nok20A)|;pF&0-x;lhbv_!7^{;4H#|nQ5JPzN)^BAL5ex7Xy zKk?XBneZ(ve!@$dZ-K*2rNApaIWBWJf5LaU#Mh!@9HWCAqchT%j+yeJ_&tc>+gwh> zzmUmfv*#skxm=E2$k)Q0wA-a!6w6AZZE=rsZ8+>rCZG}88Q+?HGamNx4py;p08JKs( z|AMZH{0#fwc^pIjWx+|$>+P|E$ZvnbXb(7FlMDXfaF|g1K5zxexl814OMTKOkM+T` zq)WLJtVgI#85xT(B2CC+F`M-iK3Z*Bh#QOr`RTOg^6_*U3Rj3TnM|~|CBsRZwNwO8 zpn&w0y|73sAhimm1iK<gu&q z8^?Ac+N6d*aLw6QbTqO(+t*;m)_Q_&k7~CB1EZPug*@KiP=D{x&OO=PBw5*A?|c7& zna<5n{bId!H>gwr+h{Pe3V0=3<0$Y-$%>?;O_(>7Z%(l%eSuY33EZVBlkpgCEJq?> z%FaDm)LqiDd_+||*;6-K;l@%syQ;$BHum^!8z*mk*RGo;BVqPi$NLX=&vyGL(X-*o zu`Azg$*!_odO-fp%$tD6>UeUi&WF46ZxAK1CJS&V%s}-x${GP7dhWB~p z%NQ(r4`&H1k`%;G906=Qa-X%3ospQPvzE?tdX%_I?x&$#Ncm|O!mA!R;)loah&D|5 zF&dc2PD3~w98^JxYkwpt=>Sd(t{Wai50I_K9>XW$V35 z%1F5)v25FEXOwhRm}u3wIMGUz#`$*?2w{rsbxQ4of^Z_4aOe|{2zMHJvw8Fu2nnAe zhst3oK+pV_%j|W_Wln8#x@FECgek~G;@X%bF!c;!ieqr30Di)N&lbR+B{(p<8MejM z+;3ZzDJRC~ffEI8Gc1jjNwmrNVDsaW+{V=0=fn#?{|JeW{b!!JF9MV7qu1O1;U@MW zqHy+tgNF_sWFO_gerUraCvbc4^oY2e_;`8eP>CLAd6Sl~l%&wU;QCr<`GxX(kwjqtJpH!kS1 zFTsL|N^9?nm?`H`Td28cYQuPCEVoF`!9+$vev`SmW7ylV)6rwMG!( z+!Jv6icHyGU=yb&YRUdmDfUI3mW$ie|EeS6^}BxjBbOh)e)UGP#~1dnc=jirh}Y|24Xm8v^xo`$u%I{M^Ek4<%s!94 zTDbM}B)m-P?vHx06T_e;XD_Zz7O@avp->RnmfFIoK`;-v|``lv|0>*u>elA678QW zfYVw-z@InZq;H=z;3o_?tjfIizOVxPCk1eli{kmO6u`+3D&Q{@oaPZs?iT3(5-FL9 zVOq zkpFTIf6g?XPu>8^;fYIoA;-j=+ksD6>Rot?eTTh?HAk!Tm1EfQXVFDoHSI5hdltz7 zP`xrXXex?%7dd7tw5@@#BcGO}IxR`*)^tmKEoCFb;wiEwVGiiA z`VM2AgQXjfCTPkCHUX`4I$&B0WyQXOm}@w&p{;4EvHPkE!!2EFMoXM7pFa?vt1nrv z&hAL})Uh`o&HkPokj-^XsWmlS{Uueax|2x4gfk`>$&PNyl)?9wZUYTD?qtfI{vF5Z z!|Y3(h64UW1O8Y(T&XnRZyE3r_8nPoPubi5#Gkj)eSb0T1MQS5<9R0w;JNqwH6PCR zoQVEDx&r)>92|KTG2{932Auj!dspZ=x&G$ehkhlE`?AJ;Z?WIx^>-l;{vD-OZx1JX zJ{~EWEBgCX0sLVD{$K(85d(hQfTO?Qas4?Qzsu0?A)`I;YK%{jpDcjCXgufX0{A~0 z@Fxh)=hh&53-4WpY}uL2w4d2+J|^2?>0%E#T<}NH$SO;;1sVP_#YTIe_y&oJ32e=< z^Pn0s53E)_tFFJle{KI*vL=mv5w%Ibb8*r*<<~7Y9fS_!^P!cdjaA!DpUR&cKegJO z-c*A2)w9Am;tE)`Npip2ITkAqmj26nb!I0f%TesFho#n(?8WA8F=09f_=K@Kv>Aih zLr(MEEo%j!IcJbTA34|6ywCcM}|B%HgIX5AU__dEp~Y)dkK z&jZj6xCxT$*2QAs@Ve=BTQ*F_*2cy%1FL$wI+_})Q{k#`Wjaw)=_7BB(C2(xx#llu zjdWS`&?%NdM&iaez{TS<^4Akv2;EGiTPoWk_3m`9Juf!50Blx(q*hYb;5L)9o@D2b`$_@R=(j@7N3 zo4enCQKYr2B~#__TM*$Mf7g4{WpkaYwzvA#>{F)A;Vn4|p9MwD`ZC=`4w>o!h$tX-VZtA)C>0Y34PCG>39|HDoG|&BAlmt8PkO!J-<-Axon`T&g|?wGt;v*OgZ`RYK6jEd%8Ak z7#mx^evG|2aN)${MVZ#dPM$A!g+Clpvwv)C&92)!H?w>9+}s}6YmKl|z74LZKgACC z3i9C@(;P#sm+BIUR78v6kj+N6dxS^&Kx?dqQd+235K=gKLGEYI>ghXsBsEd0dc7{I z&nXu-#nx@wv@X_C1aai_dIF_W)mHR-;^Isw=!$qeDmL}_gL`LZcL)6>``jTn&y%Bm zf0xsMJerF9F#Dg}M&RQi9m53tQG)Yv4)SrXXN|DN#QsQfs=obxc#MAe{qQ1V@SQxM ztkC;+x;ye$>_O(8?#R!7QodUeGLy{M_0r_p(bbsOL#N=83poq;!*XglPvnT}x`QjQ4(4a$!XW1vue6hG&rrE6RO7KKy82rU zKCv^&PFwRGE{EGiF#?C1IbfkL+M^FVF26@#@WkKrq_V=@{(?FFrY9|~8-U#+iwCx- zT!1mo!mFzQYLt4V z(admTZKBAB;xHamF3MRYn1!OOh%EEWxG+?x7O2BOnwpw=n|kV!b;%S;HDULlP??%2 zilp*#%8bpbpS~{@m2-}PINT-DF6_tQ9#O4Ihwur=yJ*8mE+HzfDcEG0 zraUw1ZCi;Hsc>DL$5Yo?*U{4CsrA&Pk~PUH?g=2JZq=-`j@0S$gnvL+!c6QEk$ltvG}F$QXkYNDs_zSA^bP$?pK*u$9yr1NylBqd;q!R>U1})o@0x!>pL$$c zjd1A`V+fMNemcP(((I?%0{F8A{4G;4x2vdq9CbBD`F)Qnui#TivsYn9mckc?C_4h` zSX`R06gNvU>OJv&oqV|soq~EPv{wL=mrI~{S*)^x%-^bnh_aJUP+uHy%aW#al~@(D zX^R5(eP2AWF?GQ;y=M*YI)Yuu-?V=s-CbF1e`CFsmB^!mF!75*q0k2|nYbu(#o0mi zDENU~5njoKGzZjU)9OTs_(lLVBAmNW1PBOnyLpA4 zMa3e7Meuh$v9hrI#Kb*G^l>KF$7RY;6n0sZp;)oU@T%l$QIuq6&=4gu-tqI7!9~H7 z$pC4bnJFrgq?w&FJI&6CF^Vc@Ll7)_M9b*PX2JRGG68LR&eekIgXai z5l6Di`g-SK%FH?(@vD(xN^lxJW4gFF5-*mo?CYz9tHqbS zf{Hb;YyBRts-AHW`+_}c8A>mZ-X38Kz&6ztJ$hdvtl6Wqm$(*;C(;Yaz=U0DG6`#x zvm7r;Y3%vSRO^iq>OwN26?!i3EO#{oC%z8E1-?bzQ?qfAjcJ# zr2_uw3h+k?;Pc>c(f->7aFS&Le!KuqvPQt4AUG801h|a$+{dIN$10#vb)z=|ONvLS zO}l7&amAv7xyxSWOT%Tah(+PbTX%)mQLL_vTogzTcKa-4yLa>sZzO{hX;z`=wl4PO zp556$aISL?4Qw9$BYl;H5ArYdjhH*HX`^bFZaLPHH>xV+?pv8+Gl7N7WuX287Df-3#TSQ<e20Y*#~hZw=r8vI3I!Y`8)5b!4mF3Ag7R0(+obaaXeOQon*OTh)~ zy_3yH`A#odRPo)QFbt4zwj1K1NI|M(V|`UcDByA7R!72$9mcA#grPiO{%VG>VC>}! ziR>sZk4EutP%jZ)onk~@mrK+Hm(M7TgiA}qk<$4ZUKyM!i>RpStx?_;FxhxXaKe+I zH0gaYzQ?t3e|=$G!|z6n1C z-u)t!LqQxUc{I>No{KJU$+HN?CC%b$B*{h6w5wAP!x~{f4^cIelcdrksz36E3rS9% zCtqsud&90@JjsRWd--tAe%TfF`rY?D%wG1n`l^?CJE zDE`6gr7Rv#9*~bE@Av79BUiTKbjBf=)C!c_CQavnw$&@d>HguIxpb_{NnmkM)R5{6#>K%kJ`cJSCoDINK-> zO669nZ~?(9nV0QpiN8jkw16Ao{_qF1&dVlpo1vJFddvLp@&`g(Fq~bG{)Kaa7|AnY zhVhZq>2PL|x9%#ejWUG#M_<&h0|O_F`^MQV1{{?Uv|Op9Lm)8^`{{NC;f1U3;vG&}87R)r>96MF)6Q(R5i@6ilnCQ($SiPh52lO77e99+CnuJ>$|u-z7x+x$J04)0P_i~Mh53#L zJweM~Xqhbf#YG8OC9M=&SDazwCN{VAkCIeuZeKM@G8w- zWA5D7FThWN+^xpl_3d2JER1jr#Mry|Y&jth5tj>F6_}}#_8lwFv+4rCk+O@I3|VZ) zExE)|vIHvdLH22tR7uF-rDaw^hB18h23e)Lb&AaZ!aCIl>sX^3rwk(u``a3tG+FQl z*X6tU=pNQ=DPf7jt04aZaGBw%(VD!2qV=PCYe?fafD0Y|j1DIYj$34+{c!^h3ofrc zx8OKV*K&9@?EfT#fu|^a=Pw`F${OL)nJtgWw7{J`PKC9?hi__cXu=a)cqA z%4zf3c!}`?hx%aS9bH~jiKQY}iG@UarV{=RRJ)L6nB7_>mck~e#DW8{aGp#p@(T+J zUKo7V7Unrm-25vn#lpVd2u>T}T<3%)vewrsO49FduG6`X-F42e!F`Hc+mZ@|o7Q-< zm+6eCQ4pghEWLLTCysDz=ngGL z5s3$f18zJ(d7h1z`*=tzggV^R?j9o`#SeCBMy) zbREXk*ATKHEN+fuUr2quJUzDIr|VN+E2(Dxcwh)43MH|F+iFW!okhRG;#YO{l_u8V z-7|N5*Y??_>@#l8TQpMQ-48C}U6QWEb3|!HF5tO54&d-p@CtS@XuP7gBzeVoMb1ed z;;NiP(_88iP2)ci<5zZotLl*XKOoI!w&EZV8}@}-sy){@x&IuBu#S++gdsmMf>Osci>b=FKdow%EN9yF`rp*)S?sB=<_8)NU zN92+I?04617=^AI(^4n(fK zeoJ9-c{{nOkfoAcw|jPWFHeiq`;4^<^%+r!Q|5C1&HY}I&v_J{>oW(@Z(*IIXIp!^ z$;jaOoP!swUw|_qtT3Qj$B+A1zkHiDlykK7; zuHP;VXo&;fNCO($Vfb>IRRNg^FJJ3*-kl+~%P84j>NB5*T& zERwfoaDo@O+|8|^3=m%<7{B=1;Oogc@(57^5M`}U5pi;AY1<~jBVAqWfEq3z9wO{U z{l0K$eXEE4G3g7)ie*dpn?V$5#|(Ua@|*Mb86 zs0PQ%n;n3kCB_6?UwL=K;y=K>l>+{h)*dVFg7*4~o7!K@eS@O?)1v(Xt+ex>udlQl zU}xR~s&|qeL)!jwl~{mDTAET7Ib_LWIGs{QJXIf0Q`v8-#3G!6$l?|1N`r8j!aapl z*+HcBhD9-!_+wiry5w?2%KPd&SA{#r#&F10w6rzZ)DvoHTr*L5_KYZgFiEv5C8OU_itxkmk(PFoXtz5Nn03F^$d-dRY()WBs9P|G}!~91%<_qC* zP~=u_2OMY3QkSU4(k0@qq9s`>;t7wkyeBB{*WhuP!=W9H<2uQFRAV8F6WX!?`J#l? z8CIWh;)pCPyb@r~bt2T)jgy?LPH|`l)L33k7VRJ>Ae^%0(fvgwSwxcPJGg(@yy16n z|DyM2MizH{g_1DK3`EaKq>3=e!cf;wtR2k^#A`*yu;0al&8L%0@s9b8-Lq@ssnUkm zww)d?uA49?m&+YqW2-z(4$bjrj=LVwxeF42ct+>CXV`Uld`nRn!HvXi;yEJ)?N1o( z0q1LBYELUWJO>hp-v{2Ly#}aQEDcH533jZ2re*L%QO#kV9l#@J*mPjV298{*kW)6} z-pW(95UxuzR?;RPa>5WAbp~{%*EAOt$OhH({_x~1~lCMJ4K90p3uyzfy z)XdjX(4HaDlCg+18K7uj4Vm~!t0;ZIB2#l?cR$0)C@xuyrT|J^A5LADq+jwZto!Ij{MGV zpdjUu!V%!7$G4degCZ(~)u(X`QipWt7!Er!{8R~4prEQ?FneX|wcs6Yeo#foykV7O zmTwj=Y&Ms1a?&&l{Lyra=*fZ{pu#)zbsD}Jq`_(?x z@3koJ%NCuIgv3#UoTJv^WLD>Bx$Ja|A=yvgSkNe0Emj=-XLdRrM{w>ULI%vK9Ktpf zvjrP}EtUw6x*Ew8BGIqOxXbL|$2Gp)ZK!RezlZJsBT=m=EMzH(;|jbNhQXrOLRRQ+ zg)pZrAUKwBpue{p{FUY+owk6O4E4`39nlN~*aER-y9LAZz`hn%T-PGwcGAx%iJx8EA(r#(rRE z{^wY7;kabKm&p$-94FP!+l&<4d&0PPmR*Lqsz38tf@2P^1NZ-$EI;_Y9Td^fe6#_$ zyt!wHl3uYEmvXl3l1swxz03`u&5C&$BAZyZa<$qmL?`wv1dSSsY-yjFrTpRc?#za8 zfG5Jt!6Ns!);I3i#eB5-$^PG={w-_%Qw@_w;v?af*S}z7xt&!4PCiQke@xroAmF44 z1zg|vAmHTr5%8x9+LO;vz#lZ=BLagO{Dc7qX7l>s` zSVEubx|CuIbM`9#ykb*;sMPylx%)PgYB(!I=)==zrKWu^|u zlee3j{Y9^yT#K}a!s!$Uxm}}lEIM{b`W8tdByD-oG2wX*_l1vo!a1e5pA$R!l566qE)6>t^+rvPqj-)xYW51w)rKqtXZCvb zZqTM|VP0uqzn9WdEK`vx_rL{?SMriMB6A2YO{P=nN?sp_n;=%bERO!EEj@G9apX55 z-l*~gO9UySmK&}|aU6Hl@&%>D7j<0!VN1y64w*lE1A8Orwc4~!?aF?Rckc5xi!U6_ zew3Y0RerL!vcteO?<1cnPl}mBJ9Z5?alU{*QUE6zCEyPhz-h(__(Oc>FOw=3{>okh z4pyv;BQh-bdEbkYDehZT87FN7sr5X_NM2gVYhka?edp)gK5xYJh0kDvtk3<)PvTeD z^_efUA~(eI;Da92opC>O43=5g^VP3Gp7-&NYu&JKA%i!2ryu85RA+xjNxWva*cd>-C3F=85ei z^P9e9KSkr?@8@{^fri)H__zg}@G9VsvV1t%3a}_P`dAM_u|TKOJh@2C?MRH z8%Md3bcW^^#%}cW7Y&LmVeYm(b8g$2zz)T5Pjc+M3@nhHbev;Nz{yS$@W=Au3aZCw z@V5*&?ZndC(@G!D!ShzS?=QxEct4Nfiuar>fal)x*L*nVdeQ#T72uEL;Btt^oJIS2 z15W)V?jm@uzj^neU$jF++?O@(E9~z=0i0saygg#h`FJENLp8_mwothZNya8mM1g4c2IY^@Rt6+}(f$n>FJ`lDytK7Z{3nI2tuSFI_ov_})5TS3 zwCs4@c*)hGF@ip_mn@lBP21|46hmmiV106kyR~G_|H(HLZX7i%nqHq`?SlJWp9kc? z$j-S{la=RmK1{Csf;mA}jljjXI4(>g4?+>uX9lEk>6MJjhXV^sSXP4`YU>i1l}OHaFI!siX{!P!CDLc)|-;n3i3eQ`>y`oD%fl&M>5vtgsh!(e8%7 ztXfrDRy^lJNtwvG-oDyUX=x~gdNPl#xUF{Ms9Z~>V|)kv5ns?Z5iYOo`M6$0=6}No zJ*8M9sW0RgX*)r~#|1z0RWqF*Mmv{p(0z`m3xV8xD)UQzGi{d$xih4^g>D5HeZ^*6 z(x0-0koVZ7EJB| z8_r}L%*ximzf({~4rG9_Z*!0QRR8p|4btHxLRN=g&8KC9Cm3HFvcs~wHa{?ds2 zRBz@M+KA+fmUJX4k)u*k9JKo#0hiPB*K`%mNcO2kBpJgPO$MWJN)c&d;+_yvY;Z`d z@IFQK6oldgbr`HTmPY!}PJUiK0Z**uYjyNS$`-(R?r@g2 z=N$5Ih33GZzj5{gK`quc`J17T|GR3?dG?0u-hJ_PQ)fAX>Ipw!w@+;>-+bHt{kLzf znp%JRNWhC7fN*Gk=Fa}@hYoG;zv~};UT-kq^9BxIy}f1Qr9(rPO||a1`ViU7>kywN zKUp<;rb_79qIwgHD;|M-NS@*TtnX7)ocvkcDe|w=zpjpfjS-doffN#azbY2qMR!qL zT;9&L)c+ms+c-vkE$;RIlROA3w;pdU_v$#&Jo^?%2pv1xzDRKn4v@yZ<#Lmcdx}3{ z?#5!&7gb8im9^YV{~59TcDO5h{T`nRNB`F8lmGQ8k1y!A+t)vVUHRB@hb?%Tw_lbz zP}w?;di2EoE1wIun7zgEyTX|bO6Ifo*Nz^&{Br!8-Z-^&dgI1v+XMI9`@sG8-uuAF zM{c|QrVrnC+ed)+_ktr(4j5T)&6x%dxrFI-ZU#pss^no88N7~=9y=k0M1{_BsSIbj zv=<&wiPyK~4yojBEPorz1_OcYu|OcGUU8ny<_Y=k@FTDIN?xLq_)?CJnTx$4`(9@_ zIDa?#0$GRo@Eyco8Z&i>zrY)ZqcUmMqbsH2sLWhXP@FOquWi$N5*O13b#z5oNnbAW z*$KY2T50m6vX}Y8opq?GZ%nB=qo~9 z8;YPA=OTc&^yR!3Ul)@R2-S1LmJEcQ7{211p-bsx6OX5Hwrza) zO#8qICE$g_$k9faKr_I?$Wa0tP^gAZYUcsOTt5DCS9vb}au;|We#VR9W~l2R731t2 zahMJyi#TtI!Zx~GC7+PLt*Xs0r-P}92nn&5Aa&T7C+v?-WH0)|PXgZ9#Z*T3ViGg# zM`}2j9b(&wQj?%m3bM6@*Nj?!I1kPNJI%Gy13@4&o}JvT6NCoz$JoG^|Q_6)6-+ydpto;00||#d7jR9 zN+;^s@$UVrS0C)r$drgruN~bs>h*gW9P%p88#q})N=WL0gs2AhRY?ufNM?08s^Re2 z3WaYvipm-&hhs9sK323iTK>5ev6v*q8e;X;DcoL(gZ~ztTLDSR)fgB2$mpPijwR_+ z*YE4@Jv4OHjhXjM_gqlz2mg6zHqY&g931M|yk*VE%*-fzsQbX`p+mi2{ijR5d`5lB zr-JRq?!3j_oylIkZES4o%*f~rsIv;xDFt;x5}kg`w1ba906t6bHzWm;DLVa_&T&9l zA0dMo=L}$3wg>Flue&0?A}j08evu9YVYkVT!4&b&e>5D%kw5YnsY0@;n((d~U@gKk zB9R9ZaS}H}%ps*yruBr5FG_(Cc^NpmDv_v5)Fu<@TI`HN^;>}#G7%}RrOVrbBlRR4 zX%Y(s+t{y0uD$&7Yexq<2Ch7O_{xFy>~E)VvKIYgV_*5oSJ=#s%=Uu^w-4=5gWGzy z?ccwxcP6lV_3DAX)vNom9oOJLqINT=U6rGDSWsJ&G9WF?NDJQzs~=OMb1y9CLTV>L z?t)$KhRESMlxsK|)1qX#+m@kohI7C;D7^+0m%p==&Vv5gtBKM?aZvjzSh*KLvV^1^ z$6PG8*C&8cGRXO(AowDovg8t%C`+JRoE%FgbFORM)YqkE7wZmSSC<+HpXac8LjF5Y zfhstEJqZoDoAgh>xtHVx?<3ByI#nOBbDy!C;LGm~zqF)}`VA-*e(FB=KKOyP=8#8qo=F_h4vt8`b8w1%3+Tc-+_&(n3kEY6jIHH=C%12(oZP-+ z!j`#ceEi~!_&a=XdiubD>FI;O()-X22e7ofwGh#)1={)Zj;)11tEwk^A9h`N-hZCJ z0$B@}W>6d=fYP=q8y^#xfVGf)ANqoN+Oi$ks9w%m&<@tlSqs>^l1|hvv0DtISGV&J zh2!=M42CN9Uvx_ICwu{?^RpjZ)zy%RDN)qB@B|V&nzkQ$-%ZT4I^gl({AOpsyy56T zb92y-Qf6*X*bxkEo|ydL5PG>5KGZCFxr!`?Ri|Y!AR?0szo%g_v}-3Rabq2#P|v7= znI6{61TG(!8Vz})Vc!_)+Q0hT3D}%YTU3b+H;=C0G?^lVN7ii_SXI|wRqRB`eAMQy z+kN(`mXB>))xE8$+7Sl+ow7f)y032#_o^eS+Is?ik2cI5Q(bcb!JA`p4SOA{rAo3S zE4ldq(F&fRqb?-uiUd>81VTgsQ771uQYq>xL%Qlmo%8b+^YuR`gfIXi;Epw6zdw@w zKY@^!by$N=Ut~@8{r|x!a5L@OygB4UA^3l=Ify^7&Suhn)M_t*W#3LVK+9>_0K7Pd zp85bb#umE-PW($ope{?WTFTh~ni9y7AcnO9kzt7$@WI{fJ!g$JZch;EtpP{XP{Z1d z8;0vAi`)TE0M(~<(n=uvY}sVZA3FC8X7(Wd%h7JL_=6jVhc+iGk#EAriBz7z>m}uc zZ#n~%v;*x?7|E=zd?&U*A|XkMrbJ_HHExf^(<|Bnx-pPi)*ATGnO(j62d}(7bNSZP zHVn?^v=>#ZN^jp6**Da=Y4gzPnQd#x9vIFX?EBhXum^%cJ}i$v__dvt;&u54eV1 z#a;{fy`K5|f+4TfC07#?$u4MzU623DUEulr$%s(us84@^*nPJo3-l zEl5HC$=C-jyzm2KgPnue2yxcY!OrY|Z5|!nO#l9Ec6Q@N{9`lQht4>3=!^^ugxQ|% zt&In^_Ra?OjgI#94G;Ha+t&;Zj*JWrt|30?29K8_!kB=$3O*=$8!Mqewj`61lx#^h zqtbsuil@K`i>w5}qI&#+k)vDfJ*#2+f~X83hH8NVrRyOUo>NgDj7=WpY`5kmvk_5RUX9g8HY=oX?2 ziX@X73*kUZV5k`xHBGaXvQ{k zzh|@G?+wZRL)T4SE5DK>p`6F|k^#Ht*Ho zGI(RfvRyaZ3?*!BV>9tzqrB3Gii=_uHSIX1+3hY_8yj3(nL6h#^hQP3ZYynyl$9rJ z0jKH+77ex~GSwHLS2|a8N|zk#PY3fVY|*6da+ovc_oiSrT(;BooWZcYB^ zj58I(5$(UJH&D2O@qR8!bI=pR7soLo{r7%RR>k}2V0t3Zs zW0|$dito2ocMTN>9jY^6PgGV7`CTr5RTZHk=v3`MMN7QZ1%B1%1Fh{h8f$xE+q^}( zu@d5ZyW9oNxJwuB+=WPgNO^Nhq)Qyy6KadMb+EJjz8E?E?((X3I%z2sd-aN&%G};| za*(y7eu100d;#^Xd%?iQOl^?fd#sMDY@KF>t9NAPf?^ibkJMN3g)}?O)|_Uj9)cBh zeH@A&gcFN>F`R;h5)YRNV$lMyjh}uU4D{G z;;R2kl`YJ@wtsMaQOMzU2JLY~DeAm_v)6sxua`4d~ zzQzZB;Fwbm8f$%Hh0i(lG}`g;hANQDP5VxhaqvSK{81P*jy=e&amk^bul%i;k73QR z#wEUQV)MY{+^&hr)ukA<+f`f}YUpI%o>-`^4ick2!CV;dzEcc11e5M(H$a~nDS zK`rh&Ft(?0^q=B7M|&`lh(^h)P@Rg#qp{jrenz)0BNlrW^5cT4?pbK7ot~JOu1QuV zrbb7n5|x+L)TGn+cLx6ZerKvHlj%xzI$dp5?fw1ju{P%&Rpk}2SVehN_VLxj!>iG6 zU6Tne3l(sg=3B_;F3ri1Kev*)r*q|Y%W)Z<{XkrX5EGXa#?+!EOqU*QD&VsDF8Yv438|V8nGlA_gNygXWI0FgpXWdMjBHs3>T^SCSuK#gxqpPMcxHY*Kz) z%Ga4tS>*jDjY&<;#3ClBkUua_XJRkeJJ6YI+cHWMeXGXXXL#RW#fZMKT;HnD^Ktn} zL{$eeeL{UL(OZVTA_1~jcR7d6llfXmpVtP)|GTvi`^{;oA&j^TV>%o8oK~{S3aNps z4Y;}u`7J1OqhHnWfvd<&VB0yiV6!c`H_1Z4CEZK52&Z%2y%o53C%+f=oVcoJn8uR{ z)7$t}%8)AH5nMe52jQy5L3l4L(_Q9 zxe8B<$xs(k98tO}@Tnk5CaiM0e(N&VliKwv<9cJk{roznb_w=OehGfbHVLOb;M5zl z7oje_LUR$ty(D(nhLAp`M4F@nQ!s!O#DUMhE}ZWl@s z?RTKIuzL16s_L@a513fM*s zhSQxGyEv5~Drsq*5sEmINtbrWAy3r)I{rEXCi$CYyEj-eU+yq@and$!?UVjhx|^*= z+_F4Vf@krSh$w?4G3=}2VR!|rn@-JTLXX{ESs9H~R7C!@vZ$z{qNu2nIv;wECq*_LHdL?Wg;77g)Zz24|rGo-PDz8w*P~89Ug{#TfDKE{-$*?b4>bB;gCjYz6B;V7}q<@-q94-FTsf{`9#tEO7 zXY39;Vq?IZ7Rk)f5Ag!h1ZDey5NhI6n@jRdpOK|U)#=S*SM+VRE(jl|R zqhE%DQPh#A2Nb!Y0Y9I1)R#gg#LA5Nh1ty~VI*2n5e=2f5p>4kVPUx>%&w}83KpDy zx+KExa-%4Hc1HwLTb4?|EB)}9O@Qwn&bWp;Wt+XkC&R;_Avo=F$TlROD^|&7JwTh} zBs01TtA0P7w@`{K9$C(nqB^bSyfoEmwG^eQVw14eCZ{H+HmpZS$4A!;_V@O*w_ zG9JSD@G7>hF{?(8xbFDx>dOBb<1E>xr+l>OQ30zp|EnOW6?d{18qTCR#d(!D?*qY# zvd>mBzY{XJY?z#o8yXJM)e9@=s-Km9wt}hr%K%-yuko{u?4{Qr$$g*4J#LF~>*pQt zu;Y_p{KBW5ZokK(eB{#(5C7yBUZX4`F5me49T9UEQ%;EAyjh!r@%ftjDQ2nzw@?vK zk|H=YT@P;>V%nH-s5d$fU)kru1LQURNAboKx&dd8f^ws%F`$@8P4lc(=zo*Ryo=UJ zxq|>tr!~*UJe`Ij2Q$cBnQ+V^pN+dRad37-C>-6hq(>sly7#1r(U8n%sgtZ#3b zXmPq8sEkIds-n?K%$6u(Ki}kc4AiO^d_r^VF?ws7Q1qYnqKz5!hry?2Bw46;e~CzKHuZ;bMhLMBbYdf=uA8!d1S4w*%u~j{U7{{w zLA|M2P<|>;k&4GLRFJf_gelRb>9IPM{)i;Gkdz;tGZ4)>C{fWOSX0DF0v(e$yIW< zal;r)F$Qd7Y*RxB5FkK8FG_X_kXhI zc6N4lcIwyXnQzb3YJzCbPF4MTZi4z(mzE|pzrc~KXFaUxs zkH)2sJ;9!UHtYvcXIo-^eV-siMS)7nALxW{(+8k$0v^hPZbq6=aGcss=cq~>E%%TI zGtn0fq_=8G@_ujNx&u!i?hf#iw;B`tSBltop94uR+*7Y za>Cq<%Ca`Haw;h-OiwQ?EZOL=+3i(jZ{-ICm-=CmlmAv(mECT06#X?+4ObJPw~MIW z4E3&#*E<gE9H!WmDKDk`hUQ!FL~sUC;=(t%D?F;w8^l|#K(B5Sg*s!ZGz>#lE?$}g*Z z#hx7YO$o%MS;$cZ)ub!qlI1&cTAyvg8$&*0z7~kv$I2UK7manpSaiYqM88~9aYsr26^~Zg7 zxWs+<*=HX%Xe~B)v!q$u#-59pu0i2auPFIaOwo|!OTFr9#Yf_-7y*m+rOnMZK3`JQ;~wI}4hRU7Tu-a@n>in2 zwL&kfu2#lA#*VdrtGxK?A5mTt`xvC%4=#^XJ^W%Dexs{Kl!yBLN88)P-s3BH=xF;d zKAmU4-s=_2FV`#YL8tC=!7PE~1@Y2^=#yHzL+@+ZEWV9nhmauovV!0JGG7(aPnYS- zWco5n$J{}F_7u{+3|4CJ!lq75%uuM>q^}C_w*^50_;8O-IxJZ~oh~*%gSm}5UAM`D z9Wl+#8ZhP#?I#wq#dMa-Zr1D1+JS?A;7bDE!S~tY_>PBWkuEkz@da4QNiG#!UV)sb z)#^m8iBD7dkWRP4g)g+UBseV|Q}YpRbbXs}4&)My4M_>8LC6vzw6LMXS}N)>Z8c?q!`haKN)TQnIr=JAnH?wy6%hU*1p&~HF4m`2D&~yQ=pL^(4h@4rveJkXfuhi6 z_xF~P-fh!aJ2ug^bdKL{Gug~}ouMV`*DopR%(Yt1ciWtHe__I8hudSHY`yRD%kQ~JRe!`fEIYO{mMp~86Eh;}_v z<6wHAHk$~BVa~`1e<;!Q&wY?b7;PB&vH^79C&@oT@>%sWgdQ(FtxK7V>m?_gR%H|IAelF=-HG`Y&p}9semS~EEgwa)p1=yF-P5F zjBh!7*$`O|UpBGRnY7xi@XouRV)9Ks(o{NokGj9GYknDowlqf zS5b7zL?{U9u!6&$!K|B}xkh^ydoN|QXYxI@I6mxClnk$CaQjOt^F-{Z(qjpupvBn1 zMy727$2w_AT}idcrlXEDiVmj5Lr*8+oFsB9qUKfNs?F~z%Z9QtWPYuVX_uo^d~!A} zIt6k$`Ted~BfqN{+D3J>RiaMG9PvrDAu@@+3JVvdDN5O=y;W6=Rkc>NjBOx;xX90VAA9e_FvPPBve6+^<* z+{5#;?T2QU5}TvSsS0x}4RzI(1$kLP7ko;?xNo5u3<8 zc0NJau^aNhS(+V7mUi_NwKa6kZ-&7l_M5q?7G*gg@3Mua*L3!ljc=ULJ8u0kCSVc( zSxsIJe6o2=?agDei;}Fa;FRX-+11*~c8}XJIUz5A{SY2gc2@hCg7Or*Gkd~VOd;4e z9xqxzXV3}2L#+`x_eQ zyw`^D4eia1hn@Or`@cK&RYiw`yCBLP4of+0?(_Mfy5uDZBv%yC^)j;${#{;Az;u{Y3oHGKObe8w*9 zpE+yk`IMC&5Kc6};jv*8#&Mjobq0>oR z2doFVG^tyl3dApjvK?)$&Ev+@R%gN%3|lR-f;Mtl7spk>+&G_2z#$%21=lJ;AjyG2 z87}dJao&JtHYjn?WV45kDPO+LHJ#es$$2MTr@OZy)f8O?l6NYa@leV&pgEev}DW3z&Sb=`zhP=^Ce0P`tP(`)O5Sm?6@m4N76=F z@Mc^MeZ7>App`nfa05ccwl&Dd=aaM#cC0Z$iORb}I+7iz#Q9>CgL*;;6R=Y)-WGC$ z6K_3Q<%-7%Uss4Mx6fq{RhdjnsSO+YoP87F*UO8vYGdDGN?UJs^i6b&hhVJjDXFeT zt?kh<)271Y%3WH;@2C6vX;U$_6Cu~10lvSCUAZ4r&7i&{hiPGrqXnmwkf525+Dlmg z_H3)W?rCrL5HLH6%yLm3MLu;YInayPgcWeW1lyJ4iJiX&2@zm_j2a%=+YQl2oW1r8 z9+`}O5@EM5scsC}jz8?7tspKwm-Y)qAIDMTHjlfbfPV~ck#k30{WK%`j26g!s8|VTLHDPq=6Np@8L?B&gBGeDXp}$jJ$d; z9fiOj!|JiKtRPe^;wSQU4i{x5HuKBM;1)y*ln;tg$ zA>4=KN$E0;=pY}Y{W_37idaS_o?dzQm9&H!^@%hJGG*uB?CU^|+yR*rTgyDYX(v9v zW3HJUgO&pE1tEeKuNAQDSs#GjM4I9g3DEHps~tNvqo03DNgt1e<0Frimqy>0TWB%> z#T-1{g`tmrfUIzoV~Ku+r40)OvRoClfNCAAJ3N_zuG8xhw!j0U5wv`Q21+XhJC*?0 zmc|b-PMu^0Y#Y8Mwu7~|wKR?$Q(s*PBWkFbGP5h=;0)(elO!0+b#TCjB1k^O&Ti;f z&%yIOJ((h#c6g7Wecr7Sh;^#J%jb?+TR`a8Ue;AuIqpho`<3c1FCN@wdmF*9c@A_z zW6z3Eu8ojwUS?x+-C+7{1l{Wa-K#OuVKzTJr#L4Ktg0J6@@h+5MyTxS!0CXQ(c;7a zu&|0GaL_5R#{f~vb(;a{w2Dr<89Wee4<)j95ZZ@XV=fL}%FB*zp@{P%LmP&xbfE1d zEf^<521O~J!I&cs*n@U^;ik4JQyL)PaM*hrj9RnP-s^L^d>6n@*=hS#>=MkW>8y8{ zf8?>c?0JPg-kOyFTVX>*e^!DEf|rVgG$Bf+YjC4q+CLov8eF3fo6-wRvOm5OnONzC zY;4$281Pt#y^HaBHd1!MGHyAjU_xmr;Snh`(QnVs&(G0Fqe}8UDw`*Qx$%jv)rxqk zbBOrj7tJll(MyTxwISMRQ&5|RY3?hV+d`z5xa;)jtDh5K`U~e9%+U|+9*>O=fI*P|aJ&losfU z#4STG{rhrCfc|}%RA`RP_NdLcu?;m<00Ef*0)cGuBC49FshfXtl~@lAEs{7)kW<6w zih+iqgZ{vy%%uG?XE#S(c1p}gna-bBHo@NnsIy+8@` z>E{nFU(&Z<@`Fxz6L?;xVw7hLe5pAVc(D=?f1_}#{9ilPfI&$xY=K70$ZW5Gd?M8@OF+QX8qRP7ZtE$$m zS+Trt0rpu;YHh9>Q`JykOOA$}Re?YfSrQEMvm79DEl!xIsu8S!Psb}=OK=6@>ptY+H@lDM&SIwLleXt%*`NvK1x~0Qyi*S1KvN9nvY^=>| z$#c6caM9>AYMq|KEPtjAG948nJwUz_*uAQxq!{+=z_oxw%OPGTIAn&40V_9S*^S*YpM%3jzxWID$24d2x0}Y;K*qZVhtbd zK`1pCiH|=C;4m%ltEJ_E_xyhYVrcL7! zVnFJ{FGzZ(8_1}MFJ5OSw@7O6*r%jGN80+b=fLcY6L0_)+bPgcCNiPzB z!k0n|2Ev_8a+uLLS_dCRX4$Vtkx%VT55zwerNy+#LhZ-wOtUVv&@}|bRTOzR)E}nN z%$4gR5V-FOg78}HZKiM^H#Qp3DR-zoXK1V-kA_%1E>9&^Gd`;2HF4g1FfGP(1iZcq zQICpEQI^b1EJ!@V=(BrlKTEGETIF)PU3Xrpk6uajS{_rRmBOFfDzMH0*DnB^B|!jxzAKdsYv?cJ8})uGri$N&>!$(-qF_7IHq3G z>C_w6q4lf^$RSuJd1EklPzEs+ktTicgxFuygq#Oxj+ujySh z(&H@+bg6``9UNxy>TcmOnVn*4HHU7(D^e@yX@j{#rBU9r+H6+-O;khIH>tlQk@CFL zXSYZ5_^TG1)f&y-u`+Few<$Q8|cIU2-L+=%oO0d1O*1e zKztz8hZ|;ncRs1H`0gyKF_yiyx~zntB|v75pXORjMWGDhz`@9o*8QLnvP)p|uGjd~ z4xH&=z4ls?(p*ba@wL=l*UH}=PZ@nShv_eW5f6FoR#WtAS}pVJR*QW%t^eJ2i&b4k zm`gY<*%o~pw)UKT!Jg%drQNdjHt1;J3oC|#30`wg%rbMxK$)`(VfphgY^NQ77esb%>f{v0er?vx};u-SAHhbm8Bij_-NC>m)u zox#$#ml4EBt&6^zN~?kF-yih&T9+^j@^*TO1JXq(JX=u|{FwU$I=W@(QLp^%{tWCSt0= z+z-=BWWaGsC_9@NAJ9d_*5yijcM?0-NGU(@b3Q5JC-@3oxiFY?W~=dr8w@s!L655u zrtB76O=hdSKL#puy$R_Cy~S#{;RX`T8z?{B<4V%vao8OY6l5)z#Bx|T3=uK}Za{I+ zykW}Ym~V6~L|CL{l|Jw^30=v_WGtJUlbr2OHz%1POOwWSWSq=~%>>mxFfLkB4PI27 z&J$Bp-JXn@p=;^F&Jz21}*uQ&BTyaWH7>Y)@*D%mQGV?Px^el-hxELUSPhM|ar zP}INil?K@4Mm0Y!G`O{Ty+O%5o`&~=y2t49R-wjjusW2iZFKjux))xeIfE zy6I+@Ofj0AX03jzOi<@h1!l7rmgANCtx{z_DUt;G9s*JIFb_c?GDlUc=MZd1&m|-XzYAKW=xXxa$1gJLZP@I50^hv| zU)LPaCfRL?+5-s=tHZD-LOM(Gtp{Te_!9`iPheV-TMs{h)zqqZvm~(}Yp!Yy7pEp_ zoqSvLRK3w<)8bPQX4&vroz2NXckWcI2CH53BTb^sk*GOeW4A7&v7j(o z4Rol1H2 z)?ih3?$iQvY0iK7uo@6_D`K_bDnK<-8NwuZDTYad4TGe`)M@8KLgdkQ`u&Xgi~NPT z*?2*Pb)*(l4c13toa8*I3XH7yBnkL%7-lcRo@x+#cI>(tO@Rh9DjWX35Cg4t6pbG$e;LPA|%|o4voR4GiGJ`a1(TBv<{=b zU0tU?0ldEkJ}k4tnY77PY?o^i-kGE%lQS|ebuyUok<%?;Le&YIDpQvT@iTk$ctSD~ zFIa!#vPRIYcBl18)td&+DuM>#JV4(PSce!7RF}d@hFt-U4Azj6m(~D*ergoWK!}>? zLJJRcS1u36G`c>o^aPO0y%kLk?#eB#nX+^G?DhtW#cXqklESj?v%06W=0kwT=hn0| zt-`sfudZs$%!s~QF;?p_84}BL*ELSs+7+4tuSupvr6G6K*v_q;K^TTYFO@lFMYyad zV@$(}rs8S-=p`w@9fj-yQN(Wq49i5^cp#XSoQN4KJy1&WBv;adG4>pd(AH38$aV0}Yo3Xb(1+`j5U$ybtk0z8E`+?@J@gv*CTnUKHx>f|VJ(Zxkcuz7y^> zT*XzQ5{#o8-u{ZKzI{S!c?d%N@AUrpzqn@5>iNMV`Y;{|vGJgRAc7z+&CR69WD>_- zX~)T-c26|ob=(P+QYndJzj=m!727wT*ue+$|D@N~3*NEY-{I@mxaVn8K zx}P}Y=stW=JJ2Y~#8cS73_r874Y^93WT34;lAi&bA;#w`^R7lhH@!x?viT*&ZVD*x z>D-P73iw3?G0n#4cEw^cr|J#g{5}bObcTCwJt>Tx^cuwmP#Sd?JL6*ys>Mh|sTj69ADjwMKu7+tl8mg59y`X6u> zOFmjZ7U|*}mI@yY`u$mH2@DvPsY1NCmt0>kE*k)>ldgYa-~v#h{DOJgj%{BT4zCWc zu66F{!|oA>J=yxBIfWC7I_4HkC>GyLfAqTRujh>?&6s&|)a4yER%2DAM36nk<(&~JqqyGA7j2UUMUrJf|!5_1wGVefDneRw+0!meT+ zb`{g+;^-My&Y9EQjZjunQdU-4TE;KH&D7rBspTc5Wt0d)2Re|Scxm_Xx5seLplhAZ zX;a}^XIf|UI!ao7%%HcOX`M_*BcM4rVgx3^9P01tD3n32Y39ZRt#O5oqYPHBSCvW0|eu&f$1e#*cRV_}JLUMz4#FB)=~<#y?<42S;0Vq%^HF zKI%l#R}Iu+ulYX#`%|#mlM{`!+Hs&I2`7g3QN{pgl?#4E)04ChYcvmQ6K&SP*d2G= z@u=OxBWA76%zteqn_E!@RYCxVTJCDU?}LexKm1L{gUzY4y!g*wzu075yr+SwStWeg# zV|gc=!`@T>^&i*kwpdI!gaY!S1ipfy!Uml| zHFCt_haHd67(1E5NK=+f3yx7|h4H)Il74j?)O^G-jNzgcVVoawDSCH*DvooN46}Y{Usqpokc4N^(FE2Px{D z?74sWx(7}?{lNT&xfNAoH6m$JdGoZYzHue(CaxDSuW|5vjo+VIpVxWWx@FfanDvWw zm(Ik#S-ZLD$8$6jf;Ayh4`dgAiGDRYMpU(5AY&prE?3dR#$OL1jT0?zO0D~1dktZv0!oN@>|Q+8AzLRzGbw;CHr@SDeHkel*2o`_4Clq=tG`X}k4636Dbn?fb%Ycc)@CO2; z1O}^1EW!C;Y24(9RFWAqYgvjbr`koX&NLtiFlQtyLTpH!fRhJAaGkqhPFdO9F)!KN zAe&vAT-H0?R{mu9ocg*s21gt{fE~|2QMXxpMB(Ci2H<_W8#a*EHmp^-XQfNOl}E zr?)nC0(Y=>EKI#GY1*(*`H{<$2XfCAl*ivRe}~ zin|x)`I0Rz94}B^kyn*enm41qG&MapP?KJkime=h>I`^WP*^!+(BFc8v4N#;VJjq; z4CmTfy*5F=1$)A^dY#-I4EP4hBxV;&a7NJ?mc!Zx{Pb*G;F1{rhgb>6MKFW?9An_hF|8#(N<4PuwF?$pyJX2V z_+32vys1;qo83ddJu}y?o!41!wU`aow7k@DO-6&L zd-nO$rky`~_65`WH!fMcvB>B&!}XP;Yf@*I!>NZm4-@tzYDV-@6VAPf_0u?>V4&TJ z5YS`&Zb1)__!1q3-Sh^Xekr;M7G;J6>L_%!>?oR23hQcarhaOk*gRo;dmZHOp@LES zNu^b>&||AW_2W1M18ZVEM3XEoZ64CWky zdX3lB=g-c`*h%Y-ai7uxJIhQ!KmGoKtQZX*U(C{&D0jqh5yatCXlU^aI|&934>Ofw z53Tg&7O%&$f>>oZr?c(YVRJ{Px*Y2~c87OOb~euw54j!DE2u_aK9rdF;6G*EmN?wW z(I^+m8o$jRy^Abod3%PRYM8^X<>TcVNMW^d1z^x&9jH2oq!~WwBN8)w6o1Vm7jhng z&f*A(VC{L$xw*~xdGwnXEH4k{mY3)9YlF@C`OQJ~w+f^-k#v>Bq0JkB4++!{V?c3(7i=v2sNd;xC?(`v_nT)OIErOhNhzei7~FpiWF7aW z0n=9L5F^E!>~Z0fszVIO^oA7=nts?_{9}&TNBLTxgX`(5(Sr`(w|^RbhdOK;_=Mkw z*3fxF`u){qc9kltQU{($v$!=oS&G7@GA2or`UXPn5V4W@1z@O$i(0?Y4$90haa?U_ zWkbD3Tj$Tw8!XVOnv-h+*~W~Z+v!WRb<`f8YtiYUo0$Dk*Nm}+<4>EIYPhM>ueBJo zTBFIE!Y{QK_vLvqLe*EH$KC8YUIx8p2Fnd+1ExXco&bNu5CSF$I?XFJf$X3m^d$XG zfH+tvU>tFtTta);gi6R1o3uZ1Otm%BiE+iu!ng)fVR=l{wu-IGf$B18d$@`lYbr31 zF4}~xVnZDn1Xu9({R{i|ZMtA@=eMUO=<+sCnYy{UW88(CzDO_@Z*K{2E;l43EWCQ* z!W);Zxp|59R*$~4th#DKGhe5@$7-%AC@MEN@6`f2<5VV1I%<*%8ABy&W}k+QFrUyR zLYf_yYvhBKW_o5Im`o?MX^aZa68264+l{lkA>Q^$Ygm{9#snQl`GU#{5?y_iFVGi2 z0Fjp5KxQ$W0=+@T#i({IoP!WHeWW$JFIl=2w&yrRAmN1~Q3Mf`4P;!l9Xw z#8K{`ZLS0kK2Ga)xJQ|wB>v=Pl7LepkN9*En>=2p+Y;^ff@bhKO*TEh((8C7cIFbD zw?yYIZG%|Eg$$CDISLR>ElyHpPaVjH!7V{UdpLBpiTU8SR-=$CaJWaWg{WpU{C z?$tWYZp~d<=;;%+ckPE_%+Ak_9&dL*AIWj3Di}CYXZ%+@UeGS)Q9W#k=v!j`z$fA! zC@FocT(&Wnw8q$tj0?1FQ0kK*XP0yVH0%JZ7=<)kUQ(_SlybPD19Wy=TB`SwG#m$q zxR{^f@gygEyvgd-Lr%R0D#e_Et8pTkX@q|Ybt5#`#gU%AsFR1wZGIK=Cn4t0d1!Pl z8spIeB5UAuaMw1LBwGWS9v|+9j0#cDz=Fa!MwUb$cY9&+uu*Hp*?-~|co^{bF4Ymd zraI1m556>6Vumcy4X``hIfv?nPF7AG_&D*WJ4bJ{YB$2T!s|X)WI+$DyVU2gdmP)~ z?^@OifS*{Zho$+nd?HhA~IhmyHmZj2ss!=sKkP7I?ufVX|-x?E)W~CUO zlOdU!u)%CFD@6$&v(=@YC~~zn(`62a(`vL{XjY>(gY`mc)hhn=z#ee(HdcbuGpIo- z$3CcIO(hU8c!#ahz58;c8xkSscMO}LKC7_964vil4^I*r?0dVwiM<0_&AIqW^bHXh zptEm1@%7^#>O0xcU{D^iaY*kCj!drZBY33K%_FK|zRqQK8oIkhz+pBScP1w8G{O&^ zed|{FoveY+2k_}&wu6{Gh8w6c}*d-*OJJ39GVPBt(a zq?eXL4X%)WE|K{#Y~)ZwemfZdwwK6=IJ2M){C>I{UMJkf%;x6I1UsDXDXtlnqP42j zptIOLO-)9V1N1^EHa?1h1W_>XwD?%A-0!CckFb7+uctu*2DIS)4Gjea2z2}-1@)Lm zI_j}3e!L@%?-ODQ`r&ct=YCB6Fe#D?97F0aP@^#LM;58C1m6XTJuzOuTSdr{g?@tG z13FFe{c_lSc^P=RhHicB{`VB^mUlleoFSWpNh3OUJw3Etl+x%KoVftbC}gxY>L{uB#Woh z<*=Jmva}?bAR#<;Y&aE|i8^KrrrXwG&oLIftM~RCSHVb-g2^AJSuydmh{TQc3HnQS z3ihqqq0%;aT;5a##Hb@PtF#*1`Ell4sTDrk)8KCg+^T_F3=W+&H{F}!G<#u@i#d@w za2Ft(9rezZt0O5HR)d4f12yLxAz6_2JhU2O;CRS3GA5ZAObF&i|DbhS%$|fIZq}K# zC3NG)MtQS7!KjGez^2FLa9k!5;F$8l_>IP3!iEt!N82z*U&InDmbD3hW`=ehHB!)z zBot8BDiW10aIlB=k~&r5xB~M@7mcsX%3;e@bYpGmb){8vr1LI1~CcROgO0#ufCBKvT#X4qYrLsSA2%pi!frJm&ZTPg1 zzDS6tV4}+%aKuR*rD{;Lq19c|P@*W=PRGO+{zq?KbiTndb-x_Ei_+;RE3F-a~8U^w>l?Mew@trivT`H`L!#t2E ze4s8mFmTPly@!qxn)548R8Cxasx#0DO91hp8!!Ic*`vf4Z} zdL9gB%do+tu|$pB1C0Z(p*~q`6OG?~KQUs!-n7d;i)?ojW@7U^Z7jk;UPMH}ND7y@ z&liHL9B0YmP(fsaOjjQF1wRuB@GKzb9gRQ4KZ14jhHU^QSuE29HqMLPb;)w-QN;l< z09;iBN&r>meI;p9p{uUwEF4#xlL22e#snoLEj0~02eUMK3pdrmEH6Khl~Zh1;HLpw zSDfHI4JQ5kFpx&{k7(O9;K6;YOwP?9p^fo}PD@%Jg0QNOd9w-!yOU~D<5T6vLsIv^ z-$W z5p`aVf<mZuZDbwtvV_&T^ z=&`i~HJd38f{vl`9Izr#p(xv^at1=ht%F>_`C0(y#dep~lX$#1Xod)OwFBEH?Xy7B zrJx+MEGL6`!oxX&TyL(OID$hu`&MR6gY1^XJR&&Les$`nUq=iLx8k zy1{UO<|HwGgZP~wqNK%>;5#@VX>lSDV<1c=3Wrv0w>QCVa$20_nVIEIi^FWwc&1h= zhQb0Iz+rWyVxyG9YBuWgLy{6dIPkP`pIi+%r3`@SNK)BRsPN%)^*br>gG7BFPJt_4 zw0R2)NXzdd6W*v)fMwy#G1c;Wh%}b7Q&Ph*A=n^c+?SK&O*MlsHi7>EUF^t8#Xaca z*uCNfA7-$cao(*XC&`33tm$N&;Eqzrbjk|Ao%mXvi7JfZb@GU`uu=$vRr-t3!UqSQ z!yL_KYxaAI;*IgEgm1|i%3<`diV*)zYPt9JpsP?4f-1KQ#3FS+@k3dObXGy6q?O?U z)$Vl(yUy!MPEx>+!zWXINwp7q!m&TX0Am}s0h=^IpXxy_>nw^nkm~jtA?5`veH5$j zPUSMd4!P#lc`J$JU@$0&hoXW5>(-77NA@lL!gsxJ_;`3OR<($ z{1Bd272n3`2J>hvEgyIbvb0;jM>-eZq!XWLh9e5+I4ctc>|)43EOB0jU<~jJC|O9( zXG`@F;J%P>-@+_zhdVBVQS0kbO>RA_W3moa&LL$SWf+-@QU2Gm`~pc6W`HUt3Gi}g zN6AqYF3`fmc@+wl=$Yn#OQnXZp!EWod@<26BuWu;Npey~5FBNkF0%N9qmn8*51}8f zKB80+cD~UM*}j4M525xBp_1atIXPd+Z>|JoRM(x@lRywR`k~vtn{>24K2pT}l!Eq!2O7EQ|0$m)O_si! zPkSAFTDJd(@oDH0iwJPPZ0&Di?YD{fJPmpTMcf%n=@WC<6OipI;x091aP=$V?pU67 zk%@l%7xLU2%M*t?3eNM9eGTl<$espIsEDUxDYWWoRVw1a*joq16qNHgQhrM*z^ad9 z&gvCEuxc(V50_we@oglL6p(KypbHfk&+M$IhhKxhHv01%udDNb(3-(prL%iuB)&ZNs!TP77E4T8$Rck^GTa z;jQ#Yc_Dhp%*?FKtjWqM$t}nv(Ze7q79*1}D1&H?WV}Zlq|G**uk7(yaK>|D3U+*E z1WT$Dy>=V#8m$X11Q~007`1TPW6&v9qg`vxN^z4kSbySS131_tevsD| z>c|xOk;b_{m~8ixNIOQUI}f=(g~&CN-ApqT$LLAkM%-sMd zgBLzbTPqwKV%nnB(Co0eN*2~v4#UZy7bHbWn-k-<;8kpCw#;^5r{Qdi(_}Wxo+Wleo2Kn|!2zIc@-g5I&9m+H z*|<0i^XA2B=TLHF?Fz$i*~qDOI8TITCd5Z_rlPis<8{Lcja0WoX%DsUp>3n>r7@{j zuCB-Ivn3e|gav%`YlqkEZ5u2TlNV{U2D4%P=yhvSXa!ZX>HDj&ZsNQQ4s0Z4>w2=| z*-9$|ULeWP-mQTu4w6s}?RncW%G2Jk0XC~xCfcJ~CZl$^4N^EbF0+`2EfSy4ZWHew z-a@%VoCcWR>4uhw%S}sU)1eK^4{ai0n}cW}X`TP8*yen_-eUL;Y@;lI zILV-5o99h2+cxwvm#6 zM5}#NY@@6&0^7)?MA!yrY606MyIq*2gV<(h0EhL+|0Zk`NCUPRk_#OTwoxuJ0mDFE zgvB*FwyCRwENKYa90ax@Yl$3|9}XUhZNPz%+Dg()V&ne}rZGe22TbF3#4(Msa3rR& znrGSVvw&%whIw-(ra8!Lv6|sLHNrAPzey64qgJ>lN{(vvgK*3Sw--+JCL~x42JP#I z*J_U)n9;Quo9@jCs~zUiYSjdIL^x*Y2pkh25{=WYVu;Mx+88n+H5QoVK`mDHh+N9% zQM3I=u#OEH85QdcE|w&(&CcIFyv?I86_0_I%As8#v5pEm2T?oiCEgZ|j zkvc}{FgpdpLeQ6wKtCij9f^LvgCrXj{q%p&5`p`PL+9O*7sz34g^CZdyyKY>a!}YU z!@jVNoeeJN8jBZphj_}?#Qr_Y{=(j4U+@I(;AuRcSMer36=%|~~=kbj?D|9{8SjCZs34q}`{zU;6~)Y+l`3-O0MGy7P3G>2B72s*6Ij z=G8xFxXG~J@POf2!(R;V8NM)boDrC0%rTZ3#~LRXXBt--Pcyz}{K7Qbbf@Vd)3c_( znBFseVdmzg=5H)|s4V=Jxt8UY<1D9H&bC})xz%!q<#(26EU#GJwR~58)ECog(^}KI)0U>)o}QSVonD$gCVhPRmFfRT|0+Y9;mk$h zl!`eO_f|Ys@qESW6(3X_tkhJVSh=(EqROi)->Ces^2@4(Do0gjRZ&%4Ra@26s`*tL zs?MtVan)5-w^RqK%d5v#PpqC*y{LL^^~u#csxPmO)Yxja*IZC@Ma`a?hihK0T~d2r zU2@&Vx(Di>tou{l+jXDReOqs+_tbBx-(7!I{VnzPH$2tw=Z3#EeA*BlV;ytrn9s+~ z9{a~}SC6}O+5U5;k7?Z0xUKR0#>>O@aB4U&Tp13BJHtKUCE@kq zGsFJ~f7PUIN@<$jbY0V)rhA(nYx-kzZu64n_05}`cQ#+te0B4!&382auKAf3drN9d zUQ1<5xMfDm(=9KzywmbotI}#~O=-<-t!Qm*ozyzFb$RP?t*5n~-FivuHLbsHy}R|1 z*5_JZYwK-W+TPIK(f+6Qx7$DINa$GIaiHU`L&dw=?p>A#$jKI7sU*Uk9rjL&AypSgPGDKmG^{OQaaXC9dO z@XSBX{OiomW{FvjS^iliv&PMuJZs~u?XxbLb?xl**&VZ2&%R{#=RLVS=k@%vckCS9 zoW?oN&mA{+;@lJF{$}pq=XvKf%)4aXXY-5ZFQ0$${D zxM1IccNZov3@$8RIBwxF3$IxC^zeUuWBc~>AG_$j#T%A1EO~rs{?dDwRV}-IdBO6% zE1WC#ubO*|{g`WyiLPF{#=Pd5HTSG}b#3O_v1@m&eRJ)<*0rtMx$g1x=Jk`;-?;wX zW0Q`Zcu8t($&(;*=BLIO(*L zo;f-3x8I#XA`;6zeHg7$B>-}5b-{##mb=wKsuH5$Ewr{r=ZSUXy zv+XaRnR{l}nfIJ|a7Xcu<9FP9mhPX?Jy}8q}vv%i_o#*bnc;{6+Z`|eG zm9Z;tSJ|%mT`jvhcg@_jVAt|pckg!XzT#}(*~`w}cTUkcSDy3fxf9QQ?z}1IU4Gu* z&R=o-Dj|?O8ajIOagz}$9 z{f-p=$!06?J`Sn>?05ijo~?#~H#i&k7s9IuU#fvk#IwnWzm01Nu5Ti|g}6z^+Xuej z2(WFPEki2G??)WhLjxoSY8uYCRwf`H0`-w5U%kryqCOiIl*fnNe}i`YF9;eB>TxFO zMS<$`D_p-TtYjf^v>}4B{)RGV!SM7*;dwR<Ml>w)6PKt-2 zGG*BL9Ne`uh4i5o`La4!Y3_=M)DZ=ToP>Jhl2=freBhdX)gs}({WB0XuGs{AljgW_siI9d+gb+l? zLC8R$^#3RM*e?e*D%Sybsv(m<$WnOnz~}63)*#GmDqUs#*XmWqd$98m>HO}2Z$UdH z^6OX=c_t5kJ0Wmm_G?@9tD)KiMKH~ z1z66NYpQ@Bdss7#iyR*oeG6LtO2(oGa0NX)kcfbjETeD4!V|d1VZTvaVPVS#l45a6 zFGE;~P=hoo2lVrR8}UEJ@*qFGGx&|C@f@~s15oe`mj5{J4=o>~M&BDK!+e>q2GEHi z(1RgHX%{1$j&Ncu3`-k0h%^gAICiz++82Ab9aoeC>nB;xz(IWH@z}pNqV(^HL+>$p zK!hrvMX!R}sFLV`f#VXeK}Sxi!5{GzMzM%r0ErY6yV1Wmp-H_0R+n=qKFQ^j`sXJO zLzb!DPgy#92D_g@$*+Dx)5u+Z#xah_^p1D{7e9n|C>VjRZW86mt44?Vvp=xYnO1Tt z7Dk=}x9~E)g`dwaMQtnaiPdB97(tYV^>6z&{>4oVf={4yM=@ZhYr_W7anZ7Rll=L&x z&rknx`X!LseCap&?S79x*`Myu@(2B;{tAD+ztz9qf0BQf|L6W|{Wth;^8eDm*T3I? zm;YW^*n2axGJ~1LSt3iDWy^AAc_6Dv&nnCspVgPOH0SpR;Q|Ae7xZUA>q~Kh+10#K zw&`mAYyLa5>2Lh+{40?w3Ph=F)7=6)+Qmzdj%(2-2ig=+f`_$9pKeZfr>Ca-A#*B7 zFHWycuTO7I?@XVQz94;d`ibeMr=OR8p={IDejVE6^e6gL{eIb|a(|s{(?(QoL{Cm)*JN@^JXj1~($9?LY#<->ko+6SQ?IeRr07c{ z?hg#yKJcr78wRc)`1!z916M>>MCU|jMq8rc;kk|+f6MhIRxM+1PDPMB?VEu&H@z;uYBXGH_m?Jgg17)el=sSpO0`n!sgf4zdq&l zQpR3+*>HpQi`Ytd3UBfUl`;^<2-zk4ko>%^^e60LagT+Sg;<^{VcOcxOx&QFe z=qa8>H2d(oPjmb59GY8^77J>+=K8_s@c)Bz+B(H1agDf9Ocis)T+t%V7UM;qm@KA? z4lzw!2>(Gp5>vzts740nXfD=X2hQ2+Vl&ucwiKRAk7dU}^YC+a4ZD`z%I?G(f04Ze zxce%5SM-Qhti#*k@AEVE4{pK%a4w$A%XtN_=Z(CJPvbNB0^Y}u;pg!S_>ZKl`j?pZ z5Aomg$N3+{Eb(hGTU;X6!&~`Au|u37c8Z9&S$raH!Kzp+E)|Q!t>O#uEAbPoj#}}7 z__?@Aw26;IHUC;H5ltd2nnf3ER1=t)rNTNi8D5P7@P$;$s^E`jKAQ=Pzh0KlPG#q? z)7Tm83bs?6%PwP&um{+0*+c9#_6zvv;OryzFRo`%Xc`RM1}S?A&)`8m0kZZM-p1X0 z6+elu=4<&be!Mu3pT+m_UjZuZ1zb9xKLr{A4s6)RED5+OlUsnd9H4)kpn0sI6Fsbu zds(xD)v0VO&t+{Kc#fxm4z6YscqQZowXBoZuxWfO>*ft?5uXBB--*+xn^`}f%;xei zTf(QZWqdlH!B&FGJBIhLRoDf$n)kBxaCLM%DDh2v2|EFv%onkfp_0FtZv$>w!!F`y z0P36zKNJ_T8~8=+dcfpg^2^v>eihrpuVlaGSFn5djqGlI1G|e~&;AG+=~;dsdyxN{ zJQ@kPmCf*hwi+_ms#9QJW z@mKM#_)vT*{w4k?4vNpk-4a9mR{TypAnp=(iigC5;$Cq-%jR|#;yzHRiP*_l%vyL6 ztK{iy3a?|+`8YO}k709oJE*!jY#pD+Hh{`IkuPN@@nvi?U&(&Pce5)&wOz{3WS8*m z>?VFOyMDVXm1os*AM4w}?!WZx~@hK?% zJWvG%teuy#Y7RX+&ti2v!0LgaYj`GG08U^YwqTvjPh{uvli60jj&0}1vNQPxwu2wX zw(<4sd{E>+f@`V^`DyIO{B(8!Kb1YqZ)1=0{p|OkP@lk#!zcM&IQ9H)_Bg+T{S~nO zEpQoc^FOe6`14|oSSOAZYsCh!K+G5O#6qz`tQ5<|UU8df7pI6V;zV(hI8|&Do5h*p zG;zAvE`BP0Cax0ah+X1pagq3OgoXSOHnXR#*YBTn2eVF{6wywf(-WyoiRAV6E%Wc5 z*%J{t{delo=*5czi&8Q(Bdj;VS^}+m0k2#7nu{Vl6!G^hD~gDae~CYGe|JO^oU<1` z?ONIvw?(vVJ(&?Dr+3=ip3FdI%I+S2q`MnQ;ocN~q?Tf}y}kZDYVQ6ekvt^D?);Hb zdR|I7@9*yMqc*$y{Sjk#PajhJ^vp=HYKm3&rQn>*-joP0?ClLiSa;9T-rk~!67skC zBbuCk)GVQ;yC;$mXpU$D&1gq&g!dIiG@$_MFZAEpVr$G=*{f)N5a#4@GOOz7W;ltBq0>hwG{3Jy(N1} zi`zhR06iXP?vIE?%OZR+Y7t2&D2nJpeyXaeW$_&vwg_2J*>GPkW$9~`Rn>>~>P)Pq zt+^m`uBoYf2=`(nl$`FK zJv5QgS$ok`C0r1F0j2>Ieh4hcQrkhxTacniAThqibqtkDjh+p*;q==7-P= zYQIOcedytUzc|9@(*h}q6byUl9ejAK`mk`=!{Fe<4eG=65Q|s}|Bd!#pnd76mmlq; zYbM%9*DSP;t^u@Zr>w&|e!Mi1?j3Fb#_$rGrDuy^)fFJqg^?)&oFB z16Ve^XAXZ{9`aYo`c@zxZ#x_s0LYA5JxXU@(5Luo9T%wGQ_elqxJq;YYCP&YeOML! zwMCJtP_b`JQKb6&vSJ1=M)n$v3G?Roi~Sw6^3j(QcJJ;8bO6%y07U?@0vuFx?s20_ zYXPFX5j(PJ05x-DwuqsnaOv*ifZso6H_EFUnZ;kMmKD+9CFJx+`Uq%*r}o??{E9#2 zHW5^kdz%T6>H(ASU3@vvjwOs?9l0I>Jb0msH$+R{60EM4{w08AqNP6t@xERFfJ5Ku zN3{Un1MU5_DFJ+;9qq$Keg)-?@)1;oAg%^b0)vo%nFR!KNKH^;KVHs}mB25M7JxaM?bWy|Lqlg~R!tZYnbkIj>^v1-W$;QNbn9b-Z_KyL|rP>QM z5rqy7fi?$s6YyvdyQ_nD_>Aid#6}ABEsBhde@*s&Y^eH(1UR(G@!=f@Kv7J+*dDRB z^mL~HW%|eT7VjzMZYB(pbG$2P#$+QN80wBxR>Fq1}!dLq`6!A5tW(H?bygWSMcb`?h| zv7W~tA$wFNv|h@` zDQynrld-v!PsZj^J{g-&-)up)1@ujdETnHzq>sKyk$%e4j>sa)Ly^UlhayWT4@H*B zdNm`qOxBBH%VoVNwnEm6Vk>36D7H%0i(<#fdQoh(tQW=BppWYZ2XL*ti;TmAb!xN` z(e>2nlr0j*-LXKUh*F*nYLxOEC-cw)%CiwKHw>0~yu6cdoS;VOjZJElvY&`@8q^|B zQlpgNWHm||PC?!=gXL|Oce1=w)hK1(qDCqEX?SytTHfhulro&5Mk&Kqx*Myxg$M)XS~N_O{&aWqXk(ZLKo zIt`Q|KM&YUWq;Q1VY=ph9Tgc0E1>9sdVNsu)GK=Ru2oyAP1VXfWAi=M`wjPN?uU5Q zfTxz`dstZhllKa1-IL9CP6dI#vuBU8q;*e_?(Wi`4hz%p&c&c|k%f*tJupU}r+4cW zbHN>a;LM2TT;Sc-+Y**ww`40S`8|KrAjxfEEhP695A$~*1Mko@Mn4pfVISVZ{Ih{C z)qCWU`5=3se1qxymVs}E-^cS|?_TnV@*d{i5&0OH#bqQ}))-JjlGmwm4*3u~Fv)ZQ z()NN_9Da(~m9e-65~OEh@dQYcK8VG&ES0>j$ak%f6l9@g>)3jB65GI5LPE9z5)VJh zDTVjUO2lR$Wht&xVBfhGIW{7aS(8gFcXtfUxqp??j?wG+8L$%(Za2ep4lMbvcq21 z$z5zQce7tXzTsgxEC~7203>N%?t|Pf!wJT(y}&K2etDKJ|0rWiF^|8gq-h9R?4S9Gt|YqVdFcE zq-igYsMcz=aV=xcr|v@WOd z(_ve@6%xc6zMY@RcR=E~lkZ}+kO=OEgz#*(0+P5FV10ZZ`m6 z_^texkgWb1veiA1aqi`}LDIUP-wuh?YJLY~Qmgn~{BC{^WP@uVqg(^Y=5JUVW>1te z$m;Ir4?ud^0m-i)6QOMmkNU8G^{7L9to@U4KXCTu$mj8i2$Dika z5MD}xN zOivZb(21pjo1f19fptDpq~Tne4B;1}?Tb--ul3&hnvYDrCE$JqtS0&1$6(F>F2zXLtZI#`WxH>`F))H;CiJMs_(Q{BB75z0AiF zSrTA$3QHBoLvOH2${SCH_*52d&2i z(0g1cehf+EPsGL0L0k&?M(d?Ps^M1MGLuaQqsYk3CX;x{qxa``Nur2hGX>c0K!-xC7GbyQDn( zUg!sZBkl)YJySdgUk8wG1DkyW-NPNgA?LG9XmNhRE@D4sHvku03-9O`vMZobd;~g= zpR()3qwG>($cNdT;xQJ0WO*msfqe(Np&i)<2V(Dv-?OdkLGieFf;EXJ#Z%&G@r-y@ z`~jzhJum(!UJx&em&BjMpT*1K74aAGs(4MjF5ZAF{w+w~--bN?9mwF{6Mq-)Ls#=5 zB=a9ZKK}`1@}EH-{{`go|AJ)xOYxQXT6}}k0it36noiEnWiLao@GA65=do9SU0;I- ztkp1Ye$BGgOHVYmELpd)fAQj_Yd6X- zl(kf9TNn4EAY3-A>zAozZKbh#mCE*%mbFxA+hjAfZ8Ec3yYg6V%VN2kW36wAwWcLj z>y}vSTV$(I`$}Wmh-#FzHOGo-jyJqo*A{D_Y(-hD$g)aZo7!NtqncZ^9kNEIj-f`H zI~K27v!-8drm^FYPnDNy#xLsMpuS(;WEwy8Vl1svJ7I84QQKJ6%Hyq*RV-_3k?DBe zq?-_{>IAiF+6fz1u3oa#G;ye8^Q2)_lD${fQlssZRXy zI#qS5s_W5o9V84l^ z&C1-K+F5nWCJj4fAzOl}xjWU-2Bw8>~}kF5xD2X8Awd-mQ~up+1Bb{kQL z6`(z1J-OmYEmO5tgtgqXpm2pL#|10Iro>igX*LhqcN z=kyJ%>07+0E!G)mhN946IJPv|d#%0K*?WWBsYOOPs*A;eJ?R8p9+?lh)o!y}VRMVVTlhaFlO_0J^S5Oi#y;h(aO%MV%#=13~ zvF;F6t)*(Q$!@jcwOa97ZL(WUvNJUe@$Mi#s}Y;hmTXF!3cJJQpw_aiZ7A#>VRAL< znoL7;tVbnE^yE@i(i5r<@t(XWGqurmIn&#cSeFZEWXd$edV@?wxmLtXM{%#_`toH9 z4PmRbUad+2WlLeN6~5OR;ohLw)@16M66Fxn+Ar42M0E->yGssUi~3nhE2UKg7r<2 z?!YQ%%~x}5AW#HW*=B2-jj_#UZ<}S&W+cj(!b54bd0Lk(4z{?ob`%Wc>_wZEyFJUz zQnlGa)n1z%IMQBFFbBfrq``)6(73S5Es236tg_`?ZwhrL(-s>vnjSRT8O+lTrp}7q zV3Sgtjiw_u6slB>Rs)SqiJ?#q59RU0DqDVymQQ1IbXctLunHhK!e=~1VF(kQs=k1VSaYIF<6wMj3t=Bj zcIrc1+X@9I0C=~U2}cGg}pr+JI#}6z-sDRT8kJLXz-)} z!vjNW^{M#E?!f_lR06>l4PRj}@!@qCL-j0PJFt1sLcNz8T+vYP=M@znV#w2P!0z6j zb;E|Rzt=`2qR?^Heh7E10o=8f=dR_8yY^zZYyIJ_y#el84!LW8hI_M-xvPI*qspv+ z$Si=BSwJJRfkbAd6PcCH$gH4|SqW8Ug;X#7n>P+>912Jr0@yeNG;tV6;!rw?L+MN$ z3Ys{SP~#BD=%q>ZQd84n8n2ob)eFy7FHKf2O;#^WRxeFfFHKf2P0i^|-GjXYT{4`b z1J(tbk@h1K%A$PT1w6YD! zH3NME{TnG!!<~a)h;|M1_e9$_4-S~{CM67s+M<2EgIXd9WSO^U+lFUjY*Y6T;cXaO zI$G2<=+U1v!(cHP2YvqVA2GhQB~a4Op8oYRS}?P9(w!zGGg8S~nVyy5jDkVY&sw z-CZU`ZDVX>Z$IWKHq^alpkJ{ybvDs;HBH4@n`t^$7poN$NJ2u>lGJuWFmpQlR06Oj zNYIJ?M*WO}4LYiZzah8K0F&9AAeYY>|&$(ysLbEw-sH0eWWkWlj&q&7_25`M^p zA6ml?jp2s{`cN9AKI~Vo59K5D5ccl~J@9FzoY1uim3jbJ^nJ8>WKeghrv>~J50&Qm&>SCKg4 zyuZKP@!C2TEq6-$I*0ptR~eOPkwSK4cs%8vV83&UaW{4jZgA#Ucf-aF zPW?u8HLQulg^SF&Mc_ner!-PIC0^fHzqNt0(v>dmG1D`#Phy(5)%`jtFGGTZ`hUWI z+rQ8My%YBz@o)6^LZABy&+P96-U82dPUnh{su4ebpKt@!?Eg_b`~&(F(8!Z7>uL)? zDaSnjSBU*>_y>G>8u9aY`TN5NpIt)!K9QgMD_l?bFOdevXE%ZWFi-bosr_B>7V5jf zwED7R=sqa8+g~AH6L{bMKHoHW18$=KByKj{6TlTH*C!}7X91n$|IYuj{|tQCjbVPo z_pme3f7-v5=Uf{0`0x5Vi0u)sf8q;!JCGxT{tB5DlboN%d;M1SKJr$dGIfr34khSZ z-s%_fR{wm;(L!$_rS1an0x*j``GOFKPq24vnYRqe3%v`SxV-1bmt!R0u#%mHCA{yy z1ou+!QryeD)!^57YuNVC<#jm)y!Gz}UhAy|?(sN8jv0UrPATvI`+&dVeFggKz3bup zL*AMvct`#tcCFp%-AU@b^c_-y(%UK1o~AQ`Chv2m`1kld6LpXO=(2aSfpu;Xd0uM#sW=ap{6mWX^dzZJx!ylX>>J>uBOq`v_v!&5lw}s zsfelMoF2~m_n1>2@k-{EtxnyRzKOcIR_omy-plV{J~8~i*v*rkCxqiX*ORjskUiAOj`2*KWTz}-+#kHI3 zWv)MQy~6cpE{Us|xDv!Qm$*(LE_Q3Ml7Atyt9*r-xEhqI392GXH5ICqJP&@Kgz}S6c0&0{C>KJ>SI8;%6DZfMlbgN?0V4A@+gK1XG zG%!VAiog^FG$(^O8O+Jlqm}TvgzHjDvT&^flk*qMtWmjU2$dmJMtLmdX(>-j(L;t* zew*t%T;JvT9v60mdDS9zAQZ6!p~yYR^)3=cyjK4(aYVd3{lm&>E}Z7VX)cp7OPC*D zs=H0PXn#0WizmmKU^SlA<;iI1ruG3xeVXF9h0cK{yv{z_c0uTg0@Nc=>^OgO){F zn@XNIhaQU?QL8WQ&0f=fWqEKf^gjUi4t|HRyhd7NfsgD5j9Z&N1Gp+1%1UfoCBgbT ziQ#oD2AjNy<9$gRCC2gpQ}WG!89s4h`4iZ=%6mWhx}Qthq6tt4z5PiG0sej4cA204?KBNC~?WMnGbP9vb(Tzui-*kVsN@98q zqUATZ4)}lMe@HC8{}<9UiyV`ZCAoM|dK0R_Y-{Q`v;F7s`5*o({JIpO z{O4#%68?`Vjfb2wC~*(?&*vnh^kwxbIy1eD$AR|I7C)X%gZ~#o6pF9tP(lRx3#H|z z+80=3(o_KNqU^}pqtk(3^mjXx{NM023H}ezhQ;YMO1k&@KS9=glrQNO9MqhOkV0Q{ ztQ3c}tfhI{M~qR)VI(@pthvN!eg_F}cBl$cf3{4}$ASMrjo~kZlk`M1yrkMEPB0Q$ z!mFVaW z<{+D_F^kZ5sw55B9#$MKmDV;mtaY)!K)2Fk)t}bs1Llc3nFNVVLCX*OPtkipH)v-k zsXajXeA)kv|Dg0B!R(~JHyyp~)Dl)n%B4)btMyuRAoY8n{|C}4R!VHmVfelQ&)1-p zoRl0DYnGK+?2F`48Mq{Rl$sHD%Fyu+_eB+7^jJ@Sxa#u{ibTxjd|>hJr(WD=AUBa*C&AI@K0lTJD@y=f0VUG zi_zH{r;EDQ?X0Do^zbicmESrry~tFoG8L;#g~;^3;j@*0gdMj3iuB*&KY0;^6l%)Tn)0-!yin5|*EGjTUpw+occ$3XN=iIUiHnq5fkh@yrHQBdJXiE9;ALA;Nm+p)UHao zQ$EK2O~>~nsdHFSONX@=i+1F1g4zqQrMVW9hpctY3ou=4V_<``zJksFX?yqtHeiQZ z$E+M;&31@okW}V=*tEUa#y^N3*lfRLAJ*UjdI5Xs8HM7&y1e2)g~g)X;5UJBxL885 ze2-z*B#v+oq>>TzW9aVzu00YD+;-6`_@lP8(q9z(5iNo84)xsZbN+3%e=qUfi=<-j zUQkzBv3qIX#bQgVY=5Ni9@`e6Z~r-bcO!WOUD4WSsj_!z3$a6S#_kiL+~J&{nv?X+ zrbXQWhM(Mthw-MCceeX6hIeJ`24{NryUI;8UE5+K}%YemlrPOkz)N&Q6)_JD2wcF^UhNNNi`0m_)=(cF5gozomcAaX?jCGR zf>KOdFBG9)9Xz$q>2&z7$r~lyv#=|ZDUli4Dt^?WQhKMR1(zOimO~sX#z;zO9s_z> z`+d^4lq*Xm9QM$ADMW((Sh^3iP9FsKHWD#1(i-)y>AN~j!Y%madKO~oJ{8~%P!N9h z-y|N!61cBnNqF;jWbFed@{4}rI<}D7>SH%{qaWVUp`W~Wj^P;c;cyDo?-X45_UEaj z?E_~n=haO^j#I(Tc4jgfWb`9Bh+mPUT*Cy8^o+0^GSbL2+#7HZf@31 zVh`yL($|d8hfN@rjBfYq$nG%dVytA`Y$)`7kn)hkr56pQq;?niW_pKWVU2#ISNNt| zPJ$|B7XT~%&t~oad}{V0*4Qs+-S$dW*e|6X_pm~{mtMrBTJ!#0YuGNWVY{(H)o|h6 zo$NK>{k+(XLO539rr=uu-x~0>Sdv1uB%WH55-iEtgp&A5G`^_DSD^95WUW5F8(2?Y z$a?y}hXZTsfpd1FIAk{>f!+8C-0tLbh9s-ue+4W(q0*2IDb+NTXc|g14JB$xrAJnw z(pRa~OR208l{KYSuS)G*m0G$gwQ*Hy*NjE0Qpt=hORFubQkmi^L77TWu2!r}t=L4B zBc)a>qE@U*tyoN3rDUiVmTPCucPh0PX5KYV&|a8nVTwa7jOm3P`3BbX!p48gToiiC zY+74n#S@SPFj*IBab21<$>ZiOJNYaBUqqM~-f%~y;(*G({n{beKGK{6N zB{aB8ABXuAV)zj&yIJ5|Af~ZHS;@jY+7X0RHiiLO>0UkYz>h1Gj7^UEptU$<`UYgNoqMuYHz=k zx7tg1D=V`Z6SbTrwYQ(po=ma!_KUT*U#z|Tg!bx_T9T65V@YU#exkOGb(1|P7NTz zrSouSro4)4H4cHgJ~lKbFGT%u@asUn`N~hAMG7qg`m{n92N1fdxVGZU6<-ytRdfZA z!CgJVHy^hN-^(>bj_xLKTQ!bb0_Y*29g6!7&}|9{?$JC*%kG%CI|y-?`i??ZSzhsG z<)n(kyf_A`c=e;9iYJebZcKjf1aT-N{Kl4`Viz`Hl1dL$@v1`4kAlnj2GE!iTm)Jk zK#c*E!<`l2@*XxqrJsUM8se6(D$bc2CZgMm~Q zS9KaG+AgtGH3m?CBOQ|RM^cX~bbkOD+@=w}dAKUtnX1JaBA`n>ONdt_w$w{mNHzJP z-~>v?vrsAzr@9{#m)Zlrx0JKwQ661-MtXKSovu%xsnFD;fXWDQG<3pwG`cxK90n48 z<48ct)0*-bKvNYe8wHp14MAf_kdrD;7Uiz7BYelleVGtnRW1VE5A*!ZxDHnxi2Dq`I@{b+jG(w!EoCT^G6KV|T zTB^>iTC8-Rty){PDuDXNgqA}$wy$tG8sGmqE=MEtxKi=Pzt6u&Tu$}Cl{ban?eZ4N z?Td8czNL6sg$}Hk<%+ph-M>-%wStexN-j6@zQQjkyqlHNt~GCGmF!6Tuvtv$!93H%E$n4 zrH1;Va;p?dPO>2sr<6-vry5szo~nGN2_H@o6PjV+;0y^jPG^GN8CDL54IDuaV2F`5 zR}xCj&T&~2EfU_UGTbVZto#C_=kvJkG{sNTc&91lG>tc<_>|&P2BW?kRq~XkB_*-2 zeqJR1z54!MVOi@-sugC29C((%NCoUXsWK01DxOsQE#AxE4{7T5D$OCq?^T*ZO3%zQ zG+&EM!F^8gU-Pa4-li#iQ&T!gWuBz*PEwg=Zoze*SD7cN%>P$?W&XzH-M>iwZ38QP zMB#|yuTyTGffdhO7BR}YLYIjkg_Xupn#%;wX+%mtZ)pw@)&eTx*)pw?b1;K2n zgfVj^Q-Mxng}cj2l85A6B2FdJ{Y_4ReU_&fp{hfdtZ+5YuD=mj-sj7wYf6GY803hN zWE0c<__(YKna})7Q7|jBlUQUQ)dbx^F`YAx{>(SRUiaQ)rOZB$6`FFM5vu@eWHxG? z|IM6>Hs)Vf2g(Y;bgXs^%Pz6$__;c_ zQ7eT)|0Lf6tD*;svYPtDRM?3zkE{=rfdptC8=$JVkcr=8k#Df8K%bFStL zvl}gioM1MURVEqdldNa`YtD4*;cUkL&iP>fXekO=TRIIb*D+Uo4rkW=H%h8}8RjdT zHfH1~Vy)G5*2dPe#^zkkqx&>-l*4>=<$6veGZe+l2%kuOZlIo>$7yw+VL#Gl=Ne8R zyV+92nG3IG<$I&EfVt=u%y({J&*I-WH#q<7e4~?XzmXe{$CVwekz0<-U9)jh&<$>;P=zB+Z+>XCq&VJQ6ME z&qwI(|J>+B(d(jJ(LvmsqR$shE;y@TdBN=kPZvBLYb3nzC?bZNopW_v%m3pWM0yrz z_9ReuxBId=|1)>`r=0yMCx3>{{angPpIhDUbAsndau%nY#7Q4LdkW_YPShO#Tt!Y% zj4r6O1b_wg^H@F-4^5!@BzEd^3M!(1E z@=~vq??ayM)zf!r_uBd1qO5b7qrHZ?x_`W0PH^OVkB7*(`8M~Y7q*QyY&tE_X;|ep zT93=H{KHu78#qf+R{lJPJKsHrzEYLfKny2&N%|<0I79Rd(p~B$@Hv6=L_dKJCIC<7 zOI~x(Mj7xFubDGQXL%EWr*hh84H_y3p2oSOwdkq>cseJLW;naF68J>UBCX>TQ`Xyg z)tpLN&v~Y4G!WtRQ`T;B%I>G=?YN%oXpqtsrA$;KalcK^DWvCYE?He;%4a2%Q)&4P zPS!H<{=aqg<#xBMlUHXhMP+%cO%t28I06{sPhJoAGjYn zud6(=SJ}qwy#w9Mk)heAn+qM$zNaInY4XKdm%g0jz4%M6+^lJS1wg6wpVs$ta?~kO2#CU!@Qh@seaeCf!5%x`cFXVVc zL>rHDZl_R0l>!Yx;nEAehp%lt`q!eYK_T{`1-0V^3)Qcvjgt20sUb6V|lwd!n!DNDP`S!+2-&f$a)EQ0}KpA#I(hYu5u zyNd&^K^Ah)l*MB zxt@}kBuPR1utAxZA_#kcHwn^?p?Wd&4wSpx#d^*{Bud_`t8aMn+A_%$_6C% z*_S2B^Mf@Tn%fRt_wij4TULwqyZ2qN=Sa(WV|c#o{gUMH?7RHZs>R>8td!V>wRrx~ zgGZ(>xP1TLUM;cZw@Z>YHofPPBY+3c|55yQOrL+%!JO@!dnAdKNv!VTa}Mm;@2;4* zLt-tD<9XLP0NC%cb)bI>KBvyP;L%WZlcS$a3{p>h9PkuyFB)=4uilwAfCv{4TrDf78sW=-O>g!$7)74R5o2n{_$3g*@ zg-NcK1{SOi#*@+ZDE@UOJKOF2cTF_esYB_R)&hTbs()*3?DS%HJ3BA;v*&MJyyUjt z-rlL(dMnB=zir8qsb2irQcX} zR#tARsH*6T_f~}4B6TbGckN$USGTRazP!9%l4PlR_HFqd`3b2=DwPgqU8T&T_?g7y z(Xo5nYp1di5CoGf?4YD5Wn(f3q)Hku9lOUn=UI$DE5|d_D*}vHwrsgCl1W6uR(o+n zDjKmR6PcQtYCHYz?C54)?QO9*OIIuMJt2?7ZyC=Wop6RdL7AnTMeeYLC38Wx>5HW{ zx8LQw`|hycW4FjR$2_i?Bmc&ZNwc$J9?D0h1O_Zgiu^pwNqPADb@)pr`0q5h!gTnE ze2=2FPs*nVj{X*UPuAZ99+m&o`%@NxTTJl$cwaEV^W(DWa2l7^K0mI7-m~fNna5>c z0PZlsKc>w?{*eiOu?~Mmhhtoz9}VvuUj^3VIlVoNN1KNtzhZ)Gcvs|CP4Ins|1T4q z)9rx#6MS!@)GXbRbvHAcCFYYAStHyu7R{je&}*#w4qifmyL) zrcrXC#xZJKZfcxeu$`&XEnBj#P*WxmOIO+Lr41I)b~K`rdRO;6s>ef{-DZnMV(o3+ z3|rv4Hiy$!QQO|%Shr%{K2SW4R86`fRx!&VVDhq&dAT_$kw_u-Tkm*;ZFs zneehJutUJP_)b^$OO;ZCv`G3;*0ZQ0q}VLR-Ciy!c4oCG)@fjkNj7YI!kT&8pQaJt z|EGD*89_EsRn^p3)lgO6P!EpaD9jNu;0weR2ss!D$4*ygM<%HhU=meji6wP)OA=+Q zD)+gvvS_rtEcV5D{Ne-dmWsNbp1O(__skVatRfbzsEEcYW*#)+=N``4d!)~1BPGnH zB$?ILQyWt3R>G4-<%%G7#d1ti9L#1_Y||1%jbsP1tk${6dZ(5gWAD^RpeMsJC`pKOo)&TOZh<|!{VY&eReaFv^+n=`eP@Kq;09OJ7jt*VOADY>=K)vid-sRx z-u2DCt=tW1S_?|N>UaYvjsdZYAW~{1t7LOnZ3iTW#Ow}s0Q9Hqz($OWIhoxq?IKc) zl9Xw9hn73QC8A@JELX|nTe2ZZs;|TM)ugIZU5QYK3;Qxfh)Gr_%yOujlU%Yooc{x2 zN%@rD@6COu#9p2I*db5U?YFX9+{Nsam%uxE*d+hscrQ!M46r5ZyL>=nR<3wb49Prs#YU~W5rn}}2PO2C;|KO_XkL!~RJoCH^zmE|&~l zb@(k`IP81<{L6bga}S={H1(BJtZmcXFTKRJZW-LMH{_L%c|*ImEM6ZeS}}NR<_km1 zZ_51=q@JDqgM6v{9jQj@%C%Y@p{weBUWd!uHPw67d*6Fi?^KuH;qdzE zuNrbp-gWr!rze~0y#aT?)tI>RmRs*kG`jG?Ti*mM^O15aR}psQ=j9mJ3Iv>_oPfVb za6YpEKC@Nqdt>)FL69y7v$6<-U>SwhLmH6=v2aMK0YYtzkGE{uB0A}p98R~>;l9Sh z+%BivbyNb|kZecrg;pSFT5>w=yCl0EICHr;_NvA#Oi|=rz-F;bQi{HL`9j?&7OP@8 zdb-}QjSQXn(b->NOf>gwp)px)$~C7OjcIP#6$^H8R`UY3w`6G*S4k^}2m6+0>Z?=9 zXetr&+ROP~hm5t`Rgsbe#c}x(kMV6m)QA1j-MvT#cwxenr@g+Ki~B7BcSYmU&YJRo z$7xf_$|@>?eoxYB_cHs`yN4H`*z1WZYn$Y>C7DPyx$S<3n>ivOpWo$n4BEHdaZUk3 zCQT)@gNiMh7?ebpZ zV_uKj>p3bp>{i)v1nkJ}Q0&u^+wI&1A_aYVJe-cIIQy~e0$mkbH2Pfg&K+89cB}2^ z>H3vyHbb{WsejdR63vdDew=m(l*Tiid3Nm?baqy==5$;V2n41AlN;Bs9v@jb&@U*t zEK}tNEla{?(%7Uu1Qz<&plx=&-R`zc`vTrj_^KcN`E)M-!DYAGF7XGw0spR<8~z-s zFTlB9Fmdk7bk6-O=iD-vo1cW-^g%sn%+^6pa^V;mvocv`J1mT`C>sy>B`Ff}M*~qb z^mN+n(S|moluRbOtAc^*Wbi`B#YaDX-+iBd^dab!KmN3kg(trF#rwKg1FN6;63KAL zYRmsABt>e#caqZ2<)`plkzcgD7r$lvljP4}OmQhAEzK^*NNkMRWmT(jfWxb5jVi{A zir{|86s1#%%JQ-jycSI*p{m4<0-Y~DggTe(5+7@O8!0l$U^{#5#EH*8>I<*(1pMAr zm;fu!{rIlCOMITY?~)&(!H2x8$>;HSS<)Mtxr}C#`)#q;oBO4hjr>V{HkgI1a9OF% zLWX9{XFWS26Q;$i75S75i<{n`-DZM6t-*n%f0F-K!xDR5{vo*U%!aV~5{*nn!R3P9l5}f7* zzD@HQWcR9E8@3e-n{){kV$dZFZL+TXW1VX+)^rD#dDRl1&0KW6=boIiijIEV``p>c3c;fzLLnhDen?d3mn7M#msyGeu6 zK(=p5Pj_c$QgGRnPt_N&rQT6p&~)s1loza)t*{L~XI)TJaD0Yz@A=f(No3emKu1_L zpJK6FIF*4ai>2*yg`hKE1e>RtIjv31W>+)~!3cG5D6N7KN^MO5G}GyB6)Z1Cnu61A zaY1tpGR4D`X|Pd$z~?^zYs~4gI;SPC*Rum!LS!t&0s+eoH?vrxV-DDEwp|eI#Wqb@ zSZ(gl?r_>2P+`xiTadee{tOlp?aycyEe7ptb{hZdGkCQyFqWvo-IC)+L{8ba2Jg)-&vJr0SQQ=9M z!=cuYoV-(V+$*zt?!2eHK^sYdmNX(mOI233VlJJ;jWJHAEIF?s4-d=*gAWKcvb@Uy zg$|w_r&Dv{cCRyd+~*(QVHoyHhWP+OsKo_(E$cobVy+&2 zi4E}I4+Z?zkWaqe8!}AtX@3xNARo$6c!8RwzHDy>#wdBI6q_R3uCX(lWVP6=++9Vk zc36%U3-@fm;fVn?OHIjCDwe5n*h@&e4bnnDn37SxkoDcEslM_B{&?MGOQ%1)X7#Q6 zS6p4=^*9~A&aF$1UjP1U+xBEW?eqJ653xgjPww|6u5fJAT^AWG>rdVK;eQAQ{u^4b zk5-7!f@^iF_-=nm21C{1v`Yp2MH8HMk$}IT!xfGV4gQo|ZRm$~uW0|Q-X7RfXm<(t z%LG>`pD!5n`2y_GfKNUd^v_)84~BfKCHJ&11RA-4e&&A2 z(!LPcKJf8cFppO3>5q$*h5#I^(gQN@*t8r? zv+vjn9byNRw6#f6TW4EmM>~eok_^KSNk2%@Q(dLnymbU|$j!qz z7V{qkx?Fh0D|ylijANBsfKw8N&Zp(aKjH{{wP!B#g^173zRf~>lpFczpJ#mZvp)u0 zSWE)`k_!L7*|()xL;Dw0_{)Gl$}LdQ{zoc&2Jqi2BpC(#nLM0@xO^daQs!_ji2_`{ zD7qw?Ko6f+Xcvkeo)tYvt7k`~&vCp9_$jsLpP>E63?qC_ZQlU+s|NThYWuk}eN~13 z2QU!kyIl1DGQqJ#q-Qcr>LdktK^JoKnZw}#qum4z6$IgCg< zQ!I-v!oFs4xOm*Ksh-x!<4k8#m9dg*Jq|9dGRp$ms=58Ly`Ex&pgnb!NJfb<{!ol@ z_V=@YlwQUdBT{7+c^C|%!WefcBz|RL;t?s7Nm}eNqLPm8?yfE#ZcqnhcZJK#dpg4& ze_+k}3Y*Vcj5xuv73?)%DCo}xwr#P>`0n2WKZ6{f`_LijS{pciKvD8qe0P=9eP3nF zt`LHRapR@$kBz~?5pf{HXJT(B(&;qDRHP;u)G%#ltLWmH1`zv<$!mjdrz>}*AZcHa zUFvYVL+;#X*x{7N9dxjX+$jTJdzKA5g0Q%A&*x5x9jovWCZq#=}Hp9ak4d&x zj`EQ_pa@NX{94BMo~HM(hw+~r#(Np5JKK>e4I}AC!8T@!MWJw*x{WL0fQ0I^6Ri=q z#LtYBPS>V8NEg#0kdVAuCQP@suQlt;4o`x`4_)R4Pq^3NaQpn50)D^$lXkl+;5)%4 zd8jeqVZ{l!8Ul`1*5MCggT21R5^(t(hjOo|I>oOs(rW4OeH8(hLgUnw3#Ld4ldiGC z=~h6wnEzB&F6KWF$^~hg)lwC9VVY*hRXd?uDEL*Q7`J1bVK>Sz2ccK^e(i}yJ+J$q zx&{3q5A!moCnTQ?`AEV9{c=ODD;{SjXI`So5f_Wk{7JUNx$GH{X>JMWB78M@BbVSe zdEefauLHbP+H@igbAmGvilX@tr_?wI#;od5Mkt@65g?{UauSL(W@Z&GSw0sthlw+; zF8Q`R!3iyjUT;cQ9;7{pr;Dbv*(f(N-K4NNrir^f7D>ytYU3_14IHbrr z&BRq&0fi&&1&o-&y~R2v4UdsMV|bi3JTbkf8YyWhm99y1BSnx6d`3Fo=`=BN9nBCe z;jrIVzPKkhCXgL;>d4+sLWcRgE=n8fbw4|rni|e z^t6sS!YIj2fzcmw%u&4V5At!?MSf5VMI!WoxD^h6wu>SW(7OUq1Olajl2`-{eHn^G znP?7HQEcrZ3%ZjLN9>P~anNAwgnbGO)a{)&o< zx{BI#IF-mi^m9v`2v4`ed32mR3PF%|*+7r-;T0gn-5|%m+gIAQDA>>vm6g)ck%1*D zZOZ5V!+AuToI)*@a8rG%E<0|S`IttgCJf#*hf0aM)&S!Ieo7AVotUR;0iTa?0p}Rk z`==c$;6F62P@bxOV1nm&$EzmzKAi%Hn)F@9?GK_tc)|!y_6L3wwHav$`=LNfnt`Du zr;-6qZAth@IeCkpzVpEoV!>wz_0PQgc#p%B;~9CCyiqPjr*wjI&G1aH?Uk zcKPaF(CF6Ta);j)uvT{Wf`M)uu5kF=0c%xm*;>}rGj_!>cF}cfbI)~;%99`7gGpuD z{64qM)wM``YDap8-O-g>yjE7K?z|=UuXo;h*Xo&>Do$OPE#K!KpF_RG`-tiUZ!%Gx zfd)AIG}IDOdq~P!OX6mnT4c?`I+u%SEj50pQXtV4*z?ceajZlZ+>&fJAUw{BfV389 zMW&hsp;jb3QK+@5N|LH-t7?+fc%_{DtB6GNkSi=H&0f(B7yXa!penF_hfuWK1bxn% z`xKktCc;RA-uJ~Xo-jBSdHA(cp8WVNw|oMlBmHdx;|)QzxKb#q zB{pmZP!x}!8>0Kj@Kd$8g<6!8Nwm;IN)X(V4M)NVzQ@AFkz#yjkOIuyuqAy?WY8hP z4j)JuZY2CguF_v#c-7Sxd@tzx`B%R39V^sQI7!dlv-iB*Z~Q^F@1q~dJwsey%;TgK z0~)Ut^C+izP|DT;#CO3k;0zPi0%Lg(*l8MZugz(m3pY+A9+#weWxS%i6ki@qCsU4m zCIN+eRL3~%&uDvyvja*Y`1eaLJM@C)>3d<#x^)|#eO6BF*|K%t%|iF4pV#HSHMD$q zAossQuC3x6tBmqFv$e%su;n*3Wh{~lnDZ;BiKzzU0n#x5D-Sv${Sup2+srY}pJK7N zWMEP9ewa2<-{Q>rT{lgP-?SS_(D{3!iBN8h#-DC>*<8NZj%B(&bnJMQJyF4Y8gHU? z_@jIT^i&P$J9WIAF`jcu1_9_ooN+)9)2b$$B2-6Ah!ai0hh!3D{mDdaCQ+BH>x4(q zo_9J>HX|n%6~$@>CZ-ivKtA+PJ`!{XUDuZ{>-qpWAi}=44qth2M^SC`=v#Mho_eXw z;r0h!T$ITDf+HQ2bzsk?{SHUE`Uy7p;gOZO9}3MCbK)H6GlB!LpQ#!v!AZUe_=`GR z;W*IXPw8-T`yc7>5mWn9I-J^*oD}`Ps>8RL+CNQj@c1TZ#4XUEx_Q2+VnM1X@kT=X zQ3IhcX3Q5w<7B2O!Sh8CC?HFqy-iEk%hW8Gs0Soh$XtK^!m z+ADmvNMhyE#amhl_k2zq_g_|Vf0E-~zzO#RPa-PzBxY)tpJh|X=jG9{l<-HGTO!|v z8G5ip^&U8!_i&PPe>J|w@jAfqI>jDWGfXVVFbSA4OjL*=!^F@g3!epl0gv@ae;={| z?QV*8+Z}ES%Fjtw%_jpo91AC_4lmHloSe=AooN&y5??6;@Gl<`#q#?LjL4L!T3{^Z ztdr#n^>9{`;&J=X#Mr78*}jCDq#E*2(#e@5sAkT3E66Rq=dUI|dsc5hVrqX%Zx1;4bch|u;ZQgE zd)PH32@c6mO1;u2kg%`lav%d;8_I=@Om?W;7UZB=ty)?(+3+^VguKJ(Oj>gZawZLh zgUOvrr#d>4H891>L|}@9G=z!D`ZSS9lACKKnhvi!)r4MVm&?by_GFt@mxp~Grz=*~ zml)fyb@D=AAmAHcy?N8bzTG6?8JoVcvxV*6y1aL5Yb@#uyInqiJTkF-XnD}>4vY-; zuh@4^ZX*dG_SLudPxh>jkRAzM{weVC3Mno1XO{x6q>*Xq-lWJ_cG+RcmLcgUZ^Kqr zBIcN`OeL!EVtF``$~d`qP&hic_;0V~X8<()9%0~6S9f(R*3Q0l>zdIIY~TLD(OUL< z$Mu&l+t%xGJ3QXzqbrVGW6f1s|Mmj;JMe*Ac-PeCJI|{<_IHUU8~_Nr8X9K~-hTc2 zK1>qG25oW`q<@V3<|On(B;nPQ6tu~!6itVm`=lIC3N?q$=mCd^YL)6h>USLOn@%Xd zd}&nunCk$nIPf!4du0~|3IAI}&yJ8s-|z8|Z$D%hUybxPVti#*(ol#T4-nnip_be2 zFy)OSUAPS&^TLlYS&W{%5;am9S#L?CzBzFsMhk{&38ku%sL`7~JGqBuauj)`N1?m~ zuBLR;tJO)$kI=M4R_XV7?6Z|8oO)=+kehrZxNdSkmzyuLZ{jzt&;VbdF4m@Iu{FUm zaX~!AfQEb)n*nOcXR#Te)Hdrg0MJaAZMAydpqe&GX_Af|PDY87CT1^|VUgb6%;Jr& zndKEpnlt~F>{)&RCX$6OMCy_{YIwS0I_1)s1*x3xe88dIK&4_G{R`(PB2-{n)|s0l zj>ZD1iQ8qX%t@N~yKPqCE18hQ3O_|F%;6&@_$eK}%>;j1rHIYoG*`hdTOw6wD`>m& zP?`bDYpa;I zSlT?52lV;>y9r-}Ux61Bez_M*;Dy72X3c-Vm#FJ$f~5y6d1t4_plL{QR#jvm^~ zaAY!;cXx0Y-{2xAMc?n-nQ^?Prb;321-GQhIS#zkFjX-^jQiZMC#>XNu|S6jTXR2B z@X^lv%qKtLciU_;M_eAaTfW(5_4tD`pO7hOzGn81mIOvui<247no1vh@A?2K_D3Tm zUpya<0O)x%TkeBaR#U|{kQk97MxS8ez!tZ_ipn^!w*> z$m8@`o_)p=bh!yEKY_TpW9Eq4<8jMtXYS#@Z+0jils%aFw7eM^MV^^2$vcUn`3(3D z6M3r7%MWl$p9_D%1Sjqz+CO80Q|w2;pCdRhR66@7d9VC!cykwLor&Ur-E!tx7^(V{ zF$)8D;YvhzSW(vuh*2>YmiGodKIiLiVvR!fw|-?0x_!?7`cJ11pMLd+q}v_zu#VhQ z9_XYF*2kKVr4jVxUSUZN$vvBU6k~OO)>dGw#nQ-qMSeRX+9qP-gmuQmR$FT%HbrBQ z`Ju}dUU$I$M^d8SvIpE==WDOY-wr@2&3!BP1lM_bSyqhmDb_)2#mC3j>PNsWaYG>! z=fYnw!D+2T`)5pWvV{cvSsgyY=dZyv**drX=k)f#mtj1wnBc?>MgK3G;KU6C{D%Yw z-ZO9j)mD1S+HnhA0QbuS}+Sz2ZL)5$@-9b8XKH~vJKPWXT60p`C;e7@pS%*k$trq_J;dIGKHV<; z&2bmA+q8V8S~?dES343yAZ%q63s4j*a+s~wO7%!P)LcppDTUg2CQZ5LF;-hENww{@ zZA}gMPB;`Z=`^|L^Z6E?hB#h3k0aYT1esdgw8D9pgeW?}&Y1)y2cl~`npZdVTzhG> zYsu)4QtWhjlgZ8XRU5*)57uX!*_+#UCz`y9t6$CCWC4u8Z5S1NV*TRMD%J*2m%jQqQJe+#|$ zNBuplhM~W=P4Ei+d;VmE^Al=fybmt`f5-rTTdC6fnbF}iUOMSU{p81MeD5J8slS)g z-+PO_V(4$y0DnlS)7m5WVZ`JAX>j?Z34UCM-*1B7r^6r6;TSKdR$C{IUv>Q+GOXW& zdVAnipPwRs+XVkNy`Lvc@XzY-#|h4N%K&>5-`gv#lqRzq{S5ir3_1U!NE#l!q& z%Mv`03eJWrj%k=!{GdB^-m(ugc1Gf0e#2%&2p_8Dy>}_=r!&Z zB_MVSZ6$X=w%3t<_SHE%=OOu5I>sL57_;yl^;2at_(ZidA|bae>yFrwFWShUC#ac` zeT3R$lG8y4i-_G&fN$DMUUs;7sYr?2V|P#E(3ESJkGWixV}6_z6fSoJ{7T_w{qsAh zvLYUm9vw|2VzJRpqZ`*uBt{ae2D8h0d%9W{)z!qRV^uY&x~c%VeT3xag-KN3LR-As zrg^ha2M1vwRqCF8-4M3Qv$1=EzF6o;0EJ){FRrUB-u|~J0ux0sn5i>iZ^~vkz&sm^ z%4>UiYU_G}=f6&+VW>pR^x5&fhj`AS;3JRm)uXuhTS^0`_d#j3bRfI84(>%zvKZ#&5f2!NrXrAsAgX!X#sIVGW;Lv3ppEk1TxtgE+UDB%oPou1_Aws$AWxAkm0KM=}2s7$S^>#c}6-`L<_ zP4d`a?&%HTz0(bYZRhx1@klf_ob6kY8LEc_NeuTDMQjegJ07Xuy{PT#L!sdI-SM!W zO>SAeb~1N(>xy#7l!h+BlavPHNz5r^iVO^ZUf0gPC41zPsFqSI^=5mDT{2aZ5%E;i zj)B)!Q7VxjgJLNf_R7m)1lN{RXuC`*O{X&=Fsk_?Ys|sXpb(e&Osq@yc6IH|_HK@8 zQPSAv-r-G~CdSuq7-w(xT{Jd+Nq>9mAc;!(L-aHE->vPrzH@i(oIYpQu4!mZtt1~o z5A~<1pHfM_KC$}PTbOFSRF_I6Yt(ocX-=d;$9cpQnU&mmDyk%rfCooIq6e1w`v-d# zPY-2Qm4*D|3x*=LdTMfYroF-$w7NXLNa;kz-goin*d^IW#2fXv5sQqSw{ypIER2w< z%M(I1AYh+He3E0Ie4dK@4faJY(fLeBA}|4enBaVd1AK;~dL0!fJb6)5WJ-k?B2$Jo zSy%qC?!7zHnkB%UT1Tb4kW=q0>!=ueGyD3^rjAO!mwB~a$Yq#aun0>2d^Zn9EZ9%> zZ0o2Pdos+6ho`8H%BVE5e5ij}O`SLw9oOop5LvympHYwKFGQj21gNiQIC+}L)a3Mn zqJ7>vdl@p-7l72w<|Xk(8`h6cY}`1GEPLO~r6hF+Tig3D86Uf-uf3I( z_<}Qsrg!Z+XL{$ZL!>p(?0zdhjvUKg>7TN`=1fT}fbwcS)brB{NM5^rh zcp1y5+hRIu=GlU+4avFGI=f&)bGL}|_*+_9dRvy%r<-D#B=-{w#Y7eT@r;%WiIX`Q z$ba&sAVDUd4{6NTWxu`b$l!tQ?gNA8cf=>&Yg1fahvUMAC0=j9>vFGKeApp7y@74@ zn>S31Z(KjYp8oocw=O=keEFfpW9N={$bOg2qtsUyTLUnLEQz)T+3WP%Q#1d)bK`~` zJ2r0G4(B&Xy_Iy`*vIPnNp;@4*PA9v_v|3qRb~d9hwWN#$_j^7WGV#C`e~z zVZw1rtQ>R092Pm_C~j1mJ)@T7QO_1NH{%rcl4ewjz*pihHatkll*bSR7QtVm{RMpJ zXRtZ3QRbkL$mAiP&oerAbKdO%^lnm?NB>>hrF(sDw|C~3bN1nYui;MF*YM*4!%ggwC4=YdOx7hu!LjNv}i3 zUN0~IR#m8G%;tIh8fvJVW%u)I$NUvWT|Rfzq;vfh`kjXj(!JK1u%VZyIZHg4Yt&56 z@AI#MV$#L7WEV|N78gs>ndPiF`yhO?B$_mhDJduh; z5G@EntO-UFkD)fQ*j~i5L)^J>7Dh-R_r_1wL>0dq#m1|LhN@j5mtP65YrEf@=pQ|e zNwWL=1vjz0qOAp5pU>r7z8r~HHb--NELIE#43D7 z-|r*X*IIk>I)gicOB&yMmAuaCdpZ5Rx7dFe`kOVtUnQ@zXb-P*-qwFrhSyo`=cEY^ zud@oj-vlSkQp|&EmMS+V?yJG`-25%fgFHN<{ez}{wE2LH$vj*cZAi;GYl6lY8mDe_{c)Ux0j=?kx& zaNcQNp1imbP9N2K$F69mGT{!ZTGl4z@E4FkPH!;sGgS()wknhaP}Jf!t<}sdko+!h z*v&p+l1ixiu44Hy!ZI+@4BWkvm#v_~!uf%fV3lfq;5^w%7!dh^*thCr=cWhh*@3&R z={Yd8>u?~*)+k%oHuhFVTrLm9?YfQj+*9({3ijsvE*rn3@2Ydd!EJluIHOL^#@v$0 zwd*&*;FM%kAXtOQaay`SsGmisH7Hqm&WwbzkvK!4R*_aU{ld@r36sK)gd*w#cG433 zv;3$)aYM)k<%us?{-}WJ3`e+*4%@?jYkzggRbG@DxhmxK1;$B_8sD_8q^7(?{$T$= znslh#L0>T7XCEicsd#F?4d<{P1L{GTBGHx9X6WP=i%^_7 zN%ErET<4)Py$DLGjZuFaX|Z<5aKl?#P7#`-_-;dkBne%cyp^!)V&$pxS~l;WoIJ39YHA_e1v^n z)g}o}d`7?@UI6}(368U|YWpWmaN;wfp9f5E;!6VlIKe@IYe9iOf#zQ=9XVcs#04#L zAr9S>CoWia(b3S#Ic4|@KIR$61)pG(K?3KG=coAbd@alp6z*+dVCo4+;4thbq_{8X zUqwL_Ztuh=d)S-b$o-T)vG}UNsnJ>bQ@)XY=6>DOf;r9pN}W@?bnEdJ!@!^0?TMQ-Q_ z<7Oe8#PbFXZPq)QT0nnmXIuGtC)g5Bf8S?!6aCHpl5j@31}gjo@FB`&SUWpnYJWNgb7ajU%($HIONYCPz&f=SVy1hoo? z1GI5Z2+UE7Y`un`(j+q!8Q{bTw6wxv%1y5(qm^3Wt|KIkO9=JOX~XY7XsoX+k3uiS z_qbAalp6@Cx;1V35En&i?tPbDgoKBXL|Wpu;^IgI{}yZdL{kG9`iOk<+eqZyMd3(M zQ6yY6Q=uvls5iupa|#(ltlOs78^Q`RCq+qBJUpi2=fv!&x(;hGQ`BGJ_+hgrW><20 z4okRc3G5Nm&+AOlbc7NEZ3PMtjh2_Twa^$>O_bhW8i&a1>|-zU0o80;2Tv6C9DS#t zLh+rP3RRx`J@DizX^W^oq*uQPiqIkj6=6A}f#w06^MG@xIWW$V=2j?5&tbZnnPZQ$ z?*YB;+#6J3jB1O$<#u_3o)>?W^16f0pFcx0k#FSl+4*B<(BpSLbV~3Gh0)j(Y(2;0 zQ|$ftE#%Diz!$2d2}4aK^0@IDN^|F90P?vQKA*`vqGvS^!AicXPlJyZyYBz1N@m2x zyuqLsTuh*F<`SKY**On}atIoHUhGkl(bAjTw^^#6AR(lxwtHGH~-ZW~ik~D;hXrIuY0|Te@_eR;(IviC})J(t!*ne^^ z`GeVQ;PXUv;`^Q!yBE5^+xQmJZZ6L{tB{+C@_(9!13M49Qli{AD4945swzBrF||+& zF0>YU$VJ$R+H@_io2IfhJ^@h&;y~x z1VB9u=cnf%xR&LV7Gaf%W$FFKShFnxAmVznjnQ8>;3dG(nnZWwW)ulD% zr5%g%7KD!ZM>npwqGk*U=I*6znQlpl73fv-8&B*+PV86sDyk=Z*ZDAkI&>A?DKpk0#4q10e{2QjvJl5TwZ7IXaOL+0rB1%HWSLTb;fCJ&aE#!~Y!C*8Mr_pF6 zPVNoTf3PD=Rg>65t)P)1PA~qFn60HzkxR>38aq|0VPCj#g-$iH+|*f-Y#H?D4i==J zznMcnwC)!GzXCoV7Xm&X7Xr?4q2rErj(|UA!d-s7ziEP#wIkNx2@{;G9Ra6xCN9b8 zoZD*zCoim^1KI}$-|A^v(hLkO`T7lTI-r_KxRET%i+iBL3SBJ6PbM?zsAe(=>tQ!| zCh7~MYU|->wW0ErrJ$o#TTq^4XV1{GswLT2TMZ@r;+jQKHz~38e8B_8hTdF1F~Qf< zQCn?1epTgo|9N6@x4tWOqq?R%ZvG>zoCmQ;L)D~Y32s%RvPm%Qf)07%s!3+T{IjYi zg*o?*VQMuBj$1!b2O3?{9JBje0ZUQ34)f}5it|s!xqoeXq`Gl@)2}x+K2p`lK5;OM z85L!`K9|j2pAesFJgC=iZOA>>#>PU2cAh-AdrxQXc#y9s&6Iou*UzC{;)z6af>um4 zXP^}h=eE6x0(4rrQtcrrYb}Y(a9WY`JcIaLo)2j)H9n+r7m?4PYy)?xN73kI(o}X6 z?$C0$aL=eb>c&s1Z;lcflEr4X9B|^)mO~^mRE~L(ER)YRZEGX9Xxp;3r9E8@tqm=U zn#ehtNTrad>jUK#PSi!Los>2bHhKSkJ}+0#MpZ_=$<#z@^xTr-{lh{84eu*1IXJYP zQgQE7wybZURNUWgw6j)ud?@$b4I8<9Qd4n<`j!m~88x_U>5w7+mc0DABO2eq9$P!R z5{bzaGdJbg(!Fw2bXL}~fUvMtq=4XZRdbrpJLTDuzJPpgeP(QdJlpYcBoVMTwcMWH zbLZo^^mB;PY^QhZI+v%}YGa1&L1RXo|FpTmfA+ZNl+&-!$X;ol>gi zx!Mb*R2@M+^Ek#$?)90E5Q2Z-+ODNHlT$rQDH`YQ+Idj(E^K0N;7s<~<8gz>*9+oM zeKruBY7E5yRDBD^Mo>82m{kdCtu|1hWGYKQsXBR!hwqFif+TEtprT^sa^aiy2I>y` z*c%>Sv7*?gdUG>`T<%%$4Qxi`Iq(V6+>db%bPK+Lyp+>iDvblanQI0D{;&#%70oum zXOdt7u36FDXupYjDFytb+8)-ksl8@B_n`f`GD%6%{t3|@-qCHQ_L|j9Qt}I+fKHwv zUbtcsB$-w*No0t3N*&2eL$Zc6bgGyn{Cmj16=F+=AZeVd>S#e~djxf}EtRIJ~q>jGcmSR{B7tMPYSCwzdl zN`0bMQeQqI`vtx}qKAiBzK1U;IG4yo4;&5&@c^C^-$$(^(iLGnQT7XAbd&5>vwjt1 zq@yyd;bu=2V#r80w8^3v0)GLIk<1`EIm60CSgOBXtt4Y-S`MbDl|=W1ob`z2rO2N} z#UVES_-C(II7QV=jr>7Y(cSW9@2M>!uNs(e~PXF z)!UOtLbRt{B;X^a_NVmrfOG3y>^=@B>zv->9*ei+PQ=!SrT2>1I;sF69YBIoPA&_q z5RU-jkPaLHh7vrdZN|N+r)?ozt3eE5SQ=`@Jy^-=bezgLT8u1E=Zd_N9L~(Bs)u&m zn|oo&fa9kEH5SQsudbk~O17Z0ba8FhvWlkKrp2|HOd`>~Xk-n^p(Fc8Ha65$mX$YV znwQk=T?1C>iGWo)?csQ1O-VB9^Ov{RrrWB^o63_lo7d)=Nwl)34qZOjTi;t7BTaMXq3xcwPycTgDhafR3uFx(j_?%>Kwrt)b zND##Pp|bJlu!~1YgJCKoo5IvlnlWE3hO!b&VbNd&rS@2VC{i{)B61UG`XXPUrM>xNCtMN!bBB#e*pl!gE8>x2^+bF*V^!*m1j_B$jyV|)$Km**JncZ- z+ls3Ut=74-e5aOtz8OPzaG068GtWHG-rCeav&UJNV3=p#X!Fmfye=3YR`v8GL@6*b z%rVkKA>y97csWSWgGTIZCgdD5W9S&6X^X%Tayd8!JRx}y$Nq@GQyP&ziP?C8S*`|B zwXHm=6c7g`qzHnT*Elw>G0&*3o7<_m9h~z#HAJMdcm%1$GXW>klq5oppbxt}q+w30 z7qtN8NCAfjc`XQNEM16(T$^*f13A%78DK-8rd13#C(+&A{^jMe%esOg zqY2p3OGuf(vR*^V1g6&J_t8+7`t1^qWT3z{JVbCX;8JfKwRJ1gII(86p-`92hLjWy@JT}lBva4qyQ|FKjoUhnBYuakg-wzFTFTp`(_pw& zduVWRH@1isS;ifkEME9BZD%GmcLQPTl!01G zP_qi|x4GA7Plm>q6=pXICm*HBLh?+8R!=-N!9I(bQKdl~3gPg#S-;XK;LswUVP&%q zNX~ni{Po!fNR8xeMojOX(%;?2&NuY=G{M2+Rzs72i7W_2LRLX_9Vp*1My8=n=Si<Ev^;bHC(pHjYkBAbPTGfnYx$@G zPM$;o*YZdOoIJ+@uH}*9jwXRY6@E(1=M?S9nyBb0nOI9N_#Kjqtf^a03oa?F~2toYqeCqvhNJw}6wUPQV{C ztwnxKziEP#-7D5e%h45UMBZTm*K%|@Tp>Rm!Sgw~L<`)W6Mj6tngg;6`>Knonfq~` zo~{?dd3s5?j7(~3njU|moog4fFDl3P!ES$KW;`5>VQA`zYa zMk|-!+%RVw;o2=%vW80P>op*H{e^ZEHrEKH#ne&>2z_^<@`H+zM@<+cj0;SeFwT9W z0#h8$eWNO-bjvq5JH!45o|(8*mMvBbanZR8poiayZmz9mu3&`%R_q%gcSt#D4ZA&I z>k~>8m9@V1HTHVIZMWqns6G|@s?FvJhH~e#+psRxvolH(-&P|fvsIajA|KrF2>A1g zS|Z^LCzaA?R6fg4Jxl)I5bgu|JgR58!+-&&rMS zL0yx(Rvnzh6AI@pWgnoAxhvTRiI?$F@_q7c!OP?xE&&9b=w84dGQo*A3HbdcIPEt9 ze~{q7LSpt$>_?!^1#4%CY#V-Da!z8+i8-~iv{QcF-C7Oo{0YA}`w>;k`qG!6Vh5f7 z`~_#w?R9_Vvu@m9=KR7x*Z7bwbn+yAcwJ9E29+}CdH7-e>9Hp<#vu4A(M7RTku5Fq zdqf2^oigCStVKJVaf{Whrg|Gx|vY8>XZJUi!I6hfJ_Fq)gN-@ zPO|nkm9?K-^bLkQAT^e%`L4H{&kYxIc5Luqi;5h46D;tI zglYCH&kK`|W6C2pIk)!=aL>GOZf_E~<6|UM>AdhoqZ60lys+-vKD2xLIlwJ>V}H%( z{zJ@>yvD~lP6V7Z9|3>F2v<K zo=f`V!596X-0`Xo>e~-pnrNd`UaLOg% z?U74h#3N}BqMwr{IPHA_zuyEW+7<8zbU4NfAFl@I_${!059;k{UA6g9K7esNq_v3t zpD@9RCkXiC1Q+pVxdPwYA}y6xW{1mhyQU552$lDdP#IT3oRH4@kcX6xz0f7rLMgFY zHKnArwRLH0Z>Awl^{c2Bv*{LVbNwnhhbw$Bl!ap`TBXO%WW6rvqI&h5yh``JAZ6@Q z>CjK}@Xn_3yq*#;ZUG*c8s!>F6*QEuQLKly1Mv<)_oS-`JUq(rVBzrJs#U7`P(S3Z ztS5j=WuzsIvJ2I{gjL=GW=Z}-4|F!kg0dKHU<%F|TVnOLmyuG_Puq+; z-^%I0kj-MZO&9t$?p83L7lKDAY(6i9dg_`t*5G?nk4Ay+qt#u)1HmI*?CURT% zS*c8U@!}=S9#FH_*-w4$+-e>d{J8PxRMFG{_2`tfKbwAr^4KY#9kfoEe3Iw2;u2}( z1Z`ryocE(LBzv0R;?`VI5fbeOAt$fqKJhH)nIellFDH4vEOhN+ZL58Nwi34Rgv0^;459-9tMcf~w zrM!v=yI#}lM@vw%G~j72Z(344K7`BQ>T5zUY+}*wQg4&HqcdDpET8OIb_Z3jkHt$n zQq}1|I8hmMd68}I_T^@p(g9Z_6h%2LSt`POIx!zN?2Ni>2KE<{s1&wOb0rPS;~vzA z^29x{P=KF7usO|V5OfbbTowDrCk6&quO6sxXsEAiY^Y}+-LQOk{rchM8y0nSz*=r? zryH!Q@x}MR8V%wqV#o1t$fL+D+;N?(P9QarVZPv%7)G^xPtZH_<#L&&EMXT+2$sw} z_$T&(` zg97dN0@N$@<_1x(l=*XSI^a+F7QgfAQrr~&JNBV#{A$@!_5t>O7$SbEhM&75;`K&y zpTsxfB#`_BZdK^SH#X2WQdWp9$*Ddcnt*#b560r^ci<4zW^b2I1cUCUeF5i%8*aSn z>Kiv+=m>b9hH2*h+=g|P>u%q>_qKJ3^=m%g6~OflR893WU&`(|a%9iom;VuFgCB^`N;I%?kOq>gZ zHxR602Y3whXZ*yq8n{=h!+fnUzP>$wwJ;Cg;EJ!`22f}Bej?BJUSf5)gWivLJ>KAT zT|}ckug5Rxp7>c-v(l8QSa9k6v zZ`VeGy$JT)jY8PMH*8==JiW=m^4!I~fa~|2EhB^N+gjWn-0x9)dEbund$P~6 z4H#Kz00-+?c-hY8{^4{j?)M0KY8LI;wCv)QKO_FOz;~`u&5l6^VMjuy}CLmXFx`qq2B~?TRJK?ueJCQ)!Cfe$DGfDp1kj+ za@g-BX2bs5ZVv=<&FpWnUK_Ap32@j}X+?Hu5ucJ4PEmssP?Hf=5yy?KJFsXt`ld!D zuwGcTR;eY`iISHYTqQ$SmvA09f7y`YA}Ef^NNG%)a<fq*x6qHJ9YJJGX$aNxjVb+KyG+g6Y5K&aQt&Vi~2#+mzhRRZg@ z6nr8H8my8UrRCYda@3OIdloX?at&(Cpo)~m3Vm1MI=}gToa$;xs&1@qs7d4X$^=pa z&G+L7eP7Sp;o0^=n(I10yY4{Gl7rcIz5he+T5?3pY1`DU^W*2QSg~d6=-BRE6YRd8 z1B2OvOYZ&5*Pc`-Gx6n*m-em9U9n?geEZJPaU9}c(h%-Piehb|uw`6eGH|nEP1M5% zL6DfZ%^vHa-jO#4#%*>t9!8~bI-@6WY3?J&i3n>U+x+(2R~%svMC?%R!^Dr+$K*$R z9!Fs2XfWtOLgjv9Nzl5a4$w;qxQ+8HS>*V}-9-6diAeL6$%@dhiqreZy%f7Tl}a_F z>eH#3dJr=&jx7`<9IscCqljos*P%+d-7yi3w6j-MzUPW7-m{{=tN-c?FTA?HEB9ZU zH*DBU|JdI9@4uf-?ikp5@Zi?L?V-rjlFj?~Z(cGL*)uvim|eLtn@iq!(@i&$?C1nd zl;vq6DriFGNQe|dp|s&dz16B+nxxS@E9U}s>Miyxt4SzIm zjM@uZw!Fg_mm;Lb$LO%R1Ky9YU*d+Db^I=X_l#RZaMJE0df>VQJOzH_q#ASy0uQC2AjM=-d`gDqaoeuMi2 za-Z<}ozBnQIMmxZkc_&VUSA|N)ik;P-G9ftoqmrSwLwr0X#MrWot-fp2c&u@k;uBy z@tal>)+SI<gPoUJRzS-TimqWY?8HFV zp1wn)5g+Acria=`Hf&x~M;9iPjBOnpXdbMRV|G5d&2`%k^tRu&X<5%E+;187x_sVH zY-N9TIRvtAe4x887Gekv@Of^X=-C<(G`dnwgF4EjO42Lvs+zYTcSQckmgA=*SnZy_18_@?zMTGtkPp)>g1Y%ftz?&0$FO|NzB?(5&v8HsSD zyX8=9a@C5dx>N|7#YSoct>KTjC`pFD;1684PT=ecw1&#F(HfFTcx9WDD4azp0IB#w zS_4<&v=Y(AJbUitV#oG%FW%pG_4{skS88L5auXdT6@B%)&y5{gJ~TPCvSqws=O}cC zg9FeV{^hQ(JsA!2S^0voFMgtY*+}k+o#SIW8z)-EaLq65#TBvxYZa5y*@PRK1BA4u zGGI}7vN{P1DUz-+=mvtw^LK) z@N~~Wcka!p@$o78_x8@6lau(zHg6x;GCjRz0E)ua#XTDrE!x<#cxzn11H zuAQ7Dj;G4hMV#cVPtDs-%UUqDo|hY%ms}#Uzj6hJ?j$9ssw1$3J z%|tdmQj8m^obJ;0vdJA)7m_PXx=(kNV}0Y^AGGJ@)WzD&9* zLGuDITDq(?-R=PuYE({A7hV=2b@TSUZsC9q-$CZ`;ltk|WNxy(lTE_3szuP)|7DNg z@u(x<3Dy4M{qM)Jd$MG8WqmHUo5kUj%)R{>VOZN?i^wzG$P_!MPfd1It#j1x1b%I( zl&V?jsYoyow^xkJ9WJwByEZw5m#ysv4^5GbyZI1*pqps?9OpGn(}tQ#S}_ zyS|Y%y<<~5R#gp_ak8pxjI}KDEz6X(v}9`9T5FkWq_=N;`rt(u6~{R>MIw`1l#0}= zt+ll+tu?i+n2W~w!cre{4N3Hh`TF7i!ef~o0AJ%XGeLBNJuC$c2D^S|TN2Ln_I5Vp zvz-L(1T6PGQBv|7_IarE?%b_@*z0z-zNiRtSmU(9O2=&+nw8E_F`V#>RpI8kxQ;^% zCY35GA~U@baPgP#k)YRCp zsHt%u{`=SNOjloDS524O(~;;{y0jzF>AowSNTf5>iFEFtNAVxgiY5~Ttq3z+qZQR! zH`0h|w&!V{XyqN-6{3|ih=t60L~pon!t8WZ6VkwpjI{E{0%WoT1?Ie{^!_j%KB!8WiP?jr5WiKmXgYx6h?2nMWuX`Nhnh%;} z5N}9+NB!>Pf{!Cqq^jT(yr^cd8bp|M)*_6J7Ls9@V*_Tfj?WRAg_tAD&oRZ~$QS>% z)Gb|pT!@jed!h(!HqP@L%S0mkG{-T{tSE}8<4H5CpVwR$I_B5th9tL9{D|w84SW$6 z$X{9fuwR^!`~j{Kz{WwG#<$DRvdr{=r>%Ip9(gJ#N~As2Fo~!2prt8}XJ}ya-fh6s zb^KlEW9C)ByGiuCg})2!OgvT8HNw*r-d)e1LRXvD^J!=p@2WJ6F+#SXV2A-!dZvJKr_pfsIZKg^_7KCPgait+*XZr%KfR()u zv59~+cXbePV!M1-DBy89W_A$w*gN~WatV4%$c^YGDfgpz6a2LBe+!+Sp1;4q^R)Ur zr9Vf0n&Ex^9Q>!8ozFf4e`C9}J?qA8S=Oi@{6zKFUQ?s_)$^&Ab}oA2ag814(?h!1?FbLNXV~g@2AoU# zoPL+zw)|T7Dty;2xB75pQr}WM@LPx9Be%ifh0Np&?Jk!;c=06xpUdGqY~eub5eEuK z1TVfAIg(DtVJl`c`Nb zsON2^rIB!HY51kmXso0(8l@MdbA6lPaRL-&PGvbAM~=jXmv!pXM^?r`V=yP$|E9kgasf%0kO-csys> z4Nuf%_hAqDihV_q5U*rv6NIj0h&q8eTheBj+d+4j#e#tt3o(}i^w0OeKY3j2KLgQd zFjwL7d_|iPpUFy4?(0~WA_?_^B7T0Dq!8_*Kqq$%6nWx7HR}cAFq5A!)v&W|$*m{9eq%_%6(U6#LI* zV86!wrtK?zA0Z3oPl&yJRDKd}y%yK2QBX`s5s zXVAEuB;8+9PV7**|n}KoZpVv2W5!N z+{gE08~KD_=!y&#Ce1_fw>(HZH6uDTloxYE?x{_0=`}vjg-zDUq6&yQeUxX zwA%p>#-bIiRW-e}ja~XQp<%6HUxC(){6cvhR#(B#$BE3O#npbNt|okHbF_EcEmN1Wn?Ap@-Zb-_nW2`uiN8W^nVTQ zV8;!=gYr&T9shsqeRp77#ntc3-0gi=t7gg4N~^9_@3JJXx@F0hyChf1vfK-}fN92< zW{l}Q^bUcLwJ8BYPeMon0a8c;37tR^AcWq$dcQOG?rJ65VDggheSbXJvv=;?xpSwU zbLO<+KGeC0H3aLDa9A3j4r&}nU+Bp`o!IE)*i~+rr4CO-jZ1hKdtr_dl0>qLh><8Yi&&NoeAHptf4(DV0F;GKT?_ygHo0@@xGQV;%hl9a|E%P75v^V^Hn2#l}ukL(^pbD z<__|+$B`b-(u1k+n@89T>5;7}a`4`Q90K<>1nVO+)EJqcO$NgplgI2(Iyw}G*=_#R zYOF)pTrkIQ)v5H`7I(WP(0$1o$R47 z{P>-$crwF3VJnL-{EzIINq2F#s8Q;mM-Mu1ay-Zwrx7v-7-9(p`yd!%>2-=;I*tPA z1c8K(FsW|{>$)*F}QF9;Nn)jr7vfsc$@hgM02!5TtK0Qfj*CNcwaa#SB`kZECd zib9(`ZLkb#i_Yz5?LLmKWy{i`U~0GI&nj7W?6K=gXXV+fr@NpdmRY2qOFro5Ss%IP znuo3PC_YzTlnMTg%aWIU{RJ1?0D_RlXK-{kPNrE7PIY^*B`pE1a=|5NOsjxzzp+^u zz#3LfZIcAMlzVnj6gtJArBVMF8ASJ zah%R|sc@mmJNF6@a+ z%a94!h%9Kp!k1f}YI>9SYv1ifY<;G6Oe*k$iSIAOF`{sMqb)PzVdeu72k2;YWrQro zQLQpTf-@p>=%^X2Zu|}jjj5vv|#$`Nc(m*9Xb7NIOe!iK|W`03Nxz1ritf{>1 zpZEa&@ko~9 zCjqfeF+xL^4*McT1kTeU_Dh|h33~9PQE1j6aAS5s*wBED(HktCPXU?e2H=4~z zEeIsW7Z?P0nN5a3<;Y56w zd$KxG@=O+sLl_G4^9oG$fob`9(~63w<>8n5r5x+X2l&^{P77L#z&BSnhg~WHDFyV? z={KU|U_V2rE+|HU^+HH+6Ehkk9@#WqYRR}L#w+?$4}OE4cJK?t+6Y?x1vn!$Cr(v! zjD??3%1;&l=j5v9OWy!frPDRxJ9-HKjjM5cE_Tuu`>J*GmX%Ix>RHlUJv@~lP|eCr zyPYg97Szufteg?-8faX<#;k%JrJC z(Na{K>hkzI8^Bg+9X(FeV~0&A@lInGk3WmI#1=h^ca?)pX;V5{rXF-guTxq(5L${DN2*d{2}=M-zU7Qw6|_fn@B^SjYsfk) zeol46lFG^@4b`&~b`f2=i;Pxl9-lFzvt!n*_Majpd^lVST}Qm{Wixx*ZN~=QeJ) z?SKa}czy!}$3cn0%DJ8N6^up+wE@4uN2NV46yx#R!@8$+w6{)etgFfN=fIgVbWNOq z#~RiK6_*>?MAABr#3id>9OjO)A+c-|BgAilhRoZn_Q3kG)w?_ksYB)qF`uprJ*Td! z+(;G{c1z*xlHNh*4U~MV;J4BB#$aK;5Swi)+m+BNHkVzM@svy~$8kYeU8e#3l0g#svCkr~1I-NAUQg^3C41Vh> zalTn)RG@|ZGmvDYF;L@(G#?~NTqF*pQz3j#kJDWSS9Kex=EttcxF8P4o4DMib++NP zl(f~Eae-I-4CvfdULQn7?ct&;NrF{g&!2^=jic>K)Ors1(2x#8Yw?;homumts%HY2buR;|3rE_jS%dIXszL^^_eDvy;MK*C7K?}jQ;oObe?1l<79 z5gUWZ5*lY56!lk!=^~olUhmWv7#6!;b~+vII0s)z+oJG&FT;e=l`uWP-?!P^cCK60 z7#@{|#bx2=oNm}AoN4!vHC_1AUL-r(N=ZYf7VtR$_}s`&4Z2G6gi&t z8I)wMSrc_}2yz8I^9__?ESdAq?c3M3&D>*wqWrB;=Ck=0VL% zCKR!flo1o86HKYvbjT;Fic?lL&N%mH`=tiHB0n^HE#cpDSSSKUe#GhJQt#&rcyg*Q2?W*619-Ae7hRsH2tqt>K9C-Am{emeSB7UxUoSCrY-)f`R# zIpKyT=y20$2icO~!s6`7*sgiuKD4$Z&H`qB9msyr><0aG5@#uTB3{rb&^o}0q}+HS ztr5j&IFVdz02hxPEQ>iGWK(l-7*rl<$HT8_lp-I~kFAOl=aKzglq4TJ#>^eT3VxfT z@R*L?rcR>?Egr(f;&cqTz&gFkq_;S2_i2~H?1ov5PScr0cozgbd>|jPe}}1dUA_(q z0>;{5hsW&#uCUMr-b?)F_!R~w4LKAw(a4M-lWtodCo42+~a{kN4WkgF%#oC zm0cUO*fD%Xn6nWp!b~$aSg>a`=tpc&)mL>mNSPFcCRV?l?zI= zGiV*mP=DPHKoGqPTB}+rFQIAwI)+{p9iWTzbxIf^c<>r-4?Hh?l=>P{?J(+Pi$}lE zZ3Awt0_@(*HUF>kn9&LcY_1*5El3e$2XiPEuxNL9xs53fn=-;rqQiP*X^%{_-94fmh zQG8~P^TNYHH+LMrXauB*%j4X+_5|KV=xIBtNpCMJPYFLdFn4H3aZS%y(N{1loeY=A zyMIyR)Vk?&XBEt@ol^w`7K6()xiYV^v7!ygD(bblf8pCI9pi9s*c9u&nH(c<^PLNO z!*|sA%kvs~G!NG}44^0{JIn29tj%rC&84#d%tmhll;X2opk7pn@HlwBLH4k^AuWc! zHE6N<<@4YLhUwrvM|U!k~?~1R1?a8+u1*v^3BFEMlDz z=Qw4~hD4dttkX3gKfiBii2snFLqib5;db(22^m0x+n3lq!3KKdotz%O{mun*!*`H0 zm-@L55CeM%cBQ5-0C;OP2`KIBM|6ZaKslj%EtW%dZ}zummc4oe`P9yY)l3!iKTx57 z+KX8kHrPPMjlobAK^+WpW29}laz*(4Ke(B|>&>#?WRK0z`t9)z$Dg$JrfU}r+;tr< zmhki>>aUZir$+GO;4OB~x@C(ul=n=(lrWSN6h{~OX)64SRJc{oCbX*t(--XB2w6lc zE;6RrKSegq(ZqNJ7Ip^P; zMb!^-)mE34pm(W@vwbwzn8bTVC4&B<6G|gO4_^72!Yle(WWcwn@uiDs;}HtUUvf91 z#^mqCf5u|7o8Ns`{0v=c3jdY5OYS(XAj0&D=q;ZFJ2ST}{2V8#c$oc(FOvGPhP!cU zHv9__vel}{lc9!3YDi;>u$)~E4c*72hOXgm=r5KYLI>q(huH?@6X>AO1v)6uJsGEi zQp@t7f9Hao5ZV8eW=9{Lexb6fN3e29!l#q^xnxR2y*TE(B0^V;^_N=V_zK~2xvY;l zp=taW;D;9DRe&GPM=9Y^CwOq`BU*K}AgO%33Q}RM?Wz_}WUo67Z}9!}UU()KPiv?E;j*KxPKlaOX4;s3OWr-XS5B(gn5Do?#lBnZT*y?{6R-bs^4adT4kq%2>WE!mbBr>bv~f-H-fCk7dh^qZ`V zCoVZT?&X-yd{j&041bOraJ}K~ER*IX3s{V{w342LW~Igf7>lU0d>r6PKrO#0Hh4@p z&rZoXmB#+^rWfe)k7AR@Vi!5*)6FeSZ$3{o-slzzy5F#fZZ4spO>U<}F)fz&G{aaa z=D7iq{YqF6fyBlvNyIFPiml}wfh7W_V~iMn;GTkP68Dofke$OK{4^jnLe4Il?RWRsGNo&_7{IPPRUwgEt_7JNi+(*ek^JKDdhp7OHh!bUjz;qkIzK#d=>nj_55N~K<~h} ze;)H~o|kI%;;U4JOD~pHxZ>UD$0O|~_*TSfgH?cQa5G6-s)V4x!qefH45QJo1U#B} zLyynLn6JoJn5!C2611~G7fgjl2kn}o*kXL830ggdD%e%{CS&|3v2`w>v@59duAtcE zRySgwAu79!v@O{&@ZkCc*4t%rywAdF=CL&!)F_m z-Z+?79J&Soe~Mr*-Gw?_pAW_ILT;cjeMZAa^dsd-s%Y-slT z!mm~Zjb4j6u_AX@$#FqPi8Y@I@4#6W~7K zt+uxMtoDS2_N@A7?3Jp7gsQYG*tT*Xe$wPEzqY%!wmT1hk?V^&<>guB+1ce3vdYV) zZq6z2zxV?9Xp;fou`O16lXMWPr7mKkifpJR#M|?q52q^b($YEIUYgtPvXa?7aSy;C z$XQk=+InVj@adhU^#>m6>BZ>(@AW$Qzqe+!kkFB~Ya+%&uZ>4UdKBTVW>5rB$;LxA zmm9L{@Lsq50hdi_u_5v6N9b3{{rXR;cG`c?+vv7W9F9-;*(YK12$ek?&7gT31^?C& zzD9Z*y&B_g7;P5i;@3D~6aG!94Z2(m}#7UKEfE?Ngab~@+h1PqY$u4&PRdJY7 zl~2LZeALIUCje?OhPNr1PyjNSzkV=|Xv8s(p~nR+B*t(8LPj=pN%E*SXyTK~6%mZ` zu%WTz3lDmZlj`MB&9Lk{+^b}g0N9nsa2Is555ZoDRV{DQs{nigGrk^{DbLL4ZpS=ZgNsJLQ9XWMWE zgG+`6SXC~QHl8V<&?~^%SQzYs4A!JKm{wyOjq``hdMLd~>rd@yl+NK0V~VH zWFb$etjx7X ziijx)i5Fw3<=Awd?2ffDJ+HriW^aFgZ%tKI4OG^v`R=~H-d+T{si~~28E=HjlQyg) zw<+s3klU2ma~AZ?4u{rL0)CLRV7Bz6Vx&IN{bO98bVDoXsNe>$9&OyBH&|9XxgOf> z)`NQ{&hAmbf?Vb{yOgos>FEguBR$m9*Rx>GtYCL=dPmz~d&~Q8_LeWEN3%2>Lp>V7 zHxxh8UIf1Z-HHAU-=Xy7b8cu_)vSH{H_H1KpIKfu8=kvr*b~xF*fT zNz6Go<{M|FMW8{1=7EMvgr<;GQPjFk70Sz{G6p83b}8X{qLf5r9m%YG;L%kZA3J8} zy^9(amQ^=!kf@8hqv9}NbQuVjYCya+liK{2OW3@IC|uJzL|F0Mc883*X5_D zxuMNNbTSTag>W1Cn(FCHsofxpwFA=ueQIiInrnhZ1%WI-aXz%2m`Z@riqJ?&l~H3% zgxW3jpAjl~ECHk$vDiTkL99tsC9M&02C;>P0$W<9uBe^6Kq)F*(%CkrwddY!19)#X zCpT8F4bRBTYpX6VEUr6sFzXk(*^T{ODJD>ut83~4bE;cbRf)2$K6C4z*?y+B`&)&s<*H8p)@Zu{3ykUW;C3Of{E1Pj0>?p2J!R2U+|E~l$GQ|Q1~!X`xz{stU&Lb#5j z2celGCodGNh)aVC!DgenvZOdK$Df;nJ}t}wJ6zp(9W0(wQ%E(R&|HidOQnp#L{Eq} zBuYtEE=Xt$26oP`PM+i%nO8DLl}5$;no1j*i>epQZO36zE9duB#kuTey~~_jSJ2R0 zNa@?sQ!t^M(PN}UfFAWstWVzB^ zX-NtAgd@kU*^^BK0uz)*qvAi=-z0gE$8)RNXpzOwD{or5^rjUnZp80!|M_$0p5H$} zzXS8vuU|NQs?}mP+I#_D>$GXDxY&$li#2IlzJA$_@)i1BmN)Oh{{9Q*&AXt#|H64I zx2{;RrPS=O;53Z5zFD*T;u4IoptZoGk8WH)HRD7Nt*4qew31-u1x7Mf@(!})1|tn! zWn^ZP(L7?~Cg_ct^wd?D{j#fQaw)90wS{`BtFvW#>-0MCi34z&bcmiB^XE*H>tM2} zMxB!+bDbz{rJW@NIJr`SiiiAb*;OlKx5ai?2!}{|tTP?Hlm_xR>9n8Q+C8PhnPgv7 zR9sZNRy?^>_Lkan2bRQk+SvwZqPkB=bYDu+9e%Xk+0;f$u>4`+ z?Xq5Ufz=&ugjUY+*kgE(OHJh^;-_$0eU7YC+S^|5>*2R$e2d)`AAW}?#Vd9Q4#GE+ zZ)?6NIT^Lg<+t*7tOT;kua)Znip0`tkDTApJSS~!j>Btco{u-G2YgWNBt22&Ms<(E zV8GsUn{#rS^BU*OY0R&z%%{L_&2GudZ^@q1)HtWOx)4~qun=-~4l4&()vGm;CyuHD z9vnl4`q-IGnzVwI5K+*=hc%4{(_!xuFJS;y;#gvTBcu!KYqq*|zB0Et^=EeV<(K{u(Ygf-C>-{-7Sx`II8O-J~ ze)CbY5;95~ZbDys+08r`T4&(W1q%`-dlX|0(J&6{8zF2gq&c~s`W|8k;>$^74Bhw% zlEN{KF+x`tI~J0JW}(Aku`eRcz(sb;&2Zem-VT%KL95+i8H9ULOZZ|bO^DQ@jHm=3 z1XTGj)`2!8W}HD4XX5x16KBx;g18FJkdjR^Rf@d7Ya%8;NtjTvF`-CgFROL%n6ycy z8B~A~sp`ZEN2_hO3{hR*9AEV}DQ(DNrxgw?qV!;lG0QN<{#0nY(ip1{i=2mMkh!g7 z<5kyGfN+Z=i&hn`8*zLM+>CeJyKLy5W6$5;bKoSsG4I5gvrnwph>5^a zfE1gzIo)<>nof7wp|cCn$?tX9U+C#+ZkaKoCBLwspdb(^*hSWjq}2FE#G$xT%sTKm zXA59w_{gx?d(N8c9rLUNYK%4O?vNm2>>Ok7}$2thI_ z@AXP2CoxC+Xm}x(Cr~bjMjg4YlEA1=PWD`k;6Yq0PxQnQ!#Xih-g^?^52;ZMj$Ve7 zl&s^d^$+92i2646Yv0$b>&0Nyyq<^e7a5}`;v7FGOO|Z`*9fLWXbwh*gg#V=db*Da zhH0e2zko;TIM+#fE98*kUa<4r-s=IdEe5bMfo8>a$3ZOxJPq_SG-NE2|! zBsCh(H5sk?lbl{)u8Rb$$PC8oy(ranE_{8Y3mdDC+&*bBT9gW%2Rk?YjH9eZbM!{|Z04Jww+vgFE8%Y_5=C3q^3l=T zVRve0dEL^}P*hZRD0@@sgF(nytb$pi@n{&9**rEn(Op0()_jr6li)cYuIArDzyA~G z>?N`c*`|a9nnPrQt2Hb)SGxa?w2Qzt;gkZ?K8bLW~JR+s#|$go->AA<`S`FYHQ@bjVr+q~!C5vWprH9wBV4X!!V zDFzaXq@2>m9|mfuK@v;M%t{~=f2|7I`bbPr2?44E>hM%=ydvGwXSB9vSjfmPZg#oo zC@;kRv&$*-L>6H|>I@EDR(i?Sz+sol7KT3aLRHq2Nqq z^upb6R#tXaRCXqEA}Cb_s_N89KtF1{0l-{?e>giSInnCznt%gM*7)3HkAG6aBuc=p zPbP@jao~l;L3hVyb{D33JWhuH5w~MvOZ{A zK~qVCHy|zz;9`Me?2U8S6TQik3_7S&m?mczS9-l3Hy5Q2mot8{$L=xPVEYYS3cJpp zJvjmVUoUoQ0wd}hy&Eve#WEr=NuAZG6#UcW2U=)}(~K&TGKO#<6+%axHE9UzIizBVOUwTz(l9RW;B*ml$VlnzZZ_I_-LJI z8od~NO%IzzUsfGwC1Gp?-$;Vgh>FV~k%Y6z)hTFK0yGnzz%~+N>0ur(I!r}2LQ*Ys zR-FdN4aU=xlRRaG;8$6VIG*gnM6V~YDOh5K`KKu(1GQPhA7Sxg1DyN>WIrH{pqqrH z_#heY;zB%9(d+fQBXoyS73ClrjF&Z)D?HWV=x*n~O)Qv_=89{Yu0z>Pqg|tyj$U`< z7}pSk({G2W3#q&OC~|lrsu6x~w0rdJ(Q70``Zwr@*z&)Lez-R=Zj5vwQi9f1a8wz+ za`eX&$Bn3$O&A^Mz)IC5(zg->hUg`B+QCmEZ*rg zI6=cXLOOYl5ROmL>tGf_#96E_Lap?CsFr~ZD4;Mp;T6mm%wvrQ2t_UJ<406B0Qiv> zOKSBXngL0CaoE1a!`bsBiT@1hN{FCgg54@3SJE{V#_EchfrhHw$u67OprodzrMaCp zzusu)mU5%Zn(xodDzX}#CM!32Jup(Wnie->Mu%TSuV2UV0X53xYRMs_Gi~Bxp|vUq zCxa@;EQ}7agrczWj_%DRO7_1!wSB6sIFOZ=FbRA@vpqfU(fXpY4okYZG&4QZu2{`( zBjgj|=SRz!g87#if$JU&%QsO3^!3b~2t{B3R#Rz`Ll6W2SH8A3UxXfbR)be9EnXFV zVfgX=Mfm=?M~<(+ouJK=N}~H?@YT%@$Pi$~3+Zn7dG<0uto_JKg(k_NOMTe}wNAhgRy%E;A@E*qoq}A+Y-%1)7X~cDUd~?9=0K1KF!z=dm}yrhg{hLbPaCeN>l6& zX2@IOGsvMYhvpx=O{uDPa=~Fxv4zQzlz#N<8p8`T3uye$prdMDOdIgU@T+Sx_4kX< zaKwvc*y$WL!)b_lmur`(QElB~;YP?XP+|V3W+vzy7Plp? z%Z(r?@aStOvyGAN zs1%Okg33jfRJuURi!rc7ajGOJO|8T?W5Vq*wTPr34ij1{8{{-NSeVJ1h;ZlsHrxoR|QkDOkbJ zV$No=y(&^AoK0Ra#t3g9RobnnXnHazbRxV!opZJ!CYL17HRK6{Ll6`(549qKsbg;+ zOxpuR-j}V>_v-$dX!&up{dm$I>(h&)z(CrkD0*!8)3S;y6XTsORM!mE`8W$mNi!5> zZ6=(in@B^mv&MGgbWoGtR z;>t5K%i|O{*fg06i;43T3yz4OD7oqK5Hmy741eNt~)AL^DO_21wM$6OM zkAP@U^GS)`gyi@H3%K>>1V!nJ_j<7KCRN6nEcoZeXW58og8#fvpvf?9fAMe9sc_Vl z7#|^Fh$}jgP`x=NfZc_~n4-ibCwjyuY3Wl-trnvh+lvHmoSd_2js7b;9;y+bL+p;{ z)^FMI91xo!*!m9pZk0zIp<^6}+II8NH^I5PZ5-zgLotCD7%@VLSVLJ4%L?QSuD{r& z;Jw&csiZVu5hS1#D;~>E7 zu!Z0AI4&S|34Tz^6ER*Pa7o57 z2qrBi462US=j;nvZf5XXM{2?-5n`rMQnCpr7ZY{{hdwe&ig<_z$gkk&0nveV@f^4! zkEU}MZDf+g zavldciXtA+Qr3t;_7g}q6!D;%5`{>L__3B}hVb!HU&=c5oC;)~E zl!IdJ7GPtR@5=N0135m@%!(o63C|c~cB~U9Uu;z@hC!&NyW);&0(yq=h)qS$@RTBv zwm8#lG#b}JwaMe`TPu;Z-IG3fa=N653yTg_XH<7O8pEj0I2Mmcufx|l4}x&idE$2L z@O2Kq@5NzP&OrlqR{9)CQ@E`YD*d|44PEZFsJU6ERvHurRa&JvVtYE1HL$5UPhvjpHCP1Wtdi}W5el+^ct zXb$rlF^~$ze@72*%!mC@u=J4Mpmz@Q5#s2${CvV&Nfm)76=w{*!2dlwiIyOT1#S9Dav}yjQ!B!1kH&74 zGO=xfC6~H~%1pcl9YNd73G?$!k;&#OK0tzOmLJRkBv5^h6X!uyTSRXNNFWrP<^{T=ob?!+}vSut%qbiHcOW0|n=`vI+JI9XIzG!AWnY9%`g z3r>d~!zzOv7@h9!l_u82-_6AOg5D*RU&m#QEG{i4En8?wzz&tk)qZekL4RyPG1+2E zqP1zs$;qcxX*|MJdB}lG8e5TGA2`-FcUqRVB40bW`z{!_8gZny$rfFW6T4Hw^-QeA ze8|7*NK>^ID^RXQqv5oeg=oe?G|Gi&^cs5@tF9~#;J8IUBjq`&E(bke2b-iH$YWKGu+{kBeBo_2Dj7FO|xd?Ia!i+|{DY@v5iA^ME z^Eq1h>Hj-yJ05X?=d=V!O~bbRYrub!TjL0}CH~XFb^ag5wsy-wm3|5^El!KUbRJrccG1W+M(Q zaj5GQsw1XjzF|&$0;XRxVaG*INsX@< zlQIEqMmVsS#Bv)6ZAN&H;5H^+t+8jL#3+`B#7>_BZ_=91W;n?q7H?t~4&`ZF2Sb`S0cnh}wHia2kc)#vRw;a{6%OZ(L6=dieP{rA zg4<*B*k|jlCWG;ngMgv(paV$Uy%tro=nsj>KW8-xt;$+~t^mdk@efH*g5 zh%>6}pfOBU$7I>#^6GG|kHoSQGY1Q!m=X4wdZLn1^ugIBr}jUGAP>9v4n~m5H!Zw_ z$5h20wCWmJd$6TJ;ztHT70VA!bIHp&i1Udodcv3BS2I>$TV7g_7iH9wdHtaY)Pt7V zAxVM5vhQP-*}>>i`Q{}yvC)!u!4xyw!YphXEE{o}GrZcIjr3dX3D9?iC<$zL_22XC zFYIsZ6OdJIKAGq9D&CCq-cQ7pTn=^Xz-<@7cd_=pAmyWJkWE%5jCW)Y;&i=A7p|&v~Wu zR_EQ$N1eZNzUq9}`MFDnjdZFj&$ZEYyz5Ta{cf{6-ref{f%^gX&)mHhSR^eO3`>2uSsNWVFKU;4x8zexXm`fKU$rGMdb z_%`^C^PTSdp6_oN(=!%iEYH}OaeT&enZC?GW^HC$=B&)cnX5CmX70?~oB4F+A2Z*~ z{2=pdzsrA_|3?20{Xh2q%Kr!d8~%U#zsfRZ!RdZhN!FCC&aAmv%d*yG9h-G()_GZ1 zX5E@ynH|iD%Sq39Jm;C*+}xeHdvh<(d#hlmU_-%i1@9DI7$^%o8u(S<4}rIfnu?|u zEht)EQeDzgGP7i9$=Z@*N_Lf;Tk^eu4is=;#DlVwFy5jbVdn+EVc&6g@iuWtRm6pl`95P*8 zc}wN~%10{St^B-dLDllA2dX}896$i-N0yTY@JC&kkPM+}M0aOH<2lTHkK{s7>GIZkyb; ztL@yj@3r01w!iI>wqLfr(Dr)!y!OHN_3hi+PisHF{i^oc+V5%qMMqgjV@FrV(vC|y z-s$+blXcoUlRDRS-rTvb^Wn~4bpF2cwa)iCznG?<=AJft+LCE&rfr*c%Ct+SjdoeP z61)6e6rp-lpE$W_e~EGwZS0sk3*^{>_}M zIjiRUV6K>Z%-l!k70tV3-m~*7=3g`amic$hzi<8{^Pimm>-jIte|i32=fA(8cENEA zp6n~@JGSq|{<-}Z^?xw1W?=ikO9Ovjc=W=Z3(s44&B7lnd}!gX7QVRfZwo(PWL%W6 zD0@-mqSi%o77Z=hz3B2qw=KGVarxqfi%(ws{UydFQJnPFMevS$bD2HOWW z4csI_O_TR|VkFOKTRIWL1ZPwZc*A=bXx4v%u6&o5i-mq!GroSK6 ze$)?+o_qA)H!GX7H?Q7&+U8fb)NYxv<%%tT+M2wzZ|fynKiH<v{LylH&sl})6IQ8*U!>6^M zw&k>|PJ8k6jMM*o#-uYAo^kpap)>w|rt{3oGyBiH^voyE{Bn2Q?qhd9wflp!)}D3e zS?}yA-gE4pNA~>fZ1>sCXKy_F(z72w``x`sdz<%8-#d5j;&T$u@tu=@PWd@g&S^Vm z#yJblS$59qbDlVN^11Jvx8b}8&o`WZ*9GYp9CyL*EQW zBY}O4Q;=jBeU*JY`U%3H5e}#Uer7&qGZB9s*Fsz=&ufV5D9&p}KcgThpcXzbPzZMbPj( zvOwj$f-+|^!(qd7Yysx`e<$3=?7C?zcVa+WQ$#PUla3@zgI}hJp%CqIpk4n%K^b5{ z3ZjwC;xDnX!v#Dq6WIuKjS0F^+&liOp@dI?l(`w-I9w=WvqahGyF$JGovzU4YeAqZ z!srVKe@FN|!iQ>*&yi>JVdP22mGV&d9D(xP7YY1L^o1MMisP#GgRdL2V%Ru}77X;-j)B|%t3uSyR+OCEkT-y<95Lyvx`P|VL_{*3xM;OEc zl+}q{EZk+wE5#=Skf>^HSu4M zCty9m#u@U^MVNOjQ2for5wA%Sw@+n$1sJ3PKseTxf1I;M$5% ziBN@bt`;c&SqRG!W+2f0T7(vanc95=PAJGhSdLJLkcE(mP=-)|KxuviO8y2|*)>Q%=3p%aO8e$VLF{2rFdFNgoU-?Da@hIi?V zUC5c&@R_U#f$@B{34yL_5b}sBqde%Nb{W4J>m?Gd!+N<67W1EhSM(XH=EvYWTA=bH z0q-)l0^!dZ-S!l&_(M94)gS_mS06$-0;O3H@(|`A)N1zuT$>Q&b6ton*3v1j6M>#n z+<_2AxEz7rr9fj&??yr-J@!g-DTqL6I)oC0Q)u4Fxku@khe$KXdDzbyl`C0;K3C4U zYH=af;rF1Uaz5s19ohk#59mFX%K%;oUk|R%0X9ehW$Xm}_fo*I;N`kJ;KzROX)!Kx zd>FKH*eE=ohVRD}y*HYUuom}kX#vNrjv5hv4uRs6V&d?IKDq{>329VL5Fr`y7uCF! zUxvsxeuL-qjZCCR%1625%7?Tp{4@fk*I~YlsA2Q~4~)Kvcm=|x2&W;OsD+p`$_H2! zK>O5dGOla1cW2;A&kYE8XB3ou_&M$0n_>DFxqD9D;U1F*TqWhB@U;-U<%aJc-J<(M z?kH$lX@Btar4zX*Q;(Up2mQ-fw|eDESvmJpHW0(|&qq59S*ChFbEIz`dyKKKg!&EL zR37JJ{33eF-x81G;sYZO1tZYai(le%d6~}mIj+B9JK@WVb}DxGE39KXcp2Zp&*K;J z>v@Pj&410`=Kl~WB2N^F3Q;2l#6#jy@wE60Y;}Ac6!=*X&0qkmUd0r7e1@c z<%{=C@}>DQeL22TUxlw8PEU>kkLN7k^}d^YxB71P{lK^1cdze3-@_Sk83`Gg895on znIhAW>CE(G#%E5-Ov^0HoR&G5Ig973n z{7aE53Ph=F(~rd?;z{vG@YoG#lN)XFD>(n|aL#&Kby|H|OIlCb z!nCDn>(jQU?Myp2?Lyh6>wHGE$>U4%rTTobP368i*`}?&ooLgIzFW|yJAC`lrU!fv zjcb!0ZE~Yc$n~XZUy7 zYrkXcwU=IdnR31Mi2S|gwQFBH`?X_UJLA>s7<=_Rglz~XzIxQFGhZzQfPKk)t0A%y zevLQ&&NqvT=}pY090l!Bs+C%$UO7?Op`0eu&ro(Ndz4F+>y+E*{?LEQ_mr!Y8=TmTRC zx1t*9n4`H^d!0BJu$Rqa!)yc!@kg^QP~o|r-NKf_#M$N+OQ7q zgJ0B-*!$dygYM$^Bwo%dcs-xWd-)tbpD*Qud>ucRpU*Flyy_od-v5mMlK+bTUMvtl z6n)|{ag^v5Tj5pf7_nP~#P`Lr`_!{T!AwC@z3h`YokSRJ+EU2(m*U9^jTifaCq zSRtB4P_$r=6%UAIW2w+Fo&?KsKfFSf!eev;Tf*i;cXR++U?;J?>|}NdyNc}==insb zpR>o=PuS1cE9?e-6I9{<$v%TqpD?5jX6^)+J%y+99Nq<9dn<3}UYz=T9AD2j!sFyN zaV|fT-^1?$RN4=?bRJF;P2zB(#6Doj5XfY}dMKN_LGO4#3pqds#e)t?0DTq!U6jfi zc`jf&@Eo7ax_LG0;+1R$uVp>FhRxx$|C$1NY9#jfCI zuoP}&Y0%QVlJADC;sKV(6*h%uvu0k%`gt4NWOlPN`Brub-^Fg@m$2{i%h*r(KK2}c znBC2{7gI{9u|**8g;P%PXzUr1cwO4*u@mFN}k4M@;Ww` zH?i5gfi2`6Yy)2i%5E{vC0fR|^AUC&UkOaThF#6~uxt3)>~elOyNsX4Zs(V>J3xip z!>?!e@*CJ){7M$$SF`*0jX0P44)!R&lfA%y!hXXaWq;_Bwx-z03au zss=|DZ~+|gIdifvVb$~%bAwywU|%pJ`xi5_k02-d7`8H>z_H1PtcmA=YAk?Pi&9XK zK2VgItPa?@o@ZfKmcf=njc74;184K?>>PeP+r>A5$~c;x&Ns6&_!f35KZ>0Piu?k& zNxP7r%r4?P+4=k=_9VZXJ;m>3zr|p& z@5BbNNgORUip^rFSRxjSWn#5hBUXw1;%?C)P7pi9c5$3INt`N96sL=m#ZGaWxI$bl zt`&R5S>ifzvA8J20=^KN-`_sq^L5|P9J9MahPey-LzO9^yn(@$zCH8%Ln3?V0TUWM zJnUbdl93T&10mMxZ`%*bp>?pOD8vIH-{8ukkO=rz_(G4(3h8nd?$6_v*7o7{kfFUl zBcx;x%vsc*;m=6f)9(w-nuVm`K#DI^OR?I40pC6~_t1(^9+I>>U#OIxmr~BhX7&3} zn>|CmkY!f?AX0qv%tEnhid7G$3_=$vCBzE{2K*s5tAAu*peUpSeC@uFE_(;hQjmd%t-d|JJ@~-B zQhhcWIlF&wR?5(vfqwr$#(*yroZF9QDbzIW`$ZvrAY^PU+z)z7_LKp){uV!a+}|=3 z63bVH_%Lb_(iaqki~%22)!I6Izm6?O7F0GkI6zqj+hkQuf&E4+Yi(~S$cXm6IWT@K zENUsd5LIYJy9a&kd;CK*F0#K^3iWBomx4-0YKhVD54EYEupZ|1P!`_8%h9IAzGR~* z}pVQeI;zKPVXCcj5%;c7RHu|ySC&Uvl5=!>0{(Ur&(OE5fFuwHJ zf($=ii^MS-=sCTDr9e*y(2`EnzZ0qBhw3l`xDTh>`_aX%A=b1XE)C>thzqcNOtjDI z4>|oUzV?t6lh5MEglq8);`8^q-8gQAwY2OR+~+YAhR!NX$wW7K(YCn4qELKbAE#>q z`kAhYfqe>HlLGs6bWINI)6;blZ20M#64+;?YieMhiLR3a`^GkFJ4$uR$)Kq5!(pJ?Lx2*bdTM7{WCapt)Kc z2o)8Eim(bxumCzSQxCZe{X?~Wf{5Rk1Jkf5R2m&xo)9W2*r(_5?fn2`G=OEXJ#+Bm z@_?^O*0%!rc>BT706^xD)uVKl0QwYvZB72#edRo!8dr%9K#dRi&LCFBP;F7DDo~u* zP!y{Ewyc=J!^mEPF<}YWzG7b|t$g%l*PcC{{!T!eexL|IR)B+Q9C_zOm(~JAC4^ka zrUTT>mf1q)*20lJ#eSc!VGqiy8=u8jtdK1i~I`8JH$s&5rVinKnV?5+;p!82~quZD$+|xNJv&KCQj(Zw;H@3WqZ!`x&wS}=6A}>Wg*b)fU74E^*qxrQ5OZsqi z!+;itic!T@*<_l&kujlZ>BqV%#yV4*(FV8!6hd=d&hsOm#GQwlQvc4pr5+{_)!?s9 z$%vUD83S4!+W}i^3nTr|fxEiG3>qcs39Tj3Mt7po@#+Exxq-DDR~)LudY*Qe^ez;~ zy>X!`UXAorPk^Rys2d$SBY=H%8zM6i;S}i&?B_CN79uib zHsxu@qdAm^B6BGZMdnc+ip&q(4XD?Q*aF13jP(WX22D?C{fMb)1C)6;W;M&G2!Abpb}LzJfjk>!+!BEyu2A}c5lMMh-3S`b?)>qW6u zvR)KhE$cdf3k7j^ zG|(ublxMRVr94|?9(q7|w&LX}(Ned`JNd>jYLwnMR*h2j?I>r8TI6wRlrkKzMk&Jy z$lDMt??ibg%R5PpQuZBcl(L_UHyhOQcB)azaEcnG47-rGFjxQ zeg@ubRLeV4jZ%i)YLqgZ6}a1s1GzL}wWTm*8VM;`v$jXjGE4ZJJo*vSj z1H9XIw|)i8W!q56Z~2=F9t;kWCBCnClD`GcV5e>>{4M?h-qWAt{~G;5y+CM-NWYAGLG?(m&MV4sZ%AtQD>kj$+5L&1?-gWUImP@Ue36oXX%0*9XqoYH-ec z&;r>8v$r*Px(Ro)kb4tbizmY}e>0wLMb1q~--73PNZ*9~TiKAz5k%?`?zbRyJHE9F zZ*D|wDc1&Yw8od-6RpV{NY;F}bqUi5DY-WUNlY@Upb)vSn(y}JN8s5Wb4 zO?)wL$9^sL4Ql&V^hG`Rh9!7&81Jva{Z_<_Wl8ICr8cg@^Iq10uL*VTjNXerJH(%Y zkpnkGpvSYoTfz~7(0w(~aRuz>;LcejpV7`8;F3AP$#QWw_wYD2%)RU`@G;_9Hq6xy zfM>LVC-6k@cyhs+`WyI?DLfS#v}x$+5pef>JcDO~-{I$3JR7{eTyRx>3C>>u_#K5j zz>9b>FX5%U41Ha|K9^k0N@(9!gPT{wYk3{7hhN;M!L54+{GwljbN3~9N6&)q83fm` zg|~vg)CR6tJ1gNGypvA@H*q@e<~`u&z0OMcOmG8x`7G%2&LOTIIHe1~&s&K;c@Dh2 z=lK9%i1Qm4L(_LDTg8`wi#h~8+;Z^uR`3zNlCR>cp#!`Yyw&x51K$X4&L;5kj^amy z%M-%Ly@$D2#kcUS&=Wp}AIrD%?Exq7Y_=L4w-=ygd@lH$#KFCgU&Jrwm+(vZW&CpRbH4{(R~t0oU~(;M)BdQkxt2jo_``44z^m*7sleZTxorebxs4BY2S;z`=Z!wPW^#IRj7bG5$EXl%3!}{sdT) z_{mR#XMGg^Ie!ZLwat>d{4{?C@|9=V7XBP~S4Z>T@Za*^@!#_o_#gNm!FB6`zxOZr zi~J@2XZ{!HE_Cx(_^bRi{yJvpAJ|s@26(A&f~WcxWHfJszxodU8)P;A;O~N4`yPKE z+`@nI4_Gh%7ypod#6RYr@K5<#d5KL-c#3;relihs=y@Gu|6Wae1IbJ%f0uoHwL zbU1XwAdJEUyMME=2rD}t2c6r6LpX&?xP?c=39pD33Glp|#IA>w|0FR9vaeL^+UK(O zv4-c1$s$d_pQ^|ZnZgh4rYw=o-V!t{Pe z1=}eq*(sumoh+&)U%gJ$iz%W(G>RrM6+HE3(E>?98#w0+!ENt=qyV~SY%zORbg>5^ zRp^FPVFsiIy=;k?#omT&VGiU8^Td2`^dXamOn_t!i@_OO3eMo57y=)E82tJXu@XE& z;uNkG>%@9+5jR4f@HlvhN3pAMCgjoJCvFj2*_Ghrd%@LDfOoMZNaH856!@Xt2Km6T zlCO9?IE*KPySPJg7Eckoz-K%Se8w}xnUEly1)1g9;4_{h&V_X2e8@L06c>Txc!{_a zvWCmShy0$nQd|XY>==4KVhGOA3GH?f-@meaI!lf zAGr}cemAT|%BiyA^Q$CY*|UA-f8a!=FR8aRs|sJjE^tCVY}T zAb!F8;2`g2XTZK-52PTc;-rFi#4p({_JsJAc$zhfXT-0?v*J1Ny!egyt@xezy?8p@Z8@3m;Ej9-QNbU{cqy$;vbO7yax{aKf#Cp7kKX< zf$#na`0t;A1OJ8iQhX)8#z_=mF$#$$XXmh&AU}8+nDty}Hnc+e@*;Z`vZO!3-c^Ad zR}ZPDQ86iI#iCdt)wL@QNI_kSTQ_rlPmiH_`R0*hMvU7wt|@D8Zdb1@)!MaGyOwL$ zO7+?txwdNeTK?u*?Y^0=rRAmC`^}N7EC=c3#^wz}!<#p4G&XNqwQ1wXI!p8BH5*qA z4R6~zVr*_#ud+&|wP4+>**v^$!^-s|+byjtHf+ZT5Zd;+$~z`Tea4-YPD|FTHh*LjoMdQ+Q(I+ zti44mswL9!YGb?BK-r2it;n)UW4qd5wWC^E4V|(^*3Pj;+B%0fZP+lRHq+8M;ZxsO3e zr;n9v>yD|C?7gzq8bgm9Cqs{HfvqPdi>?Q?R;yDXn~pKi>QSM6zfzqGWv$JInQA#R z)pBOWl%p0=DLcNby|P+q-?&Qqe2ez1*3cVmZCQJpHfC+w*V?qPYtxEoQ)^SM&XCgb za&5pWB4e%1h1Pa`@9IsPH>w|L)9TzFDNW1OruAuisl9jgHq776+cvBp+9q3$o^3bw z#!iAN?d>Z0tx_yEYwwozLt9qIO!rEy;7n1F_PvO?-;sCiKr zt)r^7W>mKu=0`^dkF`3qN3PZS`D4A@u6?LOt3Z3C*R{gh+wJoY?qw{k`LVrR(`=lt z&SU+2f+>diayF|2SyOB1lYL_C8|wpe--=-UaMBU zR;}5sYO~8rt1Kh`r?qndudBH3{oeZ=9lalxj*g76En!{`EsmZR3NB#T5+s0a9Eb2K zjUTctTb5i&hG4jqwuB~>rn!`lOKHB;NgYTNZbEYd<>5d+aC;5CI1nhW03kL73O2zM zn}-w5{jLA(v(MJCWQ^T&zCCBnnl)?IteIIev*&T5^g@kjNPHMu*%)#LkC#pkaN4M)UB=aQ^QWv z!%jQH1=_*Xg`#(aS!u~7)0-NJHLBU624;7bkHkuNq<|k*IpjAx>MH}+k?Fq}OH%z!Er|pngPjBUh1GQ_d zF0S29VujXtgRJp}s9Lx5batgKcNOmPeBMhhkF4?K&Kh5l4|Fx}l(2w%J5pD~t#Me3 z+CmlecBM9oec8r>hTPRw)31;}T9dcNvqnamTgn-BF$N7`DNAsLhH-OyW1jBLxThuV zX^VS0B9EDGd1{vCvlNA5%=4sX+2bMcwB~ljL%Ji6S$lb^mgZC#3u_(2!V#7)mHHwo zQq7BQor4Prdx+5Eic_94^%VlE^WBF0s+m^{68p><<$%Q5ZOD9Kx?!0Ke+x`BnYmSECqy)qeQZXny0p=?wMK8S168 zE3>|DxPNGcP3IVZtx#K>H+MNA& zO~NH1zp`EQvK^JnhX#fQ*HNQJmkwW%Tro7bD%rDPc*w0mCA}4WHF)X zu2er^m|05)Bmr1gaBbmas4bMFt$A*#8gDFqd*$k(p|wkw4P8dc5m(n8wz*9rv`xJ@ew8*>TTYd8(q^$HUs?sU4$-czAEj)6x?6xWtw1R#%IfTXVzK z+z8N(2*HO#4EHjkxpkguAHS-7{GK9BK$lOUwYx{2a;LD_D6J(1H^<S4ns)41WgS@LuTCzxCCockgdB6R`Op%vb+c!Muo#5Pc zONZBbvqE?6y0u>WI=PDL((vJ8YikKO5u4NA>7&cqo7->gSfr4Eb49H5Od7D1CT;S+ zLC$NCV4uFvWcOwt&OYOnWw&Q<%yOzG_CZ^bkE`xkt>H`+IQ}Ll{>kn!ZeUK${-@!M z@0f6W+4p$!Y23uIAbcmO?}dNF*G@FVKiM5)G05v>_qcSjJAt3c{)cd!8pu9|@8Mi* z&VH9E0cy;UavRg@QJI~+n4~|>m(Te^`S$(sTpT>Lrd7S;?tv+?? z%-~FF&{@3IFXpZO=cq?#2WM03&JE55vmjVtCzyH5U&{Oa#ZYqX1m((menQXZ9A}ER z{a^Gdc;9~^?#02yxR(UWz%LJ$bG%_iu)-_it$!cz%3vk%s(`yDSpitfnX`dl0QhUc z*Py>XxE{{`o44lWyd(diSIIl^yJ<5)=EqipGFzzA)G6}dqsfQ8Y1#X;e=bEhr_Sjh zyI;EG{&)UG$Z}e$oCbmAv{*S!D32w|V?udMDvw3VW3lp>QXUh^W1u|x%A>D5`pRRV zyd;#1gmMum7b!_@5|q#`Y7;@lDK*RL@5tPQWGmI~X7OHr7wd`f?*)GTdo?R%_i?h| zCBAR_AF(1dBWMr0IVF+*Ud_AsTlwA){%&UdVl(g#Qklid*cwi1+~?iTTEeeSY*U%fTNG{MiB$rYm%`5Usd%oeNmgSw)GJawcIWtDEeQ zVPAg_ul0L*KFfKAv)RRdj`t~6HXB(dxi|Y2?>?UUdA9KUl;;7S2YFt~-r)U;=VhK> z^X%Z+$@2=&fAGA@^BRw(bt-8kNUMdknnwMFo|5PnH0&xBtGlpRnmhhGPjXF_=%m_{&-w4*P==R%%~X~z~mcTBipJ`LtTuC2ssC046=EW)=4-y*Nv zZ>6vJF3)W|*bmNa1pYtre4pnBJa_Qy<9QE>62UxfnplwiAh;V#Xwr1SsS8eBXmla# zpwKs+KA2o9r<64ieDUqz`<_{RdeME}iSSFS zzU(szR3f|c+Vy5;Uqq{aPTl)1pB(FkbiT9HLap>IPHxnYqi|T4HKn9nfZc(lyO6UP_(eDzMNjYJ?#XVY zR4sSp2kET5t(I9$bal+P+8XMDvKH^DU}#5-#*mir!#>un!w<2-7Lmi)ugjlFX}pz2 z*2X0S@t@R$8Xpb|8^*;~n2>pgy8C4IHTh{V+}Ca?m1kc-mrwG$jhuMoVLO^_MeBFb z;(vsDm%-RbAIR#O={0L(8A|0@Vq5t}AN)IwZ}#ncT@TZQCRXdLg@hlMyPVH{b9FKv zGOk`6mqwxlXksRoARJwQDT53Di2^rkqjPx1er&|54|*}HAs;mtEl{FqaF1o5W%Pn> z(9R>|b|3ZgRrJI75&t7Vk1$^MfoxoC7SrmKtNo?}^X_z@RkPo@Yx-_!y5|`MPLvv%F0PQ8&&*pi{*&B4W zXS?yvXV2NF?Qdb{(}n&~?D=|x-9FE;r|W%o&Lq)AAQKyoCJ<7x72X{VHSvC=M4+NGTS zE#stT1-s>@+PK!M;0$mV@EQIY-ZAWQTZFsBUxIrn``C_Q7uy=#wVX?x%HFcC1Al`# z;#78+-2(i#oSdv<=hz)yJ^REM?X$=05l)Ui>Oaa^+kf+)0=BZ9&hD+f#Il`N6}IDw z@r#x76hG@{y<-BK0hDP5P^B5b49x&)G}md;44_6cfJqwr&(PREt+9WN#{N|r`!k|r z+{BoUkyE3_{#BaaRBC>6l;$^;n%^9yIYEu)H?^7>)M#c zC!-lpx#kU&P;iQknuz@&wW5LAzZHu>|Id@94Kio7U+TxipXr1)TAOpdq!AL|EZTve zI`x^@VA+Kz+^q6AAI4_lRS;CrJ{79|@EKbFR(V5t6@M$(eblDd2Yay_+xTm2lC^cS zQGCE=!R$arjqDs&_}Azsc3Qu|rF;vi_>pcdy9oFZD z{nLKot>+r=6OP=*3leT-_CeBq5J{~c{k2@{#U3>KC0U~}A31z5>)}*!6b-sai^IetanJ z0Lo&s|8k^hm2GmCxKdWOQntzdiEb0t(QH$tY*VdlQ)Of$pGHGwn-a23N!g|%*`}0i z(X<$fO6Y*sycb1wll%T+JSRWHj` zBFk0J&e*>u)a+M@>{q?)R~dU>H-k4TRxT@+mKCdz6|0sNtB@6|krgYE6)R@v=m*3y zTUIJt=F67V%XZYuc2vrCRPxVTHD)Oi=O?GoD@>;D&e;gT!TKCCpHFCv{tD0dA->;sgXANX=Jo&Ex8qpjc{x%LeK2#J-%H0 zvh01)>GII_aMd%S1OVd7Wa?PQA=+h|o z4?_xZLMlWfc6bHmBL_~Us2Q=ZS zV?4IYJBeqCB$??Q3*XlXInKs_SgHN=w#QlC^HHJLulWXJN7Ep(gu01SiJlofHgN{2 zyhj-s51Uom{I(=!eXB%!fa7#y=!x{hsL0AVmHmiz=iUZWBE(xrTh8fwdTi`xylk%a zB6VP=tEtG&{2Q&BM%_4%F={?Va$1V~`*`-MzU;%kzv-yWb@J)gMul(rwN$XQodRIT z|7q;~x0Zbld+e96Z~KevuwO(wUd0aWent@&tL6P)wXhv(VLOq$2`;?5v$F=g|)uRft`*-u~0e)_+H1AFR$ z^LC>&W;YU%-M9;GcXJCvCA;At2DXt3MIRgEu%1E+KV)Y&+y0f7AKZn{R!r){{>^3%Zj9}Eu!Q=qc&}BZUMn?De`RCl zlCaj;IJs1%Ql?TVSE*E}RLaNnDmE%M2~JZ!dpY~yYixO^-Zf0aXF0V|WeYRWw;3VX z2xEWt?|9>srUlxU_$pCb`3aa4**wDa)%?#W^N4h;uTHD4POGo3S6`i0U!BXT&0dPs zOS}HLSUIgw9W4vnljXERIjvC3s8LR9mD4)qG^3o>g)P8l0cEbwRGll)*rr^gno8BP zO4YL}z3;EqNM@4iS*7Y(x$0S|M*F22?U!n_@9I;fYEq?YQn_l(J)CoGrMY8SD=@r<3#^=5$obd)F`F6x3d`QNGW)r)EDu zo1fv#(;Utm9q-#a{@K`~m3|K=hyDToclloL-|j!?|0U;X_Rz-vi|@a4l4UP9{B(N3 zl=X-GB#G-y{$cF-9y(!$AL0_;EAVEO^01$elkMQVeeMRd(b5_;_DuTf+STddhJl6w zL0_H_8h~!%P~$Rj=#j=f6#2%Hpmwxjpmxx5Bxs|cYw%qs=tiI$BIuTJpo53H7~hA> zmfG#O-{RRU$Z&TGx;qNZLl1%5rqEYwch$bEbPamvpwOYvJ@v6%4xWY!H7cTwQy5U)@zo!=Ot) zF*LIv#;haYcLtJvM*Ixw6?6{J1%ehw5W1?ns_xI~zG_;lyEK9v?y@nVg}60@u2+ma z-Pgh0sx)qjpshd;2)7C7HbI7av;ev%qRWToad!~K-RtSeb??@FXi(jb zkB90WKQy`t`MnjTA;|bmEJ581SiZ@U9;j}Ipr^;dq)aoI#GuML=H?m;VR!uj!Sz2K^#}9PVdP=y=f8>1(ZjOMfG6(3d|EG;r{^@Pae$ z)jV*@DL!YIroXqbo#Fm^ov7)q~}AR zGtQ3Rvp{bshCwe)2)z=~y`A2d{;ko~SJkKMOCo5>girw8#G%IJP(uIvxEzYi2bbyu za^Ix<8ua^uT7gaxbXvne20M%2phw4n4j!r)nZ?Atpng&P`FW`Rk{m7u%_p7DIlB5~ zF5S#xppeTah3YT)q%p=zOllwmmJ+dB-KD9Rfwyse#z>YpOU%S!F}2r^B+FC0)NnS&0% zneGee^0-$C-KDsBT*NOkH8UeqlbMxi7nC^!sEingLT8-EqnjC};UMF85DCb6jY*%G z%99aPHV!Ty8iOW~ATL#cEaI-z3Luy6*c=tamHr&=Gst&_IP?OYQvfXncY$!!q0IUS zT2TN|hYkomIPTAg@l|m#=%xs|EQ0d5t0G)sjIWQwC66=6ak&-fj?9lU_hiO{ZW|N2 zNpyK!9(p|UwAtOvj*LN%ej@0BgU5vzoN*uLfivy{zun%j`m5C(T-= z`!3XPMbL*I4>fquq>Qd%GLN_jnjYaMhAKXBjN^zgTbvC#X+o$uqMOsu-EfxZE^7Ev z!;%PEIU%$Fx`{)L%b|q+_i;HCnGY%z>!NqqJ12h+w|e+KyV(p*EXDo2;KjmUBlk~) zxyC~Izgs91zY*o2@ar6$J)gMij6U(CXr5*NwC@kHPU-vI3hhq%28(C6; zfoq*BIoli`@n38*d;cYPvp8%Phs}mbeA6(AZwj_uKYn6?III`Vdd1>>BdM=fT9VMe zQlVE0?__vIc~>s{E2X7dEN)=Cw0!Q|0rpRqtK9h;1)nDl=ZW)q;(4Coy@wKCfxbEE zYS@i9qX%_vE@I%6%s1#Q#bhR+6MYCEo&q}t{#*KH+Cdn6sUt%z~`vV;lCdw1V^F#*=f1+qk5`3(KMRTlZ{>kv%9%D7(pA=fD&>H^@FqMjRpF(S-=i7w8 zP59e{IazSK@T|B|A}aU9XB67R{W)k=X*G%SM&rgEG?wmliZ#Qz;xj|BCR;2|HQXCY ztT))=a^DkDc|%6yy(5g;j`xnkCzdJ{{qUyTIQ&HE-Y(9!EA`urGT3C8V3SKr_{oyN z-og9+WZ@?XKS}sW4x`XMX=9Q}#ohj-!v6x8uAWfn6N0A;o-VjaaFfAEWx0Mr@()RV z(R+Uvyb1n2<<$220gHaOXxCG;%Gvj6#ly4O5krRr@vB8(~>!@bkmYq^_lg} zG9*k(=6@DvTP^mvm&+voj)O%H2*wlsDy5Qju;IO|Bza%(?;I?e--+g2;lHM|&K0*t z$!p^b_Qf^|^i>sCpo0-eO(cAq^YkJ^ny+()F7O|r~FYoq|BgJBsOX(p(e0GGK!OBZXv>vmKRO|#*wa!jV=XRsl*yHs^@RoNh zHyZ8rX4*|gtaUZpI@CeFH*+J}gkS9ow7r3=S<_h-^EsSzeedRk)#RJeQeNr`)`ooc z#k`Ny$#JB%^I_8o^R=qvA*si?kHdd{M%=@FJ}%vZ^QFA3#$?w}r)yXV8~e5WnDMXC zVGpuvq%(HD_}hx!8FS{%_7d@7RnzPldw;xRSY7L6x9IuYm^I*C&J9?9#Yw!L|-eTNuojv!WChuqGEO|0cR&bH3i zfUGBTKIt4*>z1)T_hs(b`ntlaD49yu_>QGqy7;HTbJ?G|91C{^cTxUzNReQV=TYqU z_%yQ2V-@v6*7=6$UBBXeBcw>OB0Ys$4ebuc`K%9K#GcdjtOZ`@{m+o12#p=h?$s9d zIH`1Cr zXl0+}mbyRU9MT5w8g3rDIix6K4ZO+wJ^lf0E^E+VV4ZU_lu_JNMk+=i>tCl7nIwF^we-hj5 z{-4BlxlhS`Uhd0sUzNK{?mKedx0CmYkB-D0B62c$MDFm4!DQLc5x67N!({Cdx!li@ zoNTvr9Jae**+_Ew$Pu~gN0P^lY&d)uyGi#+|6`AhlI$e1o%l7pL580sd@Z&?qYiAD zVa?{!qsy(3Yo|%9CpOo1{`%~cH`nc%vAr}tR?OT6T-z(d?lOGV)B9LAbF1W5W2ff$ z^SMFu=HU6nwTbP?TE6Yk_pIdk$?K9UlEb(+C0{6-QZ%P%Nzt7}&lWwKnhh7@R6+_j zduM4s%m3j&hI9vL?gmhQr~it(_cMR%r``E!H-5(M`&`5gpPT%D<&)5fipNE zx_$Et+@yK%`xLo7G2xHB`4FilpPT7NC) z^1j9YH#Kou^n2_ouL`QX8Nu%b?TlP{f*$@q*-q=u(wO1XIyc^KH#hQsjvr8PXN09^ zW3bKiVbke>PQohBr}wx7%Rh?MzJWU=ZO6|qanJD2WTey(bdbU^K_w%U$=n_K`{cVS zC@177?h!p19aIBP;h(x@p^X~gqk}H)9z8yo1U!{nMw`)4E$}q%8*M>Xb->fPd9;-~ zOVhxO+(FvL?WOFq3!1o%w4HlQGiV^et*38MaHq3dmyIofon)}um84EIA@N|CpA*Q> zX*{;8#?{X>lvC;X9nSVJ@y}%7g5Z(h->7Jh1y4X}{@flN#)M$}1iM{%thP9AK0TzL zXo@h_29n-x2!88-zz?2K}la_}xOj~g4C^SL>Gwkya+o}S&J=~Yt`N>uh1Zl!Xw z^43gGJPK4s+sJUf^dscFKlmN)7P1#`FK8C`Ut$y=ih?@@`1h;dih{l2af(C=|5J$~ z+t@A*4GF7Ao|4N78i_Ghqvv5@PK)456MA&RE7U zu2ol&uC-`dCYU7cXAAA*dl7|MCDSi6{TS{;w43AMbDE|-=6lI&iuqFPRwXuVD^I_L zwqv!?N`HoArKZ5cWXef;dW7esUWm7G`!Rvd(hah<%iKu5GHQxtr-TwP0u-}Jcy(`G8< { - -var MILLISECONDS_IN_MINUTE = 60000 - -/** - * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds. - * They usually appear for dates that denote time before the timezones were introduced - * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891 - * and GMT+01:00:00 after that date) - * - * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above, - * which would lead to incorrect calculations. - * - * This function returns the timezone offset in milliseconds that takes seconds in account. - */ -module.exports = function getTimezoneOffsetInMilliseconds (dirtyDate) { - var date = new Date(dirtyDate.getTime()) - var baseTimezoneOffset = date.getTimezoneOffset() - date.setSeconds(0, 0) - var millisecondsPartOfTimezoneOffset = date.getTime() % MILLISECONDS_IN_MINUTE - - return baseTimezoneOffset * MILLISECONDS_IN_MINUTE + millisecondsPartOfTimezoneOffset -} - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_days/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/add_days/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Day Helpers - * @summary Add the specified number of days to the given date. - * - * @description - * Add the specified number of days to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of days to be added - * @returns {Date} the new date with the days added - * - * @example - * // Add 10 days to 1 September 2014: - * var result = addDays(new Date(2014, 8, 1), 10) - * //=> Thu Sep 11 2014 00:00:00 - */ -function addDays (dirtyDate, dirtyAmount) { - var date = parse(dirtyDate) - var amount = Number(dirtyAmount) - date.setDate(date.getDate() + amount) - return date -} - -module.exports = addDays - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_hours/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/add_hours/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addMilliseconds = __webpack_require__(/*! ../add_milliseconds/index.js */ "../app/node_modules/date-fns/add_milliseconds/index.js") - -var MILLISECONDS_IN_HOUR = 3600000 - -/** - * @category Hour Helpers - * @summary Add the specified number of hours to the given date. - * - * @description - * Add the specified number of hours to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of hours to be added - * @returns {Date} the new date with the hours added - * - * @example - * // Add 2 hours to 10 July 2014 23:00:00: - * var result = addHours(new Date(2014, 6, 10, 23, 0), 2) - * //=> Fri Jul 11 2014 01:00:00 - */ -function addHours (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR) -} - -module.exports = addHours - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_iso_years/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/add_iso_years/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getISOYear = __webpack_require__(/*! ../get_iso_year/index.js */ "../app/node_modules/date-fns/get_iso_year/index.js") -var setISOYear = __webpack_require__(/*! ../set_iso_year/index.js */ "../app/node_modules/date-fns/set_iso_year/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Add the specified number of ISO week-numbering years to the given date. - * - * @description - * Add the specified number of ISO week-numbering years to the given date. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of ISO week-numbering years to be added - * @returns {Date} the new date with the ISO week-numbering years added - * - * @example - * // Add 5 ISO week-numbering years to 2 July 2010: - * var result = addISOYears(new Date(2010, 6, 2), 5) - * //=> Fri Jun 26 2015 00:00:00 - */ -function addISOYears (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return setISOYear(dirtyDate, getISOYear(dirtyDate) + amount) -} - -module.exports = addISOYears - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_milliseconds/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/add_milliseconds/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Millisecond Helpers - * @summary Add the specified number of milliseconds to the given date. - * - * @description - * Add the specified number of milliseconds to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of milliseconds to be added - * @returns {Date} the new date with the milliseconds added - * - * @example - * // Add 750 milliseconds to 10 July 2014 12:45:30.000: - * var result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750) - * //=> Thu Jul 10 2014 12:45:30.750 - */ -function addMilliseconds (dirtyDate, dirtyAmount) { - var timestamp = parse(dirtyDate).getTime() - var amount = Number(dirtyAmount) - return new Date(timestamp + amount) -} - -module.exports = addMilliseconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_minutes/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/add_minutes/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addMilliseconds = __webpack_require__(/*! ../add_milliseconds/index.js */ "../app/node_modules/date-fns/add_milliseconds/index.js") - -var MILLISECONDS_IN_MINUTE = 60000 - -/** - * @category Minute Helpers - * @summary Add the specified number of minutes to the given date. - * - * @description - * Add the specified number of minutes to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of minutes to be added - * @returns {Date} the new date with the minutes added - * - * @example - * // Add 30 minutes to 10 July 2014 12:00:00: - * var result = addMinutes(new Date(2014, 6, 10, 12, 0), 30) - * //=> Thu Jul 10 2014 12:30:00 - */ -function addMinutes (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_MINUTE) -} - -module.exports = addMinutes - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_months/index.js": -/*!********************************************************!*\ - !*** ../app/node_modules/date-fns/add_months/index.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var getDaysInMonth = __webpack_require__(/*! ../get_days_in_month/index.js */ "../app/node_modules/date-fns/get_days_in_month/index.js") - -/** - * @category Month Helpers - * @summary Add the specified number of months to the given date. - * - * @description - * Add the specified number of months to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of months to be added - * @returns {Date} the new date with the months added - * - * @example - * // Add 5 months to 1 September 2014: - * var result = addMonths(new Date(2014, 8, 1), 5) - * //=> Sun Feb 01 2015 00:00:00 - */ -function addMonths (dirtyDate, dirtyAmount) { - var date = parse(dirtyDate) - var amount = Number(dirtyAmount) - var desiredMonth = date.getMonth() + amount - var dateWithDesiredMonth = new Date(0) - dateWithDesiredMonth.setFullYear(date.getFullYear(), desiredMonth, 1) - dateWithDesiredMonth.setHours(0, 0, 0, 0) - var daysInMonth = getDaysInMonth(dateWithDesiredMonth) - // Set the last day of the new month - // if the original date was the last day of the longer month - date.setMonth(desiredMonth, Math.min(daysInMonth, date.getDate())) - return date -} - -module.exports = addMonths - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_quarters/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/add_quarters/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addMonths = __webpack_require__(/*! ../add_months/index.js */ "../app/node_modules/date-fns/add_months/index.js") - -/** - * @category Quarter Helpers - * @summary Add the specified number of year quarters to the given date. - * - * @description - * Add the specified number of year quarters to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of quarters to be added - * @returns {Date} the new date with the quarters added - * - * @example - * // Add 1 quarter to 1 September 2014: - * var result = addQuarters(new Date(2014, 8, 1), 1) - * //=> Mon Dec 01 2014 00:00:00 - */ -function addQuarters (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - var months = amount * 3 - return addMonths(dirtyDate, months) -} - -module.exports = addQuarters - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_seconds/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/add_seconds/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addMilliseconds = __webpack_require__(/*! ../add_milliseconds/index.js */ "../app/node_modules/date-fns/add_milliseconds/index.js") - -/** - * @category Second Helpers - * @summary Add the specified number of seconds to the given date. - * - * @description - * Add the specified number of seconds to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of seconds to be added - * @returns {Date} the new date with the seconds added - * - * @example - * // Add 30 seconds to 10 July 2014 12:45:00: - * var result = addSeconds(new Date(2014, 6, 10, 12, 45, 0), 30) - * //=> Thu Jul 10 2014 12:45:30 - */ -function addSeconds (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMilliseconds(dirtyDate, amount * 1000) -} - -module.exports = addSeconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_weeks/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/add_weeks/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addDays = __webpack_require__(/*! ../add_days/index.js */ "../app/node_modules/date-fns/add_days/index.js") - -/** - * @category Week Helpers - * @summary Add the specified number of weeks to the given date. - * - * @description - * Add the specified number of week to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of weeks to be added - * @returns {Date} the new date with the weeks added - * - * @example - * // Add 4 weeks to 1 September 2014: - * var result = addWeeks(new Date(2014, 8, 1), 4) - * //=> Mon Sep 29 2014 00:00:00 - */ -function addWeeks (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - var days = amount * 7 - return addDays(dirtyDate, days) -} - -module.exports = addWeeks - - -/***/ }), - -/***/ "../app/node_modules/date-fns/add_years/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/add_years/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addMonths = __webpack_require__(/*! ../add_months/index.js */ "../app/node_modules/date-fns/add_months/index.js") - -/** - * @category Year Helpers - * @summary Add the specified number of years to the given date. - * - * @description - * Add the specified number of years to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of years to be added - * @returns {Date} the new date with the years added - * - * @example - * // Add 5 years to 1 September 2014: - * var result = addYears(new Date(2014, 8, 1), 5) - * //=> Sun Sep 01 2019 00:00:00 - */ -function addYears (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMonths(dirtyDate, amount * 12) -} - -module.exports = addYears - - -/***/ }), - -/***/ "../app/node_modules/date-fns/are_ranges_overlapping/index.js": -/*!********************************************************************!*\ - !*** ../app/node_modules/date-fns/are_ranges_overlapping/index.js ***! - \********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Range Helpers - * @summary Is the given date range overlapping with another date range? - * - * @description - * Is the given date range overlapping with another date range? - * - * @param {Date|String|Number} initialRangeStartDate - the start of the initial range - * @param {Date|String|Number} initialRangeEndDate - the end of the initial range - * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with - * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with - * @returns {Boolean} whether the date ranges are overlapping - * @throws {Error} startDate of a date range cannot be after its endDate - * - * @example - * // For overlapping date ranges: - * areRangesOverlapping( - * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21) - * ) - * //=> true - * - * @example - * // For non-overlapping date ranges: - * areRangesOverlapping( - * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22) - * ) - * //=> false - */ -function areRangesOverlapping (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { - var initialStartTime = parse(dirtyInitialRangeStartDate).getTime() - var initialEndTime = parse(dirtyInitialRangeEndDate).getTime() - var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime() - var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime() - - if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { - throw new Error('The start of the range cannot be after the end of the range') - } - - return initialStartTime < comparedEndTime && comparedStartTime < initialEndTime -} - -module.exports = areRangesOverlapping - - -/***/ }), - -/***/ "../app/node_modules/date-fns/closest_index_to/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/closest_index_to/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Return an index of the closest date from the array comparing to the given date. - * - * @description - * Return an index of the closest date from the array comparing to the given date. - * - * @param {Date|String|Number} dateToCompare - the date to compare with - * @param {Date[]|String[]|Number[]} datesArray - the array to search - * @returns {Number} an index of the date closest to the given date - * @throws {TypeError} the second argument must be an instance of Array - * - * @example - * // Which date is closer to 6 September 2015? - * var dateToCompare = new Date(2015, 8, 6) - * var datesArray = [ - * new Date(2015, 0, 1), - * new Date(2016, 0, 1), - * new Date(2017, 0, 1) - * ] - * var result = closestIndexTo(dateToCompare, datesArray) - * //=> 1 - */ -function closestIndexTo (dirtyDateToCompare, dirtyDatesArray) { - if (!(dirtyDatesArray instanceof Array)) { - throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array') - } - - var dateToCompare = parse(dirtyDateToCompare) - var timeToCompare = dateToCompare.getTime() - - var result - var minDistance - - dirtyDatesArray.forEach(function (dirtyDate, index) { - var currentDate = parse(dirtyDate) - var distance = Math.abs(timeToCompare - currentDate.getTime()) - if (result === undefined || distance < minDistance) { - result = index - minDistance = distance - } - }) - - return result -} - -module.exports = closestIndexTo - - -/***/ }), - -/***/ "../app/node_modules/date-fns/closest_to/index.js": -/*!********************************************************!*\ - !*** ../app/node_modules/date-fns/closest_to/index.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Return a date from the array closest to the given date. - * - * @description - * Return a date from the array closest to the given date. - * - * @param {Date|String|Number} dateToCompare - the date to compare with - * @param {Date[]|String[]|Number[]} datesArray - the array to search - * @returns {Date} the date from the array closest to the given date - * @throws {TypeError} the second argument must be an instance of Array - * - * @example - * // Which date is closer to 6 September 2015: 1 January 2000 or 1 January 2030? - * var dateToCompare = new Date(2015, 8, 6) - * var result = closestTo(dateToCompare, [ - * new Date(2000, 0, 1), - * new Date(2030, 0, 1) - * ]) - * //=> Tue Jan 01 2030 00:00:00 - */ -function closestTo (dirtyDateToCompare, dirtyDatesArray) { - if (!(dirtyDatesArray instanceof Array)) { - throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array') - } - - var dateToCompare = parse(dirtyDateToCompare) - var timeToCompare = dateToCompare.getTime() - - var result - var minDistance - - dirtyDatesArray.forEach(function (dirtyDate) { - var currentDate = parse(dirtyDate) - var distance = Math.abs(timeToCompare - currentDate.getTime()) - if (result === undefined || distance < minDistance) { - result = currentDate - minDistance = distance - } - }) - - return result -} - -module.exports = closestTo - - -/***/ }), - -/***/ "../app/node_modules/date-fns/compare_asc/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/compare_asc/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Compare the two dates and return -1, 0 or 1. - * - * @description - * Compare the two dates and return 1 if the first date is after the second, - * -1 if the first date is before the second or 0 if dates are equal. - * - * @param {Date|String|Number} dateLeft - the first date to compare - * @param {Date|String|Number} dateRight - the second date to compare - * @returns {Number} the result of the comparison - * - * @example - * // Compare 11 February 1987 and 10 July 1989: - * var result = compareAsc( - * new Date(1987, 1, 11), - * new Date(1989, 6, 10) - * ) - * //=> -1 - * - * @example - * // Sort the array of dates: - * var result = [ - * new Date(1995, 6, 2), - * new Date(1987, 1, 11), - * new Date(1989, 6, 10) - * ].sort(compareAsc) - * //=> [ - * // Wed Feb 11 1987 00:00:00, - * // Mon Jul 10 1989 00:00:00, - * // Sun Jul 02 1995 00:00:00 - * // ] - */ -function compareAsc (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var timeLeft = dateLeft.getTime() - var dateRight = parse(dirtyDateRight) - var timeRight = dateRight.getTime() - - if (timeLeft < timeRight) { - return -1 - } else if (timeLeft > timeRight) { - return 1 - } else { - return 0 - } -} - -module.exports = compareAsc - - -/***/ }), - -/***/ "../app/node_modules/date-fns/compare_desc/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/compare_desc/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Compare the two dates reverse chronologically and return -1, 0 or 1. - * - * @description - * Compare the two dates and return -1 if the first date is after the second, - * 1 if the first date is before the second or 0 if dates are equal. - * - * @param {Date|String|Number} dateLeft - the first date to compare - * @param {Date|String|Number} dateRight - the second date to compare - * @returns {Number} the result of the comparison - * - * @example - * // Compare 11 February 1987 and 10 July 1989 reverse chronologically: - * var result = compareDesc( - * new Date(1987, 1, 11), - * new Date(1989, 6, 10) - * ) - * //=> 1 - * - * @example - * // Sort the array of dates in reverse chronological order: - * var result = [ - * new Date(1995, 6, 2), - * new Date(1987, 1, 11), - * new Date(1989, 6, 10) - * ].sort(compareDesc) - * //=> [ - * // Sun Jul 02 1995 00:00:00, - * // Mon Jul 10 1989 00:00:00, - * // Wed Feb 11 1987 00:00:00 - * // ] - */ -function compareDesc (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var timeLeft = dateLeft.getTime() - var dateRight = parse(dirtyDateRight) - var timeRight = dateRight.getTime() - - if (timeLeft > timeRight) { - return -1 - } else if (timeLeft < timeRight) { - return 1 - } else { - return 0 - } -} - -module.exports = compareDesc - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_calendar_days/index.js": -/*!*************************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_calendar_days/index.js ***! - \*************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfDay = __webpack_require__(/*! ../start_of_day/index.js */ "../app/node_modules/date-fns/start_of_day/index.js") - -var MILLISECONDS_IN_MINUTE = 60000 -var MILLISECONDS_IN_DAY = 86400000 - -/** - * @category Day Helpers - * @summary Get the number of calendar days between the given dates. - * - * @description - * Get the number of calendar days between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar days - * - * @example - * // How many calendar days are between - * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? - * var result = differenceInCalendarDays( - * new Date(2012, 6, 2, 0, 0), - * new Date(2011, 6, 2, 23, 0) - * ) - * //=> 366 - */ -function differenceInCalendarDays (dirtyDateLeft, dirtyDateRight) { - var startOfDayLeft = startOfDay(dirtyDateLeft) - var startOfDayRight = startOfDay(dirtyDateRight) - - var timestampLeft = startOfDayLeft.getTime() - - startOfDayLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - var timestampRight = startOfDayRight.getTime() - - startOfDayRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - - // Round the number of days to the nearest integer - // because the number of milliseconds in a day is not constant - // (e.g. it's different in the day of the daylight saving time clock shift) - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY) -} - -module.exports = differenceInCalendarDays - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_calendar_iso_weeks/index.js": -/*!******************************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_calendar_iso_weeks/index.js ***! - \******************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfISOWeek = __webpack_require__(/*! ../start_of_iso_week/index.js */ "../app/node_modules/date-fns/start_of_iso_week/index.js") - -var MILLISECONDS_IN_MINUTE = 60000 -var MILLISECONDS_IN_WEEK = 604800000 - -/** - * @category ISO Week Helpers - * @summary Get the number of calendar ISO weeks between the given dates. - * - * @description - * Get the number of calendar ISO weeks between the given dates. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar ISO weeks - * - * @example - * // How many calendar ISO weeks are between 6 July 2014 and 21 July 2014? - * var result = differenceInCalendarISOWeeks( - * new Date(2014, 6, 21), - * new Date(2014, 6, 6) - * ) - * //=> 3 - */ -function differenceInCalendarISOWeeks (dirtyDateLeft, dirtyDateRight) { - var startOfISOWeekLeft = startOfISOWeek(dirtyDateLeft) - var startOfISOWeekRight = startOfISOWeek(dirtyDateRight) - - var timestampLeft = startOfISOWeekLeft.getTime() - - startOfISOWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - var timestampRight = startOfISOWeekRight.getTime() - - startOfISOWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - - // Round the number of days to the nearest integer - // because the number of milliseconds in a week is not constant - // (e.g. it's different in the week of the daylight saving time clock shift) - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK) -} - -module.exports = differenceInCalendarISOWeeks - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_calendar_iso_years/index.js": -/*!******************************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_calendar_iso_years/index.js ***! - \******************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getISOYear = __webpack_require__(/*! ../get_iso_year/index.js */ "../app/node_modules/date-fns/get_iso_year/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Get the number of calendar ISO week-numbering years between the given dates. - * - * @description - * Get the number of calendar ISO week-numbering years between the given dates. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar ISO week-numbering years - * - * @example - * // How many calendar ISO week-numbering years are 1 January 2010 and 1 January 2012? - * var result = differenceInCalendarISOYears( - * new Date(2012, 0, 1), - * new Date(2010, 0, 1) - * ) - * //=> 2 - */ -function differenceInCalendarISOYears (dirtyDateLeft, dirtyDateRight) { - return getISOYear(dirtyDateLeft) - getISOYear(dirtyDateRight) -} - -module.exports = differenceInCalendarISOYears - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_calendar_months/index.js": -/*!***************************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_calendar_months/index.js ***! - \***************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Month Helpers - * @summary Get the number of calendar months between the given dates. - * - * @description - * Get the number of calendar months between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar months - * - * @example - * // How many calendar months are between 31 January 2014 and 1 September 2014? - * var result = differenceInCalendarMonths( - * new Date(2014, 8, 1), - * new Date(2014, 0, 31) - * ) - * //=> 8 - */ -function differenceInCalendarMonths (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - - var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear() - var monthDiff = dateLeft.getMonth() - dateRight.getMonth() - - return yearDiff * 12 + monthDiff -} - -module.exports = differenceInCalendarMonths - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_calendar_quarters/index.js": -/*!*****************************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_calendar_quarters/index.js ***! - \*****************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getQuarter = __webpack_require__(/*! ../get_quarter/index.js */ "../app/node_modules/date-fns/get_quarter/index.js") -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Quarter Helpers - * @summary Get the number of calendar quarters between the given dates. - * - * @description - * Get the number of calendar quarters between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar quarters - * - * @example - * // How many calendar quarters are between 31 December 2013 and 2 July 2014? - * var result = differenceInCalendarQuarters( - * new Date(2014, 6, 2), - * new Date(2013, 11, 31) - * ) - * //=> 3 - */ -function differenceInCalendarQuarters (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - - var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear() - var quarterDiff = getQuarter(dateLeft) - getQuarter(dateRight) - - return yearDiff * 4 + quarterDiff -} - -module.exports = differenceInCalendarQuarters - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_calendar_weeks/index.js": -/*!**************************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_calendar_weeks/index.js ***! - \**************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfWeek = __webpack_require__(/*! ../start_of_week/index.js */ "../app/node_modules/date-fns/start_of_week/index.js") - -var MILLISECONDS_IN_MINUTE = 60000 -var MILLISECONDS_IN_WEEK = 604800000 - -/** - * @category Week Helpers - * @summary Get the number of calendar weeks between the given dates. - * - * @description - * Get the number of calendar weeks between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Number} the number of calendar weeks - * - * @example - * // How many calendar weeks are between 5 July 2014 and 20 July 2014? - * var result = differenceInCalendarWeeks( - * new Date(2014, 6, 20), - * new Date(2014, 6, 5) - * ) - * //=> 3 - * - * @example - * // If the week starts on Monday, - * // how many calendar weeks are between 5 July 2014 and 20 July 2014? - * var result = differenceInCalendarWeeks( - * new Date(2014, 6, 20), - * new Date(2014, 6, 5), - * {weekStartsOn: 1} - * ) - * //=> 2 - */ -function differenceInCalendarWeeks (dirtyDateLeft, dirtyDateRight, dirtyOptions) { - var startOfWeekLeft = startOfWeek(dirtyDateLeft, dirtyOptions) - var startOfWeekRight = startOfWeek(dirtyDateRight, dirtyOptions) - - var timestampLeft = startOfWeekLeft.getTime() - - startOfWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - var timestampRight = startOfWeekRight.getTime() - - startOfWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - - // Round the number of days to the nearest integer - // because the number of milliseconds in a week is not constant - // (e.g. it's different in the week of the daylight saving time clock shift) - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK) -} - -module.exports = differenceInCalendarWeeks - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_calendar_years/index.js": -/*!**************************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_calendar_years/index.js ***! - \**************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Year Helpers - * @summary Get the number of calendar years between the given dates. - * - * @description - * Get the number of calendar years between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar years - * - * @example - * // How many calendar years are between 31 December 2013 and 11 February 2015? - * var result = differenceInCalendarYears( - * new Date(2015, 1, 11), - * new Date(2013, 11, 31) - * ) - * //=> 2 - */ -function differenceInCalendarYears (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - - return dateLeft.getFullYear() - dateRight.getFullYear() -} - -module.exports = differenceInCalendarYears - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_days/index.js": -/*!****************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_days/index.js ***! - \****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var differenceInCalendarDays = __webpack_require__(/*! ../difference_in_calendar_days/index.js */ "../app/node_modules/date-fns/difference_in_calendar_days/index.js") -var compareAsc = __webpack_require__(/*! ../compare_asc/index.js */ "../app/node_modules/date-fns/compare_asc/index.js") - -/** - * @category Day Helpers - * @summary Get the number of full days between the given dates. - * - * @description - * Get the number of full days between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full days - * - * @example - * // How many full days are between - * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? - * var result = differenceInDays( - * new Date(2012, 6, 2, 0, 0), - * new Date(2011, 6, 2, 23, 0) - * ) - * //=> 365 - */ -function differenceInDays (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - - var sign = compareAsc(dateLeft, dateRight) - var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight)) - dateLeft.setDate(dateLeft.getDate() - sign * difference) - - // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full - // If so, result must be decreased by 1 in absolute value - var isLastDayNotFull = compareAsc(dateLeft, dateRight) === -sign - return sign * (difference - isLastDayNotFull) -} - -module.exports = differenceInDays - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_hours/index.js": -/*!*****************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_hours/index.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var differenceInMilliseconds = __webpack_require__(/*! ../difference_in_milliseconds/index.js */ "../app/node_modules/date-fns/difference_in_milliseconds/index.js") - -var MILLISECONDS_IN_HOUR = 3600000 - -/** - * @category Hour Helpers - * @summary Get the number of hours between the given dates. - * - * @description - * Get the number of hours between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of hours - * - * @example - * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00? - * var result = differenceInHours( - * new Date(2014, 6, 2, 19, 0), - * new Date(2014, 6, 2, 6, 50) - * ) - * //=> 12 - */ -function differenceInHours (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_HOUR - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} - -module.exports = differenceInHours - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_iso_years/index.js": -/*!*********************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_iso_years/index.js ***! - \*********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var differenceInCalendarISOYears = __webpack_require__(/*! ../difference_in_calendar_iso_years/index.js */ "../app/node_modules/date-fns/difference_in_calendar_iso_years/index.js") -var compareAsc = __webpack_require__(/*! ../compare_asc/index.js */ "../app/node_modules/date-fns/compare_asc/index.js") -var subISOYears = __webpack_require__(/*! ../sub_iso_years/index.js */ "../app/node_modules/date-fns/sub_iso_years/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Get the number of full ISO week-numbering years between the given dates. - * - * @description - * Get the number of full ISO week-numbering years between the given dates. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full ISO week-numbering years - * - * @example - * // How many full ISO week-numbering years are between 1 January 2010 and 1 January 2012? - * var result = differenceInISOYears( - * new Date(2012, 0, 1), - * new Date(2010, 0, 1) - * ) - * //=> 1 - */ -function differenceInISOYears (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - - var sign = compareAsc(dateLeft, dateRight) - var difference = Math.abs(differenceInCalendarISOYears(dateLeft, dateRight)) - dateLeft = subISOYears(dateLeft, sign * difference) - - // Math.abs(diff in full ISO years - diff in calendar ISO years) === 1 - // if last calendar ISO year is not full - // If so, result must be decreased by 1 in absolute value - var isLastISOYearNotFull = compareAsc(dateLeft, dateRight) === -sign - return sign * (difference - isLastISOYearNotFull) -} - -module.exports = differenceInISOYears - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_milliseconds/index.js": -/*!************************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_milliseconds/index.js ***! - \************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Millisecond Helpers - * @summary Get the number of milliseconds between the given dates. - * - * @description - * Get the number of milliseconds between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of milliseconds - * - * @example - * // How many milliseconds are between - * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700? - * var result = differenceInMilliseconds( - * new Date(2014, 6, 2, 12, 30, 21, 700), - * new Date(2014, 6, 2, 12, 30, 20, 600) - * ) - * //=> 1100 - */ -function differenceInMilliseconds (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - return dateLeft.getTime() - dateRight.getTime() -} - -module.exports = differenceInMilliseconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_minutes/index.js": -/*!*******************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_minutes/index.js ***! - \*******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var differenceInMilliseconds = __webpack_require__(/*! ../difference_in_milliseconds/index.js */ "../app/node_modules/date-fns/difference_in_milliseconds/index.js") - -var MILLISECONDS_IN_MINUTE = 60000 - -/** - * @category Minute Helpers - * @summary Get the number of minutes between the given dates. - * - * @description - * Get the number of minutes between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of minutes - * - * @example - * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00? - * var result = differenceInMinutes( - * new Date(2014, 6, 2, 12, 20, 0), - * new Date(2014, 6, 2, 12, 7, 59) - * ) - * //=> 12 - */ -function differenceInMinutes (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_MINUTE - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} - -module.exports = differenceInMinutes - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_months/index.js": -/*!******************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_months/index.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var differenceInCalendarMonths = __webpack_require__(/*! ../difference_in_calendar_months/index.js */ "../app/node_modules/date-fns/difference_in_calendar_months/index.js") -var compareAsc = __webpack_require__(/*! ../compare_asc/index.js */ "../app/node_modules/date-fns/compare_asc/index.js") - -/** - * @category Month Helpers - * @summary Get the number of full months between the given dates. - * - * @description - * Get the number of full months between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full months - * - * @example - * // How many full months are between 31 January 2014 and 1 September 2014? - * var result = differenceInMonths( - * new Date(2014, 8, 1), - * new Date(2014, 0, 31) - * ) - * //=> 7 - */ -function differenceInMonths (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - - var sign = compareAsc(dateLeft, dateRight) - var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight)) - dateLeft.setMonth(dateLeft.getMonth() - sign * difference) - - // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full - // If so, result must be decreased by 1 in absolute value - var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign - return sign * (difference - isLastMonthNotFull) -} - -module.exports = differenceInMonths - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_quarters/index.js": -/*!********************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_quarters/index.js ***! - \********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var differenceInMonths = __webpack_require__(/*! ../difference_in_months/index.js */ "../app/node_modules/date-fns/difference_in_months/index.js") - -/** - * @category Quarter Helpers - * @summary Get the number of full quarters between the given dates. - * - * @description - * Get the number of full quarters between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full quarters - * - * @example - * // How many full quarters are between 31 December 2013 and 2 July 2014? - * var result = differenceInQuarters( - * new Date(2014, 6, 2), - * new Date(2013, 11, 31) - * ) - * //=> 2 - */ -function differenceInQuarters (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMonths(dirtyDateLeft, dirtyDateRight) / 3 - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} - -module.exports = differenceInQuarters - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_seconds/index.js": -/*!*******************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_seconds/index.js ***! - \*******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var differenceInMilliseconds = __webpack_require__(/*! ../difference_in_milliseconds/index.js */ "../app/node_modules/date-fns/difference_in_milliseconds/index.js") - -/** - * @category Second Helpers - * @summary Get the number of seconds between the given dates. - * - * @description - * Get the number of seconds between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of seconds - * - * @example - * // How many seconds are between - * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000? - * var result = differenceInSeconds( - * new Date(2014, 6, 2, 12, 30, 20, 0), - * new Date(2014, 6, 2, 12, 30, 7, 999) - * ) - * //=> 12 - */ -function differenceInSeconds (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / 1000 - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} - -module.exports = differenceInSeconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_weeks/index.js": -/*!*****************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_weeks/index.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var differenceInDays = __webpack_require__(/*! ../difference_in_days/index.js */ "../app/node_modules/date-fns/difference_in_days/index.js") - -/** - * @category Week Helpers - * @summary Get the number of full weeks between the given dates. - * - * @description - * Get the number of full weeks between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full weeks - * - * @example - * // How many full weeks are between 5 July 2014 and 20 July 2014? - * var result = differenceInWeeks( - * new Date(2014, 6, 20), - * new Date(2014, 6, 5) - * ) - * //=> 2 - */ -function differenceInWeeks (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInDays(dirtyDateLeft, dirtyDateRight) / 7 - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} - -module.exports = differenceInWeeks - - -/***/ }), - -/***/ "../app/node_modules/date-fns/difference_in_years/index.js": -/*!*****************************************************************!*\ - !*** ../app/node_modules/date-fns/difference_in_years/index.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var differenceInCalendarYears = __webpack_require__(/*! ../difference_in_calendar_years/index.js */ "../app/node_modules/date-fns/difference_in_calendar_years/index.js") -var compareAsc = __webpack_require__(/*! ../compare_asc/index.js */ "../app/node_modules/date-fns/compare_asc/index.js") - -/** - * @category Year Helpers - * @summary Get the number of full years between the given dates. - * - * @description - * Get the number of full years between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full years - * - * @example - * // How many full years are between 31 December 2013 and 11 February 2015? - * var result = differenceInYears( - * new Date(2015, 1, 11), - * new Date(2013, 11, 31) - * ) - * //=> 1 - */ -function differenceInYears (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - - var sign = compareAsc(dateLeft, dateRight) - var difference = Math.abs(differenceInCalendarYears(dateLeft, dateRight)) - dateLeft.setFullYear(dateLeft.getFullYear() - sign * difference) - - // Math.abs(diff in full years - diff in calendar years) === 1 if last calendar year is not full - // If so, result must be decreased by 1 in absolute value - var isLastYearNotFull = compareAsc(dateLeft, dateRight) === -sign - return sign * (difference - isLastYearNotFull) -} - -module.exports = differenceInYears - - -/***/ }), - -/***/ "../app/node_modules/date-fns/distance_in_words/index.js": -/*!***************************************************************!*\ - !*** ../app/node_modules/date-fns/distance_in_words/index.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var compareDesc = __webpack_require__(/*! ../compare_desc/index.js */ "../app/node_modules/date-fns/compare_desc/index.js") -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var differenceInSeconds = __webpack_require__(/*! ../difference_in_seconds/index.js */ "../app/node_modules/date-fns/difference_in_seconds/index.js") -var differenceInMonths = __webpack_require__(/*! ../difference_in_months/index.js */ "../app/node_modules/date-fns/difference_in_months/index.js") -var enLocale = __webpack_require__(/*! ../locale/en/index.js */ "../app/node_modules/date-fns/locale/en/index.js") - -var MINUTES_IN_DAY = 1440 -var MINUTES_IN_ALMOST_TWO_DAYS = 2520 -var MINUTES_IN_MONTH = 43200 -var MINUTES_IN_TWO_MONTHS = 86400 - -/** - * @category Common Helpers - * @summary Return the distance between the given dates in words. - * - * @description - * Return the distance between the given dates in words. - * - * | Distance between dates | Result | - * |-------------------------------------------------------------------|---------------------| - * | 0 ... 30 secs | less than a minute | - * | 30 secs ... 1 min 30 secs | 1 minute | - * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes | - * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour | - * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours | - * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day | - * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days | - * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month | - * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months | - * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months | - * | 1 yr ... 1 yr 3 months | about 1 year | - * | 1 yr 3 months ... 1 yr 9 month s | over 1 year | - * | 1 yr 9 months ... 2 yrs | almost 2 years | - * | N yrs ... N yrs 3 months | about N years | - * | N yrs 3 months ... N yrs 9 months | over N years | - * | N yrs 9 months ... N+1 yrs | almost N+1 years | - * - * With `options.includeSeconds == true`: - * | Distance between dates | Result | - * |------------------------|----------------------| - * | 0 secs ... 5 secs | less than 5 seconds | - * | 5 secs ... 10 secs | less than 10 seconds | - * | 10 secs ... 20 secs | less than 20 seconds | - * | 20 secs ... 40 secs | half a minute | - * | 40 secs ... 60 secs | less than a minute | - * | 60 secs ... 90 secs | 1 minute | - * - * @param {Date|String|Number} dateToCompare - the date to compare with - * @param {Date|String|Number} date - the other date - * @param {Object} [options] - the object with options - * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed - * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first - * @param {Object} [options.locale=enLocale] - the locale object - * @returns {String} the distance in words - * - * @example - * // What is the distance between 2 July 2014 and 1 January 2015? - * var result = distanceInWords( - * new Date(2014, 6, 2), - * new Date(2015, 0, 1) - * ) - * //=> '6 months' - * - * @example - * // What is the distance between 1 January 2015 00:00:15 - * // and 1 January 2015 00:00:00, including seconds? - * var result = distanceInWords( - * new Date(2015, 0, 1, 0, 0, 15), - * new Date(2015, 0, 1, 0, 0, 0), - * {includeSeconds: true} - * ) - * //=> 'less than 20 seconds' - * - * @example - * // What is the distance from 1 January 2016 - * // to 1 January 2015, with a suffix? - * var result = distanceInWords( - * new Date(2016, 0, 1), - * new Date(2015, 0, 1), - * {addSuffix: true} - * ) - * //=> 'about 1 year ago' - * - * @example - * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto? - * var eoLocale = require('date-fns/locale/eo') - * var result = distanceInWords( - * new Date(2016, 7, 1), - * new Date(2015, 0, 1), - * {locale: eoLocale} - * ) - * //=> 'pli ol 1 jaro' - */ -function distanceInWords (dirtyDateToCompare, dirtyDate, dirtyOptions) { - var options = dirtyOptions || {} - - var comparison = compareDesc(dirtyDateToCompare, dirtyDate) - - var locale = options.locale - var localize = enLocale.distanceInWords.localize - if (locale && locale.distanceInWords && locale.distanceInWords.localize) { - localize = locale.distanceInWords.localize - } - - var localizeOptions = { - addSuffix: Boolean(options.addSuffix), - comparison: comparison - } - - var dateLeft, dateRight - if (comparison > 0) { - dateLeft = parse(dirtyDateToCompare) - dateRight = parse(dirtyDate) - } else { - dateLeft = parse(dirtyDate) - dateRight = parse(dirtyDateToCompare) - } - - var seconds = differenceInSeconds(dateRight, dateLeft) - var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset() - var minutes = Math.round(seconds / 60) - offset - var months - - // 0 up to 2 mins - if (minutes < 2) { - if (options.includeSeconds) { - if (seconds < 5) { - return localize('lessThanXSeconds', 5, localizeOptions) - } else if (seconds < 10) { - return localize('lessThanXSeconds', 10, localizeOptions) - } else if (seconds < 20) { - return localize('lessThanXSeconds', 20, localizeOptions) - } else if (seconds < 40) { - return localize('halfAMinute', null, localizeOptions) - } else if (seconds < 60) { - return localize('lessThanXMinutes', 1, localizeOptions) - } else { - return localize('xMinutes', 1, localizeOptions) - } - } else { - if (minutes === 0) { - return localize('lessThanXMinutes', 1, localizeOptions) - } else { - return localize('xMinutes', minutes, localizeOptions) - } - } - - // 2 mins up to 0.75 hrs - } else if (minutes < 45) { - return localize('xMinutes', minutes, localizeOptions) - - // 0.75 hrs up to 1.5 hrs - } else if (minutes < 90) { - return localize('aboutXHours', 1, localizeOptions) - - // 1.5 hrs up to 24 hrs - } else if (minutes < MINUTES_IN_DAY) { - var hours = Math.round(minutes / 60) - return localize('aboutXHours', hours, localizeOptions) - - // 1 day up to 1.75 days - } else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) { - return localize('xDays', 1, localizeOptions) - - // 1.75 days up to 30 days - } else if (minutes < MINUTES_IN_MONTH) { - var days = Math.round(minutes / MINUTES_IN_DAY) - return localize('xDays', days, localizeOptions) - - // 1 month up to 2 months - } else if (minutes < MINUTES_IN_TWO_MONTHS) { - months = Math.round(minutes / MINUTES_IN_MONTH) - return localize('aboutXMonths', months, localizeOptions) - } - - months = differenceInMonths(dateRight, dateLeft) - - // 2 months up to 12 months - if (months < 12) { - var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH) - return localize('xMonths', nearestMonth, localizeOptions) - - // 1 year up to max Date - } else { - var monthsSinceStartOfYear = months % 12 - var years = Math.floor(months / 12) - - // N years up to 1 years 3 months - if (monthsSinceStartOfYear < 3) { - return localize('aboutXYears', years, localizeOptions) - - // N years 3 months up to N years 9 months - } else if (monthsSinceStartOfYear < 9) { - return localize('overXYears', years, localizeOptions) - - // N years 9 months up to N year 12 months - } else { - return localize('almostXYears', years + 1, localizeOptions) - } - } -} - -module.exports = distanceInWords - - -/***/ }), - -/***/ "../app/node_modules/date-fns/distance_in_words_strict/index.js": -/*!**********************************************************************!*\ - !*** ../app/node_modules/date-fns/distance_in_words_strict/index.js ***! - \**********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var compareDesc = __webpack_require__(/*! ../compare_desc/index.js */ "../app/node_modules/date-fns/compare_desc/index.js") -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var differenceInSeconds = __webpack_require__(/*! ../difference_in_seconds/index.js */ "../app/node_modules/date-fns/difference_in_seconds/index.js") -var enLocale = __webpack_require__(/*! ../locale/en/index.js */ "../app/node_modules/date-fns/locale/en/index.js") - -var MINUTES_IN_DAY = 1440 -var MINUTES_IN_MONTH = 43200 -var MINUTES_IN_YEAR = 525600 - -/** - * @category Common Helpers - * @summary Return the distance between the given dates in words. - * - * @description - * Return the distance between the given dates in words, using strict units. - * This is like `distanceInWords`, but does not use helpers like 'almost', 'over', - * 'less than' and the like. - * - * | Distance between dates | Result | - * |------------------------|---------------------| - * | 0 ... 59 secs | [0..59] seconds | - * | 1 ... 59 mins | [1..59] minutes | - * | 1 ... 23 hrs | [1..23] hours | - * | 1 ... 29 days | [1..29] days | - * | 1 ... 11 months | [1..11] months | - * | 1 ... N years | [1..N] years | - * - * @param {Date|String|Number} dateToCompare - the date to compare with - * @param {Date|String|Number} date - the other date - * @param {Object} [options] - the object with options - * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first - * @param {'s'|'m'|'h'|'d'|'M'|'Y'} [options.unit] - if specified, will force a unit - * @param {'floor'|'ceil'|'round'} [options.partialMethod='floor'] - which way to round partial units - * @param {Object} [options.locale=enLocale] - the locale object - * @returns {String} the distance in words - * - * @example - * // What is the distance between 2 July 2014 and 1 January 2015? - * var result = distanceInWordsStrict( - * new Date(2014, 6, 2), - * new Date(2015, 0, 2) - * ) - * //=> '6 months' - * - * @example - * // What is the distance between 1 January 2015 00:00:15 - * // and 1 January 2015 00:00:00? - * var result = distanceInWordsStrict( - * new Date(2015, 0, 1, 0, 0, 15), - * new Date(2015, 0, 1, 0, 0, 0), - * ) - * //=> '15 seconds' - * - * @example - * // What is the distance from 1 January 2016 - * // to 1 January 2015, with a suffix? - * var result = distanceInWordsStrict( - * new Date(2016, 0, 1), - * new Date(2015, 0, 1), - * {addSuffix: true} - * ) - * //=> '1 year ago' - * - * @example - * // What is the distance from 1 January 2016 - * // to 1 January 2015, in minutes? - * var result = distanceInWordsStrict( - * new Date(2016, 0, 1), - * new Date(2015, 0, 1), - * {unit: 'm'} - * ) - * //=> '525600 minutes' - * - * @example - * // What is the distance from 1 January 2016 - * // to 28 January 2015, in months, rounded up? - * var result = distanceInWordsStrict( - * new Date(2015, 0, 28), - * new Date(2015, 0, 1), - * {unit: 'M', partialMethod: 'ceil'} - * ) - * //=> '1 month' - * - * @example - * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto? - * var eoLocale = require('date-fns/locale/eo') - * var result = distanceInWordsStrict( - * new Date(2016, 7, 1), - * new Date(2015, 0, 1), - * {locale: eoLocale} - * ) - * //=> '1 jaro' - */ -function distanceInWordsStrict (dirtyDateToCompare, dirtyDate, dirtyOptions) { - var options = dirtyOptions || {} - - var comparison = compareDesc(dirtyDateToCompare, dirtyDate) - - var locale = options.locale - var localize = enLocale.distanceInWords.localize - if (locale && locale.distanceInWords && locale.distanceInWords.localize) { - localize = locale.distanceInWords.localize - } - - var localizeOptions = { - addSuffix: Boolean(options.addSuffix), - comparison: comparison - } - - var dateLeft, dateRight - if (comparison > 0) { - dateLeft = parse(dirtyDateToCompare) - dateRight = parse(dirtyDate) - } else { - dateLeft = parse(dirtyDate) - dateRight = parse(dirtyDateToCompare) - } - - var unit - var mathPartial = Math[options.partialMethod ? String(options.partialMethod) : 'floor'] - var seconds = differenceInSeconds(dateRight, dateLeft) - var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset() - var minutes = mathPartial(seconds / 60) - offset - var hours, days, months, years - - if (options.unit) { - unit = String(options.unit) - } else { - if (minutes < 1) { - unit = 's' - } else if (minutes < 60) { - unit = 'm' - } else if (minutes < MINUTES_IN_DAY) { - unit = 'h' - } else if (minutes < MINUTES_IN_MONTH) { - unit = 'd' - } else if (minutes < MINUTES_IN_YEAR) { - unit = 'M' - } else { - unit = 'Y' - } - } - - // 0 up to 60 seconds - if (unit === 's') { - return localize('xSeconds', seconds, localizeOptions) - - // 1 up to 60 mins - } else if (unit === 'm') { - return localize('xMinutes', minutes, localizeOptions) - - // 1 up to 24 hours - } else if (unit === 'h') { - hours = mathPartial(minutes / 60) - return localize('xHours', hours, localizeOptions) - - // 1 up to 30 days - } else if (unit === 'd') { - days = mathPartial(minutes / MINUTES_IN_DAY) - return localize('xDays', days, localizeOptions) - - // 1 up to 12 months - } else if (unit === 'M') { - months = mathPartial(minutes / MINUTES_IN_MONTH) - return localize('xMonths', months, localizeOptions) - - // 1 year up to max Date - } else if (unit === 'Y') { - years = mathPartial(minutes / MINUTES_IN_YEAR) - return localize('xYears', years, localizeOptions) - } - - throw new Error('Unknown unit: ' + unit) -} - -module.exports = distanceInWordsStrict - - -/***/ }), - -/***/ "../app/node_modules/date-fns/distance_in_words_to_now/index.js": -/*!**********************************************************************!*\ - !*** ../app/node_modules/date-fns/distance_in_words_to_now/index.js ***! - \**********************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var distanceInWords = __webpack_require__(/*! ../distance_in_words/index.js */ "../app/node_modules/date-fns/distance_in_words/index.js") - -/** - * @category Common Helpers - * @summary Return the distance between the given date and now in words. - * - * @description - * Return the distance between the given date and now in words. - * - * | Distance to now | Result | - * |-------------------------------------------------------------------|---------------------| - * | 0 ... 30 secs | less than a minute | - * | 30 secs ... 1 min 30 secs | 1 minute | - * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes | - * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour | - * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours | - * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day | - * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days | - * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month | - * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months | - * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months | - * | 1 yr ... 1 yr 3 months | about 1 year | - * | 1 yr 3 months ... 1 yr 9 month s | over 1 year | - * | 1 yr 9 months ... 2 yrs | almost 2 years | - * | N yrs ... N yrs 3 months | about N years | - * | N yrs 3 months ... N yrs 9 months | over N years | - * | N yrs 9 months ... N+1 yrs | almost N+1 years | - * - * With `options.includeSeconds == true`: - * | Distance to now | Result | - * |---------------------|----------------------| - * | 0 secs ... 5 secs | less than 5 seconds | - * | 5 secs ... 10 secs | less than 10 seconds | - * | 10 secs ... 20 secs | less than 20 seconds | - * | 20 secs ... 40 secs | half a minute | - * | 40 secs ... 60 secs | less than a minute | - * | 60 secs ... 90 secs | 1 minute | - * - * @param {Date|String|Number} date - the given date - * @param {Object} [options] - the object with options - * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed - * @param {Boolean} [options.addSuffix=false] - result specifies if the second date is earlier or later than the first - * @param {Object} [options.locale=enLocale] - the locale object - * @returns {String} the distance in words - * - * @example - * // If today is 1 January 2015, what is the distance to 2 July 2014? - * var result = distanceInWordsToNow( - * new Date(2014, 6, 2) - * ) - * //=> '6 months' - * - * @example - * // If now is 1 January 2015 00:00:00, - * // what is the distance to 1 January 2015 00:00:15, including seconds? - * var result = distanceInWordsToNow( - * new Date(2015, 0, 1, 0, 0, 15), - * {includeSeconds: true} - * ) - * //=> 'less than 20 seconds' - * - * @example - * // If today is 1 January 2015, - * // what is the distance to 1 January 2016, with a suffix? - * var result = distanceInWordsToNow( - * new Date(2016, 0, 1), - * {addSuffix: true} - * ) - * //=> 'in about 1 year' - * - * @example - * // If today is 1 January 2015, - * // what is the distance to 1 August 2016 in Esperanto? - * var eoLocale = require('date-fns/locale/eo') - * var result = distanceInWordsToNow( - * new Date(2016, 7, 1), - * {locale: eoLocale} - * ) - * //=> 'pli ol 1 jaro' - */ -function distanceInWordsToNow (dirtyDate, dirtyOptions) { - return distanceInWords(Date.now(), dirtyDate, dirtyOptions) -} - -module.exports = distanceInWordsToNow - - -/***/ }), - -/***/ "../app/node_modules/date-fns/each_day/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/each_day/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Day Helpers - * @summary Return the array of dates within the specified range. - * - * @description - * Return the array of dates within the specified range. - * - * @param {Date|String|Number} startDate - the first date - * @param {Date|String|Number} endDate - the last date - * @param {Number} [step=1] - the step between each day - * @returns {Date[]} the array with starts of days from the day of startDate to the day of endDate - * @throws {Error} startDate cannot be after endDate - * - * @example - * // Each day between 6 October 2014 and 10 October 2014: - * var result = eachDay( - * new Date(2014, 9, 6), - * new Date(2014, 9, 10) - * ) - * //=> [ - * // Mon Oct 06 2014 00:00:00, - * // Tue Oct 07 2014 00:00:00, - * // Wed Oct 08 2014 00:00:00, - * // Thu Oct 09 2014 00:00:00, - * // Fri Oct 10 2014 00:00:00 - * // ] - */ -function eachDay (dirtyStartDate, dirtyEndDate, dirtyStep) { - var startDate = parse(dirtyStartDate) - var endDate = parse(dirtyEndDate) - var step = dirtyStep !== undefined ? dirtyStep : 1 - - var endTime = endDate.getTime() - - if (startDate.getTime() > endTime) { - throw new Error('The first date cannot be after the second date') - } - - var dates = [] - - var currentDate = startDate - currentDate.setHours(0, 0, 0, 0) - - while (currentDate.getTime() <= endTime) { - dates.push(parse(currentDate)) - currentDate.setDate(currentDate.getDate() + step) - } - - return dates -} - -module.exports = eachDay - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_day/index.js": -/*!********************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_day/index.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Day Helpers - * @summary Return the end of a day for the given date. - * - * @description - * Return the end of a day for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a day - * - * @example - * // The end of a day for 2 September 2014 11:55:00: - * var result = endOfDay(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 02 2014 23:59:59.999 - */ -function endOfDay (dirtyDate) { - var date = parse(dirtyDate) - date.setHours(23, 59, 59, 999) - return date -} - -module.exports = endOfDay - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_hour/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_hour/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Hour Helpers - * @summary Return the end of an hour for the given date. - * - * @description - * Return the end of an hour for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of an hour - * - * @example - * // The end of an hour for 2 September 2014 11:55:00: - * var result = endOfHour(new Date(2014, 8, 2, 11, 55)) - * //=> Tue Sep 02 2014 11:59:59.999 - */ -function endOfHour (dirtyDate) { - var date = parse(dirtyDate) - date.setMinutes(59, 59, 999) - return date -} - -module.exports = endOfHour - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_iso_week/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_iso_week/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var endOfWeek = __webpack_require__(/*! ../end_of_week/index.js */ "../app/node_modules/date-fns/end_of_week/index.js") - -/** - * @category ISO Week Helpers - * @summary Return the end of an ISO week for the given date. - * - * @description - * Return the end of an ISO week for the given date. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of an ISO week - * - * @example - * // The end of an ISO week for 2 September 2014 11:55:00: - * var result = endOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sun Sep 07 2014 23:59:59.999 - */ -function endOfISOWeek (dirtyDate) { - return endOfWeek(dirtyDate, {weekStartsOn: 1}) -} - -module.exports = endOfISOWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_iso_year/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_iso_year/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getISOYear = __webpack_require__(/*! ../get_iso_year/index.js */ "../app/node_modules/date-fns/get_iso_year/index.js") -var startOfISOWeek = __webpack_require__(/*! ../start_of_iso_week/index.js */ "../app/node_modules/date-fns/start_of_iso_week/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Return the end of an ISO week-numbering year for the given date. - * - * @description - * Return the end of an ISO week-numbering year, - * which always starts 3 days before the year's first Thursday. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of an ISO week-numbering year - * - * @example - * // The end of an ISO week-numbering year for 2 July 2005: - * var result = endOfISOYear(new Date(2005, 6, 2)) - * //=> Sun Jan 01 2006 23:59:59.999 - */ -function endOfISOYear (dirtyDate) { - var year = getISOYear(dirtyDate) - var fourthOfJanuaryOfNextYear = new Date(0) - fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4) - fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0) - var date = startOfISOWeek(fourthOfJanuaryOfNextYear) - date.setMilliseconds(date.getMilliseconds() - 1) - return date -} - -module.exports = endOfISOYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_minute/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_minute/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Minute Helpers - * @summary Return the end of a minute for the given date. - * - * @description - * Return the end of a minute for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a minute - * - * @example - * // The end of a minute for 1 December 2014 22:15:45.400: - * var result = endOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:59.999 - */ -function endOfMinute (dirtyDate) { - var date = parse(dirtyDate) - date.setSeconds(59, 999) - return date -} - -module.exports = endOfMinute - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_month/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_month/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Month Helpers - * @summary Return the end of a month for the given date. - * - * @description - * Return the end of a month for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a month - * - * @example - * // The end of a month for 2 September 2014 11:55:00: - * var result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 30 2014 23:59:59.999 - */ -function endOfMonth (dirtyDate) { - var date = parse(dirtyDate) - var month = date.getMonth() - date.setFullYear(date.getFullYear(), month + 1, 0) - date.setHours(23, 59, 59, 999) - return date -} - -module.exports = endOfMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_quarter/index.js": -/*!************************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_quarter/index.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Quarter Helpers - * @summary Return the end of a year quarter for the given date. - * - * @description - * Return the end of a year quarter for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a quarter - * - * @example - * // The end of a quarter for 2 September 2014 11:55:00: - * var result = endOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 30 2014 23:59:59.999 - */ -function endOfQuarter (dirtyDate) { - var date = parse(dirtyDate) - var currentMonth = date.getMonth() - var month = currentMonth - currentMonth % 3 + 3 - date.setMonth(month, 0) - date.setHours(23, 59, 59, 999) - return date -} - -module.exports = endOfQuarter - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_second/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_second/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Second Helpers - * @summary Return the end of a second for the given date. - * - * @description - * Return the end of a second for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a second - * - * @example - * // The end of a second for 1 December 2014 22:15:45.400: - * var result = endOfSecond(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:45.999 - */ -function endOfSecond (dirtyDate) { - var date = parse(dirtyDate) - date.setMilliseconds(999) - return date -} - -module.exports = endOfSecond - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_today/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_today/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var endOfDay = __webpack_require__(/*! ../end_of_day/index.js */ "../app/node_modules/date-fns/end_of_day/index.js") - -/** - * @category Day Helpers - * @summary Return the end of today. - * - * @description - * Return the end of today. - * - * @returns {Date} the end of today - * - * @example - * // If today is 6 October 2014: - * var result = endOfToday() - * //=> Mon Oct 6 2014 23:59:59.999 - */ -function endOfToday () { - return endOfDay(new Date()) -} - -module.exports = endOfToday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_tomorrow/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_tomorrow/index.js ***! - \*************************************************************/ -/***/ ((module) => { - -/** - * @category Day Helpers - * @summary Return the end of tomorrow. - * - * @description - * Return the end of tomorrow. - * - * @returns {Date} the end of tomorrow - * - * @example - * // If today is 6 October 2014: - * var result = endOfTomorrow() - * //=> Tue Oct 7 2014 23:59:59.999 - */ -function endOfTomorrow () { - var now = new Date() - var year = now.getFullYear() - var month = now.getMonth() - var day = now.getDate() - - var date = new Date(0) - date.setFullYear(year, month, day + 1) - date.setHours(23, 59, 59, 999) - return date -} - -module.exports = endOfTomorrow - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_week/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_week/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Week Helpers - * @summary Return the end of a week for the given date. - * - * @description - * Return the end of a week for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Date} the end of a week - * - * @example - * // The end of a week for 2 September 2014 11:55:00: - * var result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sat Sep 06 2014 23:59:59.999 - * - * @example - * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00: - * var result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) - * //=> Sun Sep 07 2014 23:59:59.999 - */ -function endOfWeek (dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - - var date = parse(dirtyDate) - var day = date.getDay() - var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn) - - date.setDate(date.getDate() + diff) - date.setHours(23, 59, 59, 999) - return date -} - -module.exports = endOfWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_year/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_year/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Year Helpers - * @summary Return the end of a year for the given date. - * - * @description - * Return the end of a year for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a year - * - * @example - * // The end of a year for 2 September 2014 11:55:00: - * var result = endOfYear(new Date(2014, 8, 2, 11, 55, 00)) - * //=> Wed Dec 31 2014 23:59:59.999 - */ -function endOfYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - date.setFullYear(year + 1, 0, 0) - date.setHours(23, 59, 59, 999) - return date -} - -module.exports = endOfYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/end_of_yesterday/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/end_of_yesterday/index.js ***! - \**************************************************************/ -/***/ ((module) => { - -/** - * @category Day Helpers - * @summary Return the end of yesterday. - * - * @description - * Return the end of yesterday. - * - * @returns {Date} the end of yesterday - * - * @example - * // If today is 6 October 2014: - * var result = endOfYesterday() - * //=> Sun Oct 5 2014 23:59:59.999 - */ -function endOfYesterday () { - var now = new Date() - var year = now.getFullYear() - var month = now.getMonth() - var day = now.getDate() - - var date = new Date(0) - date.setFullYear(year, month, day - 1) - date.setHours(23, 59, 59, 999) - return date -} - -module.exports = endOfYesterday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/format/index.js": -/*!****************************************************!*\ - !*** ../app/node_modules/date-fns/format/index.js ***! - \****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getDayOfYear = __webpack_require__(/*! ../get_day_of_year/index.js */ "../app/node_modules/date-fns/get_day_of_year/index.js") -var getISOWeek = __webpack_require__(/*! ../get_iso_week/index.js */ "../app/node_modules/date-fns/get_iso_week/index.js") -var getISOYear = __webpack_require__(/*! ../get_iso_year/index.js */ "../app/node_modules/date-fns/get_iso_year/index.js") -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var isValid = __webpack_require__(/*! ../is_valid/index.js */ "../app/node_modules/date-fns/is_valid/index.js") -var enLocale = __webpack_require__(/*! ../locale/en/index.js */ "../app/node_modules/date-fns/locale/en/index.js") - -/** - * @category Common Helpers - * @summary Format the date. - * - * @description - * Return the formatted date string in the given format. - * - * Accepted tokens: - * | Unit | Token | Result examples | - * |-------------------------|-------|----------------------------------| - * | Month | M | 1, 2, ..., 12 | - * | | Mo | 1st, 2nd, ..., 12th | - * | | MM | 01, 02, ..., 12 | - * | | MMM | Jan, Feb, ..., Dec | - * | | MMMM | January, February, ..., December | - * | Quarter | Q | 1, 2, 3, 4 | - * | | Qo | 1st, 2nd, 3rd, 4th | - * | Day of month | D | 1, 2, ..., 31 | - * | | Do | 1st, 2nd, ..., 31st | - * | | DD | 01, 02, ..., 31 | - * | Day of year | DDD | 1, 2, ..., 366 | - * | | DDDo | 1st, 2nd, ..., 366th | - * | | DDDD | 001, 002, ..., 366 | - * | Day of week | d | 0, 1, ..., 6 | - * | | do | 0th, 1st, ..., 6th | - * | | dd | Su, Mo, ..., Sa | - * | | ddd | Sun, Mon, ..., Sat | - * | | dddd | Sunday, Monday, ..., Saturday | - * | Day of ISO week | E | 1, 2, ..., 7 | - * | ISO week | W | 1, 2, ..., 53 | - * | | Wo | 1st, 2nd, ..., 53rd | - * | | WW | 01, 02, ..., 53 | - * | Year | YY | 00, 01, ..., 99 | - * | | YYYY | 1900, 1901, ..., 2099 | - * | ISO week-numbering year | GG | 00, 01, ..., 99 | - * | | GGGG | 1900, 1901, ..., 2099 | - * | AM/PM | A | AM, PM | - * | | a | am, pm | - * | | aa | a.m., p.m. | - * | Hour | H | 0, 1, ... 23 | - * | | HH | 00, 01, ... 23 | - * | | h | 1, 2, ..., 12 | - * | | hh | 01, 02, ..., 12 | - * | Minute | m | 0, 1, ..., 59 | - * | | mm | 00, 01, ..., 59 | - * | Second | s | 0, 1, ..., 59 | - * | | ss | 00, 01, ..., 59 | - * | 1/10 of second | S | 0, 1, ..., 9 | - * | 1/100 of second | SS | 00, 01, ..., 99 | - * | Millisecond | SSS | 000, 001, ..., 999 | - * | Timezone | Z | -01:00, +00:00, ... +12:00 | - * | | ZZ | -0100, +0000, ..., +1200 | - * | Seconds timestamp | X | 512969520 | - * | Milliseconds timestamp | x | 512969520900 | - * - * The characters wrapped in square brackets are escaped. - * - * The result may vary by locale. - * - * @param {Date|String|Number} date - the original date - * @param {String} [format='YYYY-MM-DDTHH:mm:ss.SSSZ'] - the string of tokens - * @param {Object} [options] - the object with options - * @param {Object} [options.locale=enLocale] - the locale object - * @returns {String} the formatted date string - * - * @example - * // Represent 11 February 2014 in middle-endian format: - * var result = format( - * new Date(2014, 1, 11), - * 'MM/DD/YYYY' - * ) - * //=> '02/11/2014' - * - * @example - * // Represent 2 July 2014 in Esperanto: - * var eoLocale = require('date-fns/locale/eo') - * var result = format( - * new Date(2014, 6, 2), - * 'Do [de] MMMM YYYY', - * {locale: eoLocale} - * ) - * //=> '2-a de julio 2014' - */ -function format (dirtyDate, dirtyFormatStr, dirtyOptions) { - var formatStr = dirtyFormatStr ? String(dirtyFormatStr) : 'YYYY-MM-DDTHH:mm:ss.SSSZ' - var options = dirtyOptions || {} - - var locale = options.locale - var localeFormatters = enLocale.format.formatters - var formattingTokensRegExp = enLocale.format.formattingTokensRegExp - if (locale && locale.format && locale.format.formatters) { - localeFormatters = locale.format.formatters - - if (locale.format.formattingTokensRegExp) { - formattingTokensRegExp = locale.format.formattingTokensRegExp - } - } - - var date = parse(dirtyDate) - - if (!isValid(date)) { - return 'Invalid Date' - } - - var formatFn = buildFormatFn(formatStr, localeFormatters, formattingTokensRegExp) - - return formatFn(date) -} - -var formatters = { - // Month: 1, 2, ..., 12 - 'M': function (date) { - return date.getMonth() + 1 - }, - - // Month: 01, 02, ..., 12 - 'MM': function (date) { - return addLeadingZeros(date.getMonth() + 1, 2) - }, - - // Quarter: 1, 2, 3, 4 - 'Q': function (date) { - return Math.ceil((date.getMonth() + 1) / 3) - }, - - // Day of month: 1, 2, ..., 31 - 'D': function (date) { - return date.getDate() - }, - - // Day of month: 01, 02, ..., 31 - 'DD': function (date) { - return addLeadingZeros(date.getDate(), 2) - }, - - // Day of year: 1, 2, ..., 366 - 'DDD': function (date) { - return getDayOfYear(date) - }, - - // Day of year: 001, 002, ..., 366 - 'DDDD': function (date) { - return addLeadingZeros(getDayOfYear(date), 3) - }, - - // Day of week: 0, 1, ..., 6 - 'd': function (date) { - return date.getDay() - }, - - // Day of ISO week: 1, 2, ..., 7 - 'E': function (date) { - return date.getDay() || 7 - }, - - // ISO week: 1, 2, ..., 53 - 'W': function (date) { - return getISOWeek(date) - }, - - // ISO week: 01, 02, ..., 53 - 'WW': function (date) { - return addLeadingZeros(getISOWeek(date), 2) - }, - - // Year: 00, 01, ..., 99 - 'YY': function (date) { - return addLeadingZeros(date.getFullYear(), 4).substr(2) - }, - - // Year: 1900, 1901, ..., 2099 - 'YYYY': function (date) { - return addLeadingZeros(date.getFullYear(), 4) - }, - - // ISO week-numbering year: 00, 01, ..., 99 - 'GG': function (date) { - return String(getISOYear(date)).substr(2) - }, - - // ISO week-numbering year: 1900, 1901, ..., 2099 - 'GGGG': function (date) { - return getISOYear(date) - }, - - // Hour: 0, 1, ... 23 - 'H': function (date) { - return date.getHours() - }, - - // Hour: 00, 01, ..., 23 - 'HH': function (date) { - return addLeadingZeros(date.getHours(), 2) - }, - - // Hour: 1, 2, ..., 12 - 'h': function (date) { - var hours = date.getHours() - if (hours === 0) { - return 12 - } else if (hours > 12) { - return hours % 12 - } else { - return hours - } - }, - - // Hour: 01, 02, ..., 12 - 'hh': function (date) { - return addLeadingZeros(formatters['h'](date), 2) - }, - - // Minute: 0, 1, ..., 59 - 'm': function (date) { - return date.getMinutes() - }, - - // Minute: 00, 01, ..., 59 - 'mm': function (date) { - return addLeadingZeros(date.getMinutes(), 2) - }, - - // Second: 0, 1, ..., 59 - 's': function (date) { - return date.getSeconds() - }, - - // Second: 00, 01, ..., 59 - 'ss': function (date) { - return addLeadingZeros(date.getSeconds(), 2) - }, - - // 1/10 of second: 0, 1, ..., 9 - 'S': function (date) { - return Math.floor(date.getMilliseconds() / 100) - }, - - // 1/100 of second: 00, 01, ..., 99 - 'SS': function (date) { - return addLeadingZeros(Math.floor(date.getMilliseconds() / 10), 2) - }, - - // Millisecond: 000, 001, ..., 999 - 'SSS': function (date) { - return addLeadingZeros(date.getMilliseconds(), 3) - }, - - // Timezone: -01:00, +00:00, ... +12:00 - 'Z': function (date) { - return formatTimezone(date.getTimezoneOffset(), ':') - }, - - // Timezone: -0100, +0000, ... +1200 - 'ZZ': function (date) { - return formatTimezone(date.getTimezoneOffset()) - }, - - // Seconds timestamp: 512969520 - 'X': function (date) { - return Math.floor(date.getTime() / 1000) - }, - - // Milliseconds timestamp: 512969520900 - 'x': function (date) { - return date.getTime() - } -} - -function buildFormatFn (formatStr, localeFormatters, formattingTokensRegExp) { - var array = formatStr.match(formattingTokensRegExp) - var length = array.length - - var i - var formatter - for (i = 0; i < length; i++) { - formatter = localeFormatters[array[i]] || formatters[array[i]] - if (formatter) { - array[i] = formatter - } else { - array[i] = removeFormattingTokens(array[i]) - } - } - - return function (date) { - var output = '' - for (var i = 0; i < length; i++) { - if (array[i] instanceof Function) { - output += array[i](date, formatters) - } else { - output += array[i] - } - } - return output - } -} - -function removeFormattingTokens (input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|]$/g, '') - } - return input.replace(/\\/g, '') -} - -function formatTimezone (offset, delimeter) { - delimeter = delimeter || '' - var sign = offset > 0 ? '-' : '+' - var absOffset = Math.abs(offset) - var hours = Math.floor(absOffset / 60) - var minutes = absOffset % 60 - return sign + addLeadingZeros(hours, 2) + delimeter + addLeadingZeros(minutes, 2) -} - -function addLeadingZeros (number, targetLength) { - var output = Math.abs(number).toString() - while (output.length < targetLength) { - output = '0' + output - } - return output -} - -module.exports = format - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_date/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/get_date/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Day Helpers - * @summary Get the day of the month of the given date. - * - * @description - * Get the day of the month of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the day of month - * - * @example - * // Which day of the month is 29 February 2012? - * var result = getDate(new Date(2012, 1, 29)) - * //=> 29 - */ -function getDate (dirtyDate) { - var date = parse(dirtyDate) - var dayOfMonth = date.getDate() - return dayOfMonth -} - -module.exports = getDate - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_day/index.js": -/*!*****************************************************!*\ - !*** ../app/node_modules/date-fns/get_day/index.js ***! - \*****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Get the day of the week of the given date. - * - * @description - * Get the day of the week of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the day of week - * - * @example - * // Which day of the week is 29 February 2012? - * var result = getDay(new Date(2012, 1, 29)) - * //=> 3 - */ -function getDay (dirtyDate) { - var date = parse(dirtyDate) - var day = date.getDay() - return day -} - -module.exports = getDay - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_day_of_year/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/get_day_of_year/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var startOfYear = __webpack_require__(/*! ../start_of_year/index.js */ "../app/node_modules/date-fns/start_of_year/index.js") -var differenceInCalendarDays = __webpack_require__(/*! ../difference_in_calendar_days/index.js */ "../app/node_modules/date-fns/difference_in_calendar_days/index.js") - -/** - * @category Day Helpers - * @summary Get the day of the year of the given date. - * - * @description - * Get the day of the year of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the day of year - * - * @example - * // Which day of the year is 2 July 2014? - * var result = getDayOfYear(new Date(2014, 6, 2)) - * //=> 183 - */ -function getDayOfYear (dirtyDate) { - var date = parse(dirtyDate) - var diff = differenceInCalendarDays(date, startOfYear(date)) - var dayOfYear = diff + 1 - return dayOfYear -} - -module.exports = getDayOfYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_days_in_month/index.js": -/*!***************************************************************!*\ - !*** ../app/node_modules/date-fns/get_days_in_month/index.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Month Helpers - * @summary Get the number of days in a month of the given date. - * - * @description - * Get the number of days in a month of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the number of days in a month - * - * @example - * // How many days are in February 2000? - * var result = getDaysInMonth(new Date(2000, 1)) - * //=> 29 - */ -function getDaysInMonth (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - var monthIndex = date.getMonth() - var lastDayOfMonth = new Date(0) - lastDayOfMonth.setFullYear(year, monthIndex + 1, 0) - lastDayOfMonth.setHours(0, 0, 0, 0) - return lastDayOfMonth.getDate() -} - -module.exports = getDaysInMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_days_in_year/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/get_days_in_year/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isLeapYear = __webpack_require__(/*! ../is_leap_year/index.js */ "../app/node_modules/date-fns/is_leap_year/index.js") - -/** - * @category Year Helpers - * @summary Get the number of days in a year of the given date. - * - * @description - * Get the number of days in a year of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the number of days in a year - * - * @example - * // How many days are in 2012? - * var result = getDaysInYear(new Date(2012, 0, 1)) - * //=> 366 - */ -function getDaysInYear (dirtyDate) { - return isLeapYear(dirtyDate) ? 366 : 365 -} - -module.exports = getDaysInYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_hours/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/get_hours/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Hour Helpers - * @summary Get the hours of the given date. - * - * @description - * Get the hours of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the hours - * - * @example - * // Get the hours of 29 February 2012 11:45:00: - * var result = getHours(new Date(2012, 1, 29, 11, 45)) - * //=> 11 - */ -function getHours (dirtyDate) { - var date = parse(dirtyDate) - var hours = date.getHours() - return hours -} - -module.exports = getHours - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_iso_day/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/get_iso_day/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Get the day of the ISO week of the given date. - * - * @description - * Get the day of the ISO week of the given date, - * which is 7 for Sunday, 1 for Monday etc. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the day of ISO week - * - * @example - * // Which day of the ISO week is 26 February 2012? - * var result = getISODay(new Date(2012, 1, 26)) - * //=> 7 - */ -function getISODay (dirtyDate) { - var date = parse(dirtyDate) - var day = date.getDay() - - if (day === 0) { - day = 7 - } - - return day -} - -module.exports = getISODay - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_iso_week/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/get_iso_week/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var startOfISOWeek = __webpack_require__(/*! ../start_of_iso_week/index.js */ "../app/node_modules/date-fns/start_of_iso_week/index.js") -var startOfISOYear = __webpack_require__(/*! ../start_of_iso_year/index.js */ "../app/node_modules/date-fns/start_of_iso_year/index.js") - -var MILLISECONDS_IN_WEEK = 604800000 - -/** - * @category ISO Week Helpers - * @summary Get the ISO week of the given date. - * - * @description - * Get the ISO week of the given date. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the ISO week - * - * @example - * // Which week of the ISO-week numbering year is 2 January 2005? - * var result = getISOWeek(new Date(2005, 0, 2)) - * //=> 53 - */ -function getISOWeek (dirtyDate) { - var date = parse(dirtyDate) - var diff = startOfISOWeek(date).getTime() - startOfISOYear(date).getTime() - - // Round the number of days to the nearest integer - // because the number of milliseconds in a week is not constant - // (e.g. it's different in the week of the daylight saving time clock shift) - return Math.round(diff / MILLISECONDS_IN_WEEK) + 1 -} - -module.exports = getISOWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_iso_weeks_in_year/index.js": -/*!*******************************************************************!*\ - !*** ../app/node_modules/date-fns/get_iso_weeks_in_year/index.js ***! - \*******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfISOYear = __webpack_require__(/*! ../start_of_iso_year/index.js */ "../app/node_modules/date-fns/start_of_iso_year/index.js") -var addWeeks = __webpack_require__(/*! ../add_weeks/index.js */ "../app/node_modules/date-fns/add_weeks/index.js") - -var MILLISECONDS_IN_WEEK = 604800000 - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Get the number of weeks in an ISO week-numbering year of the given date. - * - * @description - * Get the number of weeks in an ISO week-numbering year of the given date. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the number of ISO weeks in a year - * - * @example - * // How many weeks are in ISO week-numbering year 2015? - * var result = getISOWeeksInYear(new Date(2015, 1, 11)) - * //=> 53 - */ -function getISOWeeksInYear (dirtyDate) { - var thisYear = startOfISOYear(dirtyDate) - var nextYear = startOfISOYear(addWeeks(thisYear, 60)) - var diff = nextYear.valueOf() - thisYear.valueOf() - // Round the number of weeks to the nearest integer - // because the number of milliseconds in a week is not constant - // (e.g. it's different in the week of the daylight saving time clock shift) - return Math.round(diff / MILLISECONDS_IN_WEEK) -} - -module.exports = getISOWeeksInYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_iso_year/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/get_iso_year/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var startOfISOWeek = __webpack_require__(/*! ../start_of_iso_week/index.js */ "../app/node_modules/date-fns/start_of_iso_week/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Get the ISO week-numbering year of the given date. - * - * @description - * Get the ISO week-numbering year of the given date, - * which always starts 3 days before the year's first Thursday. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the ISO week-numbering year - * - * @example - * // Which ISO-week numbering year is 2 January 2005? - * var result = getISOYear(new Date(2005, 0, 2)) - * //=> 2004 - */ -function getISOYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - - var fourthOfJanuaryOfNextYear = new Date(0) - fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4) - fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0) - var startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear) - - var fourthOfJanuaryOfThisYear = new Date(0) - fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4) - fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0) - var startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear) - - if (date.getTime() >= startOfNextYear.getTime()) { - return year + 1 - } else if (date.getTime() >= startOfThisYear.getTime()) { - return year - } else { - return year - 1 - } -} - -module.exports = getISOYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_milliseconds/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/get_milliseconds/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Millisecond Helpers - * @summary Get the milliseconds of the given date. - * - * @description - * Get the milliseconds of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the milliseconds - * - * @example - * // Get the milliseconds of 29 February 2012 11:45:05.123: - * var result = getMilliseconds(new Date(2012, 1, 29, 11, 45, 5, 123)) - * //=> 123 - */ -function getMilliseconds (dirtyDate) { - var date = parse(dirtyDate) - var milliseconds = date.getMilliseconds() - return milliseconds -} - -module.exports = getMilliseconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_minutes/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/get_minutes/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Minute Helpers - * @summary Get the minutes of the given date. - * - * @description - * Get the minutes of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the minutes - * - * @example - * // Get the minutes of 29 February 2012 11:45:05: - * var result = getMinutes(new Date(2012, 1, 29, 11, 45, 5)) - * //=> 45 - */ -function getMinutes (dirtyDate) { - var date = parse(dirtyDate) - var minutes = date.getMinutes() - return minutes -} - -module.exports = getMinutes - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_month/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/get_month/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Month Helpers - * @summary Get the month of the given date. - * - * @description - * Get the month of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the month - * - * @example - * // Which month is 29 February 2012? - * var result = getMonth(new Date(2012, 1, 29)) - * //=> 1 - */ -function getMonth (dirtyDate) { - var date = parse(dirtyDate) - var month = date.getMonth() - return month -} - -module.exports = getMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_overlapping_days_in_ranges/index.js": -/*!****************************************************************************!*\ - !*** ../app/node_modules/date-fns/get_overlapping_days_in_ranges/index.js ***! - \****************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -var MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000 - -/** - * @category Range Helpers - * @summary Get the number of days that overlap in two date ranges - * - * @description - * Get the number of days that overlap in two date ranges - * - * @param {Date|String|Number} initialRangeStartDate - the start of the initial range - * @param {Date|String|Number} initialRangeEndDate - the end of the initial range - * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with - * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with - * @returns {Number} the number of days that overlap in two date ranges - * @throws {Error} startDate of a date range cannot be after its endDate - * - * @example - * // For overlapping date ranges adds 1 for each started overlapping day: - * getOverlappingDaysInRanges( - * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21) - * ) - * //=> 3 - * - * @example - * // For non-overlapping date ranges returns 0: - * getOverlappingDaysInRanges( - * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22) - * ) - * //=> 0 - */ -function getOverlappingDaysInRanges (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { - var initialStartTime = parse(dirtyInitialRangeStartDate).getTime() - var initialEndTime = parse(dirtyInitialRangeEndDate).getTime() - var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime() - var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime() - - if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { - throw new Error('The start of the range cannot be after the end of the range') - } - - var isOverlapping = initialStartTime < comparedEndTime && comparedStartTime < initialEndTime - - if (!isOverlapping) { - return 0 - } - - var overlapStartDate = comparedStartTime < initialStartTime - ? initialStartTime - : comparedStartTime - - var overlapEndDate = comparedEndTime > initialEndTime - ? initialEndTime - : comparedEndTime - - var differenceInMs = overlapEndDate - overlapStartDate - - return Math.ceil(differenceInMs / MILLISECONDS_IN_DAY) -} - -module.exports = getOverlappingDaysInRanges - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_quarter/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/get_quarter/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Quarter Helpers - * @summary Get the year quarter of the given date. - * - * @description - * Get the year quarter of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the quarter - * - * @example - * // Which quarter is 2 July 2014? - * var result = getQuarter(new Date(2014, 6, 2)) - * //=> 3 - */ -function getQuarter (dirtyDate) { - var date = parse(dirtyDate) - var quarter = Math.floor(date.getMonth() / 3) + 1 - return quarter -} - -module.exports = getQuarter - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_seconds/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/get_seconds/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Second Helpers - * @summary Get the seconds of the given date. - * - * @description - * Get the seconds of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the seconds - * - * @example - * // Get the seconds of 29 February 2012 11:45:05.123: - * var result = getSeconds(new Date(2012, 1, 29, 11, 45, 5, 123)) - * //=> 5 - */ -function getSeconds (dirtyDate) { - var date = parse(dirtyDate) - var seconds = date.getSeconds() - return seconds -} - -module.exports = getSeconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_time/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/get_time/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Timestamp Helpers - * @summary Get the milliseconds timestamp of the given date. - * - * @description - * Get the milliseconds timestamp of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the timestamp - * - * @example - * // Get the timestamp of 29 February 2012 11:45:05.123: - * var result = getTime(new Date(2012, 1, 29, 11, 45, 5, 123)) - * //=> 1330515905123 - */ -function getTime (dirtyDate) { - var date = parse(dirtyDate) - var timestamp = date.getTime() - return timestamp -} - -module.exports = getTime - - -/***/ }), - -/***/ "../app/node_modules/date-fns/get_year/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/get_year/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Year Helpers - * @summary Get the year of the given date. - * - * @description - * Get the year of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the year - * - * @example - * // Which year is 2 July 2014? - * var result = getYear(new Date(2014, 6, 2)) - * //=> 2014 - */ -function getYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - return year -} - -module.exports = getYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/index.js": -/*!*********************************************!*\ - !*** ../app/node_modules/date-fns/index.js ***! - \*********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = { - addDays: __webpack_require__(/*! ./add_days/index.js */ "../app/node_modules/date-fns/add_days/index.js"), - addHours: __webpack_require__(/*! ./add_hours/index.js */ "../app/node_modules/date-fns/add_hours/index.js"), - addISOYears: __webpack_require__(/*! ./add_iso_years/index.js */ "../app/node_modules/date-fns/add_iso_years/index.js"), - addMilliseconds: __webpack_require__(/*! ./add_milliseconds/index.js */ "../app/node_modules/date-fns/add_milliseconds/index.js"), - addMinutes: __webpack_require__(/*! ./add_minutes/index.js */ "../app/node_modules/date-fns/add_minutes/index.js"), - addMonths: __webpack_require__(/*! ./add_months/index.js */ "../app/node_modules/date-fns/add_months/index.js"), - addQuarters: __webpack_require__(/*! ./add_quarters/index.js */ "../app/node_modules/date-fns/add_quarters/index.js"), - addSeconds: __webpack_require__(/*! ./add_seconds/index.js */ "../app/node_modules/date-fns/add_seconds/index.js"), - addWeeks: __webpack_require__(/*! ./add_weeks/index.js */ "../app/node_modules/date-fns/add_weeks/index.js"), - addYears: __webpack_require__(/*! ./add_years/index.js */ "../app/node_modules/date-fns/add_years/index.js"), - areRangesOverlapping: __webpack_require__(/*! ./are_ranges_overlapping/index.js */ "../app/node_modules/date-fns/are_ranges_overlapping/index.js"), - closestIndexTo: __webpack_require__(/*! ./closest_index_to/index.js */ "../app/node_modules/date-fns/closest_index_to/index.js"), - closestTo: __webpack_require__(/*! ./closest_to/index.js */ "../app/node_modules/date-fns/closest_to/index.js"), - compareAsc: __webpack_require__(/*! ./compare_asc/index.js */ "../app/node_modules/date-fns/compare_asc/index.js"), - compareDesc: __webpack_require__(/*! ./compare_desc/index.js */ "../app/node_modules/date-fns/compare_desc/index.js"), - differenceInCalendarDays: __webpack_require__(/*! ./difference_in_calendar_days/index.js */ "../app/node_modules/date-fns/difference_in_calendar_days/index.js"), - differenceInCalendarISOWeeks: __webpack_require__(/*! ./difference_in_calendar_iso_weeks/index.js */ "../app/node_modules/date-fns/difference_in_calendar_iso_weeks/index.js"), - differenceInCalendarISOYears: __webpack_require__(/*! ./difference_in_calendar_iso_years/index.js */ "../app/node_modules/date-fns/difference_in_calendar_iso_years/index.js"), - differenceInCalendarMonths: __webpack_require__(/*! ./difference_in_calendar_months/index.js */ "../app/node_modules/date-fns/difference_in_calendar_months/index.js"), - differenceInCalendarQuarters: __webpack_require__(/*! ./difference_in_calendar_quarters/index.js */ "../app/node_modules/date-fns/difference_in_calendar_quarters/index.js"), - differenceInCalendarWeeks: __webpack_require__(/*! ./difference_in_calendar_weeks/index.js */ "../app/node_modules/date-fns/difference_in_calendar_weeks/index.js"), - differenceInCalendarYears: __webpack_require__(/*! ./difference_in_calendar_years/index.js */ "../app/node_modules/date-fns/difference_in_calendar_years/index.js"), - differenceInDays: __webpack_require__(/*! ./difference_in_days/index.js */ "../app/node_modules/date-fns/difference_in_days/index.js"), - differenceInHours: __webpack_require__(/*! ./difference_in_hours/index.js */ "../app/node_modules/date-fns/difference_in_hours/index.js"), - differenceInISOYears: __webpack_require__(/*! ./difference_in_iso_years/index.js */ "../app/node_modules/date-fns/difference_in_iso_years/index.js"), - differenceInMilliseconds: __webpack_require__(/*! ./difference_in_milliseconds/index.js */ "../app/node_modules/date-fns/difference_in_milliseconds/index.js"), - differenceInMinutes: __webpack_require__(/*! ./difference_in_minutes/index.js */ "../app/node_modules/date-fns/difference_in_minutes/index.js"), - differenceInMonths: __webpack_require__(/*! ./difference_in_months/index.js */ "../app/node_modules/date-fns/difference_in_months/index.js"), - differenceInQuarters: __webpack_require__(/*! ./difference_in_quarters/index.js */ "../app/node_modules/date-fns/difference_in_quarters/index.js"), - differenceInSeconds: __webpack_require__(/*! ./difference_in_seconds/index.js */ "../app/node_modules/date-fns/difference_in_seconds/index.js"), - differenceInWeeks: __webpack_require__(/*! ./difference_in_weeks/index.js */ "../app/node_modules/date-fns/difference_in_weeks/index.js"), - differenceInYears: __webpack_require__(/*! ./difference_in_years/index.js */ "../app/node_modules/date-fns/difference_in_years/index.js"), - distanceInWords: __webpack_require__(/*! ./distance_in_words/index.js */ "../app/node_modules/date-fns/distance_in_words/index.js"), - distanceInWordsStrict: __webpack_require__(/*! ./distance_in_words_strict/index.js */ "../app/node_modules/date-fns/distance_in_words_strict/index.js"), - distanceInWordsToNow: __webpack_require__(/*! ./distance_in_words_to_now/index.js */ "../app/node_modules/date-fns/distance_in_words_to_now/index.js"), - eachDay: __webpack_require__(/*! ./each_day/index.js */ "../app/node_modules/date-fns/each_day/index.js"), - endOfDay: __webpack_require__(/*! ./end_of_day/index.js */ "../app/node_modules/date-fns/end_of_day/index.js"), - endOfHour: __webpack_require__(/*! ./end_of_hour/index.js */ "../app/node_modules/date-fns/end_of_hour/index.js"), - endOfISOWeek: __webpack_require__(/*! ./end_of_iso_week/index.js */ "../app/node_modules/date-fns/end_of_iso_week/index.js"), - endOfISOYear: __webpack_require__(/*! ./end_of_iso_year/index.js */ "../app/node_modules/date-fns/end_of_iso_year/index.js"), - endOfMinute: __webpack_require__(/*! ./end_of_minute/index.js */ "../app/node_modules/date-fns/end_of_minute/index.js"), - endOfMonth: __webpack_require__(/*! ./end_of_month/index.js */ "../app/node_modules/date-fns/end_of_month/index.js"), - endOfQuarter: __webpack_require__(/*! ./end_of_quarter/index.js */ "../app/node_modules/date-fns/end_of_quarter/index.js"), - endOfSecond: __webpack_require__(/*! ./end_of_second/index.js */ "../app/node_modules/date-fns/end_of_second/index.js"), - endOfToday: __webpack_require__(/*! ./end_of_today/index.js */ "../app/node_modules/date-fns/end_of_today/index.js"), - endOfTomorrow: __webpack_require__(/*! ./end_of_tomorrow/index.js */ "../app/node_modules/date-fns/end_of_tomorrow/index.js"), - endOfWeek: __webpack_require__(/*! ./end_of_week/index.js */ "../app/node_modules/date-fns/end_of_week/index.js"), - endOfYear: __webpack_require__(/*! ./end_of_year/index.js */ "../app/node_modules/date-fns/end_of_year/index.js"), - endOfYesterday: __webpack_require__(/*! ./end_of_yesterday/index.js */ "../app/node_modules/date-fns/end_of_yesterday/index.js"), - format: __webpack_require__(/*! ./format/index.js */ "../app/node_modules/date-fns/format/index.js"), - getDate: __webpack_require__(/*! ./get_date/index.js */ "../app/node_modules/date-fns/get_date/index.js"), - getDay: __webpack_require__(/*! ./get_day/index.js */ "../app/node_modules/date-fns/get_day/index.js"), - getDayOfYear: __webpack_require__(/*! ./get_day_of_year/index.js */ "../app/node_modules/date-fns/get_day_of_year/index.js"), - getDaysInMonth: __webpack_require__(/*! ./get_days_in_month/index.js */ "../app/node_modules/date-fns/get_days_in_month/index.js"), - getDaysInYear: __webpack_require__(/*! ./get_days_in_year/index.js */ "../app/node_modules/date-fns/get_days_in_year/index.js"), - getHours: __webpack_require__(/*! ./get_hours/index.js */ "../app/node_modules/date-fns/get_hours/index.js"), - getISODay: __webpack_require__(/*! ./get_iso_day/index.js */ "../app/node_modules/date-fns/get_iso_day/index.js"), - getISOWeek: __webpack_require__(/*! ./get_iso_week/index.js */ "../app/node_modules/date-fns/get_iso_week/index.js"), - getISOWeeksInYear: __webpack_require__(/*! ./get_iso_weeks_in_year/index.js */ "../app/node_modules/date-fns/get_iso_weeks_in_year/index.js"), - getISOYear: __webpack_require__(/*! ./get_iso_year/index.js */ "../app/node_modules/date-fns/get_iso_year/index.js"), - getMilliseconds: __webpack_require__(/*! ./get_milliseconds/index.js */ "../app/node_modules/date-fns/get_milliseconds/index.js"), - getMinutes: __webpack_require__(/*! ./get_minutes/index.js */ "../app/node_modules/date-fns/get_minutes/index.js"), - getMonth: __webpack_require__(/*! ./get_month/index.js */ "../app/node_modules/date-fns/get_month/index.js"), - getOverlappingDaysInRanges: __webpack_require__(/*! ./get_overlapping_days_in_ranges/index.js */ "../app/node_modules/date-fns/get_overlapping_days_in_ranges/index.js"), - getQuarter: __webpack_require__(/*! ./get_quarter/index.js */ "../app/node_modules/date-fns/get_quarter/index.js"), - getSeconds: __webpack_require__(/*! ./get_seconds/index.js */ "../app/node_modules/date-fns/get_seconds/index.js"), - getTime: __webpack_require__(/*! ./get_time/index.js */ "../app/node_modules/date-fns/get_time/index.js"), - getYear: __webpack_require__(/*! ./get_year/index.js */ "../app/node_modules/date-fns/get_year/index.js"), - isAfter: __webpack_require__(/*! ./is_after/index.js */ "../app/node_modules/date-fns/is_after/index.js"), - isBefore: __webpack_require__(/*! ./is_before/index.js */ "../app/node_modules/date-fns/is_before/index.js"), - isDate: __webpack_require__(/*! ./is_date/index.js */ "../app/node_modules/date-fns/is_date/index.js"), - isEqual: __webpack_require__(/*! ./is_equal/index.js */ "../app/node_modules/date-fns/is_equal/index.js"), - isFirstDayOfMonth: __webpack_require__(/*! ./is_first_day_of_month/index.js */ "../app/node_modules/date-fns/is_first_day_of_month/index.js"), - isFriday: __webpack_require__(/*! ./is_friday/index.js */ "../app/node_modules/date-fns/is_friday/index.js"), - isFuture: __webpack_require__(/*! ./is_future/index.js */ "../app/node_modules/date-fns/is_future/index.js"), - isLastDayOfMonth: __webpack_require__(/*! ./is_last_day_of_month/index.js */ "../app/node_modules/date-fns/is_last_day_of_month/index.js"), - isLeapYear: __webpack_require__(/*! ./is_leap_year/index.js */ "../app/node_modules/date-fns/is_leap_year/index.js"), - isMonday: __webpack_require__(/*! ./is_monday/index.js */ "../app/node_modules/date-fns/is_monday/index.js"), - isPast: __webpack_require__(/*! ./is_past/index.js */ "../app/node_modules/date-fns/is_past/index.js"), - isSameDay: __webpack_require__(/*! ./is_same_day/index.js */ "../app/node_modules/date-fns/is_same_day/index.js"), - isSameHour: __webpack_require__(/*! ./is_same_hour/index.js */ "../app/node_modules/date-fns/is_same_hour/index.js"), - isSameISOWeek: __webpack_require__(/*! ./is_same_iso_week/index.js */ "../app/node_modules/date-fns/is_same_iso_week/index.js"), - isSameISOYear: __webpack_require__(/*! ./is_same_iso_year/index.js */ "../app/node_modules/date-fns/is_same_iso_year/index.js"), - isSameMinute: __webpack_require__(/*! ./is_same_minute/index.js */ "../app/node_modules/date-fns/is_same_minute/index.js"), - isSameMonth: __webpack_require__(/*! ./is_same_month/index.js */ "../app/node_modules/date-fns/is_same_month/index.js"), - isSameQuarter: __webpack_require__(/*! ./is_same_quarter/index.js */ "../app/node_modules/date-fns/is_same_quarter/index.js"), - isSameSecond: __webpack_require__(/*! ./is_same_second/index.js */ "../app/node_modules/date-fns/is_same_second/index.js"), - isSameWeek: __webpack_require__(/*! ./is_same_week/index.js */ "../app/node_modules/date-fns/is_same_week/index.js"), - isSameYear: __webpack_require__(/*! ./is_same_year/index.js */ "../app/node_modules/date-fns/is_same_year/index.js"), - isSaturday: __webpack_require__(/*! ./is_saturday/index.js */ "../app/node_modules/date-fns/is_saturday/index.js"), - isSunday: __webpack_require__(/*! ./is_sunday/index.js */ "../app/node_modules/date-fns/is_sunday/index.js"), - isThisHour: __webpack_require__(/*! ./is_this_hour/index.js */ "../app/node_modules/date-fns/is_this_hour/index.js"), - isThisISOWeek: __webpack_require__(/*! ./is_this_iso_week/index.js */ "../app/node_modules/date-fns/is_this_iso_week/index.js"), - isThisISOYear: __webpack_require__(/*! ./is_this_iso_year/index.js */ "../app/node_modules/date-fns/is_this_iso_year/index.js"), - isThisMinute: __webpack_require__(/*! ./is_this_minute/index.js */ "../app/node_modules/date-fns/is_this_minute/index.js"), - isThisMonth: __webpack_require__(/*! ./is_this_month/index.js */ "../app/node_modules/date-fns/is_this_month/index.js"), - isThisQuarter: __webpack_require__(/*! ./is_this_quarter/index.js */ "../app/node_modules/date-fns/is_this_quarter/index.js"), - isThisSecond: __webpack_require__(/*! ./is_this_second/index.js */ "../app/node_modules/date-fns/is_this_second/index.js"), - isThisWeek: __webpack_require__(/*! ./is_this_week/index.js */ "../app/node_modules/date-fns/is_this_week/index.js"), - isThisYear: __webpack_require__(/*! ./is_this_year/index.js */ "../app/node_modules/date-fns/is_this_year/index.js"), - isThursday: __webpack_require__(/*! ./is_thursday/index.js */ "../app/node_modules/date-fns/is_thursday/index.js"), - isToday: __webpack_require__(/*! ./is_today/index.js */ "../app/node_modules/date-fns/is_today/index.js"), - isTomorrow: __webpack_require__(/*! ./is_tomorrow/index.js */ "../app/node_modules/date-fns/is_tomorrow/index.js"), - isTuesday: __webpack_require__(/*! ./is_tuesday/index.js */ "../app/node_modules/date-fns/is_tuesday/index.js"), - isValid: __webpack_require__(/*! ./is_valid/index.js */ "../app/node_modules/date-fns/is_valid/index.js"), - isWednesday: __webpack_require__(/*! ./is_wednesday/index.js */ "../app/node_modules/date-fns/is_wednesday/index.js"), - isWeekend: __webpack_require__(/*! ./is_weekend/index.js */ "../app/node_modules/date-fns/is_weekend/index.js"), - isWithinRange: __webpack_require__(/*! ./is_within_range/index.js */ "../app/node_modules/date-fns/is_within_range/index.js"), - isYesterday: __webpack_require__(/*! ./is_yesterday/index.js */ "../app/node_modules/date-fns/is_yesterday/index.js"), - lastDayOfISOWeek: __webpack_require__(/*! ./last_day_of_iso_week/index.js */ "../app/node_modules/date-fns/last_day_of_iso_week/index.js"), - lastDayOfISOYear: __webpack_require__(/*! ./last_day_of_iso_year/index.js */ "../app/node_modules/date-fns/last_day_of_iso_year/index.js"), - lastDayOfMonth: __webpack_require__(/*! ./last_day_of_month/index.js */ "../app/node_modules/date-fns/last_day_of_month/index.js"), - lastDayOfQuarter: __webpack_require__(/*! ./last_day_of_quarter/index.js */ "../app/node_modules/date-fns/last_day_of_quarter/index.js"), - lastDayOfWeek: __webpack_require__(/*! ./last_day_of_week/index.js */ "../app/node_modules/date-fns/last_day_of_week/index.js"), - lastDayOfYear: __webpack_require__(/*! ./last_day_of_year/index.js */ "../app/node_modules/date-fns/last_day_of_year/index.js"), - max: __webpack_require__(/*! ./max/index.js */ "../app/node_modules/date-fns/max/index.js"), - min: __webpack_require__(/*! ./min/index.js */ "../app/node_modules/date-fns/min/index.js"), - parse: __webpack_require__(/*! ./parse/index.js */ "../app/node_modules/date-fns/parse/index.js"), - setDate: __webpack_require__(/*! ./set_date/index.js */ "../app/node_modules/date-fns/set_date/index.js"), - setDay: __webpack_require__(/*! ./set_day/index.js */ "../app/node_modules/date-fns/set_day/index.js"), - setDayOfYear: __webpack_require__(/*! ./set_day_of_year/index.js */ "../app/node_modules/date-fns/set_day_of_year/index.js"), - setHours: __webpack_require__(/*! ./set_hours/index.js */ "../app/node_modules/date-fns/set_hours/index.js"), - setISODay: __webpack_require__(/*! ./set_iso_day/index.js */ "../app/node_modules/date-fns/set_iso_day/index.js"), - setISOWeek: __webpack_require__(/*! ./set_iso_week/index.js */ "../app/node_modules/date-fns/set_iso_week/index.js"), - setISOYear: __webpack_require__(/*! ./set_iso_year/index.js */ "../app/node_modules/date-fns/set_iso_year/index.js"), - setMilliseconds: __webpack_require__(/*! ./set_milliseconds/index.js */ "../app/node_modules/date-fns/set_milliseconds/index.js"), - setMinutes: __webpack_require__(/*! ./set_minutes/index.js */ "../app/node_modules/date-fns/set_minutes/index.js"), - setMonth: __webpack_require__(/*! ./set_month/index.js */ "../app/node_modules/date-fns/set_month/index.js"), - setQuarter: __webpack_require__(/*! ./set_quarter/index.js */ "../app/node_modules/date-fns/set_quarter/index.js"), - setSeconds: __webpack_require__(/*! ./set_seconds/index.js */ "../app/node_modules/date-fns/set_seconds/index.js"), - setYear: __webpack_require__(/*! ./set_year/index.js */ "../app/node_modules/date-fns/set_year/index.js"), - startOfDay: __webpack_require__(/*! ./start_of_day/index.js */ "../app/node_modules/date-fns/start_of_day/index.js"), - startOfHour: __webpack_require__(/*! ./start_of_hour/index.js */ "../app/node_modules/date-fns/start_of_hour/index.js"), - startOfISOWeek: __webpack_require__(/*! ./start_of_iso_week/index.js */ "../app/node_modules/date-fns/start_of_iso_week/index.js"), - startOfISOYear: __webpack_require__(/*! ./start_of_iso_year/index.js */ "../app/node_modules/date-fns/start_of_iso_year/index.js"), - startOfMinute: __webpack_require__(/*! ./start_of_minute/index.js */ "../app/node_modules/date-fns/start_of_minute/index.js"), - startOfMonth: __webpack_require__(/*! ./start_of_month/index.js */ "../app/node_modules/date-fns/start_of_month/index.js"), - startOfQuarter: __webpack_require__(/*! ./start_of_quarter/index.js */ "../app/node_modules/date-fns/start_of_quarter/index.js"), - startOfSecond: __webpack_require__(/*! ./start_of_second/index.js */ "../app/node_modules/date-fns/start_of_second/index.js"), - startOfToday: __webpack_require__(/*! ./start_of_today/index.js */ "../app/node_modules/date-fns/start_of_today/index.js"), - startOfTomorrow: __webpack_require__(/*! ./start_of_tomorrow/index.js */ "../app/node_modules/date-fns/start_of_tomorrow/index.js"), - startOfWeek: __webpack_require__(/*! ./start_of_week/index.js */ "../app/node_modules/date-fns/start_of_week/index.js"), - startOfYear: __webpack_require__(/*! ./start_of_year/index.js */ "../app/node_modules/date-fns/start_of_year/index.js"), - startOfYesterday: __webpack_require__(/*! ./start_of_yesterday/index.js */ "../app/node_modules/date-fns/start_of_yesterday/index.js"), - subDays: __webpack_require__(/*! ./sub_days/index.js */ "../app/node_modules/date-fns/sub_days/index.js"), - subHours: __webpack_require__(/*! ./sub_hours/index.js */ "../app/node_modules/date-fns/sub_hours/index.js"), - subISOYears: __webpack_require__(/*! ./sub_iso_years/index.js */ "../app/node_modules/date-fns/sub_iso_years/index.js"), - subMilliseconds: __webpack_require__(/*! ./sub_milliseconds/index.js */ "../app/node_modules/date-fns/sub_milliseconds/index.js"), - subMinutes: __webpack_require__(/*! ./sub_minutes/index.js */ "../app/node_modules/date-fns/sub_minutes/index.js"), - subMonths: __webpack_require__(/*! ./sub_months/index.js */ "../app/node_modules/date-fns/sub_months/index.js"), - subQuarters: __webpack_require__(/*! ./sub_quarters/index.js */ "../app/node_modules/date-fns/sub_quarters/index.js"), - subSeconds: __webpack_require__(/*! ./sub_seconds/index.js */ "../app/node_modules/date-fns/sub_seconds/index.js"), - subWeeks: __webpack_require__(/*! ./sub_weeks/index.js */ "../app/node_modules/date-fns/sub_weeks/index.js"), - subYears: __webpack_require__(/*! ./sub_years/index.js */ "../app/node_modules/date-fns/sub_years/index.js") -} - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_after/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/is_after/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Is the first date after the second one? - * - * @description - * Is the first date after the second one? - * - * @param {Date|String|Number} date - the date that should be after the other one to return true - * @param {Date|String|Number} dateToCompare - the date to compare with - * @returns {Boolean} the first date is after the second date - * - * @example - * // Is 10 July 1989 after 11 February 1987? - * var result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11)) - * //=> true - */ -function isAfter (dirtyDate, dirtyDateToCompare) { - var date = parse(dirtyDate) - var dateToCompare = parse(dirtyDateToCompare) - return date.getTime() > dateToCompare.getTime() -} - -module.exports = isAfter - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_before/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/is_before/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Is the first date before the second one? - * - * @description - * Is the first date before the second one? - * - * @param {Date|String|Number} date - the date that should be before the other one to return true - * @param {Date|String|Number} dateToCompare - the date to compare with - * @returns {Boolean} the first date is before the second date - * - * @example - * // Is 10 July 1989 before 11 February 1987? - * var result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11)) - * //=> false - */ -function isBefore (dirtyDate, dirtyDateToCompare) { - var date = parse(dirtyDate) - var dateToCompare = parse(dirtyDateToCompare) - return date.getTime() < dateToCompare.getTime() -} - -module.exports = isBefore - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_date/index.js": -/*!*****************************************************!*\ - !*** ../app/node_modules/date-fns/is_date/index.js ***! - \*****************************************************/ -/***/ ((module) => { - -/** - * @category Common Helpers - * @summary Is the given argument an instance of Date? - * - * @description - * Is the given argument an instance of Date? - * - * @param {*} argument - the argument to check - * @returns {Boolean} the given argument is an instance of Date - * - * @example - * // Is 'mayonnaise' a Date? - * var result = isDate('mayonnaise') - * //=> false - */ -function isDate (argument) { - return argument instanceof Date -} - -module.exports = isDate - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_equal/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/is_equal/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Are the given dates equal? - * - * @description - * Are the given dates equal? - * - * @param {Date|String|Number} dateLeft - the first date to compare - * @param {Date|String|Number} dateRight - the second date to compare - * @returns {Boolean} the dates are equal - * - * @example - * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal? - * var result = isEqual( - * new Date(2014, 6, 2, 6, 30, 45, 0) - * new Date(2014, 6, 2, 6, 30, 45, 500) - * ) - * //=> false - */ -function isEqual (dirtyLeftDate, dirtyRightDate) { - var dateLeft = parse(dirtyLeftDate) - var dateRight = parse(dirtyRightDate) - return dateLeft.getTime() === dateRight.getTime() -} - -module.exports = isEqual - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_first_day_of_month/index.js": -/*!*******************************************************************!*\ - !*** ../app/node_modules/date-fns/is_first_day_of_month/index.js ***! - \*******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Month Helpers - * @summary Is the given date the first day of a month? - * - * @description - * Is the given date the first day of a month? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is the first day of a month - * - * @example - * // Is 1 September 2014 the first day of a month? - * var result = isFirstDayOfMonth(new Date(2014, 8, 1)) - * //=> true - */ -function isFirstDayOfMonth (dirtyDate) { - return parse(dirtyDate).getDate() === 1 -} - -module.exports = isFirstDayOfMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_friday/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/is_friday/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Is the given date Friday? - * - * @description - * Is the given date Friday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Friday - * - * @example - * // Is 26 September 2014 Friday? - * var result = isFriday(new Date(2014, 8, 26)) - * //=> true - */ -function isFriday (dirtyDate) { - return parse(dirtyDate).getDay() === 5 -} - -module.exports = isFriday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_future/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/is_future/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Is the given date in the future? - * - * @description - * Is the given date in the future? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in the future - * - * @example - * // If today is 6 October 2014, is 31 December 2014 in the future? - * var result = isFuture(new Date(2014, 11, 31)) - * //=> true - */ -function isFuture (dirtyDate) { - return parse(dirtyDate).getTime() > new Date().getTime() -} - -module.exports = isFuture - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_last_day_of_month/index.js": -/*!******************************************************************!*\ - !*** ../app/node_modules/date-fns/is_last_day_of_month/index.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var endOfDay = __webpack_require__(/*! ../end_of_day/index.js */ "../app/node_modules/date-fns/end_of_day/index.js") -var endOfMonth = __webpack_require__(/*! ../end_of_month/index.js */ "../app/node_modules/date-fns/end_of_month/index.js") - -/** - * @category Month Helpers - * @summary Is the given date the last day of a month? - * - * @description - * Is the given date the last day of a month? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is the last day of a month - * - * @example - * // Is 28 February 2014 the last day of a month? - * var result = isLastDayOfMonth(new Date(2014, 1, 28)) - * //=> true - */ -function isLastDayOfMonth (dirtyDate) { - var date = parse(dirtyDate) - return endOfDay(date).getTime() === endOfMonth(date).getTime() -} - -module.exports = isLastDayOfMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_leap_year/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_leap_year/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Year Helpers - * @summary Is the given date in the leap year? - * - * @description - * Is the given date in the leap year? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in the leap year - * - * @example - * // Is 1 September 2012 in the leap year? - * var result = isLeapYear(new Date(2012, 8, 1)) - * //=> true - */ -function isLeapYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0 -} - -module.exports = isLeapYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_monday/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/is_monday/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Is the given date Monday? - * - * @description - * Is the given date Monday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Monday - * - * @example - * // Is 22 September 2014 Monday? - * var result = isMonday(new Date(2014, 8, 22)) - * //=> true - */ -function isMonday (dirtyDate) { - return parse(dirtyDate).getDay() === 1 -} - -module.exports = isMonday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_past/index.js": -/*!*****************************************************!*\ - !*** ../app/node_modules/date-fns/is_past/index.js ***! - \*****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Is the given date in the past? - * - * @description - * Is the given date in the past? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in the past - * - * @example - * // If today is 6 October 2014, is 2 July 2014 in the past? - * var result = isPast(new Date(2014, 6, 2)) - * //=> true - */ -function isPast (dirtyDate) { - return parse(dirtyDate).getTime() < new Date().getTime() -} - -module.exports = isPast - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_day/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_day/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfDay = __webpack_require__(/*! ../start_of_day/index.js */ "../app/node_modules/date-fns/start_of_day/index.js") - -/** - * @category Day Helpers - * @summary Are the given dates in the same day? - * - * @description - * Are the given dates in the same day? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same day - * - * @example - * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day? - * var result = isSameDay( - * new Date(2014, 8, 4, 6, 0), - * new Date(2014, 8, 4, 18, 0) - * ) - * //=> true - */ -function isSameDay (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfDay = startOfDay(dirtyDateLeft) - var dateRightStartOfDay = startOfDay(dirtyDateRight) - - return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime() -} - -module.exports = isSameDay - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_hour/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_hour/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfHour = __webpack_require__(/*! ../start_of_hour/index.js */ "../app/node_modules/date-fns/start_of_hour/index.js") - -/** - * @category Hour Helpers - * @summary Are the given dates in the same hour? - * - * @description - * Are the given dates in the same hour? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same hour - * - * @example - * // Are 4 September 2014 06:00:00 and 4 September 06:30:00 in the same hour? - * var result = isSameHour( - * new Date(2014, 8, 4, 6, 0), - * new Date(2014, 8, 4, 6, 30) - * ) - * //=> true - */ -function isSameHour (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfHour = startOfHour(dirtyDateLeft) - var dateRightStartOfHour = startOfHour(dirtyDateRight) - - return dateLeftStartOfHour.getTime() === dateRightStartOfHour.getTime() -} - -module.exports = isSameHour - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_iso_week/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_iso_week/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameWeek = __webpack_require__(/*! ../is_same_week/index.js */ "../app/node_modules/date-fns/is_same_week/index.js") - -/** - * @category ISO Week Helpers - * @summary Are the given dates in the same ISO week? - * - * @description - * Are the given dates in the same ISO week? - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same ISO week - * - * @example - * // Are 1 September 2014 and 7 September 2014 in the same ISO week? - * var result = isSameISOWeek( - * new Date(2014, 8, 1), - * new Date(2014, 8, 7) - * ) - * //=> true - */ -function isSameISOWeek (dirtyDateLeft, dirtyDateRight) { - return isSameWeek(dirtyDateLeft, dirtyDateRight, {weekStartsOn: 1}) -} - -module.exports = isSameISOWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_iso_year/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_iso_year/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfISOYear = __webpack_require__(/*! ../start_of_iso_year/index.js */ "../app/node_modules/date-fns/start_of_iso_year/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Are the given dates in the same ISO week-numbering year? - * - * @description - * Are the given dates in the same ISO week-numbering year? - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same ISO week-numbering year - * - * @example - * // Are 29 December 2003 and 2 January 2005 in the same ISO week-numbering year? - * var result = isSameISOYear( - * new Date(2003, 11, 29), - * new Date(2005, 0, 2) - * ) - * //=> true - */ -function isSameISOYear (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfYear = startOfISOYear(dirtyDateLeft) - var dateRightStartOfYear = startOfISOYear(dirtyDateRight) - - return dateLeftStartOfYear.getTime() === dateRightStartOfYear.getTime() -} - -module.exports = isSameISOYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_minute/index.js": -/*!************************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_minute/index.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfMinute = __webpack_require__(/*! ../start_of_minute/index.js */ "../app/node_modules/date-fns/start_of_minute/index.js") - -/** - * @category Minute Helpers - * @summary Are the given dates in the same minute? - * - * @description - * Are the given dates in the same minute? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same minute - * - * @example - * // Are 4 September 2014 06:30:00 and 4 September 2014 06:30:15 - * // in the same minute? - * var result = isSameMinute( - * new Date(2014, 8, 4, 6, 30), - * new Date(2014, 8, 4, 6, 30, 15) - * ) - * //=> true - */ -function isSameMinute (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfMinute = startOfMinute(dirtyDateLeft) - var dateRightStartOfMinute = startOfMinute(dirtyDateRight) - - return dateLeftStartOfMinute.getTime() === dateRightStartOfMinute.getTime() -} - -module.exports = isSameMinute - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_month/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_month/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Month Helpers - * @summary Are the given dates in the same month? - * - * @description - * Are the given dates in the same month? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same month - * - * @example - * // Are 2 September 2014 and 25 September 2014 in the same month? - * var result = isSameMonth( - * new Date(2014, 8, 2), - * new Date(2014, 8, 25) - * ) - * //=> true - */ -function isSameMonth (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - return dateLeft.getFullYear() === dateRight.getFullYear() && - dateLeft.getMonth() === dateRight.getMonth() -} - -module.exports = isSameMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_quarter/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_quarter/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfQuarter = __webpack_require__(/*! ../start_of_quarter/index.js */ "../app/node_modules/date-fns/start_of_quarter/index.js") - -/** - * @category Quarter Helpers - * @summary Are the given dates in the same year quarter? - * - * @description - * Are the given dates in the same year quarter? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same quarter - * - * @example - * // Are 1 January 2014 and 8 March 2014 in the same quarter? - * var result = isSameQuarter( - * new Date(2014, 0, 1), - * new Date(2014, 2, 8) - * ) - * //=> true - */ -function isSameQuarter (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfQuarter = startOfQuarter(dirtyDateLeft) - var dateRightStartOfQuarter = startOfQuarter(dirtyDateRight) - - return dateLeftStartOfQuarter.getTime() === dateRightStartOfQuarter.getTime() -} - -module.exports = isSameQuarter - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_second/index.js": -/*!************************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_second/index.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfSecond = __webpack_require__(/*! ../start_of_second/index.js */ "../app/node_modules/date-fns/start_of_second/index.js") - -/** - * @category Second Helpers - * @summary Are the given dates in the same second? - * - * @description - * Are the given dates in the same second? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same second - * - * @example - * // Are 4 September 2014 06:30:15.000 and 4 September 2014 06:30.15.500 - * // in the same second? - * var result = isSameSecond( - * new Date(2014, 8, 4, 6, 30, 15), - * new Date(2014, 8, 4, 6, 30, 15, 500) - * ) - * //=> true - */ -function isSameSecond (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfSecond = startOfSecond(dirtyDateLeft) - var dateRightStartOfSecond = startOfSecond(dirtyDateRight) - - return dateLeftStartOfSecond.getTime() === dateRightStartOfSecond.getTime() -} - -module.exports = isSameSecond - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_week/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_week/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfWeek = __webpack_require__(/*! ../start_of_week/index.js */ "../app/node_modules/date-fns/start_of_week/index.js") - -/** - * @category Week Helpers - * @summary Are the given dates in the same week? - * - * @description - * Are the given dates in the same week? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Boolean} the dates are in the same week - * - * @example - * // Are 31 August 2014 and 4 September 2014 in the same week? - * var result = isSameWeek( - * new Date(2014, 7, 31), - * new Date(2014, 8, 4) - * ) - * //=> true - * - * @example - * // If week starts with Monday, - * // are 31 August 2014 and 4 September 2014 in the same week? - * var result = isSameWeek( - * new Date(2014, 7, 31), - * new Date(2014, 8, 4), - * {weekStartsOn: 1} - * ) - * //=> false - */ -function isSameWeek (dirtyDateLeft, dirtyDateRight, dirtyOptions) { - var dateLeftStartOfWeek = startOfWeek(dirtyDateLeft, dirtyOptions) - var dateRightStartOfWeek = startOfWeek(dirtyDateRight, dirtyOptions) - - return dateLeftStartOfWeek.getTime() === dateRightStartOfWeek.getTime() -} - -module.exports = isSameWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_same_year/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_same_year/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Year Helpers - * @summary Are the given dates in the same year? - * - * @description - * Are the given dates in the same year? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same year - * - * @example - * // Are 2 September 2014 and 25 September 2014 in the same year? - * var result = isSameYear( - * new Date(2014, 8, 2), - * new Date(2014, 8, 25) - * ) - * //=> true - */ -function isSameYear (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - return dateLeft.getFullYear() === dateRight.getFullYear() -} - -module.exports = isSameYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_saturday/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/is_saturday/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Is the given date Saturday? - * - * @description - * Is the given date Saturday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Saturday - * - * @example - * // Is 27 September 2014 Saturday? - * var result = isSaturday(new Date(2014, 8, 27)) - * //=> true - */ -function isSaturday (dirtyDate) { - return parse(dirtyDate).getDay() === 6 -} - -module.exports = isSaturday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_sunday/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/is_sunday/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Is the given date Sunday? - * - * @description - * Is the given date Sunday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Sunday - * - * @example - * // Is 21 September 2014 Sunday? - * var result = isSunday(new Date(2014, 8, 21)) - * //=> true - */ -function isSunday (dirtyDate) { - return parse(dirtyDate).getDay() === 0 -} - -module.exports = isSunday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_hour/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_hour/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameHour = __webpack_require__(/*! ../is_same_hour/index.js */ "../app/node_modules/date-fns/is_same_hour/index.js") - -/** - * @category Hour Helpers - * @summary Is the given date in the same hour as the current date? - * - * @description - * Is the given date in the same hour as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this hour - * - * @example - * // If now is 25 September 2014 18:30:15.500, - * // is 25 September 2014 18:00:00 in this hour? - * var result = isThisHour(new Date(2014, 8, 25, 18)) - * //=> true - */ -function isThisHour (dirtyDate) { - return isSameHour(new Date(), dirtyDate) -} - -module.exports = isThisHour - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_iso_week/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_iso_week/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameISOWeek = __webpack_require__(/*! ../is_same_iso_week/index.js */ "../app/node_modules/date-fns/is_same_iso_week/index.js") - -/** - * @category ISO Week Helpers - * @summary Is the given date in the same ISO week as the current date? - * - * @description - * Is the given date in the same ISO week as the current date? - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this ISO week - * - * @example - * // If today is 25 September 2014, is 22 September 2014 in this ISO week? - * var result = isThisISOWeek(new Date(2014, 8, 22)) - * //=> true - */ -function isThisISOWeek (dirtyDate) { - return isSameISOWeek(new Date(), dirtyDate) -} - -module.exports = isThisISOWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_iso_year/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_iso_year/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameISOYear = __webpack_require__(/*! ../is_same_iso_year/index.js */ "../app/node_modules/date-fns/is_same_iso_year/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Is the given date in the same ISO week-numbering year as the current date? - * - * @description - * Is the given date in the same ISO week-numbering year as the current date? - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this ISO week-numbering year - * - * @example - * // If today is 25 September 2014, - * // is 30 December 2013 in this ISO week-numbering year? - * var result = isThisISOYear(new Date(2013, 11, 30)) - * //=> true - */ -function isThisISOYear (dirtyDate) { - return isSameISOYear(new Date(), dirtyDate) -} - -module.exports = isThisISOYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_minute/index.js": -/*!************************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_minute/index.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameMinute = __webpack_require__(/*! ../is_same_minute/index.js */ "../app/node_modules/date-fns/is_same_minute/index.js") - -/** - * @category Minute Helpers - * @summary Is the given date in the same minute as the current date? - * - * @description - * Is the given date in the same minute as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this minute - * - * @example - * // If now is 25 September 2014 18:30:15.500, - * // is 25 September 2014 18:30:00 in this minute? - * var result = isThisMinute(new Date(2014, 8, 25, 18, 30)) - * //=> true - */ -function isThisMinute (dirtyDate) { - return isSameMinute(new Date(), dirtyDate) -} - -module.exports = isThisMinute - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_month/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_month/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameMonth = __webpack_require__(/*! ../is_same_month/index.js */ "../app/node_modules/date-fns/is_same_month/index.js") - -/** - * @category Month Helpers - * @summary Is the given date in the same month as the current date? - * - * @description - * Is the given date in the same month as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this month - * - * @example - * // If today is 25 September 2014, is 15 September 2014 in this month? - * var result = isThisMonth(new Date(2014, 8, 15)) - * //=> true - */ -function isThisMonth (dirtyDate) { - return isSameMonth(new Date(), dirtyDate) -} - -module.exports = isThisMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_quarter/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_quarter/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameQuarter = __webpack_require__(/*! ../is_same_quarter/index.js */ "../app/node_modules/date-fns/is_same_quarter/index.js") - -/** - * @category Quarter Helpers - * @summary Is the given date in the same quarter as the current date? - * - * @description - * Is the given date in the same quarter as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this quarter - * - * @example - * // If today is 25 September 2014, is 2 July 2014 in this quarter? - * var result = isThisQuarter(new Date(2014, 6, 2)) - * //=> true - */ -function isThisQuarter (dirtyDate) { - return isSameQuarter(new Date(), dirtyDate) -} - -module.exports = isThisQuarter - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_second/index.js": -/*!************************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_second/index.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameSecond = __webpack_require__(/*! ../is_same_second/index.js */ "../app/node_modules/date-fns/is_same_second/index.js") - -/** - * @category Second Helpers - * @summary Is the given date in the same second as the current date? - * - * @description - * Is the given date in the same second as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this second - * - * @example - * // If now is 25 September 2014 18:30:15.500, - * // is 25 September 2014 18:30:15.000 in this second? - * var result = isThisSecond(new Date(2014, 8, 25, 18, 30, 15)) - * //=> true - */ -function isThisSecond (dirtyDate) { - return isSameSecond(new Date(), dirtyDate) -} - -module.exports = isThisSecond - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_week/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_week/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameWeek = __webpack_require__(/*! ../is_same_week/index.js */ "../app/node_modules/date-fns/is_same_week/index.js") - -/** - * @category Week Helpers - * @summary Is the given date in the same week as the current date? - * - * @description - * Is the given date in the same week as the current date? - * - * @param {Date|String|Number} date - the date to check - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Boolean} the date is in this week - * - * @example - * // If today is 25 September 2014, is 21 September 2014 in this week? - * var result = isThisWeek(new Date(2014, 8, 21)) - * //=> true - * - * @example - * // If today is 25 September 2014 and week starts with Monday - * // is 21 September 2014 in this week? - * var result = isThisWeek(new Date(2014, 8, 21), {weekStartsOn: 1}) - * //=> false - */ -function isThisWeek (dirtyDate, dirtyOptions) { - return isSameWeek(new Date(), dirtyDate, dirtyOptions) -} - -module.exports = isThisWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_this_year/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_this_year/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isSameYear = __webpack_require__(/*! ../is_same_year/index.js */ "../app/node_modules/date-fns/is_same_year/index.js") - -/** - * @category Year Helpers - * @summary Is the given date in the same year as the current date? - * - * @description - * Is the given date in the same year as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this year - * - * @example - * // If today is 25 September 2014, is 2 July 2014 in this year? - * var result = isThisYear(new Date(2014, 6, 2)) - * //=> true - */ -function isThisYear (dirtyDate) { - return isSameYear(new Date(), dirtyDate) -} - -module.exports = isThisYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_thursday/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/is_thursday/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Is the given date Thursday? - * - * @description - * Is the given date Thursday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Thursday - * - * @example - * // Is 25 September 2014 Thursday? - * var result = isThursday(new Date(2014, 8, 25)) - * //=> true - */ -function isThursday (dirtyDate) { - return parse(dirtyDate).getDay() === 4 -} - -module.exports = isThursday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_today/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/is_today/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfDay = __webpack_require__(/*! ../start_of_day/index.js */ "../app/node_modules/date-fns/start_of_day/index.js") - -/** - * @category Day Helpers - * @summary Is the given date today? - * - * @description - * Is the given date today? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is today - * - * @example - * // If today is 6 October 2014, is 6 October 14:00:00 today? - * var result = isToday(new Date(2014, 9, 6, 14, 0)) - * //=> true - */ -function isToday (dirtyDate) { - return startOfDay(dirtyDate).getTime() === startOfDay(new Date()).getTime() -} - -module.exports = isToday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_tomorrow/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/is_tomorrow/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfDay = __webpack_require__(/*! ../start_of_day/index.js */ "../app/node_modules/date-fns/start_of_day/index.js") - -/** - * @category Day Helpers - * @summary Is the given date tomorrow? - * - * @description - * Is the given date tomorrow? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is tomorrow - * - * @example - * // If today is 6 October 2014, is 7 October 14:00:00 tomorrow? - * var result = isTomorrow(new Date(2014, 9, 7, 14, 0)) - * //=> true - */ -function isTomorrow (dirtyDate) { - var tomorrow = new Date() - tomorrow.setDate(tomorrow.getDate() + 1) - return startOfDay(dirtyDate).getTime() === startOfDay(tomorrow).getTime() -} - -module.exports = isTomorrow - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_tuesday/index.js": -/*!********************************************************!*\ - !*** ../app/node_modules/date-fns/is_tuesday/index.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Is the given date Tuesday? - * - * @description - * Is the given date Tuesday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Tuesday - * - * @example - * // Is 23 September 2014 Tuesday? - * var result = isTuesday(new Date(2014, 8, 23)) - * //=> true - */ -function isTuesday (dirtyDate) { - return parse(dirtyDate).getDay() === 2 -} - -module.exports = isTuesday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_valid/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/is_valid/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var isDate = __webpack_require__(/*! ../is_date/index.js */ "../app/node_modules/date-fns/is_date/index.js") - -/** - * @category Common Helpers - * @summary Is the given date valid? - * - * @description - * Returns false if argument is Invalid Date and true otherwise. - * Invalid Date is a Date, whose time value is NaN. - * - * Time value of Date: http://es5.github.io/#x15.9.1.1 - * - * @param {Date} date - the date to check - * @returns {Boolean} the date is valid - * @throws {TypeError} argument must be an instance of Date - * - * @example - * // For the valid date: - * var result = isValid(new Date(2014, 1, 31)) - * //=> true - * - * @example - * // For the invalid date: - * var result = isValid(new Date('')) - * //=> false - */ -function isValid (dirtyDate) { - if (isDate(dirtyDate)) { - return !isNaN(dirtyDate) - } else { - throw new TypeError(toString.call(dirtyDate) + ' is not an instance of Date') - } -} - -module.exports = isValid - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_wednesday/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_wednesday/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Is the given date Wednesday? - * - * @description - * Is the given date Wednesday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Wednesday - * - * @example - * // Is 24 September 2014 Wednesday? - * var result = isWednesday(new Date(2014, 8, 24)) - * //=> true - */ -function isWednesday (dirtyDate) { - return parse(dirtyDate).getDay() === 3 -} - -module.exports = isWednesday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_weekend/index.js": -/*!********************************************************!*\ - !*** ../app/node_modules/date-fns/is_weekend/index.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Weekday Helpers - * @summary Does the given date fall on a weekend? - * - * @description - * Does the given date fall on a weekend? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date falls on a weekend - * - * @example - * // Does 5 October 2014 fall on a weekend? - * var result = isWeekend(new Date(2014, 9, 5)) - * //=> true - */ -function isWeekend (dirtyDate) { - var date = parse(dirtyDate) - var day = date.getDay() - return day === 0 || day === 6 -} - -module.exports = isWeekend - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_within_range/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/is_within_range/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Range Helpers - * @summary Is the given date within the range? - * - * @description - * Is the given date within the range? - * - * @param {Date|String|Number} date - the date to check - * @param {Date|String|Number} startDate - the start of range - * @param {Date|String|Number} endDate - the end of range - * @returns {Boolean} the date is within the range - * @throws {Error} startDate cannot be after endDate - * - * @example - * // For the date within the range: - * isWithinRange( - * new Date(2014, 0, 3), new Date(2014, 0, 1), new Date(2014, 0, 7) - * ) - * //=> true - * - * @example - * // For the date outside of the range: - * isWithinRange( - * new Date(2014, 0, 10), new Date(2014, 0, 1), new Date(2014, 0, 7) - * ) - * //=> false - */ -function isWithinRange (dirtyDate, dirtyStartDate, dirtyEndDate) { - var time = parse(dirtyDate).getTime() - var startTime = parse(dirtyStartDate).getTime() - var endTime = parse(dirtyEndDate).getTime() - - if (startTime > endTime) { - throw new Error('The start of the range cannot be after the end of the range') - } - - return time >= startTime && time <= endTime -} - -module.exports = isWithinRange - - -/***/ }), - -/***/ "../app/node_modules/date-fns/is_yesterday/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/is_yesterday/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfDay = __webpack_require__(/*! ../start_of_day/index.js */ "../app/node_modules/date-fns/start_of_day/index.js") - -/** - * @category Day Helpers - * @summary Is the given date yesterday? - * - * @description - * Is the given date yesterday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is yesterday - * - * @example - * // If today is 6 October 2014, is 5 October 14:00:00 yesterday? - * var result = isYesterday(new Date(2014, 9, 5, 14, 0)) - * //=> true - */ -function isYesterday (dirtyDate) { - var yesterday = new Date() - yesterday.setDate(yesterday.getDate() - 1) - return startOfDay(dirtyDate).getTime() === startOfDay(yesterday).getTime() -} - -module.exports = isYesterday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/last_day_of_iso_week/index.js": -/*!******************************************************************!*\ - !*** ../app/node_modules/date-fns/last_day_of_iso_week/index.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var lastDayOfWeek = __webpack_require__(/*! ../last_day_of_week/index.js */ "../app/node_modules/date-fns/last_day_of_week/index.js") - -/** - * @category ISO Week Helpers - * @summary Return the last day of an ISO week for the given date. - * - * @description - * Return the last day of an ISO week for the given date. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the last day of an ISO week - * - * @example - * // The last day of an ISO week for 2 September 2014 11:55:00: - * var result = lastDayOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sun Sep 07 2014 00:00:00 - */ -function lastDayOfISOWeek (dirtyDate) { - return lastDayOfWeek(dirtyDate, {weekStartsOn: 1}) -} - -module.exports = lastDayOfISOWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/last_day_of_iso_year/index.js": -/*!******************************************************************!*\ - !*** ../app/node_modules/date-fns/last_day_of_iso_year/index.js ***! - \******************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getISOYear = __webpack_require__(/*! ../get_iso_year/index.js */ "../app/node_modules/date-fns/get_iso_year/index.js") -var startOfISOWeek = __webpack_require__(/*! ../start_of_iso_week/index.js */ "../app/node_modules/date-fns/start_of_iso_week/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Return the last day of an ISO week-numbering year for the given date. - * - * @description - * Return the last day of an ISO week-numbering year, - * which always starts 3 days before the year's first Thursday. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of an ISO week-numbering year - * - * @example - * // The last day of an ISO week-numbering year for 2 July 2005: - * var result = lastDayOfISOYear(new Date(2005, 6, 2)) - * //=> Sun Jan 01 2006 00:00:00 - */ -function lastDayOfISOYear (dirtyDate) { - var year = getISOYear(dirtyDate) - var fourthOfJanuary = new Date(0) - fourthOfJanuary.setFullYear(year + 1, 0, 4) - fourthOfJanuary.setHours(0, 0, 0, 0) - var date = startOfISOWeek(fourthOfJanuary) - date.setDate(date.getDate() - 1) - return date -} - -module.exports = lastDayOfISOYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/last_day_of_month/index.js": -/*!***************************************************************!*\ - !*** ../app/node_modules/date-fns/last_day_of_month/index.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Month Helpers - * @summary Return the last day of a month for the given date. - * - * @description - * Return the last day of a month for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the last day of a month - * - * @example - * // The last day of a month for 2 September 2014 11:55:00: - * var result = lastDayOfMonth(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 30 2014 00:00:00 - */ -function lastDayOfMonth (dirtyDate) { - var date = parse(dirtyDate) - var month = date.getMonth() - date.setFullYear(date.getFullYear(), month + 1, 0) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = lastDayOfMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/last_day_of_quarter/index.js": -/*!*****************************************************************!*\ - !*** ../app/node_modules/date-fns/last_day_of_quarter/index.js ***! - \*****************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Quarter Helpers - * @summary Return the last day of a year quarter for the given date. - * - * @description - * Return the last day of a year quarter for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the last day of a quarter - * - * @example - * // The last day of a quarter for 2 September 2014 11:55:00: - * var result = lastDayOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 30 2014 00:00:00 - */ -function lastDayOfQuarter (dirtyDate) { - var date = parse(dirtyDate) - var currentMonth = date.getMonth() - var month = currentMonth - currentMonth % 3 + 3 - date.setMonth(month, 0) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = lastDayOfQuarter - - -/***/ }), - -/***/ "../app/node_modules/date-fns/last_day_of_week/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/last_day_of_week/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Week Helpers - * @summary Return the last day of a week for the given date. - * - * @description - * Return the last day of a week for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Date} the last day of a week - * - * @example - * // The last day of a week for 2 September 2014 11:55:00: - * var result = lastDayOfWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sat Sep 06 2014 00:00:00 - * - * @example - * // If the week starts on Monday, the last day of the week for 2 September 2014 11:55:00: - * var result = lastDayOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) - * //=> Sun Sep 07 2014 00:00:00 - */ -function lastDayOfWeek (dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - - var date = parse(dirtyDate) - var day = date.getDay() - var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn) - - date.setHours(0, 0, 0, 0) - date.setDate(date.getDate() + diff) - return date -} - -module.exports = lastDayOfWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/last_day_of_year/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/last_day_of_year/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Year Helpers - * @summary Return the last day of a year for the given date. - * - * @description - * Return the last day of a year for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the last day of a year - * - * @example - * // The last day of a year for 2 September 2014 11:55:00: - * var result = lastDayOfYear(new Date(2014, 8, 2, 11, 55, 00)) - * //=> Wed Dec 31 2014 00:00:00 - */ -function lastDayOfYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - date.setFullYear(year + 1, 0, 0) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = lastDayOfYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/locale/_lib/build_formatting_tokens_reg_exp/index.js": -/*!*****************************************************************************************!*\ - !*** ../app/node_modules/date-fns/locale/_lib/build_formatting_tokens_reg_exp/index.js ***! - \*****************************************************************************************/ -/***/ ((module) => { - -var commonFormatterKeys = [ - 'M', 'MM', 'Q', 'D', 'DD', 'DDD', 'DDDD', 'd', - 'E', 'W', 'WW', 'YY', 'YYYY', 'GG', 'GGGG', - 'H', 'HH', 'h', 'hh', 'm', 'mm', - 's', 'ss', 'S', 'SS', 'SSS', - 'Z', 'ZZ', 'X', 'x' -] - -function buildFormattingTokensRegExp (formatters) { - var formatterKeys = [] - for (var key in formatters) { - if (formatters.hasOwnProperty(key)) { - formatterKeys.push(key) - } - } - - var formattingTokens = commonFormatterKeys - .concat(formatterKeys) - .sort() - .reverse() - var formattingTokensRegExp = new RegExp( - '(\\[[^\\[]*\\])|(\\\\)?' + '(' + formattingTokens.join('|') + '|.)', 'g' - ) - - return formattingTokensRegExp -} - -module.exports = buildFormattingTokensRegExp - - -/***/ }), - -/***/ "../app/node_modules/date-fns/locale/en/build_distance_in_words_locale/index.js": -/*!**************************************************************************************!*\ - !*** ../app/node_modules/date-fns/locale/en/build_distance_in_words_locale/index.js ***! - \**************************************************************************************/ -/***/ ((module) => { - -function buildDistanceInWordsLocale () { - var distanceInWordsLocale = { - lessThanXSeconds: { - one: 'less than a second', - other: 'less than {{count}} seconds' - }, - - xSeconds: { - one: '1 second', - other: '{{count}} seconds' - }, - - halfAMinute: 'half a minute', - - lessThanXMinutes: { - one: 'less than a minute', - other: 'less than {{count}} minutes' - }, - - xMinutes: { - one: '1 minute', - other: '{{count}} minutes' - }, - - aboutXHours: { - one: 'about 1 hour', - other: 'about {{count}} hours' - }, - - xHours: { - one: '1 hour', - other: '{{count}} hours' - }, - - xDays: { - one: '1 day', - other: '{{count}} days' - }, - - aboutXMonths: { - one: 'about 1 month', - other: 'about {{count}} months' - }, - - xMonths: { - one: '1 month', - other: '{{count}} months' - }, - - aboutXYears: { - one: 'about 1 year', - other: 'about {{count}} years' - }, - - xYears: { - one: '1 year', - other: '{{count}} years' - }, - - overXYears: { - one: 'over 1 year', - other: 'over {{count}} years' - }, - - almostXYears: { - one: 'almost 1 year', - other: 'almost {{count}} years' - } - } - - function localize (token, count, options) { - options = options || {} - - var result - if (typeof distanceInWordsLocale[token] === 'string') { - result = distanceInWordsLocale[token] - } else if (count === 1) { - result = distanceInWordsLocale[token].one - } else { - result = distanceInWordsLocale[token].other.replace('{{count}}', count) - } - - if (options.addSuffix) { - if (options.comparison > 0) { - return 'in ' + result - } else { - return result + ' ago' - } - } - - return result - } - - return { - localize: localize - } -} - -module.exports = buildDistanceInWordsLocale - - -/***/ }), - -/***/ "../app/node_modules/date-fns/locale/en/build_format_locale/index.js": -/*!***************************************************************************!*\ - !*** ../app/node_modules/date-fns/locale/en/build_format_locale/index.js ***! - \***************************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var buildFormattingTokensRegExp = __webpack_require__(/*! ../../_lib/build_formatting_tokens_reg_exp/index.js */ "../app/node_modules/date-fns/locale/_lib/build_formatting_tokens_reg_exp/index.js") - -function buildFormatLocale () { - // Note: in English, the names of days of the week and months are capitalized. - // If you are making a new locale based on this one, check if the same is true for the language you're working on. - // Generally, formatted dates should look like they are in the middle of a sentence, - // e.g. in Spanish language the weekdays and months should be in the lowercase. - var months3char = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] - var monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] - var weekdays2char = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] - var weekdays3char = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] - var weekdaysFull = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] - var meridiemUppercase = ['AM', 'PM'] - var meridiemLowercase = ['am', 'pm'] - var meridiemFull = ['a.m.', 'p.m.'] - - var formatters = { - // Month: Jan, Feb, ..., Dec - 'MMM': function (date) { - return months3char[date.getMonth()] - }, - - // Month: January, February, ..., December - 'MMMM': function (date) { - return monthsFull[date.getMonth()] - }, - - // Day of week: Su, Mo, ..., Sa - 'dd': function (date) { - return weekdays2char[date.getDay()] - }, - - // Day of week: Sun, Mon, ..., Sat - 'ddd': function (date) { - return weekdays3char[date.getDay()] - }, - - // Day of week: Sunday, Monday, ..., Saturday - 'dddd': function (date) { - return weekdaysFull[date.getDay()] - }, - - // AM, PM - 'A': function (date) { - return (date.getHours() / 12) >= 1 ? meridiemUppercase[1] : meridiemUppercase[0] - }, - - // am, pm - 'a': function (date) { - return (date.getHours() / 12) >= 1 ? meridiemLowercase[1] : meridiemLowercase[0] - }, - - // a.m., p.m. - 'aa': function (date) { - return (date.getHours() / 12) >= 1 ? meridiemFull[1] : meridiemFull[0] - } - } - - // Generate ordinal version of formatters: M -> Mo, D -> Do, etc. - var ordinalFormatters = ['M', 'D', 'DDD', 'd', 'Q', 'W'] - ordinalFormatters.forEach(function (formatterToken) { - formatters[formatterToken + 'o'] = function (date, formatters) { - return ordinal(formatters[formatterToken](date)) - } - }) - - return { - formatters: formatters, - formattingTokensRegExp: buildFormattingTokensRegExp(formatters) - } -} - -function ordinal (number) { - var rem100 = number % 100 - if (rem100 > 20 || rem100 < 10) { - switch (rem100 % 10) { - case 1: - return number + 'st' - case 2: - return number + 'nd' - case 3: - return number + 'rd' - } - } - return number + 'th' -} - -module.exports = buildFormatLocale - - -/***/ }), - -/***/ "../app/node_modules/date-fns/locale/en/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/locale/en/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var buildDistanceInWordsLocale = __webpack_require__(/*! ./build_distance_in_words_locale/index.js */ "../app/node_modules/date-fns/locale/en/build_distance_in_words_locale/index.js") -var buildFormatLocale = __webpack_require__(/*! ./build_format_locale/index.js */ "../app/node_modules/date-fns/locale/en/build_format_locale/index.js") - -/** - * @category Locales - * @summary English locale. - */ -module.exports = { - distanceInWords: buildDistanceInWordsLocale(), - format: buildFormatLocale() -} - - -/***/ }), - -/***/ "../app/node_modules/date-fns/max/index.js": -/*!*************************************************!*\ - !*** ../app/node_modules/date-fns/max/index.js ***! - \*************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Return the latest of the given dates. - * - * @description - * Return the latest of the given dates. - * - * @param {...(Date|String|Number)} dates - the dates to compare - * @returns {Date} the latest of the dates - * - * @example - * // Which of these dates is the latest? - * var result = max( - * new Date(1989, 6, 10), - * new Date(1987, 1, 11), - * new Date(1995, 6, 2), - * new Date(1990, 0, 1) - * ) - * //=> Sun Jul 02 1995 00:00:00 - */ -function max () { - var dirtyDates = Array.prototype.slice.call(arguments) - var dates = dirtyDates.map(function (dirtyDate) { - return parse(dirtyDate) - }) - var latestTimestamp = Math.max.apply(null, dates) - return new Date(latestTimestamp) -} - -module.exports = max - - -/***/ }), - -/***/ "../app/node_modules/date-fns/min/index.js": -/*!*************************************************!*\ - !*** ../app/node_modules/date-fns/min/index.js ***! - \*************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Common Helpers - * @summary Return the earliest of the given dates. - * - * @description - * Return the earliest of the given dates. - * - * @param {...(Date|String|Number)} dates - the dates to compare - * @returns {Date} the earliest of the dates - * - * @example - * // Which of these dates is the earliest? - * var result = min( - * new Date(1989, 6, 10), - * new Date(1987, 1, 11), - * new Date(1995, 6, 2), - * new Date(1990, 0, 1) - * ) - * //=> Wed Feb 11 1987 00:00:00 - */ -function min () { - var dirtyDates = Array.prototype.slice.call(arguments) - var dates = dirtyDates.map(function (dirtyDate) { - return parse(dirtyDate) - }) - var earliestTimestamp = Math.min.apply(null, dates) - return new Date(earliestTimestamp) -} - -module.exports = min - - -/***/ }), - -/***/ "../app/node_modules/date-fns/parse/index.js": -/*!***************************************************!*\ - !*** ../app/node_modules/date-fns/parse/index.js ***! - \***************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getTimezoneOffsetInMilliseconds = __webpack_require__(/*! ../_lib/getTimezoneOffsetInMilliseconds/index.js */ "../app/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds/index.js") -var isDate = __webpack_require__(/*! ../is_date/index.js */ "../app/node_modules/date-fns/is_date/index.js") - -var MILLISECONDS_IN_HOUR = 3600000 -var MILLISECONDS_IN_MINUTE = 60000 -var DEFAULT_ADDITIONAL_DIGITS = 2 - -var parseTokenDateTimeDelimeter = /[T ]/ -var parseTokenPlainTime = /:/ - -// year tokens -var parseTokenYY = /^(\d{2})$/ -var parseTokensYYY = [ - /^([+-]\d{2})$/, // 0 additional digits - /^([+-]\d{3})$/, // 1 additional digit - /^([+-]\d{4})$/ // 2 additional digits -] - -var parseTokenYYYY = /^(\d{4})/ -var parseTokensYYYYY = [ - /^([+-]\d{4})/, // 0 additional digits - /^([+-]\d{5})/, // 1 additional digit - /^([+-]\d{6})/ // 2 additional digits -] - -// date tokens -var parseTokenMM = /^-(\d{2})$/ -var parseTokenDDD = /^-?(\d{3})$/ -var parseTokenMMDD = /^-?(\d{2})-?(\d{2})$/ -var parseTokenWww = /^-?W(\d{2})$/ -var parseTokenWwwD = /^-?W(\d{2})-?(\d{1})$/ - -// time tokens -var parseTokenHH = /^(\d{2}([.,]\d*)?)$/ -var parseTokenHHMM = /^(\d{2}):?(\d{2}([.,]\d*)?)$/ -var parseTokenHHMMSS = /^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/ - -// timezone tokens -var parseTokenTimezone = /([Z+-].*)$/ -var parseTokenTimezoneZ = /^(Z)$/ -var parseTokenTimezoneHH = /^([+-])(\d{2})$/ -var parseTokenTimezoneHHMM = /^([+-])(\d{2}):?(\d{2})$/ - -/** - * @category Common Helpers - * @summary Convert the given argument to an instance of Date. - * - * @description - * Convert the given argument to an instance of Date. - * - * If the argument is an instance of Date, the function returns its clone. - * - * If the argument is a number, it is treated as a timestamp. - * - * If an argument is a string, the function tries to parse it. - * Function accepts complete ISO 8601 formats as well as partial implementations. - * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601 - * - * If all above fails, the function passes the given argument to Date constructor. - * - * @param {Date|String|Number} argument - the value to convert - * @param {Object} [options] - the object with options - * @param {0 | 1 | 2} [options.additionalDigits=2] - the additional number of digits in the extended year format - * @returns {Date} the parsed date in the local time zone - * - * @example - * // Convert string '2014-02-11T11:30:30' to date: - * var result = parse('2014-02-11T11:30:30') - * //=> Tue Feb 11 2014 11:30:30 - * - * @example - * // Parse string '+02014101', - * // if the additional number of digits in the extended year format is 1: - * var result = parse('+02014101', {additionalDigits: 1}) - * //=> Fri Apr 11 2014 00:00:00 - */ -function parse (argument, dirtyOptions) { - if (isDate(argument)) { - // Prevent the date to lose the milliseconds when passed to new Date() in IE10 - return new Date(argument.getTime()) - } else if (typeof argument !== 'string') { - return new Date(argument) - } - - var options = dirtyOptions || {} - var additionalDigits = options.additionalDigits - if (additionalDigits == null) { - additionalDigits = DEFAULT_ADDITIONAL_DIGITS - } else { - additionalDigits = Number(additionalDigits) - } - - var dateStrings = splitDateString(argument) - - var parseYearResult = parseYear(dateStrings.date, additionalDigits) - var year = parseYearResult.year - var restDateString = parseYearResult.restDateString - - var date = parseDate(restDateString, year) - - if (date) { - var timestamp = date.getTime() - var time = 0 - var offset - - if (dateStrings.time) { - time = parseTime(dateStrings.time) - } - - if (dateStrings.timezone) { - offset = parseTimezone(dateStrings.timezone) * MILLISECONDS_IN_MINUTE - } else { - var fullTime = timestamp + time - var fullTimeDate = new Date(fullTime) - - offset = getTimezoneOffsetInMilliseconds(fullTimeDate) - - // Adjust time when it's coming from DST - var fullTimeDateNextDay = new Date(fullTime) - fullTimeDateNextDay.setDate(fullTimeDate.getDate() + 1) - var offsetDiff = - getTimezoneOffsetInMilliseconds(fullTimeDateNextDay) - - getTimezoneOffsetInMilliseconds(fullTimeDate) - if (offsetDiff > 0) { - offset += offsetDiff - } - } - - return new Date(timestamp + time + offset) - } else { - return new Date(argument) - } -} - -function splitDateString (dateString) { - var dateStrings = {} - var array = dateString.split(parseTokenDateTimeDelimeter) - var timeString - - if (parseTokenPlainTime.test(array[0])) { - dateStrings.date = null - timeString = array[0] - } else { - dateStrings.date = array[0] - timeString = array[1] - } - - if (timeString) { - var token = parseTokenTimezone.exec(timeString) - if (token) { - dateStrings.time = timeString.replace(token[1], '') - dateStrings.timezone = token[1] - } else { - dateStrings.time = timeString - } - } - - return dateStrings -} - -function parseYear (dateString, additionalDigits) { - var parseTokenYYY = parseTokensYYY[additionalDigits] - var parseTokenYYYYY = parseTokensYYYYY[additionalDigits] - - var token - - // YYYY or ±YYYYY - token = parseTokenYYYY.exec(dateString) || parseTokenYYYYY.exec(dateString) - if (token) { - var yearString = token[1] - return { - year: parseInt(yearString, 10), - restDateString: dateString.slice(yearString.length) - } - } - - // YY or ±YYY - token = parseTokenYY.exec(dateString) || parseTokenYYY.exec(dateString) - if (token) { - var centuryString = token[1] - return { - year: parseInt(centuryString, 10) * 100, - restDateString: dateString.slice(centuryString.length) - } - } - - // Invalid ISO-formatted year - return { - year: null - } -} - -function parseDate (dateString, year) { - // Invalid ISO-formatted year - if (year === null) { - return null - } - - var token - var date - var month - var week - - // YYYY - if (dateString.length === 0) { - date = new Date(0) - date.setUTCFullYear(year) - return date - } - - // YYYY-MM - token = parseTokenMM.exec(dateString) - if (token) { - date = new Date(0) - month = parseInt(token[1], 10) - 1 - date.setUTCFullYear(year, month) - return date - } - - // YYYY-DDD or YYYYDDD - token = parseTokenDDD.exec(dateString) - if (token) { - date = new Date(0) - var dayOfYear = parseInt(token[1], 10) - date.setUTCFullYear(year, 0, dayOfYear) - return date - } - - // YYYY-MM-DD or YYYYMMDD - token = parseTokenMMDD.exec(dateString) - if (token) { - date = new Date(0) - month = parseInt(token[1], 10) - 1 - var day = parseInt(token[2], 10) - date.setUTCFullYear(year, month, day) - return date - } - - // YYYY-Www or YYYYWww - token = parseTokenWww.exec(dateString) - if (token) { - week = parseInt(token[1], 10) - 1 - return dayOfISOYear(year, week) - } - - // YYYY-Www-D or YYYYWwwD - token = parseTokenWwwD.exec(dateString) - if (token) { - week = parseInt(token[1], 10) - 1 - var dayOfWeek = parseInt(token[2], 10) - 1 - return dayOfISOYear(year, week, dayOfWeek) - } - - // Invalid ISO-formatted date - return null -} - -function parseTime (timeString) { - var token - var hours - var minutes - - // hh - token = parseTokenHH.exec(timeString) - if (token) { - hours = parseFloat(token[1].replace(',', '.')) - return (hours % 24) * MILLISECONDS_IN_HOUR - } - - // hh:mm or hhmm - token = parseTokenHHMM.exec(timeString) - if (token) { - hours = parseInt(token[1], 10) - minutes = parseFloat(token[2].replace(',', '.')) - return (hours % 24) * MILLISECONDS_IN_HOUR + - minutes * MILLISECONDS_IN_MINUTE - } - - // hh:mm:ss or hhmmss - token = parseTokenHHMMSS.exec(timeString) - if (token) { - hours = parseInt(token[1], 10) - minutes = parseInt(token[2], 10) - var seconds = parseFloat(token[3].replace(',', '.')) - return (hours % 24) * MILLISECONDS_IN_HOUR + - minutes * MILLISECONDS_IN_MINUTE + - seconds * 1000 - } - - // Invalid ISO-formatted time - return null -} - -function parseTimezone (timezoneString) { - var token - var absoluteOffset - - // Z - token = parseTokenTimezoneZ.exec(timezoneString) - if (token) { - return 0 - } - - // ±hh - token = parseTokenTimezoneHH.exec(timezoneString) - if (token) { - absoluteOffset = parseInt(token[2], 10) * 60 - return (token[1] === '+') ? -absoluteOffset : absoluteOffset - } - - // ±hh:mm or ±hhmm - token = parseTokenTimezoneHHMM.exec(timezoneString) - if (token) { - absoluteOffset = parseInt(token[2], 10) * 60 + parseInt(token[3], 10) - return (token[1] === '+') ? -absoluteOffset : absoluteOffset - } - - return 0 -} - -function dayOfISOYear (isoYear, week, day) { - week = week || 0 - day = day || 0 - var date = new Date(0) - date.setUTCFullYear(isoYear, 0, 4) - var fourthOfJanuaryDay = date.getUTCDay() || 7 - var diff = week * 7 + day + 1 - fourthOfJanuaryDay - date.setUTCDate(date.getUTCDate() + diff) - return date -} - -module.exports = parse - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_date/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/set_date/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Day Helpers - * @summary Set the day of the month to the given date. - * - * @description - * Set the day of the month to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} dayOfMonth - the day of the month of the new date - * @returns {Date} the new date with the day of the month setted - * - * @example - * // Set the 30th day of the month to 1 September 2014: - * var result = setDate(new Date(2014, 8, 1), 30) - * //=> Tue Sep 30 2014 00:00:00 - */ -function setDate (dirtyDate, dirtyDayOfMonth) { - var date = parse(dirtyDate) - var dayOfMonth = Number(dirtyDayOfMonth) - date.setDate(dayOfMonth) - return date -} - -module.exports = setDate - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_day/index.js": -/*!*****************************************************!*\ - !*** ../app/node_modules/date-fns/set_day/index.js ***! - \*****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var addDays = __webpack_require__(/*! ../add_days/index.js */ "../app/node_modules/date-fns/add_days/index.js") - -/** - * @category Weekday Helpers - * @summary Set the day of the week to the given date. - * - * @description - * Set the day of the week to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} day - the day of the week of the new date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Date} the new date with the day of the week setted - * - * @example - * // Set Sunday to 1 September 2014: - * var result = setDay(new Date(2014, 8, 1), 0) - * //=> Sun Aug 31 2014 00:00:00 - * - * @example - * // If week starts with Monday, set Sunday to 1 September 2014: - * var result = setDay(new Date(2014, 8, 1), 0, {weekStartsOn: 1}) - * //=> Sun Sep 07 2014 00:00:00 - */ -function setDay (dirtyDate, dirtyDay, dirtyOptions) { - var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - var date = parse(dirtyDate) - var day = Number(dirtyDay) - var currentDay = date.getDay() - - var remainder = day % 7 - var dayIndex = (remainder + 7) % 7 - - var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay - return addDays(date, diff) -} - -module.exports = setDay - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_day_of_year/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/set_day_of_year/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Day Helpers - * @summary Set the day of the year to the given date. - * - * @description - * Set the day of the year to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} dayOfYear - the day of the year of the new date - * @returns {Date} the new date with the day of the year setted - * - * @example - * // Set the 2nd day of the year to 2 July 2014: - * var result = setDayOfYear(new Date(2014, 6, 2), 2) - * //=> Thu Jan 02 2014 00:00:00 - */ -function setDayOfYear (dirtyDate, dirtyDayOfYear) { - var date = parse(dirtyDate) - var dayOfYear = Number(dirtyDayOfYear) - date.setMonth(0) - date.setDate(dayOfYear) - return date -} - -module.exports = setDayOfYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_hours/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/set_hours/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Hour Helpers - * @summary Set the hours to the given date. - * - * @description - * Set the hours to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} hours - the hours of the new date - * @returns {Date} the new date with the hours setted - * - * @example - * // Set 4 hours to 1 September 2014 11:30:00: - * var result = setHours(new Date(2014, 8, 1, 11, 30), 4) - * //=> Mon Sep 01 2014 04:30:00 - */ -function setHours (dirtyDate, dirtyHours) { - var date = parse(dirtyDate) - var hours = Number(dirtyHours) - date.setHours(hours) - return date -} - -module.exports = setHours - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_iso_day/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/set_iso_day/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var addDays = __webpack_require__(/*! ../add_days/index.js */ "../app/node_modules/date-fns/add_days/index.js") -var getISODay = __webpack_require__(/*! ../get_iso_day/index.js */ "../app/node_modules/date-fns/get_iso_day/index.js") - -/** - * @category Weekday Helpers - * @summary Set the day of the ISO week to the given date. - * - * @description - * Set the day of the ISO week to the given date. - * ISO week starts with Monday. - * 7 is the index of Sunday, 1 is the index of Monday etc. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} day - the day of the ISO week of the new date - * @returns {Date} the new date with the day of the ISO week setted - * - * @example - * // Set Sunday to 1 September 2014: - * var result = setISODay(new Date(2014, 8, 1), 7) - * //=> Sun Sep 07 2014 00:00:00 - */ -function setISODay (dirtyDate, dirtyDay) { - var date = parse(dirtyDate) - var day = Number(dirtyDay) - var currentDay = getISODay(date) - var diff = day - currentDay - return addDays(date, diff) -} - -module.exports = setISODay - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_iso_week/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/set_iso_week/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var getISOWeek = __webpack_require__(/*! ../get_iso_week/index.js */ "../app/node_modules/date-fns/get_iso_week/index.js") - -/** - * @category ISO Week Helpers - * @summary Set the ISO week to the given date. - * - * @description - * Set the ISO week to the given date, saving the weekday number. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} isoWeek - the ISO week of the new date - * @returns {Date} the new date with the ISO week setted - * - * @example - * // Set the 53rd ISO week to 7 August 2004: - * var result = setISOWeek(new Date(2004, 7, 7), 53) - * //=> Sat Jan 01 2005 00:00:00 - */ -function setISOWeek (dirtyDate, dirtyISOWeek) { - var date = parse(dirtyDate) - var isoWeek = Number(dirtyISOWeek) - var diff = getISOWeek(date) - isoWeek - date.setDate(date.getDate() - diff * 7) - return date -} - -module.exports = setISOWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_iso_year/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/set_iso_year/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var startOfISOYear = __webpack_require__(/*! ../start_of_iso_year/index.js */ "../app/node_modules/date-fns/start_of_iso_year/index.js") -var differenceInCalendarDays = __webpack_require__(/*! ../difference_in_calendar_days/index.js */ "../app/node_modules/date-fns/difference_in_calendar_days/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Set the ISO week-numbering year to the given date. - * - * @description - * Set the ISO week-numbering year to the given date, - * saving the week number and the weekday number. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} isoYear - the ISO week-numbering year of the new date - * @returns {Date} the new date with the ISO week-numbering year setted - * - * @example - * // Set ISO week-numbering year 2007 to 29 December 2008: - * var result = setISOYear(new Date(2008, 11, 29), 2007) - * //=> Mon Jan 01 2007 00:00:00 - */ -function setISOYear (dirtyDate, dirtyISOYear) { - var date = parse(dirtyDate) - var isoYear = Number(dirtyISOYear) - var diff = differenceInCalendarDays(date, startOfISOYear(date)) - var fourthOfJanuary = new Date(0) - fourthOfJanuary.setFullYear(isoYear, 0, 4) - fourthOfJanuary.setHours(0, 0, 0, 0) - date = startOfISOYear(fourthOfJanuary) - date.setDate(date.getDate() + diff) - return date -} - -module.exports = setISOYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_milliseconds/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/set_milliseconds/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Millisecond Helpers - * @summary Set the milliseconds to the given date. - * - * @description - * Set the milliseconds to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} milliseconds - the milliseconds of the new date - * @returns {Date} the new date with the milliseconds setted - * - * @example - * // Set 300 milliseconds to 1 September 2014 11:30:40.500: - * var result = setMilliseconds(new Date(2014, 8, 1, 11, 30, 40, 500), 300) - * //=> Mon Sep 01 2014 11:30:40.300 - */ -function setMilliseconds (dirtyDate, dirtyMilliseconds) { - var date = parse(dirtyDate) - var milliseconds = Number(dirtyMilliseconds) - date.setMilliseconds(milliseconds) - return date -} - -module.exports = setMilliseconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_minutes/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/set_minutes/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Minute Helpers - * @summary Set the minutes to the given date. - * - * @description - * Set the minutes to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} minutes - the minutes of the new date - * @returns {Date} the new date with the minutes setted - * - * @example - * // Set 45 minutes to 1 September 2014 11:30:40: - * var result = setMinutes(new Date(2014, 8, 1, 11, 30, 40), 45) - * //=> Mon Sep 01 2014 11:45:40 - */ -function setMinutes (dirtyDate, dirtyMinutes) { - var date = parse(dirtyDate) - var minutes = Number(dirtyMinutes) - date.setMinutes(minutes) - return date -} - -module.exports = setMinutes - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_month/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/set_month/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var getDaysInMonth = __webpack_require__(/*! ../get_days_in_month/index.js */ "../app/node_modules/date-fns/get_days_in_month/index.js") - -/** - * @category Month Helpers - * @summary Set the month to the given date. - * - * @description - * Set the month to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} month - the month of the new date - * @returns {Date} the new date with the month setted - * - * @example - * // Set February to 1 September 2014: - * var result = setMonth(new Date(2014, 8, 1), 1) - * //=> Sat Feb 01 2014 00:00:00 - */ -function setMonth (dirtyDate, dirtyMonth) { - var date = parse(dirtyDate) - var month = Number(dirtyMonth) - var year = date.getFullYear() - var day = date.getDate() - - var dateWithDesiredMonth = new Date(0) - dateWithDesiredMonth.setFullYear(year, month, 15) - dateWithDesiredMonth.setHours(0, 0, 0, 0) - var daysInMonth = getDaysInMonth(dateWithDesiredMonth) - // Set the last day of the new month - // if the original date was the last day of the longer month - date.setMonth(month, Math.min(day, daysInMonth)) - return date -} - -module.exports = setMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_quarter/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/set_quarter/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") -var setMonth = __webpack_require__(/*! ../set_month/index.js */ "../app/node_modules/date-fns/set_month/index.js") - -/** - * @category Quarter Helpers - * @summary Set the year quarter to the given date. - * - * @description - * Set the year quarter to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} quarter - the quarter of the new date - * @returns {Date} the new date with the quarter setted - * - * @example - * // Set the 2nd quarter to 2 July 2014: - * var result = setQuarter(new Date(2014, 6, 2), 2) - * //=> Wed Apr 02 2014 00:00:00 - */ -function setQuarter (dirtyDate, dirtyQuarter) { - var date = parse(dirtyDate) - var quarter = Number(dirtyQuarter) - var oldQuarter = Math.floor(date.getMonth() / 3) + 1 - var diff = quarter - oldQuarter - return setMonth(date, date.getMonth() + diff * 3) -} - -module.exports = setQuarter - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_seconds/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/set_seconds/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Second Helpers - * @summary Set the seconds to the given date. - * - * @description - * Set the seconds to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} seconds - the seconds of the new date - * @returns {Date} the new date with the seconds setted - * - * @example - * // Set 45 seconds to 1 September 2014 11:30:40: - * var result = setSeconds(new Date(2014, 8, 1, 11, 30, 40), 45) - * //=> Mon Sep 01 2014 11:30:45 - */ -function setSeconds (dirtyDate, dirtySeconds) { - var date = parse(dirtyDate) - var seconds = Number(dirtySeconds) - date.setSeconds(seconds) - return date -} - -module.exports = setSeconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/set_year/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/set_year/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Year Helpers - * @summary Set the year to the given date. - * - * @description - * Set the year to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} year - the year of the new date - * @returns {Date} the new date with the year setted - * - * @example - * // Set year 2013 to 1 September 2014: - * var result = setYear(new Date(2014, 8, 1), 2013) - * //=> Sun Sep 01 2013 00:00:00 - */ -function setYear (dirtyDate, dirtyYear) { - var date = parse(dirtyDate) - var year = Number(dirtyYear) - date.setFullYear(year) - return date -} - -module.exports = setYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_day/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_day/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Day Helpers - * @summary Return the start of a day for the given date. - * - * @description - * Return the start of a day for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a day - * - * @example - * // The start of a day for 2 September 2014 11:55:00: - * var result = startOfDay(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 02 2014 00:00:00 - */ -function startOfDay (dirtyDate) { - var date = parse(dirtyDate) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = startOfDay - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_hour/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_hour/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Hour Helpers - * @summary Return the start of an hour for the given date. - * - * @description - * Return the start of an hour for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of an hour - * - * @example - * // The start of an hour for 2 September 2014 11:55:00: - * var result = startOfHour(new Date(2014, 8, 2, 11, 55)) - * //=> Tue Sep 02 2014 11:00:00 - */ -function startOfHour (dirtyDate) { - var date = parse(dirtyDate) - date.setMinutes(0, 0, 0) - return date -} - -module.exports = startOfHour - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_iso_week/index.js": -/*!***************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_iso_week/index.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfWeek = __webpack_require__(/*! ../start_of_week/index.js */ "../app/node_modules/date-fns/start_of_week/index.js") - -/** - * @category ISO Week Helpers - * @summary Return the start of an ISO week for the given date. - * - * @description - * Return the start of an ISO week for the given date. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of an ISO week - * - * @example - * // The start of an ISO week for 2 September 2014 11:55:00: - * var result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Mon Sep 01 2014 00:00:00 - */ -function startOfISOWeek (dirtyDate) { - return startOfWeek(dirtyDate, {weekStartsOn: 1}) -} - -module.exports = startOfISOWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_iso_year/index.js": -/*!***************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_iso_year/index.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var getISOYear = __webpack_require__(/*! ../get_iso_year/index.js */ "../app/node_modules/date-fns/get_iso_year/index.js") -var startOfISOWeek = __webpack_require__(/*! ../start_of_iso_week/index.js */ "../app/node_modules/date-fns/start_of_iso_week/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Return the start of an ISO week-numbering year for the given date. - * - * @description - * Return the start of an ISO week-numbering year, - * which always starts 3 days before the year's first Thursday. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of an ISO year - * - * @example - * // The start of an ISO week-numbering year for 2 July 2005: - * var result = startOfISOYear(new Date(2005, 6, 2)) - * //=> Mon Jan 03 2005 00:00:00 - */ -function startOfISOYear (dirtyDate) { - var year = getISOYear(dirtyDate) - var fourthOfJanuary = new Date(0) - fourthOfJanuary.setFullYear(year, 0, 4) - fourthOfJanuary.setHours(0, 0, 0, 0) - var date = startOfISOWeek(fourthOfJanuary) - return date -} - -module.exports = startOfISOYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_minute/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_minute/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Minute Helpers - * @summary Return the start of a minute for the given date. - * - * @description - * Return the start of a minute for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a minute - * - * @example - * // The start of a minute for 1 December 2014 22:15:45.400: - * var result = startOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:00 - */ -function startOfMinute (dirtyDate) { - var date = parse(dirtyDate) - date.setSeconds(0, 0) - return date -} - -module.exports = startOfMinute - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_month/index.js": -/*!************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_month/index.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Month Helpers - * @summary Return the start of a month for the given date. - * - * @description - * Return the start of a month for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a month - * - * @example - * // The start of a month for 2 September 2014 11:55:00: - * var result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Mon Sep 01 2014 00:00:00 - */ -function startOfMonth (dirtyDate) { - var date = parse(dirtyDate) - date.setDate(1) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = startOfMonth - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_quarter/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_quarter/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Quarter Helpers - * @summary Return the start of a year quarter for the given date. - * - * @description - * Return the start of a year quarter for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a quarter - * - * @example - * // The start of a quarter for 2 September 2014 11:55:00: - * var result = startOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Jul 01 2014 00:00:00 - */ -function startOfQuarter (dirtyDate) { - var date = parse(dirtyDate) - var currentMonth = date.getMonth() - var month = currentMonth - currentMonth % 3 - date.setMonth(month, 1) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = startOfQuarter - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_second/index.js": -/*!*************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_second/index.js ***! - \*************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Second Helpers - * @summary Return the start of a second for the given date. - * - * @description - * Return the start of a second for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a second - * - * @example - * // The start of a second for 1 December 2014 22:15:45.400: - * var result = startOfSecond(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:45.000 - */ -function startOfSecond (dirtyDate) { - var date = parse(dirtyDate) - date.setMilliseconds(0) - return date -} - -module.exports = startOfSecond - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_today/index.js": -/*!************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_today/index.js ***! - \************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var startOfDay = __webpack_require__(/*! ../start_of_day/index.js */ "../app/node_modules/date-fns/start_of_day/index.js") - -/** - * @category Day Helpers - * @summary Return the start of today. - * - * @description - * Return the start of today. - * - * @returns {Date} the start of today - * - * @example - * // If today is 6 October 2014: - * var result = startOfToday() - * //=> Mon Oct 6 2014 00:00:00 - */ -function startOfToday () { - return startOfDay(new Date()) -} - -module.exports = startOfToday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_tomorrow/index.js": -/*!***************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_tomorrow/index.js ***! - \***************************************************************/ -/***/ ((module) => { - -/** - * @category Day Helpers - * @summary Return the start of tomorrow. - * - * @description - * Return the start of tomorrow. - * - * @returns {Date} the start of tomorrow - * - * @example - * // If today is 6 October 2014: - * var result = startOfTomorrow() - * //=> Tue Oct 7 2014 00:00:00 - */ -function startOfTomorrow () { - var now = new Date() - var year = now.getFullYear() - var month = now.getMonth() - var day = now.getDate() - - var date = new Date(0) - date.setFullYear(year, month, day + 1) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = startOfTomorrow - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_week/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_week/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Week Helpers - * @summary Return the start of a week for the given date. - * - * @description - * Return the start of a week for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Date} the start of a week - * - * @example - * // The start of a week for 2 September 2014 11:55:00: - * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sun Aug 31 2014 00:00:00 - * - * @example - * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00: - * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) - * //=> Mon Sep 01 2014 00:00:00 - */ -function startOfWeek (dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - - var date = parse(dirtyDate) - var day = date.getDay() - var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn - - date.setDate(date.getDate() - diff) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = startOfWeek - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_year/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_year/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var parse = __webpack_require__(/*! ../parse/index.js */ "../app/node_modules/date-fns/parse/index.js") - -/** - * @category Year Helpers - * @summary Return the start of a year for the given date. - * - * @description - * Return the start of a year for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a year - * - * @example - * // The start of a year for 2 September 2014 11:55:00: - * var result = startOfYear(new Date(2014, 8, 2, 11, 55, 00)) - * //=> Wed Jan 01 2014 00:00:00 - */ -function startOfYear (dirtyDate) { - var cleanDate = parse(dirtyDate) - var date = new Date(0) - date.setFullYear(cleanDate.getFullYear(), 0, 1) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = startOfYear - - -/***/ }), - -/***/ "../app/node_modules/date-fns/start_of_yesterday/index.js": -/*!****************************************************************!*\ - !*** ../app/node_modules/date-fns/start_of_yesterday/index.js ***! - \****************************************************************/ -/***/ ((module) => { - -/** - * @category Day Helpers - * @summary Return the start of yesterday. - * - * @description - * Return the start of yesterday. - * - * @returns {Date} the start of yesterday - * - * @example - * // If today is 6 October 2014: - * var result = startOfYesterday() - * //=> Sun Oct 5 2014 00:00:00 - */ -function startOfYesterday () { - var now = new Date() - var year = now.getFullYear() - var month = now.getMonth() - var day = now.getDate() - - var date = new Date(0) - date.setFullYear(year, month, day - 1) - date.setHours(0, 0, 0, 0) - return date -} - -module.exports = startOfYesterday - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_days/index.js": -/*!******************************************************!*\ - !*** ../app/node_modules/date-fns/sub_days/index.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addDays = __webpack_require__(/*! ../add_days/index.js */ "../app/node_modules/date-fns/add_days/index.js") - -/** - * @category Day Helpers - * @summary Subtract the specified number of days from the given date. - * - * @description - * Subtract the specified number of days from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of days to be subtracted - * @returns {Date} the new date with the days subtracted - * - * @example - * // Subtract 10 days from 1 September 2014: - * var result = subDays(new Date(2014, 8, 1), 10) - * //=> Fri Aug 22 2014 00:00:00 - */ -function subDays (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addDays(dirtyDate, -amount) -} - -module.exports = subDays - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_hours/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/sub_hours/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addHours = __webpack_require__(/*! ../add_hours/index.js */ "../app/node_modules/date-fns/add_hours/index.js") - -/** - * @category Hour Helpers - * @summary Subtract the specified number of hours from the given date. - * - * @description - * Subtract the specified number of hours from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of hours to be subtracted - * @returns {Date} the new date with the hours subtracted - * - * @example - * // Subtract 2 hours from 11 July 2014 01:00:00: - * var result = subHours(new Date(2014, 6, 11, 1, 0), 2) - * //=> Thu Jul 10 2014 23:00:00 - */ -function subHours (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addHours(dirtyDate, -amount) -} - -module.exports = subHours - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_iso_years/index.js": -/*!***********************************************************!*\ - !*** ../app/node_modules/date-fns/sub_iso_years/index.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addISOYears = __webpack_require__(/*! ../add_iso_years/index.js */ "../app/node_modules/date-fns/add_iso_years/index.js") - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Subtract the specified number of ISO week-numbering years from the given date. - * - * @description - * Subtract the specified number of ISO week-numbering years from the given date. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of ISO week-numbering years to be subtracted - * @returns {Date} the new date with the ISO week-numbering years subtracted - * - * @example - * // Subtract 5 ISO week-numbering years from 1 September 2014: - * var result = subISOYears(new Date(2014, 8, 1), 5) - * //=> Mon Aug 31 2009 00:00:00 - */ -function subISOYears (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addISOYears(dirtyDate, -amount) -} - -module.exports = subISOYears - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_milliseconds/index.js": -/*!**************************************************************!*\ - !*** ../app/node_modules/date-fns/sub_milliseconds/index.js ***! - \**************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addMilliseconds = __webpack_require__(/*! ../add_milliseconds/index.js */ "../app/node_modules/date-fns/add_milliseconds/index.js") - -/** - * @category Millisecond Helpers - * @summary Subtract the specified number of milliseconds from the given date. - * - * @description - * Subtract the specified number of milliseconds from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of milliseconds to be subtracted - * @returns {Date} the new date with the milliseconds subtracted - * - * @example - * // Subtract 750 milliseconds from 10 July 2014 12:45:30.000: - * var result = subMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750) - * //=> Thu Jul 10 2014 12:45:29.250 - */ -function subMilliseconds (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMilliseconds(dirtyDate, -amount) -} - -module.exports = subMilliseconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_minutes/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/sub_minutes/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addMinutes = __webpack_require__(/*! ../add_minutes/index.js */ "../app/node_modules/date-fns/add_minutes/index.js") - -/** - * @category Minute Helpers - * @summary Subtract the specified number of minutes from the given date. - * - * @description - * Subtract the specified number of minutes from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of minutes to be subtracted - * @returns {Date} the new date with the mintues subtracted - * - * @example - * // Subtract 30 minutes from 10 July 2014 12:00:00: - * var result = subMinutes(new Date(2014, 6, 10, 12, 0), 30) - * //=> Thu Jul 10 2014 11:30:00 - */ -function subMinutes (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMinutes(dirtyDate, -amount) -} - -module.exports = subMinutes - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_months/index.js": -/*!********************************************************!*\ - !*** ../app/node_modules/date-fns/sub_months/index.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addMonths = __webpack_require__(/*! ../add_months/index.js */ "../app/node_modules/date-fns/add_months/index.js") - -/** - * @category Month Helpers - * @summary Subtract the specified number of months from the given date. - * - * @description - * Subtract the specified number of months from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of months to be subtracted - * @returns {Date} the new date with the months subtracted - * - * @example - * // Subtract 5 months from 1 February 2015: - * var result = subMonths(new Date(2015, 1, 1), 5) - * //=> Mon Sep 01 2014 00:00:00 - */ -function subMonths (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMonths(dirtyDate, -amount) -} - -module.exports = subMonths - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_quarters/index.js": -/*!**********************************************************!*\ - !*** ../app/node_modules/date-fns/sub_quarters/index.js ***! - \**********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addQuarters = __webpack_require__(/*! ../add_quarters/index.js */ "../app/node_modules/date-fns/add_quarters/index.js") - -/** - * @category Quarter Helpers - * @summary Subtract the specified number of year quarters from the given date. - * - * @description - * Subtract the specified number of year quarters from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of quarters to be subtracted - * @returns {Date} the new date with the quarters subtracted - * - * @example - * // Subtract 3 quarters from 1 September 2014: - * var result = subQuarters(new Date(2014, 8, 1), 3) - * //=> Sun Dec 01 2013 00:00:00 - */ -function subQuarters (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addQuarters(dirtyDate, -amount) -} - -module.exports = subQuarters - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_seconds/index.js": -/*!*********************************************************!*\ - !*** ../app/node_modules/date-fns/sub_seconds/index.js ***! - \*********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addSeconds = __webpack_require__(/*! ../add_seconds/index.js */ "../app/node_modules/date-fns/add_seconds/index.js") - -/** - * @category Second Helpers - * @summary Subtract the specified number of seconds from the given date. - * - * @description - * Subtract the specified number of seconds from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of seconds to be subtracted - * @returns {Date} the new date with the seconds subtracted - * - * @example - * // Subtract 30 seconds from 10 July 2014 12:45:00: - * var result = subSeconds(new Date(2014, 6, 10, 12, 45, 0), 30) - * //=> Thu Jul 10 2014 12:44:30 - */ -function subSeconds (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addSeconds(dirtyDate, -amount) -} - -module.exports = subSeconds - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_weeks/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/sub_weeks/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addWeeks = __webpack_require__(/*! ../add_weeks/index.js */ "../app/node_modules/date-fns/add_weeks/index.js") - -/** - * @category Week Helpers - * @summary Subtract the specified number of weeks from the given date. - * - * @description - * Subtract the specified number of weeks from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of weeks to be subtracted - * @returns {Date} the new date with the weeks subtracted - * - * @example - * // Subtract 4 weeks from 1 September 2014: - * var result = subWeeks(new Date(2014, 8, 1), 4) - * //=> Mon Aug 04 2014 00:00:00 - */ -function subWeeks (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addWeeks(dirtyDate, -amount) -} - -module.exports = subWeeks - - -/***/ }), - -/***/ "../app/node_modules/date-fns/sub_years/index.js": -/*!*******************************************************!*\ - !*** ../app/node_modules/date-fns/sub_years/index.js ***! - \*******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -var addYears = __webpack_require__(/*! ../add_years/index.js */ "../app/node_modules/date-fns/add_years/index.js") - -/** - * @category Year Helpers - * @summary Subtract the specified number of years from the given date. - * - * @description - * Subtract the specified number of years from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of years to be subtracted - * @returns {Date} the new date with the years subtracted - * - * @example - * // Subtract 5 years from 1 September 2014: - * var result = subYears(new Date(2014, 8, 1), 5) - * //=> Tue Sep 01 2009 00:00:00 - */ -function subYears (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addYears(dirtyDate, -amount) -} - -module.exports = subYears - - -/***/ }) - -}]); -//# sourceMappingURL=date-fns.chunk.js.map \ No newline at end of file diff --git a/cypress/fixtures/v3-client/date-fns.chunk.js.map b/cypress/fixtures/v3-client/date-fns.chunk.js.map deleted file mode 100644 index 1562fe46..00000000 --- a/cypress/fixtures/v3-client/date-fns.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"date-fns.chunk.js","mappings":";;;;;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;;;;ACpBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,sBAAsB,mBAAO,CAAC,4FAA8B;;AAE5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,iBAAiB,mBAAO,CAAC,oFAA0B;AACnD,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,sBAAsB,mBAAO,CAAC,4FAA8B;;AAE5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACjCA,gBAAgB,mBAAO,CAAC,gFAAwB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,sBAAsB,mBAAO,CAAC,4FAA8B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,cAAc,mBAAO,CAAC,4EAAsB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,gBAAgB,mBAAO,CAAC,gFAAwB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC3CA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,0BAA0B;AACrC,aAAa,QAAQ;AACrB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;;;;;;;;;;AChDA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,0BAA0B;AACrC,aAAa,MAAM;AACnB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;;;;;;;;;;;AC9CA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;;;;;;;;;;AClDA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;;;;;;;;;;AClDA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxCA,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzCA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC/BA,iBAAiB,mBAAO,CAAC,kFAAyB;AAClD,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AChCA,kBAAkB,mBAAO,CAAC,sFAA2B;;AAErD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnDA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC5BA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,+BAA+B,mBAAO,CAAC,kHAAyC;AAChF,iBAAiB,mBAAO,CAAC,kFAAyB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACtCA,+BAA+B,mBAAO,CAAC,gHAAwC;;AAE/E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC5BA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,mCAAmC,mBAAO,CAAC,4HAA8C;AACzF,iBAAiB,mBAAO,CAAC,kFAAyB;AAClD,kBAAkB,mBAAO,CAAC,sFAA2B;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC5BA,+BAA+B,mBAAO,CAAC,gHAAwC;;AAE/E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC5BA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,iCAAiC,mBAAO,CAAC,sHAA2C;AACpF,iBAAiB,mBAAO,CAAC,kFAAyB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrCA,yBAAyB,mBAAO,CAAC,oGAAkC;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,+BAA+B,mBAAO,CAAC,gHAAwC;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,uBAAuB,mBAAO,CAAC,gGAAgC;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,gCAAgC,mBAAO,CAAC,oHAA0C;AAClF,iBAAiB,mBAAO,CAAC,kFAAyB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrCA,kBAAkB,mBAAO,CAAC,oFAA0B;AACpD,YAAY,mBAAO,CAAC,sEAAmB;AACvC,0BAA0B,mBAAO,CAAC,sGAAmC;AACrE,yBAAyB,mBAAO,CAAC,oGAAkC;AACnE,eAAe,mBAAO,CAAC,8EAAuB;;AAE9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAM;AACN;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1MA,kBAAkB,mBAAO,CAAC,oFAA0B;AACpD,YAAY,mBAAO,CAAC,sEAAmB;AACvC,0BAA0B,mBAAO,CAAC,sGAAmC;AACrE,eAAe,mBAAO,CAAC,8EAAuB;;AAE9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,yBAAyB;AACpC,WAAW,wBAAwB;AACnC,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;;AAEA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC/KA,sBAAsB,mBAAO,CAAC,8FAA+B;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACpFA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;ACrDA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,gBAAgB,mBAAO,CAAC,kFAAyB;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,gBAAgB;AAC/C;;AAEA;;;;;;;;;;;ACxBA,iBAAiB,mBAAO,CAAC,oFAA0B;AACnD,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AChCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,eAAe,mBAAO,CAAC,gFAAwB;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D,gBAAgB;AAC5E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,mBAAmB,mBAAO,CAAC,0FAA6B;AACxD,iBAAiB,mBAAO,CAAC,oFAA0B;AACnD,iBAAiB,mBAAO,CAAC,oFAA0B;AACnD,YAAY,mBAAO,CAAC,sEAAmB;AACvC,cAAc,mBAAO,CAAC,4EAAsB;AAC5C,eAAe,mBAAO,CAAC,8EAAuB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAc,YAAY;AAC1B;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvUA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,kBAAkB,mBAAO,CAAC,sFAA2B;AACrD,+BAA+B,mBAAO,CAAC,kHAAyC;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC/BA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,qBAAqB,mBAAO,CAAC,8FAA+B;AAC5D,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACjCA,qBAAqB,mBAAO,CAAC,8FAA+B;AAC5D,eAAe,mBAAO,CAAC,8EAAuB;;AAE9C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AChCA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;;;;;;;;;;AC5CA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,eAAe,mBAAO,CAAC,gFAAwB;AAC/C,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC5BA,kBAAkB,mBAAO,CAAC,sFAA2B;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC5BA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gBAAgB;AACpE;;AAEA;;;;;;;;;;;AC3BA,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC9BA,oBAAoB,mBAAO,CAAC,0FAA6B;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC7BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC5BA,qBAAqB,mBAAO,CAAC,4FAA8B;;AAE3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC5BA,oBAAoB,mBAAO,CAAC,0FAA6B;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC7BA,kBAAkB,mBAAO,CAAC,sFAA2B;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;ACxCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACtBA,oBAAoB,mBAAO,CAAC,4FAA8B;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,oBAAoB,mBAAO,CAAC,4FAA8B;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,mBAAmB,mBAAO,CAAC,wFAA4B;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACtBA,kBAAkB,mBAAO,CAAC,sFAA2B;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,oBAAoB,mBAAO,CAAC,0FAA6B;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,mBAAmB,mBAAO,CAAC,wFAA4B;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACtBA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAgB;AACnE;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC7BA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,aAAa,mBAAO,CAAC,0EAAqB;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,aAAa,SAAS;AACtB,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;;;;;;;;;;AClCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;ACzCA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,oBAAoB,mBAAO,CAAC,4FAA8B;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD;;AAEA;;;;;;;;;;;ACxBA,iBAAiB,mBAAO,CAAC,oFAA0B;AACnD,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AChCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,gBAAgB;AAChF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;AC3BA;AACA;AACA;AACA;AACA,0BAA0B,QAAQ;AAClC,KAAK;;AAEL;AACA;AACA,gBAAgB,QAAQ;AACxB,KAAK;;AAEL;;AAEA;AACA;AACA,0BAA0B,QAAQ;AAClC,KAAK;;AAEL;AACA;AACA,gBAAgB,QAAQ;AACxB,KAAK;;AAEL;AACA;AACA,sBAAsB,QAAQ;AAC9B,KAAK;;AAEL;AACA;AACA,gBAAgB,QAAQ;AACxB,KAAK;;AAEL;AACA;AACA,gBAAgB,QAAQ;AACxB,KAAK;;AAEL;AACA;AACA,sBAAsB,QAAQ;AAC9B,KAAK;;AAEL;AACA;AACA,gBAAgB,QAAQ;AACxB,KAAK;;AAEL;AACA;AACA,sBAAsB,QAAQ;AAC9B,KAAK;;AAEL;AACA;AACA,gBAAgB,QAAQ;AACxB,KAAK;;AAEL;AACA;AACA,qBAAqB,QAAQ;AAC7B,KAAK;;AAEL;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN,6DAA6D,OAAO;AACpE;;AAEA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AClGA,kCAAkC,mBAAO,CAAC,8IAAqD;;AAE/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvFA,iCAAiC,mBAAO,CAAC,iIAA2C;AACpF,wBAAwB,mBAAO,CAAC,2GAAgC;;AAEhE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACVA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;;;;;;;;;;AC/BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;;;;;;;;;;;AC/BA,sCAAsC,mBAAO,CAAC,oIAAkD;AAChG,aAAa,mBAAO,CAAC,0EAAqB;;AAE1C;AACA;AACA;;AAEA;AACA;;AAEA;AACA,yBAAyB,EAAE;AAC3B;AACA,YAAY,EAAE;AACd,YAAY,EAAE;AACd,YAAY,EAAE;AACd;;AAEA,2BAA2B,EAAE;AAC7B;AACA,YAAY,EAAE;AACd,YAAY,EAAE;AACd,YAAY,EAAE;AACd;;AAEA;AACA,0BAA0B,EAAE;AAC5B,4BAA4B,EAAE;AAC9B,6BAA6B,EAAE,OAAO,EAAE;AACxC,6BAA6B,EAAE;AAC/B,8BAA8B,EAAE,OAAO,EAAE;;AAEzC;AACA,yBAAyB,EAAE;AAC3B,2BAA2B,EAAE,OAAO,EAAE;AACtC,6BAA6B,EAAE,OAAO,EAAE,OAAO,EAAE;;AAEjD;AACA;AACA;AACA,uCAAuC,EAAE;AACzC,yCAAyC,EAAE,OAAO,EAAE;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,WAAW;AACtB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,oBAAoB;AACxD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3UA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,cAAc,mBAAO,CAAC,4EAAsB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;;;;;ACvCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,cAAc,mBAAO,CAAC,4EAAsB;AAC5C,gBAAgB,mBAAO,CAAC,kFAAyB;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC9BA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC7BA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,qBAAqB,mBAAO,CAAC,8FAA+B;AAC5D,+BAA+B,mBAAO,CAAC,kHAAyC;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACnCA,YAAY,mBAAO,CAAC,sEAAmB;AACvC,eAAe,mBAAO,CAAC,8EAAuB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,kBAAkB,mBAAO,CAAC,sFAA2B;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,gBAAgB;AACjD;;AAEA;;;;;;;;;;;ACxBA,iBAAiB,mBAAO,CAAC,oFAA0B;AACnD,qBAAqB,mBAAO,CAAC,8FAA+B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC/BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC3BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACxBA,iBAAiB,mBAAO,CAAC,oFAA0B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,gBAAgB;AAC9E;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACrCA,YAAY,mBAAO,CAAC,sEAAmB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;AC1BA,cAAc,mBAAO,CAAC,4EAAsB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,eAAe,mBAAO,CAAC,8EAAuB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,kBAAkB,mBAAO,CAAC,sFAA2B;;AAErD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACzBA,sBAAsB,mBAAO,CAAC,4FAA8B;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,iBAAiB,mBAAO,CAAC,kFAAyB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,gBAAgB,mBAAO,CAAC,gFAAwB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,kBAAkB,mBAAO,CAAC,oFAA0B;;AAEpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,iBAAiB,mBAAO,CAAC,kFAAyB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,eAAe,mBAAO,CAAC,8EAAuB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;;;;;ACvBA,eAAe,mBAAO,CAAC,8EAAuB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,oBAAoB;AAC/B,WAAW,QAAQ;AACnB,aAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA","sources":["webpack://@padloc/pwa/../app/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_days/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_hours/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_iso_years/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_milliseconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_minutes/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_months/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_quarters/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_seconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_weeks/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/add_years/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/are_ranges_overlapping/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/closest_index_to/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/closest_to/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/compare_asc/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/compare_desc/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_calendar_days/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_calendar_iso_weeks/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_calendar_iso_years/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_calendar_months/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_calendar_quarters/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_calendar_weeks/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_calendar_years/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_days/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_hours/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_iso_years/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_milliseconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_minutes/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_months/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_quarters/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_seconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_weeks/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/difference_in_years/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/distance_in_words/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/distance_in_words_strict/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/distance_in_words_to_now/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/each_day/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_day/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_hour/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_iso_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_iso_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_minute/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_quarter/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_second/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_today/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_tomorrow/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/end_of_yesterday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/format/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_date/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_day/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_day_of_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_days_in_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_days_in_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_hours/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_iso_day/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_iso_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_iso_weeks_in_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_iso_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_milliseconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_minutes/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_overlapping_days_in_ranges/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_quarter/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_seconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_time/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/get_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_after/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_before/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_date/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_equal/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_first_day_of_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_friday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_future/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_last_day_of_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_leap_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_monday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_past/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_day/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_hour/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_iso_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_iso_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_minute/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_quarter/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_second/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_same_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_saturday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_sunday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_hour/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_iso_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_iso_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_minute/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_quarter/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_second/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_this_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_thursday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_today/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_tomorrow/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_tuesday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_valid/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_wednesday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_weekend/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_within_range/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/is_yesterday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/last_day_of_iso_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/last_day_of_iso_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/last_day_of_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/last_day_of_quarter/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/last_day_of_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/last_day_of_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/locale/_lib/build_formatting_tokens_reg_exp/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/locale/en/build_distance_in_words_locale/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/locale/en/build_format_locale/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/locale/en/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/max/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/min/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/parse/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_date/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_day/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_day_of_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_hours/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_iso_day/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_iso_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_iso_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_milliseconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_minutes/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_quarter/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_seconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/set_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_day/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_hour/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_iso_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_iso_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_minute/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_month/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_quarter/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_second/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_today/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_tomorrow/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_week/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_year/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/start_of_yesterday/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_days/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_hours/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_iso_years/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_milliseconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_minutes/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_months/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_quarters/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_seconds/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_weeks/index.js","webpack://@padloc/pwa/../app/node_modules/date-fns/sub_years/index.js"],"sourcesContent":["var MILLISECONDS_IN_MINUTE = 60000\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nmodule.exports = function getTimezoneOffsetInMilliseconds (dirtyDate) {\n var date = new Date(dirtyDate.getTime())\n var baseTimezoneOffset = date.getTimezoneOffset()\n date.setSeconds(0, 0)\n var millisecondsPartOfTimezoneOffset = date.getTime() % MILLISECONDS_IN_MINUTE\n\n return baseTimezoneOffset * MILLISECONDS_IN_MINUTE + millisecondsPartOfTimezoneOffset\n}\n","var parse = require('../parse/index.js')\n\n/**\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of days to be added\n * @returns {Date} the new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * var result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n */\nfunction addDays (dirtyDate, dirtyAmount) {\n var date = parse(dirtyDate)\n var amount = Number(dirtyAmount)\n date.setDate(date.getDate() + amount)\n return date\n}\n\nmodule.exports = addDays\n","var addMilliseconds = require('../add_milliseconds/index.js')\n\nvar MILLISECONDS_IN_HOUR = 3600000\n\n/**\n * @category Hour Helpers\n * @summary Add the specified number of hours to the given date.\n *\n * @description\n * Add the specified number of hours to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of hours to be added\n * @returns {Date} the new date with the hours added\n *\n * @example\n * // Add 2 hours to 10 July 2014 23:00:00:\n * var result = addHours(new Date(2014, 6, 10, 23, 0), 2)\n * //=> Fri Jul 11 2014 01:00:00\n */\nfunction addHours (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR)\n}\n\nmodule.exports = addHours\n","var getISOYear = require('../get_iso_year/index.js')\nvar setISOYear = require('../set_iso_year/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Add the specified number of ISO week-numbering years to the given date.\n *\n * @description\n * Add the specified number of ISO week-numbering years to the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of ISO week-numbering years to be added\n * @returns {Date} the new date with the ISO week-numbering years added\n *\n * @example\n * // Add 5 ISO week-numbering years to 2 July 2010:\n * var result = addISOYears(new Date(2010, 6, 2), 5)\n * //=> Fri Jun 26 2015 00:00:00\n */\nfunction addISOYears (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return setISOYear(dirtyDate, getISOYear(dirtyDate) + amount)\n}\n\nmodule.exports = addISOYears\n","var parse = require('../parse/index.js')\n\n/**\n * @category Millisecond Helpers\n * @summary Add the specified number of milliseconds to the given date.\n *\n * @description\n * Add the specified number of milliseconds to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of milliseconds to be added\n * @returns {Date} the new date with the milliseconds added\n *\n * @example\n * // Add 750 milliseconds to 10 July 2014 12:45:30.000:\n * var result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:30.750\n */\nfunction addMilliseconds (dirtyDate, dirtyAmount) {\n var timestamp = parse(dirtyDate).getTime()\n var amount = Number(dirtyAmount)\n return new Date(timestamp + amount)\n}\n\nmodule.exports = addMilliseconds\n","var addMilliseconds = require('../add_milliseconds/index.js')\n\nvar MILLISECONDS_IN_MINUTE = 60000\n\n/**\n * @category Minute Helpers\n * @summary Add the specified number of minutes to the given date.\n *\n * @description\n * Add the specified number of minutes to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of minutes to be added\n * @returns {Date} the new date with the minutes added\n *\n * @example\n * // Add 30 minutes to 10 July 2014 12:00:00:\n * var result = addMinutes(new Date(2014, 6, 10, 12, 0), 30)\n * //=> Thu Jul 10 2014 12:30:00\n */\nfunction addMinutes (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_MINUTE)\n}\n\nmodule.exports = addMinutes\n","var parse = require('../parse/index.js')\nvar getDaysInMonth = require('../get_days_in_month/index.js')\n\n/**\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of months to be added\n * @returns {Date} the new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * var result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n */\nfunction addMonths (dirtyDate, dirtyAmount) {\n var date = parse(dirtyDate)\n var amount = Number(dirtyAmount)\n var desiredMonth = date.getMonth() + amount\n var dateWithDesiredMonth = new Date(0)\n dateWithDesiredMonth.setFullYear(date.getFullYear(), desiredMonth, 1)\n dateWithDesiredMonth.setHours(0, 0, 0, 0)\n var daysInMonth = getDaysInMonth(dateWithDesiredMonth)\n // Set the last day of the new month\n // if the original date was the last day of the longer month\n date.setMonth(desiredMonth, Math.min(daysInMonth, date.getDate()))\n return date\n}\n\nmodule.exports = addMonths\n","var addMonths = require('../add_months/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Add the specified number of year quarters to the given date.\n *\n * @description\n * Add the specified number of year quarters to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of quarters to be added\n * @returns {Date} the new date with the quarters added\n *\n * @example\n * // Add 1 quarter to 1 September 2014:\n * var result = addQuarters(new Date(2014, 8, 1), 1)\n * //=> Mon Dec 01 2014 00:00:00\n */\nfunction addQuarters (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n var months = amount * 3\n return addMonths(dirtyDate, months)\n}\n\nmodule.exports = addQuarters\n","var addMilliseconds = require('../add_milliseconds/index.js')\n\n/**\n * @category Second Helpers\n * @summary Add the specified number of seconds to the given date.\n *\n * @description\n * Add the specified number of seconds to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of seconds to be added\n * @returns {Date} the new date with the seconds added\n *\n * @example\n * // Add 30 seconds to 10 July 2014 12:45:00:\n * var result = addSeconds(new Date(2014, 6, 10, 12, 45, 0), 30)\n * //=> Thu Jul 10 2014 12:45:30\n */\nfunction addSeconds (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addMilliseconds(dirtyDate, amount * 1000)\n}\n\nmodule.exports = addSeconds\n","var addDays = require('../add_days/index.js')\n\n/**\n * @category Week Helpers\n * @summary Add the specified number of weeks to the given date.\n *\n * @description\n * Add the specified number of week to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of weeks to be added\n * @returns {Date} the new date with the weeks added\n *\n * @example\n * // Add 4 weeks to 1 September 2014:\n * var result = addWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Sep 29 2014 00:00:00\n */\nfunction addWeeks (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n var days = amount * 7\n return addDays(dirtyDate, days)\n}\n\nmodule.exports = addWeeks\n","var addMonths = require('../add_months/index.js')\n\n/**\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of years to be added\n * @returns {Date} the new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * var result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nfunction addYears (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addMonths(dirtyDate, amount * 12)\n}\n\nmodule.exports = addYears\n","var parse = require('../parse/index.js')\n\n/**\n * @category Range Helpers\n * @summary Is the given date range overlapping with another date range?\n *\n * @description\n * Is the given date range overlapping with another date range?\n *\n * @param {Date|String|Number} initialRangeStartDate - the start of the initial range\n * @param {Date|String|Number} initialRangeEndDate - the end of the initial range\n * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with\n * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with\n * @returns {Boolean} whether the date ranges are overlapping\n * @throws {Error} startDate of a date range cannot be after its endDate\n *\n * @example\n * // For overlapping date ranges:\n * areRangesOverlapping(\n * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21)\n * )\n * //=> true\n *\n * @example\n * // For non-overlapping date ranges:\n * areRangesOverlapping(\n * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22)\n * )\n * //=> false\n */\nfunction areRangesOverlapping (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) {\n var initialStartTime = parse(dirtyInitialRangeStartDate).getTime()\n var initialEndTime = parse(dirtyInitialRangeEndDate).getTime()\n var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime()\n var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime()\n\n if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) {\n throw new Error('The start of the range cannot be after the end of the range')\n }\n\n return initialStartTime < comparedEndTime && comparedStartTime < initialEndTime\n}\n\nmodule.exports = areRangesOverlapping\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Return an index of the closest date from the array comparing to the given date.\n *\n * @description\n * Return an index of the closest date from the array comparing to the given date.\n *\n * @param {Date|String|Number} dateToCompare - the date to compare with\n * @param {Date[]|String[]|Number[]} datesArray - the array to search\n * @returns {Number} an index of the date closest to the given date\n * @throws {TypeError} the second argument must be an instance of Array\n *\n * @example\n * // Which date is closer to 6 September 2015?\n * var dateToCompare = new Date(2015, 8, 6)\n * var datesArray = [\n * new Date(2015, 0, 1),\n * new Date(2016, 0, 1),\n * new Date(2017, 0, 1)\n * ]\n * var result = closestIndexTo(dateToCompare, datesArray)\n * //=> 1\n */\nfunction closestIndexTo (dirtyDateToCompare, dirtyDatesArray) {\n if (!(dirtyDatesArray instanceof Array)) {\n throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array')\n }\n\n var dateToCompare = parse(dirtyDateToCompare)\n var timeToCompare = dateToCompare.getTime()\n\n var result\n var minDistance\n\n dirtyDatesArray.forEach(function (dirtyDate, index) {\n var currentDate = parse(dirtyDate)\n var distance = Math.abs(timeToCompare - currentDate.getTime())\n if (result === undefined || distance < minDistance) {\n result = index\n minDistance = distance\n }\n })\n\n return result\n}\n\nmodule.exports = closestIndexTo\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Return a date from the array closest to the given date.\n *\n * @description\n * Return a date from the array closest to the given date.\n *\n * @param {Date|String|Number} dateToCompare - the date to compare with\n * @param {Date[]|String[]|Number[]} datesArray - the array to search\n * @returns {Date} the date from the array closest to the given date\n * @throws {TypeError} the second argument must be an instance of Array\n *\n * @example\n * // Which date is closer to 6 September 2015: 1 January 2000 or 1 January 2030?\n * var dateToCompare = new Date(2015, 8, 6)\n * var result = closestTo(dateToCompare, [\n * new Date(2000, 0, 1),\n * new Date(2030, 0, 1)\n * ])\n * //=> Tue Jan 01 2030 00:00:00\n */\nfunction closestTo (dirtyDateToCompare, dirtyDatesArray) {\n if (!(dirtyDatesArray instanceof Array)) {\n throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array')\n }\n\n var dateToCompare = parse(dirtyDateToCompare)\n var timeToCompare = dateToCompare.getTime()\n\n var result\n var minDistance\n\n dirtyDatesArray.forEach(function (dirtyDate) {\n var currentDate = parse(dirtyDate)\n var distance = Math.abs(timeToCompare - currentDate.getTime())\n if (result === undefined || distance < minDistance) {\n result = currentDate\n minDistance = distance\n }\n })\n\n return result\n}\n\nmodule.exports = closestTo\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * @param {Date|String|Number} dateLeft - the first date to compare\n * @param {Date|String|Number} dateRight - the second date to compare\n * @returns {Number} the result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * var result = compareAsc(\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * )\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * var result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\nfunction compareAsc (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var timeLeft = dateLeft.getTime()\n var dateRight = parse(dirtyDateRight)\n var timeRight = dateRight.getTime()\n\n if (timeLeft < timeRight) {\n return -1\n } else if (timeLeft > timeRight) {\n return 1\n } else {\n return 0\n }\n}\n\nmodule.exports = compareAsc\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Compare the two dates reverse chronologically and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return -1 if the first date is after the second,\n * 1 if the first date is before the second or 0 if dates are equal.\n *\n * @param {Date|String|Number} dateLeft - the first date to compare\n * @param {Date|String|Number} dateRight - the second date to compare\n * @returns {Number} the result of the comparison\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989 reverse chronologically:\n * var result = compareDesc(\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * )\n * //=> 1\n *\n * @example\n * // Sort the array of dates in reverse chronological order:\n * var result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareDesc)\n * //=> [\n * // Sun Jul 02 1995 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Wed Feb 11 1987 00:00:00\n * // ]\n */\nfunction compareDesc (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var timeLeft = dateLeft.getTime()\n var dateRight = parse(dirtyDateRight)\n var timeRight = dateRight.getTime()\n\n if (timeLeft > timeRight) {\n return -1\n } else if (timeLeft < timeRight) {\n return 1\n } else {\n return 0\n }\n}\n\nmodule.exports = compareDesc\n","var startOfDay = require('../start_of_day/index.js')\n\nvar MILLISECONDS_IN_MINUTE = 60000\nvar MILLISECONDS_IN_DAY = 86400000\n\n/**\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * var result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n */\nfunction differenceInCalendarDays (dirtyDateLeft, dirtyDateRight) {\n var startOfDayLeft = startOfDay(dirtyDateLeft)\n var startOfDayRight = startOfDay(dirtyDateRight)\n\n var timestampLeft = startOfDayLeft.getTime() -\n startOfDayLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE\n var timestampRight = startOfDayRight.getTime() -\n startOfDayRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE\n\n // Round the number of days to the nearest integer\n // because the number of milliseconds in a day is not constant\n // (e.g. it's different in the day of the daylight saving time clock shift)\n return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY)\n}\n\nmodule.exports = differenceInCalendarDays\n","var startOfISOWeek = require('../start_of_iso_week/index.js')\n\nvar MILLISECONDS_IN_MINUTE = 60000\nvar MILLISECONDS_IN_WEEK = 604800000\n\n/**\n * @category ISO Week Helpers\n * @summary Get the number of calendar ISO weeks between the given dates.\n *\n * @description\n * Get the number of calendar ISO weeks between the given dates.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of calendar ISO weeks\n *\n * @example\n * // How many calendar ISO weeks are between 6 July 2014 and 21 July 2014?\n * var result = differenceInCalendarISOWeeks(\n * new Date(2014, 6, 21),\n * new Date(2014, 6, 6)\n * )\n * //=> 3\n */\nfunction differenceInCalendarISOWeeks (dirtyDateLeft, dirtyDateRight) {\n var startOfISOWeekLeft = startOfISOWeek(dirtyDateLeft)\n var startOfISOWeekRight = startOfISOWeek(dirtyDateRight)\n\n var timestampLeft = startOfISOWeekLeft.getTime() -\n startOfISOWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE\n var timestampRight = startOfISOWeekRight.getTime() -\n startOfISOWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE\n\n // Round the number of days to the nearest integer\n // because the number of milliseconds in a week is not constant\n // (e.g. it's different in the week of the daylight saving time clock shift)\n return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK)\n}\n\nmodule.exports = differenceInCalendarISOWeeks\n","var getISOYear = require('../get_iso_year/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the number of calendar ISO week-numbering years between the given dates.\n *\n * @description\n * Get the number of calendar ISO week-numbering years between the given dates.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of calendar ISO week-numbering years\n *\n * @example\n * // How many calendar ISO week-numbering years are 1 January 2010 and 1 January 2012?\n * var result = differenceInCalendarISOYears(\n * new Date(2012, 0, 1),\n * new Date(2010, 0, 1)\n * )\n * //=> 2\n */\nfunction differenceInCalendarISOYears (dirtyDateLeft, dirtyDateRight) {\n return getISOYear(dirtyDateLeft) - getISOYear(dirtyDateRight)\n}\n\nmodule.exports = differenceInCalendarISOYears\n","var parse = require('../parse/index.js')\n\n/**\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * var result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nfunction differenceInCalendarMonths (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n\n var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear()\n var monthDiff = dateLeft.getMonth() - dateRight.getMonth()\n\n return yearDiff * 12 + monthDiff\n}\n\nmodule.exports = differenceInCalendarMonths\n","var getQuarter = require('../get_quarter/index.js')\nvar parse = require('../parse/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Get the number of calendar quarters between the given dates.\n *\n * @description\n * Get the number of calendar quarters between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of calendar quarters\n *\n * @example\n * // How many calendar quarters are between 31 December 2013 and 2 July 2014?\n * var result = differenceInCalendarQuarters(\n * new Date(2014, 6, 2),\n * new Date(2013, 11, 31)\n * )\n * //=> 3\n */\nfunction differenceInCalendarQuarters (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n\n var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear()\n var quarterDiff = getQuarter(dateLeft) - getQuarter(dateRight)\n\n return yearDiff * 4 + quarterDiff\n}\n\nmodule.exports = differenceInCalendarQuarters\n","var startOfWeek = require('../start_of_week/index.js')\n\nvar MILLISECONDS_IN_MINUTE = 60000\nvar MILLISECONDS_IN_WEEK = 604800000\n\n/**\n * @category Week Helpers\n * @summary Get the number of calendar weeks between the given dates.\n *\n * @description\n * Get the number of calendar weeks between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @param {Object} [options] - the object with options\n * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @returns {Number} the number of calendar weeks\n *\n * @example\n * // How many calendar weeks are between 5 July 2014 and 20 July 2014?\n * var result = differenceInCalendarWeeks(\n * new Date(2014, 6, 20),\n * new Date(2014, 6, 5)\n * )\n * //=> 3\n *\n * @example\n * // If the week starts on Monday,\n * // how many calendar weeks are between 5 July 2014 and 20 July 2014?\n * var result = differenceInCalendarWeeks(\n * new Date(2014, 6, 20),\n * new Date(2014, 6, 5),\n * {weekStartsOn: 1}\n * )\n * //=> 2\n */\nfunction differenceInCalendarWeeks (dirtyDateLeft, dirtyDateRight, dirtyOptions) {\n var startOfWeekLeft = startOfWeek(dirtyDateLeft, dirtyOptions)\n var startOfWeekRight = startOfWeek(dirtyDateRight, dirtyOptions)\n\n var timestampLeft = startOfWeekLeft.getTime() -\n startOfWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE\n var timestampRight = startOfWeekRight.getTime() -\n startOfWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE\n\n // Round the number of days to the nearest integer\n // because the number of milliseconds in a week is not constant\n // (e.g. it's different in the week of the daylight saving time clock shift)\n return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK)\n}\n\nmodule.exports = differenceInCalendarWeeks\n","var parse = require('../parse/index.js')\n\n/**\n * @category Year Helpers\n * @summary Get the number of calendar years between the given dates.\n *\n * @description\n * Get the number of calendar years between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of calendar years\n *\n * @example\n * // How many calendar years are between 31 December 2013 and 11 February 2015?\n * var result = differenceInCalendarYears(\n * new Date(2015, 1, 11),\n * new Date(2013, 11, 31)\n * )\n * //=> 2\n */\nfunction differenceInCalendarYears (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n\n return dateLeft.getFullYear() - dateRight.getFullYear()\n}\n\nmodule.exports = differenceInCalendarYears\n","var parse = require('../parse/index.js')\nvar differenceInCalendarDays = require('../difference_in_calendar_days/index.js')\nvar compareAsc = require('../compare_asc/index.js')\n\n/**\n * @category Day Helpers\n * @summary Get the number of full days between the given dates.\n *\n * @description\n * Get the number of full days between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of full days\n *\n * @example\n * // How many full days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * var result = differenceInDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 365\n */\nfunction differenceInDays (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n\n var sign = compareAsc(dateLeft, dateRight)\n var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight))\n dateLeft.setDate(dateLeft.getDate() - sign * difference)\n\n // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full\n // If so, result must be decreased by 1 in absolute value\n var isLastDayNotFull = compareAsc(dateLeft, dateRight) === -sign\n return sign * (difference - isLastDayNotFull)\n}\n\nmodule.exports = differenceInDays\n","var differenceInMilliseconds = require('../difference_in_milliseconds/index.js')\n\nvar MILLISECONDS_IN_HOUR = 3600000\n\n/**\n * @category Hour Helpers\n * @summary Get the number of hours between the given dates.\n *\n * @description\n * Get the number of hours between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of hours\n *\n * @example\n * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00?\n * var result = differenceInHours(\n * new Date(2014, 6, 2, 19, 0),\n * new Date(2014, 6, 2, 6, 50)\n * )\n * //=> 12\n */\nfunction differenceInHours (dirtyDateLeft, dirtyDateRight) {\n var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_HOUR\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\nmodule.exports = differenceInHours\n","var parse = require('../parse/index.js')\nvar differenceInCalendarISOYears = require('../difference_in_calendar_iso_years/index.js')\nvar compareAsc = require('../compare_asc/index.js')\nvar subISOYears = require('../sub_iso_years/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the number of full ISO week-numbering years between the given dates.\n *\n * @description\n * Get the number of full ISO week-numbering years between the given dates.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of full ISO week-numbering years\n *\n * @example\n * // How many full ISO week-numbering years are between 1 January 2010 and 1 January 2012?\n * var result = differenceInISOYears(\n * new Date(2012, 0, 1),\n * new Date(2010, 0, 1)\n * )\n * //=> 1\n */\nfunction differenceInISOYears (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n\n var sign = compareAsc(dateLeft, dateRight)\n var difference = Math.abs(differenceInCalendarISOYears(dateLeft, dateRight))\n dateLeft = subISOYears(dateLeft, sign * difference)\n\n // Math.abs(diff in full ISO years - diff in calendar ISO years) === 1\n // if last calendar ISO year is not full\n // If so, result must be decreased by 1 in absolute value\n var isLastISOYearNotFull = compareAsc(dateLeft, dateRight) === -sign\n return sign * (difference - isLastISOYearNotFull)\n}\n\nmodule.exports = differenceInISOYears\n","var parse = require('../parse/index.js')\n\n/**\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of milliseconds\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * var result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\nfunction differenceInMilliseconds (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n return dateLeft.getTime() - dateRight.getTime()\n}\n\nmodule.exports = differenceInMilliseconds\n","var differenceInMilliseconds = require('../difference_in_milliseconds/index.js')\n\nvar MILLISECONDS_IN_MINUTE = 60000\n\n/**\n * @category Minute Helpers\n * @summary Get the number of minutes between the given dates.\n *\n * @description\n * Get the number of minutes between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of minutes\n *\n * @example\n * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00?\n * var result = differenceInMinutes(\n * new Date(2014, 6, 2, 12, 20, 0),\n * new Date(2014, 6, 2, 12, 7, 59)\n * )\n * //=> 12\n */\nfunction differenceInMinutes (dirtyDateLeft, dirtyDateRight) {\n var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_MINUTE\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\nmodule.exports = differenceInMinutes\n","var parse = require('../parse/index.js')\nvar differenceInCalendarMonths = require('../difference_in_calendar_months/index.js')\nvar compareAsc = require('../compare_asc/index.js')\n\n/**\n * @category Month Helpers\n * @summary Get the number of full months between the given dates.\n *\n * @description\n * Get the number of full months between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of full months\n *\n * @example\n * // How many full months are between 31 January 2014 and 1 September 2014?\n * var result = differenceInMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 7\n */\nfunction differenceInMonths (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n\n var sign = compareAsc(dateLeft, dateRight)\n var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight))\n dateLeft.setMonth(dateLeft.getMonth() - sign * difference)\n\n // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full\n // If so, result must be decreased by 1 in absolute value\n var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign\n return sign * (difference - isLastMonthNotFull)\n}\n\nmodule.exports = differenceInMonths\n","var differenceInMonths = require('../difference_in_months/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Get the number of full quarters between the given dates.\n *\n * @description\n * Get the number of full quarters between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of full quarters\n *\n * @example\n * // How many full quarters are between 31 December 2013 and 2 July 2014?\n * var result = differenceInQuarters(\n * new Date(2014, 6, 2),\n * new Date(2013, 11, 31)\n * )\n * //=> 2\n */\nfunction differenceInQuarters (dirtyDateLeft, dirtyDateRight) {\n var diff = differenceInMonths(dirtyDateLeft, dirtyDateRight) / 3\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\nmodule.exports = differenceInQuarters\n","var differenceInMilliseconds = require('../difference_in_milliseconds/index.js')\n\n/**\n * @category Second Helpers\n * @summary Get the number of seconds between the given dates.\n *\n * @description\n * Get the number of seconds between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of seconds\n *\n * @example\n * // How many seconds are between\n * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000?\n * var result = differenceInSeconds(\n * new Date(2014, 6, 2, 12, 30, 20, 0),\n * new Date(2014, 6, 2, 12, 30, 7, 999)\n * )\n * //=> 12\n */\nfunction differenceInSeconds (dirtyDateLeft, dirtyDateRight) {\n var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / 1000\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\nmodule.exports = differenceInSeconds\n","var differenceInDays = require('../difference_in_days/index.js')\n\n/**\n * @category Week Helpers\n * @summary Get the number of full weeks between the given dates.\n *\n * @description\n * Get the number of full weeks between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of full weeks\n *\n * @example\n * // How many full weeks are between 5 July 2014 and 20 July 2014?\n * var result = differenceInWeeks(\n * new Date(2014, 6, 20),\n * new Date(2014, 6, 5)\n * )\n * //=> 2\n */\nfunction differenceInWeeks (dirtyDateLeft, dirtyDateRight) {\n var diff = differenceInDays(dirtyDateLeft, dirtyDateRight) / 7\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff)\n}\n\nmodule.exports = differenceInWeeks\n","var parse = require('../parse/index.js')\nvar differenceInCalendarYears = require('../difference_in_calendar_years/index.js')\nvar compareAsc = require('../compare_asc/index.js')\n\n/**\n * @category Year Helpers\n * @summary Get the number of full years between the given dates.\n *\n * @description\n * Get the number of full years between the given dates.\n *\n * @param {Date|String|Number} dateLeft - the later date\n * @param {Date|String|Number} dateRight - the earlier date\n * @returns {Number} the number of full years\n *\n * @example\n * // How many full years are between 31 December 2013 and 11 February 2015?\n * var result = differenceInYears(\n * new Date(2015, 1, 11),\n * new Date(2013, 11, 31)\n * )\n * //=> 1\n */\nfunction differenceInYears (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n\n var sign = compareAsc(dateLeft, dateRight)\n var difference = Math.abs(differenceInCalendarYears(dateLeft, dateRight))\n dateLeft.setFullYear(dateLeft.getFullYear() - sign * difference)\n\n // Math.abs(diff in full years - diff in calendar years) === 1 if last calendar year is not full\n // If so, result must be decreased by 1 in absolute value\n var isLastYearNotFull = compareAsc(dateLeft, dateRight) === -sign\n return sign * (difference - isLastYearNotFull)\n}\n\nmodule.exports = differenceInYears\n","var compareDesc = require('../compare_desc/index.js')\nvar parse = require('../parse/index.js')\nvar differenceInSeconds = require('../difference_in_seconds/index.js')\nvar differenceInMonths = require('../difference_in_months/index.js')\nvar enLocale = require('../locale/en/index.js')\n\nvar MINUTES_IN_DAY = 1440\nvar MINUTES_IN_ALMOST_TWO_DAYS = 2520\nvar MINUTES_IN_MONTH = 43200\nvar MINUTES_IN_TWO_MONTHS = 86400\n\n/**\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words.\n *\n * | Distance between dates | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance between dates | Result |\n * |------------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * @param {Date|String|Number} dateToCompare - the date to compare with\n * @param {Date|String|Number} date - the other date\n * @param {Object} [options] - the object with options\n * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {Object} [options.locale=enLocale] - the locale object\n * @returns {String} the distance in words\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * var result = distanceInWords(\n * new Date(2014, 6, 2),\n * new Date(2015, 0, 1)\n * )\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00, including seconds?\n * var result = distanceInWords(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0),\n * {includeSeconds: true}\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * var result = distanceInWords(\n * new Date(2016, 0, 1),\n * new Date(2015, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'about 1 year ago'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = distanceInWords(\n * new Date(2016, 7, 1),\n * new Date(2015, 0, 1),\n * {locale: eoLocale}\n * )\n * //=> 'pli ol 1 jaro'\n */\nfunction distanceInWords (dirtyDateToCompare, dirtyDate, dirtyOptions) {\n var options = dirtyOptions || {}\n\n var comparison = compareDesc(dirtyDateToCompare, dirtyDate)\n\n var locale = options.locale\n var localize = enLocale.distanceInWords.localize\n if (locale && locale.distanceInWords && locale.distanceInWords.localize) {\n localize = locale.distanceInWords.localize\n }\n\n var localizeOptions = {\n addSuffix: Boolean(options.addSuffix),\n comparison: comparison\n }\n\n var dateLeft, dateRight\n if (comparison > 0) {\n dateLeft = parse(dirtyDateToCompare)\n dateRight = parse(dirtyDate)\n } else {\n dateLeft = parse(dirtyDate)\n dateRight = parse(dirtyDateToCompare)\n }\n\n var seconds = differenceInSeconds(dateRight, dateLeft)\n var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset()\n var minutes = Math.round(seconds / 60) - offset\n var months\n\n // 0 up to 2 mins\n if (minutes < 2) {\n if (options.includeSeconds) {\n if (seconds < 5) {\n return localize('lessThanXSeconds', 5, localizeOptions)\n } else if (seconds < 10) {\n return localize('lessThanXSeconds', 10, localizeOptions)\n } else if (seconds < 20) {\n return localize('lessThanXSeconds', 20, localizeOptions)\n } else if (seconds < 40) {\n return localize('halfAMinute', null, localizeOptions)\n } else if (seconds < 60) {\n return localize('lessThanXMinutes', 1, localizeOptions)\n } else {\n return localize('xMinutes', 1, localizeOptions)\n }\n } else {\n if (minutes === 0) {\n return localize('lessThanXMinutes', 1, localizeOptions)\n } else {\n return localize('xMinutes', minutes, localizeOptions)\n }\n }\n\n // 2 mins up to 0.75 hrs\n } else if (minutes < 45) {\n return localize('xMinutes', minutes, localizeOptions)\n\n // 0.75 hrs up to 1.5 hrs\n } else if (minutes < 90) {\n return localize('aboutXHours', 1, localizeOptions)\n\n // 1.5 hrs up to 24 hrs\n } else if (minutes < MINUTES_IN_DAY) {\n var hours = Math.round(minutes / 60)\n return localize('aboutXHours', hours, localizeOptions)\n\n // 1 day up to 1.75 days\n } else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) {\n return localize('xDays', 1, localizeOptions)\n\n // 1.75 days up to 30 days\n } else if (minutes < MINUTES_IN_MONTH) {\n var days = Math.round(minutes / MINUTES_IN_DAY)\n return localize('xDays', days, localizeOptions)\n\n // 1 month up to 2 months\n } else if (minutes < MINUTES_IN_TWO_MONTHS) {\n months = Math.round(minutes / MINUTES_IN_MONTH)\n return localize('aboutXMonths', months, localizeOptions)\n }\n\n months = differenceInMonths(dateRight, dateLeft)\n\n // 2 months up to 12 months\n if (months < 12) {\n var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH)\n return localize('xMonths', nearestMonth, localizeOptions)\n\n // 1 year up to max Date\n } else {\n var monthsSinceStartOfYear = months % 12\n var years = Math.floor(months / 12)\n\n // N years up to 1 years 3 months\n if (monthsSinceStartOfYear < 3) {\n return localize('aboutXYears', years, localizeOptions)\n\n // N years 3 months up to N years 9 months\n } else if (monthsSinceStartOfYear < 9) {\n return localize('overXYears', years, localizeOptions)\n\n // N years 9 months up to N year 12 months\n } else {\n return localize('almostXYears', years + 1, localizeOptions)\n }\n }\n}\n\nmodule.exports = distanceInWords\n","var compareDesc = require('../compare_desc/index.js')\nvar parse = require('../parse/index.js')\nvar differenceInSeconds = require('../difference_in_seconds/index.js')\nvar enLocale = require('../locale/en/index.js')\n\nvar MINUTES_IN_DAY = 1440\nvar MINUTES_IN_MONTH = 43200\nvar MINUTES_IN_YEAR = 525600\n\n/**\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `distanceInWords`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * @param {Date|String|Number} dateToCompare - the date to compare with\n * @param {Date|String|Number} date - the other date\n * @param {Object} [options] - the object with options\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'s'|'m'|'h'|'d'|'M'|'Y'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.partialMethod='floor'] - which way to round partial units\n * @param {Object} [options.locale=enLocale] - the locale object\n * @returns {String} the distance in words\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * var result = distanceInWordsStrict(\n * new Date(2014, 6, 2),\n * new Date(2015, 0, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00?\n * var result = distanceInWordsStrict(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0),\n * )\n * //=> '15 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * var result = distanceInWordsStrict(\n * new Date(2016, 0, 1),\n * new Date(2015, 0, 1),\n * {addSuffix: true}\n * )\n * //=> '1 year ago'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, in minutes?\n * var result = distanceInWordsStrict(\n * new Date(2016, 0, 1),\n * new Date(2015, 0, 1),\n * {unit: 'm'}\n * )\n * //=> '525600 minutes'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 28 January 2015, in months, rounded up?\n * var result = distanceInWordsStrict(\n * new Date(2015, 0, 28),\n * new Date(2015, 0, 1),\n * {unit: 'M', partialMethod: 'ceil'}\n * )\n * //=> '1 month'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = distanceInWordsStrict(\n * new Date(2016, 7, 1),\n * new Date(2015, 0, 1),\n * {locale: eoLocale}\n * )\n * //=> '1 jaro'\n */\nfunction distanceInWordsStrict (dirtyDateToCompare, dirtyDate, dirtyOptions) {\n var options = dirtyOptions || {}\n\n var comparison = compareDesc(dirtyDateToCompare, dirtyDate)\n\n var locale = options.locale\n var localize = enLocale.distanceInWords.localize\n if (locale && locale.distanceInWords && locale.distanceInWords.localize) {\n localize = locale.distanceInWords.localize\n }\n\n var localizeOptions = {\n addSuffix: Boolean(options.addSuffix),\n comparison: comparison\n }\n\n var dateLeft, dateRight\n if (comparison > 0) {\n dateLeft = parse(dirtyDateToCompare)\n dateRight = parse(dirtyDate)\n } else {\n dateLeft = parse(dirtyDate)\n dateRight = parse(dirtyDateToCompare)\n }\n\n var unit\n var mathPartial = Math[options.partialMethod ? String(options.partialMethod) : 'floor']\n var seconds = differenceInSeconds(dateRight, dateLeft)\n var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset()\n var minutes = mathPartial(seconds / 60) - offset\n var hours, days, months, years\n\n if (options.unit) {\n unit = String(options.unit)\n } else {\n if (minutes < 1) {\n unit = 's'\n } else if (minutes < 60) {\n unit = 'm'\n } else if (minutes < MINUTES_IN_DAY) {\n unit = 'h'\n } else if (minutes < MINUTES_IN_MONTH) {\n unit = 'd'\n } else if (minutes < MINUTES_IN_YEAR) {\n unit = 'M'\n } else {\n unit = 'Y'\n }\n }\n\n // 0 up to 60 seconds\n if (unit === 's') {\n return localize('xSeconds', seconds, localizeOptions)\n\n // 1 up to 60 mins\n } else if (unit === 'm') {\n return localize('xMinutes', minutes, localizeOptions)\n\n // 1 up to 24 hours\n } else if (unit === 'h') {\n hours = mathPartial(minutes / 60)\n return localize('xHours', hours, localizeOptions)\n\n // 1 up to 30 days\n } else if (unit === 'd') {\n days = mathPartial(minutes / MINUTES_IN_DAY)\n return localize('xDays', days, localizeOptions)\n\n // 1 up to 12 months\n } else if (unit === 'M') {\n months = mathPartial(minutes / MINUTES_IN_MONTH)\n return localize('xMonths', months, localizeOptions)\n\n // 1 year up to max Date\n } else if (unit === 'Y') {\n years = mathPartial(minutes / MINUTES_IN_YEAR)\n return localize('xYears', years, localizeOptions)\n }\n\n throw new Error('Unknown unit: ' + unit)\n}\n\nmodule.exports = distanceInWordsStrict\n","var distanceInWords = require('../distance_in_words/index.js')\n\n/**\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n *\n * @description\n * Return the distance between the given date and now in words.\n *\n * | Distance to now | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance to now | Result |\n * |---------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * @param {Date|String|Number} date - the given date\n * @param {Object} [options] - the object with options\n * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed\n * @param {Boolean} [options.addSuffix=false] - result specifies if the second date is earlier or later than the first\n * @param {Object} [options.locale=enLocale] - the locale object\n * @returns {String} the distance in words\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * var result = distanceInWordsToNow(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * var result = distanceInWordsToNow(\n * new Date(2015, 0, 1, 0, 0, 15),\n * {includeSeconds: true}\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * var result = distanceInWordsToNow(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in about 1 year'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = distanceInWordsToNow(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> 'pli ol 1 jaro'\n */\nfunction distanceInWordsToNow (dirtyDate, dirtyOptions) {\n return distanceInWords(Date.now(), dirtyDate, dirtyOptions)\n}\n\nmodule.exports = distanceInWordsToNow\n","var parse = require('../parse/index.js')\n\n/**\n * @category Day Helpers\n * @summary Return the array of dates within the specified range.\n *\n * @description\n * Return the array of dates within the specified range.\n *\n * @param {Date|String|Number} startDate - the first date\n * @param {Date|String|Number} endDate - the last date\n * @param {Number} [step=1] - the step between each day\n * @returns {Date[]} the array with starts of days from the day of startDate to the day of endDate\n * @throws {Error} startDate cannot be after endDate\n *\n * @example\n * // Each day between 6 October 2014 and 10 October 2014:\n * var result = eachDay(\n * new Date(2014, 9, 6),\n * new Date(2014, 9, 10)\n * )\n * //=> [\n * // Mon Oct 06 2014 00:00:00,\n * // Tue Oct 07 2014 00:00:00,\n * // Wed Oct 08 2014 00:00:00,\n * // Thu Oct 09 2014 00:00:00,\n * // Fri Oct 10 2014 00:00:00\n * // ]\n */\nfunction eachDay (dirtyStartDate, dirtyEndDate, dirtyStep) {\n var startDate = parse(dirtyStartDate)\n var endDate = parse(dirtyEndDate)\n var step = dirtyStep !== undefined ? dirtyStep : 1\n\n var endTime = endDate.getTime()\n\n if (startDate.getTime() > endTime) {\n throw new Error('The first date cannot be after the second date')\n }\n\n var dates = []\n\n var currentDate = startDate\n currentDate.setHours(0, 0, 0, 0)\n\n while (currentDate.getTime() <= endTime) {\n dates.push(parse(currentDate))\n currentDate.setDate(currentDate.getDate() + step)\n }\n\n return dates\n}\n\nmodule.exports = eachDay\n","var parse = require('../parse/index.js')\n\n/**\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * var result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nfunction endOfDay (dirtyDate) {\n var date = parse(dirtyDate)\n date.setHours(23, 59, 59, 999)\n return date\n}\n\nmodule.exports = endOfDay\n","var parse = require('../parse/index.js')\n\n/**\n * @category Hour Helpers\n * @summary Return the end of an hour for the given date.\n *\n * @description\n * Return the end of an hour for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of an hour\n *\n * @example\n * // The end of an hour for 2 September 2014 11:55:00:\n * var result = endOfHour(new Date(2014, 8, 2, 11, 55))\n * //=> Tue Sep 02 2014 11:59:59.999\n */\nfunction endOfHour (dirtyDate) {\n var date = parse(dirtyDate)\n date.setMinutes(59, 59, 999)\n return date\n}\n\nmodule.exports = endOfHour\n","var endOfWeek = require('../end_of_week/index.js')\n\n/**\n * @category ISO Week Helpers\n * @summary Return the end of an ISO week for the given date.\n *\n * @description\n * Return the end of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of an ISO week\n *\n * @example\n * // The end of an ISO week for 2 September 2014 11:55:00:\n * var result = endOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nfunction endOfISOWeek (dirtyDate) {\n return endOfWeek(dirtyDate, {weekStartsOn: 1})\n}\n\nmodule.exports = endOfISOWeek\n","var getISOYear = require('../get_iso_year/index.js')\nvar startOfISOWeek = require('../start_of_iso_week/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the end of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the end of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of an ISO week-numbering year\n *\n * @example\n * // The end of an ISO week-numbering year for 2 July 2005:\n * var result = endOfISOYear(new Date(2005, 6, 2))\n * //=> Sun Jan 01 2006 23:59:59.999\n */\nfunction endOfISOYear (dirtyDate) {\n var year = getISOYear(dirtyDate)\n var fourthOfJanuaryOfNextYear = new Date(0)\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4)\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0)\n var date = startOfISOWeek(fourthOfJanuaryOfNextYear)\n date.setMilliseconds(date.getMilliseconds() - 1)\n return date\n}\n\nmodule.exports = endOfISOYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Minute Helpers\n * @summary Return the end of a minute for the given date.\n *\n * @description\n * Return the end of a minute for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of a minute\n *\n * @example\n * // The end of a minute for 1 December 2014 22:15:45.400:\n * var result = endOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400))\n * //=> Mon Dec 01 2014 22:15:59.999\n */\nfunction endOfMinute (dirtyDate) {\n var date = parse(dirtyDate)\n date.setSeconds(59, 999)\n return date\n}\n\nmodule.exports = endOfMinute\n","var parse = require('../parse/index.js')\n\n/**\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * var result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nfunction endOfMonth (dirtyDate) {\n var date = parse(dirtyDate)\n var month = date.getMonth()\n date.setFullYear(date.getFullYear(), month + 1, 0)\n date.setHours(23, 59, 59, 999)\n return date\n}\n\nmodule.exports = endOfMonth\n","var parse = require('../parse/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Return the end of a year quarter for the given date.\n *\n * @description\n * Return the end of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of a quarter\n *\n * @example\n * // The end of a quarter for 2 September 2014 11:55:00:\n * var result = endOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nfunction endOfQuarter (dirtyDate) {\n var date = parse(dirtyDate)\n var currentMonth = date.getMonth()\n var month = currentMonth - currentMonth % 3 + 3\n date.setMonth(month, 0)\n date.setHours(23, 59, 59, 999)\n return date\n}\n\nmodule.exports = endOfQuarter\n","var parse = require('../parse/index.js')\n\n/**\n * @category Second Helpers\n * @summary Return the end of a second for the given date.\n *\n * @description\n * Return the end of a second for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of a second\n *\n * @example\n * // The end of a second for 1 December 2014 22:15:45.400:\n * var result = endOfSecond(new Date(2014, 11, 1, 22, 15, 45, 400))\n * //=> Mon Dec 01 2014 22:15:45.999\n */\nfunction endOfSecond (dirtyDate) {\n var date = parse(dirtyDate)\n date.setMilliseconds(999)\n return date\n}\n\nmodule.exports = endOfSecond\n","var endOfDay = require('../end_of_day/index.js')\n\n/**\n * @category Day Helpers\n * @summary Return the end of today.\n *\n * @description\n * Return the end of today.\n *\n * @returns {Date} the end of today\n *\n * @example\n * // If today is 6 October 2014:\n * var result = endOfToday()\n * //=> Mon Oct 6 2014 23:59:59.999\n */\nfunction endOfToday () {\n return endOfDay(new Date())\n}\n\nmodule.exports = endOfToday\n","/**\n * @category Day Helpers\n * @summary Return the end of tomorrow.\n *\n * @description\n * Return the end of tomorrow.\n *\n * @returns {Date} the end of tomorrow\n *\n * @example\n * // If today is 6 October 2014:\n * var result = endOfTomorrow()\n * //=> Tue Oct 7 2014 23:59:59.999\n */\nfunction endOfTomorrow () {\n var now = new Date()\n var year = now.getFullYear()\n var month = now.getMonth()\n var day = now.getDate()\n\n var date = new Date(0)\n date.setFullYear(year, month, day + 1)\n date.setHours(23, 59, 59, 999)\n return date\n}\n\nmodule.exports = endOfTomorrow\n","var parse = require('../parse/index.js')\n\n/**\n * @category Week Helpers\n * @summary Return the end of a week for the given date.\n *\n * @description\n * Return the end of a week for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @param {Object} [options] - the object with options\n * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @returns {Date} the end of a week\n *\n * @example\n * // The end of a week for 2 September 2014 11:55:00:\n * var result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sat Sep 06 2014 23:59:59.999\n *\n * @example\n * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00:\n * var result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1})\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nfunction endOfWeek (dirtyDate, dirtyOptions) {\n var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0\n\n var date = parse(dirtyDate)\n var day = date.getDay()\n var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn)\n\n date.setDate(date.getDate() + diff)\n date.setHours(23, 59, 59, 999)\n return date\n}\n\nmodule.exports = endOfWeek\n","var parse = require('../parse/index.js')\n\n/**\n * @category Year Helpers\n * @summary Return the end of a year for the given date.\n *\n * @description\n * Return the end of a year for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of a year\n *\n * @example\n * // The end of a year for 2 September 2014 11:55:00:\n * var result = endOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Dec 31 2014 23:59:59.999\n */\nfunction endOfYear (dirtyDate) {\n var date = parse(dirtyDate)\n var year = date.getFullYear()\n date.setFullYear(year + 1, 0, 0)\n date.setHours(23, 59, 59, 999)\n return date\n}\n\nmodule.exports = endOfYear\n","/**\n * @category Day Helpers\n * @summary Return the end of yesterday.\n *\n * @description\n * Return the end of yesterday.\n *\n * @returns {Date} the end of yesterday\n *\n * @example\n * // If today is 6 October 2014:\n * var result = endOfYesterday()\n * //=> Sun Oct 5 2014 23:59:59.999\n */\nfunction endOfYesterday () {\n var now = new Date()\n var year = now.getFullYear()\n var month = now.getMonth()\n var day = now.getDate()\n\n var date = new Date(0)\n date.setFullYear(year, month, day - 1)\n date.setHours(23, 59, 59, 999)\n return date\n}\n\nmodule.exports = endOfYesterday\n","var getDayOfYear = require('../get_day_of_year/index.js')\nvar getISOWeek = require('../get_iso_week/index.js')\nvar getISOYear = require('../get_iso_year/index.js')\nvar parse = require('../parse/index.js')\nvar isValid = require('../is_valid/index.js')\nvar enLocale = require('../locale/en/index.js')\n\n/**\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format.\n *\n * Accepted tokens:\n * | Unit | Token | Result examples |\n * |-------------------------|-------|----------------------------------|\n * | Month | M | 1, 2, ..., 12 |\n * | | Mo | 1st, 2nd, ..., 12th |\n * | | MM | 01, 02, ..., 12 |\n * | | MMM | Jan, Feb, ..., Dec |\n * | | MMMM | January, February, ..., December |\n * | Quarter | Q | 1, 2, 3, 4 |\n * | | Qo | 1st, 2nd, 3rd, 4th |\n * | Day of month | D | 1, 2, ..., 31 |\n * | | Do | 1st, 2nd, ..., 31st |\n * | | DD | 01, 02, ..., 31 |\n * | Day of year | DDD | 1, 2, ..., 366 |\n * | | DDDo | 1st, 2nd, ..., 366th |\n * | | DDDD | 001, 002, ..., 366 |\n * | Day of week | d | 0, 1, ..., 6 |\n * | | do | 0th, 1st, ..., 6th |\n * | | dd | Su, Mo, ..., Sa |\n * | | ddd | Sun, Mon, ..., Sat |\n * | | dddd | Sunday, Monday, ..., Saturday |\n * | Day of ISO week | E | 1, 2, ..., 7 |\n * | ISO week | W | 1, 2, ..., 53 |\n * | | Wo | 1st, 2nd, ..., 53rd |\n * | | WW | 01, 02, ..., 53 |\n * | Year | YY | 00, 01, ..., 99 |\n * | | YYYY | 1900, 1901, ..., 2099 |\n * | ISO week-numbering year | GG | 00, 01, ..., 99 |\n * | | GGGG | 1900, 1901, ..., 2099 |\n * | AM/PM | A | AM, PM |\n * | | a | am, pm |\n * | | aa | a.m., p.m. |\n * | Hour | H | 0, 1, ... 23 |\n * | | HH | 00, 01, ... 23 |\n * | | h | 1, 2, ..., 12 |\n * | | hh | 01, 02, ..., 12 |\n * | Minute | m | 0, 1, ..., 59 |\n * | | mm | 00, 01, ..., 59 |\n * | Second | s | 0, 1, ..., 59 |\n * | | ss | 00, 01, ..., 59 |\n * | 1/10 of second | S | 0, 1, ..., 9 |\n * | 1/100 of second | SS | 00, 01, ..., 99 |\n * | Millisecond | SSS | 000, 001, ..., 999 |\n * | Timezone | Z | -01:00, +00:00, ... +12:00 |\n * | | ZZ | -0100, +0000, ..., +1200 |\n * | Seconds timestamp | X | 512969520 |\n * | Milliseconds timestamp | x | 512969520900 |\n *\n * The characters wrapped in square brackets are escaped.\n *\n * The result may vary by locale.\n *\n * @param {Date|String|Number} date - the original date\n * @param {String} [format='YYYY-MM-DDTHH:mm:ss.SSSZ'] - the string of tokens\n * @param {Object} [options] - the object with options\n * @param {Object} [options.locale=enLocale] - the locale object\n * @returns {String} the formatted date string\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * var result = format(\n * new Date(2014, 1, 11),\n * 'MM/DD/YYYY'\n * )\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * var eoLocale = require('date-fns/locale/eo')\n * var result = format(\n * new Date(2014, 6, 2),\n * 'Do [de] MMMM YYYY',\n * {locale: eoLocale}\n * )\n * //=> '2-a de julio 2014'\n */\nfunction format (dirtyDate, dirtyFormatStr, dirtyOptions) {\n var formatStr = dirtyFormatStr ? String(dirtyFormatStr) : 'YYYY-MM-DDTHH:mm:ss.SSSZ'\n var options = dirtyOptions || {}\n\n var locale = options.locale\n var localeFormatters = enLocale.format.formatters\n var formattingTokensRegExp = enLocale.format.formattingTokensRegExp\n if (locale && locale.format && locale.format.formatters) {\n localeFormatters = locale.format.formatters\n\n if (locale.format.formattingTokensRegExp) {\n formattingTokensRegExp = locale.format.formattingTokensRegExp\n }\n }\n\n var date = parse(dirtyDate)\n\n if (!isValid(date)) {\n return 'Invalid Date'\n }\n\n var formatFn = buildFormatFn(formatStr, localeFormatters, formattingTokensRegExp)\n\n return formatFn(date)\n}\n\nvar formatters = {\n // Month: 1, 2, ..., 12\n 'M': function (date) {\n return date.getMonth() + 1\n },\n\n // Month: 01, 02, ..., 12\n 'MM': function (date) {\n return addLeadingZeros(date.getMonth() + 1, 2)\n },\n\n // Quarter: 1, 2, 3, 4\n 'Q': function (date) {\n return Math.ceil((date.getMonth() + 1) / 3)\n },\n\n // Day of month: 1, 2, ..., 31\n 'D': function (date) {\n return date.getDate()\n },\n\n // Day of month: 01, 02, ..., 31\n 'DD': function (date) {\n return addLeadingZeros(date.getDate(), 2)\n },\n\n // Day of year: 1, 2, ..., 366\n 'DDD': function (date) {\n return getDayOfYear(date)\n },\n\n // Day of year: 001, 002, ..., 366\n 'DDDD': function (date) {\n return addLeadingZeros(getDayOfYear(date), 3)\n },\n\n // Day of week: 0, 1, ..., 6\n 'd': function (date) {\n return date.getDay()\n },\n\n // Day of ISO week: 1, 2, ..., 7\n 'E': function (date) {\n return date.getDay() || 7\n },\n\n // ISO week: 1, 2, ..., 53\n 'W': function (date) {\n return getISOWeek(date)\n },\n\n // ISO week: 01, 02, ..., 53\n 'WW': function (date) {\n return addLeadingZeros(getISOWeek(date), 2)\n },\n\n // Year: 00, 01, ..., 99\n 'YY': function (date) {\n return addLeadingZeros(date.getFullYear(), 4).substr(2)\n },\n\n // Year: 1900, 1901, ..., 2099\n 'YYYY': function (date) {\n return addLeadingZeros(date.getFullYear(), 4)\n },\n\n // ISO week-numbering year: 00, 01, ..., 99\n 'GG': function (date) {\n return String(getISOYear(date)).substr(2)\n },\n\n // ISO week-numbering year: 1900, 1901, ..., 2099\n 'GGGG': function (date) {\n return getISOYear(date)\n },\n\n // Hour: 0, 1, ... 23\n 'H': function (date) {\n return date.getHours()\n },\n\n // Hour: 00, 01, ..., 23\n 'HH': function (date) {\n return addLeadingZeros(date.getHours(), 2)\n },\n\n // Hour: 1, 2, ..., 12\n 'h': function (date) {\n var hours = date.getHours()\n if (hours === 0) {\n return 12\n } else if (hours > 12) {\n return hours % 12\n } else {\n return hours\n }\n },\n\n // Hour: 01, 02, ..., 12\n 'hh': function (date) {\n return addLeadingZeros(formatters['h'](date), 2)\n },\n\n // Minute: 0, 1, ..., 59\n 'm': function (date) {\n return date.getMinutes()\n },\n\n // Minute: 00, 01, ..., 59\n 'mm': function (date) {\n return addLeadingZeros(date.getMinutes(), 2)\n },\n\n // Second: 0, 1, ..., 59\n 's': function (date) {\n return date.getSeconds()\n },\n\n // Second: 00, 01, ..., 59\n 'ss': function (date) {\n return addLeadingZeros(date.getSeconds(), 2)\n },\n\n // 1/10 of second: 0, 1, ..., 9\n 'S': function (date) {\n return Math.floor(date.getMilliseconds() / 100)\n },\n\n // 1/100 of second: 00, 01, ..., 99\n 'SS': function (date) {\n return addLeadingZeros(Math.floor(date.getMilliseconds() / 10), 2)\n },\n\n // Millisecond: 000, 001, ..., 999\n 'SSS': function (date) {\n return addLeadingZeros(date.getMilliseconds(), 3)\n },\n\n // Timezone: -01:00, +00:00, ... +12:00\n 'Z': function (date) {\n return formatTimezone(date.getTimezoneOffset(), ':')\n },\n\n // Timezone: -0100, +0000, ... +1200\n 'ZZ': function (date) {\n return formatTimezone(date.getTimezoneOffset())\n },\n\n // Seconds timestamp: 512969520\n 'X': function (date) {\n return Math.floor(date.getTime() / 1000)\n },\n\n // Milliseconds timestamp: 512969520900\n 'x': function (date) {\n return date.getTime()\n }\n}\n\nfunction buildFormatFn (formatStr, localeFormatters, formattingTokensRegExp) {\n var array = formatStr.match(formattingTokensRegExp)\n var length = array.length\n\n var i\n var formatter\n for (i = 0; i < length; i++) {\n formatter = localeFormatters[array[i]] || formatters[array[i]]\n if (formatter) {\n array[i] = formatter\n } else {\n array[i] = removeFormattingTokens(array[i])\n }\n }\n\n return function (date) {\n var output = ''\n for (var i = 0; i < length; i++) {\n if (array[i] instanceof Function) {\n output += array[i](date, formatters)\n } else {\n output += array[i]\n }\n }\n return output\n }\n}\n\nfunction removeFormattingTokens (input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|]$/g, '')\n }\n return input.replace(/\\\\/g, '')\n}\n\nfunction formatTimezone (offset, delimeter) {\n delimeter = delimeter || ''\n var sign = offset > 0 ? '-' : '+'\n var absOffset = Math.abs(offset)\n var hours = Math.floor(absOffset / 60)\n var minutes = absOffset % 60\n return sign + addLeadingZeros(hours, 2) + delimeter + addLeadingZeros(minutes, 2)\n}\n\nfunction addLeadingZeros (number, targetLength) {\n var output = Math.abs(number).toString()\n while (output.length < targetLength) {\n output = '0' + output\n }\n return output\n}\n\nmodule.exports = format\n","var parse = require('../parse/index.js')\n\n/**\n * @category Day Helpers\n * @summary Get the day of the month of the given date.\n *\n * @description\n * Get the day of the month of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the day of month\n *\n * @example\n * // Which day of the month is 29 February 2012?\n * var result = getDate(new Date(2012, 1, 29))\n * //=> 29\n */\nfunction getDate (dirtyDate) {\n var date = parse(dirtyDate)\n var dayOfMonth = date.getDate()\n return dayOfMonth\n}\n\nmodule.exports = getDate\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Get the day of the week of the given date.\n *\n * @description\n * Get the day of the week of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the day of week\n *\n * @example\n * // Which day of the week is 29 February 2012?\n * var result = getDay(new Date(2012, 1, 29))\n * //=> 3\n */\nfunction getDay (dirtyDate) {\n var date = parse(dirtyDate)\n var day = date.getDay()\n return day\n}\n\nmodule.exports = getDay\n","var parse = require('../parse/index.js')\nvar startOfYear = require('../start_of_year/index.js')\nvar differenceInCalendarDays = require('../difference_in_calendar_days/index.js')\n\n/**\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * var result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nfunction getDayOfYear (dirtyDate) {\n var date = parse(dirtyDate)\n var diff = differenceInCalendarDays(date, startOfYear(date))\n var dayOfYear = diff + 1\n return dayOfYear\n}\n\nmodule.exports = getDayOfYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Month Helpers\n * @summary Get the number of days in a month of the given date.\n *\n * @description\n * Get the number of days in a month of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the number of days in a month\n *\n * @example\n * // How many days are in February 2000?\n * var result = getDaysInMonth(new Date(2000, 1))\n * //=> 29\n */\nfunction getDaysInMonth (dirtyDate) {\n var date = parse(dirtyDate)\n var year = date.getFullYear()\n var monthIndex = date.getMonth()\n var lastDayOfMonth = new Date(0)\n lastDayOfMonth.setFullYear(year, monthIndex + 1, 0)\n lastDayOfMonth.setHours(0, 0, 0, 0)\n return lastDayOfMonth.getDate()\n}\n\nmodule.exports = getDaysInMonth\n","var isLeapYear = require('../is_leap_year/index.js')\n\n/**\n * @category Year Helpers\n * @summary Get the number of days in a year of the given date.\n *\n * @description\n * Get the number of days in a year of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the number of days in a year\n *\n * @example\n * // How many days are in 2012?\n * var result = getDaysInYear(new Date(2012, 0, 1))\n * //=> 366\n */\nfunction getDaysInYear (dirtyDate) {\n return isLeapYear(dirtyDate) ? 366 : 365\n}\n\nmodule.exports = getDaysInYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Hour Helpers\n * @summary Get the hours of the given date.\n *\n * @description\n * Get the hours of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the hours\n *\n * @example\n * // Get the hours of 29 February 2012 11:45:00:\n * var result = getHours(new Date(2012, 1, 29, 11, 45))\n * //=> 11\n */\nfunction getHours (dirtyDate) {\n var date = parse(dirtyDate)\n var hours = date.getHours()\n return hours\n}\n\nmodule.exports = getHours\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Get the day of the ISO week of the given date.\n *\n * @description\n * Get the day of the ISO week of the given date,\n * which is 7 for Sunday, 1 for Monday etc.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the day of ISO week\n *\n * @example\n * // Which day of the ISO week is 26 February 2012?\n * var result = getISODay(new Date(2012, 1, 26))\n * //=> 7\n */\nfunction getISODay (dirtyDate) {\n var date = parse(dirtyDate)\n var day = date.getDay()\n\n if (day === 0) {\n day = 7\n }\n\n return day\n}\n\nmodule.exports = getISODay\n","var parse = require('../parse/index.js')\nvar startOfISOWeek = require('../start_of_iso_week/index.js')\nvar startOfISOYear = require('../start_of_iso_year/index.js')\n\nvar MILLISECONDS_IN_WEEK = 604800000\n\n/**\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * var result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nfunction getISOWeek (dirtyDate) {\n var date = parse(dirtyDate)\n var diff = startOfISOWeek(date).getTime() - startOfISOYear(date).getTime()\n\n // Round the number of days to the nearest integer\n // because the number of milliseconds in a week is not constant\n // (e.g. it's different in the week of the daylight saving time clock shift)\n return Math.round(diff / MILLISECONDS_IN_WEEK) + 1\n}\n\nmodule.exports = getISOWeek\n","var startOfISOYear = require('../start_of_iso_year/index.js')\nvar addWeeks = require('../add_weeks/index.js')\n\nvar MILLISECONDS_IN_WEEK = 604800000\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the number of weeks in an ISO week-numbering year of the given date.\n *\n * @description\n * Get the number of weeks in an ISO week-numbering year of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the number of ISO weeks in a year\n *\n * @example\n * // How many weeks are in ISO week-numbering year 2015?\n * var result = getISOWeeksInYear(new Date(2015, 1, 11))\n * //=> 53\n */\nfunction getISOWeeksInYear (dirtyDate) {\n var thisYear = startOfISOYear(dirtyDate)\n var nextYear = startOfISOYear(addWeeks(thisYear, 60))\n var diff = nextYear.valueOf() - thisYear.valueOf()\n // Round the number of weeks to the nearest integer\n // because the number of milliseconds in a week is not constant\n // (e.g. it's different in the week of the daylight saving time clock shift)\n return Math.round(diff / MILLISECONDS_IN_WEEK)\n}\n\nmodule.exports = getISOWeeksInYear\n","var parse = require('../parse/index.js')\nvar startOfISOWeek = require('../start_of_iso_week/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * var result = getISOYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nfunction getISOYear (dirtyDate) {\n var date = parse(dirtyDate)\n var year = date.getFullYear()\n\n var fourthOfJanuaryOfNextYear = new Date(0)\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4)\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0)\n var startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear)\n\n var fourthOfJanuaryOfThisYear = new Date(0)\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4)\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0)\n var startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear)\n\n if (date.getTime() >= startOfNextYear.getTime()) {\n return year + 1\n } else if (date.getTime() >= startOfThisYear.getTime()) {\n return year\n } else {\n return year - 1\n }\n}\n\nmodule.exports = getISOYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Millisecond Helpers\n * @summary Get the milliseconds of the given date.\n *\n * @description\n * Get the milliseconds of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the milliseconds\n *\n * @example\n * // Get the milliseconds of 29 February 2012 11:45:05.123:\n * var result = getMilliseconds(new Date(2012, 1, 29, 11, 45, 5, 123))\n * //=> 123\n */\nfunction getMilliseconds (dirtyDate) {\n var date = parse(dirtyDate)\n var milliseconds = date.getMilliseconds()\n return milliseconds\n}\n\nmodule.exports = getMilliseconds\n","var parse = require('../parse/index.js')\n\n/**\n * @category Minute Helpers\n * @summary Get the minutes of the given date.\n *\n * @description\n * Get the minutes of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the minutes\n *\n * @example\n * // Get the minutes of 29 February 2012 11:45:05:\n * var result = getMinutes(new Date(2012, 1, 29, 11, 45, 5))\n * //=> 45\n */\nfunction getMinutes (dirtyDate) {\n var date = parse(dirtyDate)\n var minutes = date.getMinutes()\n return minutes\n}\n\nmodule.exports = getMinutes\n","var parse = require('../parse/index.js')\n\n/**\n * @category Month Helpers\n * @summary Get the month of the given date.\n *\n * @description\n * Get the month of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the month\n *\n * @example\n * // Which month is 29 February 2012?\n * var result = getMonth(new Date(2012, 1, 29))\n * //=> 1\n */\nfunction getMonth (dirtyDate) {\n var date = parse(dirtyDate)\n var month = date.getMonth()\n return month\n}\n\nmodule.exports = getMonth\n","var parse = require('../parse/index.js')\n\nvar MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000\n\n/**\n * @category Range Helpers\n * @summary Get the number of days that overlap in two date ranges\n *\n * @description\n * Get the number of days that overlap in two date ranges\n *\n * @param {Date|String|Number} initialRangeStartDate - the start of the initial range\n * @param {Date|String|Number} initialRangeEndDate - the end of the initial range\n * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with\n * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with\n * @returns {Number} the number of days that overlap in two date ranges\n * @throws {Error} startDate of a date range cannot be after its endDate\n *\n * @example\n * // For overlapping date ranges adds 1 for each started overlapping day:\n * getOverlappingDaysInRanges(\n * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21)\n * )\n * //=> 3\n *\n * @example\n * // For non-overlapping date ranges returns 0:\n * getOverlappingDaysInRanges(\n * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22)\n * )\n * //=> 0\n */\nfunction getOverlappingDaysInRanges (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) {\n var initialStartTime = parse(dirtyInitialRangeStartDate).getTime()\n var initialEndTime = parse(dirtyInitialRangeEndDate).getTime()\n var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime()\n var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime()\n\n if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) {\n throw new Error('The start of the range cannot be after the end of the range')\n }\n\n var isOverlapping = initialStartTime < comparedEndTime && comparedStartTime < initialEndTime\n\n if (!isOverlapping) {\n return 0\n }\n\n var overlapStartDate = comparedStartTime < initialStartTime\n ? initialStartTime\n : comparedStartTime\n\n var overlapEndDate = comparedEndTime > initialEndTime\n ? initialEndTime\n : comparedEndTime\n\n var differenceInMs = overlapEndDate - overlapStartDate\n\n return Math.ceil(differenceInMs / MILLISECONDS_IN_DAY)\n}\n\nmodule.exports = getOverlappingDaysInRanges\n","var parse = require('../parse/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Get the year quarter of the given date.\n *\n * @description\n * Get the year quarter of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the quarter\n *\n * @example\n * // Which quarter is 2 July 2014?\n * var result = getQuarter(new Date(2014, 6, 2))\n * //=> 3\n */\nfunction getQuarter (dirtyDate) {\n var date = parse(dirtyDate)\n var quarter = Math.floor(date.getMonth() / 3) + 1\n return quarter\n}\n\nmodule.exports = getQuarter\n","var parse = require('../parse/index.js')\n\n/**\n * @category Second Helpers\n * @summary Get the seconds of the given date.\n *\n * @description\n * Get the seconds of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the seconds\n *\n * @example\n * // Get the seconds of 29 February 2012 11:45:05.123:\n * var result = getSeconds(new Date(2012, 1, 29, 11, 45, 5, 123))\n * //=> 5\n */\nfunction getSeconds (dirtyDate) {\n var date = parse(dirtyDate)\n var seconds = date.getSeconds()\n return seconds\n}\n\nmodule.exports = getSeconds\n","var parse = require('../parse/index.js')\n\n/**\n * @category Timestamp Helpers\n * @summary Get the milliseconds timestamp of the given date.\n *\n * @description\n * Get the milliseconds timestamp of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the timestamp\n *\n * @example\n * // Get the timestamp of 29 February 2012 11:45:05.123:\n * var result = getTime(new Date(2012, 1, 29, 11, 45, 5, 123))\n * //=> 1330515905123\n */\nfunction getTime (dirtyDate) {\n var date = parse(dirtyDate)\n var timestamp = date.getTime()\n return timestamp\n}\n\nmodule.exports = getTime\n","var parse = require('../parse/index.js')\n\n/**\n * @category Year Helpers\n * @summary Get the year of the given date.\n *\n * @description\n * Get the year of the given date.\n *\n * @param {Date|String|Number} date - the given date\n * @returns {Number} the year\n *\n * @example\n * // Which year is 2 July 2014?\n * var result = getYear(new Date(2014, 6, 2))\n * //=> 2014\n */\nfunction getYear (dirtyDate) {\n var date = parse(dirtyDate)\n var year = date.getFullYear()\n return year\n}\n\nmodule.exports = getYear\n","module.exports = {\n addDays: require('./add_days/index.js'),\n addHours: require('./add_hours/index.js'),\n addISOYears: require('./add_iso_years/index.js'),\n addMilliseconds: require('./add_milliseconds/index.js'),\n addMinutes: require('./add_minutes/index.js'),\n addMonths: require('./add_months/index.js'),\n addQuarters: require('./add_quarters/index.js'),\n addSeconds: require('./add_seconds/index.js'),\n addWeeks: require('./add_weeks/index.js'),\n addYears: require('./add_years/index.js'),\n areRangesOverlapping: require('./are_ranges_overlapping/index.js'),\n closestIndexTo: require('./closest_index_to/index.js'),\n closestTo: require('./closest_to/index.js'),\n compareAsc: require('./compare_asc/index.js'),\n compareDesc: require('./compare_desc/index.js'),\n differenceInCalendarDays: require('./difference_in_calendar_days/index.js'),\n differenceInCalendarISOWeeks: require('./difference_in_calendar_iso_weeks/index.js'),\n differenceInCalendarISOYears: require('./difference_in_calendar_iso_years/index.js'),\n differenceInCalendarMonths: require('./difference_in_calendar_months/index.js'),\n differenceInCalendarQuarters: require('./difference_in_calendar_quarters/index.js'),\n differenceInCalendarWeeks: require('./difference_in_calendar_weeks/index.js'),\n differenceInCalendarYears: require('./difference_in_calendar_years/index.js'),\n differenceInDays: require('./difference_in_days/index.js'),\n differenceInHours: require('./difference_in_hours/index.js'),\n differenceInISOYears: require('./difference_in_iso_years/index.js'),\n differenceInMilliseconds: require('./difference_in_milliseconds/index.js'),\n differenceInMinutes: require('./difference_in_minutes/index.js'),\n differenceInMonths: require('./difference_in_months/index.js'),\n differenceInQuarters: require('./difference_in_quarters/index.js'),\n differenceInSeconds: require('./difference_in_seconds/index.js'),\n differenceInWeeks: require('./difference_in_weeks/index.js'),\n differenceInYears: require('./difference_in_years/index.js'),\n distanceInWords: require('./distance_in_words/index.js'),\n distanceInWordsStrict: require('./distance_in_words_strict/index.js'),\n distanceInWordsToNow: require('./distance_in_words_to_now/index.js'),\n eachDay: require('./each_day/index.js'),\n endOfDay: require('./end_of_day/index.js'),\n endOfHour: require('./end_of_hour/index.js'),\n endOfISOWeek: require('./end_of_iso_week/index.js'),\n endOfISOYear: require('./end_of_iso_year/index.js'),\n endOfMinute: require('./end_of_minute/index.js'),\n endOfMonth: require('./end_of_month/index.js'),\n endOfQuarter: require('./end_of_quarter/index.js'),\n endOfSecond: require('./end_of_second/index.js'),\n endOfToday: require('./end_of_today/index.js'),\n endOfTomorrow: require('./end_of_tomorrow/index.js'),\n endOfWeek: require('./end_of_week/index.js'),\n endOfYear: require('./end_of_year/index.js'),\n endOfYesterday: require('./end_of_yesterday/index.js'),\n format: require('./format/index.js'),\n getDate: require('./get_date/index.js'),\n getDay: require('./get_day/index.js'),\n getDayOfYear: require('./get_day_of_year/index.js'),\n getDaysInMonth: require('./get_days_in_month/index.js'),\n getDaysInYear: require('./get_days_in_year/index.js'),\n getHours: require('./get_hours/index.js'),\n getISODay: require('./get_iso_day/index.js'),\n getISOWeek: require('./get_iso_week/index.js'),\n getISOWeeksInYear: require('./get_iso_weeks_in_year/index.js'),\n getISOYear: require('./get_iso_year/index.js'),\n getMilliseconds: require('./get_milliseconds/index.js'),\n getMinutes: require('./get_minutes/index.js'),\n getMonth: require('./get_month/index.js'),\n getOverlappingDaysInRanges: require('./get_overlapping_days_in_ranges/index.js'),\n getQuarter: require('./get_quarter/index.js'),\n getSeconds: require('./get_seconds/index.js'),\n getTime: require('./get_time/index.js'),\n getYear: require('./get_year/index.js'),\n isAfter: require('./is_after/index.js'),\n isBefore: require('./is_before/index.js'),\n isDate: require('./is_date/index.js'),\n isEqual: require('./is_equal/index.js'),\n isFirstDayOfMonth: require('./is_first_day_of_month/index.js'),\n isFriday: require('./is_friday/index.js'),\n isFuture: require('./is_future/index.js'),\n isLastDayOfMonth: require('./is_last_day_of_month/index.js'),\n isLeapYear: require('./is_leap_year/index.js'),\n isMonday: require('./is_monday/index.js'),\n isPast: require('./is_past/index.js'),\n isSameDay: require('./is_same_day/index.js'),\n isSameHour: require('./is_same_hour/index.js'),\n isSameISOWeek: require('./is_same_iso_week/index.js'),\n isSameISOYear: require('./is_same_iso_year/index.js'),\n isSameMinute: require('./is_same_minute/index.js'),\n isSameMonth: require('./is_same_month/index.js'),\n isSameQuarter: require('./is_same_quarter/index.js'),\n isSameSecond: require('./is_same_second/index.js'),\n isSameWeek: require('./is_same_week/index.js'),\n isSameYear: require('./is_same_year/index.js'),\n isSaturday: require('./is_saturday/index.js'),\n isSunday: require('./is_sunday/index.js'),\n isThisHour: require('./is_this_hour/index.js'),\n isThisISOWeek: require('./is_this_iso_week/index.js'),\n isThisISOYear: require('./is_this_iso_year/index.js'),\n isThisMinute: require('./is_this_minute/index.js'),\n isThisMonth: require('./is_this_month/index.js'),\n isThisQuarter: require('./is_this_quarter/index.js'),\n isThisSecond: require('./is_this_second/index.js'),\n isThisWeek: require('./is_this_week/index.js'),\n isThisYear: require('./is_this_year/index.js'),\n isThursday: require('./is_thursday/index.js'),\n isToday: require('./is_today/index.js'),\n isTomorrow: require('./is_tomorrow/index.js'),\n isTuesday: require('./is_tuesday/index.js'),\n isValid: require('./is_valid/index.js'),\n isWednesday: require('./is_wednesday/index.js'),\n isWeekend: require('./is_weekend/index.js'),\n isWithinRange: require('./is_within_range/index.js'),\n isYesterday: require('./is_yesterday/index.js'),\n lastDayOfISOWeek: require('./last_day_of_iso_week/index.js'),\n lastDayOfISOYear: require('./last_day_of_iso_year/index.js'),\n lastDayOfMonth: require('./last_day_of_month/index.js'),\n lastDayOfQuarter: require('./last_day_of_quarter/index.js'),\n lastDayOfWeek: require('./last_day_of_week/index.js'),\n lastDayOfYear: require('./last_day_of_year/index.js'),\n max: require('./max/index.js'),\n min: require('./min/index.js'),\n parse: require('./parse/index.js'),\n setDate: require('./set_date/index.js'),\n setDay: require('./set_day/index.js'),\n setDayOfYear: require('./set_day_of_year/index.js'),\n setHours: require('./set_hours/index.js'),\n setISODay: require('./set_iso_day/index.js'),\n setISOWeek: require('./set_iso_week/index.js'),\n setISOYear: require('./set_iso_year/index.js'),\n setMilliseconds: require('./set_milliseconds/index.js'),\n setMinutes: require('./set_minutes/index.js'),\n setMonth: require('./set_month/index.js'),\n setQuarter: require('./set_quarter/index.js'),\n setSeconds: require('./set_seconds/index.js'),\n setYear: require('./set_year/index.js'),\n startOfDay: require('./start_of_day/index.js'),\n startOfHour: require('./start_of_hour/index.js'),\n startOfISOWeek: require('./start_of_iso_week/index.js'),\n startOfISOYear: require('./start_of_iso_year/index.js'),\n startOfMinute: require('./start_of_minute/index.js'),\n startOfMonth: require('./start_of_month/index.js'),\n startOfQuarter: require('./start_of_quarter/index.js'),\n startOfSecond: require('./start_of_second/index.js'),\n startOfToday: require('./start_of_today/index.js'),\n startOfTomorrow: require('./start_of_tomorrow/index.js'),\n startOfWeek: require('./start_of_week/index.js'),\n startOfYear: require('./start_of_year/index.js'),\n startOfYesterday: require('./start_of_yesterday/index.js'),\n subDays: require('./sub_days/index.js'),\n subHours: require('./sub_hours/index.js'),\n subISOYears: require('./sub_iso_years/index.js'),\n subMilliseconds: require('./sub_milliseconds/index.js'),\n subMinutes: require('./sub_minutes/index.js'),\n subMonths: require('./sub_months/index.js'),\n subQuarters: require('./sub_quarters/index.js'),\n subSeconds: require('./sub_seconds/index.js'),\n subWeeks: require('./sub_weeks/index.js'),\n subYears: require('./sub_years/index.js')\n}\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Is the first date after the second one?\n *\n * @description\n * Is the first date after the second one?\n *\n * @param {Date|String|Number} date - the date that should be after the other one to return true\n * @param {Date|String|Number} dateToCompare - the date to compare with\n * @returns {Boolean} the first date is after the second date\n *\n * @example\n * // Is 10 July 1989 after 11 February 1987?\n * var result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> true\n */\nfunction isAfter (dirtyDate, dirtyDateToCompare) {\n var date = parse(dirtyDate)\n var dateToCompare = parse(dirtyDateToCompare)\n return date.getTime() > dateToCompare.getTime()\n}\n\nmodule.exports = isAfter\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Is the first date before the second one?\n *\n * @description\n * Is the first date before the second one?\n *\n * @param {Date|String|Number} date - the date that should be before the other one to return true\n * @param {Date|String|Number} dateToCompare - the date to compare with\n * @returns {Boolean} the first date is before the second date\n *\n * @example\n * // Is 10 July 1989 before 11 February 1987?\n * var result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> false\n */\nfunction isBefore (dirtyDate, dirtyDateToCompare) {\n var date = parse(dirtyDate)\n var dateToCompare = parse(dirtyDateToCompare)\n return date.getTime() < dateToCompare.getTime()\n}\n\nmodule.exports = isBefore\n","/**\n * @category Common Helpers\n * @summary Is the given argument an instance of Date?\n *\n * @description\n * Is the given argument an instance of Date?\n *\n * @param {*} argument - the argument to check\n * @returns {Boolean} the given argument is an instance of Date\n *\n * @example\n * // Is 'mayonnaise' a Date?\n * var result = isDate('mayonnaise')\n * //=> false\n */\nfunction isDate (argument) {\n return argument instanceof Date\n}\n\nmodule.exports = isDate\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Are the given dates equal?\n *\n * @description\n * Are the given dates equal?\n *\n * @param {Date|String|Number} dateLeft - the first date to compare\n * @param {Date|String|Number} dateRight - the second date to compare\n * @returns {Boolean} the dates are equal\n *\n * @example\n * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal?\n * var result = isEqual(\n * new Date(2014, 6, 2, 6, 30, 45, 0)\n * new Date(2014, 6, 2, 6, 30, 45, 500)\n * )\n * //=> false\n */\nfunction isEqual (dirtyLeftDate, dirtyRightDate) {\n var dateLeft = parse(dirtyLeftDate)\n var dateRight = parse(dirtyRightDate)\n return dateLeft.getTime() === dateRight.getTime()\n}\n\nmodule.exports = isEqual\n","var parse = require('../parse/index.js')\n\n/**\n * @category Month Helpers\n * @summary Is the given date the first day of a month?\n *\n * @description\n * Is the given date the first day of a month?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is the first day of a month\n *\n * @example\n * // Is 1 September 2014 the first day of a month?\n * var result = isFirstDayOfMonth(new Date(2014, 8, 1))\n * //=> true\n */\nfunction isFirstDayOfMonth (dirtyDate) {\n return parse(dirtyDate).getDate() === 1\n}\n\nmodule.exports = isFirstDayOfMonth\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Is the given date Friday?\n *\n * @description\n * Is the given date Friday?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is Friday\n *\n * @example\n * // Is 26 September 2014 Friday?\n * var result = isFriday(new Date(2014, 8, 26))\n * //=> true\n */\nfunction isFriday (dirtyDate) {\n return parse(dirtyDate).getDay() === 5\n}\n\nmodule.exports = isFriday\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Is the given date in the future?\n *\n * @description\n * Is the given date in the future?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in the future\n *\n * @example\n * // If today is 6 October 2014, is 31 December 2014 in the future?\n * var result = isFuture(new Date(2014, 11, 31))\n * //=> true\n */\nfunction isFuture (dirtyDate) {\n return parse(dirtyDate).getTime() > new Date().getTime()\n}\n\nmodule.exports = isFuture\n","var parse = require('../parse/index.js')\nvar endOfDay = require('../end_of_day/index.js')\nvar endOfMonth = require('../end_of_month/index.js')\n\n/**\n * @category Month Helpers\n * @summary Is the given date the last day of a month?\n *\n * @description\n * Is the given date the last day of a month?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is the last day of a month\n *\n * @example\n * // Is 28 February 2014 the last day of a month?\n * var result = isLastDayOfMonth(new Date(2014, 1, 28))\n * //=> true\n */\nfunction isLastDayOfMonth (dirtyDate) {\n var date = parse(dirtyDate)\n return endOfDay(date).getTime() === endOfMonth(date).getTime()\n}\n\nmodule.exports = isLastDayOfMonth\n","var parse = require('../parse/index.js')\n\n/**\n * @category Year Helpers\n * @summary Is the given date in the leap year?\n *\n * @description\n * Is the given date in the leap year?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in the leap year\n *\n * @example\n * // Is 1 September 2012 in the leap year?\n * var result = isLeapYear(new Date(2012, 8, 1))\n * //=> true\n */\nfunction isLeapYear (dirtyDate) {\n var date = parse(dirtyDate)\n var year = date.getFullYear()\n return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0\n}\n\nmodule.exports = isLeapYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Is the given date Monday?\n *\n * @description\n * Is the given date Monday?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is Monday\n *\n * @example\n * // Is 22 September 2014 Monday?\n * var result = isMonday(new Date(2014, 8, 22))\n * //=> true\n */\nfunction isMonday (dirtyDate) {\n return parse(dirtyDate).getDay() === 1\n}\n\nmodule.exports = isMonday\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Is the given date in the past?\n *\n * @description\n * Is the given date in the past?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in the past\n *\n * @example\n * // If today is 6 October 2014, is 2 July 2014 in the past?\n * var result = isPast(new Date(2014, 6, 2))\n * //=> true\n */\nfunction isPast (dirtyDate) {\n return parse(dirtyDate).getTime() < new Date().getTime()\n}\n\nmodule.exports = isPast\n","var startOfDay = require('../start_of_day/index.js')\n\n/**\n * @category Day Helpers\n * @summary Are the given dates in the same day?\n *\n * @description\n * Are the given dates in the same day?\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same day\n *\n * @example\n * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day?\n * var result = isSameDay(\n * new Date(2014, 8, 4, 6, 0),\n * new Date(2014, 8, 4, 18, 0)\n * )\n * //=> true\n */\nfunction isSameDay (dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfDay = startOfDay(dirtyDateLeft)\n var dateRightStartOfDay = startOfDay(dirtyDateRight)\n\n return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime()\n}\n\nmodule.exports = isSameDay\n","var startOfHour = require('../start_of_hour/index.js')\n\n/**\n * @category Hour Helpers\n * @summary Are the given dates in the same hour?\n *\n * @description\n * Are the given dates in the same hour?\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same hour\n *\n * @example\n * // Are 4 September 2014 06:00:00 and 4 September 06:30:00 in the same hour?\n * var result = isSameHour(\n * new Date(2014, 8, 4, 6, 0),\n * new Date(2014, 8, 4, 6, 30)\n * )\n * //=> true\n */\nfunction isSameHour (dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfHour = startOfHour(dirtyDateLeft)\n var dateRightStartOfHour = startOfHour(dirtyDateRight)\n\n return dateLeftStartOfHour.getTime() === dateRightStartOfHour.getTime()\n}\n\nmodule.exports = isSameHour\n","var isSameWeek = require('../is_same_week/index.js')\n\n/**\n * @category ISO Week Helpers\n * @summary Are the given dates in the same ISO week?\n *\n * @description\n * Are the given dates in the same ISO week?\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same ISO week\n *\n * @example\n * // Are 1 September 2014 and 7 September 2014 in the same ISO week?\n * var result = isSameISOWeek(\n * new Date(2014, 8, 1),\n * new Date(2014, 8, 7)\n * )\n * //=> true\n */\nfunction isSameISOWeek (dirtyDateLeft, dirtyDateRight) {\n return isSameWeek(dirtyDateLeft, dirtyDateRight, {weekStartsOn: 1})\n}\n\nmodule.exports = isSameISOWeek\n","var startOfISOYear = require('../start_of_iso_year/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Are the given dates in the same ISO week-numbering year?\n *\n * @description\n * Are the given dates in the same ISO week-numbering year?\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same ISO week-numbering year\n *\n * @example\n * // Are 29 December 2003 and 2 January 2005 in the same ISO week-numbering year?\n * var result = isSameISOYear(\n * new Date(2003, 11, 29),\n * new Date(2005, 0, 2)\n * )\n * //=> true\n */\nfunction isSameISOYear (dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfYear = startOfISOYear(dirtyDateLeft)\n var dateRightStartOfYear = startOfISOYear(dirtyDateRight)\n\n return dateLeftStartOfYear.getTime() === dateRightStartOfYear.getTime()\n}\n\nmodule.exports = isSameISOYear\n","var startOfMinute = require('../start_of_minute/index.js')\n\n/**\n * @category Minute Helpers\n * @summary Are the given dates in the same minute?\n *\n * @description\n * Are the given dates in the same minute?\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same minute\n *\n * @example\n * // Are 4 September 2014 06:30:00 and 4 September 2014 06:30:15\n * // in the same minute?\n * var result = isSameMinute(\n * new Date(2014, 8, 4, 6, 30),\n * new Date(2014, 8, 4, 6, 30, 15)\n * )\n * //=> true\n */\nfunction isSameMinute (dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfMinute = startOfMinute(dirtyDateLeft)\n var dateRightStartOfMinute = startOfMinute(dirtyDateRight)\n\n return dateLeftStartOfMinute.getTime() === dateRightStartOfMinute.getTime()\n}\n\nmodule.exports = isSameMinute\n","var parse = require('../parse/index.js')\n\n/**\n * @category Month Helpers\n * @summary Are the given dates in the same month?\n *\n * @description\n * Are the given dates in the same month?\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same month\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same month?\n * var result = isSameMonth(\n * new Date(2014, 8, 2),\n * new Date(2014, 8, 25)\n * )\n * //=> true\n */\nfunction isSameMonth (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n return dateLeft.getFullYear() === dateRight.getFullYear() &&\n dateLeft.getMonth() === dateRight.getMonth()\n}\n\nmodule.exports = isSameMonth\n","var startOfQuarter = require('../start_of_quarter/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Are the given dates in the same year quarter?\n *\n * @description\n * Are the given dates in the same year quarter?\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same quarter\n *\n * @example\n * // Are 1 January 2014 and 8 March 2014 in the same quarter?\n * var result = isSameQuarter(\n * new Date(2014, 0, 1),\n * new Date(2014, 2, 8)\n * )\n * //=> true\n */\nfunction isSameQuarter (dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfQuarter = startOfQuarter(dirtyDateLeft)\n var dateRightStartOfQuarter = startOfQuarter(dirtyDateRight)\n\n return dateLeftStartOfQuarter.getTime() === dateRightStartOfQuarter.getTime()\n}\n\nmodule.exports = isSameQuarter\n","var startOfSecond = require('../start_of_second/index.js')\n\n/**\n * @category Second Helpers\n * @summary Are the given dates in the same second?\n *\n * @description\n * Are the given dates in the same second?\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same second\n *\n * @example\n * // Are 4 September 2014 06:30:15.000 and 4 September 2014 06:30.15.500\n * // in the same second?\n * var result = isSameSecond(\n * new Date(2014, 8, 4, 6, 30, 15),\n * new Date(2014, 8, 4, 6, 30, 15, 500)\n * )\n * //=> true\n */\nfunction isSameSecond (dirtyDateLeft, dirtyDateRight) {\n var dateLeftStartOfSecond = startOfSecond(dirtyDateLeft)\n var dateRightStartOfSecond = startOfSecond(dirtyDateRight)\n\n return dateLeftStartOfSecond.getTime() === dateRightStartOfSecond.getTime()\n}\n\nmodule.exports = isSameSecond\n","var startOfWeek = require('../start_of_week/index.js')\n\n/**\n * @category Week Helpers\n * @summary Are the given dates in the same week?\n *\n * @description\n * Are the given dates in the same week?\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @param {Object} [options] - the object with options\n * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @returns {Boolean} the dates are in the same week\n *\n * @example\n * // Are 31 August 2014 and 4 September 2014 in the same week?\n * var result = isSameWeek(\n * new Date(2014, 7, 31),\n * new Date(2014, 8, 4)\n * )\n * //=> true\n *\n * @example\n * // If week starts with Monday,\n * // are 31 August 2014 and 4 September 2014 in the same week?\n * var result = isSameWeek(\n * new Date(2014, 7, 31),\n * new Date(2014, 8, 4),\n * {weekStartsOn: 1}\n * )\n * //=> false\n */\nfunction isSameWeek (dirtyDateLeft, dirtyDateRight, dirtyOptions) {\n var dateLeftStartOfWeek = startOfWeek(dirtyDateLeft, dirtyOptions)\n var dateRightStartOfWeek = startOfWeek(dirtyDateRight, dirtyOptions)\n\n return dateLeftStartOfWeek.getTime() === dateRightStartOfWeek.getTime()\n}\n\nmodule.exports = isSameWeek\n","var parse = require('../parse/index.js')\n\n/**\n * @category Year Helpers\n * @summary Are the given dates in the same year?\n *\n * @description\n * Are the given dates in the same year?\n *\n * @param {Date|String|Number} dateLeft - the first date to check\n * @param {Date|String|Number} dateRight - the second date to check\n * @returns {Boolean} the dates are in the same year\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same year?\n * var result = isSameYear(\n * new Date(2014, 8, 2),\n * new Date(2014, 8, 25)\n * )\n * //=> true\n */\nfunction isSameYear (dirtyDateLeft, dirtyDateRight) {\n var dateLeft = parse(dirtyDateLeft)\n var dateRight = parse(dirtyDateRight)\n return dateLeft.getFullYear() === dateRight.getFullYear()\n}\n\nmodule.exports = isSameYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Is the given date Saturday?\n *\n * @description\n * Is the given date Saturday?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is Saturday\n *\n * @example\n * // Is 27 September 2014 Saturday?\n * var result = isSaturday(new Date(2014, 8, 27))\n * //=> true\n */\nfunction isSaturday (dirtyDate) {\n return parse(dirtyDate).getDay() === 6\n}\n\nmodule.exports = isSaturday\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Is the given date Sunday?\n *\n * @description\n * Is the given date Sunday?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is Sunday\n *\n * @example\n * // Is 21 September 2014 Sunday?\n * var result = isSunday(new Date(2014, 8, 21))\n * //=> true\n */\nfunction isSunday (dirtyDate) {\n return parse(dirtyDate).getDay() === 0\n}\n\nmodule.exports = isSunday\n","var isSameHour = require('../is_same_hour/index.js')\n\n/**\n * @category Hour Helpers\n * @summary Is the given date in the same hour as the current date?\n *\n * @description\n * Is the given date in the same hour as the current date?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in this hour\n *\n * @example\n * // If now is 25 September 2014 18:30:15.500,\n * // is 25 September 2014 18:00:00 in this hour?\n * var result = isThisHour(new Date(2014, 8, 25, 18))\n * //=> true\n */\nfunction isThisHour (dirtyDate) {\n return isSameHour(new Date(), dirtyDate)\n}\n\nmodule.exports = isThisHour\n","var isSameISOWeek = require('../is_same_iso_week/index.js')\n\n/**\n * @category ISO Week Helpers\n * @summary Is the given date in the same ISO week as the current date?\n *\n * @description\n * Is the given date in the same ISO week as the current date?\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in this ISO week\n *\n * @example\n * // If today is 25 September 2014, is 22 September 2014 in this ISO week?\n * var result = isThisISOWeek(new Date(2014, 8, 22))\n * //=> true\n */\nfunction isThisISOWeek (dirtyDate) {\n return isSameISOWeek(new Date(), dirtyDate)\n}\n\nmodule.exports = isThisISOWeek\n","var isSameISOYear = require('../is_same_iso_year/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Is the given date in the same ISO week-numbering year as the current date?\n *\n * @description\n * Is the given date in the same ISO week-numbering year as the current date?\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in this ISO week-numbering year\n *\n * @example\n * // If today is 25 September 2014,\n * // is 30 December 2013 in this ISO week-numbering year?\n * var result = isThisISOYear(new Date(2013, 11, 30))\n * //=> true\n */\nfunction isThisISOYear (dirtyDate) {\n return isSameISOYear(new Date(), dirtyDate)\n}\n\nmodule.exports = isThisISOYear\n","var isSameMinute = require('../is_same_minute/index.js')\n\n/**\n * @category Minute Helpers\n * @summary Is the given date in the same minute as the current date?\n *\n * @description\n * Is the given date in the same minute as the current date?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in this minute\n *\n * @example\n * // If now is 25 September 2014 18:30:15.500,\n * // is 25 September 2014 18:30:00 in this minute?\n * var result = isThisMinute(new Date(2014, 8, 25, 18, 30))\n * //=> true\n */\nfunction isThisMinute (dirtyDate) {\n return isSameMinute(new Date(), dirtyDate)\n}\n\nmodule.exports = isThisMinute\n","var isSameMonth = require('../is_same_month/index.js')\n\n/**\n * @category Month Helpers\n * @summary Is the given date in the same month as the current date?\n *\n * @description\n * Is the given date in the same month as the current date?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in this month\n *\n * @example\n * // If today is 25 September 2014, is 15 September 2014 in this month?\n * var result = isThisMonth(new Date(2014, 8, 15))\n * //=> true\n */\nfunction isThisMonth (dirtyDate) {\n return isSameMonth(new Date(), dirtyDate)\n}\n\nmodule.exports = isThisMonth\n","var isSameQuarter = require('../is_same_quarter/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Is the given date in the same quarter as the current date?\n *\n * @description\n * Is the given date in the same quarter as the current date?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in this quarter\n *\n * @example\n * // If today is 25 September 2014, is 2 July 2014 in this quarter?\n * var result = isThisQuarter(new Date(2014, 6, 2))\n * //=> true\n */\nfunction isThisQuarter (dirtyDate) {\n return isSameQuarter(new Date(), dirtyDate)\n}\n\nmodule.exports = isThisQuarter\n","var isSameSecond = require('../is_same_second/index.js')\n\n/**\n * @category Second Helpers\n * @summary Is the given date in the same second as the current date?\n *\n * @description\n * Is the given date in the same second as the current date?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in this second\n *\n * @example\n * // If now is 25 September 2014 18:30:15.500,\n * // is 25 September 2014 18:30:15.000 in this second?\n * var result = isThisSecond(new Date(2014, 8, 25, 18, 30, 15))\n * //=> true\n */\nfunction isThisSecond (dirtyDate) {\n return isSameSecond(new Date(), dirtyDate)\n}\n\nmodule.exports = isThisSecond\n","var isSameWeek = require('../is_same_week/index.js')\n\n/**\n * @category Week Helpers\n * @summary Is the given date in the same week as the current date?\n *\n * @description\n * Is the given date in the same week as the current date?\n *\n * @param {Date|String|Number} date - the date to check\n * @param {Object} [options] - the object with options\n * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @returns {Boolean} the date is in this week\n *\n * @example\n * // If today is 25 September 2014, is 21 September 2014 in this week?\n * var result = isThisWeek(new Date(2014, 8, 21))\n * //=> true\n *\n * @example\n * // If today is 25 September 2014 and week starts with Monday\n * // is 21 September 2014 in this week?\n * var result = isThisWeek(new Date(2014, 8, 21), {weekStartsOn: 1})\n * //=> false\n */\nfunction isThisWeek (dirtyDate, dirtyOptions) {\n return isSameWeek(new Date(), dirtyDate, dirtyOptions)\n}\n\nmodule.exports = isThisWeek\n","var isSameYear = require('../is_same_year/index.js')\n\n/**\n * @category Year Helpers\n * @summary Is the given date in the same year as the current date?\n *\n * @description\n * Is the given date in the same year as the current date?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is in this year\n *\n * @example\n * // If today is 25 September 2014, is 2 July 2014 in this year?\n * var result = isThisYear(new Date(2014, 6, 2))\n * //=> true\n */\nfunction isThisYear (dirtyDate) {\n return isSameYear(new Date(), dirtyDate)\n}\n\nmodule.exports = isThisYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Is the given date Thursday?\n *\n * @description\n * Is the given date Thursday?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is Thursday\n *\n * @example\n * // Is 25 September 2014 Thursday?\n * var result = isThursday(new Date(2014, 8, 25))\n * //=> true\n */\nfunction isThursday (dirtyDate) {\n return parse(dirtyDate).getDay() === 4\n}\n\nmodule.exports = isThursday\n","var startOfDay = require('../start_of_day/index.js')\n\n/**\n * @category Day Helpers\n * @summary Is the given date today?\n *\n * @description\n * Is the given date today?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is today\n *\n * @example\n * // If today is 6 October 2014, is 6 October 14:00:00 today?\n * var result = isToday(new Date(2014, 9, 6, 14, 0))\n * //=> true\n */\nfunction isToday (dirtyDate) {\n return startOfDay(dirtyDate).getTime() === startOfDay(new Date()).getTime()\n}\n\nmodule.exports = isToday\n","var startOfDay = require('../start_of_day/index.js')\n\n/**\n * @category Day Helpers\n * @summary Is the given date tomorrow?\n *\n * @description\n * Is the given date tomorrow?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is tomorrow\n *\n * @example\n * // If today is 6 October 2014, is 7 October 14:00:00 tomorrow?\n * var result = isTomorrow(new Date(2014, 9, 7, 14, 0))\n * //=> true\n */\nfunction isTomorrow (dirtyDate) {\n var tomorrow = new Date()\n tomorrow.setDate(tomorrow.getDate() + 1)\n return startOfDay(dirtyDate).getTime() === startOfDay(tomorrow).getTime()\n}\n\nmodule.exports = isTomorrow\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Is the given date Tuesday?\n *\n * @description\n * Is the given date Tuesday?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is Tuesday\n *\n * @example\n * // Is 23 September 2014 Tuesday?\n * var result = isTuesday(new Date(2014, 8, 23))\n * //=> true\n */\nfunction isTuesday (dirtyDate) {\n return parse(dirtyDate).getDay() === 2\n}\n\nmodule.exports = isTuesday\n","var isDate = require('../is_date/index.js')\n\n/**\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param {Date} date - the date to check\n * @returns {Boolean} the date is valid\n * @throws {TypeError} argument must be an instance of Date\n *\n * @example\n * // For the valid date:\n * var result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the invalid date:\n * var result = isValid(new Date(''))\n * //=> false\n */\nfunction isValid (dirtyDate) {\n if (isDate(dirtyDate)) {\n return !isNaN(dirtyDate)\n } else {\n throw new TypeError(toString.call(dirtyDate) + ' is not an instance of Date')\n }\n}\n\nmodule.exports = isValid\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Is the given date Wednesday?\n *\n * @description\n * Is the given date Wednesday?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is Wednesday\n *\n * @example\n * // Is 24 September 2014 Wednesday?\n * var result = isWednesday(new Date(2014, 8, 24))\n * //=> true\n */\nfunction isWednesday (dirtyDate) {\n return parse(dirtyDate).getDay() === 3\n}\n\nmodule.exports = isWednesday\n","var parse = require('../parse/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Does the given date fall on a weekend?\n *\n * @description\n * Does the given date fall on a weekend?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date falls on a weekend\n *\n * @example\n * // Does 5 October 2014 fall on a weekend?\n * var result = isWeekend(new Date(2014, 9, 5))\n * //=> true\n */\nfunction isWeekend (dirtyDate) {\n var date = parse(dirtyDate)\n var day = date.getDay()\n return day === 0 || day === 6\n}\n\nmodule.exports = isWeekend\n","var parse = require('../parse/index.js')\n\n/**\n * @category Range Helpers\n * @summary Is the given date within the range?\n *\n * @description\n * Is the given date within the range?\n *\n * @param {Date|String|Number} date - the date to check\n * @param {Date|String|Number} startDate - the start of range\n * @param {Date|String|Number} endDate - the end of range\n * @returns {Boolean} the date is within the range\n * @throws {Error} startDate cannot be after endDate\n *\n * @example\n * // For the date within the range:\n * isWithinRange(\n * new Date(2014, 0, 3), new Date(2014, 0, 1), new Date(2014, 0, 7)\n * )\n * //=> true\n *\n * @example\n * // For the date outside of the range:\n * isWithinRange(\n * new Date(2014, 0, 10), new Date(2014, 0, 1), new Date(2014, 0, 7)\n * )\n * //=> false\n */\nfunction isWithinRange (dirtyDate, dirtyStartDate, dirtyEndDate) {\n var time = parse(dirtyDate).getTime()\n var startTime = parse(dirtyStartDate).getTime()\n var endTime = parse(dirtyEndDate).getTime()\n\n if (startTime > endTime) {\n throw new Error('The start of the range cannot be after the end of the range')\n }\n\n return time >= startTime && time <= endTime\n}\n\nmodule.exports = isWithinRange\n","var startOfDay = require('../start_of_day/index.js')\n\n/**\n * @category Day Helpers\n * @summary Is the given date yesterday?\n *\n * @description\n * Is the given date yesterday?\n *\n * @param {Date|String|Number} date - the date to check\n * @returns {Boolean} the date is yesterday\n *\n * @example\n * // If today is 6 October 2014, is 5 October 14:00:00 yesterday?\n * var result = isYesterday(new Date(2014, 9, 5, 14, 0))\n * //=> true\n */\nfunction isYesterday (dirtyDate) {\n var yesterday = new Date()\n yesterday.setDate(yesterday.getDate() - 1)\n return startOfDay(dirtyDate).getTime() === startOfDay(yesterday).getTime()\n}\n\nmodule.exports = isYesterday\n","var lastDayOfWeek = require('../last_day_of_week/index.js')\n\n/**\n * @category ISO Week Helpers\n * @summary Return the last day of an ISO week for the given date.\n *\n * @description\n * Return the last day of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the last day of an ISO week\n *\n * @example\n * // The last day of an ISO week for 2 September 2014 11:55:00:\n * var result = lastDayOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Sep 07 2014 00:00:00\n */\nfunction lastDayOfISOWeek (dirtyDate) {\n return lastDayOfWeek(dirtyDate, {weekStartsOn: 1})\n}\n\nmodule.exports = lastDayOfISOWeek\n","var getISOYear = require('../get_iso_year/index.js')\nvar startOfISOWeek = require('../start_of_iso_week/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the last day of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the last day of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the end of an ISO week-numbering year\n *\n * @example\n * // The last day of an ISO week-numbering year for 2 July 2005:\n * var result = lastDayOfISOYear(new Date(2005, 6, 2))\n * //=> Sun Jan 01 2006 00:00:00\n */\nfunction lastDayOfISOYear (dirtyDate) {\n var year = getISOYear(dirtyDate)\n var fourthOfJanuary = new Date(0)\n fourthOfJanuary.setFullYear(year + 1, 0, 4)\n fourthOfJanuary.setHours(0, 0, 0, 0)\n var date = startOfISOWeek(fourthOfJanuary)\n date.setDate(date.getDate() - 1)\n return date\n}\n\nmodule.exports = lastDayOfISOYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Month Helpers\n * @summary Return the last day of a month for the given date.\n *\n * @description\n * Return the last day of a month for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the last day of a month\n *\n * @example\n * // The last day of a month for 2 September 2014 11:55:00:\n * var result = lastDayOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 00:00:00\n */\nfunction lastDayOfMonth (dirtyDate) {\n var date = parse(dirtyDate)\n var month = date.getMonth()\n date.setFullYear(date.getFullYear(), month + 1, 0)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = lastDayOfMonth\n","var parse = require('../parse/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Return the last day of a year quarter for the given date.\n *\n * @description\n * Return the last day of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the last day of a quarter\n *\n * @example\n * // The last day of a quarter for 2 September 2014 11:55:00:\n * var result = lastDayOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 00:00:00\n */\nfunction lastDayOfQuarter (dirtyDate) {\n var date = parse(dirtyDate)\n var currentMonth = date.getMonth()\n var month = currentMonth - currentMonth % 3 + 3\n date.setMonth(month, 0)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = lastDayOfQuarter\n","var parse = require('../parse/index.js')\n\n/**\n * @category Week Helpers\n * @summary Return the last day of a week for the given date.\n *\n * @description\n * Return the last day of a week for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @param {Object} [options] - the object with options\n * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @returns {Date} the last day of a week\n *\n * @example\n * // The last day of a week for 2 September 2014 11:55:00:\n * var result = lastDayOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sat Sep 06 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the last day of the week for 2 September 2014 11:55:00:\n * var result = lastDayOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1})\n * //=> Sun Sep 07 2014 00:00:00\n */\nfunction lastDayOfWeek (dirtyDate, dirtyOptions) {\n var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0\n\n var date = parse(dirtyDate)\n var day = date.getDay()\n var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn)\n\n date.setHours(0, 0, 0, 0)\n date.setDate(date.getDate() + diff)\n return date\n}\n\nmodule.exports = lastDayOfWeek\n","var parse = require('../parse/index.js')\n\n/**\n * @category Year Helpers\n * @summary Return the last day of a year for the given date.\n *\n * @description\n * Return the last day of a year for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the last day of a year\n *\n * @example\n * // The last day of a year for 2 September 2014 11:55:00:\n * var result = lastDayOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Dec 31 2014 00:00:00\n */\nfunction lastDayOfYear (dirtyDate) {\n var date = parse(dirtyDate)\n var year = date.getFullYear()\n date.setFullYear(year + 1, 0, 0)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = lastDayOfYear\n","var commonFormatterKeys = [\n 'M', 'MM', 'Q', 'D', 'DD', 'DDD', 'DDDD', 'd',\n 'E', 'W', 'WW', 'YY', 'YYYY', 'GG', 'GGGG',\n 'H', 'HH', 'h', 'hh', 'm', 'mm',\n 's', 'ss', 'S', 'SS', 'SSS',\n 'Z', 'ZZ', 'X', 'x'\n]\n\nfunction buildFormattingTokensRegExp (formatters) {\n var formatterKeys = []\n for (var key in formatters) {\n if (formatters.hasOwnProperty(key)) {\n formatterKeys.push(key)\n }\n }\n\n var formattingTokens = commonFormatterKeys\n .concat(formatterKeys)\n .sort()\n .reverse()\n var formattingTokensRegExp = new RegExp(\n '(\\\\[[^\\\\[]*\\\\])|(\\\\\\\\)?' + '(' + formattingTokens.join('|') + '|.)', 'g'\n )\n\n return formattingTokensRegExp\n}\n\nmodule.exports = buildFormattingTokensRegExp\n","function buildDistanceInWordsLocale () {\n var distanceInWordsLocale = {\n lessThanXSeconds: {\n one: 'less than a second',\n other: 'less than {{count}} seconds'\n },\n\n xSeconds: {\n one: '1 second',\n other: '{{count}} seconds'\n },\n\n halfAMinute: 'half a minute',\n\n lessThanXMinutes: {\n one: 'less than a minute',\n other: 'less than {{count}} minutes'\n },\n\n xMinutes: {\n one: '1 minute',\n other: '{{count}} minutes'\n },\n\n aboutXHours: {\n one: 'about 1 hour',\n other: 'about {{count}} hours'\n },\n\n xHours: {\n one: '1 hour',\n other: '{{count}} hours'\n },\n\n xDays: {\n one: '1 day',\n other: '{{count}} days'\n },\n\n aboutXMonths: {\n one: 'about 1 month',\n other: 'about {{count}} months'\n },\n\n xMonths: {\n one: '1 month',\n other: '{{count}} months'\n },\n\n aboutXYears: {\n one: 'about 1 year',\n other: 'about {{count}} years'\n },\n\n xYears: {\n one: '1 year',\n other: '{{count}} years'\n },\n\n overXYears: {\n one: 'over 1 year',\n other: 'over {{count}} years'\n },\n\n almostXYears: {\n one: 'almost 1 year',\n other: 'almost {{count}} years'\n }\n }\n\n function localize (token, count, options) {\n options = options || {}\n\n var result\n if (typeof distanceInWordsLocale[token] === 'string') {\n result = distanceInWordsLocale[token]\n } else if (count === 1) {\n result = distanceInWordsLocale[token].one\n } else {\n result = distanceInWordsLocale[token].other.replace('{{count}}', count)\n }\n\n if (options.addSuffix) {\n if (options.comparison > 0) {\n return 'in ' + result\n } else {\n return result + ' ago'\n }\n }\n\n return result\n }\n\n return {\n localize: localize\n }\n}\n\nmodule.exports = buildDistanceInWordsLocale\n","var buildFormattingTokensRegExp = require('../../_lib/build_formatting_tokens_reg_exp/index.js')\n\nfunction buildFormatLocale () {\n // Note: in English, the names of days of the week and months are capitalized.\n // If you are making a new locale based on this one, check if the same is true for the language you're working on.\n // Generally, formatted dates should look like they are in the middle of a sentence,\n // e.g. in Spanish language the weekdays and months should be in the lowercase.\n var months3char = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n var monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n var weekdays2char = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n var weekdays3char = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n var weekdaysFull = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n var meridiemUppercase = ['AM', 'PM']\n var meridiemLowercase = ['am', 'pm']\n var meridiemFull = ['a.m.', 'p.m.']\n\n var formatters = {\n // Month: Jan, Feb, ..., Dec\n 'MMM': function (date) {\n return months3char[date.getMonth()]\n },\n\n // Month: January, February, ..., December\n 'MMMM': function (date) {\n return monthsFull[date.getMonth()]\n },\n\n // Day of week: Su, Mo, ..., Sa\n 'dd': function (date) {\n return weekdays2char[date.getDay()]\n },\n\n // Day of week: Sun, Mon, ..., Sat\n 'ddd': function (date) {\n return weekdays3char[date.getDay()]\n },\n\n // Day of week: Sunday, Monday, ..., Saturday\n 'dddd': function (date) {\n return weekdaysFull[date.getDay()]\n },\n\n // AM, PM\n 'A': function (date) {\n return (date.getHours() / 12) >= 1 ? meridiemUppercase[1] : meridiemUppercase[0]\n },\n\n // am, pm\n 'a': function (date) {\n return (date.getHours() / 12) >= 1 ? meridiemLowercase[1] : meridiemLowercase[0]\n },\n\n // a.m., p.m.\n 'aa': function (date) {\n return (date.getHours() / 12) >= 1 ? meridiemFull[1] : meridiemFull[0]\n }\n }\n\n // Generate ordinal version of formatters: M -> Mo, D -> Do, etc.\n var ordinalFormatters = ['M', 'D', 'DDD', 'd', 'Q', 'W']\n ordinalFormatters.forEach(function (formatterToken) {\n formatters[formatterToken + 'o'] = function (date, formatters) {\n return ordinal(formatters[formatterToken](date))\n }\n })\n\n return {\n formatters: formatters,\n formattingTokensRegExp: buildFormattingTokensRegExp(formatters)\n }\n}\n\nfunction ordinal (number) {\n var rem100 = number % 100\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + 'st'\n case 2:\n return number + 'nd'\n case 3:\n return number + 'rd'\n }\n }\n return number + 'th'\n}\n\nmodule.exports = buildFormatLocale\n","var buildDistanceInWordsLocale = require('./build_distance_in_words_locale/index.js')\nvar buildFormatLocale = require('./build_format_locale/index.js')\n\n/**\n * @category Locales\n * @summary English locale.\n */\nmodule.exports = {\n distanceInWords: buildDistanceInWordsLocale(),\n format: buildFormatLocale()\n}\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Return the latest of the given dates.\n *\n * @description\n * Return the latest of the given dates.\n *\n * @param {...(Date|String|Number)} dates - the dates to compare\n * @returns {Date} the latest of the dates\n *\n * @example\n * // Which of these dates is the latest?\n * var result = max(\n * new Date(1989, 6, 10),\n * new Date(1987, 1, 11),\n * new Date(1995, 6, 2),\n * new Date(1990, 0, 1)\n * )\n * //=> Sun Jul 02 1995 00:00:00\n */\nfunction max () {\n var dirtyDates = Array.prototype.slice.call(arguments)\n var dates = dirtyDates.map(function (dirtyDate) {\n return parse(dirtyDate)\n })\n var latestTimestamp = Math.max.apply(null, dates)\n return new Date(latestTimestamp)\n}\n\nmodule.exports = max\n","var parse = require('../parse/index.js')\n\n/**\n * @category Common Helpers\n * @summary Return the earliest of the given dates.\n *\n * @description\n * Return the earliest of the given dates.\n *\n * @param {...(Date|String|Number)} dates - the dates to compare\n * @returns {Date} the earliest of the dates\n *\n * @example\n * // Which of these dates is the earliest?\n * var result = min(\n * new Date(1989, 6, 10),\n * new Date(1987, 1, 11),\n * new Date(1995, 6, 2),\n * new Date(1990, 0, 1)\n * )\n * //=> Wed Feb 11 1987 00:00:00\n */\nfunction min () {\n var dirtyDates = Array.prototype.slice.call(arguments)\n var dates = dirtyDates.map(function (dirtyDate) {\n return parse(dirtyDate)\n })\n var earliestTimestamp = Math.min.apply(null, dates)\n return new Date(earliestTimestamp)\n}\n\nmodule.exports = min\n","var getTimezoneOffsetInMilliseconds = require('../_lib/getTimezoneOffsetInMilliseconds/index.js')\nvar isDate = require('../is_date/index.js')\n\nvar MILLISECONDS_IN_HOUR = 3600000\nvar MILLISECONDS_IN_MINUTE = 60000\nvar DEFAULT_ADDITIONAL_DIGITS = 2\n\nvar parseTokenDateTimeDelimeter = /[T ]/\nvar parseTokenPlainTime = /:/\n\n// year tokens\nvar parseTokenYY = /^(\\d{2})$/\nvar parseTokensYYY = [\n /^([+-]\\d{2})$/, // 0 additional digits\n /^([+-]\\d{3})$/, // 1 additional digit\n /^([+-]\\d{4})$/ // 2 additional digits\n]\n\nvar parseTokenYYYY = /^(\\d{4})/\nvar parseTokensYYYYY = [\n /^([+-]\\d{4})/, // 0 additional digits\n /^([+-]\\d{5})/, // 1 additional digit\n /^([+-]\\d{6})/ // 2 additional digits\n]\n\n// date tokens\nvar parseTokenMM = /^-(\\d{2})$/\nvar parseTokenDDD = /^-?(\\d{3})$/\nvar parseTokenMMDD = /^-?(\\d{2})-?(\\d{2})$/\nvar parseTokenWww = /^-?W(\\d{2})$/\nvar parseTokenWwwD = /^-?W(\\d{2})-?(\\d{1})$/\n\n// time tokens\nvar parseTokenHH = /^(\\d{2}([.,]\\d*)?)$/\nvar parseTokenHHMM = /^(\\d{2}):?(\\d{2}([.,]\\d*)?)$/\nvar parseTokenHHMMSS = /^(\\d{2}):?(\\d{2}):?(\\d{2}([.,]\\d*)?)$/\n\n// timezone tokens\nvar parseTokenTimezone = /([Z+-].*)$/\nvar parseTokenTimezoneZ = /^(Z)$/\nvar parseTokenTimezoneHH = /^([+-])(\\d{2})$/\nvar parseTokenTimezoneHHMM = /^([+-])(\\d{2}):?(\\d{2})$/\n\n/**\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If an argument is a string, the function tries to parse it.\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If all above fails, the function passes the given argument to Date constructor.\n *\n * @param {Date|String|Number} argument - the value to convert\n * @param {Object} [options] - the object with options\n * @param {0 | 1 | 2} [options.additionalDigits=2] - the additional number of digits in the extended year format\n * @returns {Date} the parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * var result = parse('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Parse string '+02014101',\n * // if the additional number of digits in the extended year format is 1:\n * var result = parse('+02014101', {additionalDigits: 1})\n * //=> Fri Apr 11 2014 00:00:00\n */\nfunction parse (argument, dirtyOptions) {\n if (isDate(argument)) {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new Date(argument.getTime())\n } else if (typeof argument !== 'string') {\n return new Date(argument)\n }\n\n var options = dirtyOptions || {}\n var additionalDigits = options.additionalDigits\n if (additionalDigits == null) {\n additionalDigits = DEFAULT_ADDITIONAL_DIGITS\n } else {\n additionalDigits = Number(additionalDigits)\n }\n\n var dateStrings = splitDateString(argument)\n\n var parseYearResult = parseYear(dateStrings.date, additionalDigits)\n var year = parseYearResult.year\n var restDateString = parseYearResult.restDateString\n\n var date = parseDate(restDateString, year)\n\n if (date) {\n var timestamp = date.getTime()\n var time = 0\n var offset\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time)\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone) * MILLISECONDS_IN_MINUTE\n } else {\n var fullTime = timestamp + time\n var fullTimeDate = new Date(fullTime)\n\n offset = getTimezoneOffsetInMilliseconds(fullTimeDate)\n\n // Adjust time when it's coming from DST\n var fullTimeDateNextDay = new Date(fullTime)\n fullTimeDateNextDay.setDate(fullTimeDate.getDate() + 1)\n var offsetDiff =\n getTimezoneOffsetInMilliseconds(fullTimeDateNextDay) -\n getTimezoneOffsetInMilliseconds(fullTimeDate)\n if (offsetDiff > 0) {\n offset += offsetDiff\n }\n }\n\n return new Date(timestamp + time + offset)\n } else {\n return new Date(argument)\n }\n}\n\nfunction splitDateString (dateString) {\n var dateStrings = {}\n var array = dateString.split(parseTokenDateTimeDelimeter)\n var timeString\n\n if (parseTokenPlainTime.test(array[0])) {\n dateStrings.date = null\n timeString = array[0]\n } else {\n dateStrings.date = array[0]\n timeString = array[1]\n }\n\n if (timeString) {\n var token = parseTokenTimezone.exec(timeString)\n if (token) {\n dateStrings.time = timeString.replace(token[1], '')\n dateStrings.timezone = token[1]\n } else {\n dateStrings.time = timeString\n }\n }\n\n return dateStrings\n}\n\nfunction parseYear (dateString, additionalDigits) {\n var parseTokenYYY = parseTokensYYY[additionalDigits]\n var parseTokenYYYYY = parseTokensYYYYY[additionalDigits]\n\n var token\n\n // YYYY or ±YYYYY\n token = parseTokenYYYY.exec(dateString) || parseTokenYYYYY.exec(dateString)\n if (token) {\n var yearString = token[1]\n return {\n year: parseInt(yearString, 10),\n restDateString: dateString.slice(yearString.length)\n }\n }\n\n // YY or ±YYY\n token = parseTokenYY.exec(dateString) || parseTokenYYY.exec(dateString)\n if (token) {\n var centuryString = token[1]\n return {\n year: parseInt(centuryString, 10) * 100,\n restDateString: dateString.slice(centuryString.length)\n }\n }\n\n // Invalid ISO-formatted year\n return {\n year: null\n }\n}\n\nfunction parseDate (dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) {\n return null\n }\n\n var token\n var date\n var month\n var week\n\n // YYYY\n if (dateString.length === 0) {\n date = new Date(0)\n date.setUTCFullYear(year)\n return date\n }\n\n // YYYY-MM\n token = parseTokenMM.exec(dateString)\n if (token) {\n date = new Date(0)\n month = parseInt(token[1], 10) - 1\n date.setUTCFullYear(year, month)\n return date\n }\n\n // YYYY-DDD or YYYYDDD\n token = parseTokenDDD.exec(dateString)\n if (token) {\n date = new Date(0)\n var dayOfYear = parseInt(token[1], 10)\n date.setUTCFullYear(year, 0, dayOfYear)\n return date\n }\n\n // YYYY-MM-DD or YYYYMMDD\n token = parseTokenMMDD.exec(dateString)\n if (token) {\n date = new Date(0)\n month = parseInt(token[1], 10) - 1\n var day = parseInt(token[2], 10)\n date.setUTCFullYear(year, month, day)\n return date\n }\n\n // YYYY-Www or YYYYWww\n token = parseTokenWww.exec(dateString)\n if (token) {\n week = parseInt(token[1], 10) - 1\n return dayOfISOYear(year, week)\n }\n\n // YYYY-Www-D or YYYYWwwD\n token = parseTokenWwwD.exec(dateString)\n if (token) {\n week = parseInt(token[1], 10) - 1\n var dayOfWeek = parseInt(token[2], 10) - 1\n return dayOfISOYear(year, week, dayOfWeek)\n }\n\n // Invalid ISO-formatted date\n return null\n}\n\nfunction parseTime (timeString) {\n var token\n var hours\n var minutes\n\n // hh\n token = parseTokenHH.exec(timeString)\n if (token) {\n hours = parseFloat(token[1].replace(',', '.'))\n return (hours % 24) * MILLISECONDS_IN_HOUR\n }\n\n // hh:mm or hhmm\n token = parseTokenHHMM.exec(timeString)\n if (token) {\n hours = parseInt(token[1], 10)\n minutes = parseFloat(token[2].replace(',', '.'))\n return (hours % 24) * MILLISECONDS_IN_HOUR +\n minutes * MILLISECONDS_IN_MINUTE\n }\n\n // hh:mm:ss or hhmmss\n token = parseTokenHHMMSS.exec(timeString)\n if (token) {\n hours = parseInt(token[1], 10)\n minutes = parseInt(token[2], 10)\n var seconds = parseFloat(token[3].replace(',', '.'))\n return (hours % 24) * MILLISECONDS_IN_HOUR +\n minutes * MILLISECONDS_IN_MINUTE +\n seconds * 1000\n }\n\n // Invalid ISO-formatted time\n return null\n}\n\nfunction parseTimezone (timezoneString) {\n var token\n var absoluteOffset\n\n // Z\n token = parseTokenTimezoneZ.exec(timezoneString)\n if (token) {\n return 0\n }\n\n // ±hh\n token = parseTokenTimezoneHH.exec(timezoneString)\n if (token) {\n absoluteOffset = parseInt(token[2], 10) * 60\n return (token[1] === '+') ? -absoluteOffset : absoluteOffset\n }\n\n // ±hh:mm or ±hhmm\n token = parseTokenTimezoneHHMM.exec(timezoneString)\n if (token) {\n absoluteOffset = parseInt(token[2], 10) * 60 + parseInt(token[3], 10)\n return (token[1] === '+') ? -absoluteOffset : absoluteOffset\n }\n\n return 0\n}\n\nfunction dayOfISOYear (isoYear, week, day) {\n week = week || 0\n day = day || 0\n var date = new Date(0)\n date.setUTCFullYear(isoYear, 0, 4)\n var fourthOfJanuaryDay = date.getUTCDay() || 7\n var diff = week * 7 + day + 1 - fourthOfJanuaryDay\n date.setUTCDate(date.getUTCDate() + diff)\n return date\n}\n\nmodule.exports = parse\n","var parse = require('../parse/index.js')\n\n/**\n * @category Day Helpers\n * @summary Set the day of the month to the given date.\n *\n * @description\n * Set the day of the month to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} dayOfMonth - the day of the month of the new date\n * @returns {Date} the new date with the day of the month setted\n *\n * @example\n * // Set the 30th day of the month to 1 September 2014:\n * var result = setDate(new Date(2014, 8, 1), 30)\n * //=> Tue Sep 30 2014 00:00:00\n */\nfunction setDate (dirtyDate, dirtyDayOfMonth) {\n var date = parse(dirtyDate)\n var dayOfMonth = Number(dirtyDayOfMonth)\n date.setDate(dayOfMonth)\n return date\n}\n\nmodule.exports = setDate\n","var parse = require('../parse/index.js')\nvar addDays = require('../add_days/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Set the day of the week to the given date.\n *\n * @description\n * Set the day of the week to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} day - the day of the week of the new date\n * @param {Object} [options] - the object with options\n * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @returns {Date} the new date with the day of the week setted\n *\n * @example\n * // Set Sunday to 1 September 2014:\n * var result = setDay(new Date(2014, 8, 1), 0)\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If week starts with Monday, set Sunday to 1 September 2014:\n * var result = setDay(new Date(2014, 8, 1), 0, {weekStartsOn: 1})\n * //=> Sun Sep 07 2014 00:00:00\n */\nfunction setDay (dirtyDate, dirtyDay, dirtyOptions) {\n var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0\n var date = parse(dirtyDate)\n var day = Number(dirtyDay)\n var currentDay = date.getDay()\n\n var remainder = day % 7\n var dayIndex = (remainder + 7) % 7\n\n var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay\n return addDays(date, diff)\n}\n\nmodule.exports = setDay\n","var parse = require('../parse/index.js')\n\n/**\n * @category Day Helpers\n * @summary Set the day of the year to the given date.\n *\n * @description\n * Set the day of the year to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} dayOfYear - the day of the year of the new date\n * @returns {Date} the new date with the day of the year setted\n *\n * @example\n * // Set the 2nd day of the year to 2 July 2014:\n * var result = setDayOfYear(new Date(2014, 6, 2), 2)\n * //=> Thu Jan 02 2014 00:00:00\n */\nfunction setDayOfYear (dirtyDate, dirtyDayOfYear) {\n var date = parse(dirtyDate)\n var dayOfYear = Number(dirtyDayOfYear)\n date.setMonth(0)\n date.setDate(dayOfYear)\n return date\n}\n\nmodule.exports = setDayOfYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Hour Helpers\n * @summary Set the hours to the given date.\n *\n * @description\n * Set the hours to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} hours - the hours of the new date\n * @returns {Date} the new date with the hours setted\n *\n * @example\n * // Set 4 hours to 1 September 2014 11:30:00:\n * var result = setHours(new Date(2014, 8, 1, 11, 30), 4)\n * //=> Mon Sep 01 2014 04:30:00\n */\nfunction setHours (dirtyDate, dirtyHours) {\n var date = parse(dirtyDate)\n var hours = Number(dirtyHours)\n date.setHours(hours)\n return date\n}\n\nmodule.exports = setHours\n","var parse = require('../parse/index.js')\nvar addDays = require('../add_days/index.js')\nvar getISODay = require('../get_iso_day/index.js')\n\n/**\n * @category Weekday Helpers\n * @summary Set the day of the ISO week to the given date.\n *\n * @description\n * Set the day of the ISO week to the given date.\n * ISO week starts with Monday.\n * 7 is the index of Sunday, 1 is the index of Monday etc.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} day - the day of the ISO week of the new date\n * @returns {Date} the new date with the day of the ISO week setted\n *\n * @example\n * // Set Sunday to 1 September 2014:\n * var result = setISODay(new Date(2014, 8, 1), 7)\n * //=> Sun Sep 07 2014 00:00:00\n */\nfunction setISODay (dirtyDate, dirtyDay) {\n var date = parse(dirtyDate)\n var day = Number(dirtyDay)\n var currentDay = getISODay(date)\n var diff = day - currentDay\n return addDays(date, diff)\n}\n\nmodule.exports = setISODay\n","var parse = require('../parse/index.js')\nvar getISOWeek = require('../get_iso_week/index.js')\n\n/**\n * @category ISO Week Helpers\n * @summary Set the ISO week to the given date.\n *\n * @description\n * Set the ISO week to the given date, saving the weekday number.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} isoWeek - the ISO week of the new date\n * @returns {Date} the new date with the ISO week setted\n *\n * @example\n * // Set the 53rd ISO week to 7 August 2004:\n * var result = setISOWeek(new Date(2004, 7, 7), 53)\n * //=> Sat Jan 01 2005 00:00:00\n */\nfunction setISOWeek (dirtyDate, dirtyISOWeek) {\n var date = parse(dirtyDate)\n var isoWeek = Number(dirtyISOWeek)\n var diff = getISOWeek(date) - isoWeek\n date.setDate(date.getDate() - diff * 7)\n return date\n}\n\nmodule.exports = setISOWeek\n","var parse = require('../parse/index.js')\nvar startOfISOYear = require('../start_of_iso_year/index.js')\nvar differenceInCalendarDays = require('../difference_in_calendar_days/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Set the ISO week-numbering year to the given date.\n *\n * @description\n * Set the ISO week-numbering year to the given date,\n * saving the week number and the weekday number.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} isoYear - the ISO week-numbering year of the new date\n * @returns {Date} the new date with the ISO week-numbering year setted\n *\n * @example\n * // Set ISO week-numbering year 2007 to 29 December 2008:\n * var result = setISOYear(new Date(2008, 11, 29), 2007)\n * //=> Mon Jan 01 2007 00:00:00\n */\nfunction setISOYear (dirtyDate, dirtyISOYear) {\n var date = parse(dirtyDate)\n var isoYear = Number(dirtyISOYear)\n var diff = differenceInCalendarDays(date, startOfISOYear(date))\n var fourthOfJanuary = new Date(0)\n fourthOfJanuary.setFullYear(isoYear, 0, 4)\n fourthOfJanuary.setHours(0, 0, 0, 0)\n date = startOfISOYear(fourthOfJanuary)\n date.setDate(date.getDate() + diff)\n return date\n}\n\nmodule.exports = setISOYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Millisecond Helpers\n * @summary Set the milliseconds to the given date.\n *\n * @description\n * Set the milliseconds to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} milliseconds - the milliseconds of the new date\n * @returns {Date} the new date with the milliseconds setted\n *\n * @example\n * // Set 300 milliseconds to 1 September 2014 11:30:40.500:\n * var result = setMilliseconds(new Date(2014, 8, 1, 11, 30, 40, 500), 300)\n * //=> Mon Sep 01 2014 11:30:40.300\n */\nfunction setMilliseconds (dirtyDate, dirtyMilliseconds) {\n var date = parse(dirtyDate)\n var milliseconds = Number(dirtyMilliseconds)\n date.setMilliseconds(milliseconds)\n return date\n}\n\nmodule.exports = setMilliseconds\n","var parse = require('../parse/index.js')\n\n/**\n * @category Minute Helpers\n * @summary Set the minutes to the given date.\n *\n * @description\n * Set the minutes to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} minutes - the minutes of the new date\n * @returns {Date} the new date with the minutes setted\n *\n * @example\n * // Set 45 minutes to 1 September 2014 11:30:40:\n * var result = setMinutes(new Date(2014, 8, 1, 11, 30, 40), 45)\n * //=> Mon Sep 01 2014 11:45:40\n */\nfunction setMinutes (dirtyDate, dirtyMinutes) {\n var date = parse(dirtyDate)\n var minutes = Number(dirtyMinutes)\n date.setMinutes(minutes)\n return date\n}\n\nmodule.exports = setMinutes\n","var parse = require('../parse/index.js')\nvar getDaysInMonth = require('../get_days_in_month/index.js')\n\n/**\n * @category Month Helpers\n * @summary Set the month to the given date.\n *\n * @description\n * Set the month to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} month - the month of the new date\n * @returns {Date} the new date with the month setted\n *\n * @example\n * // Set February to 1 September 2014:\n * var result = setMonth(new Date(2014, 8, 1), 1)\n * //=> Sat Feb 01 2014 00:00:00\n */\nfunction setMonth (dirtyDate, dirtyMonth) {\n var date = parse(dirtyDate)\n var month = Number(dirtyMonth)\n var year = date.getFullYear()\n var day = date.getDate()\n\n var dateWithDesiredMonth = new Date(0)\n dateWithDesiredMonth.setFullYear(year, month, 15)\n dateWithDesiredMonth.setHours(0, 0, 0, 0)\n var daysInMonth = getDaysInMonth(dateWithDesiredMonth)\n // Set the last day of the new month\n // if the original date was the last day of the longer month\n date.setMonth(month, Math.min(day, daysInMonth))\n return date\n}\n\nmodule.exports = setMonth\n","var parse = require('../parse/index.js')\nvar setMonth = require('../set_month/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Set the year quarter to the given date.\n *\n * @description\n * Set the year quarter to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} quarter - the quarter of the new date\n * @returns {Date} the new date with the quarter setted\n *\n * @example\n * // Set the 2nd quarter to 2 July 2014:\n * var result = setQuarter(new Date(2014, 6, 2), 2)\n * //=> Wed Apr 02 2014 00:00:00\n */\nfunction setQuarter (dirtyDate, dirtyQuarter) {\n var date = parse(dirtyDate)\n var quarter = Number(dirtyQuarter)\n var oldQuarter = Math.floor(date.getMonth() / 3) + 1\n var diff = quarter - oldQuarter\n return setMonth(date, date.getMonth() + diff * 3)\n}\n\nmodule.exports = setQuarter\n","var parse = require('../parse/index.js')\n\n/**\n * @category Second Helpers\n * @summary Set the seconds to the given date.\n *\n * @description\n * Set the seconds to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} seconds - the seconds of the new date\n * @returns {Date} the new date with the seconds setted\n *\n * @example\n * // Set 45 seconds to 1 September 2014 11:30:40:\n * var result = setSeconds(new Date(2014, 8, 1, 11, 30, 40), 45)\n * //=> Mon Sep 01 2014 11:30:45\n */\nfunction setSeconds (dirtyDate, dirtySeconds) {\n var date = parse(dirtyDate)\n var seconds = Number(dirtySeconds)\n date.setSeconds(seconds)\n return date\n}\n\nmodule.exports = setSeconds\n","var parse = require('../parse/index.js')\n\n/**\n * @category Year Helpers\n * @summary Set the year to the given date.\n *\n * @description\n * Set the year to the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} year - the year of the new date\n * @returns {Date} the new date with the year setted\n *\n * @example\n * // Set year 2013 to 1 September 2014:\n * var result = setYear(new Date(2014, 8, 1), 2013)\n * //=> Sun Sep 01 2013 00:00:00\n */\nfunction setYear (dirtyDate, dirtyYear) {\n var date = parse(dirtyDate)\n var year = Number(dirtyYear)\n date.setFullYear(year)\n return date\n}\n\nmodule.exports = setYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * var result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nfunction startOfDay (dirtyDate) {\n var date = parse(dirtyDate)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = startOfDay\n","var parse = require('../parse/index.js')\n\n/**\n * @category Hour Helpers\n * @summary Return the start of an hour for the given date.\n *\n * @description\n * Return the start of an hour for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of an hour\n *\n * @example\n * // The start of an hour for 2 September 2014 11:55:00:\n * var result = startOfHour(new Date(2014, 8, 2, 11, 55))\n * //=> Tue Sep 02 2014 11:00:00\n */\nfunction startOfHour (dirtyDate) {\n var date = parse(dirtyDate)\n date.setMinutes(0, 0, 0)\n return date\n}\n\nmodule.exports = startOfHour\n","var startOfWeek = require('../start_of_week/index.js')\n\n/**\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * var result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nfunction startOfISOWeek (dirtyDate) {\n return startOfWeek(dirtyDate, {weekStartsOn: 1})\n}\n\nmodule.exports = startOfISOWeek\n","var getISOYear = require('../get_iso_year/index.js')\nvar startOfISOWeek = require('../start_of_iso_week/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of an ISO year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * var result = startOfISOYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nfunction startOfISOYear (dirtyDate) {\n var year = getISOYear(dirtyDate)\n var fourthOfJanuary = new Date(0)\n fourthOfJanuary.setFullYear(year, 0, 4)\n fourthOfJanuary.setHours(0, 0, 0, 0)\n var date = startOfISOWeek(fourthOfJanuary)\n return date\n}\n\nmodule.exports = startOfISOYear\n","var parse = require('../parse/index.js')\n\n/**\n * @category Minute Helpers\n * @summary Return the start of a minute for the given date.\n *\n * @description\n * Return the start of a minute for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of a minute\n *\n * @example\n * // The start of a minute for 1 December 2014 22:15:45.400:\n * var result = startOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400))\n * //=> Mon Dec 01 2014 22:15:00\n */\nfunction startOfMinute (dirtyDate) {\n var date = parse(dirtyDate)\n date.setSeconds(0, 0)\n return date\n}\n\nmodule.exports = startOfMinute\n","var parse = require('../parse/index.js')\n\n/**\n * @category Month Helpers\n * @summary Return the start of a month for the given date.\n *\n * @description\n * Return the start of a month for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of a month\n *\n * @example\n * // The start of a month for 2 September 2014 11:55:00:\n * var result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nfunction startOfMonth (dirtyDate) {\n var date = parse(dirtyDate)\n date.setDate(1)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = startOfMonth\n","var parse = require('../parse/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Return the start of a year quarter for the given date.\n *\n * @description\n * Return the start of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of a quarter\n *\n * @example\n * // The start of a quarter for 2 September 2014 11:55:00:\n * var result = startOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Jul 01 2014 00:00:00\n */\nfunction startOfQuarter (dirtyDate) {\n var date = parse(dirtyDate)\n var currentMonth = date.getMonth()\n var month = currentMonth - currentMonth % 3\n date.setMonth(month, 1)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = startOfQuarter\n","var parse = require('../parse/index.js')\n\n/**\n * @category Second Helpers\n * @summary Return the start of a second for the given date.\n *\n * @description\n * Return the start of a second for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of a second\n *\n * @example\n * // The start of a second for 1 December 2014 22:15:45.400:\n * var result = startOfSecond(new Date(2014, 11, 1, 22, 15, 45, 400))\n * //=> Mon Dec 01 2014 22:15:45.000\n */\nfunction startOfSecond (dirtyDate) {\n var date = parse(dirtyDate)\n date.setMilliseconds(0)\n return date\n}\n\nmodule.exports = startOfSecond\n","var startOfDay = require('../start_of_day/index.js')\n\n/**\n * @category Day Helpers\n * @summary Return the start of today.\n *\n * @description\n * Return the start of today.\n *\n * @returns {Date} the start of today\n *\n * @example\n * // If today is 6 October 2014:\n * var result = startOfToday()\n * //=> Mon Oct 6 2014 00:00:00\n */\nfunction startOfToday () {\n return startOfDay(new Date())\n}\n\nmodule.exports = startOfToday\n","/**\n * @category Day Helpers\n * @summary Return the start of tomorrow.\n *\n * @description\n * Return the start of tomorrow.\n *\n * @returns {Date} the start of tomorrow\n *\n * @example\n * // If today is 6 October 2014:\n * var result = startOfTomorrow()\n * //=> Tue Oct 7 2014 00:00:00\n */\nfunction startOfTomorrow () {\n var now = new Date()\n var year = now.getFullYear()\n var month = now.getMonth()\n var day = now.getDate()\n\n var date = new Date(0)\n date.setFullYear(year, month, day + 1)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = startOfTomorrow\n","var parse = require('../parse/index.js')\n\n/**\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @param {Object} [options] - the object with options\n * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @returns {Date} the start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1})\n * //=> Mon Sep 01 2014 00:00:00\n */\nfunction startOfWeek (dirtyDate, dirtyOptions) {\n var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0\n\n var date = parse(dirtyDate)\n var day = date.getDay()\n var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn\n\n date.setDate(date.getDate() - diff)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = startOfWeek\n","var parse = require('../parse/index.js')\n\n/**\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @param {Date|String|Number} date - the original date\n * @returns {Date} the start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * var result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nfunction startOfYear (dirtyDate) {\n var cleanDate = parse(dirtyDate)\n var date = new Date(0)\n date.setFullYear(cleanDate.getFullYear(), 0, 1)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = startOfYear\n","/**\n * @category Day Helpers\n * @summary Return the start of yesterday.\n *\n * @description\n * Return the start of yesterday.\n *\n * @returns {Date} the start of yesterday\n *\n * @example\n * // If today is 6 October 2014:\n * var result = startOfYesterday()\n * //=> Sun Oct 5 2014 00:00:00\n */\nfunction startOfYesterday () {\n var now = new Date()\n var year = now.getFullYear()\n var month = now.getMonth()\n var day = now.getDate()\n\n var date = new Date(0)\n date.setFullYear(year, month, day - 1)\n date.setHours(0, 0, 0, 0)\n return date\n}\n\nmodule.exports = startOfYesterday\n","var addDays = require('../add_days/index.js')\n\n/**\n * @category Day Helpers\n * @summary Subtract the specified number of days from the given date.\n *\n * @description\n * Subtract the specified number of days from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of days to be subtracted\n * @returns {Date} the new date with the days subtracted\n *\n * @example\n * // Subtract 10 days from 1 September 2014:\n * var result = subDays(new Date(2014, 8, 1), 10)\n * //=> Fri Aug 22 2014 00:00:00\n */\nfunction subDays (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addDays(dirtyDate, -amount)\n}\n\nmodule.exports = subDays\n","var addHours = require('../add_hours/index.js')\n\n/**\n * @category Hour Helpers\n * @summary Subtract the specified number of hours from the given date.\n *\n * @description\n * Subtract the specified number of hours from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of hours to be subtracted\n * @returns {Date} the new date with the hours subtracted\n *\n * @example\n * // Subtract 2 hours from 11 July 2014 01:00:00:\n * var result = subHours(new Date(2014, 6, 11, 1, 0), 2)\n * //=> Thu Jul 10 2014 23:00:00\n */\nfunction subHours (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addHours(dirtyDate, -amount)\n}\n\nmodule.exports = subHours\n","var addISOYears = require('../add_iso_years/index.js')\n\n/**\n * @category ISO Week-Numbering Year Helpers\n * @summary Subtract the specified number of ISO week-numbering years from the given date.\n *\n * @description\n * Subtract the specified number of ISO week-numbering years from the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of ISO week-numbering years to be subtracted\n * @returns {Date} the new date with the ISO week-numbering years subtracted\n *\n * @example\n * // Subtract 5 ISO week-numbering years from 1 September 2014:\n * var result = subISOYears(new Date(2014, 8, 1), 5)\n * //=> Mon Aug 31 2009 00:00:00\n */\nfunction subISOYears (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addISOYears(dirtyDate, -amount)\n}\n\nmodule.exports = subISOYears\n","var addMilliseconds = require('../add_milliseconds/index.js')\n\n/**\n * @category Millisecond Helpers\n * @summary Subtract the specified number of milliseconds from the given date.\n *\n * @description\n * Subtract the specified number of milliseconds from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of milliseconds to be subtracted\n * @returns {Date} the new date with the milliseconds subtracted\n *\n * @example\n * // Subtract 750 milliseconds from 10 July 2014 12:45:30.000:\n * var result = subMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:29.250\n */\nfunction subMilliseconds (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addMilliseconds(dirtyDate, -amount)\n}\n\nmodule.exports = subMilliseconds\n","var addMinutes = require('../add_minutes/index.js')\n\n/**\n * @category Minute Helpers\n * @summary Subtract the specified number of minutes from the given date.\n *\n * @description\n * Subtract the specified number of minutes from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of minutes to be subtracted\n * @returns {Date} the new date with the mintues subtracted\n *\n * @example\n * // Subtract 30 minutes from 10 July 2014 12:00:00:\n * var result = subMinutes(new Date(2014, 6, 10, 12, 0), 30)\n * //=> Thu Jul 10 2014 11:30:00\n */\nfunction subMinutes (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addMinutes(dirtyDate, -amount)\n}\n\nmodule.exports = subMinutes\n","var addMonths = require('../add_months/index.js')\n\n/**\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of months to be subtracted\n * @returns {Date} the new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * var result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nfunction subMonths (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addMonths(dirtyDate, -amount)\n}\n\nmodule.exports = subMonths\n","var addQuarters = require('../add_quarters/index.js')\n\n/**\n * @category Quarter Helpers\n * @summary Subtract the specified number of year quarters from the given date.\n *\n * @description\n * Subtract the specified number of year quarters from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of quarters to be subtracted\n * @returns {Date} the new date with the quarters subtracted\n *\n * @example\n * // Subtract 3 quarters from 1 September 2014:\n * var result = subQuarters(new Date(2014, 8, 1), 3)\n * //=> Sun Dec 01 2013 00:00:00\n */\nfunction subQuarters (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addQuarters(dirtyDate, -amount)\n}\n\nmodule.exports = subQuarters\n","var addSeconds = require('../add_seconds/index.js')\n\n/**\n * @category Second Helpers\n * @summary Subtract the specified number of seconds from the given date.\n *\n * @description\n * Subtract the specified number of seconds from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of seconds to be subtracted\n * @returns {Date} the new date with the seconds subtracted\n *\n * @example\n * // Subtract 30 seconds from 10 July 2014 12:45:00:\n * var result = subSeconds(new Date(2014, 6, 10, 12, 45, 0), 30)\n * //=> Thu Jul 10 2014 12:44:30\n */\nfunction subSeconds (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addSeconds(dirtyDate, -amount)\n}\n\nmodule.exports = subSeconds\n","var addWeeks = require('../add_weeks/index.js')\n\n/**\n * @category Week Helpers\n * @summary Subtract the specified number of weeks from the given date.\n *\n * @description\n * Subtract the specified number of weeks from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of weeks to be subtracted\n * @returns {Date} the new date with the weeks subtracted\n *\n * @example\n * // Subtract 4 weeks from 1 September 2014:\n * var result = subWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Aug 04 2014 00:00:00\n */\nfunction subWeeks (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addWeeks(dirtyDate, -amount)\n}\n\nmodule.exports = subWeeks\n","var addYears = require('../add_years/index.js')\n\n/**\n * @category Year Helpers\n * @summary Subtract the specified number of years from the given date.\n *\n * @description\n * Subtract the specified number of years from the given date.\n *\n * @param {Date|String|Number} date - the date to be changed\n * @param {Number} amount - the amount of years to be subtracted\n * @returns {Date} the new date with the years subtracted\n *\n * @example\n * // Subtract 5 years from 1 September 2014:\n * var result = subYears(new Date(2014, 8, 1), 5)\n * //=> Tue Sep 01 2009 00:00:00\n */\nfunction subYears (dirtyDate, dirtyAmount) {\n var amount = Number(dirtyAmount)\n return addYears(dirtyDate, -amount)\n}\n\nmodule.exports = subYears\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/cypress/fixtures/v3-client/e21224eb684dfa21443683a3fc963a3b.ttf b/cypress/fixtures/v3-client/e21224eb684dfa21443683a3fc963a3b.ttf deleted file mode 100644 index 4a2666ebc895ef931cc3c4ded5f5770751657461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110840 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 M?Q^B-Y^*W=3&}G`E&u=k diff --git a/cypress/fixtures/v3-client/e3a2c12708311d5e47193da456ccdcba.eot b/cypress/fixtures/v3-client/e3a2c12708311d5e47193da456ccdcba.eot deleted file mode 100644 index d9e41e93eb17341ae36c9965ecd0062cab30acd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6716 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 E2CL2Uy#N3J diff --git a/cypress/fixtures/v3-client/ecbe95f309be4cee7aa3f894386282f6.ttf b/cypress/fixtures/v3-client/ecbe95f309be4cee7aa3f894386282f6.ttf deleted file mode 100644 index deae781f89f5dba639aa958ec7858818ac8ce59a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160548 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�y2>dK0rd)!lg2a4D;A0>$ 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 diff --git a/cypress/fixtures/v3-client/f862b0f4608b4f0fb945113ef8dcdfa3.woff2 b/cypress/fixtures/v3-client/f862b0f4608b4f0fb945113ef8dcdfa3.woff2 deleted file mode 100644 index 5d6dd4daf2ad6aae6618a5a1e145dba5edfea747..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59604 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 z 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 g9ioM*P__Ng;j?b{)F)1ypu3}f^FHwT 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 XE_W5ATLJ#d=ER*_+BXYS9tQkBG~t9g diff --git a/cypress/fixtures/v3-client/icon_192x192.02182e390dd5bfda29a85b4ed8ee99e4.png b/cypress/fixtures/v3-client/icon_192x192.02182e390dd5bfda29a85b4ed8ee99e4.png deleted file mode 100644 index ab5ecc3da099ac43f3221b954779bd1da7d1c463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16256 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 A8UO$Q diff --git a/cypress/fixtures/v3-client/icon_256x256.472eb7710503d2d60f634bdbd0a6f6bc.png b/cypress/fixtures/v3-client/icon_256x256.472eb7710503d2d60f634bdbd0a6f6bc.png deleted file mode 100644 index 10949e8c7a41eca1bfba92219222b9fcce2fdc59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25444 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

    ^7L=*SVgq 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 X;N8fr$VlKHg)?d@+K-Bqo(29N!H5?3 diff --git a/cypress/fixtures/v3-client/index.html b/cypress/fixtures/v3-client/index.html deleted file mode 100644 index b0d4482b..00000000 --- a/cypress/fixtures/v3-client/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - Padloc - - - - - - - - - - - - - - diff --git a/cypress/fixtures/v3-client/jsqr.chunk.js b/cypress/fixtures/v3-client/jsqr.chunk.js deleted file mode 100644 index dbed4ae8..00000000 --- a/cypress/fixtures/v3-client/jsqr.chunk.js +++ /dev/null @@ -1,10050 +0,0 @@ -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["jsqr"],{ - -/***/ "../app/node_modules/jsqr/dist/jsQR.js": -/*!*********************************************!*\ - !*** ../app/node_modules/jsqr/dist/jsQR.js ***! - \*********************************************/ -/***/ (function(module) { - -(function webpackUniversalModuleDefinition(root, factory) { - if(true) - module.exports = factory(); - else {} -})(typeof self !== 'undefined' ? self : this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __nested_webpack_require_568__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_568__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __nested_webpack_require_568__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __nested_webpack_require_568__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __nested_webpack_require_568__.d = function(exports, name, getter) { -/******/ if(!__nested_webpack_require_568__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __nested_webpack_require_568__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __nested_webpack_require_568__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __nested_webpack_require_568__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __nested_webpack_require_568__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __nested_webpack_require_568__(__nested_webpack_require_568__.s = 3); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var BitMatrix = /** @class */ (function () { - function BitMatrix(data, width) { - this.width = width; - this.height = data.length / width; - this.data = data; - } - BitMatrix.createEmpty = function (width, height) { - return new BitMatrix(new Uint8ClampedArray(width * height), width); - }; - BitMatrix.prototype.get = function (x, y) { - if (x < 0 || x >= this.width || y < 0 || y >= this.height) { - return false; - } - return !!this.data[y * this.width + x]; - }; - BitMatrix.prototype.set = function (x, y, v) { - this.data[y * this.width + x] = v ? 1 : 0; - }; - BitMatrix.prototype.setRegion = function (left, top, width, height, v) { - for (var y = top; y < top + height; y++) { - for (var x = left; x < left + width; x++) { - this.set(x, y, !!v); - } - } - }; - return BitMatrix; -}()); -exports.BitMatrix = BitMatrix; - - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __nested_webpack_require_3952__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var GenericGFPoly_1 = __nested_webpack_require_3952__(2); -function addOrSubtractGF(a, b) { - return a ^ b; // tslint:disable-line:no-bitwise -} -exports.addOrSubtractGF = addOrSubtractGF; -var GenericGF = /** @class */ (function () { - function GenericGF(primitive, size, genBase) { - this.primitive = primitive; - this.size = size; - this.generatorBase = genBase; - this.expTable = new Array(this.size); - this.logTable = new Array(this.size); - var x = 1; - for (var i = 0; i < this.size; i++) { - this.expTable[i] = x; - x = x * 2; - if (x >= this.size) { - x = (x ^ this.primitive) & (this.size - 1); // tslint:disable-line:no-bitwise - } - } - for (var i = 0; i < this.size - 1; i++) { - this.logTable[this.expTable[i]] = i; - } - this.zero = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([0])); - this.one = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([1])); - } - GenericGF.prototype.multiply = function (a, b) { - if (a === 0 || b === 0) { - return 0; - } - return this.expTable[(this.logTable[a] + this.logTable[b]) % (this.size - 1)]; - }; - GenericGF.prototype.inverse = function (a) { - if (a === 0) { - throw new Error("Can't invert 0"); - } - return this.expTable[this.size - this.logTable[a] - 1]; - }; - GenericGF.prototype.buildMonomial = function (degree, coefficient) { - if (degree < 0) { - throw new Error("Invalid monomial degree less than 0"); - } - if (coefficient === 0) { - return this.zero; - } - var coefficients = new Uint8ClampedArray(degree + 1); - coefficients[0] = coefficient; - return new GenericGFPoly_1.default(this, coefficients); - }; - GenericGF.prototype.log = function (a) { - if (a === 0) { - throw new Error("Can't take log(0)"); - } - return this.logTable[a]; - }; - GenericGF.prototype.exp = function (a) { - return this.expTable[a]; - }; - return GenericGF; -}()); -exports.default = GenericGF; - - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __nested_webpack_require_6272__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var GenericGF_1 = __nested_webpack_require_6272__(1); -var GenericGFPoly = /** @class */ (function () { - function GenericGFPoly(field, coefficients) { - if (coefficients.length === 0) { - throw new Error("No coefficients."); - } - this.field = field; - var coefficientsLength = coefficients.length; - if (coefficientsLength > 1 && coefficients[0] === 0) { - // Leading term must be non-zero for anything except the constant polynomial "0" - var firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] === 0) { - firstNonZero++; - } - if (firstNonZero === coefficientsLength) { - this.coefficients = field.zero.coefficients; - } - else { - this.coefficients = new Uint8ClampedArray(coefficientsLength - firstNonZero); - for (var i = 0; i < this.coefficients.length; i++) { - this.coefficients[i] = coefficients[firstNonZero + i]; - } - } - } - else { - this.coefficients = coefficients; - } - } - GenericGFPoly.prototype.degree = function () { - return this.coefficients.length - 1; - }; - GenericGFPoly.prototype.isZero = function () { - return this.coefficients[0] === 0; - }; - GenericGFPoly.prototype.getCoefficient = function (degree) { - return this.coefficients[this.coefficients.length - 1 - degree]; - }; - GenericGFPoly.prototype.addOrSubtract = function (other) { - if (this.isZero()) { - return other; - } - if (other.isZero()) { - return this; - } - var smallerCoefficients = this.coefficients; - var largerCoefficients = other.coefficients; - if (smallerCoefficients.length > largerCoefficients.length) { - _a = [largerCoefficients, smallerCoefficients], smallerCoefficients = _a[0], largerCoefficients = _a[1]; - } - var sumDiff = new Uint8ClampedArray(largerCoefficients.length); - var lengthDiff = largerCoefficients.length - smallerCoefficients.length; - for (var i = 0; i < lengthDiff; i++) { - sumDiff[i] = largerCoefficients[i]; - } - for (var i = lengthDiff; i < largerCoefficients.length; i++) { - sumDiff[i] = GenericGF_1.addOrSubtractGF(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); - } - return new GenericGFPoly(this.field, sumDiff); - var _a; - }; - GenericGFPoly.prototype.multiply = function (scalar) { - if (scalar === 0) { - return this.field.zero; - } - if (scalar === 1) { - return this; - } - var size = this.coefficients.length; - var product = new Uint8ClampedArray(size); - for (var i = 0; i < size; i++) { - product[i] = this.field.multiply(this.coefficients[i], scalar); - } - return new GenericGFPoly(this.field, product); - }; - GenericGFPoly.prototype.multiplyPoly = function (other) { - if (this.isZero() || other.isZero()) { - return this.field.zero; - } - var aCoefficients = this.coefficients; - var aLength = aCoefficients.length; - var bCoefficients = other.coefficients; - var bLength = bCoefficients.length; - var product = new Uint8ClampedArray(aLength + bLength - 1); - for (var i = 0; i < aLength; i++) { - var aCoeff = aCoefficients[i]; - for (var j = 0; j < bLength; j++) { - product[i + j] = GenericGF_1.addOrSubtractGF(product[i + j], this.field.multiply(aCoeff, bCoefficients[j])); - } - } - return new GenericGFPoly(this.field, product); - }; - GenericGFPoly.prototype.multiplyByMonomial = function (degree, coefficient) { - if (degree < 0) { - throw new Error("Invalid degree less than 0"); - } - if (coefficient === 0) { - return this.field.zero; - } - var size = this.coefficients.length; - var product = new Uint8ClampedArray(size + degree); - for (var i = 0; i < size; i++) { - product[i] = this.field.multiply(this.coefficients[i], coefficient); - } - return new GenericGFPoly(this.field, product); - }; - GenericGFPoly.prototype.evaluateAt = function (a) { - var result = 0; - if (a === 0) { - // Just return the x^0 coefficient - return this.getCoefficient(0); - } - var size = this.coefficients.length; - if (a === 1) { - // Just the sum of the coefficients - this.coefficients.forEach(function (coefficient) { - result = GenericGF_1.addOrSubtractGF(result, coefficient); - }); - return result; - } - result = this.coefficients[0]; - for (var i = 1; i < size; i++) { - result = GenericGF_1.addOrSubtractGF(this.field.multiply(a, result), this.coefficients[i]); - } - return result; - }; - return GenericGFPoly; -}()); -exports.default = GenericGFPoly; - - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __nested_webpack_require_11547__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var binarizer_1 = __nested_webpack_require_11547__(4); -var decoder_1 = __nested_webpack_require_11547__(5); -var extractor_1 = __nested_webpack_require_11547__(11); -var locator_1 = __nested_webpack_require_11547__(12); -function scan(matrix) { - var location = locator_1.locate(matrix); - if (!location) { - return null; - } - var extracted = extractor_1.extract(matrix, location); - var decoded = decoder_1.decode(extracted.matrix); - if (!decoded) { - return null; - } - return { - binaryData: decoded.bytes, - data: decoded.text, - chunks: decoded.chunks, - location: { - topRightCorner: extracted.mappingFunction(location.dimension, 0), - topLeftCorner: extracted.mappingFunction(0, 0), - bottomRightCorner: extracted.mappingFunction(location.dimension, location.dimension), - bottomLeftCorner: extracted.mappingFunction(0, location.dimension), - topRightFinderPattern: location.topRight, - topLeftFinderPattern: location.topLeft, - bottomLeftFinderPattern: location.bottomLeft, - bottomRightAlignmentPattern: location.alignmentPattern, - }, - }; -} -var defaultOptions = { - inversionAttempts: "attemptBoth", -}; -function jsQR(data, width, height, providedOptions) { - if (providedOptions === void 0) { providedOptions = {}; } - var options = defaultOptions; - Object.keys(options || {}).forEach(function (opt) { - options[opt] = providedOptions[opt] || options[opt]; - }); - var shouldInvert = options.inversionAttempts === "attemptBoth" || options.inversionAttempts === "invertFirst"; - var tryInvertedFirst = options.inversionAttempts === "onlyInvert" || options.inversionAttempts === "invertFirst"; - var _a = binarizer_1.binarize(data, width, height, shouldInvert), binarized = _a.binarized, inverted = _a.inverted; - var result = scan(tryInvertedFirst ? inverted : binarized); - if (!result && (options.inversionAttempts === "attemptBoth" || options.inversionAttempts === "invertFirst")) { - result = scan(tryInvertedFirst ? binarized : inverted); - } - return result; -} -jsQR.default = jsQR; -exports.default = jsQR; - - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __nested_webpack_require_13848__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var BitMatrix_1 = __nested_webpack_require_13848__(0); -var REGION_SIZE = 8; -var MIN_DYNAMIC_RANGE = 24; -function numBetween(value, min, max) { - return value < min ? min : value > max ? max : value; -} -// Like BitMatrix but accepts arbitry Uint8 values -var Matrix = /** @class */ (function () { - function Matrix(width, height) { - this.width = width; - this.data = new Uint8ClampedArray(width * height); - } - Matrix.prototype.get = function (x, y) { - return this.data[y * this.width + x]; - }; - Matrix.prototype.set = function (x, y, value) { - this.data[y * this.width + x] = value; - }; - return Matrix; -}()); -function binarize(data, width, height, returnInverted) { - if (data.length !== width * height * 4) { - throw new Error("Malformed data passed to binarizer."); - } - // Convert image to greyscale - var greyscalePixels = new Matrix(width, height); - for (var x = 0; x < width; x++) { - for (var y = 0; y < height; y++) { - var r = data[((y * width + x) * 4) + 0]; - var g = data[((y * width + x) * 4) + 1]; - var b = data[((y * width + x) * 4) + 2]; - greyscalePixels.set(x, y, 0.2126 * r + 0.7152 * g + 0.0722 * b); - } - } - var horizontalRegionCount = Math.ceil(width / REGION_SIZE); - var verticalRegionCount = Math.ceil(height / REGION_SIZE); - var blackPoints = new Matrix(horizontalRegionCount, verticalRegionCount); - for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) { - for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) { - var sum = 0; - var min = Infinity; - var max = 0; - for (var y = 0; y < REGION_SIZE; y++) { - for (var x = 0; x < REGION_SIZE; x++) { - var pixelLumosity = greyscalePixels.get(hortizontalRegion * REGION_SIZE + x, verticalRegion * REGION_SIZE + y); - sum += pixelLumosity; - min = Math.min(min, pixelLumosity); - max = Math.max(max, pixelLumosity); - } - } - var average = sum / (Math.pow(REGION_SIZE, 2)); - if (max - min <= MIN_DYNAMIC_RANGE) { - // If variation within the block is low, assume this is a block with only light or only - // dark pixels. In that case we do not want to use the average, as it would divide this - // low contrast area into black and white pixels, essentially creating data out of noise. - // - // Default the blackpoint for these blocks to be half the min - effectively white them out - average = min / 2; - if (verticalRegion > 0 && hortizontalRegion > 0) { - // Correct the "white background" assumption for blocks that have neighbors by comparing - // the pixels in this block to the previously calculated black points. This is based on - // the fact that dark barcode symbology is always surrounded by some amount of light - // background for which reasonable black point estimates were made. The bp estimated at - // the boundaries is used for the interior. - // The (min < bp) is arbitrary but works better than other heuristics that were tried. - var averageNeighborBlackPoint = (blackPoints.get(hortizontalRegion, verticalRegion - 1) + - (2 * blackPoints.get(hortizontalRegion - 1, verticalRegion)) + - blackPoints.get(hortizontalRegion - 1, verticalRegion - 1)) / 4; - if (min < averageNeighborBlackPoint) { - average = averageNeighborBlackPoint; - } - } - } - blackPoints.set(hortizontalRegion, verticalRegion, average); - } - } - var binarized = BitMatrix_1.BitMatrix.createEmpty(width, height); - var inverted = null; - if (returnInverted) { - inverted = BitMatrix_1.BitMatrix.createEmpty(width, height); - } - for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) { - for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) { - var left = numBetween(hortizontalRegion, 2, horizontalRegionCount - 3); - var top_1 = numBetween(verticalRegion, 2, verticalRegionCount - 3); - var sum = 0; - for (var xRegion = -2; xRegion <= 2; xRegion++) { - for (var yRegion = -2; yRegion <= 2; yRegion++) { - sum += blackPoints.get(left + xRegion, top_1 + yRegion); - } - } - var threshold = sum / 25; - for (var xRegion = 0; xRegion < REGION_SIZE; xRegion++) { - for (var yRegion = 0; yRegion < REGION_SIZE; yRegion++) { - var x = hortizontalRegion * REGION_SIZE + xRegion; - var y = verticalRegion * REGION_SIZE + yRegion; - var lum = greyscalePixels.get(x, y); - binarized.set(x, y, lum <= threshold); - if (returnInverted) { - inverted.set(x, y, !(lum <= threshold)); - } - } - } - } - } - if (returnInverted) { - return { binarized: binarized, inverted: inverted }; - } - return { binarized: binarized }; -} -exports.binarize = binarize; - - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __nested_webpack_require_19544__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var BitMatrix_1 = __nested_webpack_require_19544__(0); -var decodeData_1 = __nested_webpack_require_19544__(6); -var reedsolomon_1 = __nested_webpack_require_19544__(9); -var version_1 = __nested_webpack_require_19544__(10); -// tslint:disable:no-bitwise -function numBitsDiffering(x, y) { - var z = x ^ y; - var bitCount = 0; - while (z) { - bitCount++; - z &= z - 1; - } - return bitCount; -} -function pushBit(bit, byte) { - return (byte << 1) | bit; -} -// tslint:enable:no-bitwise -var FORMAT_INFO_TABLE = [ - { bits: 0x5412, formatInfo: { errorCorrectionLevel: 1, dataMask: 0 } }, - { bits: 0x5125, formatInfo: { errorCorrectionLevel: 1, dataMask: 1 } }, - { bits: 0x5E7C, formatInfo: { errorCorrectionLevel: 1, dataMask: 2 } }, - { bits: 0x5B4B, formatInfo: { errorCorrectionLevel: 1, dataMask: 3 } }, - { bits: 0x45F9, formatInfo: { errorCorrectionLevel: 1, dataMask: 4 } }, - { bits: 0x40CE, formatInfo: { errorCorrectionLevel: 1, dataMask: 5 } }, - { bits: 0x4F97, formatInfo: { errorCorrectionLevel: 1, dataMask: 6 } }, - { bits: 0x4AA0, formatInfo: { errorCorrectionLevel: 1, dataMask: 7 } }, - { bits: 0x77C4, formatInfo: { errorCorrectionLevel: 0, dataMask: 0 } }, - { bits: 0x72F3, formatInfo: { errorCorrectionLevel: 0, dataMask: 1 } }, - { bits: 0x7DAA, formatInfo: { errorCorrectionLevel: 0, dataMask: 2 } }, - { bits: 0x789D, formatInfo: { errorCorrectionLevel: 0, dataMask: 3 } }, - { bits: 0x662F, formatInfo: { errorCorrectionLevel: 0, dataMask: 4 } }, - { bits: 0x6318, formatInfo: { errorCorrectionLevel: 0, dataMask: 5 } }, - { bits: 0x6C41, formatInfo: { errorCorrectionLevel: 0, dataMask: 6 } }, - { bits: 0x6976, formatInfo: { errorCorrectionLevel: 0, dataMask: 7 } }, - { bits: 0x1689, formatInfo: { errorCorrectionLevel: 3, dataMask: 0 } }, - { bits: 0x13BE, formatInfo: { errorCorrectionLevel: 3, dataMask: 1 } }, - { bits: 0x1CE7, formatInfo: { errorCorrectionLevel: 3, dataMask: 2 } }, - { bits: 0x19D0, formatInfo: { errorCorrectionLevel: 3, dataMask: 3 } }, - { bits: 0x0762, formatInfo: { errorCorrectionLevel: 3, dataMask: 4 } }, - { bits: 0x0255, formatInfo: { errorCorrectionLevel: 3, dataMask: 5 } }, - { bits: 0x0D0C, formatInfo: { errorCorrectionLevel: 3, dataMask: 6 } }, - { bits: 0x083B, formatInfo: { errorCorrectionLevel: 3, dataMask: 7 } }, - { bits: 0x355F, formatInfo: { errorCorrectionLevel: 2, dataMask: 0 } }, - { bits: 0x3068, formatInfo: { errorCorrectionLevel: 2, dataMask: 1 } }, - { bits: 0x3F31, formatInfo: { errorCorrectionLevel: 2, dataMask: 2 } }, - { bits: 0x3A06, formatInfo: { errorCorrectionLevel: 2, dataMask: 3 } }, - { bits: 0x24B4, formatInfo: { errorCorrectionLevel: 2, dataMask: 4 } }, - { bits: 0x2183, formatInfo: { errorCorrectionLevel: 2, dataMask: 5 } }, - { bits: 0x2EDA, formatInfo: { errorCorrectionLevel: 2, dataMask: 6 } }, - { bits: 0x2BED, formatInfo: { errorCorrectionLevel: 2, dataMask: 7 } }, -]; -var DATA_MASKS = [ - function (p) { return ((p.y + p.x) % 2) === 0; }, - function (p) { return (p.y % 2) === 0; }, - function (p) { return p.x % 3 === 0; }, - function (p) { return (p.y + p.x) % 3 === 0; }, - function (p) { return (Math.floor(p.y / 2) + Math.floor(p.x / 3)) % 2 === 0; }, - function (p) { return ((p.x * p.y) % 2) + ((p.x * p.y) % 3) === 0; }, - function (p) { return ((((p.y * p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; }, - function (p) { return ((((p.y + p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; }, -]; -function buildFunctionPatternMask(version) { - var dimension = 17 + 4 * version.versionNumber; - var matrix = BitMatrix_1.BitMatrix.createEmpty(dimension, dimension); - matrix.setRegion(0, 0, 9, 9, true); // Top left finder pattern + separator + format - matrix.setRegion(dimension - 8, 0, 8, 9, true); // Top right finder pattern + separator + format - matrix.setRegion(0, dimension - 8, 9, 8, true); // Bottom left finder pattern + separator + format - // Alignment patterns - for (var _i = 0, _a = version.alignmentPatternCenters; _i < _a.length; _i++) { - var x = _a[_i]; - for (var _b = 0, _c = version.alignmentPatternCenters; _b < _c.length; _b++) { - var y = _c[_b]; - if (!(x === 6 && y === 6 || x === 6 && y === dimension - 7 || x === dimension - 7 && y === 6)) { - matrix.setRegion(x - 2, y - 2, 5, 5, true); - } - } - } - matrix.setRegion(6, 9, 1, dimension - 17, true); // Vertical timing pattern - matrix.setRegion(9, 6, dimension - 17, 1, true); // Horizontal timing pattern - if (version.versionNumber > 6) { - matrix.setRegion(dimension - 11, 0, 3, 6, true); // Version info, top right - matrix.setRegion(0, dimension - 11, 6, 3, true); // Version info, bottom left - } - return matrix; -} -function readCodewords(matrix, version, formatInfo) { - var dataMask = DATA_MASKS[formatInfo.dataMask]; - var dimension = matrix.height; - var functionPatternMask = buildFunctionPatternMask(version); - var codewords = []; - var currentByte = 0; - var bitsRead = 0; - // Read columns in pairs, from right to left - var readingUp = true; - for (var columnIndex = dimension - 1; columnIndex > 0; columnIndex -= 2) { - if (columnIndex === 6) { - columnIndex--; - } - for (var i = 0; i < dimension; i++) { - var y = readingUp ? dimension - 1 - i : i; - for (var columnOffset = 0; columnOffset < 2; columnOffset++) { - var x = columnIndex - columnOffset; - if (!functionPatternMask.get(x, y)) { - bitsRead++; - var bit = matrix.get(x, y); - if (dataMask({ y: y, x: x })) { - bit = !bit; - } - currentByte = pushBit(bit, currentByte); - if (bitsRead === 8) { - codewords.push(currentByte); - bitsRead = 0; - currentByte = 0; - } - } - } - } - readingUp = !readingUp; - } - return codewords; -} -function readVersion(matrix) { - var dimension = matrix.height; - var provisionalVersion = Math.floor((dimension - 17) / 4); - if (provisionalVersion <= 6) { - return version_1.VERSIONS[provisionalVersion - 1]; - } - var topRightVersionBits = 0; - for (var y = 5; y >= 0; y--) { - for (var x = dimension - 9; x >= dimension - 11; x--) { - topRightVersionBits = pushBit(matrix.get(x, y), topRightVersionBits); - } - } - var bottomLeftVersionBits = 0; - for (var x = 5; x >= 0; x--) { - for (var y = dimension - 9; y >= dimension - 11; y--) { - bottomLeftVersionBits = pushBit(matrix.get(x, y), bottomLeftVersionBits); - } - } - var bestDifference = Infinity; - var bestVersion; - for (var _i = 0, VERSIONS_1 = version_1.VERSIONS; _i < VERSIONS_1.length; _i++) { - var version = VERSIONS_1[_i]; - if (version.infoBits === topRightVersionBits || version.infoBits === bottomLeftVersionBits) { - return version; - } - var difference = numBitsDiffering(topRightVersionBits, version.infoBits); - if (difference < bestDifference) { - bestVersion = version; - bestDifference = difference; - } - difference = numBitsDiffering(bottomLeftVersionBits, version.infoBits); - if (difference < bestDifference) { - bestVersion = version; - bestDifference = difference; - } - } - // We can tolerate up to 3 bits of error since no two version info codewords will - // differ in less than 8 bits. - if (bestDifference <= 3) { - return bestVersion; - } -} -function readFormatInformation(matrix) { - var topLeftFormatInfoBits = 0; - for (var x = 0; x <= 8; x++) { - if (x !== 6) { - topLeftFormatInfoBits = pushBit(matrix.get(x, 8), topLeftFormatInfoBits); - } - } - for (var y = 7; y >= 0; y--) { - if (y !== 6) { - topLeftFormatInfoBits = pushBit(matrix.get(8, y), topLeftFormatInfoBits); - } - } - var dimension = matrix.height; - var topRightBottomRightFormatInfoBits = 0; - for (var y = dimension - 1; y >= dimension - 7; y--) { - topRightBottomRightFormatInfoBits = pushBit(matrix.get(8, y), topRightBottomRightFormatInfoBits); - } - for (var x = dimension - 8; x < dimension; x++) { - topRightBottomRightFormatInfoBits = pushBit(matrix.get(x, 8), topRightBottomRightFormatInfoBits); - } - var bestDifference = Infinity; - var bestFormatInfo = null; - for (var _i = 0, FORMAT_INFO_TABLE_1 = FORMAT_INFO_TABLE; _i < FORMAT_INFO_TABLE_1.length; _i++) { - var _a = FORMAT_INFO_TABLE_1[_i], bits = _a.bits, formatInfo = _a.formatInfo; - if (bits === topLeftFormatInfoBits || bits === topRightBottomRightFormatInfoBits) { - return formatInfo; - } - var difference = numBitsDiffering(topLeftFormatInfoBits, bits); - if (difference < bestDifference) { - bestFormatInfo = formatInfo; - bestDifference = difference; - } - if (topLeftFormatInfoBits !== topRightBottomRightFormatInfoBits) { - difference = numBitsDiffering(topRightBottomRightFormatInfoBits, bits); - if (difference < bestDifference) { - bestFormatInfo = formatInfo; - bestDifference = difference; - } - } - } - // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits differing means we found a match - if (bestDifference <= 3) { - return bestFormatInfo; - } - return null; -} -function getDataBlocks(codewords, version, ecLevel) { - var ecInfo = version.errorCorrectionLevels[ecLevel]; - var dataBlocks = []; - var totalCodewords = 0; - ecInfo.ecBlocks.forEach(function (block) { - for (var i = 0; i < block.numBlocks; i++) { - dataBlocks.push({ numDataCodewords: block.dataCodewordsPerBlock, codewords: [] }); - totalCodewords += block.dataCodewordsPerBlock + ecInfo.ecCodewordsPerBlock; - } - }); - // In some cases the QR code will be malformed enough that we pull off more or less than we should. - // If we pull off less there's nothing we can do. - // If we pull off more we can safely truncate - if (codewords.length < totalCodewords) { - return null; - } - codewords = codewords.slice(0, totalCodewords); - var shortBlockSize = ecInfo.ecBlocks[0].dataCodewordsPerBlock; - // Pull codewords to fill the blocks up to the minimum size - for (var i = 0; i < shortBlockSize; i++) { - for (var _i = 0, dataBlocks_1 = dataBlocks; _i < dataBlocks_1.length; _i++) { - var dataBlock = dataBlocks_1[_i]; - dataBlock.codewords.push(codewords.shift()); - } - } - // If there are any large blocks, pull codewords to fill the last element of those - if (ecInfo.ecBlocks.length > 1) { - var smallBlockCount = ecInfo.ecBlocks[0].numBlocks; - var largeBlockCount = ecInfo.ecBlocks[1].numBlocks; - for (var i = 0; i < largeBlockCount; i++) { - dataBlocks[smallBlockCount + i].codewords.push(codewords.shift()); - } - } - // Add the rest of the codewords to the blocks. These are the error correction codewords. - while (codewords.length > 0) { - for (var _a = 0, dataBlocks_2 = dataBlocks; _a < dataBlocks_2.length; _a++) { - var dataBlock = dataBlocks_2[_a]; - dataBlock.codewords.push(codewords.shift()); - } - } - return dataBlocks; -} -function decodeMatrix(matrix) { - var version = readVersion(matrix); - if (!version) { - return null; - } - var formatInfo = readFormatInformation(matrix); - if (!formatInfo) { - return null; - } - var codewords = readCodewords(matrix, version, formatInfo); - var dataBlocks = getDataBlocks(codewords, version, formatInfo.errorCorrectionLevel); - if (!dataBlocks) { - return null; - } - // Count total number of data bytes - var totalBytes = dataBlocks.reduce(function (a, b) { return a + b.numDataCodewords; }, 0); - var resultBytes = new Uint8ClampedArray(totalBytes); - var resultIndex = 0; - for (var _i = 0, dataBlocks_3 = dataBlocks; _i < dataBlocks_3.length; _i++) { - var dataBlock = dataBlocks_3[_i]; - var correctedBytes = reedsolomon_1.decode(dataBlock.codewords, dataBlock.codewords.length - dataBlock.numDataCodewords); - if (!correctedBytes) { - return null; - } - for (var i = 0; i < dataBlock.numDataCodewords; i++) { - resultBytes[resultIndex++] = correctedBytes[i]; - } - } - try { - return decodeData_1.decode(resultBytes, version.versionNumber); - } - catch (_a) { - return null; - } -} -function decode(matrix) { - if (matrix == null) { - return null; - } - var result = decodeMatrix(matrix); - if (result) { - return result; - } - // Decoding didn't work, try mirroring the QR across the topLeft -> bottomRight line. - for (var x = 0; x < matrix.width; x++) { - for (var y = x + 1; y < matrix.height; y++) { - if (matrix.get(x, y) !== matrix.get(y, x)) { - matrix.set(x, y, !matrix.get(x, y)); - matrix.set(y, x, !matrix.get(y, x)); - } - } - } - return decodeMatrix(matrix); -} -exports.decode = decode; - - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __nested_webpack_require_33122__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -// tslint:disable:no-bitwise -var BitStream_1 = __nested_webpack_require_33122__(7); -var shiftJISTable_1 = __nested_webpack_require_33122__(8); -var Mode; -(function (Mode) { - Mode["Numeric"] = "numeric"; - Mode["Alphanumeric"] = "alphanumeric"; - Mode["Byte"] = "byte"; - Mode["Kanji"] = "kanji"; - Mode["ECI"] = "eci"; -})(Mode = exports.Mode || (exports.Mode = {})); -var ModeByte; -(function (ModeByte) { - ModeByte[ModeByte["Terminator"] = 0] = "Terminator"; - ModeByte[ModeByte["Numeric"] = 1] = "Numeric"; - ModeByte[ModeByte["Alphanumeric"] = 2] = "Alphanumeric"; - ModeByte[ModeByte["Byte"] = 4] = "Byte"; - ModeByte[ModeByte["Kanji"] = 8] = "Kanji"; - ModeByte[ModeByte["ECI"] = 7] = "ECI"; - // StructuredAppend = 0x3, - // FNC1FirstPosition = 0x5, - // FNC1SecondPosition = 0x9, -})(ModeByte || (ModeByte = {})); -function decodeNumeric(stream, size) { - var bytes = []; - var text = ""; - var characterCountSize = [10, 12, 14][size]; - var length = stream.readBits(characterCountSize); - // Read digits in groups of 3 - while (length >= 3) { - var num = stream.readBits(10); - if (num >= 1000) { - throw new Error("Invalid numeric value above 999"); - } - var a = Math.floor(num / 100); - var b = Math.floor(num / 10) % 10; - var c = num % 10; - bytes.push(48 + a, 48 + b, 48 + c); - text += a.toString() + b.toString() + c.toString(); - length -= 3; - } - // If the number of digits aren't a multiple of 3, the remaining digits are special cased. - if (length === 2) { - var num = stream.readBits(7); - if (num >= 100) { - throw new Error("Invalid numeric value above 99"); - } - var a = Math.floor(num / 10); - var b = num % 10; - bytes.push(48 + a, 48 + b); - text += a.toString() + b.toString(); - } - else if (length === 1) { - var num = stream.readBits(4); - if (num >= 10) { - throw new Error("Invalid numeric value above 9"); - } - bytes.push(48 + num); - text += num.toString(); - } - return { bytes: bytes, text: text }; -} -var AlphanumericCharacterCodes = [ - "0", "1", "2", "3", "4", "5", "6", "7", "8", - "9", "A", "B", "C", "D", "E", "F", "G", "H", - "I", "J", "K", "L", "M", "N", "O", "P", "Q", - "R", "S", "T", "U", "V", "W", "X", "Y", "Z", - " ", "$", "%", "*", "+", "-", ".", "/", ":", -]; -function decodeAlphanumeric(stream, size) { - var bytes = []; - var text = ""; - var characterCountSize = [9, 11, 13][size]; - var length = stream.readBits(characterCountSize); - while (length >= 2) { - var v = stream.readBits(11); - var a = Math.floor(v / 45); - var b = v % 45; - bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0), AlphanumericCharacterCodes[b].charCodeAt(0)); - text += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b]; - length -= 2; - } - if (length === 1) { - var a = stream.readBits(6); - bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0)); - text += AlphanumericCharacterCodes[a]; - } - return { bytes: bytes, text: text }; -} -function decodeByte(stream, size) { - var bytes = []; - var text = ""; - var characterCountSize = [8, 16, 16][size]; - var length = stream.readBits(characterCountSize); - for (var i = 0; i < length; i++) { - var b = stream.readBits(8); - bytes.push(b); - } - try { - text += decodeURIComponent(bytes.map(function (b) { return "%" + ("0" + b.toString(16)).substr(-2); }).join("")); - } - catch (_a) { - // failed to decode - } - return { bytes: bytes, text: text }; -} -function decodeKanji(stream, size) { - var bytes = []; - var text = ""; - var characterCountSize = [8, 10, 12][size]; - var length = stream.readBits(characterCountSize); - for (var i = 0; i < length; i++) { - var k = stream.readBits(13); - var c = (Math.floor(k / 0xC0) << 8) | (k % 0xC0); - if (c < 0x1F00) { - c += 0x8140; - } - else { - c += 0xC140; - } - bytes.push(c >> 8, c & 0xFF); - text += String.fromCharCode(shiftJISTable_1.shiftJISTable[c]); - } - return { bytes: bytes, text: text }; -} -function decode(data, version) { - var stream = new BitStream_1.BitStream(data); - // There are 3 'sizes' based on the version. 1-9 is small (0), 10-26 is medium (1) and 27-40 is large (2). - var size = version <= 9 ? 0 : version <= 26 ? 1 : 2; - var result = { - text: "", - bytes: [], - chunks: [], - }; - while (stream.available() >= 4) { - var mode = stream.readBits(4); - if (mode === ModeByte.Terminator) { - return result; - } - else if (mode === ModeByte.ECI) { - if (stream.readBits(1) === 0) { - result.chunks.push({ - type: Mode.ECI, - assignmentNumber: stream.readBits(7), - }); - } - else if (stream.readBits(1) === 0) { - result.chunks.push({ - type: Mode.ECI, - assignmentNumber: stream.readBits(14), - }); - } - else if (stream.readBits(1) === 0) { - result.chunks.push({ - type: Mode.ECI, - assignmentNumber: stream.readBits(21), - }); - } - else { - // ECI data seems corrupted - result.chunks.push({ - type: Mode.ECI, - assignmentNumber: -1, - }); - } - } - else if (mode === ModeByte.Numeric) { - var numericResult = decodeNumeric(stream, size); - result.text += numericResult.text; - (_a = result.bytes).push.apply(_a, numericResult.bytes); - result.chunks.push({ - type: Mode.Numeric, - text: numericResult.text, - }); - } - else if (mode === ModeByte.Alphanumeric) { - var alphanumericResult = decodeAlphanumeric(stream, size); - result.text += alphanumericResult.text; - (_b = result.bytes).push.apply(_b, alphanumericResult.bytes); - result.chunks.push({ - type: Mode.Alphanumeric, - text: alphanumericResult.text, - }); - } - else if (mode === ModeByte.Byte) { - var byteResult = decodeByte(stream, size); - result.text += byteResult.text; - (_c = result.bytes).push.apply(_c, byteResult.bytes); - result.chunks.push({ - type: Mode.Byte, - bytes: byteResult.bytes, - text: byteResult.text, - }); - } - else if (mode === ModeByte.Kanji) { - var kanjiResult = decodeKanji(stream, size); - result.text += kanjiResult.text; - (_d = result.bytes).push.apply(_d, kanjiResult.bytes); - result.chunks.push({ - type: Mode.Kanji, - bytes: kanjiResult.bytes, - text: kanjiResult.text, - }); - } - } - var _a, _b, _c, _d; -} -exports.decode = decode; - - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// tslint:disable:no-bitwise -Object.defineProperty(exports, "__esModule", { value: true }); -var BitStream = /** @class */ (function () { - function BitStream(bytes) { - this.byteOffset = 0; - this.bitOffset = 0; - this.bytes = bytes; - } - BitStream.prototype.readBits = function (numBits) { - if (numBits < 1 || numBits > 32 || numBits > this.available()) { - throw new Error("Cannot read " + numBits.toString() + " bits"); - } - var result = 0; - // First, read remainder from current byte - if (this.bitOffset > 0) { - var bitsLeft = 8 - this.bitOffset; - var toRead = numBits < bitsLeft ? numBits : bitsLeft; - var bitsToNotRead = bitsLeft - toRead; - var mask = (0xFF >> (8 - toRead)) << bitsToNotRead; - result = (this.bytes[this.byteOffset] & mask) >> bitsToNotRead; - numBits -= toRead; - this.bitOffset += toRead; - if (this.bitOffset === 8) { - this.bitOffset = 0; - this.byteOffset++; - } - } - // Next read whole bytes - if (numBits > 0) { - while (numBits >= 8) { - result = (result << 8) | (this.bytes[this.byteOffset] & 0xFF); - this.byteOffset++; - numBits -= 8; - } - // Finally read a partial byte - if (numBits > 0) { - var bitsToNotRead = 8 - numBits; - var mask = (0xFF >> bitsToNotRead) << bitsToNotRead; - result = (result << numBits) | ((this.bytes[this.byteOffset] & mask) >> bitsToNotRead); - this.bitOffset += numBits; - } - } - return result; - }; - BitStream.prototype.available = function () { - return 8 * (this.bytes.length - this.byteOffset) - this.bitOffset; - }; - return BitStream; -}()); -exports.BitStream = BitStream; - - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.shiftJISTable = { - 0x20: 0x0020, - 0x21: 0x0021, - 0x22: 0x0022, - 0x23: 0x0023, - 0x24: 0x0024, - 0x25: 0x0025, - 0x26: 0x0026, - 0x27: 0x0027, - 0x28: 0x0028, - 0x29: 0x0029, - 0x2A: 0x002A, - 0x2B: 0x002B, - 0x2C: 0x002C, - 0x2D: 0x002D, - 0x2E: 0x002E, - 0x2F: 0x002F, - 0x30: 0x0030, - 0x31: 0x0031, - 0x32: 0x0032, - 0x33: 0x0033, - 0x34: 0x0034, - 0x35: 0x0035, - 0x36: 0x0036, - 0x37: 0x0037, - 0x38: 0x0038, - 0x39: 0x0039, - 0x3A: 0x003A, - 0x3B: 0x003B, - 0x3C: 0x003C, - 0x3D: 0x003D, - 0x3E: 0x003E, - 0x3F: 0x003F, - 0x40: 0x0040, - 0x41: 0x0041, - 0x42: 0x0042, - 0x43: 0x0043, - 0x44: 0x0044, - 0x45: 0x0045, - 0x46: 0x0046, - 0x47: 0x0047, - 0x48: 0x0048, - 0x49: 0x0049, - 0x4A: 0x004A, - 0x4B: 0x004B, - 0x4C: 0x004C, - 0x4D: 0x004D, - 0x4E: 0x004E, - 0x4F: 0x004F, - 0x50: 0x0050, - 0x51: 0x0051, - 0x52: 0x0052, - 0x53: 0x0053, - 0x54: 0x0054, - 0x55: 0x0055, - 0x56: 0x0056, - 0x57: 0x0057, - 0x58: 0x0058, - 0x59: 0x0059, - 0x5A: 0x005A, - 0x5B: 0x005B, - 0x5C: 0x00A5, - 0x5D: 0x005D, - 0x5E: 0x005E, - 0x5F: 0x005F, - 0x60: 0x0060, - 0x61: 0x0061, - 0x62: 0x0062, - 0x63: 0x0063, - 0x64: 0x0064, - 0x65: 0x0065, - 0x66: 0x0066, - 0x67: 0x0067, - 0x68: 0x0068, - 0x69: 0x0069, - 0x6A: 0x006A, - 0x6B: 0x006B, - 0x6C: 0x006C, - 0x6D: 0x006D, - 0x6E: 0x006E, - 0x6F: 0x006F, - 0x70: 0x0070, - 0x71: 0x0071, - 0x72: 0x0072, - 0x73: 0x0073, - 0x74: 0x0074, - 0x75: 0x0075, - 0x76: 0x0076, - 0x77: 0x0077, - 0x78: 0x0078, - 0x79: 0x0079, - 0x7A: 0x007A, - 0x7B: 0x007B, - 0x7C: 0x007C, - 0x7D: 0x007D, - 0x7E: 0x203E, - 0x8140: 0x3000, - 0x8141: 0x3001, - 0x8142: 0x3002, - 0x8143: 0xFF0C, - 0x8144: 0xFF0E, - 0x8145: 0x30FB, - 0x8146: 0xFF1A, - 0x8147: 0xFF1B, - 0x8148: 0xFF1F, - 0x8149: 0xFF01, - 0x814A: 0x309B, - 0x814B: 0x309C, - 0x814C: 0x00B4, - 0x814D: 0xFF40, - 0x814E: 0x00A8, - 0x814F: 0xFF3E, - 0x8150: 0xFFE3, - 0x8151: 0xFF3F, - 0x8152: 0x30FD, - 0x8153: 0x30FE, - 0x8154: 0x309D, - 0x8155: 0x309E, - 0x8156: 0x3003, - 0x8157: 0x4EDD, - 0x8158: 0x3005, - 0x8159: 0x3006, - 0x815A: 0x3007, - 0x815B: 0x30FC, - 0x815C: 0x2015, - 0x815D: 0x2010, - 0x815E: 0xFF0F, - 0x815F: 0x005C, - 0x8160: 0x301C, - 0x8161: 0x2016, - 0x8162: 0xFF5C, - 0x8163: 0x2026, - 0x8164: 0x2025, - 0x8165: 0x2018, - 0x8166: 0x2019, - 0x8167: 0x201C, - 0x8168: 0x201D, - 0x8169: 0xFF08, - 0x816A: 0xFF09, - 0x816B: 0x3014, - 0x816C: 0x3015, - 0x816D: 0xFF3B, - 0x816E: 0xFF3D, - 0x816F: 0xFF5B, - 0x8170: 0xFF5D, - 0x8171: 0x3008, - 0x8172: 0x3009, - 0x8173: 0x300A, - 0x8174: 0x300B, - 0x8175: 0x300C, - 0x8176: 0x300D, - 0x8177: 0x300E, - 0x8178: 0x300F, - 0x8179: 0x3010, - 0x817A: 0x3011, - 0x817B: 0xFF0B, - 0x817C: 0x2212, - 0x817D: 0x00B1, - 0x817E: 0x00D7, - 0x8180: 0x00F7, - 0x8181: 0xFF1D, - 0x8182: 0x2260, - 0x8183: 0xFF1C, - 0x8184: 0xFF1E, - 0x8185: 0x2266, - 0x8186: 0x2267, - 0x8187: 0x221E, - 0x8188: 0x2234, - 0x8189: 0x2642, - 0x818A: 0x2640, - 0x818B: 0x00B0, - 0x818C: 0x2032, - 0x818D: 0x2033, - 0x818E: 0x2103, - 0x818F: 0xFFE5, - 0x8190: 0xFF04, - 0x8191: 0x00A2, - 0x8192: 0x00A3, - 0x8193: 0xFF05, - 0x8194: 0xFF03, - 0x8195: 0xFF06, - 0x8196: 0xFF0A, - 0x8197: 0xFF20, - 0x8198: 0x00A7, - 0x8199: 0x2606, - 0x819A: 0x2605, - 0x819B: 0x25CB, - 0x819C: 0x25CF, - 0x819D: 0x25CE, - 0x819E: 0x25C7, - 0x819F: 0x25C6, - 0x81A0: 0x25A1, - 0x81A1: 0x25A0, - 0x81A2: 0x25B3, - 0x81A3: 0x25B2, - 0x81A4: 0x25BD, - 0x81A5: 0x25BC, - 0x81A6: 0x203B, - 0x81A7: 0x3012, - 0x81A8: 0x2192, - 0x81A9: 0x2190, - 0x81AA: 0x2191, - 0x81AB: 0x2193, - 0x81AC: 0x3013, - 0x81B8: 0x2208, - 0x81B9: 0x220B, - 0x81BA: 0x2286, - 0x81BB: 0x2287, - 0x81BC: 0x2282, - 0x81BD: 0x2283, - 0x81BE: 0x222A, - 0x81BF: 0x2229, - 0x81C8: 0x2227, - 0x81C9: 0x2228, - 0x81CA: 0x00AC, - 0x81CB: 0x21D2, - 0x81CC: 0x21D4, - 0x81CD: 0x2200, - 0x81CE: 0x2203, - 0x81DA: 0x2220, - 0x81DB: 0x22A5, - 0x81DC: 0x2312, - 0x81DD: 0x2202, - 0x81DE: 0x2207, - 0x81DF: 0x2261, - 0x81E0: 0x2252, - 0x81E1: 0x226A, - 0x81E2: 0x226B, - 0x81E3: 0x221A, - 0x81E4: 0x223D, - 0x81E5: 0x221D, - 0x81E6: 0x2235, - 0x81E7: 0x222B, - 0x81E8: 0x222C, - 0x81F0: 0x212B, - 0x81F1: 0x2030, - 0x81F2: 0x266F, - 0x81F3: 0x266D, - 0x81F4: 0x266A, - 0x81F5: 0x2020, - 0x81F6: 0x2021, - 0x81F7: 0x00B6, - 0x81FC: 0x25EF, - 0x824F: 0xFF10, - 0x8250: 0xFF11, - 0x8251: 0xFF12, - 0x8252: 0xFF13, - 0x8253: 0xFF14, - 0x8254: 0xFF15, - 0x8255: 0xFF16, - 0x8256: 0xFF17, - 0x8257: 0xFF18, - 0x8258: 0xFF19, - 0x8260: 0xFF21, - 0x8261: 0xFF22, - 0x8262: 0xFF23, - 0x8263: 0xFF24, - 0x8264: 0xFF25, - 0x8265: 0xFF26, - 0x8266: 0xFF27, - 0x8267: 0xFF28, - 0x8268: 0xFF29, - 0x8269: 0xFF2A, - 0x826A: 0xFF2B, - 0x826B: 0xFF2C, - 0x826C: 0xFF2D, - 0x826D: 0xFF2E, - 0x826E: 0xFF2F, - 0x826F: 0xFF30, - 0x8270: 0xFF31, - 0x8271: 0xFF32, - 0x8272: 0xFF33, - 0x8273: 0xFF34, - 0x8274: 0xFF35, - 0x8275: 0xFF36, - 0x8276: 0xFF37, - 0x8277: 0xFF38, - 0x8278: 0xFF39, - 0x8279: 0xFF3A, - 0x8281: 0xFF41, - 0x8282: 0xFF42, - 0x8283: 0xFF43, - 0x8284: 0xFF44, - 0x8285: 0xFF45, - 0x8286: 0xFF46, - 0x8287: 0xFF47, - 0x8288: 0xFF48, - 0x8289: 0xFF49, - 0x828A: 0xFF4A, - 0x828B: 0xFF4B, - 0x828C: 0xFF4C, - 0x828D: 0xFF4D, - 0x828E: 0xFF4E, - 0x828F: 0xFF4F, - 0x8290: 0xFF50, - 0x8291: 0xFF51, - 0x8292: 0xFF52, - 0x8293: 0xFF53, - 0x8294: 0xFF54, - 0x8295: 0xFF55, - 0x8296: 0xFF56, - 0x8297: 0xFF57, - 0x8298: 0xFF58, - 0x8299: 0xFF59, - 0x829A: 0xFF5A, - 0x829F: 0x3041, - 0x82A0: 0x3042, - 0x82A1: 0x3043, - 0x82A2: 0x3044, - 0x82A3: 0x3045, - 0x82A4: 0x3046, - 0x82A5: 0x3047, - 0x82A6: 0x3048, - 0x82A7: 0x3049, - 0x82A8: 0x304A, - 0x82A9: 0x304B, - 0x82AA: 0x304C, - 0x82AB: 0x304D, - 0x82AC: 0x304E, - 0x82AD: 0x304F, - 0x82AE: 0x3050, - 0x82AF: 0x3051, - 0x82B0: 0x3052, - 0x82B1: 0x3053, - 0x82B2: 0x3054, - 0x82B3: 0x3055, - 0x82B4: 0x3056, - 0x82B5: 0x3057, - 0x82B6: 0x3058, - 0x82B7: 0x3059, - 0x82B8: 0x305A, - 0x82B9: 0x305B, - 0x82BA: 0x305C, - 0x82BB: 0x305D, - 0x82BC: 0x305E, - 0x82BD: 0x305F, - 0x82BE: 0x3060, - 0x82BF: 0x3061, - 0x82C0: 0x3062, - 0x82C1: 0x3063, - 0x82C2: 0x3064, - 0x82C3: 0x3065, - 0x82C4: 0x3066, - 0x82C5: 0x3067, - 0x82C6: 0x3068, - 0x82C7: 0x3069, - 0x82C8: 0x306A, - 0x82C9: 0x306B, - 0x82CA: 0x306C, - 0x82CB: 0x306D, - 0x82CC: 0x306E, - 0x82CD: 0x306F, - 0x82CE: 0x3070, - 0x82CF: 0x3071, - 0x82D0: 0x3072, - 0x82D1: 0x3073, - 0x82D2: 0x3074, - 0x82D3: 0x3075, - 0x82D4: 0x3076, - 0x82D5: 0x3077, - 0x82D6: 0x3078, - 0x82D7: 0x3079, - 0x82D8: 0x307A, - 0x82D9: 0x307B, - 0x82DA: 0x307C, - 0x82DB: 0x307D, - 0x82DC: 0x307E, - 0x82DD: 0x307F, - 0x82DE: 0x3080, - 0x82DF: 0x3081, - 0x82E0: 0x3082, - 0x82E1: 0x3083, - 0x82E2: 0x3084, - 0x82E3: 0x3085, - 0x82E4: 0x3086, - 0x82E5: 0x3087, - 0x82E6: 0x3088, - 0x82E7: 0x3089, - 0x82E8: 0x308A, - 0x82E9: 0x308B, - 0x82EA: 0x308C, - 0x82EB: 0x308D, - 0x82EC: 0x308E, - 0x82ED: 0x308F, - 0x82EE: 0x3090, - 0x82EF: 0x3091, - 0x82F0: 0x3092, - 0x82F1: 0x3093, - 0x8340: 0x30A1, - 0x8341: 0x30A2, - 0x8342: 0x30A3, - 0x8343: 0x30A4, - 0x8344: 0x30A5, - 0x8345: 0x30A6, - 0x8346: 0x30A7, - 0x8347: 0x30A8, - 0x8348: 0x30A9, - 0x8349: 0x30AA, - 0x834A: 0x30AB, - 0x834B: 0x30AC, - 0x834C: 0x30AD, - 0x834D: 0x30AE, - 0x834E: 0x30AF, - 0x834F: 0x30B0, - 0x8350: 0x30B1, - 0x8351: 0x30B2, - 0x8352: 0x30B3, - 0x8353: 0x30B4, - 0x8354: 0x30B5, - 0x8355: 0x30B6, - 0x8356: 0x30B7, - 0x8357: 0x30B8, - 0x8358: 0x30B9, - 0x8359: 0x30BA, - 0x835A: 0x30BB, - 0x835B: 0x30BC, - 0x835C: 0x30BD, - 0x835D: 0x30BE, - 0x835E: 0x30BF, - 0x835F: 0x30C0, - 0x8360: 0x30C1, - 0x8361: 0x30C2, - 0x8362: 0x30C3, - 0x8363: 0x30C4, - 0x8364: 0x30C5, - 0x8365: 0x30C6, - 0x8366: 0x30C7, - 0x8367: 0x30C8, - 0x8368: 0x30C9, - 0x8369: 0x30CA, - 0x836A: 0x30CB, - 0x836B: 0x30CC, - 0x836C: 0x30CD, - 0x836D: 0x30CE, - 0x836E: 0x30CF, - 0x836F: 0x30D0, - 0x8370: 0x30D1, - 0x8371: 0x30D2, - 0x8372: 0x30D3, - 0x8373: 0x30D4, - 0x8374: 0x30D5, - 0x8375: 0x30D6, - 0x8376: 0x30D7, - 0x8377: 0x30D8, - 0x8378: 0x30D9, - 0x8379: 0x30DA, - 0x837A: 0x30DB, - 0x837B: 0x30DC, - 0x837C: 0x30DD, - 0x837D: 0x30DE, - 0x837E: 0x30DF, - 0x8380: 0x30E0, - 0x8381: 0x30E1, - 0x8382: 0x30E2, - 0x8383: 0x30E3, - 0x8384: 0x30E4, - 0x8385: 0x30E5, - 0x8386: 0x30E6, - 0x8387: 0x30E7, - 0x8388: 0x30E8, - 0x8389: 0x30E9, - 0x838A: 0x30EA, - 0x838B: 0x30EB, - 0x838C: 0x30EC, - 0x838D: 0x30ED, - 0x838E: 0x30EE, - 0x838F: 0x30EF, - 0x8390: 0x30F0, - 0x8391: 0x30F1, - 0x8392: 0x30F2, - 0x8393: 0x30F3, - 0x8394: 0x30F4, - 0x8395: 0x30F5, - 0x8396: 0x30F6, - 0x839F: 0x0391, - 0x83A0: 0x0392, - 0x83A1: 0x0393, - 0x83A2: 0x0394, - 0x83A3: 0x0395, - 0x83A4: 0x0396, - 0x83A5: 0x0397, - 0x83A6: 0x0398, - 0x83A7: 0x0399, - 0x83A8: 0x039A, - 0x83A9: 0x039B, - 0x83AA: 0x039C, - 0x83AB: 0x039D, - 0x83AC: 0x039E, - 0x83AD: 0x039F, - 0x83AE: 0x03A0, - 0x83AF: 0x03A1, - 0x83B0: 0x03A3, - 0x83B1: 0x03A4, - 0x83B2: 0x03A5, - 0x83B3: 0x03A6, - 0x83B4: 0x03A7, - 0x83B5: 0x03A8, - 0x83B6: 0x03A9, - 0x83BF: 0x03B1, - 0x83C0: 0x03B2, - 0x83C1: 0x03B3, - 0x83C2: 0x03B4, - 0x83C3: 0x03B5, - 0x83C4: 0x03B6, - 0x83C5: 0x03B7, - 0x83C6: 0x03B8, - 0x83C7: 0x03B9, - 0x83C8: 0x03BA, - 0x83C9: 0x03BB, - 0x83CA: 0x03BC, - 0x83CB: 0x03BD, - 0x83CC: 0x03BE, - 0x83CD: 0x03BF, - 0x83CE: 0x03C0, - 0x83CF: 0x03C1, - 0x83D0: 0x03C3, - 0x83D1: 0x03C4, - 0x83D2: 0x03C5, - 0x83D3: 0x03C6, - 0x83D4: 0x03C7, - 0x83D5: 0x03C8, - 0x83D6: 0x03C9, - 0x8440: 0x0410, - 0x8441: 0x0411, - 0x8442: 0x0412, - 0x8443: 0x0413, - 0x8444: 0x0414, - 0x8445: 0x0415, - 0x8446: 0x0401, - 0x8447: 0x0416, - 0x8448: 0x0417, - 0x8449: 0x0418, - 0x844A: 0x0419, - 0x844B: 0x041A, - 0x844C: 0x041B, - 0x844D: 0x041C, - 0x844E: 0x041D, - 0x844F: 0x041E, - 0x8450: 0x041F, - 0x8451: 0x0420, - 0x8452: 0x0421, - 0x8453: 0x0422, - 0x8454: 0x0423, - 0x8455: 0x0424, - 0x8456: 0x0425, - 0x8457: 0x0426, - 0x8458: 0x0427, - 0x8459: 0x0428, - 0x845A: 0x0429, - 0x845B: 0x042A, - 0x845C: 0x042B, - 0x845D: 0x042C, - 0x845E: 0x042D, - 0x845F: 0x042E, - 0x8460: 0x042F, - 0x8470: 0x0430, - 0x8471: 0x0431, - 0x8472: 0x0432, - 0x8473: 0x0433, - 0x8474: 0x0434, - 0x8475: 0x0435, - 0x8476: 0x0451, - 0x8477: 0x0436, - 0x8478: 0x0437, - 0x8479: 0x0438, - 0x847A: 0x0439, - 0x847B: 0x043A, - 0x847C: 0x043B, - 0x847D: 0x043C, - 0x847E: 0x043D, - 0x8480: 0x043E, - 0x8481: 0x043F, - 0x8482: 0x0440, - 0x8483: 0x0441, - 0x8484: 0x0442, - 0x8485: 0x0443, - 0x8486: 0x0444, - 0x8487: 0x0445, - 0x8488: 0x0446, - 0x8489: 0x0447, - 0x848A: 0x0448, - 0x848B: 0x0449, - 0x848C: 0x044A, - 0x848D: 0x044B, - 0x848E: 0x044C, - 0x848F: 0x044D, - 0x8490: 0x044E, - 0x8491: 0x044F, - 0x849F: 0x2500, - 0x84A0: 0x2502, - 0x84A1: 0x250C, - 0x84A2: 0x2510, - 0x84A3: 0x2518, - 0x84A4: 0x2514, - 0x84A5: 0x251C, - 0x84A6: 0x252C, - 0x84A7: 0x2524, - 0x84A8: 0x2534, - 0x84A9: 0x253C, - 0x84AA: 0x2501, - 0x84AB: 0x2503, - 0x84AC: 0x250F, - 0x84AD: 0x2513, - 0x84AE: 0x251B, - 0x84AF: 0x2517, - 0x84B0: 0x2523, - 0x84B1: 0x2533, - 0x84B2: 0x252B, - 0x84B3: 0x253B, - 0x84B4: 0x254B, - 0x84B5: 0x2520, - 0x84B6: 0x252F, - 0x84B7: 0x2528, - 0x84B8: 0x2537, - 0x84B9: 0x253F, - 0x84BA: 0x251D, - 0x84BB: 0x2530, - 0x84BC: 0x2525, - 0x84BD: 0x2538, - 0x84BE: 0x2542, - 0x889F: 0x4E9C, - 0x88A0: 0x5516, - 0x88A1: 0x5A03, - 0x88A2: 0x963F, - 0x88A3: 0x54C0, - 0x88A4: 0x611B, - 0x88A5: 0x6328, - 0x88A6: 0x59F6, - 0x88A7: 0x9022, - 0x88A8: 0x8475, - 0x88A9: 0x831C, - 0x88AA: 0x7A50, - 0x88AB: 0x60AA, - 0x88AC: 0x63E1, - 0x88AD: 0x6E25, - 0x88AE: 0x65ED, - 0x88AF: 0x8466, - 0x88B0: 0x82A6, - 0x88B1: 0x9BF5, - 0x88B2: 0x6893, - 0x88B3: 0x5727, - 0x88B4: 0x65A1, - 0x88B5: 0x6271, - 0x88B6: 0x5B9B, - 0x88B7: 0x59D0, - 0x88B8: 0x867B, - 0x88B9: 0x98F4, - 0x88BA: 0x7D62, - 0x88BB: 0x7DBE, - 0x88BC: 0x9B8E, - 0x88BD: 0x6216, - 0x88BE: 0x7C9F, - 0x88BF: 0x88B7, - 0x88C0: 0x5B89, - 0x88C1: 0x5EB5, - 0x88C2: 0x6309, - 0x88C3: 0x6697, - 0x88C4: 0x6848, - 0x88C5: 0x95C7, - 0x88C6: 0x978D, - 0x88C7: 0x674F, - 0x88C8: 0x4EE5, - 0x88C9: 0x4F0A, - 0x88CA: 0x4F4D, - 0x88CB: 0x4F9D, - 0x88CC: 0x5049, - 0x88CD: 0x56F2, - 0x88CE: 0x5937, - 0x88CF: 0x59D4, - 0x88D0: 0x5A01, - 0x88D1: 0x5C09, - 0x88D2: 0x60DF, - 0x88D3: 0x610F, - 0x88D4: 0x6170, - 0x88D5: 0x6613, - 0x88D6: 0x6905, - 0x88D7: 0x70BA, - 0x88D8: 0x754F, - 0x88D9: 0x7570, - 0x88DA: 0x79FB, - 0x88DB: 0x7DAD, - 0x88DC: 0x7DEF, - 0x88DD: 0x80C3, - 0x88DE: 0x840E, - 0x88DF: 0x8863, - 0x88E0: 0x8B02, - 0x88E1: 0x9055, - 0x88E2: 0x907A, - 0x88E3: 0x533B, - 0x88E4: 0x4E95, - 0x88E5: 0x4EA5, - 0x88E6: 0x57DF, - 0x88E7: 0x80B2, - 0x88E8: 0x90C1, - 0x88E9: 0x78EF, - 0x88EA: 0x4E00, - 0x88EB: 0x58F1, - 0x88EC: 0x6EA2, - 0x88ED: 0x9038, - 0x88EE: 0x7A32, - 0x88EF: 0x8328, - 0x88F0: 0x828B, - 0x88F1: 0x9C2F, - 0x88F2: 0x5141, - 0x88F3: 0x5370, - 0x88F4: 0x54BD, - 0x88F5: 0x54E1, - 0x88F6: 0x56E0, - 0x88F7: 0x59FB, - 0x88F8: 0x5F15, - 0x88F9: 0x98F2, - 0x88FA: 0x6DEB, - 0x88FB: 0x80E4, - 0x88FC: 0x852D, - 0x8940: 0x9662, - 0x8941: 0x9670, - 0x8942: 0x96A0, - 0x8943: 0x97FB, - 0x8944: 0x540B, - 0x8945: 0x53F3, - 0x8946: 0x5B87, - 0x8947: 0x70CF, - 0x8948: 0x7FBD, - 0x8949: 0x8FC2, - 0x894A: 0x96E8, - 0x894B: 0x536F, - 0x894C: 0x9D5C, - 0x894D: 0x7ABA, - 0x894E: 0x4E11, - 0x894F: 0x7893, - 0x8950: 0x81FC, - 0x8951: 0x6E26, - 0x8952: 0x5618, - 0x8953: 0x5504, - 0x8954: 0x6B1D, - 0x8955: 0x851A, - 0x8956: 0x9C3B, - 0x8957: 0x59E5, - 0x8958: 0x53A9, - 0x8959: 0x6D66, - 0x895A: 0x74DC, - 0x895B: 0x958F, - 0x895C: 0x5642, - 0x895D: 0x4E91, - 0x895E: 0x904B, - 0x895F: 0x96F2, - 0x8960: 0x834F, - 0x8961: 0x990C, - 0x8962: 0x53E1, - 0x8963: 0x55B6, - 0x8964: 0x5B30, - 0x8965: 0x5F71, - 0x8966: 0x6620, - 0x8967: 0x66F3, - 0x8968: 0x6804, - 0x8969: 0x6C38, - 0x896A: 0x6CF3, - 0x896B: 0x6D29, - 0x896C: 0x745B, - 0x896D: 0x76C8, - 0x896E: 0x7A4E, - 0x896F: 0x9834, - 0x8970: 0x82F1, - 0x8971: 0x885B, - 0x8972: 0x8A60, - 0x8973: 0x92ED, - 0x8974: 0x6DB2, - 0x8975: 0x75AB, - 0x8976: 0x76CA, - 0x8977: 0x99C5, - 0x8978: 0x60A6, - 0x8979: 0x8B01, - 0x897A: 0x8D8A, - 0x897B: 0x95B2, - 0x897C: 0x698E, - 0x897D: 0x53AD, - 0x897E: 0x5186, - 0x8980: 0x5712, - 0x8981: 0x5830, - 0x8982: 0x5944, - 0x8983: 0x5BB4, - 0x8984: 0x5EF6, - 0x8985: 0x6028, - 0x8986: 0x63A9, - 0x8987: 0x63F4, - 0x8988: 0x6CBF, - 0x8989: 0x6F14, - 0x898A: 0x708E, - 0x898B: 0x7114, - 0x898C: 0x7159, - 0x898D: 0x71D5, - 0x898E: 0x733F, - 0x898F: 0x7E01, - 0x8990: 0x8276, - 0x8991: 0x82D1, - 0x8992: 0x8597, - 0x8993: 0x9060, - 0x8994: 0x925B, - 0x8995: 0x9D1B, - 0x8996: 0x5869, - 0x8997: 0x65BC, - 0x8998: 0x6C5A, - 0x8999: 0x7525, - 0x899A: 0x51F9, - 0x899B: 0x592E, - 0x899C: 0x5965, - 0x899D: 0x5F80, - 0x899E: 0x5FDC, - 0x899F: 0x62BC, - 0x89A0: 0x65FA, - 0x89A1: 0x6A2A, - 0x89A2: 0x6B27, - 0x89A3: 0x6BB4, - 0x89A4: 0x738B, - 0x89A5: 0x7FC1, - 0x89A6: 0x8956, - 0x89A7: 0x9D2C, - 0x89A8: 0x9D0E, - 0x89A9: 0x9EC4, - 0x89AA: 0x5CA1, - 0x89AB: 0x6C96, - 0x89AC: 0x837B, - 0x89AD: 0x5104, - 0x89AE: 0x5C4B, - 0x89AF: 0x61B6, - 0x89B0: 0x81C6, - 0x89B1: 0x6876, - 0x89B2: 0x7261, - 0x89B3: 0x4E59, - 0x89B4: 0x4FFA, - 0x89B5: 0x5378, - 0x89B6: 0x6069, - 0x89B7: 0x6E29, - 0x89B8: 0x7A4F, - 0x89B9: 0x97F3, - 0x89BA: 0x4E0B, - 0x89BB: 0x5316, - 0x89BC: 0x4EEE, - 0x89BD: 0x4F55, - 0x89BE: 0x4F3D, - 0x89BF: 0x4FA1, - 0x89C0: 0x4F73, - 0x89C1: 0x52A0, - 0x89C2: 0x53EF, - 0x89C3: 0x5609, - 0x89C4: 0x590F, - 0x89C5: 0x5AC1, - 0x89C6: 0x5BB6, - 0x89C7: 0x5BE1, - 0x89C8: 0x79D1, - 0x89C9: 0x6687, - 0x89CA: 0x679C, - 0x89CB: 0x67B6, - 0x89CC: 0x6B4C, - 0x89CD: 0x6CB3, - 0x89CE: 0x706B, - 0x89CF: 0x73C2, - 0x89D0: 0x798D, - 0x89D1: 0x79BE, - 0x89D2: 0x7A3C, - 0x89D3: 0x7B87, - 0x89D4: 0x82B1, - 0x89D5: 0x82DB, - 0x89D6: 0x8304, - 0x89D7: 0x8377, - 0x89D8: 0x83EF, - 0x89D9: 0x83D3, - 0x89DA: 0x8766, - 0x89DB: 0x8AB2, - 0x89DC: 0x5629, - 0x89DD: 0x8CA8, - 0x89DE: 0x8FE6, - 0x89DF: 0x904E, - 0x89E0: 0x971E, - 0x89E1: 0x868A, - 0x89E2: 0x4FC4, - 0x89E3: 0x5CE8, - 0x89E4: 0x6211, - 0x89E5: 0x7259, - 0x89E6: 0x753B, - 0x89E7: 0x81E5, - 0x89E8: 0x82BD, - 0x89E9: 0x86FE, - 0x89EA: 0x8CC0, - 0x89EB: 0x96C5, - 0x89EC: 0x9913, - 0x89ED: 0x99D5, - 0x89EE: 0x4ECB, - 0x89EF: 0x4F1A, - 0x89F0: 0x89E3, - 0x89F1: 0x56DE, - 0x89F2: 0x584A, - 0x89F3: 0x58CA, - 0x89F4: 0x5EFB, - 0x89F5: 0x5FEB, - 0x89F6: 0x602A, - 0x89F7: 0x6094, - 0x89F8: 0x6062, - 0x89F9: 0x61D0, - 0x89FA: 0x6212, - 0x89FB: 0x62D0, - 0x89FC: 0x6539, - 0x8A40: 0x9B41, - 0x8A41: 0x6666, - 0x8A42: 0x68B0, - 0x8A43: 0x6D77, - 0x8A44: 0x7070, - 0x8A45: 0x754C, - 0x8A46: 0x7686, - 0x8A47: 0x7D75, - 0x8A48: 0x82A5, - 0x8A49: 0x87F9, - 0x8A4A: 0x958B, - 0x8A4B: 0x968E, - 0x8A4C: 0x8C9D, - 0x8A4D: 0x51F1, - 0x8A4E: 0x52BE, - 0x8A4F: 0x5916, - 0x8A50: 0x54B3, - 0x8A51: 0x5BB3, - 0x8A52: 0x5D16, - 0x8A53: 0x6168, - 0x8A54: 0x6982, - 0x8A55: 0x6DAF, - 0x8A56: 0x788D, - 0x8A57: 0x84CB, - 0x8A58: 0x8857, - 0x8A59: 0x8A72, - 0x8A5A: 0x93A7, - 0x8A5B: 0x9AB8, - 0x8A5C: 0x6D6C, - 0x8A5D: 0x99A8, - 0x8A5E: 0x86D9, - 0x8A5F: 0x57A3, - 0x8A60: 0x67FF, - 0x8A61: 0x86CE, - 0x8A62: 0x920E, - 0x8A63: 0x5283, - 0x8A64: 0x5687, - 0x8A65: 0x5404, - 0x8A66: 0x5ED3, - 0x8A67: 0x62E1, - 0x8A68: 0x64B9, - 0x8A69: 0x683C, - 0x8A6A: 0x6838, - 0x8A6B: 0x6BBB, - 0x8A6C: 0x7372, - 0x8A6D: 0x78BA, - 0x8A6E: 0x7A6B, - 0x8A6F: 0x899A, - 0x8A70: 0x89D2, - 0x8A71: 0x8D6B, - 0x8A72: 0x8F03, - 0x8A73: 0x90ED, - 0x8A74: 0x95A3, - 0x8A75: 0x9694, - 0x8A76: 0x9769, - 0x8A77: 0x5B66, - 0x8A78: 0x5CB3, - 0x8A79: 0x697D, - 0x8A7A: 0x984D, - 0x8A7B: 0x984E, - 0x8A7C: 0x639B, - 0x8A7D: 0x7B20, - 0x8A7E: 0x6A2B, - 0x8A80: 0x6A7F, - 0x8A81: 0x68B6, - 0x8A82: 0x9C0D, - 0x8A83: 0x6F5F, - 0x8A84: 0x5272, - 0x8A85: 0x559D, - 0x8A86: 0x6070, - 0x8A87: 0x62EC, - 0x8A88: 0x6D3B, - 0x8A89: 0x6E07, - 0x8A8A: 0x6ED1, - 0x8A8B: 0x845B, - 0x8A8C: 0x8910, - 0x8A8D: 0x8F44, - 0x8A8E: 0x4E14, - 0x8A8F: 0x9C39, - 0x8A90: 0x53F6, - 0x8A91: 0x691B, - 0x8A92: 0x6A3A, - 0x8A93: 0x9784, - 0x8A94: 0x682A, - 0x8A95: 0x515C, - 0x8A96: 0x7AC3, - 0x8A97: 0x84B2, - 0x8A98: 0x91DC, - 0x8A99: 0x938C, - 0x8A9A: 0x565B, - 0x8A9B: 0x9D28, - 0x8A9C: 0x6822, - 0x8A9D: 0x8305, - 0x8A9E: 0x8431, - 0x8A9F: 0x7CA5, - 0x8AA0: 0x5208, - 0x8AA1: 0x82C5, - 0x8AA2: 0x74E6, - 0x8AA3: 0x4E7E, - 0x8AA4: 0x4F83, - 0x8AA5: 0x51A0, - 0x8AA6: 0x5BD2, - 0x8AA7: 0x520A, - 0x8AA8: 0x52D8, - 0x8AA9: 0x52E7, - 0x8AAA: 0x5DFB, - 0x8AAB: 0x559A, - 0x8AAC: 0x582A, - 0x8AAD: 0x59E6, - 0x8AAE: 0x5B8C, - 0x8AAF: 0x5B98, - 0x8AB0: 0x5BDB, - 0x8AB1: 0x5E72, - 0x8AB2: 0x5E79, - 0x8AB3: 0x60A3, - 0x8AB4: 0x611F, - 0x8AB5: 0x6163, - 0x8AB6: 0x61BE, - 0x8AB7: 0x63DB, - 0x8AB8: 0x6562, - 0x8AB9: 0x67D1, - 0x8ABA: 0x6853, - 0x8ABB: 0x68FA, - 0x8ABC: 0x6B3E, - 0x8ABD: 0x6B53, - 0x8ABE: 0x6C57, - 0x8ABF: 0x6F22, - 0x8AC0: 0x6F97, - 0x8AC1: 0x6F45, - 0x8AC2: 0x74B0, - 0x8AC3: 0x7518, - 0x8AC4: 0x76E3, - 0x8AC5: 0x770B, - 0x8AC6: 0x7AFF, - 0x8AC7: 0x7BA1, - 0x8AC8: 0x7C21, - 0x8AC9: 0x7DE9, - 0x8ACA: 0x7F36, - 0x8ACB: 0x7FF0, - 0x8ACC: 0x809D, - 0x8ACD: 0x8266, - 0x8ACE: 0x839E, - 0x8ACF: 0x89B3, - 0x8AD0: 0x8ACC, - 0x8AD1: 0x8CAB, - 0x8AD2: 0x9084, - 0x8AD3: 0x9451, - 0x8AD4: 0x9593, - 0x8AD5: 0x9591, - 0x8AD6: 0x95A2, - 0x8AD7: 0x9665, - 0x8AD8: 0x97D3, - 0x8AD9: 0x9928, - 0x8ADA: 0x8218, - 0x8ADB: 0x4E38, - 0x8ADC: 0x542B, - 0x8ADD: 0x5CB8, - 0x8ADE: 0x5DCC, - 0x8ADF: 0x73A9, - 0x8AE0: 0x764C, - 0x8AE1: 0x773C, - 0x8AE2: 0x5CA9, - 0x8AE3: 0x7FEB, - 0x8AE4: 0x8D0B, - 0x8AE5: 0x96C1, - 0x8AE6: 0x9811, - 0x8AE7: 0x9854, - 0x8AE8: 0x9858, - 0x8AE9: 0x4F01, - 0x8AEA: 0x4F0E, - 0x8AEB: 0x5371, - 0x8AEC: 0x559C, - 0x8AED: 0x5668, - 0x8AEE: 0x57FA, - 0x8AEF: 0x5947, - 0x8AF0: 0x5B09, - 0x8AF1: 0x5BC4, - 0x8AF2: 0x5C90, - 0x8AF3: 0x5E0C, - 0x8AF4: 0x5E7E, - 0x8AF5: 0x5FCC, - 0x8AF6: 0x63EE, - 0x8AF7: 0x673A, - 0x8AF8: 0x65D7, - 0x8AF9: 0x65E2, - 0x8AFA: 0x671F, - 0x8AFB: 0x68CB, - 0x8AFC: 0x68C4, - 0x8B40: 0x6A5F, - 0x8B41: 0x5E30, - 0x8B42: 0x6BC5, - 0x8B43: 0x6C17, - 0x8B44: 0x6C7D, - 0x8B45: 0x757F, - 0x8B46: 0x7948, - 0x8B47: 0x5B63, - 0x8B48: 0x7A00, - 0x8B49: 0x7D00, - 0x8B4A: 0x5FBD, - 0x8B4B: 0x898F, - 0x8B4C: 0x8A18, - 0x8B4D: 0x8CB4, - 0x8B4E: 0x8D77, - 0x8B4F: 0x8ECC, - 0x8B50: 0x8F1D, - 0x8B51: 0x98E2, - 0x8B52: 0x9A0E, - 0x8B53: 0x9B3C, - 0x8B54: 0x4E80, - 0x8B55: 0x507D, - 0x8B56: 0x5100, - 0x8B57: 0x5993, - 0x8B58: 0x5B9C, - 0x8B59: 0x622F, - 0x8B5A: 0x6280, - 0x8B5B: 0x64EC, - 0x8B5C: 0x6B3A, - 0x8B5D: 0x72A0, - 0x8B5E: 0x7591, - 0x8B5F: 0x7947, - 0x8B60: 0x7FA9, - 0x8B61: 0x87FB, - 0x8B62: 0x8ABC, - 0x8B63: 0x8B70, - 0x8B64: 0x63AC, - 0x8B65: 0x83CA, - 0x8B66: 0x97A0, - 0x8B67: 0x5409, - 0x8B68: 0x5403, - 0x8B69: 0x55AB, - 0x8B6A: 0x6854, - 0x8B6B: 0x6A58, - 0x8B6C: 0x8A70, - 0x8B6D: 0x7827, - 0x8B6E: 0x6775, - 0x8B6F: 0x9ECD, - 0x8B70: 0x5374, - 0x8B71: 0x5BA2, - 0x8B72: 0x811A, - 0x8B73: 0x8650, - 0x8B74: 0x9006, - 0x8B75: 0x4E18, - 0x8B76: 0x4E45, - 0x8B77: 0x4EC7, - 0x8B78: 0x4F11, - 0x8B79: 0x53CA, - 0x8B7A: 0x5438, - 0x8B7B: 0x5BAE, - 0x8B7C: 0x5F13, - 0x8B7D: 0x6025, - 0x8B7E: 0x6551, - 0x8B80: 0x673D, - 0x8B81: 0x6C42, - 0x8B82: 0x6C72, - 0x8B83: 0x6CE3, - 0x8B84: 0x7078, - 0x8B85: 0x7403, - 0x8B86: 0x7A76, - 0x8B87: 0x7AAE, - 0x8B88: 0x7B08, - 0x8B89: 0x7D1A, - 0x8B8A: 0x7CFE, - 0x8B8B: 0x7D66, - 0x8B8C: 0x65E7, - 0x8B8D: 0x725B, - 0x8B8E: 0x53BB, - 0x8B8F: 0x5C45, - 0x8B90: 0x5DE8, - 0x8B91: 0x62D2, - 0x8B92: 0x62E0, - 0x8B93: 0x6319, - 0x8B94: 0x6E20, - 0x8B95: 0x865A, - 0x8B96: 0x8A31, - 0x8B97: 0x8DDD, - 0x8B98: 0x92F8, - 0x8B99: 0x6F01, - 0x8B9A: 0x79A6, - 0x8B9B: 0x9B5A, - 0x8B9C: 0x4EA8, - 0x8B9D: 0x4EAB, - 0x8B9E: 0x4EAC, - 0x8B9F: 0x4F9B, - 0x8BA0: 0x4FA0, - 0x8BA1: 0x50D1, - 0x8BA2: 0x5147, - 0x8BA3: 0x7AF6, - 0x8BA4: 0x5171, - 0x8BA5: 0x51F6, - 0x8BA6: 0x5354, - 0x8BA7: 0x5321, - 0x8BA8: 0x537F, - 0x8BA9: 0x53EB, - 0x8BAA: 0x55AC, - 0x8BAB: 0x5883, - 0x8BAC: 0x5CE1, - 0x8BAD: 0x5F37, - 0x8BAE: 0x5F4A, - 0x8BAF: 0x602F, - 0x8BB0: 0x6050, - 0x8BB1: 0x606D, - 0x8BB2: 0x631F, - 0x8BB3: 0x6559, - 0x8BB4: 0x6A4B, - 0x8BB5: 0x6CC1, - 0x8BB6: 0x72C2, - 0x8BB7: 0x72ED, - 0x8BB8: 0x77EF, - 0x8BB9: 0x80F8, - 0x8BBA: 0x8105, - 0x8BBB: 0x8208, - 0x8BBC: 0x854E, - 0x8BBD: 0x90F7, - 0x8BBE: 0x93E1, - 0x8BBF: 0x97FF, - 0x8BC0: 0x9957, - 0x8BC1: 0x9A5A, - 0x8BC2: 0x4EF0, - 0x8BC3: 0x51DD, - 0x8BC4: 0x5C2D, - 0x8BC5: 0x6681, - 0x8BC6: 0x696D, - 0x8BC7: 0x5C40, - 0x8BC8: 0x66F2, - 0x8BC9: 0x6975, - 0x8BCA: 0x7389, - 0x8BCB: 0x6850, - 0x8BCC: 0x7C81, - 0x8BCD: 0x50C5, - 0x8BCE: 0x52E4, - 0x8BCF: 0x5747, - 0x8BD0: 0x5DFE, - 0x8BD1: 0x9326, - 0x8BD2: 0x65A4, - 0x8BD3: 0x6B23, - 0x8BD4: 0x6B3D, - 0x8BD5: 0x7434, - 0x8BD6: 0x7981, - 0x8BD7: 0x79BD, - 0x8BD8: 0x7B4B, - 0x8BD9: 0x7DCA, - 0x8BDA: 0x82B9, - 0x8BDB: 0x83CC, - 0x8BDC: 0x887F, - 0x8BDD: 0x895F, - 0x8BDE: 0x8B39, - 0x8BDF: 0x8FD1, - 0x8BE0: 0x91D1, - 0x8BE1: 0x541F, - 0x8BE2: 0x9280, - 0x8BE3: 0x4E5D, - 0x8BE4: 0x5036, - 0x8BE5: 0x53E5, - 0x8BE6: 0x533A, - 0x8BE7: 0x72D7, - 0x8BE8: 0x7396, - 0x8BE9: 0x77E9, - 0x8BEA: 0x82E6, - 0x8BEB: 0x8EAF, - 0x8BEC: 0x99C6, - 0x8BED: 0x99C8, - 0x8BEE: 0x99D2, - 0x8BEF: 0x5177, - 0x8BF0: 0x611A, - 0x8BF1: 0x865E, - 0x8BF2: 0x55B0, - 0x8BF3: 0x7A7A, - 0x8BF4: 0x5076, - 0x8BF5: 0x5BD3, - 0x8BF6: 0x9047, - 0x8BF7: 0x9685, - 0x8BF8: 0x4E32, - 0x8BF9: 0x6ADB, - 0x8BFA: 0x91E7, - 0x8BFB: 0x5C51, - 0x8BFC: 0x5C48, - 0x8C40: 0x6398, - 0x8C41: 0x7A9F, - 0x8C42: 0x6C93, - 0x8C43: 0x9774, - 0x8C44: 0x8F61, - 0x8C45: 0x7AAA, - 0x8C46: 0x718A, - 0x8C47: 0x9688, - 0x8C48: 0x7C82, - 0x8C49: 0x6817, - 0x8C4A: 0x7E70, - 0x8C4B: 0x6851, - 0x8C4C: 0x936C, - 0x8C4D: 0x52F2, - 0x8C4E: 0x541B, - 0x8C4F: 0x85AB, - 0x8C50: 0x8A13, - 0x8C51: 0x7FA4, - 0x8C52: 0x8ECD, - 0x8C53: 0x90E1, - 0x8C54: 0x5366, - 0x8C55: 0x8888, - 0x8C56: 0x7941, - 0x8C57: 0x4FC2, - 0x8C58: 0x50BE, - 0x8C59: 0x5211, - 0x8C5A: 0x5144, - 0x8C5B: 0x5553, - 0x8C5C: 0x572D, - 0x8C5D: 0x73EA, - 0x8C5E: 0x578B, - 0x8C5F: 0x5951, - 0x8C60: 0x5F62, - 0x8C61: 0x5F84, - 0x8C62: 0x6075, - 0x8C63: 0x6176, - 0x8C64: 0x6167, - 0x8C65: 0x61A9, - 0x8C66: 0x63B2, - 0x8C67: 0x643A, - 0x8C68: 0x656C, - 0x8C69: 0x666F, - 0x8C6A: 0x6842, - 0x8C6B: 0x6E13, - 0x8C6C: 0x7566, - 0x8C6D: 0x7A3D, - 0x8C6E: 0x7CFB, - 0x8C6F: 0x7D4C, - 0x8C70: 0x7D99, - 0x8C71: 0x7E4B, - 0x8C72: 0x7F6B, - 0x8C73: 0x830E, - 0x8C74: 0x834A, - 0x8C75: 0x86CD, - 0x8C76: 0x8A08, - 0x8C77: 0x8A63, - 0x8C78: 0x8B66, - 0x8C79: 0x8EFD, - 0x8C7A: 0x981A, - 0x8C7B: 0x9D8F, - 0x8C7C: 0x82B8, - 0x8C7D: 0x8FCE, - 0x8C7E: 0x9BE8, - 0x8C80: 0x5287, - 0x8C81: 0x621F, - 0x8C82: 0x6483, - 0x8C83: 0x6FC0, - 0x8C84: 0x9699, - 0x8C85: 0x6841, - 0x8C86: 0x5091, - 0x8C87: 0x6B20, - 0x8C88: 0x6C7A, - 0x8C89: 0x6F54, - 0x8C8A: 0x7A74, - 0x8C8B: 0x7D50, - 0x8C8C: 0x8840, - 0x8C8D: 0x8A23, - 0x8C8E: 0x6708, - 0x8C8F: 0x4EF6, - 0x8C90: 0x5039, - 0x8C91: 0x5026, - 0x8C92: 0x5065, - 0x8C93: 0x517C, - 0x8C94: 0x5238, - 0x8C95: 0x5263, - 0x8C96: 0x55A7, - 0x8C97: 0x570F, - 0x8C98: 0x5805, - 0x8C99: 0x5ACC, - 0x8C9A: 0x5EFA, - 0x8C9B: 0x61B2, - 0x8C9C: 0x61F8, - 0x8C9D: 0x62F3, - 0x8C9E: 0x6372, - 0x8C9F: 0x691C, - 0x8CA0: 0x6A29, - 0x8CA1: 0x727D, - 0x8CA2: 0x72AC, - 0x8CA3: 0x732E, - 0x8CA4: 0x7814, - 0x8CA5: 0x786F, - 0x8CA6: 0x7D79, - 0x8CA7: 0x770C, - 0x8CA8: 0x80A9, - 0x8CA9: 0x898B, - 0x8CAA: 0x8B19, - 0x8CAB: 0x8CE2, - 0x8CAC: 0x8ED2, - 0x8CAD: 0x9063, - 0x8CAE: 0x9375, - 0x8CAF: 0x967A, - 0x8CB0: 0x9855, - 0x8CB1: 0x9A13, - 0x8CB2: 0x9E78, - 0x8CB3: 0x5143, - 0x8CB4: 0x539F, - 0x8CB5: 0x53B3, - 0x8CB6: 0x5E7B, - 0x8CB7: 0x5F26, - 0x8CB8: 0x6E1B, - 0x8CB9: 0x6E90, - 0x8CBA: 0x7384, - 0x8CBB: 0x73FE, - 0x8CBC: 0x7D43, - 0x8CBD: 0x8237, - 0x8CBE: 0x8A00, - 0x8CBF: 0x8AFA, - 0x8CC0: 0x9650, - 0x8CC1: 0x4E4E, - 0x8CC2: 0x500B, - 0x8CC3: 0x53E4, - 0x8CC4: 0x547C, - 0x8CC5: 0x56FA, - 0x8CC6: 0x59D1, - 0x8CC7: 0x5B64, - 0x8CC8: 0x5DF1, - 0x8CC9: 0x5EAB, - 0x8CCA: 0x5F27, - 0x8CCB: 0x6238, - 0x8CCC: 0x6545, - 0x8CCD: 0x67AF, - 0x8CCE: 0x6E56, - 0x8CCF: 0x72D0, - 0x8CD0: 0x7CCA, - 0x8CD1: 0x88B4, - 0x8CD2: 0x80A1, - 0x8CD3: 0x80E1, - 0x8CD4: 0x83F0, - 0x8CD5: 0x864E, - 0x8CD6: 0x8A87, - 0x8CD7: 0x8DE8, - 0x8CD8: 0x9237, - 0x8CD9: 0x96C7, - 0x8CDA: 0x9867, - 0x8CDB: 0x9F13, - 0x8CDC: 0x4E94, - 0x8CDD: 0x4E92, - 0x8CDE: 0x4F0D, - 0x8CDF: 0x5348, - 0x8CE0: 0x5449, - 0x8CE1: 0x543E, - 0x8CE2: 0x5A2F, - 0x8CE3: 0x5F8C, - 0x8CE4: 0x5FA1, - 0x8CE5: 0x609F, - 0x8CE6: 0x68A7, - 0x8CE7: 0x6A8E, - 0x8CE8: 0x745A, - 0x8CE9: 0x7881, - 0x8CEA: 0x8A9E, - 0x8CEB: 0x8AA4, - 0x8CEC: 0x8B77, - 0x8CED: 0x9190, - 0x8CEE: 0x4E5E, - 0x8CEF: 0x9BC9, - 0x8CF0: 0x4EA4, - 0x8CF1: 0x4F7C, - 0x8CF2: 0x4FAF, - 0x8CF3: 0x5019, - 0x8CF4: 0x5016, - 0x8CF5: 0x5149, - 0x8CF6: 0x516C, - 0x8CF7: 0x529F, - 0x8CF8: 0x52B9, - 0x8CF9: 0x52FE, - 0x8CFA: 0x539A, - 0x8CFB: 0x53E3, - 0x8CFC: 0x5411, - 0x8D40: 0x540E, - 0x8D41: 0x5589, - 0x8D42: 0x5751, - 0x8D43: 0x57A2, - 0x8D44: 0x597D, - 0x8D45: 0x5B54, - 0x8D46: 0x5B5D, - 0x8D47: 0x5B8F, - 0x8D48: 0x5DE5, - 0x8D49: 0x5DE7, - 0x8D4A: 0x5DF7, - 0x8D4B: 0x5E78, - 0x8D4C: 0x5E83, - 0x8D4D: 0x5E9A, - 0x8D4E: 0x5EB7, - 0x8D4F: 0x5F18, - 0x8D50: 0x6052, - 0x8D51: 0x614C, - 0x8D52: 0x6297, - 0x8D53: 0x62D8, - 0x8D54: 0x63A7, - 0x8D55: 0x653B, - 0x8D56: 0x6602, - 0x8D57: 0x6643, - 0x8D58: 0x66F4, - 0x8D59: 0x676D, - 0x8D5A: 0x6821, - 0x8D5B: 0x6897, - 0x8D5C: 0x69CB, - 0x8D5D: 0x6C5F, - 0x8D5E: 0x6D2A, - 0x8D5F: 0x6D69, - 0x8D60: 0x6E2F, - 0x8D61: 0x6E9D, - 0x8D62: 0x7532, - 0x8D63: 0x7687, - 0x8D64: 0x786C, - 0x8D65: 0x7A3F, - 0x8D66: 0x7CE0, - 0x8D67: 0x7D05, - 0x8D68: 0x7D18, - 0x8D69: 0x7D5E, - 0x8D6A: 0x7DB1, - 0x8D6B: 0x8015, - 0x8D6C: 0x8003, - 0x8D6D: 0x80AF, - 0x8D6E: 0x80B1, - 0x8D6F: 0x8154, - 0x8D70: 0x818F, - 0x8D71: 0x822A, - 0x8D72: 0x8352, - 0x8D73: 0x884C, - 0x8D74: 0x8861, - 0x8D75: 0x8B1B, - 0x8D76: 0x8CA2, - 0x8D77: 0x8CFC, - 0x8D78: 0x90CA, - 0x8D79: 0x9175, - 0x8D7A: 0x9271, - 0x8D7B: 0x783F, - 0x8D7C: 0x92FC, - 0x8D7D: 0x95A4, - 0x8D7E: 0x964D, - 0x8D80: 0x9805, - 0x8D81: 0x9999, - 0x8D82: 0x9AD8, - 0x8D83: 0x9D3B, - 0x8D84: 0x525B, - 0x8D85: 0x52AB, - 0x8D86: 0x53F7, - 0x8D87: 0x5408, - 0x8D88: 0x58D5, - 0x8D89: 0x62F7, - 0x8D8A: 0x6FE0, - 0x8D8B: 0x8C6A, - 0x8D8C: 0x8F5F, - 0x8D8D: 0x9EB9, - 0x8D8E: 0x514B, - 0x8D8F: 0x523B, - 0x8D90: 0x544A, - 0x8D91: 0x56FD, - 0x8D92: 0x7A40, - 0x8D93: 0x9177, - 0x8D94: 0x9D60, - 0x8D95: 0x9ED2, - 0x8D96: 0x7344, - 0x8D97: 0x6F09, - 0x8D98: 0x8170, - 0x8D99: 0x7511, - 0x8D9A: 0x5FFD, - 0x8D9B: 0x60DA, - 0x8D9C: 0x9AA8, - 0x8D9D: 0x72DB, - 0x8D9E: 0x8FBC, - 0x8D9F: 0x6B64, - 0x8DA0: 0x9803, - 0x8DA1: 0x4ECA, - 0x8DA2: 0x56F0, - 0x8DA3: 0x5764, - 0x8DA4: 0x58BE, - 0x8DA5: 0x5A5A, - 0x8DA6: 0x6068, - 0x8DA7: 0x61C7, - 0x8DA8: 0x660F, - 0x8DA9: 0x6606, - 0x8DAA: 0x6839, - 0x8DAB: 0x68B1, - 0x8DAC: 0x6DF7, - 0x8DAD: 0x75D5, - 0x8DAE: 0x7D3A, - 0x8DAF: 0x826E, - 0x8DB0: 0x9B42, - 0x8DB1: 0x4E9B, - 0x8DB2: 0x4F50, - 0x8DB3: 0x53C9, - 0x8DB4: 0x5506, - 0x8DB5: 0x5D6F, - 0x8DB6: 0x5DE6, - 0x8DB7: 0x5DEE, - 0x8DB8: 0x67FB, - 0x8DB9: 0x6C99, - 0x8DBA: 0x7473, - 0x8DBB: 0x7802, - 0x8DBC: 0x8A50, - 0x8DBD: 0x9396, - 0x8DBE: 0x88DF, - 0x8DBF: 0x5750, - 0x8DC0: 0x5EA7, - 0x8DC1: 0x632B, - 0x8DC2: 0x50B5, - 0x8DC3: 0x50AC, - 0x8DC4: 0x518D, - 0x8DC5: 0x6700, - 0x8DC6: 0x54C9, - 0x8DC7: 0x585E, - 0x8DC8: 0x59BB, - 0x8DC9: 0x5BB0, - 0x8DCA: 0x5F69, - 0x8DCB: 0x624D, - 0x8DCC: 0x63A1, - 0x8DCD: 0x683D, - 0x8DCE: 0x6B73, - 0x8DCF: 0x6E08, - 0x8DD0: 0x707D, - 0x8DD1: 0x91C7, - 0x8DD2: 0x7280, - 0x8DD3: 0x7815, - 0x8DD4: 0x7826, - 0x8DD5: 0x796D, - 0x8DD6: 0x658E, - 0x8DD7: 0x7D30, - 0x8DD8: 0x83DC, - 0x8DD9: 0x88C1, - 0x8DDA: 0x8F09, - 0x8DDB: 0x969B, - 0x8DDC: 0x5264, - 0x8DDD: 0x5728, - 0x8DDE: 0x6750, - 0x8DDF: 0x7F6A, - 0x8DE0: 0x8CA1, - 0x8DE1: 0x51B4, - 0x8DE2: 0x5742, - 0x8DE3: 0x962A, - 0x8DE4: 0x583A, - 0x8DE5: 0x698A, - 0x8DE6: 0x80B4, - 0x8DE7: 0x54B2, - 0x8DE8: 0x5D0E, - 0x8DE9: 0x57FC, - 0x8DEA: 0x7895, - 0x8DEB: 0x9DFA, - 0x8DEC: 0x4F5C, - 0x8DED: 0x524A, - 0x8DEE: 0x548B, - 0x8DEF: 0x643E, - 0x8DF0: 0x6628, - 0x8DF1: 0x6714, - 0x8DF2: 0x67F5, - 0x8DF3: 0x7A84, - 0x8DF4: 0x7B56, - 0x8DF5: 0x7D22, - 0x8DF6: 0x932F, - 0x8DF7: 0x685C, - 0x8DF8: 0x9BAD, - 0x8DF9: 0x7B39, - 0x8DFA: 0x5319, - 0x8DFB: 0x518A, - 0x8DFC: 0x5237, - 0x8E40: 0x5BDF, - 0x8E41: 0x62F6, - 0x8E42: 0x64AE, - 0x8E43: 0x64E6, - 0x8E44: 0x672D, - 0x8E45: 0x6BBA, - 0x8E46: 0x85A9, - 0x8E47: 0x96D1, - 0x8E48: 0x7690, - 0x8E49: 0x9BD6, - 0x8E4A: 0x634C, - 0x8E4B: 0x9306, - 0x8E4C: 0x9BAB, - 0x8E4D: 0x76BF, - 0x8E4E: 0x6652, - 0x8E4F: 0x4E09, - 0x8E50: 0x5098, - 0x8E51: 0x53C2, - 0x8E52: 0x5C71, - 0x8E53: 0x60E8, - 0x8E54: 0x6492, - 0x8E55: 0x6563, - 0x8E56: 0x685F, - 0x8E57: 0x71E6, - 0x8E58: 0x73CA, - 0x8E59: 0x7523, - 0x8E5A: 0x7B97, - 0x8E5B: 0x7E82, - 0x8E5C: 0x8695, - 0x8E5D: 0x8B83, - 0x8E5E: 0x8CDB, - 0x8E5F: 0x9178, - 0x8E60: 0x9910, - 0x8E61: 0x65AC, - 0x8E62: 0x66AB, - 0x8E63: 0x6B8B, - 0x8E64: 0x4ED5, - 0x8E65: 0x4ED4, - 0x8E66: 0x4F3A, - 0x8E67: 0x4F7F, - 0x8E68: 0x523A, - 0x8E69: 0x53F8, - 0x8E6A: 0x53F2, - 0x8E6B: 0x55E3, - 0x8E6C: 0x56DB, - 0x8E6D: 0x58EB, - 0x8E6E: 0x59CB, - 0x8E6F: 0x59C9, - 0x8E70: 0x59FF, - 0x8E71: 0x5B50, - 0x8E72: 0x5C4D, - 0x8E73: 0x5E02, - 0x8E74: 0x5E2B, - 0x8E75: 0x5FD7, - 0x8E76: 0x601D, - 0x8E77: 0x6307, - 0x8E78: 0x652F, - 0x8E79: 0x5B5C, - 0x8E7A: 0x65AF, - 0x8E7B: 0x65BD, - 0x8E7C: 0x65E8, - 0x8E7D: 0x679D, - 0x8E7E: 0x6B62, - 0x8E80: 0x6B7B, - 0x8E81: 0x6C0F, - 0x8E82: 0x7345, - 0x8E83: 0x7949, - 0x8E84: 0x79C1, - 0x8E85: 0x7CF8, - 0x8E86: 0x7D19, - 0x8E87: 0x7D2B, - 0x8E88: 0x80A2, - 0x8E89: 0x8102, - 0x8E8A: 0x81F3, - 0x8E8B: 0x8996, - 0x8E8C: 0x8A5E, - 0x8E8D: 0x8A69, - 0x8E8E: 0x8A66, - 0x8E8F: 0x8A8C, - 0x8E90: 0x8AEE, - 0x8E91: 0x8CC7, - 0x8E92: 0x8CDC, - 0x8E93: 0x96CC, - 0x8E94: 0x98FC, - 0x8E95: 0x6B6F, - 0x8E96: 0x4E8B, - 0x8E97: 0x4F3C, - 0x8E98: 0x4F8D, - 0x8E99: 0x5150, - 0x8E9A: 0x5B57, - 0x8E9B: 0x5BFA, - 0x8E9C: 0x6148, - 0x8E9D: 0x6301, - 0x8E9E: 0x6642, - 0x8E9F: 0x6B21, - 0x8EA0: 0x6ECB, - 0x8EA1: 0x6CBB, - 0x8EA2: 0x723E, - 0x8EA3: 0x74BD, - 0x8EA4: 0x75D4, - 0x8EA5: 0x78C1, - 0x8EA6: 0x793A, - 0x8EA7: 0x800C, - 0x8EA8: 0x8033, - 0x8EA9: 0x81EA, - 0x8EAA: 0x8494, - 0x8EAB: 0x8F9E, - 0x8EAC: 0x6C50, - 0x8EAD: 0x9E7F, - 0x8EAE: 0x5F0F, - 0x8EAF: 0x8B58, - 0x8EB0: 0x9D2B, - 0x8EB1: 0x7AFA, - 0x8EB2: 0x8EF8, - 0x8EB3: 0x5B8D, - 0x8EB4: 0x96EB, - 0x8EB5: 0x4E03, - 0x8EB6: 0x53F1, - 0x8EB7: 0x57F7, - 0x8EB8: 0x5931, - 0x8EB9: 0x5AC9, - 0x8EBA: 0x5BA4, - 0x8EBB: 0x6089, - 0x8EBC: 0x6E7F, - 0x8EBD: 0x6F06, - 0x8EBE: 0x75BE, - 0x8EBF: 0x8CEA, - 0x8EC0: 0x5B9F, - 0x8EC1: 0x8500, - 0x8EC2: 0x7BE0, - 0x8EC3: 0x5072, - 0x8EC4: 0x67F4, - 0x8EC5: 0x829D, - 0x8EC6: 0x5C61, - 0x8EC7: 0x854A, - 0x8EC8: 0x7E1E, - 0x8EC9: 0x820E, - 0x8ECA: 0x5199, - 0x8ECB: 0x5C04, - 0x8ECC: 0x6368, - 0x8ECD: 0x8D66, - 0x8ECE: 0x659C, - 0x8ECF: 0x716E, - 0x8ED0: 0x793E, - 0x8ED1: 0x7D17, - 0x8ED2: 0x8005, - 0x8ED3: 0x8B1D, - 0x8ED4: 0x8ECA, - 0x8ED5: 0x906E, - 0x8ED6: 0x86C7, - 0x8ED7: 0x90AA, - 0x8ED8: 0x501F, - 0x8ED9: 0x52FA, - 0x8EDA: 0x5C3A, - 0x8EDB: 0x6753, - 0x8EDC: 0x707C, - 0x8EDD: 0x7235, - 0x8EDE: 0x914C, - 0x8EDF: 0x91C8, - 0x8EE0: 0x932B, - 0x8EE1: 0x82E5, - 0x8EE2: 0x5BC2, - 0x8EE3: 0x5F31, - 0x8EE4: 0x60F9, - 0x8EE5: 0x4E3B, - 0x8EE6: 0x53D6, - 0x8EE7: 0x5B88, - 0x8EE8: 0x624B, - 0x8EE9: 0x6731, - 0x8EEA: 0x6B8A, - 0x8EEB: 0x72E9, - 0x8EEC: 0x73E0, - 0x8EED: 0x7A2E, - 0x8EEE: 0x816B, - 0x8EEF: 0x8DA3, - 0x8EF0: 0x9152, - 0x8EF1: 0x9996, - 0x8EF2: 0x5112, - 0x8EF3: 0x53D7, - 0x8EF4: 0x546A, - 0x8EF5: 0x5BFF, - 0x8EF6: 0x6388, - 0x8EF7: 0x6A39, - 0x8EF8: 0x7DAC, - 0x8EF9: 0x9700, - 0x8EFA: 0x56DA, - 0x8EFB: 0x53CE, - 0x8EFC: 0x5468, - 0x8F40: 0x5B97, - 0x8F41: 0x5C31, - 0x8F42: 0x5DDE, - 0x8F43: 0x4FEE, - 0x8F44: 0x6101, - 0x8F45: 0x62FE, - 0x8F46: 0x6D32, - 0x8F47: 0x79C0, - 0x8F48: 0x79CB, - 0x8F49: 0x7D42, - 0x8F4A: 0x7E4D, - 0x8F4B: 0x7FD2, - 0x8F4C: 0x81ED, - 0x8F4D: 0x821F, - 0x8F4E: 0x8490, - 0x8F4F: 0x8846, - 0x8F50: 0x8972, - 0x8F51: 0x8B90, - 0x8F52: 0x8E74, - 0x8F53: 0x8F2F, - 0x8F54: 0x9031, - 0x8F55: 0x914B, - 0x8F56: 0x916C, - 0x8F57: 0x96C6, - 0x8F58: 0x919C, - 0x8F59: 0x4EC0, - 0x8F5A: 0x4F4F, - 0x8F5B: 0x5145, - 0x8F5C: 0x5341, - 0x8F5D: 0x5F93, - 0x8F5E: 0x620E, - 0x8F5F: 0x67D4, - 0x8F60: 0x6C41, - 0x8F61: 0x6E0B, - 0x8F62: 0x7363, - 0x8F63: 0x7E26, - 0x8F64: 0x91CD, - 0x8F65: 0x9283, - 0x8F66: 0x53D4, - 0x8F67: 0x5919, - 0x8F68: 0x5BBF, - 0x8F69: 0x6DD1, - 0x8F6A: 0x795D, - 0x8F6B: 0x7E2E, - 0x8F6C: 0x7C9B, - 0x8F6D: 0x587E, - 0x8F6E: 0x719F, - 0x8F6F: 0x51FA, - 0x8F70: 0x8853, - 0x8F71: 0x8FF0, - 0x8F72: 0x4FCA, - 0x8F73: 0x5CFB, - 0x8F74: 0x6625, - 0x8F75: 0x77AC, - 0x8F76: 0x7AE3, - 0x8F77: 0x821C, - 0x8F78: 0x99FF, - 0x8F79: 0x51C6, - 0x8F7A: 0x5FAA, - 0x8F7B: 0x65EC, - 0x8F7C: 0x696F, - 0x8F7D: 0x6B89, - 0x8F7E: 0x6DF3, - 0x8F80: 0x6E96, - 0x8F81: 0x6F64, - 0x8F82: 0x76FE, - 0x8F83: 0x7D14, - 0x8F84: 0x5DE1, - 0x8F85: 0x9075, - 0x8F86: 0x9187, - 0x8F87: 0x9806, - 0x8F88: 0x51E6, - 0x8F89: 0x521D, - 0x8F8A: 0x6240, - 0x8F8B: 0x6691, - 0x8F8C: 0x66D9, - 0x8F8D: 0x6E1A, - 0x8F8E: 0x5EB6, - 0x8F8F: 0x7DD2, - 0x8F90: 0x7F72, - 0x8F91: 0x66F8, - 0x8F92: 0x85AF, - 0x8F93: 0x85F7, - 0x8F94: 0x8AF8, - 0x8F95: 0x52A9, - 0x8F96: 0x53D9, - 0x8F97: 0x5973, - 0x8F98: 0x5E8F, - 0x8F99: 0x5F90, - 0x8F9A: 0x6055, - 0x8F9B: 0x92E4, - 0x8F9C: 0x9664, - 0x8F9D: 0x50B7, - 0x8F9E: 0x511F, - 0x8F9F: 0x52DD, - 0x8FA0: 0x5320, - 0x8FA1: 0x5347, - 0x8FA2: 0x53EC, - 0x8FA3: 0x54E8, - 0x8FA4: 0x5546, - 0x8FA5: 0x5531, - 0x8FA6: 0x5617, - 0x8FA7: 0x5968, - 0x8FA8: 0x59BE, - 0x8FA9: 0x5A3C, - 0x8FAA: 0x5BB5, - 0x8FAB: 0x5C06, - 0x8FAC: 0x5C0F, - 0x8FAD: 0x5C11, - 0x8FAE: 0x5C1A, - 0x8FAF: 0x5E84, - 0x8FB0: 0x5E8A, - 0x8FB1: 0x5EE0, - 0x8FB2: 0x5F70, - 0x8FB3: 0x627F, - 0x8FB4: 0x6284, - 0x8FB5: 0x62DB, - 0x8FB6: 0x638C, - 0x8FB7: 0x6377, - 0x8FB8: 0x6607, - 0x8FB9: 0x660C, - 0x8FBA: 0x662D, - 0x8FBB: 0x6676, - 0x8FBC: 0x677E, - 0x8FBD: 0x68A2, - 0x8FBE: 0x6A1F, - 0x8FBF: 0x6A35, - 0x8FC0: 0x6CBC, - 0x8FC1: 0x6D88, - 0x8FC2: 0x6E09, - 0x8FC3: 0x6E58, - 0x8FC4: 0x713C, - 0x8FC5: 0x7126, - 0x8FC6: 0x7167, - 0x8FC7: 0x75C7, - 0x8FC8: 0x7701, - 0x8FC9: 0x785D, - 0x8FCA: 0x7901, - 0x8FCB: 0x7965, - 0x8FCC: 0x79F0, - 0x8FCD: 0x7AE0, - 0x8FCE: 0x7B11, - 0x8FCF: 0x7CA7, - 0x8FD0: 0x7D39, - 0x8FD1: 0x8096, - 0x8FD2: 0x83D6, - 0x8FD3: 0x848B, - 0x8FD4: 0x8549, - 0x8FD5: 0x885D, - 0x8FD6: 0x88F3, - 0x8FD7: 0x8A1F, - 0x8FD8: 0x8A3C, - 0x8FD9: 0x8A54, - 0x8FDA: 0x8A73, - 0x8FDB: 0x8C61, - 0x8FDC: 0x8CDE, - 0x8FDD: 0x91A4, - 0x8FDE: 0x9266, - 0x8FDF: 0x937E, - 0x8FE0: 0x9418, - 0x8FE1: 0x969C, - 0x8FE2: 0x9798, - 0x8FE3: 0x4E0A, - 0x8FE4: 0x4E08, - 0x8FE5: 0x4E1E, - 0x8FE6: 0x4E57, - 0x8FE7: 0x5197, - 0x8FE8: 0x5270, - 0x8FE9: 0x57CE, - 0x8FEA: 0x5834, - 0x8FEB: 0x58CC, - 0x8FEC: 0x5B22, - 0x8FED: 0x5E38, - 0x8FEE: 0x60C5, - 0x8FEF: 0x64FE, - 0x8FF0: 0x6761, - 0x8FF1: 0x6756, - 0x8FF2: 0x6D44, - 0x8FF3: 0x72B6, - 0x8FF4: 0x7573, - 0x8FF5: 0x7A63, - 0x8FF6: 0x84B8, - 0x8FF7: 0x8B72, - 0x8FF8: 0x91B8, - 0x8FF9: 0x9320, - 0x8FFA: 0x5631, - 0x8FFB: 0x57F4, - 0x8FFC: 0x98FE, - 0x9040: 0x62ED, - 0x9041: 0x690D, - 0x9042: 0x6B96, - 0x9043: 0x71ED, - 0x9044: 0x7E54, - 0x9045: 0x8077, - 0x9046: 0x8272, - 0x9047: 0x89E6, - 0x9048: 0x98DF, - 0x9049: 0x8755, - 0x904A: 0x8FB1, - 0x904B: 0x5C3B, - 0x904C: 0x4F38, - 0x904D: 0x4FE1, - 0x904E: 0x4FB5, - 0x904F: 0x5507, - 0x9050: 0x5A20, - 0x9051: 0x5BDD, - 0x9052: 0x5BE9, - 0x9053: 0x5FC3, - 0x9054: 0x614E, - 0x9055: 0x632F, - 0x9056: 0x65B0, - 0x9057: 0x664B, - 0x9058: 0x68EE, - 0x9059: 0x699B, - 0x905A: 0x6D78, - 0x905B: 0x6DF1, - 0x905C: 0x7533, - 0x905D: 0x75B9, - 0x905E: 0x771F, - 0x905F: 0x795E, - 0x9060: 0x79E6, - 0x9061: 0x7D33, - 0x9062: 0x81E3, - 0x9063: 0x82AF, - 0x9064: 0x85AA, - 0x9065: 0x89AA, - 0x9066: 0x8A3A, - 0x9067: 0x8EAB, - 0x9068: 0x8F9B, - 0x9069: 0x9032, - 0x906A: 0x91DD, - 0x906B: 0x9707, - 0x906C: 0x4EBA, - 0x906D: 0x4EC1, - 0x906E: 0x5203, - 0x906F: 0x5875, - 0x9070: 0x58EC, - 0x9071: 0x5C0B, - 0x9072: 0x751A, - 0x9073: 0x5C3D, - 0x9074: 0x814E, - 0x9075: 0x8A0A, - 0x9076: 0x8FC5, - 0x9077: 0x9663, - 0x9078: 0x976D, - 0x9079: 0x7B25, - 0x907A: 0x8ACF, - 0x907B: 0x9808, - 0x907C: 0x9162, - 0x907D: 0x56F3, - 0x907E: 0x53A8, - 0x9080: 0x9017, - 0x9081: 0x5439, - 0x9082: 0x5782, - 0x9083: 0x5E25, - 0x9084: 0x63A8, - 0x9085: 0x6C34, - 0x9086: 0x708A, - 0x9087: 0x7761, - 0x9088: 0x7C8B, - 0x9089: 0x7FE0, - 0x908A: 0x8870, - 0x908B: 0x9042, - 0x908C: 0x9154, - 0x908D: 0x9310, - 0x908E: 0x9318, - 0x908F: 0x968F, - 0x9090: 0x745E, - 0x9091: 0x9AC4, - 0x9092: 0x5D07, - 0x9093: 0x5D69, - 0x9094: 0x6570, - 0x9095: 0x67A2, - 0x9096: 0x8DA8, - 0x9097: 0x96DB, - 0x9098: 0x636E, - 0x9099: 0x6749, - 0x909A: 0x6919, - 0x909B: 0x83C5, - 0x909C: 0x9817, - 0x909D: 0x96C0, - 0x909E: 0x88FE, - 0x909F: 0x6F84, - 0x90A0: 0x647A, - 0x90A1: 0x5BF8, - 0x90A2: 0x4E16, - 0x90A3: 0x702C, - 0x90A4: 0x755D, - 0x90A5: 0x662F, - 0x90A6: 0x51C4, - 0x90A7: 0x5236, - 0x90A8: 0x52E2, - 0x90A9: 0x59D3, - 0x90AA: 0x5F81, - 0x90AB: 0x6027, - 0x90AC: 0x6210, - 0x90AD: 0x653F, - 0x90AE: 0x6574, - 0x90AF: 0x661F, - 0x90B0: 0x6674, - 0x90B1: 0x68F2, - 0x90B2: 0x6816, - 0x90B3: 0x6B63, - 0x90B4: 0x6E05, - 0x90B5: 0x7272, - 0x90B6: 0x751F, - 0x90B7: 0x76DB, - 0x90B8: 0x7CBE, - 0x90B9: 0x8056, - 0x90BA: 0x58F0, - 0x90BB: 0x88FD, - 0x90BC: 0x897F, - 0x90BD: 0x8AA0, - 0x90BE: 0x8A93, - 0x90BF: 0x8ACB, - 0x90C0: 0x901D, - 0x90C1: 0x9192, - 0x90C2: 0x9752, - 0x90C3: 0x9759, - 0x90C4: 0x6589, - 0x90C5: 0x7A0E, - 0x90C6: 0x8106, - 0x90C7: 0x96BB, - 0x90C8: 0x5E2D, - 0x90C9: 0x60DC, - 0x90CA: 0x621A, - 0x90CB: 0x65A5, - 0x90CC: 0x6614, - 0x90CD: 0x6790, - 0x90CE: 0x77F3, - 0x90CF: 0x7A4D, - 0x90D0: 0x7C4D, - 0x90D1: 0x7E3E, - 0x90D2: 0x810A, - 0x90D3: 0x8CAC, - 0x90D4: 0x8D64, - 0x90D5: 0x8DE1, - 0x90D6: 0x8E5F, - 0x90D7: 0x78A9, - 0x90D8: 0x5207, - 0x90D9: 0x62D9, - 0x90DA: 0x63A5, - 0x90DB: 0x6442, - 0x90DC: 0x6298, - 0x90DD: 0x8A2D, - 0x90DE: 0x7A83, - 0x90DF: 0x7BC0, - 0x90E0: 0x8AAC, - 0x90E1: 0x96EA, - 0x90E2: 0x7D76, - 0x90E3: 0x820C, - 0x90E4: 0x8749, - 0x90E5: 0x4ED9, - 0x90E6: 0x5148, - 0x90E7: 0x5343, - 0x90E8: 0x5360, - 0x90E9: 0x5BA3, - 0x90EA: 0x5C02, - 0x90EB: 0x5C16, - 0x90EC: 0x5DDD, - 0x90ED: 0x6226, - 0x90EE: 0x6247, - 0x90EF: 0x64B0, - 0x90F0: 0x6813, - 0x90F1: 0x6834, - 0x90F2: 0x6CC9, - 0x90F3: 0x6D45, - 0x90F4: 0x6D17, - 0x90F5: 0x67D3, - 0x90F6: 0x6F5C, - 0x90F7: 0x714E, - 0x90F8: 0x717D, - 0x90F9: 0x65CB, - 0x90FA: 0x7A7F, - 0x90FB: 0x7BAD, - 0x90FC: 0x7DDA, - 0x9140: 0x7E4A, - 0x9141: 0x7FA8, - 0x9142: 0x817A, - 0x9143: 0x821B, - 0x9144: 0x8239, - 0x9145: 0x85A6, - 0x9146: 0x8A6E, - 0x9147: 0x8CCE, - 0x9148: 0x8DF5, - 0x9149: 0x9078, - 0x914A: 0x9077, - 0x914B: 0x92AD, - 0x914C: 0x9291, - 0x914D: 0x9583, - 0x914E: 0x9BAE, - 0x914F: 0x524D, - 0x9150: 0x5584, - 0x9151: 0x6F38, - 0x9152: 0x7136, - 0x9153: 0x5168, - 0x9154: 0x7985, - 0x9155: 0x7E55, - 0x9156: 0x81B3, - 0x9157: 0x7CCE, - 0x9158: 0x564C, - 0x9159: 0x5851, - 0x915A: 0x5CA8, - 0x915B: 0x63AA, - 0x915C: 0x66FE, - 0x915D: 0x66FD, - 0x915E: 0x695A, - 0x915F: 0x72D9, - 0x9160: 0x758F, - 0x9161: 0x758E, - 0x9162: 0x790E, - 0x9163: 0x7956, - 0x9164: 0x79DF, - 0x9165: 0x7C97, - 0x9166: 0x7D20, - 0x9167: 0x7D44, - 0x9168: 0x8607, - 0x9169: 0x8A34, - 0x916A: 0x963B, - 0x916B: 0x9061, - 0x916C: 0x9F20, - 0x916D: 0x50E7, - 0x916E: 0x5275, - 0x916F: 0x53CC, - 0x9170: 0x53E2, - 0x9171: 0x5009, - 0x9172: 0x55AA, - 0x9173: 0x58EE, - 0x9174: 0x594F, - 0x9175: 0x723D, - 0x9176: 0x5B8B, - 0x9177: 0x5C64, - 0x9178: 0x531D, - 0x9179: 0x60E3, - 0x917A: 0x60F3, - 0x917B: 0x635C, - 0x917C: 0x6383, - 0x917D: 0x633F, - 0x917E: 0x63BB, - 0x9180: 0x64CD, - 0x9181: 0x65E9, - 0x9182: 0x66F9, - 0x9183: 0x5DE3, - 0x9184: 0x69CD, - 0x9185: 0x69FD, - 0x9186: 0x6F15, - 0x9187: 0x71E5, - 0x9188: 0x4E89, - 0x9189: 0x75E9, - 0x918A: 0x76F8, - 0x918B: 0x7A93, - 0x918C: 0x7CDF, - 0x918D: 0x7DCF, - 0x918E: 0x7D9C, - 0x918F: 0x8061, - 0x9190: 0x8349, - 0x9191: 0x8358, - 0x9192: 0x846C, - 0x9193: 0x84BC, - 0x9194: 0x85FB, - 0x9195: 0x88C5, - 0x9196: 0x8D70, - 0x9197: 0x9001, - 0x9198: 0x906D, - 0x9199: 0x9397, - 0x919A: 0x971C, - 0x919B: 0x9A12, - 0x919C: 0x50CF, - 0x919D: 0x5897, - 0x919E: 0x618E, - 0x919F: 0x81D3, - 0x91A0: 0x8535, - 0x91A1: 0x8D08, - 0x91A2: 0x9020, - 0x91A3: 0x4FC3, - 0x91A4: 0x5074, - 0x91A5: 0x5247, - 0x91A6: 0x5373, - 0x91A7: 0x606F, - 0x91A8: 0x6349, - 0x91A9: 0x675F, - 0x91AA: 0x6E2C, - 0x91AB: 0x8DB3, - 0x91AC: 0x901F, - 0x91AD: 0x4FD7, - 0x91AE: 0x5C5E, - 0x91AF: 0x8CCA, - 0x91B0: 0x65CF, - 0x91B1: 0x7D9A, - 0x91B2: 0x5352, - 0x91B3: 0x8896, - 0x91B4: 0x5176, - 0x91B5: 0x63C3, - 0x91B6: 0x5B58, - 0x91B7: 0x5B6B, - 0x91B8: 0x5C0A, - 0x91B9: 0x640D, - 0x91BA: 0x6751, - 0x91BB: 0x905C, - 0x91BC: 0x4ED6, - 0x91BD: 0x591A, - 0x91BE: 0x592A, - 0x91BF: 0x6C70, - 0x91C0: 0x8A51, - 0x91C1: 0x553E, - 0x91C2: 0x5815, - 0x91C3: 0x59A5, - 0x91C4: 0x60F0, - 0x91C5: 0x6253, - 0x91C6: 0x67C1, - 0x91C7: 0x8235, - 0x91C8: 0x6955, - 0x91C9: 0x9640, - 0x91CA: 0x99C4, - 0x91CB: 0x9A28, - 0x91CC: 0x4F53, - 0x91CD: 0x5806, - 0x91CE: 0x5BFE, - 0x91CF: 0x8010, - 0x91D0: 0x5CB1, - 0x91D1: 0x5E2F, - 0x91D2: 0x5F85, - 0x91D3: 0x6020, - 0x91D4: 0x614B, - 0x91D5: 0x6234, - 0x91D6: 0x66FF, - 0x91D7: 0x6CF0, - 0x91D8: 0x6EDE, - 0x91D9: 0x80CE, - 0x91DA: 0x817F, - 0x91DB: 0x82D4, - 0x91DC: 0x888B, - 0x91DD: 0x8CB8, - 0x91DE: 0x9000, - 0x91DF: 0x902E, - 0x91E0: 0x968A, - 0x91E1: 0x9EDB, - 0x91E2: 0x9BDB, - 0x91E3: 0x4EE3, - 0x91E4: 0x53F0, - 0x91E5: 0x5927, - 0x91E6: 0x7B2C, - 0x91E7: 0x918D, - 0x91E8: 0x984C, - 0x91E9: 0x9DF9, - 0x91EA: 0x6EDD, - 0x91EB: 0x7027, - 0x91EC: 0x5353, - 0x91ED: 0x5544, - 0x91EE: 0x5B85, - 0x91EF: 0x6258, - 0x91F0: 0x629E, - 0x91F1: 0x62D3, - 0x91F2: 0x6CA2, - 0x91F3: 0x6FEF, - 0x91F4: 0x7422, - 0x91F5: 0x8A17, - 0x91F6: 0x9438, - 0x91F7: 0x6FC1, - 0x91F8: 0x8AFE, - 0x91F9: 0x8338, - 0x91FA: 0x51E7, - 0x91FB: 0x86F8, - 0x91FC: 0x53EA, - 0x9240: 0x53E9, - 0x9241: 0x4F46, - 0x9242: 0x9054, - 0x9243: 0x8FB0, - 0x9244: 0x596A, - 0x9245: 0x8131, - 0x9246: 0x5DFD, - 0x9247: 0x7AEA, - 0x9248: 0x8FBF, - 0x9249: 0x68DA, - 0x924A: 0x8C37, - 0x924B: 0x72F8, - 0x924C: 0x9C48, - 0x924D: 0x6A3D, - 0x924E: 0x8AB0, - 0x924F: 0x4E39, - 0x9250: 0x5358, - 0x9251: 0x5606, - 0x9252: 0x5766, - 0x9253: 0x62C5, - 0x9254: 0x63A2, - 0x9255: 0x65E6, - 0x9256: 0x6B4E, - 0x9257: 0x6DE1, - 0x9258: 0x6E5B, - 0x9259: 0x70AD, - 0x925A: 0x77ED, - 0x925B: 0x7AEF, - 0x925C: 0x7BAA, - 0x925D: 0x7DBB, - 0x925E: 0x803D, - 0x925F: 0x80C6, - 0x9260: 0x86CB, - 0x9261: 0x8A95, - 0x9262: 0x935B, - 0x9263: 0x56E3, - 0x9264: 0x58C7, - 0x9265: 0x5F3E, - 0x9266: 0x65AD, - 0x9267: 0x6696, - 0x9268: 0x6A80, - 0x9269: 0x6BB5, - 0x926A: 0x7537, - 0x926B: 0x8AC7, - 0x926C: 0x5024, - 0x926D: 0x77E5, - 0x926E: 0x5730, - 0x926F: 0x5F1B, - 0x9270: 0x6065, - 0x9271: 0x667A, - 0x9272: 0x6C60, - 0x9273: 0x75F4, - 0x9274: 0x7A1A, - 0x9275: 0x7F6E, - 0x9276: 0x81F4, - 0x9277: 0x8718, - 0x9278: 0x9045, - 0x9279: 0x99B3, - 0x927A: 0x7BC9, - 0x927B: 0x755C, - 0x927C: 0x7AF9, - 0x927D: 0x7B51, - 0x927E: 0x84C4, - 0x9280: 0x9010, - 0x9281: 0x79E9, - 0x9282: 0x7A92, - 0x9283: 0x8336, - 0x9284: 0x5AE1, - 0x9285: 0x7740, - 0x9286: 0x4E2D, - 0x9287: 0x4EF2, - 0x9288: 0x5B99, - 0x9289: 0x5FE0, - 0x928A: 0x62BD, - 0x928B: 0x663C, - 0x928C: 0x67F1, - 0x928D: 0x6CE8, - 0x928E: 0x866B, - 0x928F: 0x8877, - 0x9290: 0x8A3B, - 0x9291: 0x914E, - 0x9292: 0x92F3, - 0x9293: 0x99D0, - 0x9294: 0x6A17, - 0x9295: 0x7026, - 0x9296: 0x732A, - 0x9297: 0x82E7, - 0x9298: 0x8457, - 0x9299: 0x8CAF, - 0x929A: 0x4E01, - 0x929B: 0x5146, - 0x929C: 0x51CB, - 0x929D: 0x558B, - 0x929E: 0x5BF5, - 0x929F: 0x5E16, - 0x92A0: 0x5E33, - 0x92A1: 0x5E81, - 0x92A2: 0x5F14, - 0x92A3: 0x5F35, - 0x92A4: 0x5F6B, - 0x92A5: 0x5FB4, - 0x92A6: 0x61F2, - 0x92A7: 0x6311, - 0x92A8: 0x66A2, - 0x92A9: 0x671D, - 0x92AA: 0x6F6E, - 0x92AB: 0x7252, - 0x92AC: 0x753A, - 0x92AD: 0x773A, - 0x92AE: 0x8074, - 0x92AF: 0x8139, - 0x92B0: 0x8178, - 0x92B1: 0x8776, - 0x92B2: 0x8ABF, - 0x92B3: 0x8ADC, - 0x92B4: 0x8D85, - 0x92B5: 0x8DF3, - 0x92B6: 0x929A, - 0x92B7: 0x9577, - 0x92B8: 0x9802, - 0x92B9: 0x9CE5, - 0x92BA: 0x52C5, - 0x92BB: 0x6357, - 0x92BC: 0x76F4, - 0x92BD: 0x6715, - 0x92BE: 0x6C88, - 0x92BF: 0x73CD, - 0x92C0: 0x8CC3, - 0x92C1: 0x93AE, - 0x92C2: 0x9673, - 0x92C3: 0x6D25, - 0x92C4: 0x589C, - 0x92C5: 0x690E, - 0x92C6: 0x69CC, - 0x92C7: 0x8FFD, - 0x92C8: 0x939A, - 0x92C9: 0x75DB, - 0x92CA: 0x901A, - 0x92CB: 0x585A, - 0x92CC: 0x6802, - 0x92CD: 0x63B4, - 0x92CE: 0x69FB, - 0x92CF: 0x4F43, - 0x92D0: 0x6F2C, - 0x92D1: 0x67D8, - 0x92D2: 0x8FBB, - 0x92D3: 0x8526, - 0x92D4: 0x7DB4, - 0x92D5: 0x9354, - 0x92D6: 0x693F, - 0x92D7: 0x6F70, - 0x92D8: 0x576A, - 0x92D9: 0x58F7, - 0x92DA: 0x5B2C, - 0x92DB: 0x7D2C, - 0x92DC: 0x722A, - 0x92DD: 0x540A, - 0x92DE: 0x91E3, - 0x92DF: 0x9DB4, - 0x92E0: 0x4EAD, - 0x92E1: 0x4F4E, - 0x92E2: 0x505C, - 0x92E3: 0x5075, - 0x92E4: 0x5243, - 0x92E5: 0x8C9E, - 0x92E6: 0x5448, - 0x92E7: 0x5824, - 0x92E8: 0x5B9A, - 0x92E9: 0x5E1D, - 0x92EA: 0x5E95, - 0x92EB: 0x5EAD, - 0x92EC: 0x5EF7, - 0x92ED: 0x5F1F, - 0x92EE: 0x608C, - 0x92EF: 0x62B5, - 0x92F0: 0x633A, - 0x92F1: 0x63D0, - 0x92F2: 0x68AF, - 0x92F3: 0x6C40, - 0x92F4: 0x7887, - 0x92F5: 0x798E, - 0x92F6: 0x7A0B, - 0x92F7: 0x7DE0, - 0x92F8: 0x8247, - 0x92F9: 0x8A02, - 0x92FA: 0x8AE6, - 0x92FB: 0x8E44, - 0x92FC: 0x9013, - 0x9340: 0x90B8, - 0x9341: 0x912D, - 0x9342: 0x91D8, - 0x9343: 0x9F0E, - 0x9344: 0x6CE5, - 0x9345: 0x6458, - 0x9346: 0x64E2, - 0x9347: 0x6575, - 0x9348: 0x6EF4, - 0x9349: 0x7684, - 0x934A: 0x7B1B, - 0x934B: 0x9069, - 0x934C: 0x93D1, - 0x934D: 0x6EBA, - 0x934E: 0x54F2, - 0x934F: 0x5FB9, - 0x9350: 0x64A4, - 0x9351: 0x8F4D, - 0x9352: 0x8FED, - 0x9353: 0x9244, - 0x9354: 0x5178, - 0x9355: 0x586B, - 0x9356: 0x5929, - 0x9357: 0x5C55, - 0x9358: 0x5E97, - 0x9359: 0x6DFB, - 0x935A: 0x7E8F, - 0x935B: 0x751C, - 0x935C: 0x8CBC, - 0x935D: 0x8EE2, - 0x935E: 0x985B, - 0x935F: 0x70B9, - 0x9360: 0x4F1D, - 0x9361: 0x6BBF, - 0x9362: 0x6FB1, - 0x9363: 0x7530, - 0x9364: 0x96FB, - 0x9365: 0x514E, - 0x9366: 0x5410, - 0x9367: 0x5835, - 0x9368: 0x5857, - 0x9369: 0x59AC, - 0x936A: 0x5C60, - 0x936B: 0x5F92, - 0x936C: 0x6597, - 0x936D: 0x675C, - 0x936E: 0x6E21, - 0x936F: 0x767B, - 0x9370: 0x83DF, - 0x9371: 0x8CED, - 0x9372: 0x9014, - 0x9373: 0x90FD, - 0x9374: 0x934D, - 0x9375: 0x7825, - 0x9376: 0x783A, - 0x9377: 0x52AA, - 0x9378: 0x5EA6, - 0x9379: 0x571F, - 0x937A: 0x5974, - 0x937B: 0x6012, - 0x937C: 0x5012, - 0x937D: 0x515A, - 0x937E: 0x51AC, - 0x9380: 0x51CD, - 0x9381: 0x5200, - 0x9382: 0x5510, - 0x9383: 0x5854, - 0x9384: 0x5858, - 0x9385: 0x5957, - 0x9386: 0x5B95, - 0x9387: 0x5CF6, - 0x9388: 0x5D8B, - 0x9389: 0x60BC, - 0x938A: 0x6295, - 0x938B: 0x642D, - 0x938C: 0x6771, - 0x938D: 0x6843, - 0x938E: 0x68BC, - 0x938F: 0x68DF, - 0x9390: 0x76D7, - 0x9391: 0x6DD8, - 0x9392: 0x6E6F, - 0x9393: 0x6D9B, - 0x9394: 0x706F, - 0x9395: 0x71C8, - 0x9396: 0x5F53, - 0x9397: 0x75D8, - 0x9398: 0x7977, - 0x9399: 0x7B49, - 0x939A: 0x7B54, - 0x939B: 0x7B52, - 0x939C: 0x7CD6, - 0x939D: 0x7D71, - 0x939E: 0x5230, - 0x939F: 0x8463, - 0x93A0: 0x8569, - 0x93A1: 0x85E4, - 0x93A2: 0x8A0E, - 0x93A3: 0x8B04, - 0x93A4: 0x8C46, - 0x93A5: 0x8E0F, - 0x93A6: 0x9003, - 0x93A7: 0x900F, - 0x93A8: 0x9419, - 0x93A9: 0x9676, - 0x93AA: 0x982D, - 0x93AB: 0x9A30, - 0x93AC: 0x95D8, - 0x93AD: 0x50CD, - 0x93AE: 0x52D5, - 0x93AF: 0x540C, - 0x93B0: 0x5802, - 0x93B1: 0x5C0E, - 0x93B2: 0x61A7, - 0x93B3: 0x649E, - 0x93B4: 0x6D1E, - 0x93B5: 0x77B3, - 0x93B6: 0x7AE5, - 0x93B7: 0x80F4, - 0x93B8: 0x8404, - 0x93B9: 0x9053, - 0x93BA: 0x9285, - 0x93BB: 0x5CE0, - 0x93BC: 0x9D07, - 0x93BD: 0x533F, - 0x93BE: 0x5F97, - 0x93BF: 0x5FB3, - 0x93C0: 0x6D9C, - 0x93C1: 0x7279, - 0x93C2: 0x7763, - 0x93C3: 0x79BF, - 0x93C4: 0x7BE4, - 0x93C5: 0x6BD2, - 0x93C6: 0x72EC, - 0x93C7: 0x8AAD, - 0x93C8: 0x6803, - 0x93C9: 0x6A61, - 0x93CA: 0x51F8, - 0x93CB: 0x7A81, - 0x93CC: 0x6934, - 0x93CD: 0x5C4A, - 0x93CE: 0x9CF6, - 0x93CF: 0x82EB, - 0x93D0: 0x5BC5, - 0x93D1: 0x9149, - 0x93D2: 0x701E, - 0x93D3: 0x5678, - 0x93D4: 0x5C6F, - 0x93D5: 0x60C7, - 0x93D6: 0x6566, - 0x93D7: 0x6C8C, - 0x93D8: 0x8C5A, - 0x93D9: 0x9041, - 0x93DA: 0x9813, - 0x93DB: 0x5451, - 0x93DC: 0x66C7, - 0x93DD: 0x920D, - 0x93DE: 0x5948, - 0x93DF: 0x90A3, - 0x93E0: 0x5185, - 0x93E1: 0x4E4D, - 0x93E2: 0x51EA, - 0x93E3: 0x8599, - 0x93E4: 0x8B0E, - 0x93E5: 0x7058, - 0x93E6: 0x637A, - 0x93E7: 0x934B, - 0x93E8: 0x6962, - 0x93E9: 0x99B4, - 0x93EA: 0x7E04, - 0x93EB: 0x7577, - 0x93EC: 0x5357, - 0x93ED: 0x6960, - 0x93EE: 0x8EDF, - 0x93EF: 0x96E3, - 0x93F0: 0x6C5D, - 0x93F1: 0x4E8C, - 0x93F2: 0x5C3C, - 0x93F3: 0x5F10, - 0x93F4: 0x8FE9, - 0x93F5: 0x5302, - 0x93F6: 0x8CD1, - 0x93F7: 0x8089, - 0x93F8: 0x8679, - 0x93F9: 0x5EFF, - 0x93FA: 0x65E5, - 0x93FB: 0x4E73, - 0x93FC: 0x5165, - 0x9440: 0x5982, - 0x9441: 0x5C3F, - 0x9442: 0x97EE, - 0x9443: 0x4EFB, - 0x9444: 0x598A, - 0x9445: 0x5FCD, - 0x9446: 0x8A8D, - 0x9447: 0x6FE1, - 0x9448: 0x79B0, - 0x9449: 0x7962, - 0x944A: 0x5BE7, - 0x944B: 0x8471, - 0x944C: 0x732B, - 0x944D: 0x71B1, - 0x944E: 0x5E74, - 0x944F: 0x5FF5, - 0x9450: 0x637B, - 0x9451: 0x649A, - 0x9452: 0x71C3, - 0x9453: 0x7C98, - 0x9454: 0x4E43, - 0x9455: 0x5EFC, - 0x9456: 0x4E4B, - 0x9457: 0x57DC, - 0x9458: 0x56A2, - 0x9459: 0x60A9, - 0x945A: 0x6FC3, - 0x945B: 0x7D0D, - 0x945C: 0x80FD, - 0x945D: 0x8133, - 0x945E: 0x81BF, - 0x945F: 0x8FB2, - 0x9460: 0x8997, - 0x9461: 0x86A4, - 0x9462: 0x5DF4, - 0x9463: 0x628A, - 0x9464: 0x64AD, - 0x9465: 0x8987, - 0x9466: 0x6777, - 0x9467: 0x6CE2, - 0x9468: 0x6D3E, - 0x9469: 0x7436, - 0x946A: 0x7834, - 0x946B: 0x5A46, - 0x946C: 0x7F75, - 0x946D: 0x82AD, - 0x946E: 0x99AC, - 0x946F: 0x4FF3, - 0x9470: 0x5EC3, - 0x9471: 0x62DD, - 0x9472: 0x6392, - 0x9473: 0x6557, - 0x9474: 0x676F, - 0x9475: 0x76C3, - 0x9476: 0x724C, - 0x9477: 0x80CC, - 0x9478: 0x80BA, - 0x9479: 0x8F29, - 0x947A: 0x914D, - 0x947B: 0x500D, - 0x947C: 0x57F9, - 0x947D: 0x5A92, - 0x947E: 0x6885, - 0x9480: 0x6973, - 0x9481: 0x7164, - 0x9482: 0x72FD, - 0x9483: 0x8CB7, - 0x9484: 0x58F2, - 0x9485: 0x8CE0, - 0x9486: 0x966A, - 0x9487: 0x9019, - 0x9488: 0x877F, - 0x9489: 0x79E4, - 0x948A: 0x77E7, - 0x948B: 0x8429, - 0x948C: 0x4F2F, - 0x948D: 0x5265, - 0x948E: 0x535A, - 0x948F: 0x62CD, - 0x9490: 0x67CF, - 0x9491: 0x6CCA, - 0x9492: 0x767D, - 0x9493: 0x7B94, - 0x9494: 0x7C95, - 0x9495: 0x8236, - 0x9496: 0x8584, - 0x9497: 0x8FEB, - 0x9498: 0x66DD, - 0x9499: 0x6F20, - 0x949A: 0x7206, - 0x949B: 0x7E1B, - 0x949C: 0x83AB, - 0x949D: 0x99C1, - 0x949E: 0x9EA6, - 0x949F: 0x51FD, - 0x94A0: 0x7BB1, - 0x94A1: 0x7872, - 0x94A2: 0x7BB8, - 0x94A3: 0x8087, - 0x94A4: 0x7B48, - 0x94A5: 0x6AE8, - 0x94A6: 0x5E61, - 0x94A7: 0x808C, - 0x94A8: 0x7551, - 0x94A9: 0x7560, - 0x94AA: 0x516B, - 0x94AB: 0x9262, - 0x94AC: 0x6E8C, - 0x94AD: 0x767A, - 0x94AE: 0x9197, - 0x94AF: 0x9AEA, - 0x94B0: 0x4F10, - 0x94B1: 0x7F70, - 0x94B2: 0x629C, - 0x94B3: 0x7B4F, - 0x94B4: 0x95A5, - 0x94B5: 0x9CE9, - 0x94B6: 0x567A, - 0x94B7: 0x5859, - 0x94B8: 0x86E4, - 0x94B9: 0x96BC, - 0x94BA: 0x4F34, - 0x94BB: 0x5224, - 0x94BC: 0x534A, - 0x94BD: 0x53CD, - 0x94BE: 0x53DB, - 0x94BF: 0x5E06, - 0x94C0: 0x642C, - 0x94C1: 0x6591, - 0x94C2: 0x677F, - 0x94C3: 0x6C3E, - 0x94C4: 0x6C4E, - 0x94C5: 0x7248, - 0x94C6: 0x72AF, - 0x94C7: 0x73ED, - 0x94C8: 0x7554, - 0x94C9: 0x7E41, - 0x94CA: 0x822C, - 0x94CB: 0x85E9, - 0x94CC: 0x8CA9, - 0x94CD: 0x7BC4, - 0x94CE: 0x91C6, - 0x94CF: 0x7169, - 0x94D0: 0x9812, - 0x94D1: 0x98EF, - 0x94D2: 0x633D, - 0x94D3: 0x6669, - 0x94D4: 0x756A, - 0x94D5: 0x76E4, - 0x94D6: 0x78D0, - 0x94D7: 0x8543, - 0x94D8: 0x86EE, - 0x94D9: 0x532A, - 0x94DA: 0x5351, - 0x94DB: 0x5426, - 0x94DC: 0x5983, - 0x94DD: 0x5E87, - 0x94DE: 0x5F7C, - 0x94DF: 0x60B2, - 0x94E0: 0x6249, - 0x94E1: 0x6279, - 0x94E2: 0x62AB, - 0x94E3: 0x6590, - 0x94E4: 0x6BD4, - 0x94E5: 0x6CCC, - 0x94E6: 0x75B2, - 0x94E7: 0x76AE, - 0x94E8: 0x7891, - 0x94E9: 0x79D8, - 0x94EA: 0x7DCB, - 0x94EB: 0x7F77, - 0x94EC: 0x80A5, - 0x94ED: 0x88AB, - 0x94EE: 0x8AB9, - 0x94EF: 0x8CBB, - 0x94F0: 0x907F, - 0x94F1: 0x975E, - 0x94F2: 0x98DB, - 0x94F3: 0x6A0B, - 0x94F4: 0x7C38, - 0x94F5: 0x5099, - 0x94F6: 0x5C3E, - 0x94F7: 0x5FAE, - 0x94F8: 0x6787, - 0x94F9: 0x6BD8, - 0x94FA: 0x7435, - 0x94FB: 0x7709, - 0x94FC: 0x7F8E, - 0x9540: 0x9F3B, - 0x9541: 0x67CA, - 0x9542: 0x7A17, - 0x9543: 0x5339, - 0x9544: 0x758B, - 0x9545: 0x9AED, - 0x9546: 0x5F66, - 0x9547: 0x819D, - 0x9548: 0x83F1, - 0x9549: 0x8098, - 0x954A: 0x5F3C, - 0x954B: 0x5FC5, - 0x954C: 0x7562, - 0x954D: 0x7B46, - 0x954E: 0x903C, - 0x954F: 0x6867, - 0x9550: 0x59EB, - 0x9551: 0x5A9B, - 0x9552: 0x7D10, - 0x9553: 0x767E, - 0x9554: 0x8B2C, - 0x9555: 0x4FF5, - 0x9556: 0x5F6A, - 0x9557: 0x6A19, - 0x9558: 0x6C37, - 0x9559: 0x6F02, - 0x955A: 0x74E2, - 0x955B: 0x7968, - 0x955C: 0x8868, - 0x955D: 0x8A55, - 0x955E: 0x8C79, - 0x955F: 0x5EDF, - 0x9560: 0x63CF, - 0x9561: 0x75C5, - 0x9562: 0x79D2, - 0x9563: 0x82D7, - 0x9564: 0x9328, - 0x9565: 0x92F2, - 0x9566: 0x849C, - 0x9567: 0x86ED, - 0x9568: 0x9C2D, - 0x9569: 0x54C1, - 0x956A: 0x5F6C, - 0x956B: 0x658C, - 0x956C: 0x6D5C, - 0x956D: 0x7015, - 0x956E: 0x8CA7, - 0x956F: 0x8CD3, - 0x9570: 0x983B, - 0x9571: 0x654F, - 0x9572: 0x74F6, - 0x9573: 0x4E0D, - 0x9574: 0x4ED8, - 0x9575: 0x57E0, - 0x9576: 0x592B, - 0x9577: 0x5A66, - 0x9578: 0x5BCC, - 0x9579: 0x51A8, - 0x957A: 0x5E03, - 0x957B: 0x5E9C, - 0x957C: 0x6016, - 0x957D: 0x6276, - 0x957E: 0x6577, - 0x9580: 0x65A7, - 0x9581: 0x666E, - 0x9582: 0x6D6E, - 0x9583: 0x7236, - 0x9584: 0x7B26, - 0x9585: 0x8150, - 0x9586: 0x819A, - 0x9587: 0x8299, - 0x9588: 0x8B5C, - 0x9589: 0x8CA0, - 0x958A: 0x8CE6, - 0x958B: 0x8D74, - 0x958C: 0x961C, - 0x958D: 0x9644, - 0x958E: 0x4FAE, - 0x958F: 0x64AB, - 0x9590: 0x6B66, - 0x9591: 0x821E, - 0x9592: 0x8461, - 0x9593: 0x856A, - 0x9594: 0x90E8, - 0x9595: 0x5C01, - 0x9596: 0x6953, - 0x9597: 0x98A8, - 0x9598: 0x847A, - 0x9599: 0x8557, - 0x959A: 0x4F0F, - 0x959B: 0x526F, - 0x959C: 0x5FA9, - 0x959D: 0x5E45, - 0x959E: 0x670D, - 0x959F: 0x798F, - 0x95A0: 0x8179, - 0x95A1: 0x8907, - 0x95A2: 0x8986, - 0x95A3: 0x6DF5, - 0x95A4: 0x5F17, - 0x95A5: 0x6255, - 0x95A6: 0x6CB8, - 0x95A7: 0x4ECF, - 0x95A8: 0x7269, - 0x95A9: 0x9B92, - 0x95AA: 0x5206, - 0x95AB: 0x543B, - 0x95AC: 0x5674, - 0x95AD: 0x58B3, - 0x95AE: 0x61A4, - 0x95AF: 0x626E, - 0x95B0: 0x711A, - 0x95B1: 0x596E, - 0x95B2: 0x7C89, - 0x95B3: 0x7CDE, - 0x95B4: 0x7D1B, - 0x95B5: 0x96F0, - 0x95B6: 0x6587, - 0x95B7: 0x805E, - 0x95B8: 0x4E19, - 0x95B9: 0x4F75, - 0x95BA: 0x5175, - 0x95BB: 0x5840, - 0x95BC: 0x5E63, - 0x95BD: 0x5E73, - 0x95BE: 0x5F0A, - 0x95BF: 0x67C4, - 0x95C0: 0x4E26, - 0x95C1: 0x853D, - 0x95C2: 0x9589, - 0x95C3: 0x965B, - 0x95C4: 0x7C73, - 0x95C5: 0x9801, - 0x95C6: 0x50FB, - 0x95C7: 0x58C1, - 0x95C8: 0x7656, - 0x95C9: 0x78A7, - 0x95CA: 0x5225, - 0x95CB: 0x77A5, - 0x95CC: 0x8511, - 0x95CD: 0x7B86, - 0x95CE: 0x504F, - 0x95CF: 0x5909, - 0x95D0: 0x7247, - 0x95D1: 0x7BC7, - 0x95D2: 0x7DE8, - 0x95D3: 0x8FBA, - 0x95D4: 0x8FD4, - 0x95D5: 0x904D, - 0x95D6: 0x4FBF, - 0x95D7: 0x52C9, - 0x95D8: 0x5A29, - 0x95D9: 0x5F01, - 0x95DA: 0x97AD, - 0x95DB: 0x4FDD, - 0x95DC: 0x8217, - 0x95DD: 0x92EA, - 0x95DE: 0x5703, - 0x95DF: 0x6355, - 0x95E0: 0x6B69, - 0x95E1: 0x752B, - 0x95E2: 0x88DC, - 0x95E3: 0x8F14, - 0x95E4: 0x7A42, - 0x95E5: 0x52DF, - 0x95E6: 0x5893, - 0x95E7: 0x6155, - 0x95E8: 0x620A, - 0x95E9: 0x66AE, - 0x95EA: 0x6BCD, - 0x95EB: 0x7C3F, - 0x95EC: 0x83E9, - 0x95ED: 0x5023, - 0x95EE: 0x4FF8, - 0x95EF: 0x5305, - 0x95F0: 0x5446, - 0x95F1: 0x5831, - 0x95F2: 0x5949, - 0x95F3: 0x5B9D, - 0x95F4: 0x5CF0, - 0x95F5: 0x5CEF, - 0x95F6: 0x5D29, - 0x95F7: 0x5E96, - 0x95F8: 0x62B1, - 0x95F9: 0x6367, - 0x95FA: 0x653E, - 0x95FB: 0x65B9, - 0x95FC: 0x670B, - 0x9640: 0x6CD5, - 0x9641: 0x6CE1, - 0x9642: 0x70F9, - 0x9643: 0x7832, - 0x9644: 0x7E2B, - 0x9645: 0x80DE, - 0x9646: 0x82B3, - 0x9647: 0x840C, - 0x9648: 0x84EC, - 0x9649: 0x8702, - 0x964A: 0x8912, - 0x964B: 0x8A2A, - 0x964C: 0x8C4A, - 0x964D: 0x90A6, - 0x964E: 0x92D2, - 0x964F: 0x98FD, - 0x9650: 0x9CF3, - 0x9651: 0x9D6C, - 0x9652: 0x4E4F, - 0x9653: 0x4EA1, - 0x9654: 0x508D, - 0x9655: 0x5256, - 0x9656: 0x574A, - 0x9657: 0x59A8, - 0x9658: 0x5E3D, - 0x9659: 0x5FD8, - 0x965A: 0x5FD9, - 0x965B: 0x623F, - 0x965C: 0x66B4, - 0x965D: 0x671B, - 0x965E: 0x67D0, - 0x965F: 0x68D2, - 0x9660: 0x5192, - 0x9661: 0x7D21, - 0x9662: 0x80AA, - 0x9663: 0x81A8, - 0x9664: 0x8B00, - 0x9665: 0x8C8C, - 0x9666: 0x8CBF, - 0x9667: 0x927E, - 0x9668: 0x9632, - 0x9669: 0x5420, - 0x966A: 0x982C, - 0x966B: 0x5317, - 0x966C: 0x50D5, - 0x966D: 0x535C, - 0x966E: 0x58A8, - 0x966F: 0x64B2, - 0x9670: 0x6734, - 0x9671: 0x7267, - 0x9672: 0x7766, - 0x9673: 0x7A46, - 0x9674: 0x91E6, - 0x9675: 0x52C3, - 0x9676: 0x6CA1, - 0x9677: 0x6B86, - 0x9678: 0x5800, - 0x9679: 0x5E4C, - 0x967A: 0x5954, - 0x967B: 0x672C, - 0x967C: 0x7FFB, - 0x967D: 0x51E1, - 0x967E: 0x76C6, - 0x9680: 0x6469, - 0x9681: 0x78E8, - 0x9682: 0x9B54, - 0x9683: 0x9EBB, - 0x9684: 0x57CB, - 0x9685: 0x59B9, - 0x9686: 0x6627, - 0x9687: 0x679A, - 0x9688: 0x6BCE, - 0x9689: 0x54E9, - 0x968A: 0x69D9, - 0x968B: 0x5E55, - 0x968C: 0x819C, - 0x968D: 0x6795, - 0x968E: 0x9BAA, - 0x968F: 0x67FE, - 0x9690: 0x9C52, - 0x9691: 0x685D, - 0x9692: 0x4EA6, - 0x9693: 0x4FE3, - 0x9694: 0x53C8, - 0x9695: 0x62B9, - 0x9696: 0x672B, - 0x9697: 0x6CAB, - 0x9698: 0x8FC4, - 0x9699: 0x4FAD, - 0x969A: 0x7E6D, - 0x969B: 0x9EBF, - 0x969C: 0x4E07, - 0x969D: 0x6162, - 0x969E: 0x6E80, - 0x969F: 0x6F2B, - 0x96A0: 0x8513, - 0x96A1: 0x5473, - 0x96A2: 0x672A, - 0x96A3: 0x9B45, - 0x96A4: 0x5DF3, - 0x96A5: 0x7B95, - 0x96A6: 0x5CAC, - 0x96A7: 0x5BC6, - 0x96A8: 0x871C, - 0x96A9: 0x6E4A, - 0x96AA: 0x84D1, - 0x96AB: 0x7A14, - 0x96AC: 0x8108, - 0x96AD: 0x5999, - 0x96AE: 0x7C8D, - 0x96AF: 0x6C11, - 0x96B0: 0x7720, - 0x96B1: 0x52D9, - 0x96B2: 0x5922, - 0x96B3: 0x7121, - 0x96B4: 0x725F, - 0x96B5: 0x77DB, - 0x96B6: 0x9727, - 0x96B7: 0x9D61, - 0x96B8: 0x690B, - 0x96B9: 0x5A7F, - 0x96BA: 0x5A18, - 0x96BB: 0x51A5, - 0x96BC: 0x540D, - 0x96BD: 0x547D, - 0x96BE: 0x660E, - 0x96BF: 0x76DF, - 0x96C0: 0x8FF7, - 0x96C1: 0x9298, - 0x96C2: 0x9CF4, - 0x96C3: 0x59EA, - 0x96C4: 0x725D, - 0x96C5: 0x6EC5, - 0x96C6: 0x514D, - 0x96C7: 0x68C9, - 0x96C8: 0x7DBF, - 0x96C9: 0x7DEC, - 0x96CA: 0x9762, - 0x96CB: 0x9EBA, - 0x96CC: 0x6478, - 0x96CD: 0x6A21, - 0x96CE: 0x8302, - 0x96CF: 0x5984, - 0x96D0: 0x5B5F, - 0x96D1: 0x6BDB, - 0x96D2: 0x731B, - 0x96D3: 0x76F2, - 0x96D4: 0x7DB2, - 0x96D5: 0x8017, - 0x96D6: 0x8499, - 0x96D7: 0x5132, - 0x96D8: 0x6728, - 0x96D9: 0x9ED9, - 0x96DA: 0x76EE, - 0x96DB: 0x6762, - 0x96DC: 0x52FF, - 0x96DD: 0x9905, - 0x96DE: 0x5C24, - 0x96DF: 0x623B, - 0x96E0: 0x7C7E, - 0x96E1: 0x8CB0, - 0x96E2: 0x554F, - 0x96E3: 0x60B6, - 0x96E4: 0x7D0B, - 0x96E5: 0x9580, - 0x96E6: 0x5301, - 0x96E7: 0x4E5F, - 0x96E8: 0x51B6, - 0x96E9: 0x591C, - 0x96EA: 0x723A, - 0x96EB: 0x8036, - 0x96EC: 0x91CE, - 0x96ED: 0x5F25, - 0x96EE: 0x77E2, - 0x96EF: 0x5384, - 0x96F0: 0x5F79, - 0x96F1: 0x7D04, - 0x96F2: 0x85AC, - 0x96F3: 0x8A33, - 0x96F4: 0x8E8D, - 0x96F5: 0x9756, - 0x96F6: 0x67F3, - 0x96F7: 0x85AE, - 0x96F8: 0x9453, - 0x96F9: 0x6109, - 0x96FA: 0x6108, - 0x96FB: 0x6CB9, - 0x96FC: 0x7652, - 0x9740: 0x8AED, - 0x9741: 0x8F38, - 0x9742: 0x552F, - 0x9743: 0x4F51, - 0x9744: 0x512A, - 0x9745: 0x52C7, - 0x9746: 0x53CB, - 0x9747: 0x5BA5, - 0x9748: 0x5E7D, - 0x9749: 0x60A0, - 0x974A: 0x6182, - 0x974B: 0x63D6, - 0x974C: 0x6709, - 0x974D: 0x67DA, - 0x974E: 0x6E67, - 0x974F: 0x6D8C, - 0x9750: 0x7336, - 0x9751: 0x7337, - 0x9752: 0x7531, - 0x9753: 0x7950, - 0x9754: 0x88D5, - 0x9755: 0x8A98, - 0x9756: 0x904A, - 0x9757: 0x9091, - 0x9758: 0x90F5, - 0x9759: 0x96C4, - 0x975A: 0x878D, - 0x975B: 0x5915, - 0x975C: 0x4E88, - 0x975D: 0x4F59, - 0x975E: 0x4E0E, - 0x975F: 0x8A89, - 0x9760: 0x8F3F, - 0x9761: 0x9810, - 0x9762: 0x50AD, - 0x9763: 0x5E7C, - 0x9764: 0x5996, - 0x9765: 0x5BB9, - 0x9766: 0x5EB8, - 0x9767: 0x63DA, - 0x9768: 0x63FA, - 0x9769: 0x64C1, - 0x976A: 0x66DC, - 0x976B: 0x694A, - 0x976C: 0x69D8, - 0x976D: 0x6D0B, - 0x976E: 0x6EB6, - 0x976F: 0x7194, - 0x9770: 0x7528, - 0x9771: 0x7AAF, - 0x9772: 0x7F8A, - 0x9773: 0x8000, - 0x9774: 0x8449, - 0x9775: 0x84C9, - 0x9776: 0x8981, - 0x9777: 0x8B21, - 0x9778: 0x8E0A, - 0x9779: 0x9065, - 0x977A: 0x967D, - 0x977B: 0x990A, - 0x977C: 0x617E, - 0x977D: 0x6291, - 0x977E: 0x6B32, - 0x9780: 0x6C83, - 0x9781: 0x6D74, - 0x9782: 0x7FCC, - 0x9783: 0x7FFC, - 0x9784: 0x6DC0, - 0x9785: 0x7F85, - 0x9786: 0x87BA, - 0x9787: 0x88F8, - 0x9788: 0x6765, - 0x9789: 0x83B1, - 0x978A: 0x983C, - 0x978B: 0x96F7, - 0x978C: 0x6D1B, - 0x978D: 0x7D61, - 0x978E: 0x843D, - 0x978F: 0x916A, - 0x9790: 0x4E71, - 0x9791: 0x5375, - 0x9792: 0x5D50, - 0x9793: 0x6B04, - 0x9794: 0x6FEB, - 0x9795: 0x85CD, - 0x9796: 0x862D, - 0x9797: 0x89A7, - 0x9798: 0x5229, - 0x9799: 0x540F, - 0x979A: 0x5C65, - 0x979B: 0x674E, - 0x979C: 0x68A8, - 0x979D: 0x7406, - 0x979E: 0x7483, - 0x979F: 0x75E2, - 0x97A0: 0x88CF, - 0x97A1: 0x88E1, - 0x97A2: 0x91CC, - 0x97A3: 0x96E2, - 0x97A4: 0x9678, - 0x97A5: 0x5F8B, - 0x97A6: 0x7387, - 0x97A7: 0x7ACB, - 0x97A8: 0x844E, - 0x97A9: 0x63A0, - 0x97AA: 0x7565, - 0x97AB: 0x5289, - 0x97AC: 0x6D41, - 0x97AD: 0x6E9C, - 0x97AE: 0x7409, - 0x97AF: 0x7559, - 0x97B0: 0x786B, - 0x97B1: 0x7C92, - 0x97B2: 0x9686, - 0x97B3: 0x7ADC, - 0x97B4: 0x9F8D, - 0x97B5: 0x4FB6, - 0x97B6: 0x616E, - 0x97B7: 0x65C5, - 0x97B8: 0x865C, - 0x97B9: 0x4E86, - 0x97BA: 0x4EAE, - 0x97BB: 0x50DA, - 0x97BC: 0x4E21, - 0x97BD: 0x51CC, - 0x97BE: 0x5BEE, - 0x97BF: 0x6599, - 0x97C0: 0x6881, - 0x97C1: 0x6DBC, - 0x97C2: 0x731F, - 0x97C3: 0x7642, - 0x97C4: 0x77AD, - 0x97C5: 0x7A1C, - 0x97C6: 0x7CE7, - 0x97C7: 0x826F, - 0x97C8: 0x8AD2, - 0x97C9: 0x907C, - 0x97CA: 0x91CF, - 0x97CB: 0x9675, - 0x97CC: 0x9818, - 0x97CD: 0x529B, - 0x97CE: 0x7DD1, - 0x97CF: 0x502B, - 0x97D0: 0x5398, - 0x97D1: 0x6797, - 0x97D2: 0x6DCB, - 0x97D3: 0x71D0, - 0x97D4: 0x7433, - 0x97D5: 0x81E8, - 0x97D6: 0x8F2A, - 0x97D7: 0x96A3, - 0x97D8: 0x9C57, - 0x97D9: 0x9E9F, - 0x97DA: 0x7460, - 0x97DB: 0x5841, - 0x97DC: 0x6D99, - 0x97DD: 0x7D2F, - 0x97DE: 0x985E, - 0x97DF: 0x4EE4, - 0x97E0: 0x4F36, - 0x97E1: 0x4F8B, - 0x97E2: 0x51B7, - 0x97E3: 0x52B1, - 0x97E4: 0x5DBA, - 0x97E5: 0x601C, - 0x97E6: 0x73B2, - 0x97E7: 0x793C, - 0x97E8: 0x82D3, - 0x97E9: 0x9234, - 0x97EA: 0x96B7, - 0x97EB: 0x96F6, - 0x97EC: 0x970A, - 0x97ED: 0x9E97, - 0x97EE: 0x9F62, - 0x97EF: 0x66A6, - 0x97F0: 0x6B74, - 0x97F1: 0x5217, - 0x97F2: 0x52A3, - 0x97F3: 0x70C8, - 0x97F4: 0x88C2, - 0x97F5: 0x5EC9, - 0x97F6: 0x604B, - 0x97F7: 0x6190, - 0x97F8: 0x6F23, - 0x97F9: 0x7149, - 0x97FA: 0x7C3E, - 0x97FB: 0x7DF4, - 0x97FC: 0x806F, - 0x9840: 0x84EE, - 0x9841: 0x9023, - 0x9842: 0x932C, - 0x9843: 0x5442, - 0x9844: 0x9B6F, - 0x9845: 0x6AD3, - 0x9846: 0x7089, - 0x9847: 0x8CC2, - 0x9848: 0x8DEF, - 0x9849: 0x9732, - 0x984A: 0x52B4, - 0x984B: 0x5A41, - 0x984C: 0x5ECA, - 0x984D: 0x5F04, - 0x984E: 0x6717, - 0x984F: 0x697C, - 0x9850: 0x6994, - 0x9851: 0x6D6A, - 0x9852: 0x6F0F, - 0x9853: 0x7262, - 0x9854: 0x72FC, - 0x9855: 0x7BED, - 0x9856: 0x8001, - 0x9857: 0x807E, - 0x9858: 0x874B, - 0x9859: 0x90CE, - 0x985A: 0x516D, - 0x985B: 0x9E93, - 0x985C: 0x7984, - 0x985D: 0x808B, - 0x985E: 0x9332, - 0x985F: 0x8AD6, - 0x9860: 0x502D, - 0x9861: 0x548C, - 0x9862: 0x8A71, - 0x9863: 0x6B6A, - 0x9864: 0x8CC4, - 0x9865: 0x8107, - 0x9866: 0x60D1, - 0x9867: 0x67A0, - 0x9868: 0x9DF2, - 0x9869: 0x4E99, - 0x986A: 0x4E98, - 0x986B: 0x9C10, - 0x986C: 0x8A6B, - 0x986D: 0x85C1, - 0x986E: 0x8568, - 0x986F: 0x6900, - 0x9870: 0x6E7E, - 0x9871: 0x7897, - 0x9872: 0x8155, - 0x989F: 0x5F0C, - 0x98A0: 0x4E10, - 0x98A1: 0x4E15, - 0x98A2: 0x4E2A, - 0x98A3: 0x4E31, - 0x98A4: 0x4E36, - 0x98A5: 0x4E3C, - 0x98A6: 0x4E3F, - 0x98A7: 0x4E42, - 0x98A8: 0x4E56, - 0x98A9: 0x4E58, - 0x98AA: 0x4E82, - 0x98AB: 0x4E85, - 0x98AC: 0x8C6B, - 0x98AD: 0x4E8A, - 0x98AE: 0x8212, - 0x98AF: 0x5F0D, - 0x98B0: 0x4E8E, - 0x98B1: 0x4E9E, - 0x98B2: 0x4E9F, - 0x98B3: 0x4EA0, - 0x98B4: 0x4EA2, - 0x98B5: 0x4EB0, - 0x98B6: 0x4EB3, - 0x98B7: 0x4EB6, - 0x98B8: 0x4ECE, - 0x98B9: 0x4ECD, - 0x98BA: 0x4EC4, - 0x98BB: 0x4EC6, - 0x98BC: 0x4EC2, - 0x98BD: 0x4ED7, - 0x98BE: 0x4EDE, - 0x98BF: 0x4EED, - 0x98C0: 0x4EDF, - 0x98C1: 0x4EF7, - 0x98C2: 0x4F09, - 0x98C3: 0x4F5A, - 0x98C4: 0x4F30, - 0x98C5: 0x4F5B, - 0x98C6: 0x4F5D, - 0x98C7: 0x4F57, - 0x98C8: 0x4F47, - 0x98C9: 0x4F76, - 0x98CA: 0x4F88, - 0x98CB: 0x4F8F, - 0x98CC: 0x4F98, - 0x98CD: 0x4F7B, - 0x98CE: 0x4F69, - 0x98CF: 0x4F70, - 0x98D0: 0x4F91, - 0x98D1: 0x4F6F, - 0x98D2: 0x4F86, - 0x98D3: 0x4F96, - 0x98D4: 0x5118, - 0x98D5: 0x4FD4, - 0x98D6: 0x4FDF, - 0x98D7: 0x4FCE, - 0x98D8: 0x4FD8, - 0x98D9: 0x4FDB, - 0x98DA: 0x4FD1, - 0x98DB: 0x4FDA, - 0x98DC: 0x4FD0, - 0x98DD: 0x4FE4, - 0x98DE: 0x4FE5, - 0x98DF: 0x501A, - 0x98E0: 0x5028, - 0x98E1: 0x5014, - 0x98E2: 0x502A, - 0x98E3: 0x5025, - 0x98E4: 0x5005, - 0x98E5: 0x4F1C, - 0x98E6: 0x4FF6, - 0x98E7: 0x5021, - 0x98E8: 0x5029, - 0x98E9: 0x502C, - 0x98EA: 0x4FFE, - 0x98EB: 0x4FEF, - 0x98EC: 0x5011, - 0x98ED: 0x5006, - 0x98EE: 0x5043, - 0x98EF: 0x5047, - 0x98F0: 0x6703, - 0x98F1: 0x5055, - 0x98F2: 0x5050, - 0x98F3: 0x5048, - 0x98F4: 0x505A, - 0x98F5: 0x5056, - 0x98F6: 0x506C, - 0x98F7: 0x5078, - 0x98F8: 0x5080, - 0x98F9: 0x509A, - 0x98FA: 0x5085, - 0x98FB: 0x50B4, - 0x98FC: 0x50B2, - 0x9940: 0x50C9, - 0x9941: 0x50CA, - 0x9942: 0x50B3, - 0x9943: 0x50C2, - 0x9944: 0x50D6, - 0x9945: 0x50DE, - 0x9946: 0x50E5, - 0x9947: 0x50ED, - 0x9948: 0x50E3, - 0x9949: 0x50EE, - 0x994A: 0x50F9, - 0x994B: 0x50F5, - 0x994C: 0x5109, - 0x994D: 0x5101, - 0x994E: 0x5102, - 0x994F: 0x5116, - 0x9950: 0x5115, - 0x9951: 0x5114, - 0x9952: 0x511A, - 0x9953: 0x5121, - 0x9954: 0x513A, - 0x9955: 0x5137, - 0x9956: 0x513C, - 0x9957: 0x513B, - 0x9958: 0x513F, - 0x9959: 0x5140, - 0x995A: 0x5152, - 0x995B: 0x514C, - 0x995C: 0x5154, - 0x995D: 0x5162, - 0x995E: 0x7AF8, - 0x995F: 0x5169, - 0x9960: 0x516A, - 0x9961: 0x516E, - 0x9962: 0x5180, - 0x9963: 0x5182, - 0x9964: 0x56D8, - 0x9965: 0x518C, - 0x9966: 0x5189, - 0x9967: 0x518F, - 0x9968: 0x5191, - 0x9969: 0x5193, - 0x996A: 0x5195, - 0x996B: 0x5196, - 0x996C: 0x51A4, - 0x996D: 0x51A6, - 0x996E: 0x51A2, - 0x996F: 0x51A9, - 0x9970: 0x51AA, - 0x9971: 0x51AB, - 0x9972: 0x51B3, - 0x9973: 0x51B1, - 0x9974: 0x51B2, - 0x9975: 0x51B0, - 0x9976: 0x51B5, - 0x9977: 0x51BD, - 0x9978: 0x51C5, - 0x9979: 0x51C9, - 0x997A: 0x51DB, - 0x997B: 0x51E0, - 0x997C: 0x8655, - 0x997D: 0x51E9, - 0x997E: 0x51ED, - 0x9980: 0x51F0, - 0x9981: 0x51F5, - 0x9982: 0x51FE, - 0x9983: 0x5204, - 0x9984: 0x520B, - 0x9985: 0x5214, - 0x9986: 0x520E, - 0x9987: 0x5227, - 0x9988: 0x522A, - 0x9989: 0x522E, - 0x998A: 0x5233, - 0x998B: 0x5239, - 0x998C: 0x524F, - 0x998D: 0x5244, - 0x998E: 0x524B, - 0x998F: 0x524C, - 0x9990: 0x525E, - 0x9991: 0x5254, - 0x9992: 0x526A, - 0x9993: 0x5274, - 0x9994: 0x5269, - 0x9995: 0x5273, - 0x9996: 0x527F, - 0x9997: 0x527D, - 0x9998: 0x528D, - 0x9999: 0x5294, - 0x999A: 0x5292, - 0x999B: 0x5271, - 0x999C: 0x5288, - 0x999D: 0x5291, - 0x999E: 0x8FA8, - 0x999F: 0x8FA7, - 0x99A0: 0x52AC, - 0x99A1: 0x52AD, - 0x99A2: 0x52BC, - 0x99A3: 0x52B5, - 0x99A4: 0x52C1, - 0x99A5: 0x52CD, - 0x99A6: 0x52D7, - 0x99A7: 0x52DE, - 0x99A8: 0x52E3, - 0x99A9: 0x52E6, - 0x99AA: 0x98ED, - 0x99AB: 0x52E0, - 0x99AC: 0x52F3, - 0x99AD: 0x52F5, - 0x99AE: 0x52F8, - 0x99AF: 0x52F9, - 0x99B0: 0x5306, - 0x99B1: 0x5308, - 0x99B2: 0x7538, - 0x99B3: 0x530D, - 0x99B4: 0x5310, - 0x99B5: 0x530F, - 0x99B6: 0x5315, - 0x99B7: 0x531A, - 0x99B8: 0x5323, - 0x99B9: 0x532F, - 0x99BA: 0x5331, - 0x99BB: 0x5333, - 0x99BC: 0x5338, - 0x99BD: 0x5340, - 0x99BE: 0x5346, - 0x99BF: 0x5345, - 0x99C0: 0x4E17, - 0x99C1: 0x5349, - 0x99C2: 0x534D, - 0x99C3: 0x51D6, - 0x99C4: 0x535E, - 0x99C5: 0x5369, - 0x99C6: 0x536E, - 0x99C7: 0x5918, - 0x99C8: 0x537B, - 0x99C9: 0x5377, - 0x99CA: 0x5382, - 0x99CB: 0x5396, - 0x99CC: 0x53A0, - 0x99CD: 0x53A6, - 0x99CE: 0x53A5, - 0x99CF: 0x53AE, - 0x99D0: 0x53B0, - 0x99D1: 0x53B6, - 0x99D2: 0x53C3, - 0x99D3: 0x7C12, - 0x99D4: 0x96D9, - 0x99D5: 0x53DF, - 0x99D6: 0x66FC, - 0x99D7: 0x71EE, - 0x99D8: 0x53EE, - 0x99D9: 0x53E8, - 0x99DA: 0x53ED, - 0x99DB: 0x53FA, - 0x99DC: 0x5401, - 0x99DD: 0x543D, - 0x99DE: 0x5440, - 0x99DF: 0x542C, - 0x99E0: 0x542D, - 0x99E1: 0x543C, - 0x99E2: 0x542E, - 0x99E3: 0x5436, - 0x99E4: 0x5429, - 0x99E5: 0x541D, - 0x99E6: 0x544E, - 0x99E7: 0x548F, - 0x99E8: 0x5475, - 0x99E9: 0x548E, - 0x99EA: 0x545F, - 0x99EB: 0x5471, - 0x99EC: 0x5477, - 0x99ED: 0x5470, - 0x99EE: 0x5492, - 0x99EF: 0x547B, - 0x99F0: 0x5480, - 0x99F1: 0x5476, - 0x99F2: 0x5484, - 0x99F3: 0x5490, - 0x99F4: 0x5486, - 0x99F5: 0x54C7, - 0x99F6: 0x54A2, - 0x99F7: 0x54B8, - 0x99F8: 0x54A5, - 0x99F9: 0x54AC, - 0x99FA: 0x54C4, - 0x99FB: 0x54C8, - 0x99FC: 0x54A8, - 0x9A40: 0x54AB, - 0x9A41: 0x54C2, - 0x9A42: 0x54A4, - 0x9A43: 0x54BE, - 0x9A44: 0x54BC, - 0x9A45: 0x54D8, - 0x9A46: 0x54E5, - 0x9A47: 0x54E6, - 0x9A48: 0x550F, - 0x9A49: 0x5514, - 0x9A4A: 0x54FD, - 0x9A4B: 0x54EE, - 0x9A4C: 0x54ED, - 0x9A4D: 0x54FA, - 0x9A4E: 0x54E2, - 0x9A4F: 0x5539, - 0x9A50: 0x5540, - 0x9A51: 0x5563, - 0x9A52: 0x554C, - 0x9A53: 0x552E, - 0x9A54: 0x555C, - 0x9A55: 0x5545, - 0x9A56: 0x5556, - 0x9A57: 0x5557, - 0x9A58: 0x5538, - 0x9A59: 0x5533, - 0x9A5A: 0x555D, - 0x9A5B: 0x5599, - 0x9A5C: 0x5580, - 0x9A5D: 0x54AF, - 0x9A5E: 0x558A, - 0x9A5F: 0x559F, - 0x9A60: 0x557B, - 0x9A61: 0x557E, - 0x9A62: 0x5598, - 0x9A63: 0x559E, - 0x9A64: 0x55AE, - 0x9A65: 0x557C, - 0x9A66: 0x5583, - 0x9A67: 0x55A9, - 0x9A68: 0x5587, - 0x9A69: 0x55A8, - 0x9A6A: 0x55DA, - 0x9A6B: 0x55C5, - 0x9A6C: 0x55DF, - 0x9A6D: 0x55C4, - 0x9A6E: 0x55DC, - 0x9A6F: 0x55E4, - 0x9A70: 0x55D4, - 0x9A71: 0x5614, - 0x9A72: 0x55F7, - 0x9A73: 0x5616, - 0x9A74: 0x55FE, - 0x9A75: 0x55FD, - 0x9A76: 0x561B, - 0x9A77: 0x55F9, - 0x9A78: 0x564E, - 0x9A79: 0x5650, - 0x9A7A: 0x71DF, - 0x9A7B: 0x5634, - 0x9A7C: 0x5636, - 0x9A7D: 0x5632, - 0x9A7E: 0x5638, - 0x9A80: 0x566B, - 0x9A81: 0x5664, - 0x9A82: 0x562F, - 0x9A83: 0x566C, - 0x9A84: 0x566A, - 0x9A85: 0x5686, - 0x9A86: 0x5680, - 0x9A87: 0x568A, - 0x9A88: 0x56A0, - 0x9A89: 0x5694, - 0x9A8A: 0x568F, - 0x9A8B: 0x56A5, - 0x9A8C: 0x56AE, - 0x9A8D: 0x56B6, - 0x9A8E: 0x56B4, - 0x9A8F: 0x56C2, - 0x9A90: 0x56BC, - 0x9A91: 0x56C1, - 0x9A92: 0x56C3, - 0x9A93: 0x56C0, - 0x9A94: 0x56C8, - 0x9A95: 0x56CE, - 0x9A96: 0x56D1, - 0x9A97: 0x56D3, - 0x9A98: 0x56D7, - 0x9A99: 0x56EE, - 0x9A9A: 0x56F9, - 0x9A9B: 0x5700, - 0x9A9C: 0x56FF, - 0x9A9D: 0x5704, - 0x9A9E: 0x5709, - 0x9A9F: 0x5708, - 0x9AA0: 0x570B, - 0x9AA1: 0x570D, - 0x9AA2: 0x5713, - 0x9AA3: 0x5718, - 0x9AA4: 0x5716, - 0x9AA5: 0x55C7, - 0x9AA6: 0x571C, - 0x9AA7: 0x5726, - 0x9AA8: 0x5737, - 0x9AA9: 0x5738, - 0x9AAA: 0x574E, - 0x9AAB: 0x573B, - 0x9AAC: 0x5740, - 0x9AAD: 0x574F, - 0x9AAE: 0x5769, - 0x9AAF: 0x57C0, - 0x9AB0: 0x5788, - 0x9AB1: 0x5761, - 0x9AB2: 0x577F, - 0x9AB3: 0x5789, - 0x9AB4: 0x5793, - 0x9AB5: 0x57A0, - 0x9AB6: 0x57B3, - 0x9AB7: 0x57A4, - 0x9AB8: 0x57AA, - 0x9AB9: 0x57B0, - 0x9ABA: 0x57C3, - 0x9ABB: 0x57C6, - 0x9ABC: 0x57D4, - 0x9ABD: 0x57D2, - 0x9ABE: 0x57D3, - 0x9ABF: 0x580A, - 0x9AC0: 0x57D6, - 0x9AC1: 0x57E3, - 0x9AC2: 0x580B, - 0x9AC3: 0x5819, - 0x9AC4: 0x581D, - 0x9AC5: 0x5872, - 0x9AC6: 0x5821, - 0x9AC7: 0x5862, - 0x9AC8: 0x584B, - 0x9AC9: 0x5870, - 0x9ACA: 0x6BC0, - 0x9ACB: 0x5852, - 0x9ACC: 0x583D, - 0x9ACD: 0x5879, - 0x9ACE: 0x5885, - 0x9ACF: 0x58B9, - 0x9AD0: 0x589F, - 0x9AD1: 0x58AB, - 0x9AD2: 0x58BA, - 0x9AD3: 0x58DE, - 0x9AD4: 0x58BB, - 0x9AD5: 0x58B8, - 0x9AD6: 0x58AE, - 0x9AD7: 0x58C5, - 0x9AD8: 0x58D3, - 0x9AD9: 0x58D1, - 0x9ADA: 0x58D7, - 0x9ADB: 0x58D9, - 0x9ADC: 0x58D8, - 0x9ADD: 0x58E5, - 0x9ADE: 0x58DC, - 0x9ADF: 0x58E4, - 0x9AE0: 0x58DF, - 0x9AE1: 0x58EF, - 0x9AE2: 0x58FA, - 0x9AE3: 0x58F9, - 0x9AE4: 0x58FB, - 0x9AE5: 0x58FC, - 0x9AE6: 0x58FD, - 0x9AE7: 0x5902, - 0x9AE8: 0x590A, - 0x9AE9: 0x5910, - 0x9AEA: 0x591B, - 0x9AEB: 0x68A6, - 0x9AEC: 0x5925, - 0x9AED: 0x592C, - 0x9AEE: 0x592D, - 0x9AEF: 0x5932, - 0x9AF0: 0x5938, - 0x9AF1: 0x593E, - 0x9AF2: 0x7AD2, - 0x9AF3: 0x5955, - 0x9AF4: 0x5950, - 0x9AF5: 0x594E, - 0x9AF6: 0x595A, - 0x9AF7: 0x5958, - 0x9AF8: 0x5962, - 0x9AF9: 0x5960, - 0x9AFA: 0x5967, - 0x9AFB: 0x596C, - 0x9AFC: 0x5969, - 0x9B40: 0x5978, - 0x9B41: 0x5981, - 0x9B42: 0x599D, - 0x9B43: 0x4F5E, - 0x9B44: 0x4FAB, - 0x9B45: 0x59A3, - 0x9B46: 0x59B2, - 0x9B47: 0x59C6, - 0x9B48: 0x59E8, - 0x9B49: 0x59DC, - 0x9B4A: 0x598D, - 0x9B4B: 0x59D9, - 0x9B4C: 0x59DA, - 0x9B4D: 0x5A25, - 0x9B4E: 0x5A1F, - 0x9B4F: 0x5A11, - 0x9B50: 0x5A1C, - 0x9B51: 0x5A09, - 0x9B52: 0x5A1A, - 0x9B53: 0x5A40, - 0x9B54: 0x5A6C, - 0x9B55: 0x5A49, - 0x9B56: 0x5A35, - 0x9B57: 0x5A36, - 0x9B58: 0x5A62, - 0x9B59: 0x5A6A, - 0x9B5A: 0x5A9A, - 0x9B5B: 0x5ABC, - 0x9B5C: 0x5ABE, - 0x9B5D: 0x5ACB, - 0x9B5E: 0x5AC2, - 0x9B5F: 0x5ABD, - 0x9B60: 0x5AE3, - 0x9B61: 0x5AD7, - 0x9B62: 0x5AE6, - 0x9B63: 0x5AE9, - 0x9B64: 0x5AD6, - 0x9B65: 0x5AFA, - 0x9B66: 0x5AFB, - 0x9B67: 0x5B0C, - 0x9B68: 0x5B0B, - 0x9B69: 0x5B16, - 0x9B6A: 0x5B32, - 0x9B6B: 0x5AD0, - 0x9B6C: 0x5B2A, - 0x9B6D: 0x5B36, - 0x9B6E: 0x5B3E, - 0x9B6F: 0x5B43, - 0x9B70: 0x5B45, - 0x9B71: 0x5B40, - 0x9B72: 0x5B51, - 0x9B73: 0x5B55, - 0x9B74: 0x5B5A, - 0x9B75: 0x5B5B, - 0x9B76: 0x5B65, - 0x9B77: 0x5B69, - 0x9B78: 0x5B70, - 0x9B79: 0x5B73, - 0x9B7A: 0x5B75, - 0x9B7B: 0x5B78, - 0x9B7C: 0x6588, - 0x9B7D: 0x5B7A, - 0x9B7E: 0x5B80, - 0x9B80: 0x5B83, - 0x9B81: 0x5BA6, - 0x9B82: 0x5BB8, - 0x9B83: 0x5BC3, - 0x9B84: 0x5BC7, - 0x9B85: 0x5BC9, - 0x9B86: 0x5BD4, - 0x9B87: 0x5BD0, - 0x9B88: 0x5BE4, - 0x9B89: 0x5BE6, - 0x9B8A: 0x5BE2, - 0x9B8B: 0x5BDE, - 0x9B8C: 0x5BE5, - 0x9B8D: 0x5BEB, - 0x9B8E: 0x5BF0, - 0x9B8F: 0x5BF6, - 0x9B90: 0x5BF3, - 0x9B91: 0x5C05, - 0x9B92: 0x5C07, - 0x9B93: 0x5C08, - 0x9B94: 0x5C0D, - 0x9B95: 0x5C13, - 0x9B96: 0x5C20, - 0x9B97: 0x5C22, - 0x9B98: 0x5C28, - 0x9B99: 0x5C38, - 0x9B9A: 0x5C39, - 0x9B9B: 0x5C41, - 0x9B9C: 0x5C46, - 0x9B9D: 0x5C4E, - 0x9B9E: 0x5C53, - 0x9B9F: 0x5C50, - 0x9BA0: 0x5C4F, - 0x9BA1: 0x5B71, - 0x9BA2: 0x5C6C, - 0x9BA3: 0x5C6E, - 0x9BA4: 0x4E62, - 0x9BA5: 0x5C76, - 0x9BA6: 0x5C79, - 0x9BA7: 0x5C8C, - 0x9BA8: 0x5C91, - 0x9BA9: 0x5C94, - 0x9BAA: 0x599B, - 0x9BAB: 0x5CAB, - 0x9BAC: 0x5CBB, - 0x9BAD: 0x5CB6, - 0x9BAE: 0x5CBC, - 0x9BAF: 0x5CB7, - 0x9BB0: 0x5CC5, - 0x9BB1: 0x5CBE, - 0x9BB2: 0x5CC7, - 0x9BB3: 0x5CD9, - 0x9BB4: 0x5CE9, - 0x9BB5: 0x5CFD, - 0x9BB6: 0x5CFA, - 0x9BB7: 0x5CED, - 0x9BB8: 0x5D8C, - 0x9BB9: 0x5CEA, - 0x9BBA: 0x5D0B, - 0x9BBB: 0x5D15, - 0x9BBC: 0x5D17, - 0x9BBD: 0x5D5C, - 0x9BBE: 0x5D1F, - 0x9BBF: 0x5D1B, - 0x9BC0: 0x5D11, - 0x9BC1: 0x5D14, - 0x9BC2: 0x5D22, - 0x9BC3: 0x5D1A, - 0x9BC4: 0x5D19, - 0x9BC5: 0x5D18, - 0x9BC6: 0x5D4C, - 0x9BC7: 0x5D52, - 0x9BC8: 0x5D4E, - 0x9BC9: 0x5D4B, - 0x9BCA: 0x5D6C, - 0x9BCB: 0x5D73, - 0x9BCC: 0x5D76, - 0x9BCD: 0x5D87, - 0x9BCE: 0x5D84, - 0x9BCF: 0x5D82, - 0x9BD0: 0x5DA2, - 0x9BD1: 0x5D9D, - 0x9BD2: 0x5DAC, - 0x9BD3: 0x5DAE, - 0x9BD4: 0x5DBD, - 0x9BD5: 0x5D90, - 0x9BD6: 0x5DB7, - 0x9BD7: 0x5DBC, - 0x9BD8: 0x5DC9, - 0x9BD9: 0x5DCD, - 0x9BDA: 0x5DD3, - 0x9BDB: 0x5DD2, - 0x9BDC: 0x5DD6, - 0x9BDD: 0x5DDB, - 0x9BDE: 0x5DEB, - 0x9BDF: 0x5DF2, - 0x9BE0: 0x5DF5, - 0x9BE1: 0x5E0B, - 0x9BE2: 0x5E1A, - 0x9BE3: 0x5E19, - 0x9BE4: 0x5E11, - 0x9BE5: 0x5E1B, - 0x9BE6: 0x5E36, - 0x9BE7: 0x5E37, - 0x9BE8: 0x5E44, - 0x9BE9: 0x5E43, - 0x9BEA: 0x5E40, - 0x9BEB: 0x5E4E, - 0x9BEC: 0x5E57, - 0x9BED: 0x5E54, - 0x9BEE: 0x5E5F, - 0x9BEF: 0x5E62, - 0x9BF0: 0x5E64, - 0x9BF1: 0x5E47, - 0x9BF2: 0x5E75, - 0x9BF3: 0x5E76, - 0x9BF4: 0x5E7A, - 0x9BF5: 0x9EBC, - 0x9BF6: 0x5E7F, - 0x9BF7: 0x5EA0, - 0x9BF8: 0x5EC1, - 0x9BF9: 0x5EC2, - 0x9BFA: 0x5EC8, - 0x9BFB: 0x5ED0, - 0x9BFC: 0x5ECF, - 0x9C40: 0x5ED6, - 0x9C41: 0x5EE3, - 0x9C42: 0x5EDD, - 0x9C43: 0x5EDA, - 0x9C44: 0x5EDB, - 0x9C45: 0x5EE2, - 0x9C46: 0x5EE1, - 0x9C47: 0x5EE8, - 0x9C48: 0x5EE9, - 0x9C49: 0x5EEC, - 0x9C4A: 0x5EF1, - 0x9C4B: 0x5EF3, - 0x9C4C: 0x5EF0, - 0x9C4D: 0x5EF4, - 0x9C4E: 0x5EF8, - 0x9C4F: 0x5EFE, - 0x9C50: 0x5F03, - 0x9C51: 0x5F09, - 0x9C52: 0x5F5D, - 0x9C53: 0x5F5C, - 0x9C54: 0x5F0B, - 0x9C55: 0x5F11, - 0x9C56: 0x5F16, - 0x9C57: 0x5F29, - 0x9C58: 0x5F2D, - 0x9C59: 0x5F38, - 0x9C5A: 0x5F41, - 0x9C5B: 0x5F48, - 0x9C5C: 0x5F4C, - 0x9C5D: 0x5F4E, - 0x9C5E: 0x5F2F, - 0x9C5F: 0x5F51, - 0x9C60: 0x5F56, - 0x9C61: 0x5F57, - 0x9C62: 0x5F59, - 0x9C63: 0x5F61, - 0x9C64: 0x5F6D, - 0x9C65: 0x5F73, - 0x9C66: 0x5F77, - 0x9C67: 0x5F83, - 0x9C68: 0x5F82, - 0x9C69: 0x5F7F, - 0x9C6A: 0x5F8A, - 0x9C6B: 0x5F88, - 0x9C6C: 0x5F91, - 0x9C6D: 0x5F87, - 0x9C6E: 0x5F9E, - 0x9C6F: 0x5F99, - 0x9C70: 0x5F98, - 0x9C71: 0x5FA0, - 0x9C72: 0x5FA8, - 0x9C73: 0x5FAD, - 0x9C74: 0x5FBC, - 0x9C75: 0x5FD6, - 0x9C76: 0x5FFB, - 0x9C77: 0x5FE4, - 0x9C78: 0x5FF8, - 0x9C79: 0x5FF1, - 0x9C7A: 0x5FDD, - 0x9C7B: 0x60B3, - 0x9C7C: 0x5FFF, - 0x9C7D: 0x6021, - 0x9C7E: 0x6060, - 0x9C80: 0x6019, - 0x9C81: 0x6010, - 0x9C82: 0x6029, - 0x9C83: 0x600E, - 0x9C84: 0x6031, - 0x9C85: 0x601B, - 0x9C86: 0x6015, - 0x9C87: 0x602B, - 0x9C88: 0x6026, - 0x9C89: 0x600F, - 0x9C8A: 0x603A, - 0x9C8B: 0x605A, - 0x9C8C: 0x6041, - 0x9C8D: 0x606A, - 0x9C8E: 0x6077, - 0x9C8F: 0x605F, - 0x9C90: 0x604A, - 0x9C91: 0x6046, - 0x9C92: 0x604D, - 0x9C93: 0x6063, - 0x9C94: 0x6043, - 0x9C95: 0x6064, - 0x9C96: 0x6042, - 0x9C97: 0x606C, - 0x9C98: 0x606B, - 0x9C99: 0x6059, - 0x9C9A: 0x6081, - 0x9C9B: 0x608D, - 0x9C9C: 0x60E7, - 0x9C9D: 0x6083, - 0x9C9E: 0x609A, - 0x9C9F: 0x6084, - 0x9CA0: 0x609B, - 0x9CA1: 0x6096, - 0x9CA2: 0x6097, - 0x9CA3: 0x6092, - 0x9CA4: 0x60A7, - 0x9CA5: 0x608B, - 0x9CA6: 0x60E1, - 0x9CA7: 0x60B8, - 0x9CA8: 0x60E0, - 0x9CA9: 0x60D3, - 0x9CAA: 0x60B4, - 0x9CAB: 0x5FF0, - 0x9CAC: 0x60BD, - 0x9CAD: 0x60C6, - 0x9CAE: 0x60B5, - 0x9CAF: 0x60D8, - 0x9CB0: 0x614D, - 0x9CB1: 0x6115, - 0x9CB2: 0x6106, - 0x9CB3: 0x60F6, - 0x9CB4: 0x60F7, - 0x9CB5: 0x6100, - 0x9CB6: 0x60F4, - 0x9CB7: 0x60FA, - 0x9CB8: 0x6103, - 0x9CB9: 0x6121, - 0x9CBA: 0x60FB, - 0x9CBB: 0x60F1, - 0x9CBC: 0x610D, - 0x9CBD: 0x610E, - 0x9CBE: 0x6147, - 0x9CBF: 0x613E, - 0x9CC0: 0x6128, - 0x9CC1: 0x6127, - 0x9CC2: 0x614A, - 0x9CC3: 0x613F, - 0x9CC4: 0x613C, - 0x9CC5: 0x612C, - 0x9CC6: 0x6134, - 0x9CC7: 0x613D, - 0x9CC8: 0x6142, - 0x9CC9: 0x6144, - 0x9CCA: 0x6173, - 0x9CCB: 0x6177, - 0x9CCC: 0x6158, - 0x9CCD: 0x6159, - 0x9CCE: 0x615A, - 0x9CCF: 0x616B, - 0x9CD0: 0x6174, - 0x9CD1: 0x616F, - 0x9CD2: 0x6165, - 0x9CD3: 0x6171, - 0x9CD4: 0x615F, - 0x9CD5: 0x615D, - 0x9CD6: 0x6153, - 0x9CD7: 0x6175, - 0x9CD8: 0x6199, - 0x9CD9: 0x6196, - 0x9CDA: 0x6187, - 0x9CDB: 0x61AC, - 0x9CDC: 0x6194, - 0x9CDD: 0x619A, - 0x9CDE: 0x618A, - 0x9CDF: 0x6191, - 0x9CE0: 0x61AB, - 0x9CE1: 0x61AE, - 0x9CE2: 0x61CC, - 0x9CE3: 0x61CA, - 0x9CE4: 0x61C9, - 0x9CE5: 0x61F7, - 0x9CE6: 0x61C8, - 0x9CE7: 0x61C3, - 0x9CE8: 0x61C6, - 0x9CE9: 0x61BA, - 0x9CEA: 0x61CB, - 0x9CEB: 0x7F79, - 0x9CEC: 0x61CD, - 0x9CED: 0x61E6, - 0x9CEE: 0x61E3, - 0x9CEF: 0x61F6, - 0x9CF0: 0x61FA, - 0x9CF1: 0x61F4, - 0x9CF2: 0x61FF, - 0x9CF3: 0x61FD, - 0x9CF4: 0x61FC, - 0x9CF5: 0x61FE, - 0x9CF6: 0x6200, - 0x9CF7: 0x6208, - 0x9CF8: 0x6209, - 0x9CF9: 0x620D, - 0x9CFA: 0x620C, - 0x9CFB: 0x6214, - 0x9CFC: 0x621B, - 0x9D40: 0x621E, - 0x9D41: 0x6221, - 0x9D42: 0x622A, - 0x9D43: 0x622E, - 0x9D44: 0x6230, - 0x9D45: 0x6232, - 0x9D46: 0x6233, - 0x9D47: 0x6241, - 0x9D48: 0x624E, - 0x9D49: 0x625E, - 0x9D4A: 0x6263, - 0x9D4B: 0x625B, - 0x9D4C: 0x6260, - 0x9D4D: 0x6268, - 0x9D4E: 0x627C, - 0x9D4F: 0x6282, - 0x9D50: 0x6289, - 0x9D51: 0x627E, - 0x9D52: 0x6292, - 0x9D53: 0x6293, - 0x9D54: 0x6296, - 0x9D55: 0x62D4, - 0x9D56: 0x6283, - 0x9D57: 0x6294, - 0x9D58: 0x62D7, - 0x9D59: 0x62D1, - 0x9D5A: 0x62BB, - 0x9D5B: 0x62CF, - 0x9D5C: 0x62FF, - 0x9D5D: 0x62C6, - 0x9D5E: 0x64D4, - 0x9D5F: 0x62C8, - 0x9D60: 0x62DC, - 0x9D61: 0x62CC, - 0x9D62: 0x62CA, - 0x9D63: 0x62C2, - 0x9D64: 0x62C7, - 0x9D65: 0x629B, - 0x9D66: 0x62C9, - 0x9D67: 0x630C, - 0x9D68: 0x62EE, - 0x9D69: 0x62F1, - 0x9D6A: 0x6327, - 0x9D6B: 0x6302, - 0x9D6C: 0x6308, - 0x9D6D: 0x62EF, - 0x9D6E: 0x62F5, - 0x9D6F: 0x6350, - 0x9D70: 0x633E, - 0x9D71: 0x634D, - 0x9D72: 0x641C, - 0x9D73: 0x634F, - 0x9D74: 0x6396, - 0x9D75: 0x638E, - 0x9D76: 0x6380, - 0x9D77: 0x63AB, - 0x9D78: 0x6376, - 0x9D79: 0x63A3, - 0x9D7A: 0x638F, - 0x9D7B: 0x6389, - 0x9D7C: 0x639F, - 0x9D7D: 0x63B5, - 0x9D7E: 0x636B, - 0x9D80: 0x6369, - 0x9D81: 0x63BE, - 0x9D82: 0x63E9, - 0x9D83: 0x63C0, - 0x9D84: 0x63C6, - 0x9D85: 0x63E3, - 0x9D86: 0x63C9, - 0x9D87: 0x63D2, - 0x9D88: 0x63F6, - 0x9D89: 0x63C4, - 0x9D8A: 0x6416, - 0x9D8B: 0x6434, - 0x9D8C: 0x6406, - 0x9D8D: 0x6413, - 0x9D8E: 0x6426, - 0x9D8F: 0x6436, - 0x9D90: 0x651D, - 0x9D91: 0x6417, - 0x9D92: 0x6428, - 0x9D93: 0x640F, - 0x9D94: 0x6467, - 0x9D95: 0x646F, - 0x9D96: 0x6476, - 0x9D97: 0x644E, - 0x9D98: 0x652A, - 0x9D99: 0x6495, - 0x9D9A: 0x6493, - 0x9D9B: 0x64A5, - 0x9D9C: 0x64A9, - 0x9D9D: 0x6488, - 0x9D9E: 0x64BC, - 0x9D9F: 0x64DA, - 0x9DA0: 0x64D2, - 0x9DA1: 0x64C5, - 0x9DA2: 0x64C7, - 0x9DA3: 0x64BB, - 0x9DA4: 0x64D8, - 0x9DA5: 0x64C2, - 0x9DA6: 0x64F1, - 0x9DA7: 0x64E7, - 0x9DA8: 0x8209, - 0x9DA9: 0x64E0, - 0x9DAA: 0x64E1, - 0x9DAB: 0x62AC, - 0x9DAC: 0x64E3, - 0x9DAD: 0x64EF, - 0x9DAE: 0x652C, - 0x9DAF: 0x64F6, - 0x9DB0: 0x64F4, - 0x9DB1: 0x64F2, - 0x9DB2: 0x64FA, - 0x9DB3: 0x6500, - 0x9DB4: 0x64FD, - 0x9DB5: 0x6518, - 0x9DB6: 0x651C, - 0x9DB7: 0x6505, - 0x9DB8: 0x6524, - 0x9DB9: 0x6523, - 0x9DBA: 0x652B, - 0x9DBB: 0x6534, - 0x9DBC: 0x6535, - 0x9DBD: 0x6537, - 0x9DBE: 0x6536, - 0x9DBF: 0x6538, - 0x9DC0: 0x754B, - 0x9DC1: 0x6548, - 0x9DC2: 0x6556, - 0x9DC3: 0x6555, - 0x9DC4: 0x654D, - 0x9DC5: 0x6558, - 0x9DC6: 0x655E, - 0x9DC7: 0x655D, - 0x9DC8: 0x6572, - 0x9DC9: 0x6578, - 0x9DCA: 0x6582, - 0x9DCB: 0x6583, - 0x9DCC: 0x8B8A, - 0x9DCD: 0x659B, - 0x9DCE: 0x659F, - 0x9DCF: 0x65AB, - 0x9DD0: 0x65B7, - 0x9DD1: 0x65C3, - 0x9DD2: 0x65C6, - 0x9DD3: 0x65C1, - 0x9DD4: 0x65C4, - 0x9DD5: 0x65CC, - 0x9DD6: 0x65D2, - 0x9DD7: 0x65DB, - 0x9DD8: 0x65D9, - 0x9DD9: 0x65E0, - 0x9DDA: 0x65E1, - 0x9DDB: 0x65F1, - 0x9DDC: 0x6772, - 0x9DDD: 0x660A, - 0x9DDE: 0x6603, - 0x9DDF: 0x65FB, - 0x9DE0: 0x6773, - 0x9DE1: 0x6635, - 0x9DE2: 0x6636, - 0x9DE3: 0x6634, - 0x9DE4: 0x661C, - 0x9DE5: 0x664F, - 0x9DE6: 0x6644, - 0x9DE7: 0x6649, - 0x9DE8: 0x6641, - 0x9DE9: 0x665E, - 0x9DEA: 0x665D, - 0x9DEB: 0x6664, - 0x9DEC: 0x6667, - 0x9DED: 0x6668, - 0x9DEE: 0x665F, - 0x9DEF: 0x6662, - 0x9DF0: 0x6670, - 0x9DF1: 0x6683, - 0x9DF2: 0x6688, - 0x9DF3: 0x668E, - 0x9DF4: 0x6689, - 0x9DF5: 0x6684, - 0x9DF6: 0x6698, - 0x9DF7: 0x669D, - 0x9DF8: 0x66C1, - 0x9DF9: 0x66B9, - 0x9DFA: 0x66C9, - 0x9DFB: 0x66BE, - 0x9DFC: 0x66BC, - 0x9E40: 0x66C4, - 0x9E41: 0x66B8, - 0x9E42: 0x66D6, - 0x9E43: 0x66DA, - 0x9E44: 0x66E0, - 0x9E45: 0x663F, - 0x9E46: 0x66E6, - 0x9E47: 0x66E9, - 0x9E48: 0x66F0, - 0x9E49: 0x66F5, - 0x9E4A: 0x66F7, - 0x9E4B: 0x670F, - 0x9E4C: 0x6716, - 0x9E4D: 0x671E, - 0x9E4E: 0x6726, - 0x9E4F: 0x6727, - 0x9E50: 0x9738, - 0x9E51: 0x672E, - 0x9E52: 0x673F, - 0x9E53: 0x6736, - 0x9E54: 0x6741, - 0x9E55: 0x6738, - 0x9E56: 0x6737, - 0x9E57: 0x6746, - 0x9E58: 0x675E, - 0x9E59: 0x6760, - 0x9E5A: 0x6759, - 0x9E5B: 0x6763, - 0x9E5C: 0x6764, - 0x9E5D: 0x6789, - 0x9E5E: 0x6770, - 0x9E5F: 0x67A9, - 0x9E60: 0x677C, - 0x9E61: 0x676A, - 0x9E62: 0x678C, - 0x9E63: 0x678B, - 0x9E64: 0x67A6, - 0x9E65: 0x67A1, - 0x9E66: 0x6785, - 0x9E67: 0x67B7, - 0x9E68: 0x67EF, - 0x9E69: 0x67B4, - 0x9E6A: 0x67EC, - 0x9E6B: 0x67B3, - 0x9E6C: 0x67E9, - 0x9E6D: 0x67B8, - 0x9E6E: 0x67E4, - 0x9E6F: 0x67DE, - 0x9E70: 0x67DD, - 0x9E71: 0x67E2, - 0x9E72: 0x67EE, - 0x9E73: 0x67B9, - 0x9E74: 0x67CE, - 0x9E75: 0x67C6, - 0x9E76: 0x67E7, - 0x9E77: 0x6A9C, - 0x9E78: 0x681E, - 0x9E79: 0x6846, - 0x9E7A: 0x6829, - 0x9E7B: 0x6840, - 0x9E7C: 0x684D, - 0x9E7D: 0x6832, - 0x9E7E: 0x684E, - 0x9E80: 0x68B3, - 0x9E81: 0x682B, - 0x9E82: 0x6859, - 0x9E83: 0x6863, - 0x9E84: 0x6877, - 0x9E85: 0x687F, - 0x9E86: 0x689F, - 0x9E87: 0x688F, - 0x9E88: 0x68AD, - 0x9E89: 0x6894, - 0x9E8A: 0x689D, - 0x9E8B: 0x689B, - 0x9E8C: 0x6883, - 0x9E8D: 0x6AAE, - 0x9E8E: 0x68B9, - 0x9E8F: 0x6874, - 0x9E90: 0x68B5, - 0x9E91: 0x68A0, - 0x9E92: 0x68BA, - 0x9E93: 0x690F, - 0x9E94: 0x688D, - 0x9E95: 0x687E, - 0x9E96: 0x6901, - 0x9E97: 0x68CA, - 0x9E98: 0x6908, - 0x9E99: 0x68D8, - 0x9E9A: 0x6922, - 0x9E9B: 0x6926, - 0x9E9C: 0x68E1, - 0x9E9D: 0x690C, - 0x9E9E: 0x68CD, - 0x9E9F: 0x68D4, - 0x9EA0: 0x68E7, - 0x9EA1: 0x68D5, - 0x9EA2: 0x6936, - 0x9EA3: 0x6912, - 0x9EA4: 0x6904, - 0x9EA5: 0x68D7, - 0x9EA6: 0x68E3, - 0x9EA7: 0x6925, - 0x9EA8: 0x68F9, - 0x9EA9: 0x68E0, - 0x9EAA: 0x68EF, - 0x9EAB: 0x6928, - 0x9EAC: 0x692A, - 0x9EAD: 0x691A, - 0x9EAE: 0x6923, - 0x9EAF: 0x6921, - 0x9EB0: 0x68C6, - 0x9EB1: 0x6979, - 0x9EB2: 0x6977, - 0x9EB3: 0x695C, - 0x9EB4: 0x6978, - 0x9EB5: 0x696B, - 0x9EB6: 0x6954, - 0x9EB7: 0x697E, - 0x9EB8: 0x696E, - 0x9EB9: 0x6939, - 0x9EBA: 0x6974, - 0x9EBB: 0x693D, - 0x9EBC: 0x6959, - 0x9EBD: 0x6930, - 0x9EBE: 0x6961, - 0x9EBF: 0x695E, - 0x9EC0: 0x695D, - 0x9EC1: 0x6981, - 0x9EC2: 0x696A, - 0x9EC3: 0x69B2, - 0x9EC4: 0x69AE, - 0x9EC5: 0x69D0, - 0x9EC6: 0x69BF, - 0x9EC7: 0x69C1, - 0x9EC8: 0x69D3, - 0x9EC9: 0x69BE, - 0x9ECA: 0x69CE, - 0x9ECB: 0x5BE8, - 0x9ECC: 0x69CA, - 0x9ECD: 0x69DD, - 0x9ECE: 0x69BB, - 0x9ECF: 0x69C3, - 0x9ED0: 0x69A7, - 0x9ED1: 0x6A2E, - 0x9ED2: 0x6991, - 0x9ED3: 0x69A0, - 0x9ED4: 0x699C, - 0x9ED5: 0x6995, - 0x9ED6: 0x69B4, - 0x9ED7: 0x69DE, - 0x9ED8: 0x69E8, - 0x9ED9: 0x6A02, - 0x9EDA: 0x6A1B, - 0x9EDB: 0x69FF, - 0x9EDC: 0x6B0A, - 0x9EDD: 0x69F9, - 0x9EDE: 0x69F2, - 0x9EDF: 0x69E7, - 0x9EE0: 0x6A05, - 0x9EE1: 0x69B1, - 0x9EE2: 0x6A1E, - 0x9EE3: 0x69ED, - 0x9EE4: 0x6A14, - 0x9EE5: 0x69EB, - 0x9EE6: 0x6A0A, - 0x9EE7: 0x6A12, - 0x9EE8: 0x6AC1, - 0x9EE9: 0x6A23, - 0x9EEA: 0x6A13, - 0x9EEB: 0x6A44, - 0x9EEC: 0x6A0C, - 0x9EED: 0x6A72, - 0x9EEE: 0x6A36, - 0x9EEF: 0x6A78, - 0x9EF0: 0x6A47, - 0x9EF1: 0x6A62, - 0x9EF2: 0x6A59, - 0x9EF3: 0x6A66, - 0x9EF4: 0x6A48, - 0x9EF5: 0x6A38, - 0x9EF6: 0x6A22, - 0x9EF7: 0x6A90, - 0x9EF8: 0x6A8D, - 0x9EF9: 0x6AA0, - 0x9EFA: 0x6A84, - 0x9EFB: 0x6AA2, - 0x9EFC: 0x6AA3, - 0x9F40: 0x6A97, - 0x9F41: 0x8617, - 0x9F42: 0x6ABB, - 0x9F43: 0x6AC3, - 0x9F44: 0x6AC2, - 0x9F45: 0x6AB8, - 0x9F46: 0x6AB3, - 0x9F47: 0x6AAC, - 0x9F48: 0x6ADE, - 0x9F49: 0x6AD1, - 0x9F4A: 0x6ADF, - 0x9F4B: 0x6AAA, - 0x9F4C: 0x6ADA, - 0x9F4D: 0x6AEA, - 0x9F4E: 0x6AFB, - 0x9F4F: 0x6B05, - 0x9F50: 0x8616, - 0x9F51: 0x6AFA, - 0x9F52: 0x6B12, - 0x9F53: 0x6B16, - 0x9F54: 0x9B31, - 0x9F55: 0x6B1F, - 0x9F56: 0x6B38, - 0x9F57: 0x6B37, - 0x9F58: 0x76DC, - 0x9F59: 0x6B39, - 0x9F5A: 0x98EE, - 0x9F5B: 0x6B47, - 0x9F5C: 0x6B43, - 0x9F5D: 0x6B49, - 0x9F5E: 0x6B50, - 0x9F5F: 0x6B59, - 0x9F60: 0x6B54, - 0x9F61: 0x6B5B, - 0x9F62: 0x6B5F, - 0x9F63: 0x6B61, - 0x9F64: 0x6B78, - 0x9F65: 0x6B79, - 0x9F66: 0x6B7F, - 0x9F67: 0x6B80, - 0x9F68: 0x6B84, - 0x9F69: 0x6B83, - 0x9F6A: 0x6B8D, - 0x9F6B: 0x6B98, - 0x9F6C: 0x6B95, - 0x9F6D: 0x6B9E, - 0x9F6E: 0x6BA4, - 0x9F6F: 0x6BAA, - 0x9F70: 0x6BAB, - 0x9F71: 0x6BAF, - 0x9F72: 0x6BB2, - 0x9F73: 0x6BB1, - 0x9F74: 0x6BB3, - 0x9F75: 0x6BB7, - 0x9F76: 0x6BBC, - 0x9F77: 0x6BC6, - 0x9F78: 0x6BCB, - 0x9F79: 0x6BD3, - 0x9F7A: 0x6BDF, - 0x9F7B: 0x6BEC, - 0x9F7C: 0x6BEB, - 0x9F7D: 0x6BF3, - 0x9F7E: 0x6BEF, - 0x9F80: 0x9EBE, - 0x9F81: 0x6C08, - 0x9F82: 0x6C13, - 0x9F83: 0x6C14, - 0x9F84: 0x6C1B, - 0x9F85: 0x6C24, - 0x9F86: 0x6C23, - 0x9F87: 0x6C5E, - 0x9F88: 0x6C55, - 0x9F89: 0x6C62, - 0x9F8A: 0x6C6A, - 0x9F8B: 0x6C82, - 0x9F8C: 0x6C8D, - 0x9F8D: 0x6C9A, - 0x9F8E: 0x6C81, - 0x9F8F: 0x6C9B, - 0x9F90: 0x6C7E, - 0x9F91: 0x6C68, - 0x9F92: 0x6C73, - 0x9F93: 0x6C92, - 0x9F94: 0x6C90, - 0x9F95: 0x6CC4, - 0x9F96: 0x6CF1, - 0x9F97: 0x6CD3, - 0x9F98: 0x6CBD, - 0x9F99: 0x6CD7, - 0x9F9A: 0x6CC5, - 0x9F9B: 0x6CDD, - 0x9F9C: 0x6CAE, - 0x9F9D: 0x6CB1, - 0x9F9E: 0x6CBE, - 0x9F9F: 0x6CBA, - 0x9FA0: 0x6CDB, - 0x9FA1: 0x6CEF, - 0x9FA2: 0x6CD9, - 0x9FA3: 0x6CEA, - 0x9FA4: 0x6D1F, - 0x9FA5: 0x884D, - 0x9FA6: 0x6D36, - 0x9FA7: 0x6D2B, - 0x9FA8: 0x6D3D, - 0x9FA9: 0x6D38, - 0x9FAA: 0x6D19, - 0x9FAB: 0x6D35, - 0x9FAC: 0x6D33, - 0x9FAD: 0x6D12, - 0x9FAE: 0x6D0C, - 0x9FAF: 0x6D63, - 0x9FB0: 0x6D93, - 0x9FB1: 0x6D64, - 0x9FB2: 0x6D5A, - 0x9FB3: 0x6D79, - 0x9FB4: 0x6D59, - 0x9FB5: 0x6D8E, - 0x9FB6: 0x6D95, - 0x9FB7: 0x6FE4, - 0x9FB8: 0x6D85, - 0x9FB9: 0x6DF9, - 0x9FBA: 0x6E15, - 0x9FBB: 0x6E0A, - 0x9FBC: 0x6DB5, - 0x9FBD: 0x6DC7, - 0x9FBE: 0x6DE6, - 0x9FBF: 0x6DB8, - 0x9FC0: 0x6DC6, - 0x9FC1: 0x6DEC, - 0x9FC2: 0x6DDE, - 0x9FC3: 0x6DCC, - 0x9FC4: 0x6DE8, - 0x9FC5: 0x6DD2, - 0x9FC6: 0x6DC5, - 0x9FC7: 0x6DFA, - 0x9FC8: 0x6DD9, - 0x9FC9: 0x6DE4, - 0x9FCA: 0x6DD5, - 0x9FCB: 0x6DEA, - 0x9FCC: 0x6DEE, - 0x9FCD: 0x6E2D, - 0x9FCE: 0x6E6E, - 0x9FCF: 0x6E2E, - 0x9FD0: 0x6E19, - 0x9FD1: 0x6E72, - 0x9FD2: 0x6E5F, - 0x9FD3: 0x6E3E, - 0x9FD4: 0x6E23, - 0x9FD5: 0x6E6B, - 0x9FD6: 0x6E2B, - 0x9FD7: 0x6E76, - 0x9FD8: 0x6E4D, - 0x9FD9: 0x6E1F, - 0x9FDA: 0x6E43, - 0x9FDB: 0x6E3A, - 0x9FDC: 0x6E4E, - 0x9FDD: 0x6E24, - 0x9FDE: 0x6EFF, - 0x9FDF: 0x6E1D, - 0x9FE0: 0x6E38, - 0x9FE1: 0x6E82, - 0x9FE2: 0x6EAA, - 0x9FE3: 0x6E98, - 0x9FE4: 0x6EC9, - 0x9FE5: 0x6EB7, - 0x9FE6: 0x6ED3, - 0x9FE7: 0x6EBD, - 0x9FE8: 0x6EAF, - 0x9FE9: 0x6EC4, - 0x9FEA: 0x6EB2, - 0x9FEB: 0x6ED4, - 0x9FEC: 0x6ED5, - 0x9FED: 0x6E8F, - 0x9FEE: 0x6EA5, - 0x9FEF: 0x6EC2, - 0x9FF0: 0x6E9F, - 0x9FF1: 0x6F41, - 0x9FF2: 0x6F11, - 0x9FF3: 0x704C, - 0x9FF4: 0x6EEC, - 0x9FF5: 0x6EF8, - 0x9FF6: 0x6EFE, - 0x9FF7: 0x6F3F, - 0x9FF8: 0x6EF2, - 0x9FF9: 0x6F31, - 0x9FFA: 0x6EEF, - 0x9FFB: 0x6F32, - 0x9FFC: 0x6ECC, - 0xA1: 0xFF61, - 0xA2: 0xFF62, - 0xA3: 0xFF63, - 0xA4: 0xFF64, - 0xA5: 0xFF65, - 0xA6: 0xFF66, - 0xA7: 0xFF67, - 0xA8: 0xFF68, - 0xA9: 0xFF69, - 0xAA: 0xFF6A, - 0xAB: 0xFF6B, - 0xAC: 0xFF6C, - 0xAD: 0xFF6D, - 0xAE: 0xFF6E, - 0xAF: 0xFF6F, - 0xB0: 0xFF70, - 0xB1: 0xFF71, - 0xB2: 0xFF72, - 0xB3: 0xFF73, - 0xB4: 0xFF74, - 0xB5: 0xFF75, - 0xB6: 0xFF76, - 0xB7: 0xFF77, - 0xB8: 0xFF78, - 0xB9: 0xFF79, - 0xBA: 0xFF7A, - 0xBB: 0xFF7B, - 0xBC: 0xFF7C, - 0xBD: 0xFF7D, - 0xBE: 0xFF7E, - 0xBF: 0xFF7F, - 0xC0: 0xFF80, - 0xC1: 0xFF81, - 0xC2: 0xFF82, - 0xC3: 0xFF83, - 0xC4: 0xFF84, - 0xC5: 0xFF85, - 0xC6: 0xFF86, - 0xC7: 0xFF87, - 0xC8: 0xFF88, - 0xC9: 0xFF89, - 0xCA: 0xFF8A, - 0xCB: 0xFF8B, - 0xCC: 0xFF8C, - 0xCD: 0xFF8D, - 0xCE: 0xFF8E, - 0xCF: 0xFF8F, - 0xD0: 0xFF90, - 0xD1: 0xFF91, - 0xD2: 0xFF92, - 0xD3: 0xFF93, - 0xD4: 0xFF94, - 0xD5: 0xFF95, - 0xD6: 0xFF96, - 0xD7: 0xFF97, - 0xD8: 0xFF98, - 0xD9: 0xFF99, - 0xDA: 0xFF9A, - 0xDB: 0xFF9B, - 0xDC: 0xFF9C, - 0xDD: 0xFF9D, - 0xDE: 0xFF9E, - 0xDF: 0xFF9F, - 0xE040: 0x6F3E, - 0xE041: 0x6F13, - 0xE042: 0x6EF7, - 0xE043: 0x6F86, - 0xE044: 0x6F7A, - 0xE045: 0x6F78, - 0xE046: 0x6F81, - 0xE047: 0x6F80, - 0xE048: 0x6F6F, - 0xE049: 0x6F5B, - 0xE04A: 0x6FF3, - 0xE04B: 0x6F6D, - 0xE04C: 0x6F82, - 0xE04D: 0x6F7C, - 0xE04E: 0x6F58, - 0xE04F: 0x6F8E, - 0xE050: 0x6F91, - 0xE051: 0x6FC2, - 0xE052: 0x6F66, - 0xE053: 0x6FB3, - 0xE054: 0x6FA3, - 0xE055: 0x6FA1, - 0xE056: 0x6FA4, - 0xE057: 0x6FB9, - 0xE058: 0x6FC6, - 0xE059: 0x6FAA, - 0xE05A: 0x6FDF, - 0xE05B: 0x6FD5, - 0xE05C: 0x6FEC, - 0xE05D: 0x6FD4, - 0xE05E: 0x6FD8, - 0xE05F: 0x6FF1, - 0xE060: 0x6FEE, - 0xE061: 0x6FDB, - 0xE062: 0x7009, - 0xE063: 0x700B, - 0xE064: 0x6FFA, - 0xE065: 0x7011, - 0xE066: 0x7001, - 0xE067: 0x700F, - 0xE068: 0x6FFE, - 0xE069: 0x701B, - 0xE06A: 0x701A, - 0xE06B: 0x6F74, - 0xE06C: 0x701D, - 0xE06D: 0x7018, - 0xE06E: 0x701F, - 0xE06F: 0x7030, - 0xE070: 0x703E, - 0xE071: 0x7032, - 0xE072: 0x7051, - 0xE073: 0x7063, - 0xE074: 0x7099, - 0xE075: 0x7092, - 0xE076: 0x70AF, - 0xE077: 0x70F1, - 0xE078: 0x70AC, - 0xE079: 0x70B8, - 0xE07A: 0x70B3, - 0xE07B: 0x70AE, - 0xE07C: 0x70DF, - 0xE07D: 0x70CB, - 0xE07E: 0x70DD, - 0xE080: 0x70D9, - 0xE081: 0x7109, - 0xE082: 0x70FD, - 0xE083: 0x711C, - 0xE084: 0x7119, - 0xE085: 0x7165, - 0xE086: 0x7155, - 0xE087: 0x7188, - 0xE088: 0x7166, - 0xE089: 0x7162, - 0xE08A: 0x714C, - 0xE08B: 0x7156, - 0xE08C: 0x716C, - 0xE08D: 0x718F, - 0xE08E: 0x71FB, - 0xE08F: 0x7184, - 0xE090: 0x7195, - 0xE091: 0x71A8, - 0xE092: 0x71AC, - 0xE093: 0x71D7, - 0xE094: 0x71B9, - 0xE095: 0x71BE, - 0xE096: 0x71D2, - 0xE097: 0x71C9, - 0xE098: 0x71D4, - 0xE099: 0x71CE, - 0xE09A: 0x71E0, - 0xE09B: 0x71EC, - 0xE09C: 0x71E7, - 0xE09D: 0x71F5, - 0xE09E: 0x71FC, - 0xE09F: 0x71F9, - 0xE0A0: 0x71FF, - 0xE0A1: 0x720D, - 0xE0A2: 0x7210, - 0xE0A3: 0x721B, - 0xE0A4: 0x7228, - 0xE0A5: 0x722D, - 0xE0A6: 0x722C, - 0xE0A7: 0x7230, - 0xE0A8: 0x7232, - 0xE0A9: 0x723B, - 0xE0AA: 0x723C, - 0xE0AB: 0x723F, - 0xE0AC: 0x7240, - 0xE0AD: 0x7246, - 0xE0AE: 0x724B, - 0xE0AF: 0x7258, - 0xE0B0: 0x7274, - 0xE0B1: 0x727E, - 0xE0B2: 0x7282, - 0xE0B3: 0x7281, - 0xE0B4: 0x7287, - 0xE0B5: 0x7292, - 0xE0B6: 0x7296, - 0xE0B7: 0x72A2, - 0xE0B8: 0x72A7, - 0xE0B9: 0x72B9, - 0xE0BA: 0x72B2, - 0xE0BB: 0x72C3, - 0xE0BC: 0x72C6, - 0xE0BD: 0x72C4, - 0xE0BE: 0x72CE, - 0xE0BF: 0x72D2, - 0xE0C0: 0x72E2, - 0xE0C1: 0x72E0, - 0xE0C2: 0x72E1, - 0xE0C3: 0x72F9, - 0xE0C4: 0x72F7, - 0xE0C5: 0x500F, - 0xE0C6: 0x7317, - 0xE0C7: 0x730A, - 0xE0C8: 0x731C, - 0xE0C9: 0x7316, - 0xE0CA: 0x731D, - 0xE0CB: 0x7334, - 0xE0CC: 0x732F, - 0xE0CD: 0x7329, - 0xE0CE: 0x7325, - 0xE0CF: 0x733E, - 0xE0D0: 0x734E, - 0xE0D1: 0x734F, - 0xE0D2: 0x9ED8, - 0xE0D3: 0x7357, - 0xE0D4: 0x736A, - 0xE0D5: 0x7368, - 0xE0D6: 0x7370, - 0xE0D7: 0x7378, - 0xE0D8: 0x7375, - 0xE0D9: 0x737B, - 0xE0DA: 0x737A, - 0xE0DB: 0x73C8, - 0xE0DC: 0x73B3, - 0xE0DD: 0x73CE, - 0xE0DE: 0x73BB, - 0xE0DF: 0x73C0, - 0xE0E0: 0x73E5, - 0xE0E1: 0x73EE, - 0xE0E2: 0x73DE, - 0xE0E3: 0x74A2, - 0xE0E4: 0x7405, - 0xE0E5: 0x746F, - 0xE0E6: 0x7425, - 0xE0E7: 0x73F8, - 0xE0E8: 0x7432, - 0xE0E9: 0x743A, - 0xE0EA: 0x7455, - 0xE0EB: 0x743F, - 0xE0EC: 0x745F, - 0xE0ED: 0x7459, - 0xE0EE: 0x7441, - 0xE0EF: 0x745C, - 0xE0F0: 0x7469, - 0xE0F1: 0x7470, - 0xE0F2: 0x7463, - 0xE0F3: 0x746A, - 0xE0F4: 0x7476, - 0xE0F5: 0x747E, - 0xE0F6: 0x748B, - 0xE0F7: 0x749E, - 0xE0F8: 0x74A7, - 0xE0F9: 0x74CA, - 0xE0FA: 0x74CF, - 0xE0FB: 0x74D4, - 0xE0FC: 0x73F1, - 0xE140: 0x74E0, - 0xE141: 0x74E3, - 0xE142: 0x74E7, - 0xE143: 0x74E9, - 0xE144: 0x74EE, - 0xE145: 0x74F2, - 0xE146: 0x74F0, - 0xE147: 0x74F1, - 0xE148: 0x74F8, - 0xE149: 0x74F7, - 0xE14A: 0x7504, - 0xE14B: 0x7503, - 0xE14C: 0x7505, - 0xE14D: 0x750C, - 0xE14E: 0x750E, - 0xE14F: 0x750D, - 0xE150: 0x7515, - 0xE151: 0x7513, - 0xE152: 0x751E, - 0xE153: 0x7526, - 0xE154: 0x752C, - 0xE155: 0x753C, - 0xE156: 0x7544, - 0xE157: 0x754D, - 0xE158: 0x754A, - 0xE159: 0x7549, - 0xE15A: 0x755B, - 0xE15B: 0x7546, - 0xE15C: 0x755A, - 0xE15D: 0x7569, - 0xE15E: 0x7564, - 0xE15F: 0x7567, - 0xE160: 0x756B, - 0xE161: 0x756D, - 0xE162: 0x7578, - 0xE163: 0x7576, - 0xE164: 0x7586, - 0xE165: 0x7587, - 0xE166: 0x7574, - 0xE167: 0x758A, - 0xE168: 0x7589, - 0xE169: 0x7582, - 0xE16A: 0x7594, - 0xE16B: 0x759A, - 0xE16C: 0x759D, - 0xE16D: 0x75A5, - 0xE16E: 0x75A3, - 0xE16F: 0x75C2, - 0xE170: 0x75B3, - 0xE171: 0x75C3, - 0xE172: 0x75B5, - 0xE173: 0x75BD, - 0xE174: 0x75B8, - 0xE175: 0x75BC, - 0xE176: 0x75B1, - 0xE177: 0x75CD, - 0xE178: 0x75CA, - 0xE179: 0x75D2, - 0xE17A: 0x75D9, - 0xE17B: 0x75E3, - 0xE17C: 0x75DE, - 0xE17D: 0x75FE, - 0xE17E: 0x75FF, - 0xE180: 0x75FC, - 0xE181: 0x7601, - 0xE182: 0x75F0, - 0xE183: 0x75FA, - 0xE184: 0x75F2, - 0xE185: 0x75F3, - 0xE186: 0x760B, - 0xE187: 0x760D, - 0xE188: 0x7609, - 0xE189: 0x761F, - 0xE18A: 0x7627, - 0xE18B: 0x7620, - 0xE18C: 0x7621, - 0xE18D: 0x7622, - 0xE18E: 0x7624, - 0xE18F: 0x7634, - 0xE190: 0x7630, - 0xE191: 0x763B, - 0xE192: 0x7647, - 0xE193: 0x7648, - 0xE194: 0x7646, - 0xE195: 0x765C, - 0xE196: 0x7658, - 0xE197: 0x7661, - 0xE198: 0x7662, - 0xE199: 0x7668, - 0xE19A: 0x7669, - 0xE19B: 0x766A, - 0xE19C: 0x7667, - 0xE19D: 0x766C, - 0xE19E: 0x7670, - 0xE19F: 0x7672, - 0xE1A0: 0x7676, - 0xE1A1: 0x7678, - 0xE1A2: 0x767C, - 0xE1A3: 0x7680, - 0xE1A4: 0x7683, - 0xE1A5: 0x7688, - 0xE1A6: 0x768B, - 0xE1A7: 0x768E, - 0xE1A8: 0x7696, - 0xE1A9: 0x7693, - 0xE1AA: 0x7699, - 0xE1AB: 0x769A, - 0xE1AC: 0x76B0, - 0xE1AD: 0x76B4, - 0xE1AE: 0x76B8, - 0xE1AF: 0x76B9, - 0xE1B0: 0x76BA, - 0xE1B1: 0x76C2, - 0xE1B2: 0x76CD, - 0xE1B3: 0x76D6, - 0xE1B4: 0x76D2, - 0xE1B5: 0x76DE, - 0xE1B6: 0x76E1, - 0xE1B7: 0x76E5, - 0xE1B8: 0x76E7, - 0xE1B9: 0x76EA, - 0xE1BA: 0x862F, - 0xE1BB: 0x76FB, - 0xE1BC: 0x7708, - 0xE1BD: 0x7707, - 0xE1BE: 0x7704, - 0xE1BF: 0x7729, - 0xE1C0: 0x7724, - 0xE1C1: 0x771E, - 0xE1C2: 0x7725, - 0xE1C3: 0x7726, - 0xE1C4: 0x771B, - 0xE1C5: 0x7737, - 0xE1C6: 0x7738, - 0xE1C7: 0x7747, - 0xE1C8: 0x775A, - 0xE1C9: 0x7768, - 0xE1CA: 0x776B, - 0xE1CB: 0x775B, - 0xE1CC: 0x7765, - 0xE1CD: 0x777F, - 0xE1CE: 0x777E, - 0xE1CF: 0x7779, - 0xE1D0: 0x778E, - 0xE1D1: 0x778B, - 0xE1D2: 0x7791, - 0xE1D3: 0x77A0, - 0xE1D4: 0x779E, - 0xE1D5: 0x77B0, - 0xE1D6: 0x77B6, - 0xE1D7: 0x77B9, - 0xE1D8: 0x77BF, - 0xE1D9: 0x77BC, - 0xE1DA: 0x77BD, - 0xE1DB: 0x77BB, - 0xE1DC: 0x77C7, - 0xE1DD: 0x77CD, - 0xE1DE: 0x77D7, - 0xE1DF: 0x77DA, - 0xE1E0: 0x77DC, - 0xE1E1: 0x77E3, - 0xE1E2: 0x77EE, - 0xE1E3: 0x77FC, - 0xE1E4: 0x780C, - 0xE1E5: 0x7812, - 0xE1E6: 0x7926, - 0xE1E7: 0x7820, - 0xE1E8: 0x792A, - 0xE1E9: 0x7845, - 0xE1EA: 0x788E, - 0xE1EB: 0x7874, - 0xE1EC: 0x7886, - 0xE1ED: 0x787C, - 0xE1EE: 0x789A, - 0xE1EF: 0x788C, - 0xE1F0: 0x78A3, - 0xE1F1: 0x78B5, - 0xE1F2: 0x78AA, - 0xE1F3: 0x78AF, - 0xE1F4: 0x78D1, - 0xE1F5: 0x78C6, - 0xE1F6: 0x78CB, - 0xE1F7: 0x78D4, - 0xE1F8: 0x78BE, - 0xE1F9: 0x78BC, - 0xE1FA: 0x78C5, - 0xE1FB: 0x78CA, - 0xE1FC: 0x78EC, - 0xE240: 0x78E7, - 0xE241: 0x78DA, - 0xE242: 0x78FD, - 0xE243: 0x78F4, - 0xE244: 0x7907, - 0xE245: 0x7912, - 0xE246: 0x7911, - 0xE247: 0x7919, - 0xE248: 0x792C, - 0xE249: 0x792B, - 0xE24A: 0x7940, - 0xE24B: 0x7960, - 0xE24C: 0x7957, - 0xE24D: 0x795F, - 0xE24E: 0x795A, - 0xE24F: 0x7955, - 0xE250: 0x7953, - 0xE251: 0x797A, - 0xE252: 0x797F, - 0xE253: 0x798A, - 0xE254: 0x799D, - 0xE255: 0x79A7, - 0xE256: 0x9F4B, - 0xE257: 0x79AA, - 0xE258: 0x79AE, - 0xE259: 0x79B3, - 0xE25A: 0x79B9, - 0xE25B: 0x79BA, - 0xE25C: 0x79C9, - 0xE25D: 0x79D5, - 0xE25E: 0x79E7, - 0xE25F: 0x79EC, - 0xE260: 0x79E1, - 0xE261: 0x79E3, - 0xE262: 0x7A08, - 0xE263: 0x7A0D, - 0xE264: 0x7A18, - 0xE265: 0x7A19, - 0xE266: 0x7A20, - 0xE267: 0x7A1F, - 0xE268: 0x7980, - 0xE269: 0x7A31, - 0xE26A: 0x7A3B, - 0xE26B: 0x7A3E, - 0xE26C: 0x7A37, - 0xE26D: 0x7A43, - 0xE26E: 0x7A57, - 0xE26F: 0x7A49, - 0xE270: 0x7A61, - 0xE271: 0x7A62, - 0xE272: 0x7A69, - 0xE273: 0x9F9D, - 0xE274: 0x7A70, - 0xE275: 0x7A79, - 0xE276: 0x7A7D, - 0xE277: 0x7A88, - 0xE278: 0x7A97, - 0xE279: 0x7A95, - 0xE27A: 0x7A98, - 0xE27B: 0x7A96, - 0xE27C: 0x7AA9, - 0xE27D: 0x7AC8, - 0xE27E: 0x7AB0, - 0xE280: 0x7AB6, - 0xE281: 0x7AC5, - 0xE282: 0x7AC4, - 0xE283: 0x7ABF, - 0xE284: 0x9083, - 0xE285: 0x7AC7, - 0xE286: 0x7ACA, - 0xE287: 0x7ACD, - 0xE288: 0x7ACF, - 0xE289: 0x7AD5, - 0xE28A: 0x7AD3, - 0xE28B: 0x7AD9, - 0xE28C: 0x7ADA, - 0xE28D: 0x7ADD, - 0xE28E: 0x7AE1, - 0xE28F: 0x7AE2, - 0xE290: 0x7AE6, - 0xE291: 0x7AED, - 0xE292: 0x7AF0, - 0xE293: 0x7B02, - 0xE294: 0x7B0F, - 0xE295: 0x7B0A, - 0xE296: 0x7B06, - 0xE297: 0x7B33, - 0xE298: 0x7B18, - 0xE299: 0x7B19, - 0xE29A: 0x7B1E, - 0xE29B: 0x7B35, - 0xE29C: 0x7B28, - 0xE29D: 0x7B36, - 0xE29E: 0x7B50, - 0xE29F: 0x7B7A, - 0xE2A0: 0x7B04, - 0xE2A1: 0x7B4D, - 0xE2A2: 0x7B0B, - 0xE2A3: 0x7B4C, - 0xE2A4: 0x7B45, - 0xE2A5: 0x7B75, - 0xE2A6: 0x7B65, - 0xE2A7: 0x7B74, - 0xE2A8: 0x7B67, - 0xE2A9: 0x7B70, - 0xE2AA: 0x7B71, - 0xE2AB: 0x7B6C, - 0xE2AC: 0x7B6E, - 0xE2AD: 0x7B9D, - 0xE2AE: 0x7B98, - 0xE2AF: 0x7B9F, - 0xE2B0: 0x7B8D, - 0xE2B1: 0x7B9C, - 0xE2B2: 0x7B9A, - 0xE2B3: 0x7B8B, - 0xE2B4: 0x7B92, - 0xE2B5: 0x7B8F, - 0xE2B6: 0x7B5D, - 0xE2B7: 0x7B99, - 0xE2B8: 0x7BCB, - 0xE2B9: 0x7BC1, - 0xE2BA: 0x7BCC, - 0xE2BB: 0x7BCF, - 0xE2BC: 0x7BB4, - 0xE2BD: 0x7BC6, - 0xE2BE: 0x7BDD, - 0xE2BF: 0x7BE9, - 0xE2C0: 0x7C11, - 0xE2C1: 0x7C14, - 0xE2C2: 0x7BE6, - 0xE2C3: 0x7BE5, - 0xE2C4: 0x7C60, - 0xE2C5: 0x7C00, - 0xE2C6: 0x7C07, - 0xE2C7: 0x7C13, - 0xE2C8: 0x7BF3, - 0xE2C9: 0x7BF7, - 0xE2CA: 0x7C17, - 0xE2CB: 0x7C0D, - 0xE2CC: 0x7BF6, - 0xE2CD: 0x7C23, - 0xE2CE: 0x7C27, - 0xE2CF: 0x7C2A, - 0xE2D0: 0x7C1F, - 0xE2D1: 0x7C37, - 0xE2D2: 0x7C2B, - 0xE2D3: 0x7C3D, - 0xE2D4: 0x7C4C, - 0xE2D5: 0x7C43, - 0xE2D6: 0x7C54, - 0xE2D7: 0x7C4F, - 0xE2D8: 0x7C40, - 0xE2D9: 0x7C50, - 0xE2DA: 0x7C58, - 0xE2DB: 0x7C5F, - 0xE2DC: 0x7C64, - 0xE2DD: 0x7C56, - 0xE2DE: 0x7C65, - 0xE2DF: 0x7C6C, - 0xE2E0: 0x7C75, - 0xE2E1: 0x7C83, - 0xE2E2: 0x7C90, - 0xE2E3: 0x7CA4, - 0xE2E4: 0x7CAD, - 0xE2E5: 0x7CA2, - 0xE2E6: 0x7CAB, - 0xE2E7: 0x7CA1, - 0xE2E8: 0x7CA8, - 0xE2E9: 0x7CB3, - 0xE2EA: 0x7CB2, - 0xE2EB: 0x7CB1, - 0xE2EC: 0x7CAE, - 0xE2ED: 0x7CB9, - 0xE2EE: 0x7CBD, - 0xE2EF: 0x7CC0, - 0xE2F0: 0x7CC5, - 0xE2F1: 0x7CC2, - 0xE2F2: 0x7CD8, - 0xE2F3: 0x7CD2, - 0xE2F4: 0x7CDC, - 0xE2F5: 0x7CE2, - 0xE2F6: 0x9B3B, - 0xE2F7: 0x7CEF, - 0xE2F8: 0x7CF2, - 0xE2F9: 0x7CF4, - 0xE2FA: 0x7CF6, - 0xE2FB: 0x7CFA, - 0xE2FC: 0x7D06, - 0xE340: 0x7D02, - 0xE341: 0x7D1C, - 0xE342: 0x7D15, - 0xE343: 0x7D0A, - 0xE344: 0x7D45, - 0xE345: 0x7D4B, - 0xE346: 0x7D2E, - 0xE347: 0x7D32, - 0xE348: 0x7D3F, - 0xE349: 0x7D35, - 0xE34A: 0x7D46, - 0xE34B: 0x7D73, - 0xE34C: 0x7D56, - 0xE34D: 0x7D4E, - 0xE34E: 0x7D72, - 0xE34F: 0x7D68, - 0xE350: 0x7D6E, - 0xE351: 0x7D4F, - 0xE352: 0x7D63, - 0xE353: 0x7D93, - 0xE354: 0x7D89, - 0xE355: 0x7D5B, - 0xE356: 0x7D8F, - 0xE357: 0x7D7D, - 0xE358: 0x7D9B, - 0xE359: 0x7DBA, - 0xE35A: 0x7DAE, - 0xE35B: 0x7DA3, - 0xE35C: 0x7DB5, - 0xE35D: 0x7DC7, - 0xE35E: 0x7DBD, - 0xE35F: 0x7DAB, - 0xE360: 0x7E3D, - 0xE361: 0x7DA2, - 0xE362: 0x7DAF, - 0xE363: 0x7DDC, - 0xE364: 0x7DB8, - 0xE365: 0x7D9F, - 0xE366: 0x7DB0, - 0xE367: 0x7DD8, - 0xE368: 0x7DDD, - 0xE369: 0x7DE4, - 0xE36A: 0x7DDE, - 0xE36B: 0x7DFB, - 0xE36C: 0x7DF2, - 0xE36D: 0x7DE1, - 0xE36E: 0x7E05, - 0xE36F: 0x7E0A, - 0xE370: 0x7E23, - 0xE371: 0x7E21, - 0xE372: 0x7E12, - 0xE373: 0x7E31, - 0xE374: 0x7E1F, - 0xE375: 0x7E09, - 0xE376: 0x7E0B, - 0xE377: 0x7E22, - 0xE378: 0x7E46, - 0xE379: 0x7E66, - 0xE37A: 0x7E3B, - 0xE37B: 0x7E35, - 0xE37C: 0x7E39, - 0xE37D: 0x7E43, - 0xE37E: 0x7E37, - 0xE380: 0x7E32, - 0xE381: 0x7E3A, - 0xE382: 0x7E67, - 0xE383: 0x7E5D, - 0xE384: 0x7E56, - 0xE385: 0x7E5E, - 0xE386: 0x7E59, - 0xE387: 0x7E5A, - 0xE388: 0x7E79, - 0xE389: 0x7E6A, - 0xE38A: 0x7E69, - 0xE38B: 0x7E7C, - 0xE38C: 0x7E7B, - 0xE38D: 0x7E83, - 0xE38E: 0x7DD5, - 0xE38F: 0x7E7D, - 0xE390: 0x8FAE, - 0xE391: 0x7E7F, - 0xE392: 0x7E88, - 0xE393: 0x7E89, - 0xE394: 0x7E8C, - 0xE395: 0x7E92, - 0xE396: 0x7E90, - 0xE397: 0x7E93, - 0xE398: 0x7E94, - 0xE399: 0x7E96, - 0xE39A: 0x7E8E, - 0xE39B: 0x7E9B, - 0xE39C: 0x7E9C, - 0xE39D: 0x7F38, - 0xE39E: 0x7F3A, - 0xE39F: 0x7F45, - 0xE3A0: 0x7F4C, - 0xE3A1: 0x7F4D, - 0xE3A2: 0x7F4E, - 0xE3A3: 0x7F50, - 0xE3A4: 0x7F51, - 0xE3A5: 0x7F55, - 0xE3A6: 0x7F54, - 0xE3A7: 0x7F58, - 0xE3A8: 0x7F5F, - 0xE3A9: 0x7F60, - 0xE3AA: 0x7F68, - 0xE3AB: 0x7F69, - 0xE3AC: 0x7F67, - 0xE3AD: 0x7F78, - 0xE3AE: 0x7F82, - 0xE3AF: 0x7F86, - 0xE3B0: 0x7F83, - 0xE3B1: 0x7F88, - 0xE3B2: 0x7F87, - 0xE3B3: 0x7F8C, - 0xE3B4: 0x7F94, - 0xE3B5: 0x7F9E, - 0xE3B6: 0x7F9D, - 0xE3B7: 0x7F9A, - 0xE3B8: 0x7FA3, - 0xE3B9: 0x7FAF, - 0xE3BA: 0x7FB2, - 0xE3BB: 0x7FB9, - 0xE3BC: 0x7FAE, - 0xE3BD: 0x7FB6, - 0xE3BE: 0x7FB8, - 0xE3BF: 0x8B71, - 0xE3C0: 0x7FC5, - 0xE3C1: 0x7FC6, - 0xE3C2: 0x7FCA, - 0xE3C3: 0x7FD5, - 0xE3C4: 0x7FD4, - 0xE3C5: 0x7FE1, - 0xE3C6: 0x7FE6, - 0xE3C7: 0x7FE9, - 0xE3C8: 0x7FF3, - 0xE3C9: 0x7FF9, - 0xE3CA: 0x98DC, - 0xE3CB: 0x8006, - 0xE3CC: 0x8004, - 0xE3CD: 0x800B, - 0xE3CE: 0x8012, - 0xE3CF: 0x8018, - 0xE3D0: 0x8019, - 0xE3D1: 0x801C, - 0xE3D2: 0x8021, - 0xE3D3: 0x8028, - 0xE3D4: 0x803F, - 0xE3D5: 0x803B, - 0xE3D6: 0x804A, - 0xE3D7: 0x8046, - 0xE3D8: 0x8052, - 0xE3D9: 0x8058, - 0xE3DA: 0x805A, - 0xE3DB: 0x805F, - 0xE3DC: 0x8062, - 0xE3DD: 0x8068, - 0xE3DE: 0x8073, - 0xE3DF: 0x8072, - 0xE3E0: 0x8070, - 0xE3E1: 0x8076, - 0xE3E2: 0x8079, - 0xE3E3: 0x807D, - 0xE3E4: 0x807F, - 0xE3E5: 0x8084, - 0xE3E6: 0x8086, - 0xE3E7: 0x8085, - 0xE3E8: 0x809B, - 0xE3E9: 0x8093, - 0xE3EA: 0x809A, - 0xE3EB: 0x80AD, - 0xE3EC: 0x5190, - 0xE3ED: 0x80AC, - 0xE3EE: 0x80DB, - 0xE3EF: 0x80E5, - 0xE3F0: 0x80D9, - 0xE3F1: 0x80DD, - 0xE3F2: 0x80C4, - 0xE3F3: 0x80DA, - 0xE3F4: 0x80D6, - 0xE3F5: 0x8109, - 0xE3F6: 0x80EF, - 0xE3F7: 0x80F1, - 0xE3F8: 0x811B, - 0xE3F9: 0x8129, - 0xE3FA: 0x8123, - 0xE3FB: 0x812F, - 0xE3FC: 0x814B, - 0xE440: 0x968B, - 0xE441: 0x8146, - 0xE442: 0x813E, - 0xE443: 0x8153, - 0xE444: 0x8151, - 0xE445: 0x80FC, - 0xE446: 0x8171, - 0xE447: 0x816E, - 0xE448: 0x8165, - 0xE449: 0x8166, - 0xE44A: 0x8174, - 0xE44B: 0x8183, - 0xE44C: 0x8188, - 0xE44D: 0x818A, - 0xE44E: 0x8180, - 0xE44F: 0x8182, - 0xE450: 0x81A0, - 0xE451: 0x8195, - 0xE452: 0x81A4, - 0xE453: 0x81A3, - 0xE454: 0x815F, - 0xE455: 0x8193, - 0xE456: 0x81A9, - 0xE457: 0x81B0, - 0xE458: 0x81B5, - 0xE459: 0x81BE, - 0xE45A: 0x81B8, - 0xE45B: 0x81BD, - 0xE45C: 0x81C0, - 0xE45D: 0x81C2, - 0xE45E: 0x81BA, - 0xE45F: 0x81C9, - 0xE460: 0x81CD, - 0xE461: 0x81D1, - 0xE462: 0x81D9, - 0xE463: 0x81D8, - 0xE464: 0x81C8, - 0xE465: 0x81DA, - 0xE466: 0x81DF, - 0xE467: 0x81E0, - 0xE468: 0x81E7, - 0xE469: 0x81FA, - 0xE46A: 0x81FB, - 0xE46B: 0x81FE, - 0xE46C: 0x8201, - 0xE46D: 0x8202, - 0xE46E: 0x8205, - 0xE46F: 0x8207, - 0xE470: 0x820A, - 0xE471: 0x820D, - 0xE472: 0x8210, - 0xE473: 0x8216, - 0xE474: 0x8229, - 0xE475: 0x822B, - 0xE476: 0x8238, - 0xE477: 0x8233, - 0xE478: 0x8240, - 0xE479: 0x8259, - 0xE47A: 0x8258, - 0xE47B: 0x825D, - 0xE47C: 0x825A, - 0xE47D: 0x825F, - 0xE47E: 0x8264, - 0xE480: 0x8262, - 0xE481: 0x8268, - 0xE482: 0x826A, - 0xE483: 0x826B, - 0xE484: 0x822E, - 0xE485: 0x8271, - 0xE486: 0x8277, - 0xE487: 0x8278, - 0xE488: 0x827E, - 0xE489: 0x828D, - 0xE48A: 0x8292, - 0xE48B: 0x82AB, - 0xE48C: 0x829F, - 0xE48D: 0x82BB, - 0xE48E: 0x82AC, - 0xE48F: 0x82E1, - 0xE490: 0x82E3, - 0xE491: 0x82DF, - 0xE492: 0x82D2, - 0xE493: 0x82F4, - 0xE494: 0x82F3, - 0xE495: 0x82FA, - 0xE496: 0x8393, - 0xE497: 0x8303, - 0xE498: 0x82FB, - 0xE499: 0x82F9, - 0xE49A: 0x82DE, - 0xE49B: 0x8306, - 0xE49C: 0x82DC, - 0xE49D: 0x8309, - 0xE49E: 0x82D9, - 0xE49F: 0x8335, - 0xE4A0: 0x8334, - 0xE4A1: 0x8316, - 0xE4A2: 0x8332, - 0xE4A3: 0x8331, - 0xE4A4: 0x8340, - 0xE4A5: 0x8339, - 0xE4A6: 0x8350, - 0xE4A7: 0x8345, - 0xE4A8: 0x832F, - 0xE4A9: 0x832B, - 0xE4AA: 0x8317, - 0xE4AB: 0x8318, - 0xE4AC: 0x8385, - 0xE4AD: 0x839A, - 0xE4AE: 0x83AA, - 0xE4AF: 0x839F, - 0xE4B0: 0x83A2, - 0xE4B1: 0x8396, - 0xE4B2: 0x8323, - 0xE4B3: 0x838E, - 0xE4B4: 0x8387, - 0xE4B5: 0x838A, - 0xE4B6: 0x837C, - 0xE4B7: 0x83B5, - 0xE4B8: 0x8373, - 0xE4B9: 0x8375, - 0xE4BA: 0x83A0, - 0xE4BB: 0x8389, - 0xE4BC: 0x83A8, - 0xE4BD: 0x83F4, - 0xE4BE: 0x8413, - 0xE4BF: 0x83EB, - 0xE4C0: 0x83CE, - 0xE4C1: 0x83FD, - 0xE4C2: 0x8403, - 0xE4C3: 0x83D8, - 0xE4C4: 0x840B, - 0xE4C5: 0x83C1, - 0xE4C6: 0x83F7, - 0xE4C7: 0x8407, - 0xE4C8: 0x83E0, - 0xE4C9: 0x83F2, - 0xE4CA: 0x840D, - 0xE4CB: 0x8422, - 0xE4CC: 0x8420, - 0xE4CD: 0x83BD, - 0xE4CE: 0x8438, - 0xE4CF: 0x8506, - 0xE4D0: 0x83FB, - 0xE4D1: 0x846D, - 0xE4D2: 0x842A, - 0xE4D3: 0x843C, - 0xE4D4: 0x855A, - 0xE4D5: 0x8484, - 0xE4D6: 0x8477, - 0xE4D7: 0x846B, - 0xE4D8: 0x84AD, - 0xE4D9: 0x846E, - 0xE4DA: 0x8482, - 0xE4DB: 0x8469, - 0xE4DC: 0x8446, - 0xE4DD: 0x842C, - 0xE4DE: 0x846F, - 0xE4DF: 0x8479, - 0xE4E0: 0x8435, - 0xE4E1: 0x84CA, - 0xE4E2: 0x8462, - 0xE4E3: 0x84B9, - 0xE4E4: 0x84BF, - 0xE4E5: 0x849F, - 0xE4E6: 0x84D9, - 0xE4E7: 0x84CD, - 0xE4E8: 0x84BB, - 0xE4E9: 0x84DA, - 0xE4EA: 0x84D0, - 0xE4EB: 0x84C1, - 0xE4EC: 0x84C6, - 0xE4ED: 0x84D6, - 0xE4EE: 0x84A1, - 0xE4EF: 0x8521, - 0xE4F0: 0x84FF, - 0xE4F1: 0x84F4, - 0xE4F2: 0x8517, - 0xE4F3: 0x8518, - 0xE4F4: 0x852C, - 0xE4F5: 0x851F, - 0xE4F6: 0x8515, - 0xE4F7: 0x8514, - 0xE4F8: 0x84FC, - 0xE4F9: 0x8540, - 0xE4FA: 0x8563, - 0xE4FB: 0x8558, - 0xE4FC: 0x8548, - 0xE540: 0x8541, - 0xE541: 0x8602, - 0xE542: 0x854B, - 0xE543: 0x8555, - 0xE544: 0x8580, - 0xE545: 0x85A4, - 0xE546: 0x8588, - 0xE547: 0x8591, - 0xE548: 0x858A, - 0xE549: 0x85A8, - 0xE54A: 0x856D, - 0xE54B: 0x8594, - 0xE54C: 0x859B, - 0xE54D: 0x85EA, - 0xE54E: 0x8587, - 0xE54F: 0x859C, - 0xE550: 0x8577, - 0xE551: 0x857E, - 0xE552: 0x8590, - 0xE553: 0x85C9, - 0xE554: 0x85BA, - 0xE555: 0x85CF, - 0xE556: 0x85B9, - 0xE557: 0x85D0, - 0xE558: 0x85D5, - 0xE559: 0x85DD, - 0xE55A: 0x85E5, - 0xE55B: 0x85DC, - 0xE55C: 0x85F9, - 0xE55D: 0x860A, - 0xE55E: 0x8613, - 0xE55F: 0x860B, - 0xE560: 0x85FE, - 0xE561: 0x85FA, - 0xE562: 0x8606, - 0xE563: 0x8622, - 0xE564: 0x861A, - 0xE565: 0x8630, - 0xE566: 0x863F, - 0xE567: 0x864D, - 0xE568: 0x4E55, - 0xE569: 0x8654, - 0xE56A: 0x865F, - 0xE56B: 0x8667, - 0xE56C: 0x8671, - 0xE56D: 0x8693, - 0xE56E: 0x86A3, - 0xE56F: 0x86A9, - 0xE570: 0x86AA, - 0xE571: 0x868B, - 0xE572: 0x868C, - 0xE573: 0x86B6, - 0xE574: 0x86AF, - 0xE575: 0x86C4, - 0xE576: 0x86C6, - 0xE577: 0x86B0, - 0xE578: 0x86C9, - 0xE579: 0x8823, - 0xE57A: 0x86AB, - 0xE57B: 0x86D4, - 0xE57C: 0x86DE, - 0xE57D: 0x86E9, - 0xE57E: 0x86EC, - 0xE580: 0x86DF, - 0xE581: 0x86DB, - 0xE582: 0x86EF, - 0xE583: 0x8712, - 0xE584: 0x8706, - 0xE585: 0x8708, - 0xE586: 0x8700, - 0xE587: 0x8703, - 0xE588: 0x86FB, - 0xE589: 0x8711, - 0xE58A: 0x8709, - 0xE58B: 0x870D, - 0xE58C: 0x86F9, - 0xE58D: 0x870A, - 0xE58E: 0x8734, - 0xE58F: 0x873F, - 0xE590: 0x8737, - 0xE591: 0x873B, - 0xE592: 0x8725, - 0xE593: 0x8729, - 0xE594: 0x871A, - 0xE595: 0x8760, - 0xE596: 0x875F, - 0xE597: 0x8778, - 0xE598: 0x874C, - 0xE599: 0x874E, - 0xE59A: 0x8774, - 0xE59B: 0x8757, - 0xE59C: 0x8768, - 0xE59D: 0x876E, - 0xE59E: 0x8759, - 0xE59F: 0x8753, - 0xE5A0: 0x8763, - 0xE5A1: 0x876A, - 0xE5A2: 0x8805, - 0xE5A3: 0x87A2, - 0xE5A4: 0x879F, - 0xE5A5: 0x8782, - 0xE5A6: 0x87AF, - 0xE5A7: 0x87CB, - 0xE5A8: 0x87BD, - 0xE5A9: 0x87C0, - 0xE5AA: 0x87D0, - 0xE5AB: 0x96D6, - 0xE5AC: 0x87AB, - 0xE5AD: 0x87C4, - 0xE5AE: 0x87B3, - 0xE5AF: 0x87C7, - 0xE5B0: 0x87C6, - 0xE5B1: 0x87BB, - 0xE5B2: 0x87EF, - 0xE5B3: 0x87F2, - 0xE5B4: 0x87E0, - 0xE5B5: 0x880F, - 0xE5B6: 0x880D, - 0xE5B7: 0x87FE, - 0xE5B8: 0x87F6, - 0xE5B9: 0x87F7, - 0xE5BA: 0x880E, - 0xE5BB: 0x87D2, - 0xE5BC: 0x8811, - 0xE5BD: 0x8816, - 0xE5BE: 0x8815, - 0xE5BF: 0x8822, - 0xE5C0: 0x8821, - 0xE5C1: 0x8831, - 0xE5C2: 0x8836, - 0xE5C3: 0x8839, - 0xE5C4: 0x8827, - 0xE5C5: 0x883B, - 0xE5C6: 0x8844, - 0xE5C7: 0x8842, - 0xE5C8: 0x8852, - 0xE5C9: 0x8859, - 0xE5CA: 0x885E, - 0xE5CB: 0x8862, - 0xE5CC: 0x886B, - 0xE5CD: 0x8881, - 0xE5CE: 0x887E, - 0xE5CF: 0x889E, - 0xE5D0: 0x8875, - 0xE5D1: 0x887D, - 0xE5D2: 0x88B5, - 0xE5D3: 0x8872, - 0xE5D4: 0x8882, - 0xE5D5: 0x8897, - 0xE5D6: 0x8892, - 0xE5D7: 0x88AE, - 0xE5D8: 0x8899, - 0xE5D9: 0x88A2, - 0xE5DA: 0x888D, - 0xE5DB: 0x88A4, - 0xE5DC: 0x88B0, - 0xE5DD: 0x88BF, - 0xE5DE: 0x88B1, - 0xE5DF: 0x88C3, - 0xE5E0: 0x88C4, - 0xE5E1: 0x88D4, - 0xE5E2: 0x88D8, - 0xE5E3: 0x88D9, - 0xE5E4: 0x88DD, - 0xE5E5: 0x88F9, - 0xE5E6: 0x8902, - 0xE5E7: 0x88FC, - 0xE5E8: 0x88F4, - 0xE5E9: 0x88E8, - 0xE5EA: 0x88F2, - 0xE5EB: 0x8904, - 0xE5EC: 0x890C, - 0xE5ED: 0x890A, - 0xE5EE: 0x8913, - 0xE5EF: 0x8943, - 0xE5F0: 0x891E, - 0xE5F1: 0x8925, - 0xE5F2: 0x892A, - 0xE5F3: 0x892B, - 0xE5F4: 0x8941, - 0xE5F5: 0x8944, - 0xE5F6: 0x893B, - 0xE5F7: 0x8936, - 0xE5F8: 0x8938, - 0xE5F9: 0x894C, - 0xE5FA: 0x891D, - 0xE5FB: 0x8960, - 0xE5FC: 0x895E, - 0xE640: 0x8966, - 0xE641: 0x8964, - 0xE642: 0x896D, - 0xE643: 0x896A, - 0xE644: 0x896F, - 0xE645: 0x8974, - 0xE646: 0x8977, - 0xE647: 0x897E, - 0xE648: 0x8983, - 0xE649: 0x8988, - 0xE64A: 0x898A, - 0xE64B: 0x8993, - 0xE64C: 0x8998, - 0xE64D: 0x89A1, - 0xE64E: 0x89A9, - 0xE64F: 0x89A6, - 0xE650: 0x89AC, - 0xE651: 0x89AF, - 0xE652: 0x89B2, - 0xE653: 0x89BA, - 0xE654: 0x89BD, - 0xE655: 0x89BF, - 0xE656: 0x89C0, - 0xE657: 0x89DA, - 0xE658: 0x89DC, - 0xE659: 0x89DD, - 0xE65A: 0x89E7, - 0xE65B: 0x89F4, - 0xE65C: 0x89F8, - 0xE65D: 0x8A03, - 0xE65E: 0x8A16, - 0xE65F: 0x8A10, - 0xE660: 0x8A0C, - 0xE661: 0x8A1B, - 0xE662: 0x8A1D, - 0xE663: 0x8A25, - 0xE664: 0x8A36, - 0xE665: 0x8A41, - 0xE666: 0x8A5B, - 0xE667: 0x8A52, - 0xE668: 0x8A46, - 0xE669: 0x8A48, - 0xE66A: 0x8A7C, - 0xE66B: 0x8A6D, - 0xE66C: 0x8A6C, - 0xE66D: 0x8A62, - 0xE66E: 0x8A85, - 0xE66F: 0x8A82, - 0xE670: 0x8A84, - 0xE671: 0x8AA8, - 0xE672: 0x8AA1, - 0xE673: 0x8A91, - 0xE674: 0x8AA5, - 0xE675: 0x8AA6, - 0xE676: 0x8A9A, - 0xE677: 0x8AA3, - 0xE678: 0x8AC4, - 0xE679: 0x8ACD, - 0xE67A: 0x8AC2, - 0xE67B: 0x8ADA, - 0xE67C: 0x8AEB, - 0xE67D: 0x8AF3, - 0xE67E: 0x8AE7, - 0xE680: 0x8AE4, - 0xE681: 0x8AF1, - 0xE682: 0x8B14, - 0xE683: 0x8AE0, - 0xE684: 0x8AE2, - 0xE685: 0x8AF7, - 0xE686: 0x8ADE, - 0xE687: 0x8ADB, - 0xE688: 0x8B0C, - 0xE689: 0x8B07, - 0xE68A: 0x8B1A, - 0xE68B: 0x8AE1, - 0xE68C: 0x8B16, - 0xE68D: 0x8B10, - 0xE68E: 0x8B17, - 0xE68F: 0x8B20, - 0xE690: 0x8B33, - 0xE691: 0x97AB, - 0xE692: 0x8B26, - 0xE693: 0x8B2B, - 0xE694: 0x8B3E, - 0xE695: 0x8B28, - 0xE696: 0x8B41, - 0xE697: 0x8B4C, - 0xE698: 0x8B4F, - 0xE699: 0x8B4E, - 0xE69A: 0x8B49, - 0xE69B: 0x8B56, - 0xE69C: 0x8B5B, - 0xE69D: 0x8B5A, - 0xE69E: 0x8B6B, - 0xE69F: 0x8B5F, - 0xE6A0: 0x8B6C, - 0xE6A1: 0x8B6F, - 0xE6A2: 0x8B74, - 0xE6A3: 0x8B7D, - 0xE6A4: 0x8B80, - 0xE6A5: 0x8B8C, - 0xE6A6: 0x8B8E, - 0xE6A7: 0x8B92, - 0xE6A8: 0x8B93, - 0xE6A9: 0x8B96, - 0xE6AA: 0x8B99, - 0xE6AB: 0x8B9A, - 0xE6AC: 0x8C3A, - 0xE6AD: 0x8C41, - 0xE6AE: 0x8C3F, - 0xE6AF: 0x8C48, - 0xE6B0: 0x8C4C, - 0xE6B1: 0x8C4E, - 0xE6B2: 0x8C50, - 0xE6B3: 0x8C55, - 0xE6B4: 0x8C62, - 0xE6B5: 0x8C6C, - 0xE6B6: 0x8C78, - 0xE6B7: 0x8C7A, - 0xE6B8: 0x8C82, - 0xE6B9: 0x8C89, - 0xE6BA: 0x8C85, - 0xE6BB: 0x8C8A, - 0xE6BC: 0x8C8D, - 0xE6BD: 0x8C8E, - 0xE6BE: 0x8C94, - 0xE6BF: 0x8C7C, - 0xE6C0: 0x8C98, - 0xE6C1: 0x621D, - 0xE6C2: 0x8CAD, - 0xE6C3: 0x8CAA, - 0xE6C4: 0x8CBD, - 0xE6C5: 0x8CB2, - 0xE6C6: 0x8CB3, - 0xE6C7: 0x8CAE, - 0xE6C8: 0x8CB6, - 0xE6C9: 0x8CC8, - 0xE6CA: 0x8CC1, - 0xE6CB: 0x8CE4, - 0xE6CC: 0x8CE3, - 0xE6CD: 0x8CDA, - 0xE6CE: 0x8CFD, - 0xE6CF: 0x8CFA, - 0xE6D0: 0x8CFB, - 0xE6D1: 0x8D04, - 0xE6D2: 0x8D05, - 0xE6D3: 0x8D0A, - 0xE6D4: 0x8D07, - 0xE6D5: 0x8D0F, - 0xE6D6: 0x8D0D, - 0xE6D7: 0x8D10, - 0xE6D8: 0x9F4E, - 0xE6D9: 0x8D13, - 0xE6DA: 0x8CCD, - 0xE6DB: 0x8D14, - 0xE6DC: 0x8D16, - 0xE6DD: 0x8D67, - 0xE6DE: 0x8D6D, - 0xE6DF: 0x8D71, - 0xE6E0: 0x8D73, - 0xE6E1: 0x8D81, - 0xE6E2: 0x8D99, - 0xE6E3: 0x8DC2, - 0xE6E4: 0x8DBE, - 0xE6E5: 0x8DBA, - 0xE6E6: 0x8DCF, - 0xE6E7: 0x8DDA, - 0xE6E8: 0x8DD6, - 0xE6E9: 0x8DCC, - 0xE6EA: 0x8DDB, - 0xE6EB: 0x8DCB, - 0xE6EC: 0x8DEA, - 0xE6ED: 0x8DEB, - 0xE6EE: 0x8DDF, - 0xE6EF: 0x8DE3, - 0xE6F0: 0x8DFC, - 0xE6F1: 0x8E08, - 0xE6F2: 0x8E09, - 0xE6F3: 0x8DFF, - 0xE6F4: 0x8E1D, - 0xE6F5: 0x8E1E, - 0xE6F6: 0x8E10, - 0xE6F7: 0x8E1F, - 0xE6F8: 0x8E42, - 0xE6F9: 0x8E35, - 0xE6FA: 0x8E30, - 0xE6FB: 0x8E34, - 0xE6FC: 0x8E4A, - 0xE740: 0x8E47, - 0xE741: 0x8E49, - 0xE742: 0x8E4C, - 0xE743: 0x8E50, - 0xE744: 0x8E48, - 0xE745: 0x8E59, - 0xE746: 0x8E64, - 0xE747: 0x8E60, - 0xE748: 0x8E2A, - 0xE749: 0x8E63, - 0xE74A: 0x8E55, - 0xE74B: 0x8E76, - 0xE74C: 0x8E72, - 0xE74D: 0x8E7C, - 0xE74E: 0x8E81, - 0xE74F: 0x8E87, - 0xE750: 0x8E85, - 0xE751: 0x8E84, - 0xE752: 0x8E8B, - 0xE753: 0x8E8A, - 0xE754: 0x8E93, - 0xE755: 0x8E91, - 0xE756: 0x8E94, - 0xE757: 0x8E99, - 0xE758: 0x8EAA, - 0xE759: 0x8EA1, - 0xE75A: 0x8EAC, - 0xE75B: 0x8EB0, - 0xE75C: 0x8EC6, - 0xE75D: 0x8EB1, - 0xE75E: 0x8EBE, - 0xE75F: 0x8EC5, - 0xE760: 0x8EC8, - 0xE761: 0x8ECB, - 0xE762: 0x8EDB, - 0xE763: 0x8EE3, - 0xE764: 0x8EFC, - 0xE765: 0x8EFB, - 0xE766: 0x8EEB, - 0xE767: 0x8EFE, - 0xE768: 0x8F0A, - 0xE769: 0x8F05, - 0xE76A: 0x8F15, - 0xE76B: 0x8F12, - 0xE76C: 0x8F19, - 0xE76D: 0x8F13, - 0xE76E: 0x8F1C, - 0xE76F: 0x8F1F, - 0xE770: 0x8F1B, - 0xE771: 0x8F0C, - 0xE772: 0x8F26, - 0xE773: 0x8F33, - 0xE774: 0x8F3B, - 0xE775: 0x8F39, - 0xE776: 0x8F45, - 0xE777: 0x8F42, - 0xE778: 0x8F3E, - 0xE779: 0x8F4C, - 0xE77A: 0x8F49, - 0xE77B: 0x8F46, - 0xE77C: 0x8F4E, - 0xE77D: 0x8F57, - 0xE77E: 0x8F5C, - 0xE780: 0x8F62, - 0xE781: 0x8F63, - 0xE782: 0x8F64, - 0xE783: 0x8F9C, - 0xE784: 0x8F9F, - 0xE785: 0x8FA3, - 0xE786: 0x8FAD, - 0xE787: 0x8FAF, - 0xE788: 0x8FB7, - 0xE789: 0x8FDA, - 0xE78A: 0x8FE5, - 0xE78B: 0x8FE2, - 0xE78C: 0x8FEA, - 0xE78D: 0x8FEF, - 0xE78E: 0x9087, - 0xE78F: 0x8FF4, - 0xE790: 0x9005, - 0xE791: 0x8FF9, - 0xE792: 0x8FFA, - 0xE793: 0x9011, - 0xE794: 0x9015, - 0xE795: 0x9021, - 0xE796: 0x900D, - 0xE797: 0x901E, - 0xE798: 0x9016, - 0xE799: 0x900B, - 0xE79A: 0x9027, - 0xE79B: 0x9036, - 0xE79C: 0x9035, - 0xE79D: 0x9039, - 0xE79E: 0x8FF8, - 0xE79F: 0x904F, - 0xE7A0: 0x9050, - 0xE7A1: 0x9051, - 0xE7A2: 0x9052, - 0xE7A3: 0x900E, - 0xE7A4: 0x9049, - 0xE7A5: 0x903E, - 0xE7A6: 0x9056, - 0xE7A7: 0x9058, - 0xE7A8: 0x905E, - 0xE7A9: 0x9068, - 0xE7AA: 0x906F, - 0xE7AB: 0x9076, - 0xE7AC: 0x96A8, - 0xE7AD: 0x9072, - 0xE7AE: 0x9082, - 0xE7AF: 0x907D, - 0xE7B0: 0x9081, - 0xE7B1: 0x9080, - 0xE7B2: 0x908A, - 0xE7B3: 0x9089, - 0xE7B4: 0x908F, - 0xE7B5: 0x90A8, - 0xE7B6: 0x90AF, - 0xE7B7: 0x90B1, - 0xE7B8: 0x90B5, - 0xE7B9: 0x90E2, - 0xE7BA: 0x90E4, - 0xE7BB: 0x6248, - 0xE7BC: 0x90DB, - 0xE7BD: 0x9102, - 0xE7BE: 0x9112, - 0xE7BF: 0x9119, - 0xE7C0: 0x9132, - 0xE7C1: 0x9130, - 0xE7C2: 0x914A, - 0xE7C3: 0x9156, - 0xE7C4: 0x9158, - 0xE7C5: 0x9163, - 0xE7C6: 0x9165, - 0xE7C7: 0x9169, - 0xE7C8: 0x9173, - 0xE7C9: 0x9172, - 0xE7CA: 0x918B, - 0xE7CB: 0x9189, - 0xE7CC: 0x9182, - 0xE7CD: 0x91A2, - 0xE7CE: 0x91AB, - 0xE7CF: 0x91AF, - 0xE7D0: 0x91AA, - 0xE7D1: 0x91B5, - 0xE7D2: 0x91B4, - 0xE7D3: 0x91BA, - 0xE7D4: 0x91C0, - 0xE7D5: 0x91C1, - 0xE7D6: 0x91C9, - 0xE7D7: 0x91CB, - 0xE7D8: 0x91D0, - 0xE7D9: 0x91D6, - 0xE7DA: 0x91DF, - 0xE7DB: 0x91E1, - 0xE7DC: 0x91DB, - 0xE7DD: 0x91FC, - 0xE7DE: 0x91F5, - 0xE7DF: 0x91F6, - 0xE7E0: 0x921E, - 0xE7E1: 0x91FF, - 0xE7E2: 0x9214, - 0xE7E3: 0x922C, - 0xE7E4: 0x9215, - 0xE7E5: 0x9211, - 0xE7E6: 0x925E, - 0xE7E7: 0x9257, - 0xE7E8: 0x9245, - 0xE7E9: 0x9249, - 0xE7EA: 0x9264, - 0xE7EB: 0x9248, - 0xE7EC: 0x9295, - 0xE7ED: 0x923F, - 0xE7EE: 0x924B, - 0xE7EF: 0x9250, - 0xE7F0: 0x929C, - 0xE7F1: 0x9296, - 0xE7F2: 0x9293, - 0xE7F3: 0x929B, - 0xE7F4: 0x925A, - 0xE7F5: 0x92CF, - 0xE7F6: 0x92B9, - 0xE7F7: 0x92B7, - 0xE7F8: 0x92E9, - 0xE7F9: 0x930F, - 0xE7FA: 0x92FA, - 0xE7FB: 0x9344, - 0xE7FC: 0x932E, - 0xE840: 0x9319, - 0xE841: 0x9322, - 0xE842: 0x931A, - 0xE843: 0x9323, - 0xE844: 0x933A, - 0xE845: 0x9335, - 0xE846: 0x933B, - 0xE847: 0x935C, - 0xE848: 0x9360, - 0xE849: 0x937C, - 0xE84A: 0x936E, - 0xE84B: 0x9356, - 0xE84C: 0x93B0, - 0xE84D: 0x93AC, - 0xE84E: 0x93AD, - 0xE84F: 0x9394, - 0xE850: 0x93B9, - 0xE851: 0x93D6, - 0xE852: 0x93D7, - 0xE853: 0x93E8, - 0xE854: 0x93E5, - 0xE855: 0x93D8, - 0xE856: 0x93C3, - 0xE857: 0x93DD, - 0xE858: 0x93D0, - 0xE859: 0x93C8, - 0xE85A: 0x93E4, - 0xE85B: 0x941A, - 0xE85C: 0x9414, - 0xE85D: 0x9413, - 0xE85E: 0x9403, - 0xE85F: 0x9407, - 0xE860: 0x9410, - 0xE861: 0x9436, - 0xE862: 0x942B, - 0xE863: 0x9435, - 0xE864: 0x9421, - 0xE865: 0x943A, - 0xE866: 0x9441, - 0xE867: 0x9452, - 0xE868: 0x9444, - 0xE869: 0x945B, - 0xE86A: 0x9460, - 0xE86B: 0x9462, - 0xE86C: 0x945E, - 0xE86D: 0x946A, - 0xE86E: 0x9229, - 0xE86F: 0x9470, - 0xE870: 0x9475, - 0xE871: 0x9477, - 0xE872: 0x947D, - 0xE873: 0x945A, - 0xE874: 0x947C, - 0xE875: 0x947E, - 0xE876: 0x9481, - 0xE877: 0x947F, - 0xE878: 0x9582, - 0xE879: 0x9587, - 0xE87A: 0x958A, - 0xE87B: 0x9594, - 0xE87C: 0x9596, - 0xE87D: 0x9598, - 0xE87E: 0x9599, - 0xE880: 0x95A0, - 0xE881: 0x95A8, - 0xE882: 0x95A7, - 0xE883: 0x95AD, - 0xE884: 0x95BC, - 0xE885: 0x95BB, - 0xE886: 0x95B9, - 0xE887: 0x95BE, - 0xE888: 0x95CA, - 0xE889: 0x6FF6, - 0xE88A: 0x95C3, - 0xE88B: 0x95CD, - 0xE88C: 0x95CC, - 0xE88D: 0x95D5, - 0xE88E: 0x95D4, - 0xE88F: 0x95D6, - 0xE890: 0x95DC, - 0xE891: 0x95E1, - 0xE892: 0x95E5, - 0xE893: 0x95E2, - 0xE894: 0x9621, - 0xE895: 0x9628, - 0xE896: 0x962E, - 0xE897: 0x962F, - 0xE898: 0x9642, - 0xE899: 0x964C, - 0xE89A: 0x964F, - 0xE89B: 0x964B, - 0xE89C: 0x9677, - 0xE89D: 0x965C, - 0xE89E: 0x965E, - 0xE89F: 0x965D, - 0xE8A0: 0x965F, - 0xE8A1: 0x9666, - 0xE8A2: 0x9672, - 0xE8A3: 0x966C, - 0xE8A4: 0x968D, - 0xE8A5: 0x9698, - 0xE8A6: 0x9695, - 0xE8A7: 0x9697, - 0xE8A8: 0x96AA, - 0xE8A9: 0x96A7, - 0xE8AA: 0x96B1, - 0xE8AB: 0x96B2, - 0xE8AC: 0x96B0, - 0xE8AD: 0x96B4, - 0xE8AE: 0x96B6, - 0xE8AF: 0x96B8, - 0xE8B0: 0x96B9, - 0xE8B1: 0x96CE, - 0xE8B2: 0x96CB, - 0xE8B3: 0x96C9, - 0xE8B4: 0x96CD, - 0xE8B5: 0x894D, - 0xE8B6: 0x96DC, - 0xE8B7: 0x970D, - 0xE8B8: 0x96D5, - 0xE8B9: 0x96F9, - 0xE8BA: 0x9704, - 0xE8BB: 0x9706, - 0xE8BC: 0x9708, - 0xE8BD: 0x9713, - 0xE8BE: 0x970E, - 0xE8BF: 0x9711, - 0xE8C0: 0x970F, - 0xE8C1: 0x9716, - 0xE8C2: 0x9719, - 0xE8C3: 0x9724, - 0xE8C4: 0x972A, - 0xE8C5: 0x9730, - 0xE8C6: 0x9739, - 0xE8C7: 0x973D, - 0xE8C8: 0x973E, - 0xE8C9: 0x9744, - 0xE8CA: 0x9746, - 0xE8CB: 0x9748, - 0xE8CC: 0x9742, - 0xE8CD: 0x9749, - 0xE8CE: 0x975C, - 0xE8CF: 0x9760, - 0xE8D0: 0x9764, - 0xE8D1: 0x9766, - 0xE8D2: 0x9768, - 0xE8D3: 0x52D2, - 0xE8D4: 0x976B, - 0xE8D5: 0x9771, - 0xE8D6: 0x9779, - 0xE8D7: 0x9785, - 0xE8D8: 0x977C, - 0xE8D9: 0x9781, - 0xE8DA: 0x977A, - 0xE8DB: 0x9786, - 0xE8DC: 0x978B, - 0xE8DD: 0x978F, - 0xE8DE: 0x9790, - 0xE8DF: 0x979C, - 0xE8E0: 0x97A8, - 0xE8E1: 0x97A6, - 0xE8E2: 0x97A3, - 0xE8E3: 0x97B3, - 0xE8E4: 0x97B4, - 0xE8E5: 0x97C3, - 0xE8E6: 0x97C6, - 0xE8E7: 0x97C8, - 0xE8E8: 0x97CB, - 0xE8E9: 0x97DC, - 0xE8EA: 0x97ED, - 0xE8EB: 0x9F4F, - 0xE8EC: 0x97F2, - 0xE8ED: 0x7ADF, - 0xE8EE: 0x97F6, - 0xE8EF: 0x97F5, - 0xE8F0: 0x980F, - 0xE8F1: 0x980C, - 0xE8F2: 0x9838, - 0xE8F3: 0x9824, - 0xE8F4: 0x9821, - 0xE8F5: 0x9837, - 0xE8F6: 0x983D, - 0xE8F7: 0x9846, - 0xE8F8: 0x984F, - 0xE8F9: 0x984B, - 0xE8FA: 0x986B, - 0xE8FB: 0x986F, - 0xE8FC: 0x9870, - 0xE940: 0x9871, - 0xE941: 0x9874, - 0xE942: 0x9873, - 0xE943: 0x98AA, - 0xE944: 0x98AF, - 0xE945: 0x98B1, - 0xE946: 0x98B6, - 0xE947: 0x98C4, - 0xE948: 0x98C3, - 0xE949: 0x98C6, - 0xE94A: 0x98E9, - 0xE94B: 0x98EB, - 0xE94C: 0x9903, - 0xE94D: 0x9909, - 0xE94E: 0x9912, - 0xE94F: 0x9914, - 0xE950: 0x9918, - 0xE951: 0x9921, - 0xE952: 0x991D, - 0xE953: 0x991E, - 0xE954: 0x9924, - 0xE955: 0x9920, - 0xE956: 0x992C, - 0xE957: 0x992E, - 0xE958: 0x993D, - 0xE959: 0x993E, - 0xE95A: 0x9942, - 0xE95B: 0x9949, - 0xE95C: 0x9945, - 0xE95D: 0x9950, - 0xE95E: 0x994B, - 0xE95F: 0x9951, - 0xE960: 0x9952, - 0xE961: 0x994C, - 0xE962: 0x9955, - 0xE963: 0x9997, - 0xE964: 0x9998, - 0xE965: 0x99A5, - 0xE966: 0x99AD, - 0xE967: 0x99AE, - 0xE968: 0x99BC, - 0xE969: 0x99DF, - 0xE96A: 0x99DB, - 0xE96B: 0x99DD, - 0xE96C: 0x99D8, - 0xE96D: 0x99D1, - 0xE96E: 0x99ED, - 0xE96F: 0x99EE, - 0xE970: 0x99F1, - 0xE971: 0x99F2, - 0xE972: 0x99FB, - 0xE973: 0x99F8, - 0xE974: 0x9A01, - 0xE975: 0x9A0F, - 0xE976: 0x9A05, - 0xE977: 0x99E2, - 0xE978: 0x9A19, - 0xE979: 0x9A2B, - 0xE97A: 0x9A37, - 0xE97B: 0x9A45, - 0xE97C: 0x9A42, - 0xE97D: 0x9A40, - 0xE97E: 0x9A43, - 0xE980: 0x9A3E, - 0xE981: 0x9A55, - 0xE982: 0x9A4D, - 0xE983: 0x9A5B, - 0xE984: 0x9A57, - 0xE985: 0x9A5F, - 0xE986: 0x9A62, - 0xE987: 0x9A65, - 0xE988: 0x9A64, - 0xE989: 0x9A69, - 0xE98A: 0x9A6B, - 0xE98B: 0x9A6A, - 0xE98C: 0x9AAD, - 0xE98D: 0x9AB0, - 0xE98E: 0x9ABC, - 0xE98F: 0x9AC0, - 0xE990: 0x9ACF, - 0xE991: 0x9AD1, - 0xE992: 0x9AD3, - 0xE993: 0x9AD4, - 0xE994: 0x9ADE, - 0xE995: 0x9ADF, - 0xE996: 0x9AE2, - 0xE997: 0x9AE3, - 0xE998: 0x9AE6, - 0xE999: 0x9AEF, - 0xE99A: 0x9AEB, - 0xE99B: 0x9AEE, - 0xE99C: 0x9AF4, - 0xE99D: 0x9AF1, - 0xE99E: 0x9AF7, - 0xE99F: 0x9AFB, - 0xE9A0: 0x9B06, - 0xE9A1: 0x9B18, - 0xE9A2: 0x9B1A, - 0xE9A3: 0x9B1F, - 0xE9A4: 0x9B22, - 0xE9A5: 0x9B23, - 0xE9A6: 0x9B25, - 0xE9A7: 0x9B27, - 0xE9A8: 0x9B28, - 0xE9A9: 0x9B29, - 0xE9AA: 0x9B2A, - 0xE9AB: 0x9B2E, - 0xE9AC: 0x9B2F, - 0xE9AD: 0x9B32, - 0xE9AE: 0x9B44, - 0xE9AF: 0x9B43, - 0xE9B0: 0x9B4F, - 0xE9B1: 0x9B4D, - 0xE9B2: 0x9B4E, - 0xE9B3: 0x9B51, - 0xE9B4: 0x9B58, - 0xE9B5: 0x9B74, - 0xE9B6: 0x9B93, - 0xE9B7: 0x9B83, - 0xE9B8: 0x9B91, - 0xE9B9: 0x9B96, - 0xE9BA: 0x9B97, - 0xE9BB: 0x9B9F, - 0xE9BC: 0x9BA0, - 0xE9BD: 0x9BA8, - 0xE9BE: 0x9BB4, - 0xE9BF: 0x9BC0, - 0xE9C0: 0x9BCA, - 0xE9C1: 0x9BB9, - 0xE9C2: 0x9BC6, - 0xE9C3: 0x9BCF, - 0xE9C4: 0x9BD1, - 0xE9C5: 0x9BD2, - 0xE9C6: 0x9BE3, - 0xE9C7: 0x9BE2, - 0xE9C8: 0x9BE4, - 0xE9C9: 0x9BD4, - 0xE9CA: 0x9BE1, - 0xE9CB: 0x9C3A, - 0xE9CC: 0x9BF2, - 0xE9CD: 0x9BF1, - 0xE9CE: 0x9BF0, - 0xE9CF: 0x9C15, - 0xE9D0: 0x9C14, - 0xE9D1: 0x9C09, - 0xE9D2: 0x9C13, - 0xE9D3: 0x9C0C, - 0xE9D4: 0x9C06, - 0xE9D5: 0x9C08, - 0xE9D6: 0x9C12, - 0xE9D7: 0x9C0A, - 0xE9D8: 0x9C04, - 0xE9D9: 0x9C2E, - 0xE9DA: 0x9C1B, - 0xE9DB: 0x9C25, - 0xE9DC: 0x9C24, - 0xE9DD: 0x9C21, - 0xE9DE: 0x9C30, - 0xE9DF: 0x9C47, - 0xE9E0: 0x9C32, - 0xE9E1: 0x9C46, - 0xE9E2: 0x9C3E, - 0xE9E3: 0x9C5A, - 0xE9E4: 0x9C60, - 0xE9E5: 0x9C67, - 0xE9E6: 0x9C76, - 0xE9E7: 0x9C78, - 0xE9E8: 0x9CE7, - 0xE9E9: 0x9CEC, - 0xE9EA: 0x9CF0, - 0xE9EB: 0x9D09, - 0xE9EC: 0x9D08, - 0xE9ED: 0x9CEB, - 0xE9EE: 0x9D03, - 0xE9EF: 0x9D06, - 0xE9F0: 0x9D2A, - 0xE9F1: 0x9D26, - 0xE9F2: 0x9DAF, - 0xE9F3: 0x9D23, - 0xE9F4: 0x9D1F, - 0xE9F5: 0x9D44, - 0xE9F6: 0x9D15, - 0xE9F7: 0x9D12, - 0xE9F8: 0x9D41, - 0xE9F9: 0x9D3F, - 0xE9FA: 0x9D3E, - 0xE9FB: 0x9D46, - 0xE9FC: 0x9D48, - 0xEA40: 0x9D5D, - 0xEA41: 0x9D5E, - 0xEA42: 0x9D64, - 0xEA43: 0x9D51, - 0xEA44: 0x9D50, - 0xEA45: 0x9D59, - 0xEA46: 0x9D72, - 0xEA47: 0x9D89, - 0xEA48: 0x9D87, - 0xEA49: 0x9DAB, - 0xEA4A: 0x9D6F, - 0xEA4B: 0x9D7A, - 0xEA4C: 0x9D9A, - 0xEA4D: 0x9DA4, - 0xEA4E: 0x9DA9, - 0xEA4F: 0x9DB2, - 0xEA50: 0x9DC4, - 0xEA51: 0x9DC1, - 0xEA52: 0x9DBB, - 0xEA53: 0x9DB8, - 0xEA54: 0x9DBA, - 0xEA55: 0x9DC6, - 0xEA56: 0x9DCF, - 0xEA57: 0x9DC2, - 0xEA58: 0x9DD9, - 0xEA59: 0x9DD3, - 0xEA5A: 0x9DF8, - 0xEA5B: 0x9DE6, - 0xEA5C: 0x9DED, - 0xEA5D: 0x9DEF, - 0xEA5E: 0x9DFD, - 0xEA5F: 0x9E1A, - 0xEA60: 0x9E1B, - 0xEA61: 0x9E1E, - 0xEA62: 0x9E75, - 0xEA63: 0x9E79, - 0xEA64: 0x9E7D, - 0xEA65: 0x9E81, - 0xEA66: 0x9E88, - 0xEA67: 0x9E8B, - 0xEA68: 0x9E8C, - 0xEA69: 0x9E92, - 0xEA6A: 0x9E95, - 0xEA6B: 0x9E91, - 0xEA6C: 0x9E9D, - 0xEA6D: 0x9EA5, - 0xEA6E: 0x9EA9, - 0xEA6F: 0x9EB8, - 0xEA70: 0x9EAA, - 0xEA71: 0x9EAD, - 0xEA72: 0x9761, - 0xEA73: 0x9ECC, - 0xEA74: 0x9ECE, - 0xEA75: 0x9ECF, - 0xEA76: 0x9ED0, - 0xEA77: 0x9ED4, - 0xEA78: 0x9EDC, - 0xEA79: 0x9EDE, - 0xEA7A: 0x9EDD, - 0xEA7B: 0x9EE0, - 0xEA7C: 0x9EE5, - 0xEA7D: 0x9EE8, - 0xEA7E: 0x9EEF, - 0xEA80: 0x9EF4, - 0xEA81: 0x9EF6, - 0xEA82: 0x9EF7, - 0xEA83: 0x9EF9, - 0xEA84: 0x9EFB, - 0xEA85: 0x9EFC, - 0xEA86: 0x9EFD, - 0xEA87: 0x9F07, - 0xEA88: 0x9F08, - 0xEA89: 0x76B7, - 0xEA8A: 0x9F15, - 0xEA8B: 0x9F21, - 0xEA8C: 0x9F2C, - 0xEA8D: 0x9F3E, - 0xEA8E: 0x9F4A, - 0xEA8F: 0x9F52, - 0xEA90: 0x9F54, - 0xEA91: 0x9F63, - 0xEA92: 0x9F5F, - 0xEA93: 0x9F60, - 0xEA94: 0x9F61, - 0xEA95: 0x9F66, - 0xEA96: 0x9F67, - 0xEA97: 0x9F6C, - 0xEA98: 0x9F6A, - 0xEA99: 0x9F77, - 0xEA9A: 0x9F72, - 0xEA9B: 0x9F76, - 0xEA9C: 0x9F95, - 0xEA9D: 0x9F9C, - 0xEA9E: 0x9FA0, - 0xEA9F: 0x582F, - 0xEAA0: 0x69C7, - 0xEAA1: 0x9059, - 0xEAA2: 0x7464, - 0xEAA3: 0x51DC, - 0xEAA4: 0x7199, -}; - - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __nested_webpack_require_183126__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var GenericGF_1 = __nested_webpack_require_183126__(1); -var GenericGFPoly_1 = __nested_webpack_require_183126__(2); -function runEuclideanAlgorithm(field, a, b, R) { - // Assume a's degree is >= b's - if (a.degree() < b.degree()) { - _a = [b, a], a = _a[0], b = _a[1]; - } - var rLast = a; - var r = b; - var tLast = field.zero; - var t = field.one; - // Run Euclidean algorithm until r's degree is less than R/2 - while (r.degree() >= R / 2) { - var rLastLast = rLast; - var tLastLast = tLast; - rLast = r; - tLast = t; - // Divide rLastLast by rLast, with quotient in q and remainder in r - if (rLast.isZero()) { - // Euclidean algorithm already terminated? - return null; - } - r = rLastLast; - var q = field.zero; - var denominatorLeadingTerm = rLast.getCoefficient(rLast.degree()); - var dltInverse = field.inverse(denominatorLeadingTerm); - while (r.degree() >= rLast.degree() && !r.isZero()) { - var degreeDiff = r.degree() - rLast.degree(); - var scale = field.multiply(r.getCoefficient(r.degree()), dltInverse); - q = q.addOrSubtract(field.buildMonomial(degreeDiff, scale)); - r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale)); - } - t = q.multiplyPoly(tLast).addOrSubtract(tLastLast); - if (r.degree() >= rLast.degree()) { - return null; - } - } - var sigmaTildeAtZero = t.getCoefficient(0); - if (sigmaTildeAtZero === 0) { - return null; - } - var inverse = field.inverse(sigmaTildeAtZero); - return [t.multiply(inverse), r.multiply(inverse)]; - var _a; -} -function findErrorLocations(field, errorLocator) { - // This is a direct application of Chien's search - var numErrors = errorLocator.degree(); - if (numErrors === 1) { - return [errorLocator.getCoefficient(1)]; - } - var result = new Array(numErrors); - var errorCount = 0; - for (var i = 1; i < field.size && errorCount < numErrors; i++) { - if (errorLocator.evaluateAt(i) === 0) { - result[errorCount] = field.inverse(i); - errorCount++; - } - } - if (errorCount !== numErrors) { - return null; - } - return result; -} -function findErrorMagnitudes(field, errorEvaluator, errorLocations) { - // This is directly applying Forney's Formula - var s = errorLocations.length; - var result = new Array(s); - for (var i = 0; i < s; i++) { - var xiInverse = field.inverse(errorLocations[i]); - var denominator = 1; - for (var j = 0; j < s; j++) { - if (i !== j) { - denominator = field.multiply(denominator, GenericGF_1.addOrSubtractGF(1, field.multiply(errorLocations[j], xiInverse))); - } - } - result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), field.inverse(denominator)); - if (field.generatorBase !== 0) { - result[i] = field.multiply(result[i], xiInverse); - } - } - return result; -} -function decode(bytes, twoS) { - var outputBytes = new Uint8ClampedArray(bytes.length); - outputBytes.set(bytes); - var field = new GenericGF_1.default(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1 - var poly = new GenericGFPoly_1.default(field, outputBytes); - var syndromeCoefficients = new Uint8ClampedArray(twoS); - var error = false; - for (var s = 0; s < twoS; s++) { - var evaluation = poly.evaluateAt(field.exp(s + field.generatorBase)); - syndromeCoefficients[syndromeCoefficients.length - 1 - s] = evaluation; - if (evaluation !== 0) { - error = true; - } - } - if (!error) { - return outputBytes; - } - var syndrome = new GenericGFPoly_1.default(field, syndromeCoefficients); - var sigmaOmega = runEuclideanAlgorithm(field, field.buildMonomial(twoS, 1), syndrome, twoS); - if (sigmaOmega === null) { - return null; - } - var errorLocations = findErrorLocations(field, sigmaOmega[0]); - if (errorLocations == null) { - return null; - } - var errorMagnitudes = findErrorMagnitudes(field, sigmaOmega[1], errorLocations); - for (var i = 0; i < errorLocations.length; i++) { - var position = outputBytes.length - 1 - field.log(errorLocations[i]); - if (position < 0) { - return null; - } - outputBytes[position] = GenericGF_1.addOrSubtractGF(outputBytes[position], errorMagnitudes[i]); - } - return outputBytes; -} -exports.decode = decode; - - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.VERSIONS = [ - { - infoBits: null, - versionNumber: 1, - alignmentPatternCenters: [], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 7, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 19 }], - }, - { - ecCodewordsPerBlock: 10, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }], - }, - { - ecCodewordsPerBlock: 13, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 13 }], - }, - { - ecCodewordsPerBlock: 17, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 9 }], - }, - ], - }, - { - infoBits: null, - versionNumber: 2, - alignmentPatternCenters: [6, 18], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 10, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 34 }], - }, - { - ecCodewordsPerBlock: 16, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 28 }], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 22 }], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }], - }, - ], - }, - { - infoBits: null, - versionNumber: 3, - alignmentPatternCenters: [6, 22], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 15, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 55 }], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 44 }], - }, - { - ecCodewordsPerBlock: 18, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 17 }], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 13 }], - }, - ], - }, - { - infoBits: null, - versionNumber: 4, - alignmentPatternCenters: [6, 26], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 20, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 80 }], - }, - { - ecCodewordsPerBlock: 18, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 32 }], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 24 }], - }, - { - ecCodewordsPerBlock: 16, - ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 9 }], - }, - ], - }, - { - infoBits: null, - versionNumber: 5, - alignmentPatternCenters: [6, 30], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 26, - ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 108 }], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 43 }], - }, - { - ecCodewordsPerBlock: 18, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 15 }, - { numBlocks: 2, dataCodewordsPerBlock: 16 }, - ], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 11 }, - { numBlocks: 2, dataCodewordsPerBlock: 12 }, - ], - }, - ], - }, - { - infoBits: null, - versionNumber: 6, - alignmentPatternCenters: [6, 34], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 18, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 68 }], - }, - { - ecCodewordsPerBlock: 16, - ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 27 }], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 19 }], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 15 }], - }, - ], - }, - { - infoBits: 0x07C94, - versionNumber: 7, - alignmentPatternCenters: [6, 22, 38], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 20, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 78 }], - }, - { - ecCodewordsPerBlock: 18, - ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 31 }], - }, - { - ecCodewordsPerBlock: 18, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 14 }, - { numBlocks: 4, dataCodewordsPerBlock: 15 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 13 }, - { numBlocks: 1, dataCodewordsPerBlock: 14 }, - ], - }, - ], - }, - { - infoBits: 0x085BC, - versionNumber: 8, - alignmentPatternCenters: [6, 24, 42], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 24, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 97 }], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 38 }, - { numBlocks: 2, dataCodewordsPerBlock: 39 }, - ], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 18 }, - { numBlocks: 2, dataCodewordsPerBlock: 19 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 14 }, - { numBlocks: 2, dataCodewordsPerBlock: 15 }, - ], - }, - ], - }, - { - infoBits: 0x09A99, - versionNumber: 9, - alignmentPatternCenters: [6, 26, 46], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 116 }], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 36 }, - { numBlocks: 2, dataCodewordsPerBlock: 37 }, - ], - }, - { - ecCodewordsPerBlock: 20, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 16 }, - { numBlocks: 4, dataCodewordsPerBlock: 17 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 12 }, - { numBlocks: 4, dataCodewordsPerBlock: 13 }, - ], - }, - ], - }, - { - infoBits: 0x0A4D3, - versionNumber: 10, - alignmentPatternCenters: [6, 28, 50], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 18, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 68 }, - { numBlocks: 2, dataCodewordsPerBlock: 69 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 43 }, - { numBlocks: 1, dataCodewordsPerBlock: 44 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 6, dataCodewordsPerBlock: 19 }, - { numBlocks: 2, dataCodewordsPerBlock: 20 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 6, dataCodewordsPerBlock: 15 }, - { numBlocks: 2, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x0BBF6, - versionNumber: 11, - alignmentPatternCenters: [6, 30, 54], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 20, - ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 81 }], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 1, dataCodewordsPerBlock: 50 }, - { numBlocks: 4, dataCodewordsPerBlock: 51 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 22 }, - { numBlocks: 4, dataCodewordsPerBlock: 23 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 12 }, - { numBlocks: 8, dataCodewordsPerBlock: 13 }, - ], - }, - ], - }, - { - infoBits: 0x0C762, - versionNumber: 12, - alignmentPatternCenters: [6, 32, 58], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 92 }, - { numBlocks: 2, dataCodewordsPerBlock: 93 }, - ], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [ - { numBlocks: 6, dataCodewordsPerBlock: 36 }, - { numBlocks: 2, dataCodewordsPerBlock: 37 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 20 }, - { numBlocks: 6, dataCodewordsPerBlock: 21 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 7, dataCodewordsPerBlock: 14 }, - { numBlocks: 4, dataCodewordsPerBlock: 15 }, - ], - }, - ], - }, - { - infoBits: 0x0D847, - versionNumber: 13, - alignmentPatternCenters: [6, 34, 62], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 26, - ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 107 }], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [ - { numBlocks: 8, dataCodewordsPerBlock: 37 }, - { numBlocks: 1, dataCodewordsPerBlock: 38 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 8, dataCodewordsPerBlock: 20 }, - { numBlocks: 4, dataCodewordsPerBlock: 21 }, - ], - }, - { - ecCodewordsPerBlock: 22, - ecBlocks: [ - { numBlocks: 12, dataCodewordsPerBlock: 11 }, - { numBlocks: 4, dataCodewordsPerBlock: 12 }, - ], - }, - ], - }, - { - infoBits: 0x0E60D, - versionNumber: 14, - alignmentPatternCenters: [6, 26, 46, 66], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 115 }, - { numBlocks: 1, dataCodewordsPerBlock: 116 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 40 }, - { numBlocks: 5, dataCodewordsPerBlock: 41 }, - ], - }, - { - ecCodewordsPerBlock: 20, - ecBlocks: [ - { numBlocks: 11, dataCodewordsPerBlock: 16 }, - { numBlocks: 5, dataCodewordsPerBlock: 17 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 11, dataCodewordsPerBlock: 12 }, - { numBlocks: 5, dataCodewordsPerBlock: 13 }, - ], - }, - ], - }, - { - infoBits: 0x0F928, - versionNumber: 15, - alignmentPatternCenters: [6, 26, 48, 70], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 22, - ecBlocks: [ - { numBlocks: 5, dataCodewordsPerBlock: 87 }, - { numBlocks: 1, dataCodewordsPerBlock: 88 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 5, dataCodewordsPerBlock: 41 }, - { numBlocks: 5, dataCodewordsPerBlock: 42 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 5, dataCodewordsPerBlock: 24 }, - { numBlocks: 7, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 11, dataCodewordsPerBlock: 12 }, - { numBlocks: 7, dataCodewordsPerBlock: 13 }, - ], - }, - ], - }, - { - infoBits: 0x10B78, - versionNumber: 16, - alignmentPatternCenters: [6, 26, 50, 74], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 5, dataCodewordsPerBlock: 98 }, - { numBlocks: 1, dataCodewordsPerBlock: 99 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 7, dataCodewordsPerBlock: 45 }, - { numBlocks: 3, dataCodewordsPerBlock: 46 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [ - { numBlocks: 15, dataCodewordsPerBlock: 19 }, - { numBlocks: 2, dataCodewordsPerBlock: 20 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 15 }, - { numBlocks: 13, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x1145D, - versionNumber: 17, - alignmentPatternCenters: [6, 30, 54, 78], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 1, dataCodewordsPerBlock: 107 }, - { numBlocks: 5, dataCodewordsPerBlock: 108 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 10, dataCodewordsPerBlock: 46 }, - { numBlocks: 1, dataCodewordsPerBlock: 47 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 1, dataCodewordsPerBlock: 22 }, - { numBlocks: 15, dataCodewordsPerBlock: 23 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 14 }, - { numBlocks: 17, dataCodewordsPerBlock: 15 }, - ], - }, - ], - }, - { - infoBits: 0x12A17, - versionNumber: 18, - alignmentPatternCenters: [6, 30, 56, 82], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 5, dataCodewordsPerBlock: 120 }, - { numBlocks: 1, dataCodewordsPerBlock: 121 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 9, dataCodewordsPerBlock: 43 }, - { numBlocks: 4, dataCodewordsPerBlock: 44 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 17, dataCodewordsPerBlock: 22 }, - { numBlocks: 1, dataCodewordsPerBlock: 23 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 14 }, - { numBlocks: 19, dataCodewordsPerBlock: 15 }, - ], - }, - ], - }, - { - infoBits: 0x13532, - versionNumber: 19, - alignmentPatternCenters: [6, 30, 58, 86], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 113 }, - { numBlocks: 4, dataCodewordsPerBlock: 114 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 44 }, - { numBlocks: 11, dataCodewordsPerBlock: 45 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 17, dataCodewordsPerBlock: 21 }, - { numBlocks: 4, dataCodewordsPerBlock: 22 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 9, dataCodewordsPerBlock: 13 }, - { numBlocks: 16, dataCodewordsPerBlock: 14 }, - ], - }, - ], - }, - { - infoBits: 0x149A6, - versionNumber: 20, - alignmentPatternCenters: [6, 34, 62, 90], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 107 }, - { numBlocks: 5, dataCodewordsPerBlock: 108 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 41 }, - { numBlocks: 13, dataCodewordsPerBlock: 42 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 15, dataCodewordsPerBlock: 24 }, - { numBlocks: 5, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 15, dataCodewordsPerBlock: 15 }, - { numBlocks: 10, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x15683, - versionNumber: 21, - alignmentPatternCenters: [6, 28, 50, 72, 94], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 116 }, - { numBlocks: 4, dataCodewordsPerBlock: 117 }, - ], - }, - { - ecCodewordsPerBlock: 26, - ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 42 }], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 17, dataCodewordsPerBlock: 22 }, - { numBlocks: 6, dataCodewordsPerBlock: 23 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 19, dataCodewordsPerBlock: 16 }, - { numBlocks: 6, dataCodewordsPerBlock: 17 }, - ], - }, - ], - }, - { - infoBits: 0x168C9, - versionNumber: 22, - alignmentPatternCenters: [6, 26, 50, 74, 98], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 111 }, - { numBlocks: 7, dataCodewordsPerBlock: 112 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 46 }], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 7, dataCodewordsPerBlock: 24 }, - { numBlocks: 16, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 24, - ecBlocks: [{ numBlocks: 34, dataCodewordsPerBlock: 13 }], - }, - ], - }, - { - infoBits: 0x177EC, - versionNumber: 23, - alignmentPatternCenters: [6, 30, 54, 74, 102], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 121 }, - { numBlocks: 5, dataCodewordsPerBlock: 122 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 47 }, - { numBlocks: 14, dataCodewordsPerBlock: 48 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 11, dataCodewordsPerBlock: 24 }, - { numBlocks: 14, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 16, dataCodewordsPerBlock: 15 }, - { numBlocks: 14, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x18EC4, - versionNumber: 24, - alignmentPatternCenters: [6, 28, 54, 80, 106], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 6, dataCodewordsPerBlock: 117 }, - { numBlocks: 4, dataCodewordsPerBlock: 118 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 6, dataCodewordsPerBlock: 45 }, - { numBlocks: 14, dataCodewordsPerBlock: 46 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 11, dataCodewordsPerBlock: 24 }, - { numBlocks: 16, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 30, dataCodewordsPerBlock: 16 }, - { numBlocks: 2, dataCodewordsPerBlock: 17 }, - ], - }, - ], - }, - { - infoBits: 0x191E1, - versionNumber: 25, - alignmentPatternCenters: [6, 32, 58, 84, 110], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 26, - ecBlocks: [ - { numBlocks: 8, dataCodewordsPerBlock: 106 }, - { numBlocks: 4, dataCodewordsPerBlock: 107 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 8, dataCodewordsPerBlock: 47 }, - { numBlocks: 13, dataCodewordsPerBlock: 48 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 7, dataCodewordsPerBlock: 24 }, - { numBlocks: 22, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 22, dataCodewordsPerBlock: 15 }, - { numBlocks: 13, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x1AFAB, - versionNumber: 26, - alignmentPatternCenters: [6, 30, 58, 86, 114], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 10, dataCodewordsPerBlock: 114 }, - { numBlocks: 2, dataCodewordsPerBlock: 115 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 19, dataCodewordsPerBlock: 46 }, - { numBlocks: 4, dataCodewordsPerBlock: 47 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 28, dataCodewordsPerBlock: 22 }, - { numBlocks: 6, dataCodewordsPerBlock: 23 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 33, dataCodewordsPerBlock: 16 }, - { numBlocks: 4, dataCodewordsPerBlock: 17 }, - ], - }, - ], - }, - { - infoBits: 0x1B08E, - versionNumber: 27, - alignmentPatternCenters: [6, 34, 62, 90, 118], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 8, dataCodewordsPerBlock: 122 }, - { numBlocks: 4, dataCodewordsPerBlock: 123 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 22, dataCodewordsPerBlock: 45 }, - { numBlocks: 3, dataCodewordsPerBlock: 46 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 8, dataCodewordsPerBlock: 23 }, - { numBlocks: 26, dataCodewordsPerBlock: 24 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 12, dataCodewordsPerBlock: 15 }, - { numBlocks: 28, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x1CC1A, - versionNumber: 28, - alignmentPatternCenters: [6, 26, 50, 74, 98, 122], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 117 }, - { numBlocks: 10, dataCodewordsPerBlock: 118 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 3, dataCodewordsPerBlock: 45 }, - { numBlocks: 23, dataCodewordsPerBlock: 46 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 24 }, - { numBlocks: 31, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 11, dataCodewordsPerBlock: 15 }, - { numBlocks: 31, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x1D33F, - versionNumber: 29, - alignmentPatternCenters: [6, 30, 54, 78, 102, 126], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 7, dataCodewordsPerBlock: 116 }, - { numBlocks: 7, dataCodewordsPerBlock: 117 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 21, dataCodewordsPerBlock: 45 }, - { numBlocks: 7, dataCodewordsPerBlock: 46 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 1, dataCodewordsPerBlock: 23 }, - { numBlocks: 37, dataCodewordsPerBlock: 24 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 19, dataCodewordsPerBlock: 15 }, - { numBlocks: 26, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x1ED75, - versionNumber: 30, - alignmentPatternCenters: [6, 26, 52, 78, 104, 130], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 5, dataCodewordsPerBlock: 115 }, - { numBlocks: 10, dataCodewordsPerBlock: 116 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 19, dataCodewordsPerBlock: 47 }, - { numBlocks: 10, dataCodewordsPerBlock: 48 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 15, dataCodewordsPerBlock: 24 }, - { numBlocks: 25, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 23, dataCodewordsPerBlock: 15 }, - { numBlocks: 25, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x1F250, - versionNumber: 31, - alignmentPatternCenters: [6, 30, 56, 82, 108, 134], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 13, dataCodewordsPerBlock: 115 }, - { numBlocks: 3, dataCodewordsPerBlock: 116 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 46 }, - { numBlocks: 29, dataCodewordsPerBlock: 47 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 42, dataCodewordsPerBlock: 24 }, - { numBlocks: 1, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 23, dataCodewordsPerBlock: 15 }, - { numBlocks: 28, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x209D5, - versionNumber: 32, - alignmentPatternCenters: [6, 34, 60, 86, 112, 138], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 115 }], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 10, dataCodewordsPerBlock: 46 }, - { numBlocks: 23, dataCodewordsPerBlock: 47 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 10, dataCodewordsPerBlock: 24 }, - { numBlocks: 35, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 19, dataCodewordsPerBlock: 15 }, - { numBlocks: 35, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x216F0, - versionNumber: 33, - alignmentPatternCenters: [6, 30, 58, 86, 114, 142], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 17, dataCodewordsPerBlock: 115 }, - { numBlocks: 1, dataCodewordsPerBlock: 116 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 14, dataCodewordsPerBlock: 46 }, - { numBlocks: 21, dataCodewordsPerBlock: 47 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 29, dataCodewordsPerBlock: 24 }, - { numBlocks: 19, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 11, dataCodewordsPerBlock: 15 }, - { numBlocks: 46, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x228BA, - versionNumber: 34, - alignmentPatternCenters: [6, 34, 62, 90, 118, 146], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 13, dataCodewordsPerBlock: 115 }, - { numBlocks: 6, dataCodewordsPerBlock: 116 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 14, dataCodewordsPerBlock: 46 }, - { numBlocks: 23, dataCodewordsPerBlock: 47 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 44, dataCodewordsPerBlock: 24 }, - { numBlocks: 7, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 59, dataCodewordsPerBlock: 16 }, - { numBlocks: 1, dataCodewordsPerBlock: 17 }, - ], - }, - ], - }, - { - infoBits: 0x2379F, - versionNumber: 35, - alignmentPatternCenters: [6, 30, 54, 78, 102, 126, 150], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 12, dataCodewordsPerBlock: 121 }, - { numBlocks: 7, dataCodewordsPerBlock: 122 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 12, dataCodewordsPerBlock: 47 }, - { numBlocks: 26, dataCodewordsPerBlock: 48 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 39, dataCodewordsPerBlock: 24 }, - { numBlocks: 14, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 22, dataCodewordsPerBlock: 15 }, - { numBlocks: 41, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x24B0B, - versionNumber: 36, - alignmentPatternCenters: [6, 24, 50, 76, 102, 128, 154], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 6, dataCodewordsPerBlock: 121 }, - { numBlocks: 14, dataCodewordsPerBlock: 122 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 6, dataCodewordsPerBlock: 47 }, - { numBlocks: 34, dataCodewordsPerBlock: 48 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 46, dataCodewordsPerBlock: 24 }, - { numBlocks: 10, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 2, dataCodewordsPerBlock: 15 }, - { numBlocks: 64, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x2542E, - versionNumber: 37, - alignmentPatternCenters: [6, 28, 54, 80, 106, 132, 158], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 17, dataCodewordsPerBlock: 122 }, - { numBlocks: 4, dataCodewordsPerBlock: 123 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 29, dataCodewordsPerBlock: 46 }, - { numBlocks: 14, dataCodewordsPerBlock: 47 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 49, dataCodewordsPerBlock: 24 }, - { numBlocks: 10, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 24, dataCodewordsPerBlock: 15 }, - { numBlocks: 46, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x26A64, - versionNumber: 38, - alignmentPatternCenters: [6, 32, 58, 84, 110, 136, 162], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 4, dataCodewordsPerBlock: 122 }, - { numBlocks: 18, dataCodewordsPerBlock: 123 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 13, dataCodewordsPerBlock: 46 }, - { numBlocks: 32, dataCodewordsPerBlock: 47 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 48, dataCodewordsPerBlock: 24 }, - { numBlocks: 14, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 42, dataCodewordsPerBlock: 15 }, - { numBlocks: 32, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x27541, - versionNumber: 39, - alignmentPatternCenters: [6, 26, 54, 82, 110, 138, 166], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 20, dataCodewordsPerBlock: 117 }, - { numBlocks: 4, dataCodewordsPerBlock: 118 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 40, dataCodewordsPerBlock: 47 }, - { numBlocks: 7, dataCodewordsPerBlock: 48 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 43, dataCodewordsPerBlock: 24 }, - { numBlocks: 22, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 10, dataCodewordsPerBlock: 15 }, - { numBlocks: 67, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, - { - infoBits: 0x28C69, - versionNumber: 40, - alignmentPatternCenters: [6, 30, 58, 86, 114, 142, 170], - errorCorrectionLevels: [ - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 19, dataCodewordsPerBlock: 118 }, - { numBlocks: 6, dataCodewordsPerBlock: 119 }, - ], - }, - { - ecCodewordsPerBlock: 28, - ecBlocks: [ - { numBlocks: 18, dataCodewordsPerBlock: 47 }, - { numBlocks: 31, dataCodewordsPerBlock: 48 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 34, dataCodewordsPerBlock: 24 }, - { numBlocks: 34, dataCodewordsPerBlock: 25 }, - ], - }, - { - ecCodewordsPerBlock: 30, - ecBlocks: [ - { numBlocks: 20, dataCodewordsPerBlock: 15 }, - { numBlocks: 61, dataCodewordsPerBlock: 16 }, - ], - }, - ], - }, -]; - - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __nested_webpack_require_230849__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var BitMatrix_1 = __nested_webpack_require_230849__(0); -function squareToQuadrilateral(p1, p2, p3, p4) { - var dx3 = p1.x - p2.x + p3.x - p4.x; - var dy3 = p1.y - p2.y + p3.y - p4.y; - if (dx3 === 0 && dy3 === 0) { - return { - a11: p2.x - p1.x, - a12: p2.y - p1.y, - a13: 0, - a21: p3.x - p2.x, - a22: p3.y - p2.y, - a23: 0, - a31: p1.x, - a32: p1.y, - a33: 1, - }; - } - else { - var dx1 = p2.x - p3.x; - var dx2 = p4.x - p3.x; - var dy1 = p2.y - p3.y; - var dy2 = p4.y - p3.y; - var denominator = dx1 * dy2 - dx2 * dy1; - var a13 = (dx3 * dy2 - dx2 * dy3) / denominator; - var a23 = (dx1 * dy3 - dx3 * dy1) / denominator; - return { - a11: p2.x - p1.x + a13 * p2.x, - a12: p2.y - p1.y + a13 * p2.y, - a13: a13, - a21: p4.x - p1.x + a23 * p4.x, - a22: p4.y - p1.y + a23 * p4.y, - a23: a23, - a31: p1.x, - a32: p1.y, - a33: 1, - }; - } -} -function quadrilateralToSquare(p1, p2, p3, p4) { - // Here, the adjoint serves as the inverse: - var sToQ = squareToQuadrilateral(p1, p2, p3, p4); - return { - a11: sToQ.a22 * sToQ.a33 - sToQ.a23 * sToQ.a32, - a12: sToQ.a13 * sToQ.a32 - sToQ.a12 * sToQ.a33, - a13: sToQ.a12 * sToQ.a23 - sToQ.a13 * sToQ.a22, - a21: sToQ.a23 * sToQ.a31 - sToQ.a21 * sToQ.a33, - a22: sToQ.a11 * sToQ.a33 - sToQ.a13 * sToQ.a31, - a23: sToQ.a13 * sToQ.a21 - sToQ.a11 * sToQ.a23, - a31: sToQ.a21 * sToQ.a32 - sToQ.a22 * sToQ.a31, - a32: sToQ.a12 * sToQ.a31 - sToQ.a11 * sToQ.a32, - a33: sToQ.a11 * sToQ.a22 - sToQ.a12 * sToQ.a21, - }; -} -function times(a, b) { - return { - a11: a.a11 * b.a11 + a.a21 * b.a12 + a.a31 * b.a13, - a12: a.a12 * b.a11 + a.a22 * b.a12 + a.a32 * b.a13, - a13: a.a13 * b.a11 + a.a23 * b.a12 + a.a33 * b.a13, - a21: a.a11 * b.a21 + a.a21 * b.a22 + a.a31 * b.a23, - a22: a.a12 * b.a21 + a.a22 * b.a22 + a.a32 * b.a23, - a23: a.a13 * b.a21 + a.a23 * b.a22 + a.a33 * b.a23, - a31: a.a11 * b.a31 + a.a21 * b.a32 + a.a31 * b.a33, - a32: a.a12 * b.a31 + a.a22 * b.a32 + a.a32 * b.a33, - a33: a.a13 * b.a31 + a.a23 * b.a32 + a.a33 * b.a33, - }; -} -function extract(image, location) { - var qToS = quadrilateralToSquare({ x: 3.5, y: 3.5 }, { x: location.dimension - 3.5, y: 3.5 }, { x: location.dimension - 6.5, y: location.dimension - 6.5 }, { x: 3.5, y: location.dimension - 3.5 }); - var sToQ = squareToQuadrilateral(location.topLeft, location.topRight, location.alignmentPattern, location.bottomLeft); - var transform = times(sToQ, qToS); - var matrix = BitMatrix_1.BitMatrix.createEmpty(location.dimension, location.dimension); - var mappingFunction = function (x, y) { - var denominator = transform.a13 * x + transform.a23 * y + transform.a33; - return { - x: (transform.a11 * x + transform.a21 * y + transform.a31) / denominator, - y: (transform.a12 * x + transform.a22 * y + transform.a32) / denominator, - }; - }; - for (var y = 0; y < location.dimension; y++) { - for (var x = 0; x < location.dimension; x++) { - var xValue = x + 0.5; - var yValue = y + 0.5; - var sourcePixel = mappingFunction(xValue, yValue); - matrix.set(x, y, image.get(Math.floor(sourcePixel.x), Math.floor(sourcePixel.y))); - } - } - return { - matrix: matrix, - mappingFunction: mappingFunction, - }; -} -exports.extract = extract; - - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var MAX_FINDERPATTERNS_TO_SEARCH = 4; -var MIN_QUAD_RATIO = 0.5; -var MAX_QUAD_RATIO = 1.5; -var distance = function (a, b) { return Math.sqrt(Math.pow((b.x - a.x), 2) + Math.pow((b.y - a.y), 2)); }; -function sum(values) { - return values.reduce(function (a, b) { return a + b; }); -} -// Takes three finder patterns and organizes them into topLeft, topRight, etc -function reorderFinderPatterns(pattern1, pattern2, pattern3) { - // Find distances between pattern centers - var oneTwoDistance = distance(pattern1, pattern2); - var twoThreeDistance = distance(pattern2, pattern3); - var oneThreeDistance = distance(pattern1, pattern3); - var bottomLeft; - var topLeft; - var topRight; - // Assume one closest to other two is B; A and C will just be guesses at first - if (twoThreeDistance >= oneTwoDistance && twoThreeDistance >= oneThreeDistance) { - _a = [pattern2, pattern1, pattern3], bottomLeft = _a[0], topLeft = _a[1], topRight = _a[2]; - } - else if (oneThreeDistance >= twoThreeDistance && oneThreeDistance >= oneTwoDistance) { - _b = [pattern1, pattern2, pattern3], bottomLeft = _b[0], topLeft = _b[1], topRight = _b[2]; - } - else { - _c = [pattern1, pattern3, pattern2], bottomLeft = _c[0], topLeft = _c[1], topRight = _c[2]; - } - // Use cross product to figure out whether bottomLeft (A) and topRight (C) are correct or flipped in relation to topLeft (B) - // This asks whether BC x BA has a positive z component, which is the arrangement we want. If it's negative, then - // we've got it flipped around and should swap topRight and bottomLeft. - if (((topRight.x - topLeft.x) * (bottomLeft.y - topLeft.y)) - ((topRight.y - topLeft.y) * (bottomLeft.x - topLeft.x)) < 0) { - _d = [topRight, bottomLeft], bottomLeft = _d[0], topRight = _d[1]; - } - return { bottomLeft: bottomLeft, topLeft: topLeft, topRight: topRight }; - var _a, _b, _c, _d; -} -// Computes the dimension (number of modules on a side) of the QR Code based on the position of the finder patterns -function computeDimension(topLeft, topRight, bottomLeft, matrix) { - var moduleSize = (sum(countBlackWhiteRun(topLeft, bottomLeft, matrix, 5)) / 7 + // Divide by 7 since the ratio is 1:1:3:1:1 - sum(countBlackWhiteRun(topLeft, topRight, matrix, 5)) / 7 + - sum(countBlackWhiteRun(bottomLeft, topLeft, matrix, 5)) / 7 + - sum(countBlackWhiteRun(topRight, topLeft, matrix, 5)) / 7) / 4; - if (moduleSize < 1) { - throw new Error("Invalid module size"); - } - var topDimension = Math.round(distance(topLeft, topRight) / moduleSize); - var sideDimension = Math.round(distance(topLeft, bottomLeft) / moduleSize); - var dimension = Math.floor((topDimension + sideDimension) / 2) + 7; - switch (dimension % 4) { - case 0: - dimension++; - break; - case 2: - dimension--; - break; - } - return { dimension: dimension, moduleSize: moduleSize }; -} -// Takes an origin point and an end point and counts the sizes of the black white run from the origin towards the end point. -// Returns an array of elements, representing the pixel size of the black white run. -// Uses a variant of http://en.wikipedia.org/wiki/Bresenham's_line_algorithm -function countBlackWhiteRunTowardsPoint(origin, end, matrix, length) { - var switchPoints = [{ x: Math.floor(origin.x), y: Math.floor(origin.y) }]; - var steep = Math.abs(end.y - origin.y) > Math.abs(end.x - origin.x); - var fromX; - var fromY; - var toX; - var toY; - if (steep) { - fromX = Math.floor(origin.y); - fromY = Math.floor(origin.x); - toX = Math.floor(end.y); - toY = Math.floor(end.x); - } - else { - fromX = Math.floor(origin.x); - fromY = Math.floor(origin.y); - toX = Math.floor(end.x); - toY = Math.floor(end.y); - } - var dx = Math.abs(toX - fromX); - var dy = Math.abs(toY - fromY); - var error = Math.floor(-dx / 2); - var xStep = fromX < toX ? 1 : -1; - var yStep = fromY < toY ? 1 : -1; - var currentPixel = true; - // Loop up until x == toX, but not beyond - for (var x = fromX, y = fromY; x !== toX + xStep; x += xStep) { - // Does current pixel mean we have moved white to black or vice versa? - // Scanning black in state 0,2 and white in state 1, so if we find the wrong - // color, advance to next state or end if we are in state 2 already - var realX = steep ? y : x; - var realY = steep ? x : y; - if (matrix.get(realX, realY) !== currentPixel) { - currentPixel = !currentPixel; - switchPoints.push({ x: realX, y: realY }); - if (switchPoints.length === length + 1) { - break; - } - } - error += dy; - if (error > 0) { - if (y === toY) { - break; - } - y += yStep; - error -= dx; - } - } - var distances = []; - for (var i = 0; i < length; i++) { - if (switchPoints[i] && switchPoints[i + 1]) { - distances.push(distance(switchPoints[i], switchPoints[i + 1])); - } - else { - distances.push(0); - } - } - return distances; -} -// Takes an origin point and an end point and counts the sizes of the black white run in the origin point -// along the line that intersects with the end point. Returns an array of elements, representing the pixel sizes -// of the black white run. Takes a length which represents the number of switches from black to white to look for. -function countBlackWhiteRun(origin, end, matrix, length) { - var rise = end.y - origin.y; - var run = end.x - origin.x; - var towardsEnd = countBlackWhiteRunTowardsPoint(origin, end, matrix, Math.ceil(length / 2)); - var awayFromEnd = countBlackWhiteRunTowardsPoint(origin, { x: origin.x - run, y: origin.y - rise }, matrix, Math.ceil(length / 2)); - var middleValue = towardsEnd.shift() + awayFromEnd.shift() - 1; // Substract one so we don't double count a pixel - return (_a = awayFromEnd.concat(middleValue)).concat.apply(_a, towardsEnd); - var _a; -} -// Takes in a black white run and an array of expected ratios. Returns the average size of the run as well as the "error" - -// that is the amount the run diverges from the expected ratio -function scoreBlackWhiteRun(sequence, ratios) { - var averageSize = sum(sequence) / sum(ratios); - var error = 0; - ratios.forEach(function (ratio, i) { - error += Math.pow((sequence[i] - ratio * averageSize), 2); - }); - return { averageSize: averageSize, error: error }; -} -// Takes an X,Y point and an array of sizes and scores the point against those ratios. -// For example for a finder pattern takes the ratio list of 1:1:3:1:1 and checks horizontal, vertical and diagonal ratios -// against that. -function scorePattern(point, ratios, matrix) { - try { - var horizontalRun = countBlackWhiteRun(point, { x: -1, y: point.y }, matrix, ratios.length); - var verticalRun = countBlackWhiteRun(point, { x: point.x, y: -1 }, matrix, ratios.length); - var topLeftPoint = { - x: Math.max(0, point.x - point.y) - 1, - y: Math.max(0, point.y - point.x) - 1, - }; - var topLeftBottomRightRun = countBlackWhiteRun(point, topLeftPoint, matrix, ratios.length); - var bottomLeftPoint = { - x: Math.min(matrix.width, point.x + point.y) + 1, - y: Math.min(matrix.height, point.y + point.x) + 1, - }; - var bottomLeftTopRightRun = countBlackWhiteRun(point, bottomLeftPoint, matrix, ratios.length); - var horzError = scoreBlackWhiteRun(horizontalRun, ratios); - var vertError = scoreBlackWhiteRun(verticalRun, ratios); - var diagDownError = scoreBlackWhiteRun(topLeftBottomRightRun, ratios); - var diagUpError = scoreBlackWhiteRun(bottomLeftTopRightRun, ratios); - var ratioError = Math.sqrt(horzError.error * horzError.error + - vertError.error * vertError.error + - diagDownError.error * diagDownError.error + - diagUpError.error * diagUpError.error); - var avgSize = (horzError.averageSize + vertError.averageSize + diagDownError.averageSize + diagUpError.averageSize) / 4; - var sizeError = (Math.pow((horzError.averageSize - avgSize), 2) + - Math.pow((vertError.averageSize - avgSize), 2) + - Math.pow((diagDownError.averageSize - avgSize), 2) + - Math.pow((diagUpError.averageSize - avgSize), 2)) / avgSize; - return ratioError + sizeError; - } - catch (_a) { - return Infinity; - } -} -function locate(matrix) { - var finderPatternQuads = []; - var activeFinderPatternQuads = []; - var alignmentPatternQuads = []; - var activeAlignmentPatternQuads = []; - var _loop_1 = function (y) { - var length_1 = 0; - var lastBit = false; - var scans = [0, 0, 0, 0, 0]; - var _loop_2 = function (x) { - var v = matrix.get(x, y); - if (v === lastBit) { - length_1++; - } - else { - scans = [scans[1], scans[2], scans[3], scans[4], length_1]; - length_1 = 1; - lastBit = v; - // Do the last 5 color changes ~ match the expected ratio for a finder pattern? 1:1:3:1:1 of b:w:b:w:b - var averageFinderPatternBlocksize = sum(scans) / 7; - var validFinderPattern = Math.abs(scans[0] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize && - Math.abs(scans[1] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize && - Math.abs(scans[2] - 3 * averageFinderPatternBlocksize) < 3 * averageFinderPatternBlocksize && - Math.abs(scans[3] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize && - Math.abs(scans[4] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize && - !v; // And make sure the current pixel is white since finder patterns are bordered in white - // Do the last 3 color changes ~ match the expected ratio for an alignment pattern? 1:1:1 of w:b:w - var averageAlignmentPatternBlocksize = sum(scans.slice(-3)) / 3; - var validAlignmentPattern = Math.abs(scans[2] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize && - Math.abs(scans[3] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize && - Math.abs(scans[4] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize && - v; // Is the current pixel black since alignment patterns are bordered in black - if (validFinderPattern) { - // Compute the start and end x values of the large center black square - var endX_1 = x - scans[3] - scans[4]; - var startX_1 = endX_1 - scans[2]; - var line = { startX: startX_1, endX: endX_1, y: y }; - // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with - // that line as the starting point. - var matchingQuads = activeFinderPatternQuads.filter(function (q) { - return (startX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) || - (endX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) || - (startX_1 <= q.bottom.startX && endX_1 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO && - (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO)); - }); - if (matchingQuads.length > 0) { - matchingQuads[0].bottom = line; - } - else { - activeFinderPatternQuads.push({ top: line, bottom: line }); - } - } - if (validAlignmentPattern) { - // Compute the start and end x values of the center black square - var endX_2 = x - scans[4]; - var startX_2 = endX_2 - scans[3]; - var line = { startX: startX_2, y: y, endX: endX_2 }; - // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with - // that line as the starting point. - var matchingQuads = activeAlignmentPatternQuads.filter(function (q) { - return (startX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) || - (endX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) || - (startX_2 <= q.bottom.startX && endX_2 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO && - (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO)); - }); - if (matchingQuads.length > 0) { - matchingQuads[0].bottom = line; - } - else { - activeAlignmentPatternQuads.push({ top: line, bottom: line }); - } - } - } - }; - for (var x = -1; x <= matrix.width; x++) { - _loop_2(x); - } - finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y !== y && q.bottom.y - q.top.y >= 2; })); - activeFinderPatternQuads = activeFinderPatternQuads.filter(function (q) { return q.bottom.y === y; }); - alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y !== y; })); - activeAlignmentPatternQuads = activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y === y; }); - }; - for (var y = 0; y <= matrix.height; y++) { - _loop_1(y); - } - finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y - q.top.y >= 2; })); - alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads); - var finderPatternGroups = finderPatternQuads - .filter(function (q) { return q.bottom.y - q.top.y >= 2; }) // All quads must be at least 2px tall since the center square is larger than a block - .map(function (q) { - var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4; - var y = (q.top.y + q.bottom.y + 1) / 2; - if (!matrix.get(Math.round(x), Math.round(y))) { - return; - } - var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, q.bottom.y - q.top.y + 1]; - var size = sum(lengths) / lengths.length; - var score = scorePattern({ x: Math.round(x), y: Math.round(y) }, [1, 1, 3, 1, 1], matrix); - return { score: score, x: x, y: y, size: size }; - }) - .filter(function (q) { return !!q; }) // Filter out any rejected quads from above - .sort(function (a, b) { return a.score - b.score; }) - .map(function (point, i, finderPatterns) { - if (i > MAX_FINDERPATTERNS_TO_SEARCH) { - return null; - } - var otherPoints = finderPatterns - .filter(function (p, ii) { return i !== ii; }) - .map(function (p) { return ({ x: p.x, y: p.y, score: p.score + (Math.pow((p.size - point.size), 2)) / point.size, size: p.size }); }) - .sort(function (a, b) { return a.score - b.score; }); - if (otherPoints.length < 2) { - return null; - } - var score = point.score + otherPoints[0].score + otherPoints[1].score; - return { points: [point].concat(otherPoints.slice(0, 2)), score: score }; - }) - .filter(function (q) { return !!q; }) // Filter out any rejected finder patterns from above - .sort(function (a, b) { return a.score - b.score; }); - if (finderPatternGroups.length === 0) { - return null; - } - var _a = reorderFinderPatterns(finderPatternGroups[0].points[0], finderPatternGroups[0].points[1], finderPatternGroups[0].points[2]), topRight = _a.topRight, topLeft = _a.topLeft, bottomLeft = _a.bottomLeft; - // Now that we've found the three finder patterns we can determine the blockSize and the size of the QR code. - // We'll use these to help find the alignment pattern but also later when we do the extraction. - var dimension; - var moduleSize; - try { - (_b = computeDimension(topLeft, topRight, bottomLeft, matrix), dimension = _b.dimension, moduleSize = _b.moduleSize); - } - catch (e) { - return null; - } - // Now find the alignment pattern - var bottomRightFinderPattern = { - x: topRight.x - topLeft.x + bottomLeft.x, - y: topRight.y - topLeft.y + bottomLeft.y, - }; - var modulesBetweenFinderPatterns = ((distance(topLeft, bottomLeft) + distance(topLeft, topRight)) / 2 / moduleSize); - var correctionToTopLeft = 1 - (3 / modulesBetweenFinderPatterns); - var expectedAlignmentPattern = { - x: topLeft.x + correctionToTopLeft * (bottomRightFinderPattern.x - topLeft.x), - y: topLeft.y + correctionToTopLeft * (bottomRightFinderPattern.y - topLeft.y), - }; - var alignmentPatterns = alignmentPatternQuads - .map(function (q) { - var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4; - var y = (q.top.y + q.bottom.y + 1) / 2; - if (!matrix.get(Math.floor(x), Math.floor(y))) { - return; - } - var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, (q.bottom.y - q.top.y + 1)]; - var size = sum(lengths) / lengths.length; - var sizeScore = scorePattern({ x: Math.floor(x), y: Math.floor(y) }, [1, 1, 1], matrix); - var score = sizeScore + distance({ x: x, y: y }, expectedAlignmentPattern); - return { x: x, y: y, score: score }; - }) - .filter(function (v) { return !!v; }) - .sort(function (a, b) { return a.score - b.score; }); - // If there are less than 15 modules between finder patterns it's a version 1 QR code and as such has no alignmemnt pattern - // so we can only use our best guess. - var alignmentPattern = modulesBetweenFinderPatterns >= 15 && alignmentPatterns.length ? alignmentPatterns[0] : expectedAlignmentPattern; - return { - alignmentPattern: { x: alignmentPattern.x, y: alignmentPattern.y }, - bottomLeft: { x: bottomLeft.x, y: bottomLeft.y }, - dimension: dimension, - topLeft: { x: topLeft.x, y: topLeft.y }, - topRight: { x: topRight.x, y: topRight.y }, - }; - var _b; -} -exports.locate = locate; - - -/***/ }) -/******/ ])["default"]; -}); - -/***/ }) - -}]); -//# sourceMappingURL=jsqr.chunk.js.map \ No newline at end of file diff --git a/cypress/fixtures/v3-client/jsqr.chunk.js.map b/cypress/fixtures/v3-client/jsqr.chunk.js.map deleted file mode 100644 index 5a26349b..00000000 --- a/cypress/fixtures/v3-client/jsqr.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"jsqr.chunk.js","mappings":";;;;;;;;AAAA;AACA,IAAI,IAAyD;AAC7D;AACA,MAAM,EAKqB;AAC3B,CAAC;AACD,qCAAqC;AACrC;AACA;AACA;AACA;AACA,mBAAmB,8BAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,8BAAmB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,8BAAmB;AAC7B;AACA;AACA,UAAU,8BAAmB;AAC7B;AACA;AACA,UAAU,8BAAmB;AAC7B,eAAe,8BAAmB;AAClC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,UAAU,8BAAmB;AAC7B;AACA,oCAAoC,4BAA4B;AAChE,0CAA0C;AAC1C,WAAW,8BAAmB;AAC9B;AACA;AACA;AACA;AACA,UAAU,8BAAmB,kCAAkC;AAC/D;AACA;AACA,UAAU,8BAAmB;AAC7B;AACA;AACA,iBAAiB,8BAAmB,CAAC,8BAAmB;AACxD,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,kBAAkB;AAC5C,+BAA+B,kBAAkB;AACjD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA,OAAO;AACP;AACA,iCAAiC,+BAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,sBAAsB,+BAAmB;AACzC;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA,OAAO;AACP;AACA,iCAAiC,+BAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,+BAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA,iCAAiC,+BAA+B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA,OAAO;AACP;AACA,iCAAiC,gCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,gCAAmB;AACrC,gBAAgB,gCAAmB;AACnC,kBAAkB,gCAAmB;AACrC,gBAAgB,gCAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,6BAA6B;AAC7B;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA,iCAAiC,gCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,gCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,sCAAsC;AACvE,wCAAwC,2CAA2C;AACnF;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,sCAAsC;AACvE,wCAAwC,2CAA2C;AACnF;AACA;AACA;AACA,mCAAmC,cAAc;AACjD,uCAAuC,cAAc;AACrD;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD,sCAAsC,uBAAuB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;;;AAGA,OAAO;AACP;AACA,iCAAiC,gCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,gCAAmB;AACrC,mBAAmB,gCAAmB;AACtC,oBAAoB,gCAAmB;AACvC,gBAAgB,gCAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E;AACA;AACA,mBAAmB,iCAAiC;AACpD,mBAAmB,yBAAyB;AAC5C,mBAAmB,uBAAuB;AAC1C,mBAAmB,+BAA+B;AAClD,mBAAmB,+DAA+D;AAClF,mBAAmB,qDAAqD;AACxE,mBAAmB,2DAA2D;AAC9E,mBAAmB,2DAA2D;AAC9E;AACA;AACA;AACA;AACA,wCAAwC;AACxC,oDAAoD;AACpD,oDAAoD;AACpD;AACA,2DAA2D,gBAAgB;AAC3E;AACA,+DAA+D,gBAAgB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,qDAAqD;AACrD;AACA,yDAAyD;AACzD,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,iBAAiB;AAC3D;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA,mCAAmC,YAAY;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA;AACA,sDAAsD,wBAAwB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA;AACA;AACA,8DAA8D,iCAAiC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C,8BAA8B,8DAA8D;AAC5F;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC,oDAAoD,0BAA0B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA,oDAAoD,0BAA0B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA;AACA,gDAAgD,0BAA0B;AAC1E;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA,iCAAiC,gCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D;AACA,kBAAkB,gCAAmB;AACrC,sBAAsB,gCAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,2CAA2C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA,4DAA4D,iDAAiD;AAC7G;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA,OAAO;AACP;AACA;;AAEA;;AAEA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA,iCAAiC,iCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,iCAAmB;AACrC,sBAAsB,iCAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0CAA0C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA;;AAEA;;AAEA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,wCAAwC;AACrE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,wCAAwC;AACrE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,2CAA2C;AACjE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,2CAA2C;AACjE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,2CAA2C;AACxE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,2CAA2C;AACjE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,2CAA2C;AACjE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;;;AAGA,OAAO;AACP;AACA,iCAAiC,iCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,iCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,gBAAgB,IAAI,qCAAqC,IAAI,0DAA0D,IAAI,qCAAqC;AACvM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA;;AAEA;;AAEA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA,iCAAiC;AACjC;AACA,2CAA2C,eAAe;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,0BAA0B,kDAAkD;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,mBAAmB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uCAAuC;AACtG,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,mBAAmB;AAC3E,sDAAsD,mBAAmB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,wDAAwD,yBAAyB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,2DAA2D,yBAAyB;AACpF;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA,yGAAyG,uDAAuD;AAChK,kFAAkF,0BAA0B;AAC5G,kHAAkH,0BAA0B;AAC5I,wFAAwF,0BAA0B;AAClH;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA,qGAAqG,mCAAmC;AACxI;AACA;AACA,+BAA+B,mCAAmC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE,iBAAiB;AACjB,KAAK;AACL,+BAA+B,aAAa;AAC5C,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD,gCAAgC,UAAU,kGAAkG,IAAI;AAChJ,oCAAoC,2BAA2B;AAC/D;AACA;AACA;AACA;AACA,iBAAiB;AACjB,KAAK;AACL,+BAA+B,aAAa;AAC5C,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oCAAoC;AAC3E,2CAA2C,YAAY;AACvD,iBAAiB;AACjB,KAAK;AACL,+BAA+B,aAAa;AAC5C,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA,4BAA4B,8CAA8C;AAC1E,sBAAsB,kCAAkC;AACxD;AACA,mBAAmB,4BAA4B;AAC/C,oBAAoB,8BAA8B;AAClD;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA,CAAC","sources":["webpack://@padloc/pwa/../app/node_modules/jsqr/dist/jsQR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"jsQR\"] = factory();\n\telse\n\t\troot[\"jsQR\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix = /** @class */ (function () {\n function BitMatrix(data, width) {\n this.width = width;\n this.height = data.length / width;\n this.data = data;\n }\n BitMatrix.createEmpty = function (width, height) {\n return new BitMatrix(new Uint8ClampedArray(width * height), width);\n };\n BitMatrix.prototype.get = function (x, y) {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) {\n return false;\n }\n return !!this.data[y * this.width + x];\n };\n BitMatrix.prototype.set = function (x, y, v) {\n this.data[y * this.width + x] = v ? 1 : 0;\n };\n BitMatrix.prototype.setRegion = function (left, top, width, height, v) {\n for (var y = top; y < top + height; y++) {\n for (var x = left; x < left + width; x++) {\n this.set(x, y, !!v);\n }\n }\n };\n return BitMatrix;\n}());\nexports.BitMatrix = BitMatrix;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGFPoly_1 = __webpack_require__(2);\nfunction addOrSubtractGF(a, b) {\n return a ^ b; // tslint:disable-line:no-bitwise\n}\nexports.addOrSubtractGF = addOrSubtractGF;\nvar GenericGF = /** @class */ (function () {\n function GenericGF(primitive, size, genBase) {\n this.primitive = primitive;\n this.size = size;\n this.generatorBase = genBase;\n this.expTable = new Array(this.size);\n this.logTable = new Array(this.size);\n var x = 1;\n for (var i = 0; i < this.size; i++) {\n this.expTable[i] = x;\n x = x * 2;\n if (x >= this.size) {\n x = (x ^ this.primitive) & (this.size - 1); // tslint:disable-line:no-bitwise\n }\n }\n for (var i = 0; i < this.size - 1; i++) {\n this.logTable[this.expTable[i]] = i;\n }\n this.zero = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([0]));\n this.one = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([1]));\n }\n GenericGF.prototype.multiply = function (a, b) {\n if (a === 0 || b === 0) {\n return 0;\n }\n return this.expTable[(this.logTable[a] + this.logTable[b]) % (this.size - 1)];\n };\n GenericGF.prototype.inverse = function (a) {\n if (a === 0) {\n throw new Error(\"Can't invert 0\");\n }\n return this.expTable[this.size - this.logTable[a] - 1];\n };\n GenericGF.prototype.buildMonomial = function (degree, coefficient) {\n if (degree < 0) {\n throw new Error(\"Invalid monomial degree less than 0\");\n }\n if (coefficient === 0) {\n return this.zero;\n }\n var coefficients = new Uint8ClampedArray(degree + 1);\n coefficients[0] = coefficient;\n return new GenericGFPoly_1.default(this, coefficients);\n };\n GenericGF.prototype.log = function (a) {\n if (a === 0) {\n throw new Error(\"Can't take log(0)\");\n }\n return this.logTable[a];\n };\n GenericGF.prototype.exp = function (a) {\n return this.expTable[a];\n };\n return GenericGF;\n}());\nexports.default = GenericGF;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGF_1 = __webpack_require__(1);\nvar GenericGFPoly = /** @class */ (function () {\n function GenericGFPoly(field, coefficients) {\n if (coefficients.length === 0) {\n throw new Error(\"No coefficients.\");\n }\n this.field = field;\n var coefficientsLength = coefficients.length;\n if (coefficientsLength > 1 && coefficients[0] === 0) {\n // Leading term must be non-zero for anything except the constant polynomial \"0\"\n var firstNonZero = 1;\n while (firstNonZero < coefficientsLength && coefficients[firstNonZero] === 0) {\n firstNonZero++;\n }\n if (firstNonZero === coefficientsLength) {\n this.coefficients = field.zero.coefficients;\n }\n else {\n this.coefficients = new Uint8ClampedArray(coefficientsLength - firstNonZero);\n for (var i = 0; i < this.coefficients.length; i++) {\n this.coefficients[i] = coefficients[firstNonZero + i];\n }\n }\n }\n else {\n this.coefficients = coefficients;\n }\n }\n GenericGFPoly.prototype.degree = function () {\n return this.coefficients.length - 1;\n };\n GenericGFPoly.prototype.isZero = function () {\n return this.coefficients[0] === 0;\n };\n GenericGFPoly.prototype.getCoefficient = function (degree) {\n return this.coefficients[this.coefficients.length - 1 - degree];\n };\n GenericGFPoly.prototype.addOrSubtract = function (other) {\n if (this.isZero()) {\n return other;\n }\n if (other.isZero()) {\n return this;\n }\n var smallerCoefficients = this.coefficients;\n var largerCoefficients = other.coefficients;\n if (smallerCoefficients.length > largerCoefficients.length) {\n _a = [largerCoefficients, smallerCoefficients], smallerCoefficients = _a[0], largerCoefficients = _a[1];\n }\n var sumDiff = new Uint8ClampedArray(largerCoefficients.length);\n var lengthDiff = largerCoefficients.length - smallerCoefficients.length;\n for (var i = 0; i < lengthDiff; i++) {\n sumDiff[i] = largerCoefficients[i];\n }\n for (var i = lengthDiff; i < largerCoefficients.length; i++) {\n sumDiff[i] = GenericGF_1.addOrSubtractGF(smallerCoefficients[i - lengthDiff], largerCoefficients[i]);\n }\n return new GenericGFPoly(this.field, sumDiff);\n var _a;\n };\n GenericGFPoly.prototype.multiply = function (scalar) {\n if (scalar === 0) {\n return this.field.zero;\n }\n if (scalar === 1) {\n return this;\n }\n var size = this.coefficients.length;\n var product = new Uint8ClampedArray(size);\n for (var i = 0; i < size; i++) {\n product[i] = this.field.multiply(this.coefficients[i], scalar);\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.multiplyPoly = function (other) {\n if (this.isZero() || other.isZero()) {\n return this.field.zero;\n }\n var aCoefficients = this.coefficients;\n var aLength = aCoefficients.length;\n var bCoefficients = other.coefficients;\n var bLength = bCoefficients.length;\n var product = new Uint8ClampedArray(aLength + bLength - 1);\n for (var i = 0; i < aLength; i++) {\n var aCoeff = aCoefficients[i];\n for (var j = 0; j < bLength; j++) {\n product[i + j] = GenericGF_1.addOrSubtractGF(product[i + j], this.field.multiply(aCoeff, bCoefficients[j]));\n }\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.multiplyByMonomial = function (degree, coefficient) {\n if (degree < 0) {\n throw new Error(\"Invalid degree less than 0\");\n }\n if (coefficient === 0) {\n return this.field.zero;\n }\n var size = this.coefficients.length;\n var product = new Uint8ClampedArray(size + degree);\n for (var i = 0; i < size; i++) {\n product[i] = this.field.multiply(this.coefficients[i], coefficient);\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.evaluateAt = function (a) {\n var result = 0;\n if (a === 0) {\n // Just return the x^0 coefficient\n return this.getCoefficient(0);\n }\n var size = this.coefficients.length;\n if (a === 1) {\n // Just the sum of the coefficients\n this.coefficients.forEach(function (coefficient) {\n result = GenericGF_1.addOrSubtractGF(result, coefficient);\n });\n return result;\n }\n result = this.coefficients[0];\n for (var i = 1; i < size; i++) {\n result = GenericGF_1.addOrSubtractGF(this.field.multiply(a, result), this.coefficients[i]);\n }\n return result;\n };\n return GenericGFPoly;\n}());\nexports.default = GenericGFPoly;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar binarizer_1 = __webpack_require__(4);\nvar decoder_1 = __webpack_require__(5);\nvar extractor_1 = __webpack_require__(11);\nvar locator_1 = __webpack_require__(12);\nfunction scan(matrix) {\n var location = locator_1.locate(matrix);\n if (!location) {\n return null;\n }\n var extracted = extractor_1.extract(matrix, location);\n var decoded = decoder_1.decode(extracted.matrix);\n if (!decoded) {\n return null;\n }\n return {\n binaryData: decoded.bytes,\n data: decoded.text,\n chunks: decoded.chunks,\n location: {\n topRightCorner: extracted.mappingFunction(location.dimension, 0),\n topLeftCorner: extracted.mappingFunction(0, 0),\n bottomRightCorner: extracted.mappingFunction(location.dimension, location.dimension),\n bottomLeftCorner: extracted.mappingFunction(0, location.dimension),\n topRightFinderPattern: location.topRight,\n topLeftFinderPattern: location.topLeft,\n bottomLeftFinderPattern: location.bottomLeft,\n bottomRightAlignmentPattern: location.alignmentPattern,\n },\n };\n}\nvar defaultOptions = {\n inversionAttempts: \"attemptBoth\",\n};\nfunction jsQR(data, width, height, providedOptions) {\n if (providedOptions === void 0) { providedOptions = {}; }\n var options = defaultOptions;\n Object.keys(options || {}).forEach(function (opt) {\n options[opt] = providedOptions[opt] || options[opt];\n });\n var shouldInvert = options.inversionAttempts === \"attemptBoth\" || options.inversionAttempts === \"invertFirst\";\n var tryInvertedFirst = options.inversionAttempts === \"onlyInvert\" || options.inversionAttempts === \"invertFirst\";\n var _a = binarizer_1.binarize(data, width, height, shouldInvert), binarized = _a.binarized, inverted = _a.inverted;\n var result = scan(tryInvertedFirst ? inverted : binarized);\n if (!result && (options.inversionAttempts === \"attemptBoth\" || options.inversionAttempts === \"invertFirst\")) {\n result = scan(tryInvertedFirst ? binarized : inverted);\n }\n return result;\n}\njsQR.default = jsQR;\nexports.default = jsQR;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nvar REGION_SIZE = 8;\nvar MIN_DYNAMIC_RANGE = 24;\nfunction numBetween(value, min, max) {\n return value < min ? min : value > max ? max : value;\n}\n// Like BitMatrix but accepts arbitry Uint8 values\nvar Matrix = /** @class */ (function () {\n function Matrix(width, height) {\n this.width = width;\n this.data = new Uint8ClampedArray(width * height);\n }\n Matrix.prototype.get = function (x, y) {\n return this.data[y * this.width + x];\n };\n Matrix.prototype.set = function (x, y, value) {\n this.data[y * this.width + x] = value;\n };\n return Matrix;\n}());\nfunction binarize(data, width, height, returnInverted) {\n if (data.length !== width * height * 4) {\n throw new Error(\"Malformed data passed to binarizer.\");\n }\n // Convert image to greyscale\n var greyscalePixels = new Matrix(width, height);\n for (var x = 0; x < width; x++) {\n for (var y = 0; y < height; y++) {\n var r = data[((y * width + x) * 4) + 0];\n var g = data[((y * width + x) * 4) + 1];\n var b = data[((y * width + x) * 4) + 2];\n greyscalePixels.set(x, y, 0.2126 * r + 0.7152 * g + 0.0722 * b);\n }\n }\n var horizontalRegionCount = Math.ceil(width / REGION_SIZE);\n var verticalRegionCount = Math.ceil(height / REGION_SIZE);\n var blackPoints = new Matrix(horizontalRegionCount, verticalRegionCount);\n for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) {\n for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) {\n var sum = 0;\n var min = Infinity;\n var max = 0;\n for (var y = 0; y < REGION_SIZE; y++) {\n for (var x = 0; x < REGION_SIZE; x++) {\n var pixelLumosity = greyscalePixels.get(hortizontalRegion * REGION_SIZE + x, verticalRegion * REGION_SIZE + y);\n sum += pixelLumosity;\n min = Math.min(min, pixelLumosity);\n max = Math.max(max, pixelLumosity);\n }\n }\n var average = sum / (Math.pow(REGION_SIZE, 2));\n if (max - min <= MIN_DYNAMIC_RANGE) {\n // If variation within the block is low, assume this is a block with only light or only\n // dark pixels. In that case we do not want to use the average, as it would divide this\n // low contrast area into black and white pixels, essentially creating data out of noise.\n //\n // Default the blackpoint for these blocks to be half the min - effectively white them out\n average = min / 2;\n if (verticalRegion > 0 && hortizontalRegion > 0) {\n // Correct the \"white background\" assumption for blocks that have neighbors by comparing\n // the pixels in this block to the previously calculated black points. This is based on\n // the fact that dark barcode symbology is always surrounded by some amount of light\n // background for which reasonable black point estimates were made. The bp estimated at\n // the boundaries is used for the interior.\n // The (min < bp) is arbitrary but works better than other heuristics that were tried.\n var averageNeighborBlackPoint = (blackPoints.get(hortizontalRegion, verticalRegion - 1) +\n (2 * blackPoints.get(hortizontalRegion - 1, verticalRegion)) +\n blackPoints.get(hortizontalRegion - 1, verticalRegion - 1)) / 4;\n if (min < averageNeighborBlackPoint) {\n average = averageNeighborBlackPoint;\n }\n }\n }\n blackPoints.set(hortizontalRegion, verticalRegion, average);\n }\n }\n var binarized = BitMatrix_1.BitMatrix.createEmpty(width, height);\n var inverted = null;\n if (returnInverted) {\n inverted = BitMatrix_1.BitMatrix.createEmpty(width, height);\n }\n for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) {\n for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) {\n var left = numBetween(hortizontalRegion, 2, horizontalRegionCount - 3);\n var top_1 = numBetween(verticalRegion, 2, verticalRegionCount - 3);\n var sum = 0;\n for (var xRegion = -2; xRegion <= 2; xRegion++) {\n for (var yRegion = -2; yRegion <= 2; yRegion++) {\n sum += blackPoints.get(left + xRegion, top_1 + yRegion);\n }\n }\n var threshold = sum / 25;\n for (var xRegion = 0; xRegion < REGION_SIZE; xRegion++) {\n for (var yRegion = 0; yRegion < REGION_SIZE; yRegion++) {\n var x = hortizontalRegion * REGION_SIZE + xRegion;\n var y = verticalRegion * REGION_SIZE + yRegion;\n var lum = greyscalePixels.get(x, y);\n binarized.set(x, y, lum <= threshold);\n if (returnInverted) {\n inverted.set(x, y, !(lum <= threshold));\n }\n }\n }\n }\n }\n if (returnInverted) {\n return { binarized: binarized, inverted: inverted };\n }\n return { binarized: binarized };\n}\nexports.binarize = binarize;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nvar decodeData_1 = __webpack_require__(6);\nvar reedsolomon_1 = __webpack_require__(9);\nvar version_1 = __webpack_require__(10);\n// tslint:disable:no-bitwise\nfunction numBitsDiffering(x, y) {\n var z = x ^ y;\n var bitCount = 0;\n while (z) {\n bitCount++;\n z &= z - 1;\n }\n return bitCount;\n}\nfunction pushBit(bit, byte) {\n return (byte << 1) | bit;\n}\n// tslint:enable:no-bitwise\nvar FORMAT_INFO_TABLE = [\n { bits: 0x5412, formatInfo: { errorCorrectionLevel: 1, dataMask: 0 } },\n { bits: 0x5125, formatInfo: { errorCorrectionLevel: 1, dataMask: 1 } },\n { bits: 0x5E7C, formatInfo: { errorCorrectionLevel: 1, dataMask: 2 } },\n { bits: 0x5B4B, formatInfo: { errorCorrectionLevel: 1, dataMask: 3 } },\n { bits: 0x45F9, formatInfo: { errorCorrectionLevel: 1, dataMask: 4 } },\n { bits: 0x40CE, formatInfo: { errorCorrectionLevel: 1, dataMask: 5 } },\n { bits: 0x4F97, formatInfo: { errorCorrectionLevel: 1, dataMask: 6 } },\n { bits: 0x4AA0, formatInfo: { errorCorrectionLevel: 1, dataMask: 7 } },\n { bits: 0x77C4, formatInfo: { errorCorrectionLevel: 0, dataMask: 0 } },\n { bits: 0x72F3, formatInfo: { errorCorrectionLevel: 0, dataMask: 1 } },\n { bits: 0x7DAA, formatInfo: { errorCorrectionLevel: 0, dataMask: 2 } },\n { bits: 0x789D, formatInfo: { errorCorrectionLevel: 0, dataMask: 3 } },\n { bits: 0x662F, formatInfo: { errorCorrectionLevel: 0, dataMask: 4 } },\n { bits: 0x6318, formatInfo: { errorCorrectionLevel: 0, dataMask: 5 } },\n { bits: 0x6C41, formatInfo: { errorCorrectionLevel: 0, dataMask: 6 } },\n { bits: 0x6976, formatInfo: { errorCorrectionLevel: 0, dataMask: 7 } },\n { bits: 0x1689, formatInfo: { errorCorrectionLevel: 3, dataMask: 0 } },\n { bits: 0x13BE, formatInfo: { errorCorrectionLevel: 3, dataMask: 1 } },\n { bits: 0x1CE7, formatInfo: { errorCorrectionLevel: 3, dataMask: 2 } },\n { bits: 0x19D0, formatInfo: { errorCorrectionLevel: 3, dataMask: 3 } },\n { bits: 0x0762, formatInfo: { errorCorrectionLevel: 3, dataMask: 4 } },\n { bits: 0x0255, formatInfo: { errorCorrectionLevel: 3, dataMask: 5 } },\n { bits: 0x0D0C, formatInfo: { errorCorrectionLevel: 3, dataMask: 6 } },\n { bits: 0x083B, formatInfo: { errorCorrectionLevel: 3, dataMask: 7 } },\n { bits: 0x355F, formatInfo: { errorCorrectionLevel: 2, dataMask: 0 } },\n { bits: 0x3068, formatInfo: { errorCorrectionLevel: 2, dataMask: 1 } },\n { bits: 0x3F31, formatInfo: { errorCorrectionLevel: 2, dataMask: 2 } },\n { bits: 0x3A06, formatInfo: { errorCorrectionLevel: 2, dataMask: 3 } },\n { bits: 0x24B4, formatInfo: { errorCorrectionLevel: 2, dataMask: 4 } },\n { bits: 0x2183, formatInfo: { errorCorrectionLevel: 2, dataMask: 5 } },\n { bits: 0x2EDA, formatInfo: { errorCorrectionLevel: 2, dataMask: 6 } },\n { bits: 0x2BED, formatInfo: { errorCorrectionLevel: 2, dataMask: 7 } },\n];\nvar DATA_MASKS = [\n function (p) { return ((p.y + p.x) % 2) === 0; },\n function (p) { return (p.y % 2) === 0; },\n function (p) { return p.x % 3 === 0; },\n function (p) { return (p.y + p.x) % 3 === 0; },\n function (p) { return (Math.floor(p.y / 2) + Math.floor(p.x / 3)) % 2 === 0; },\n function (p) { return ((p.x * p.y) % 2) + ((p.x * p.y) % 3) === 0; },\n function (p) { return ((((p.y * p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },\n function (p) { return ((((p.y + p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },\n];\nfunction buildFunctionPatternMask(version) {\n var dimension = 17 + 4 * version.versionNumber;\n var matrix = BitMatrix_1.BitMatrix.createEmpty(dimension, dimension);\n matrix.setRegion(0, 0, 9, 9, true); // Top left finder pattern + separator + format\n matrix.setRegion(dimension - 8, 0, 8, 9, true); // Top right finder pattern + separator + format\n matrix.setRegion(0, dimension - 8, 9, 8, true); // Bottom left finder pattern + separator + format\n // Alignment patterns\n for (var _i = 0, _a = version.alignmentPatternCenters; _i < _a.length; _i++) {\n var x = _a[_i];\n for (var _b = 0, _c = version.alignmentPatternCenters; _b < _c.length; _b++) {\n var y = _c[_b];\n if (!(x === 6 && y === 6 || x === 6 && y === dimension - 7 || x === dimension - 7 && y === 6)) {\n matrix.setRegion(x - 2, y - 2, 5, 5, true);\n }\n }\n }\n matrix.setRegion(6, 9, 1, dimension - 17, true); // Vertical timing pattern\n matrix.setRegion(9, 6, dimension - 17, 1, true); // Horizontal timing pattern\n if (version.versionNumber > 6) {\n matrix.setRegion(dimension - 11, 0, 3, 6, true); // Version info, top right\n matrix.setRegion(0, dimension - 11, 6, 3, true); // Version info, bottom left\n }\n return matrix;\n}\nfunction readCodewords(matrix, version, formatInfo) {\n var dataMask = DATA_MASKS[formatInfo.dataMask];\n var dimension = matrix.height;\n var functionPatternMask = buildFunctionPatternMask(version);\n var codewords = [];\n var currentByte = 0;\n var bitsRead = 0;\n // Read columns in pairs, from right to left\n var readingUp = true;\n for (var columnIndex = dimension - 1; columnIndex > 0; columnIndex -= 2) {\n if (columnIndex === 6) {\n columnIndex--;\n }\n for (var i = 0; i < dimension; i++) {\n var y = readingUp ? dimension - 1 - i : i;\n for (var columnOffset = 0; columnOffset < 2; columnOffset++) {\n var x = columnIndex - columnOffset;\n if (!functionPatternMask.get(x, y)) {\n bitsRead++;\n var bit = matrix.get(x, y);\n if (dataMask({ y: y, x: x })) {\n bit = !bit;\n }\n currentByte = pushBit(bit, currentByte);\n if (bitsRead === 8) {\n codewords.push(currentByte);\n bitsRead = 0;\n currentByte = 0;\n }\n }\n }\n }\n readingUp = !readingUp;\n }\n return codewords;\n}\nfunction readVersion(matrix) {\n var dimension = matrix.height;\n var provisionalVersion = Math.floor((dimension - 17) / 4);\n if (provisionalVersion <= 6) {\n return version_1.VERSIONS[provisionalVersion - 1];\n }\n var topRightVersionBits = 0;\n for (var y = 5; y >= 0; y--) {\n for (var x = dimension - 9; x >= dimension - 11; x--) {\n topRightVersionBits = pushBit(matrix.get(x, y), topRightVersionBits);\n }\n }\n var bottomLeftVersionBits = 0;\n for (var x = 5; x >= 0; x--) {\n for (var y = dimension - 9; y >= dimension - 11; y--) {\n bottomLeftVersionBits = pushBit(matrix.get(x, y), bottomLeftVersionBits);\n }\n }\n var bestDifference = Infinity;\n var bestVersion;\n for (var _i = 0, VERSIONS_1 = version_1.VERSIONS; _i < VERSIONS_1.length; _i++) {\n var version = VERSIONS_1[_i];\n if (version.infoBits === topRightVersionBits || version.infoBits === bottomLeftVersionBits) {\n return version;\n }\n var difference = numBitsDiffering(topRightVersionBits, version.infoBits);\n if (difference < bestDifference) {\n bestVersion = version;\n bestDifference = difference;\n }\n difference = numBitsDiffering(bottomLeftVersionBits, version.infoBits);\n if (difference < bestDifference) {\n bestVersion = version;\n bestDifference = difference;\n }\n }\n // We can tolerate up to 3 bits of error since no two version info codewords will\n // differ in less than 8 bits.\n if (bestDifference <= 3) {\n return bestVersion;\n }\n}\nfunction readFormatInformation(matrix) {\n var topLeftFormatInfoBits = 0;\n for (var x = 0; x <= 8; x++) {\n if (x !== 6) {\n topLeftFormatInfoBits = pushBit(matrix.get(x, 8), topLeftFormatInfoBits);\n }\n }\n for (var y = 7; y >= 0; y--) {\n if (y !== 6) {\n topLeftFormatInfoBits = pushBit(matrix.get(8, y), topLeftFormatInfoBits);\n }\n }\n var dimension = matrix.height;\n var topRightBottomRightFormatInfoBits = 0;\n for (var y = dimension - 1; y >= dimension - 7; y--) {\n topRightBottomRightFormatInfoBits = pushBit(matrix.get(8, y), topRightBottomRightFormatInfoBits);\n }\n for (var x = dimension - 8; x < dimension; x++) {\n topRightBottomRightFormatInfoBits = pushBit(matrix.get(x, 8), topRightBottomRightFormatInfoBits);\n }\n var bestDifference = Infinity;\n var bestFormatInfo = null;\n for (var _i = 0, FORMAT_INFO_TABLE_1 = FORMAT_INFO_TABLE; _i < FORMAT_INFO_TABLE_1.length; _i++) {\n var _a = FORMAT_INFO_TABLE_1[_i], bits = _a.bits, formatInfo = _a.formatInfo;\n if (bits === topLeftFormatInfoBits || bits === topRightBottomRightFormatInfoBits) {\n return formatInfo;\n }\n var difference = numBitsDiffering(topLeftFormatInfoBits, bits);\n if (difference < bestDifference) {\n bestFormatInfo = formatInfo;\n bestDifference = difference;\n }\n if (topLeftFormatInfoBits !== topRightBottomRightFormatInfoBits) {\n difference = numBitsDiffering(topRightBottomRightFormatInfoBits, bits);\n if (difference < bestDifference) {\n bestFormatInfo = formatInfo;\n bestDifference = difference;\n }\n }\n }\n // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits differing means we found a match\n if (bestDifference <= 3) {\n return bestFormatInfo;\n }\n return null;\n}\nfunction getDataBlocks(codewords, version, ecLevel) {\n var ecInfo = version.errorCorrectionLevels[ecLevel];\n var dataBlocks = [];\n var totalCodewords = 0;\n ecInfo.ecBlocks.forEach(function (block) {\n for (var i = 0; i < block.numBlocks; i++) {\n dataBlocks.push({ numDataCodewords: block.dataCodewordsPerBlock, codewords: [] });\n totalCodewords += block.dataCodewordsPerBlock + ecInfo.ecCodewordsPerBlock;\n }\n });\n // In some cases the QR code will be malformed enough that we pull off more or less than we should.\n // If we pull off less there's nothing we can do.\n // If we pull off more we can safely truncate\n if (codewords.length < totalCodewords) {\n return null;\n }\n codewords = codewords.slice(0, totalCodewords);\n var shortBlockSize = ecInfo.ecBlocks[0].dataCodewordsPerBlock;\n // Pull codewords to fill the blocks up to the minimum size\n for (var i = 0; i < shortBlockSize; i++) {\n for (var _i = 0, dataBlocks_1 = dataBlocks; _i < dataBlocks_1.length; _i++) {\n var dataBlock = dataBlocks_1[_i];\n dataBlock.codewords.push(codewords.shift());\n }\n }\n // If there are any large blocks, pull codewords to fill the last element of those\n if (ecInfo.ecBlocks.length > 1) {\n var smallBlockCount = ecInfo.ecBlocks[0].numBlocks;\n var largeBlockCount = ecInfo.ecBlocks[1].numBlocks;\n for (var i = 0; i < largeBlockCount; i++) {\n dataBlocks[smallBlockCount + i].codewords.push(codewords.shift());\n }\n }\n // Add the rest of the codewords to the blocks. These are the error correction codewords.\n while (codewords.length > 0) {\n for (var _a = 0, dataBlocks_2 = dataBlocks; _a < dataBlocks_2.length; _a++) {\n var dataBlock = dataBlocks_2[_a];\n dataBlock.codewords.push(codewords.shift());\n }\n }\n return dataBlocks;\n}\nfunction decodeMatrix(matrix) {\n var version = readVersion(matrix);\n if (!version) {\n return null;\n }\n var formatInfo = readFormatInformation(matrix);\n if (!formatInfo) {\n return null;\n }\n var codewords = readCodewords(matrix, version, formatInfo);\n var dataBlocks = getDataBlocks(codewords, version, formatInfo.errorCorrectionLevel);\n if (!dataBlocks) {\n return null;\n }\n // Count total number of data bytes\n var totalBytes = dataBlocks.reduce(function (a, b) { return a + b.numDataCodewords; }, 0);\n var resultBytes = new Uint8ClampedArray(totalBytes);\n var resultIndex = 0;\n for (var _i = 0, dataBlocks_3 = dataBlocks; _i < dataBlocks_3.length; _i++) {\n var dataBlock = dataBlocks_3[_i];\n var correctedBytes = reedsolomon_1.decode(dataBlock.codewords, dataBlock.codewords.length - dataBlock.numDataCodewords);\n if (!correctedBytes) {\n return null;\n }\n for (var i = 0; i < dataBlock.numDataCodewords; i++) {\n resultBytes[resultIndex++] = correctedBytes[i];\n }\n }\n try {\n return decodeData_1.decode(resultBytes, version.versionNumber);\n }\n catch (_a) {\n return null;\n }\n}\nfunction decode(matrix) {\n if (matrix == null) {\n return null;\n }\n var result = decodeMatrix(matrix);\n if (result) {\n return result;\n }\n // Decoding didn't work, try mirroring the QR across the topLeft -> bottomRight line.\n for (var x = 0; x < matrix.width; x++) {\n for (var y = x + 1; y < matrix.height; y++) {\n if (matrix.get(x, y) !== matrix.get(y, x)) {\n matrix.set(x, y, !matrix.get(x, y));\n matrix.set(y, x, !matrix.get(y, x));\n }\n }\n }\n return decodeMatrix(matrix);\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:disable:no-bitwise\nvar BitStream_1 = __webpack_require__(7);\nvar shiftJISTable_1 = __webpack_require__(8);\nvar Mode;\n(function (Mode) {\n Mode[\"Numeric\"] = \"numeric\";\n Mode[\"Alphanumeric\"] = \"alphanumeric\";\n Mode[\"Byte\"] = \"byte\";\n Mode[\"Kanji\"] = \"kanji\";\n Mode[\"ECI\"] = \"eci\";\n})(Mode = exports.Mode || (exports.Mode = {}));\nvar ModeByte;\n(function (ModeByte) {\n ModeByte[ModeByte[\"Terminator\"] = 0] = \"Terminator\";\n ModeByte[ModeByte[\"Numeric\"] = 1] = \"Numeric\";\n ModeByte[ModeByte[\"Alphanumeric\"] = 2] = \"Alphanumeric\";\n ModeByte[ModeByte[\"Byte\"] = 4] = \"Byte\";\n ModeByte[ModeByte[\"Kanji\"] = 8] = \"Kanji\";\n ModeByte[ModeByte[\"ECI\"] = 7] = \"ECI\";\n // StructuredAppend = 0x3,\n // FNC1FirstPosition = 0x5,\n // FNC1SecondPosition = 0x9,\n})(ModeByte || (ModeByte = {}));\nfunction decodeNumeric(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [10, 12, 14][size];\n var length = stream.readBits(characterCountSize);\n // Read digits in groups of 3\n while (length >= 3) {\n var num = stream.readBits(10);\n if (num >= 1000) {\n throw new Error(\"Invalid numeric value above 999\");\n }\n var a = Math.floor(num / 100);\n var b = Math.floor(num / 10) % 10;\n var c = num % 10;\n bytes.push(48 + a, 48 + b, 48 + c);\n text += a.toString() + b.toString() + c.toString();\n length -= 3;\n }\n // If the number of digits aren't a multiple of 3, the remaining digits are special cased.\n if (length === 2) {\n var num = stream.readBits(7);\n if (num >= 100) {\n throw new Error(\"Invalid numeric value above 99\");\n }\n var a = Math.floor(num / 10);\n var b = num % 10;\n bytes.push(48 + a, 48 + b);\n text += a.toString() + b.toString();\n }\n else if (length === 1) {\n var num = stream.readBits(4);\n if (num >= 10) {\n throw new Error(\"Invalid numeric value above 9\");\n }\n bytes.push(48 + num);\n text += num.toString();\n }\n return { bytes: bytes, text: text };\n}\nvar AlphanumericCharacterCodes = [\n \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\",\n \"9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\",\n \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\",\n \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\",\n \" \", \"$\", \"%\", \"*\", \"+\", \"-\", \".\", \"/\", \":\",\n];\nfunction decodeAlphanumeric(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [9, 11, 13][size];\n var length = stream.readBits(characterCountSize);\n while (length >= 2) {\n var v = stream.readBits(11);\n var a = Math.floor(v / 45);\n var b = v % 45;\n bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0), AlphanumericCharacterCodes[b].charCodeAt(0));\n text += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b];\n length -= 2;\n }\n if (length === 1) {\n var a = stream.readBits(6);\n bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0));\n text += AlphanumericCharacterCodes[a];\n }\n return { bytes: bytes, text: text };\n}\nfunction decodeByte(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [8, 16, 16][size];\n var length = stream.readBits(characterCountSize);\n for (var i = 0; i < length; i++) {\n var b = stream.readBits(8);\n bytes.push(b);\n }\n try {\n text += decodeURIComponent(bytes.map(function (b) { return \"%\" + (\"0\" + b.toString(16)).substr(-2); }).join(\"\"));\n }\n catch (_a) {\n // failed to decode\n }\n return { bytes: bytes, text: text };\n}\nfunction decodeKanji(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [8, 10, 12][size];\n var length = stream.readBits(characterCountSize);\n for (var i = 0; i < length; i++) {\n var k = stream.readBits(13);\n var c = (Math.floor(k / 0xC0) << 8) | (k % 0xC0);\n if (c < 0x1F00) {\n c += 0x8140;\n }\n else {\n c += 0xC140;\n }\n bytes.push(c >> 8, c & 0xFF);\n text += String.fromCharCode(shiftJISTable_1.shiftJISTable[c]);\n }\n return { bytes: bytes, text: text };\n}\nfunction decode(data, version) {\n var stream = new BitStream_1.BitStream(data);\n // There are 3 'sizes' based on the version. 1-9 is small (0), 10-26 is medium (1) and 27-40 is large (2).\n var size = version <= 9 ? 0 : version <= 26 ? 1 : 2;\n var result = {\n text: \"\",\n bytes: [],\n chunks: [],\n };\n while (stream.available() >= 4) {\n var mode = stream.readBits(4);\n if (mode === ModeByte.Terminator) {\n return result;\n }\n else if (mode === ModeByte.ECI) {\n if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(7),\n });\n }\n else if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(14),\n });\n }\n else if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(21),\n });\n }\n else {\n // ECI data seems corrupted\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: -1,\n });\n }\n }\n else if (mode === ModeByte.Numeric) {\n var numericResult = decodeNumeric(stream, size);\n result.text += numericResult.text;\n (_a = result.bytes).push.apply(_a, numericResult.bytes);\n result.chunks.push({\n type: Mode.Numeric,\n text: numericResult.text,\n });\n }\n else if (mode === ModeByte.Alphanumeric) {\n var alphanumericResult = decodeAlphanumeric(stream, size);\n result.text += alphanumericResult.text;\n (_b = result.bytes).push.apply(_b, alphanumericResult.bytes);\n result.chunks.push({\n type: Mode.Alphanumeric,\n text: alphanumericResult.text,\n });\n }\n else if (mode === ModeByte.Byte) {\n var byteResult = decodeByte(stream, size);\n result.text += byteResult.text;\n (_c = result.bytes).push.apply(_c, byteResult.bytes);\n result.chunks.push({\n type: Mode.Byte,\n bytes: byteResult.bytes,\n text: byteResult.text,\n });\n }\n else if (mode === ModeByte.Kanji) {\n var kanjiResult = decodeKanji(stream, size);\n result.text += kanjiResult.text;\n (_d = result.bytes).push.apply(_d, kanjiResult.bytes);\n result.chunks.push({\n type: Mode.Kanji,\n bytes: kanjiResult.bytes,\n text: kanjiResult.text,\n });\n }\n }\n var _a, _b, _c, _d;\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// tslint:disable:no-bitwise\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitStream = /** @class */ (function () {\n function BitStream(bytes) {\n this.byteOffset = 0;\n this.bitOffset = 0;\n this.bytes = bytes;\n }\n BitStream.prototype.readBits = function (numBits) {\n if (numBits < 1 || numBits > 32 || numBits > this.available()) {\n throw new Error(\"Cannot read \" + numBits.toString() + \" bits\");\n }\n var result = 0;\n // First, read remainder from current byte\n if (this.bitOffset > 0) {\n var bitsLeft = 8 - this.bitOffset;\n var toRead = numBits < bitsLeft ? numBits : bitsLeft;\n var bitsToNotRead = bitsLeft - toRead;\n var mask = (0xFF >> (8 - toRead)) << bitsToNotRead;\n result = (this.bytes[this.byteOffset] & mask) >> bitsToNotRead;\n numBits -= toRead;\n this.bitOffset += toRead;\n if (this.bitOffset === 8) {\n this.bitOffset = 0;\n this.byteOffset++;\n }\n }\n // Next read whole bytes\n if (numBits > 0) {\n while (numBits >= 8) {\n result = (result << 8) | (this.bytes[this.byteOffset] & 0xFF);\n this.byteOffset++;\n numBits -= 8;\n }\n // Finally read a partial byte\n if (numBits > 0) {\n var bitsToNotRead = 8 - numBits;\n var mask = (0xFF >> bitsToNotRead) << bitsToNotRead;\n result = (result << numBits) | ((this.bytes[this.byteOffset] & mask) >> bitsToNotRead);\n this.bitOffset += numBits;\n }\n }\n return result;\n };\n BitStream.prototype.available = function () {\n return 8 * (this.bytes.length - this.byteOffset) - this.bitOffset;\n };\n return BitStream;\n}());\nexports.BitStream = BitStream;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.shiftJISTable = {\n 0x20: 0x0020,\n 0x21: 0x0021,\n 0x22: 0x0022,\n 0x23: 0x0023,\n 0x24: 0x0024,\n 0x25: 0x0025,\n 0x26: 0x0026,\n 0x27: 0x0027,\n 0x28: 0x0028,\n 0x29: 0x0029,\n 0x2A: 0x002A,\n 0x2B: 0x002B,\n 0x2C: 0x002C,\n 0x2D: 0x002D,\n 0x2E: 0x002E,\n 0x2F: 0x002F,\n 0x30: 0x0030,\n 0x31: 0x0031,\n 0x32: 0x0032,\n 0x33: 0x0033,\n 0x34: 0x0034,\n 0x35: 0x0035,\n 0x36: 0x0036,\n 0x37: 0x0037,\n 0x38: 0x0038,\n 0x39: 0x0039,\n 0x3A: 0x003A,\n 0x3B: 0x003B,\n 0x3C: 0x003C,\n 0x3D: 0x003D,\n 0x3E: 0x003E,\n 0x3F: 0x003F,\n 0x40: 0x0040,\n 0x41: 0x0041,\n 0x42: 0x0042,\n 0x43: 0x0043,\n 0x44: 0x0044,\n 0x45: 0x0045,\n 0x46: 0x0046,\n 0x47: 0x0047,\n 0x48: 0x0048,\n 0x49: 0x0049,\n 0x4A: 0x004A,\n 0x4B: 0x004B,\n 0x4C: 0x004C,\n 0x4D: 0x004D,\n 0x4E: 0x004E,\n 0x4F: 0x004F,\n 0x50: 0x0050,\n 0x51: 0x0051,\n 0x52: 0x0052,\n 0x53: 0x0053,\n 0x54: 0x0054,\n 0x55: 0x0055,\n 0x56: 0x0056,\n 0x57: 0x0057,\n 0x58: 0x0058,\n 0x59: 0x0059,\n 0x5A: 0x005A,\n 0x5B: 0x005B,\n 0x5C: 0x00A5,\n 0x5D: 0x005D,\n 0x5E: 0x005E,\n 0x5F: 0x005F,\n 0x60: 0x0060,\n 0x61: 0x0061,\n 0x62: 0x0062,\n 0x63: 0x0063,\n 0x64: 0x0064,\n 0x65: 0x0065,\n 0x66: 0x0066,\n 0x67: 0x0067,\n 0x68: 0x0068,\n 0x69: 0x0069,\n 0x6A: 0x006A,\n 0x6B: 0x006B,\n 0x6C: 0x006C,\n 0x6D: 0x006D,\n 0x6E: 0x006E,\n 0x6F: 0x006F,\n 0x70: 0x0070,\n 0x71: 0x0071,\n 0x72: 0x0072,\n 0x73: 0x0073,\n 0x74: 0x0074,\n 0x75: 0x0075,\n 0x76: 0x0076,\n 0x77: 0x0077,\n 0x78: 0x0078,\n 0x79: 0x0079,\n 0x7A: 0x007A,\n 0x7B: 0x007B,\n 0x7C: 0x007C,\n 0x7D: 0x007D,\n 0x7E: 0x203E,\n 0x8140: 0x3000,\n 0x8141: 0x3001,\n 0x8142: 0x3002,\n 0x8143: 0xFF0C,\n 0x8144: 0xFF0E,\n 0x8145: 0x30FB,\n 0x8146: 0xFF1A,\n 0x8147: 0xFF1B,\n 0x8148: 0xFF1F,\n 0x8149: 0xFF01,\n 0x814A: 0x309B,\n 0x814B: 0x309C,\n 0x814C: 0x00B4,\n 0x814D: 0xFF40,\n 0x814E: 0x00A8,\n 0x814F: 0xFF3E,\n 0x8150: 0xFFE3,\n 0x8151: 0xFF3F,\n 0x8152: 0x30FD,\n 0x8153: 0x30FE,\n 0x8154: 0x309D,\n 0x8155: 0x309E,\n 0x8156: 0x3003,\n 0x8157: 0x4EDD,\n 0x8158: 0x3005,\n 0x8159: 0x3006,\n 0x815A: 0x3007,\n 0x815B: 0x30FC,\n 0x815C: 0x2015,\n 0x815D: 0x2010,\n 0x815E: 0xFF0F,\n 0x815F: 0x005C,\n 0x8160: 0x301C,\n 0x8161: 0x2016,\n 0x8162: 0xFF5C,\n 0x8163: 0x2026,\n 0x8164: 0x2025,\n 0x8165: 0x2018,\n 0x8166: 0x2019,\n 0x8167: 0x201C,\n 0x8168: 0x201D,\n 0x8169: 0xFF08,\n 0x816A: 0xFF09,\n 0x816B: 0x3014,\n 0x816C: 0x3015,\n 0x816D: 0xFF3B,\n 0x816E: 0xFF3D,\n 0x816F: 0xFF5B,\n 0x8170: 0xFF5D,\n 0x8171: 0x3008,\n 0x8172: 0x3009,\n 0x8173: 0x300A,\n 0x8174: 0x300B,\n 0x8175: 0x300C,\n 0x8176: 0x300D,\n 0x8177: 0x300E,\n 0x8178: 0x300F,\n 0x8179: 0x3010,\n 0x817A: 0x3011,\n 0x817B: 0xFF0B,\n 0x817C: 0x2212,\n 0x817D: 0x00B1,\n 0x817E: 0x00D7,\n 0x8180: 0x00F7,\n 0x8181: 0xFF1D,\n 0x8182: 0x2260,\n 0x8183: 0xFF1C,\n 0x8184: 0xFF1E,\n 0x8185: 0x2266,\n 0x8186: 0x2267,\n 0x8187: 0x221E,\n 0x8188: 0x2234,\n 0x8189: 0x2642,\n 0x818A: 0x2640,\n 0x818B: 0x00B0,\n 0x818C: 0x2032,\n 0x818D: 0x2033,\n 0x818E: 0x2103,\n 0x818F: 0xFFE5,\n 0x8190: 0xFF04,\n 0x8191: 0x00A2,\n 0x8192: 0x00A3,\n 0x8193: 0xFF05,\n 0x8194: 0xFF03,\n 0x8195: 0xFF06,\n 0x8196: 0xFF0A,\n 0x8197: 0xFF20,\n 0x8198: 0x00A7,\n 0x8199: 0x2606,\n 0x819A: 0x2605,\n 0x819B: 0x25CB,\n 0x819C: 0x25CF,\n 0x819D: 0x25CE,\n 0x819E: 0x25C7,\n 0x819F: 0x25C6,\n 0x81A0: 0x25A1,\n 0x81A1: 0x25A0,\n 0x81A2: 0x25B3,\n 0x81A3: 0x25B2,\n 0x81A4: 0x25BD,\n 0x81A5: 0x25BC,\n 0x81A6: 0x203B,\n 0x81A7: 0x3012,\n 0x81A8: 0x2192,\n 0x81A9: 0x2190,\n 0x81AA: 0x2191,\n 0x81AB: 0x2193,\n 0x81AC: 0x3013,\n 0x81B8: 0x2208,\n 0x81B9: 0x220B,\n 0x81BA: 0x2286,\n 0x81BB: 0x2287,\n 0x81BC: 0x2282,\n 0x81BD: 0x2283,\n 0x81BE: 0x222A,\n 0x81BF: 0x2229,\n 0x81C8: 0x2227,\n 0x81C9: 0x2228,\n 0x81CA: 0x00AC,\n 0x81CB: 0x21D2,\n 0x81CC: 0x21D4,\n 0x81CD: 0x2200,\n 0x81CE: 0x2203,\n 0x81DA: 0x2220,\n 0x81DB: 0x22A5,\n 0x81DC: 0x2312,\n 0x81DD: 0x2202,\n 0x81DE: 0x2207,\n 0x81DF: 0x2261,\n 0x81E0: 0x2252,\n 0x81E1: 0x226A,\n 0x81E2: 0x226B,\n 0x81E3: 0x221A,\n 0x81E4: 0x223D,\n 0x81E5: 0x221D,\n 0x81E6: 0x2235,\n 0x81E7: 0x222B,\n 0x81E8: 0x222C,\n 0x81F0: 0x212B,\n 0x81F1: 0x2030,\n 0x81F2: 0x266F,\n 0x81F3: 0x266D,\n 0x81F4: 0x266A,\n 0x81F5: 0x2020,\n 0x81F6: 0x2021,\n 0x81F7: 0x00B6,\n 0x81FC: 0x25EF,\n 0x824F: 0xFF10,\n 0x8250: 0xFF11,\n 0x8251: 0xFF12,\n 0x8252: 0xFF13,\n 0x8253: 0xFF14,\n 0x8254: 0xFF15,\n 0x8255: 0xFF16,\n 0x8256: 0xFF17,\n 0x8257: 0xFF18,\n 0x8258: 0xFF19,\n 0x8260: 0xFF21,\n 0x8261: 0xFF22,\n 0x8262: 0xFF23,\n 0x8263: 0xFF24,\n 0x8264: 0xFF25,\n 0x8265: 0xFF26,\n 0x8266: 0xFF27,\n 0x8267: 0xFF28,\n 0x8268: 0xFF29,\n 0x8269: 0xFF2A,\n 0x826A: 0xFF2B,\n 0x826B: 0xFF2C,\n 0x826C: 0xFF2D,\n 0x826D: 0xFF2E,\n 0x826E: 0xFF2F,\n 0x826F: 0xFF30,\n 0x8270: 0xFF31,\n 0x8271: 0xFF32,\n 0x8272: 0xFF33,\n 0x8273: 0xFF34,\n 0x8274: 0xFF35,\n 0x8275: 0xFF36,\n 0x8276: 0xFF37,\n 0x8277: 0xFF38,\n 0x8278: 0xFF39,\n 0x8279: 0xFF3A,\n 0x8281: 0xFF41,\n 0x8282: 0xFF42,\n 0x8283: 0xFF43,\n 0x8284: 0xFF44,\n 0x8285: 0xFF45,\n 0x8286: 0xFF46,\n 0x8287: 0xFF47,\n 0x8288: 0xFF48,\n 0x8289: 0xFF49,\n 0x828A: 0xFF4A,\n 0x828B: 0xFF4B,\n 0x828C: 0xFF4C,\n 0x828D: 0xFF4D,\n 0x828E: 0xFF4E,\n 0x828F: 0xFF4F,\n 0x8290: 0xFF50,\n 0x8291: 0xFF51,\n 0x8292: 0xFF52,\n 0x8293: 0xFF53,\n 0x8294: 0xFF54,\n 0x8295: 0xFF55,\n 0x8296: 0xFF56,\n 0x8297: 0xFF57,\n 0x8298: 0xFF58,\n 0x8299: 0xFF59,\n 0x829A: 0xFF5A,\n 0x829F: 0x3041,\n 0x82A0: 0x3042,\n 0x82A1: 0x3043,\n 0x82A2: 0x3044,\n 0x82A3: 0x3045,\n 0x82A4: 0x3046,\n 0x82A5: 0x3047,\n 0x82A6: 0x3048,\n 0x82A7: 0x3049,\n 0x82A8: 0x304A,\n 0x82A9: 0x304B,\n 0x82AA: 0x304C,\n 0x82AB: 0x304D,\n 0x82AC: 0x304E,\n 0x82AD: 0x304F,\n 0x82AE: 0x3050,\n 0x82AF: 0x3051,\n 0x82B0: 0x3052,\n 0x82B1: 0x3053,\n 0x82B2: 0x3054,\n 0x82B3: 0x3055,\n 0x82B4: 0x3056,\n 0x82B5: 0x3057,\n 0x82B6: 0x3058,\n 0x82B7: 0x3059,\n 0x82B8: 0x305A,\n 0x82B9: 0x305B,\n 0x82BA: 0x305C,\n 0x82BB: 0x305D,\n 0x82BC: 0x305E,\n 0x82BD: 0x305F,\n 0x82BE: 0x3060,\n 0x82BF: 0x3061,\n 0x82C0: 0x3062,\n 0x82C1: 0x3063,\n 0x82C2: 0x3064,\n 0x82C3: 0x3065,\n 0x82C4: 0x3066,\n 0x82C5: 0x3067,\n 0x82C6: 0x3068,\n 0x82C7: 0x3069,\n 0x82C8: 0x306A,\n 0x82C9: 0x306B,\n 0x82CA: 0x306C,\n 0x82CB: 0x306D,\n 0x82CC: 0x306E,\n 0x82CD: 0x306F,\n 0x82CE: 0x3070,\n 0x82CF: 0x3071,\n 0x82D0: 0x3072,\n 0x82D1: 0x3073,\n 0x82D2: 0x3074,\n 0x82D3: 0x3075,\n 0x82D4: 0x3076,\n 0x82D5: 0x3077,\n 0x82D6: 0x3078,\n 0x82D7: 0x3079,\n 0x82D8: 0x307A,\n 0x82D9: 0x307B,\n 0x82DA: 0x307C,\n 0x82DB: 0x307D,\n 0x82DC: 0x307E,\n 0x82DD: 0x307F,\n 0x82DE: 0x3080,\n 0x82DF: 0x3081,\n 0x82E0: 0x3082,\n 0x82E1: 0x3083,\n 0x82E2: 0x3084,\n 0x82E3: 0x3085,\n 0x82E4: 0x3086,\n 0x82E5: 0x3087,\n 0x82E6: 0x3088,\n 0x82E7: 0x3089,\n 0x82E8: 0x308A,\n 0x82E9: 0x308B,\n 0x82EA: 0x308C,\n 0x82EB: 0x308D,\n 0x82EC: 0x308E,\n 0x82ED: 0x308F,\n 0x82EE: 0x3090,\n 0x82EF: 0x3091,\n 0x82F0: 0x3092,\n 0x82F1: 0x3093,\n 0x8340: 0x30A1,\n 0x8341: 0x30A2,\n 0x8342: 0x30A3,\n 0x8343: 0x30A4,\n 0x8344: 0x30A5,\n 0x8345: 0x30A6,\n 0x8346: 0x30A7,\n 0x8347: 0x30A8,\n 0x8348: 0x30A9,\n 0x8349: 0x30AA,\n 0x834A: 0x30AB,\n 0x834B: 0x30AC,\n 0x834C: 0x30AD,\n 0x834D: 0x30AE,\n 0x834E: 0x30AF,\n 0x834F: 0x30B0,\n 0x8350: 0x30B1,\n 0x8351: 0x30B2,\n 0x8352: 0x30B3,\n 0x8353: 0x30B4,\n 0x8354: 0x30B5,\n 0x8355: 0x30B6,\n 0x8356: 0x30B7,\n 0x8357: 0x30B8,\n 0x8358: 0x30B9,\n 0x8359: 0x30BA,\n 0x835A: 0x30BB,\n 0x835B: 0x30BC,\n 0x835C: 0x30BD,\n 0x835D: 0x30BE,\n 0x835E: 0x30BF,\n 0x835F: 0x30C0,\n 0x8360: 0x30C1,\n 0x8361: 0x30C2,\n 0x8362: 0x30C3,\n 0x8363: 0x30C4,\n 0x8364: 0x30C5,\n 0x8365: 0x30C6,\n 0x8366: 0x30C7,\n 0x8367: 0x30C8,\n 0x8368: 0x30C9,\n 0x8369: 0x30CA,\n 0x836A: 0x30CB,\n 0x836B: 0x30CC,\n 0x836C: 0x30CD,\n 0x836D: 0x30CE,\n 0x836E: 0x30CF,\n 0x836F: 0x30D0,\n 0x8370: 0x30D1,\n 0x8371: 0x30D2,\n 0x8372: 0x30D3,\n 0x8373: 0x30D4,\n 0x8374: 0x30D5,\n 0x8375: 0x30D6,\n 0x8376: 0x30D7,\n 0x8377: 0x30D8,\n 0x8378: 0x30D9,\n 0x8379: 0x30DA,\n 0x837A: 0x30DB,\n 0x837B: 0x30DC,\n 0x837C: 0x30DD,\n 0x837D: 0x30DE,\n 0x837E: 0x30DF,\n 0x8380: 0x30E0,\n 0x8381: 0x30E1,\n 0x8382: 0x30E2,\n 0x8383: 0x30E3,\n 0x8384: 0x30E4,\n 0x8385: 0x30E5,\n 0x8386: 0x30E6,\n 0x8387: 0x30E7,\n 0x8388: 0x30E8,\n 0x8389: 0x30E9,\n 0x838A: 0x30EA,\n 0x838B: 0x30EB,\n 0x838C: 0x30EC,\n 0x838D: 0x30ED,\n 0x838E: 0x30EE,\n 0x838F: 0x30EF,\n 0x8390: 0x30F0,\n 0x8391: 0x30F1,\n 0x8392: 0x30F2,\n 0x8393: 0x30F3,\n 0x8394: 0x30F4,\n 0x8395: 0x30F5,\n 0x8396: 0x30F6,\n 0x839F: 0x0391,\n 0x83A0: 0x0392,\n 0x83A1: 0x0393,\n 0x83A2: 0x0394,\n 0x83A3: 0x0395,\n 0x83A4: 0x0396,\n 0x83A5: 0x0397,\n 0x83A6: 0x0398,\n 0x83A7: 0x0399,\n 0x83A8: 0x039A,\n 0x83A9: 0x039B,\n 0x83AA: 0x039C,\n 0x83AB: 0x039D,\n 0x83AC: 0x039E,\n 0x83AD: 0x039F,\n 0x83AE: 0x03A0,\n 0x83AF: 0x03A1,\n 0x83B0: 0x03A3,\n 0x83B1: 0x03A4,\n 0x83B2: 0x03A5,\n 0x83B3: 0x03A6,\n 0x83B4: 0x03A7,\n 0x83B5: 0x03A8,\n 0x83B6: 0x03A9,\n 0x83BF: 0x03B1,\n 0x83C0: 0x03B2,\n 0x83C1: 0x03B3,\n 0x83C2: 0x03B4,\n 0x83C3: 0x03B5,\n 0x83C4: 0x03B6,\n 0x83C5: 0x03B7,\n 0x83C6: 0x03B8,\n 0x83C7: 0x03B9,\n 0x83C8: 0x03BA,\n 0x83C9: 0x03BB,\n 0x83CA: 0x03BC,\n 0x83CB: 0x03BD,\n 0x83CC: 0x03BE,\n 0x83CD: 0x03BF,\n 0x83CE: 0x03C0,\n 0x83CF: 0x03C1,\n 0x83D0: 0x03C3,\n 0x83D1: 0x03C4,\n 0x83D2: 0x03C5,\n 0x83D3: 0x03C6,\n 0x83D4: 0x03C7,\n 0x83D5: 0x03C8,\n 0x83D6: 0x03C9,\n 0x8440: 0x0410,\n 0x8441: 0x0411,\n 0x8442: 0x0412,\n 0x8443: 0x0413,\n 0x8444: 0x0414,\n 0x8445: 0x0415,\n 0x8446: 0x0401,\n 0x8447: 0x0416,\n 0x8448: 0x0417,\n 0x8449: 0x0418,\n 0x844A: 0x0419,\n 0x844B: 0x041A,\n 0x844C: 0x041B,\n 0x844D: 0x041C,\n 0x844E: 0x041D,\n 0x844F: 0x041E,\n 0x8450: 0x041F,\n 0x8451: 0x0420,\n 0x8452: 0x0421,\n 0x8453: 0x0422,\n 0x8454: 0x0423,\n 0x8455: 0x0424,\n 0x8456: 0x0425,\n 0x8457: 0x0426,\n 0x8458: 0x0427,\n 0x8459: 0x0428,\n 0x845A: 0x0429,\n 0x845B: 0x042A,\n 0x845C: 0x042B,\n 0x845D: 0x042C,\n 0x845E: 0x042D,\n 0x845F: 0x042E,\n 0x8460: 0x042F,\n 0x8470: 0x0430,\n 0x8471: 0x0431,\n 0x8472: 0x0432,\n 0x8473: 0x0433,\n 0x8474: 0x0434,\n 0x8475: 0x0435,\n 0x8476: 0x0451,\n 0x8477: 0x0436,\n 0x8478: 0x0437,\n 0x8479: 0x0438,\n 0x847A: 0x0439,\n 0x847B: 0x043A,\n 0x847C: 0x043B,\n 0x847D: 0x043C,\n 0x847E: 0x043D,\n 0x8480: 0x043E,\n 0x8481: 0x043F,\n 0x8482: 0x0440,\n 0x8483: 0x0441,\n 0x8484: 0x0442,\n 0x8485: 0x0443,\n 0x8486: 0x0444,\n 0x8487: 0x0445,\n 0x8488: 0x0446,\n 0x8489: 0x0447,\n 0x848A: 0x0448,\n 0x848B: 0x0449,\n 0x848C: 0x044A,\n 0x848D: 0x044B,\n 0x848E: 0x044C,\n 0x848F: 0x044D,\n 0x8490: 0x044E,\n 0x8491: 0x044F,\n 0x849F: 0x2500,\n 0x84A0: 0x2502,\n 0x84A1: 0x250C,\n 0x84A2: 0x2510,\n 0x84A3: 0x2518,\n 0x84A4: 0x2514,\n 0x84A5: 0x251C,\n 0x84A6: 0x252C,\n 0x84A7: 0x2524,\n 0x84A8: 0x2534,\n 0x84A9: 0x253C,\n 0x84AA: 0x2501,\n 0x84AB: 0x2503,\n 0x84AC: 0x250F,\n 0x84AD: 0x2513,\n 0x84AE: 0x251B,\n 0x84AF: 0x2517,\n 0x84B0: 0x2523,\n 0x84B1: 0x2533,\n 0x84B2: 0x252B,\n 0x84B3: 0x253B,\n 0x84B4: 0x254B,\n 0x84B5: 0x2520,\n 0x84B6: 0x252F,\n 0x84B7: 0x2528,\n 0x84B8: 0x2537,\n 0x84B9: 0x253F,\n 0x84BA: 0x251D,\n 0x84BB: 0x2530,\n 0x84BC: 0x2525,\n 0x84BD: 0x2538,\n 0x84BE: 0x2542,\n 0x889F: 0x4E9C,\n 0x88A0: 0x5516,\n 0x88A1: 0x5A03,\n 0x88A2: 0x963F,\n 0x88A3: 0x54C0,\n 0x88A4: 0x611B,\n 0x88A5: 0x6328,\n 0x88A6: 0x59F6,\n 0x88A7: 0x9022,\n 0x88A8: 0x8475,\n 0x88A9: 0x831C,\n 0x88AA: 0x7A50,\n 0x88AB: 0x60AA,\n 0x88AC: 0x63E1,\n 0x88AD: 0x6E25,\n 0x88AE: 0x65ED,\n 0x88AF: 0x8466,\n 0x88B0: 0x82A6,\n 0x88B1: 0x9BF5,\n 0x88B2: 0x6893,\n 0x88B3: 0x5727,\n 0x88B4: 0x65A1,\n 0x88B5: 0x6271,\n 0x88B6: 0x5B9B,\n 0x88B7: 0x59D0,\n 0x88B8: 0x867B,\n 0x88B9: 0x98F4,\n 0x88BA: 0x7D62,\n 0x88BB: 0x7DBE,\n 0x88BC: 0x9B8E,\n 0x88BD: 0x6216,\n 0x88BE: 0x7C9F,\n 0x88BF: 0x88B7,\n 0x88C0: 0x5B89,\n 0x88C1: 0x5EB5,\n 0x88C2: 0x6309,\n 0x88C3: 0x6697,\n 0x88C4: 0x6848,\n 0x88C5: 0x95C7,\n 0x88C6: 0x978D,\n 0x88C7: 0x674F,\n 0x88C8: 0x4EE5,\n 0x88C9: 0x4F0A,\n 0x88CA: 0x4F4D,\n 0x88CB: 0x4F9D,\n 0x88CC: 0x5049,\n 0x88CD: 0x56F2,\n 0x88CE: 0x5937,\n 0x88CF: 0x59D4,\n 0x88D0: 0x5A01,\n 0x88D1: 0x5C09,\n 0x88D2: 0x60DF,\n 0x88D3: 0x610F,\n 0x88D4: 0x6170,\n 0x88D5: 0x6613,\n 0x88D6: 0x6905,\n 0x88D7: 0x70BA,\n 0x88D8: 0x754F,\n 0x88D9: 0x7570,\n 0x88DA: 0x79FB,\n 0x88DB: 0x7DAD,\n 0x88DC: 0x7DEF,\n 0x88DD: 0x80C3,\n 0x88DE: 0x840E,\n 0x88DF: 0x8863,\n 0x88E0: 0x8B02,\n 0x88E1: 0x9055,\n 0x88E2: 0x907A,\n 0x88E3: 0x533B,\n 0x88E4: 0x4E95,\n 0x88E5: 0x4EA5,\n 0x88E6: 0x57DF,\n 0x88E7: 0x80B2,\n 0x88E8: 0x90C1,\n 0x88E9: 0x78EF,\n 0x88EA: 0x4E00,\n 0x88EB: 0x58F1,\n 0x88EC: 0x6EA2,\n 0x88ED: 0x9038,\n 0x88EE: 0x7A32,\n 0x88EF: 0x8328,\n 0x88F0: 0x828B,\n 0x88F1: 0x9C2F,\n 0x88F2: 0x5141,\n 0x88F3: 0x5370,\n 0x88F4: 0x54BD,\n 0x88F5: 0x54E1,\n 0x88F6: 0x56E0,\n 0x88F7: 0x59FB,\n 0x88F8: 0x5F15,\n 0x88F9: 0x98F2,\n 0x88FA: 0x6DEB,\n 0x88FB: 0x80E4,\n 0x88FC: 0x852D,\n 0x8940: 0x9662,\n 0x8941: 0x9670,\n 0x8942: 0x96A0,\n 0x8943: 0x97FB,\n 0x8944: 0x540B,\n 0x8945: 0x53F3,\n 0x8946: 0x5B87,\n 0x8947: 0x70CF,\n 0x8948: 0x7FBD,\n 0x8949: 0x8FC2,\n 0x894A: 0x96E8,\n 0x894B: 0x536F,\n 0x894C: 0x9D5C,\n 0x894D: 0x7ABA,\n 0x894E: 0x4E11,\n 0x894F: 0x7893,\n 0x8950: 0x81FC,\n 0x8951: 0x6E26,\n 0x8952: 0x5618,\n 0x8953: 0x5504,\n 0x8954: 0x6B1D,\n 0x8955: 0x851A,\n 0x8956: 0x9C3B,\n 0x8957: 0x59E5,\n 0x8958: 0x53A9,\n 0x8959: 0x6D66,\n 0x895A: 0x74DC,\n 0x895B: 0x958F,\n 0x895C: 0x5642,\n 0x895D: 0x4E91,\n 0x895E: 0x904B,\n 0x895F: 0x96F2,\n 0x8960: 0x834F,\n 0x8961: 0x990C,\n 0x8962: 0x53E1,\n 0x8963: 0x55B6,\n 0x8964: 0x5B30,\n 0x8965: 0x5F71,\n 0x8966: 0x6620,\n 0x8967: 0x66F3,\n 0x8968: 0x6804,\n 0x8969: 0x6C38,\n 0x896A: 0x6CF3,\n 0x896B: 0x6D29,\n 0x896C: 0x745B,\n 0x896D: 0x76C8,\n 0x896E: 0x7A4E,\n 0x896F: 0x9834,\n 0x8970: 0x82F1,\n 0x8971: 0x885B,\n 0x8972: 0x8A60,\n 0x8973: 0x92ED,\n 0x8974: 0x6DB2,\n 0x8975: 0x75AB,\n 0x8976: 0x76CA,\n 0x8977: 0x99C5,\n 0x8978: 0x60A6,\n 0x8979: 0x8B01,\n 0x897A: 0x8D8A,\n 0x897B: 0x95B2,\n 0x897C: 0x698E,\n 0x897D: 0x53AD,\n 0x897E: 0x5186,\n 0x8980: 0x5712,\n 0x8981: 0x5830,\n 0x8982: 0x5944,\n 0x8983: 0x5BB4,\n 0x8984: 0x5EF6,\n 0x8985: 0x6028,\n 0x8986: 0x63A9,\n 0x8987: 0x63F4,\n 0x8988: 0x6CBF,\n 0x8989: 0x6F14,\n 0x898A: 0x708E,\n 0x898B: 0x7114,\n 0x898C: 0x7159,\n 0x898D: 0x71D5,\n 0x898E: 0x733F,\n 0x898F: 0x7E01,\n 0x8990: 0x8276,\n 0x8991: 0x82D1,\n 0x8992: 0x8597,\n 0x8993: 0x9060,\n 0x8994: 0x925B,\n 0x8995: 0x9D1B,\n 0x8996: 0x5869,\n 0x8997: 0x65BC,\n 0x8998: 0x6C5A,\n 0x8999: 0x7525,\n 0x899A: 0x51F9,\n 0x899B: 0x592E,\n 0x899C: 0x5965,\n 0x899D: 0x5F80,\n 0x899E: 0x5FDC,\n 0x899F: 0x62BC,\n 0x89A0: 0x65FA,\n 0x89A1: 0x6A2A,\n 0x89A2: 0x6B27,\n 0x89A3: 0x6BB4,\n 0x89A4: 0x738B,\n 0x89A5: 0x7FC1,\n 0x89A6: 0x8956,\n 0x89A7: 0x9D2C,\n 0x89A8: 0x9D0E,\n 0x89A9: 0x9EC4,\n 0x89AA: 0x5CA1,\n 0x89AB: 0x6C96,\n 0x89AC: 0x837B,\n 0x89AD: 0x5104,\n 0x89AE: 0x5C4B,\n 0x89AF: 0x61B6,\n 0x89B0: 0x81C6,\n 0x89B1: 0x6876,\n 0x89B2: 0x7261,\n 0x89B3: 0x4E59,\n 0x89B4: 0x4FFA,\n 0x89B5: 0x5378,\n 0x89B6: 0x6069,\n 0x89B7: 0x6E29,\n 0x89B8: 0x7A4F,\n 0x89B9: 0x97F3,\n 0x89BA: 0x4E0B,\n 0x89BB: 0x5316,\n 0x89BC: 0x4EEE,\n 0x89BD: 0x4F55,\n 0x89BE: 0x4F3D,\n 0x89BF: 0x4FA1,\n 0x89C0: 0x4F73,\n 0x89C1: 0x52A0,\n 0x89C2: 0x53EF,\n 0x89C3: 0x5609,\n 0x89C4: 0x590F,\n 0x89C5: 0x5AC1,\n 0x89C6: 0x5BB6,\n 0x89C7: 0x5BE1,\n 0x89C8: 0x79D1,\n 0x89C9: 0x6687,\n 0x89CA: 0x679C,\n 0x89CB: 0x67B6,\n 0x89CC: 0x6B4C,\n 0x89CD: 0x6CB3,\n 0x89CE: 0x706B,\n 0x89CF: 0x73C2,\n 0x89D0: 0x798D,\n 0x89D1: 0x79BE,\n 0x89D2: 0x7A3C,\n 0x89D3: 0x7B87,\n 0x89D4: 0x82B1,\n 0x89D5: 0x82DB,\n 0x89D6: 0x8304,\n 0x89D7: 0x8377,\n 0x89D8: 0x83EF,\n 0x89D9: 0x83D3,\n 0x89DA: 0x8766,\n 0x89DB: 0x8AB2,\n 0x89DC: 0x5629,\n 0x89DD: 0x8CA8,\n 0x89DE: 0x8FE6,\n 0x89DF: 0x904E,\n 0x89E0: 0x971E,\n 0x89E1: 0x868A,\n 0x89E2: 0x4FC4,\n 0x89E3: 0x5CE8,\n 0x89E4: 0x6211,\n 0x89E5: 0x7259,\n 0x89E6: 0x753B,\n 0x89E7: 0x81E5,\n 0x89E8: 0x82BD,\n 0x89E9: 0x86FE,\n 0x89EA: 0x8CC0,\n 0x89EB: 0x96C5,\n 0x89EC: 0x9913,\n 0x89ED: 0x99D5,\n 0x89EE: 0x4ECB,\n 0x89EF: 0x4F1A,\n 0x89F0: 0x89E3,\n 0x89F1: 0x56DE,\n 0x89F2: 0x584A,\n 0x89F3: 0x58CA,\n 0x89F4: 0x5EFB,\n 0x89F5: 0x5FEB,\n 0x89F6: 0x602A,\n 0x89F7: 0x6094,\n 0x89F8: 0x6062,\n 0x89F9: 0x61D0,\n 0x89FA: 0x6212,\n 0x89FB: 0x62D0,\n 0x89FC: 0x6539,\n 0x8A40: 0x9B41,\n 0x8A41: 0x6666,\n 0x8A42: 0x68B0,\n 0x8A43: 0x6D77,\n 0x8A44: 0x7070,\n 0x8A45: 0x754C,\n 0x8A46: 0x7686,\n 0x8A47: 0x7D75,\n 0x8A48: 0x82A5,\n 0x8A49: 0x87F9,\n 0x8A4A: 0x958B,\n 0x8A4B: 0x968E,\n 0x8A4C: 0x8C9D,\n 0x8A4D: 0x51F1,\n 0x8A4E: 0x52BE,\n 0x8A4F: 0x5916,\n 0x8A50: 0x54B3,\n 0x8A51: 0x5BB3,\n 0x8A52: 0x5D16,\n 0x8A53: 0x6168,\n 0x8A54: 0x6982,\n 0x8A55: 0x6DAF,\n 0x8A56: 0x788D,\n 0x8A57: 0x84CB,\n 0x8A58: 0x8857,\n 0x8A59: 0x8A72,\n 0x8A5A: 0x93A7,\n 0x8A5B: 0x9AB8,\n 0x8A5C: 0x6D6C,\n 0x8A5D: 0x99A8,\n 0x8A5E: 0x86D9,\n 0x8A5F: 0x57A3,\n 0x8A60: 0x67FF,\n 0x8A61: 0x86CE,\n 0x8A62: 0x920E,\n 0x8A63: 0x5283,\n 0x8A64: 0x5687,\n 0x8A65: 0x5404,\n 0x8A66: 0x5ED3,\n 0x8A67: 0x62E1,\n 0x8A68: 0x64B9,\n 0x8A69: 0x683C,\n 0x8A6A: 0x6838,\n 0x8A6B: 0x6BBB,\n 0x8A6C: 0x7372,\n 0x8A6D: 0x78BA,\n 0x8A6E: 0x7A6B,\n 0x8A6F: 0x899A,\n 0x8A70: 0x89D2,\n 0x8A71: 0x8D6B,\n 0x8A72: 0x8F03,\n 0x8A73: 0x90ED,\n 0x8A74: 0x95A3,\n 0x8A75: 0x9694,\n 0x8A76: 0x9769,\n 0x8A77: 0x5B66,\n 0x8A78: 0x5CB3,\n 0x8A79: 0x697D,\n 0x8A7A: 0x984D,\n 0x8A7B: 0x984E,\n 0x8A7C: 0x639B,\n 0x8A7D: 0x7B20,\n 0x8A7E: 0x6A2B,\n 0x8A80: 0x6A7F,\n 0x8A81: 0x68B6,\n 0x8A82: 0x9C0D,\n 0x8A83: 0x6F5F,\n 0x8A84: 0x5272,\n 0x8A85: 0x559D,\n 0x8A86: 0x6070,\n 0x8A87: 0x62EC,\n 0x8A88: 0x6D3B,\n 0x8A89: 0x6E07,\n 0x8A8A: 0x6ED1,\n 0x8A8B: 0x845B,\n 0x8A8C: 0x8910,\n 0x8A8D: 0x8F44,\n 0x8A8E: 0x4E14,\n 0x8A8F: 0x9C39,\n 0x8A90: 0x53F6,\n 0x8A91: 0x691B,\n 0x8A92: 0x6A3A,\n 0x8A93: 0x9784,\n 0x8A94: 0x682A,\n 0x8A95: 0x515C,\n 0x8A96: 0x7AC3,\n 0x8A97: 0x84B2,\n 0x8A98: 0x91DC,\n 0x8A99: 0x938C,\n 0x8A9A: 0x565B,\n 0x8A9B: 0x9D28,\n 0x8A9C: 0x6822,\n 0x8A9D: 0x8305,\n 0x8A9E: 0x8431,\n 0x8A9F: 0x7CA5,\n 0x8AA0: 0x5208,\n 0x8AA1: 0x82C5,\n 0x8AA2: 0x74E6,\n 0x8AA3: 0x4E7E,\n 0x8AA4: 0x4F83,\n 0x8AA5: 0x51A0,\n 0x8AA6: 0x5BD2,\n 0x8AA7: 0x520A,\n 0x8AA8: 0x52D8,\n 0x8AA9: 0x52E7,\n 0x8AAA: 0x5DFB,\n 0x8AAB: 0x559A,\n 0x8AAC: 0x582A,\n 0x8AAD: 0x59E6,\n 0x8AAE: 0x5B8C,\n 0x8AAF: 0x5B98,\n 0x8AB0: 0x5BDB,\n 0x8AB1: 0x5E72,\n 0x8AB2: 0x5E79,\n 0x8AB3: 0x60A3,\n 0x8AB4: 0x611F,\n 0x8AB5: 0x6163,\n 0x8AB6: 0x61BE,\n 0x8AB7: 0x63DB,\n 0x8AB8: 0x6562,\n 0x8AB9: 0x67D1,\n 0x8ABA: 0x6853,\n 0x8ABB: 0x68FA,\n 0x8ABC: 0x6B3E,\n 0x8ABD: 0x6B53,\n 0x8ABE: 0x6C57,\n 0x8ABF: 0x6F22,\n 0x8AC0: 0x6F97,\n 0x8AC1: 0x6F45,\n 0x8AC2: 0x74B0,\n 0x8AC3: 0x7518,\n 0x8AC4: 0x76E3,\n 0x8AC5: 0x770B,\n 0x8AC6: 0x7AFF,\n 0x8AC7: 0x7BA1,\n 0x8AC8: 0x7C21,\n 0x8AC9: 0x7DE9,\n 0x8ACA: 0x7F36,\n 0x8ACB: 0x7FF0,\n 0x8ACC: 0x809D,\n 0x8ACD: 0x8266,\n 0x8ACE: 0x839E,\n 0x8ACF: 0x89B3,\n 0x8AD0: 0x8ACC,\n 0x8AD1: 0x8CAB,\n 0x8AD2: 0x9084,\n 0x8AD3: 0x9451,\n 0x8AD4: 0x9593,\n 0x8AD5: 0x9591,\n 0x8AD6: 0x95A2,\n 0x8AD7: 0x9665,\n 0x8AD8: 0x97D3,\n 0x8AD9: 0x9928,\n 0x8ADA: 0x8218,\n 0x8ADB: 0x4E38,\n 0x8ADC: 0x542B,\n 0x8ADD: 0x5CB8,\n 0x8ADE: 0x5DCC,\n 0x8ADF: 0x73A9,\n 0x8AE0: 0x764C,\n 0x8AE1: 0x773C,\n 0x8AE2: 0x5CA9,\n 0x8AE3: 0x7FEB,\n 0x8AE4: 0x8D0B,\n 0x8AE5: 0x96C1,\n 0x8AE6: 0x9811,\n 0x8AE7: 0x9854,\n 0x8AE8: 0x9858,\n 0x8AE9: 0x4F01,\n 0x8AEA: 0x4F0E,\n 0x8AEB: 0x5371,\n 0x8AEC: 0x559C,\n 0x8AED: 0x5668,\n 0x8AEE: 0x57FA,\n 0x8AEF: 0x5947,\n 0x8AF0: 0x5B09,\n 0x8AF1: 0x5BC4,\n 0x8AF2: 0x5C90,\n 0x8AF3: 0x5E0C,\n 0x8AF4: 0x5E7E,\n 0x8AF5: 0x5FCC,\n 0x8AF6: 0x63EE,\n 0x8AF7: 0x673A,\n 0x8AF8: 0x65D7,\n 0x8AF9: 0x65E2,\n 0x8AFA: 0x671F,\n 0x8AFB: 0x68CB,\n 0x8AFC: 0x68C4,\n 0x8B40: 0x6A5F,\n 0x8B41: 0x5E30,\n 0x8B42: 0x6BC5,\n 0x8B43: 0x6C17,\n 0x8B44: 0x6C7D,\n 0x8B45: 0x757F,\n 0x8B46: 0x7948,\n 0x8B47: 0x5B63,\n 0x8B48: 0x7A00,\n 0x8B49: 0x7D00,\n 0x8B4A: 0x5FBD,\n 0x8B4B: 0x898F,\n 0x8B4C: 0x8A18,\n 0x8B4D: 0x8CB4,\n 0x8B4E: 0x8D77,\n 0x8B4F: 0x8ECC,\n 0x8B50: 0x8F1D,\n 0x8B51: 0x98E2,\n 0x8B52: 0x9A0E,\n 0x8B53: 0x9B3C,\n 0x8B54: 0x4E80,\n 0x8B55: 0x507D,\n 0x8B56: 0x5100,\n 0x8B57: 0x5993,\n 0x8B58: 0x5B9C,\n 0x8B59: 0x622F,\n 0x8B5A: 0x6280,\n 0x8B5B: 0x64EC,\n 0x8B5C: 0x6B3A,\n 0x8B5D: 0x72A0,\n 0x8B5E: 0x7591,\n 0x8B5F: 0x7947,\n 0x8B60: 0x7FA9,\n 0x8B61: 0x87FB,\n 0x8B62: 0x8ABC,\n 0x8B63: 0x8B70,\n 0x8B64: 0x63AC,\n 0x8B65: 0x83CA,\n 0x8B66: 0x97A0,\n 0x8B67: 0x5409,\n 0x8B68: 0x5403,\n 0x8B69: 0x55AB,\n 0x8B6A: 0x6854,\n 0x8B6B: 0x6A58,\n 0x8B6C: 0x8A70,\n 0x8B6D: 0x7827,\n 0x8B6E: 0x6775,\n 0x8B6F: 0x9ECD,\n 0x8B70: 0x5374,\n 0x8B71: 0x5BA2,\n 0x8B72: 0x811A,\n 0x8B73: 0x8650,\n 0x8B74: 0x9006,\n 0x8B75: 0x4E18,\n 0x8B76: 0x4E45,\n 0x8B77: 0x4EC7,\n 0x8B78: 0x4F11,\n 0x8B79: 0x53CA,\n 0x8B7A: 0x5438,\n 0x8B7B: 0x5BAE,\n 0x8B7C: 0x5F13,\n 0x8B7D: 0x6025,\n 0x8B7E: 0x6551,\n 0x8B80: 0x673D,\n 0x8B81: 0x6C42,\n 0x8B82: 0x6C72,\n 0x8B83: 0x6CE3,\n 0x8B84: 0x7078,\n 0x8B85: 0x7403,\n 0x8B86: 0x7A76,\n 0x8B87: 0x7AAE,\n 0x8B88: 0x7B08,\n 0x8B89: 0x7D1A,\n 0x8B8A: 0x7CFE,\n 0x8B8B: 0x7D66,\n 0x8B8C: 0x65E7,\n 0x8B8D: 0x725B,\n 0x8B8E: 0x53BB,\n 0x8B8F: 0x5C45,\n 0x8B90: 0x5DE8,\n 0x8B91: 0x62D2,\n 0x8B92: 0x62E0,\n 0x8B93: 0x6319,\n 0x8B94: 0x6E20,\n 0x8B95: 0x865A,\n 0x8B96: 0x8A31,\n 0x8B97: 0x8DDD,\n 0x8B98: 0x92F8,\n 0x8B99: 0x6F01,\n 0x8B9A: 0x79A6,\n 0x8B9B: 0x9B5A,\n 0x8B9C: 0x4EA8,\n 0x8B9D: 0x4EAB,\n 0x8B9E: 0x4EAC,\n 0x8B9F: 0x4F9B,\n 0x8BA0: 0x4FA0,\n 0x8BA1: 0x50D1,\n 0x8BA2: 0x5147,\n 0x8BA3: 0x7AF6,\n 0x8BA4: 0x5171,\n 0x8BA5: 0x51F6,\n 0x8BA6: 0x5354,\n 0x8BA7: 0x5321,\n 0x8BA8: 0x537F,\n 0x8BA9: 0x53EB,\n 0x8BAA: 0x55AC,\n 0x8BAB: 0x5883,\n 0x8BAC: 0x5CE1,\n 0x8BAD: 0x5F37,\n 0x8BAE: 0x5F4A,\n 0x8BAF: 0x602F,\n 0x8BB0: 0x6050,\n 0x8BB1: 0x606D,\n 0x8BB2: 0x631F,\n 0x8BB3: 0x6559,\n 0x8BB4: 0x6A4B,\n 0x8BB5: 0x6CC1,\n 0x8BB6: 0x72C2,\n 0x8BB7: 0x72ED,\n 0x8BB8: 0x77EF,\n 0x8BB9: 0x80F8,\n 0x8BBA: 0x8105,\n 0x8BBB: 0x8208,\n 0x8BBC: 0x854E,\n 0x8BBD: 0x90F7,\n 0x8BBE: 0x93E1,\n 0x8BBF: 0x97FF,\n 0x8BC0: 0x9957,\n 0x8BC1: 0x9A5A,\n 0x8BC2: 0x4EF0,\n 0x8BC3: 0x51DD,\n 0x8BC4: 0x5C2D,\n 0x8BC5: 0x6681,\n 0x8BC6: 0x696D,\n 0x8BC7: 0x5C40,\n 0x8BC8: 0x66F2,\n 0x8BC9: 0x6975,\n 0x8BCA: 0x7389,\n 0x8BCB: 0x6850,\n 0x8BCC: 0x7C81,\n 0x8BCD: 0x50C5,\n 0x8BCE: 0x52E4,\n 0x8BCF: 0x5747,\n 0x8BD0: 0x5DFE,\n 0x8BD1: 0x9326,\n 0x8BD2: 0x65A4,\n 0x8BD3: 0x6B23,\n 0x8BD4: 0x6B3D,\n 0x8BD5: 0x7434,\n 0x8BD6: 0x7981,\n 0x8BD7: 0x79BD,\n 0x8BD8: 0x7B4B,\n 0x8BD9: 0x7DCA,\n 0x8BDA: 0x82B9,\n 0x8BDB: 0x83CC,\n 0x8BDC: 0x887F,\n 0x8BDD: 0x895F,\n 0x8BDE: 0x8B39,\n 0x8BDF: 0x8FD1,\n 0x8BE0: 0x91D1,\n 0x8BE1: 0x541F,\n 0x8BE2: 0x9280,\n 0x8BE3: 0x4E5D,\n 0x8BE4: 0x5036,\n 0x8BE5: 0x53E5,\n 0x8BE6: 0x533A,\n 0x8BE7: 0x72D7,\n 0x8BE8: 0x7396,\n 0x8BE9: 0x77E9,\n 0x8BEA: 0x82E6,\n 0x8BEB: 0x8EAF,\n 0x8BEC: 0x99C6,\n 0x8BED: 0x99C8,\n 0x8BEE: 0x99D2,\n 0x8BEF: 0x5177,\n 0x8BF0: 0x611A,\n 0x8BF1: 0x865E,\n 0x8BF2: 0x55B0,\n 0x8BF3: 0x7A7A,\n 0x8BF4: 0x5076,\n 0x8BF5: 0x5BD3,\n 0x8BF6: 0x9047,\n 0x8BF7: 0x9685,\n 0x8BF8: 0x4E32,\n 0x8BF9: 0x6ADB,\n 0x8BFA: 0x91E7,\n 0x8BFB: 0x5C51,\n 0x8BFC: 0x5C48,\n 0x8C40: 0x6398,\n 0x8C41: 0x7A9F,\n 0x8C42: 0x6C93,\n 0x8C43: 0x9774,\n 0x8C44: 0x8F61,\n 0x8C45: 0x7AAA,\n 0x8C46: 0x718A,\n 0x8C47: 0x9688,\n 0x8C48: 0x7C82,\n 0x8C49: 0x6817,\n 0x8C4A: 0x7E70,\n 0x8C4B: 0x6851,\n 0x8C4C: 0x936C,\n 0x8C4D: 0x52F2,\n 0x8C4E: 0x541B,\n 0x8C4F: 0x85AB,\n 0x8C50: 0x8A13,\n 0x8C51: 0x7FA4,\n 0x8C52: 0x8ECD,\n 0x8C53: 0x90E1,\n 0x8C54: 0x5366,\n 0x8C55: 0x8888,\n 0x8C56: 0x7941,\n 0x8C57: 0x4FC2,\n 0x8C58: 0x50BE,\n 0x8C59: 0x5211,\n 0x8C5A: 0x5144,\n 0x8C5B: 0x5553,\n 0x8C5C: 0x572D,\n 0x8C5D: 0x73EA,\n 0x8C5E: 0x578B,\n 0x8C5F: 0x5951,\n 0x8C60: 0x5F62,\n 0x8C61: 0x5F84,\n 0x8C62: 0x6075,\n 0x8C63: 0x6176,\n 0x8C64: 0x6167,\n 0x8C65: 0x61A9,\n 0x8C66: 0x63B2,\n 0x8C67: 0x643A,\n 0x8C68: 0x656C,\n 0x8C69: 0x666F,\n 0x8C6A: 0x6842,\n 0x8C6B: 0x6E13,\n 0x8C6C: 0x7566,\n 0x8C6D: 0x7A3D,\n 0x8C6E: 0x7CFB,\n 0x8C6F: 0x7D4C,\n 0x8C70: 0x7D99,\n 0x8C71: 0x7E4B,\n 0x8C72: 0x7F6B,\n 0x8C73: 0x830E,\n 0x8C74: 0x834A,\n 0x8C75: 0x86CD,\n 0x8C76: 0x8A08,\n 0x8C77: 0x8A63,\n 0x8C78: 0x8B66,\n 0x8C79: 0x8EFD,\n 0x8C7A: 0x981A,\n 0x8C7B: 0x9D8F,\n 0x8C7C: 0x82B8,\n 0x8C7D: 0x8FCE,\n 0x8C7E: 0x9BE8,\n 0x8C80: 0x5287,\n 0x8C81: 0x621F,\n 0x8C82: 0x6483,\n 0x8C83: 0x6FC0,\n 0x8C84: 0x9699,\n 0x8C85: 0x6841,\n 0x8C86: 0x5091,\n 0x8C87: 0x6B20,\n 0x8C88: 0x6C7A,\n 0x8C89: 0x6F54,\n 0x8C8A: 0x7A74,\n 0x8C8B: 0x7D50,\n 0x8C8C: 0x8840,\n 0x8C8D: 0x8A23,\n 0x8C8E: 0x6708,\n 0x8C8F: 0x4EF6,\n 0x8C90: 0x5039,\n 0x8C91: 0x5026,\n 0x8C92: 0x5065,\n 0x8C93: 0x517C,\n 0x8C94: 0x5238,\n 0x8C95: 0x5263,\n 0x8C96: 0x55A7,\n 0x8C97: 0x570F,\n 0x8C98: 0x5805,\n 0x8C99: 0x5ACC,\n 0x8C9A: 0x5EFA,\n 0x8C9B: 0x61B2,\n 0x8C9C: 0x61F8,\n 0x8C9D: 0x62F3,\n 0x8C9E: 0x6372,\n 0x8C9F: 0x691C,\n 0x8CA0: 0x6A29,\n 0x8CA1: 0x727D,\n 0x8CA2: 0x72AC,\n 0x8CA3: 0x732E,\n 0x8CA4: 0x7814,\n 0x8CA5: 0x786F,\n 0x8CA6: 0x7D79,\n 0x8CA7: 0x770C,\n 0x8CA8: 0x80A9,\n 0x8CA9: 0x898B,\n 0x8CAA: 0x8B19,\n 0x8CAB: 0x8CE2,\n 0x8CAC: 0x8ED2,\n 0x8CAD: 0x9063,\n 0x8CAE: 0x9375,\n 0x8CAF: 0x967A,\n 0x8CB0: 0x9855,\n 0x8CB1: 0x9A13,\n 0x8CB2: 0x9E78,\n 0x8CB3: 0x5143,\n 0x8CB4: 0x539F,\n 0x8CB5: 0x53B3,\n 0x8CB6: 0x5E7B,\n 0x8CB7: 0x5F26,\n 0x8CB8: 0x6E1B,\n 0x8CB9: 0x6E90,\n 0x8CBA: 0x7384,\n 0x8CBB: 0x73FE,\n 0x8CBC: 0x7D43,\n 0x8CBD: 0x8237,\n 0x8CBE: 0x8A00,\n 0x8CBF: 0x8AFA,\n 0x8CC0: 0x9650,\n 0x8CC1: 0x4E4E,\n 0x8CC2: 0x500B,\n 0x8CC3: 0x53E4,\n 0x8CC4: 0x547C,\n 0x8CC5: 0x56FA,\n 0x8CC6: 0x59D1,\n 0x8CC7: 0x5B64,\n 0x8CC8: 0x5DF1,\n 0x8CC9: 0x5EAB,\n 0x8CCA: 0x5F27,\n 0x8CCB: 0x6238,\n 0x8CCC: 0x6545,\n 0x8CCD: 0x67AF,\n 0x8CCE: 0x6E56,\n 0x8CCF: 0x72D0,\n 0x8CD0: 0x7CCA,\n 0x8CD1: 0x88B4,\n 0x8CD2: 0x80A1,\n 0x8CD3: 0x80E1,\n 0x8CD4: 0x83F0,\n 0x8CD5: 0x864E,\n 0x8CD6: 0x8A87,\n 0x8CD7: 0x8DE8,\n 0x8CD8: 0x9237,\n 0x8CD9: 0x96C7,\n 0x8CDA: 0x9867,\n 0x8CDB: 0x9F13,\n 0x8CDC: 0x4E94,\n 0x8CDD: 0x4E92,\n 0x8CDE: 0x4F0D,\n 0x8CDF: 0x5348,\n 0x8CE0: 0x5449,\n 0x8CE1: 0x543E,\n 0x8CE2: 0x5A2F,\n 0x8CE3: 0x5F8C,\n 0x8CE4: 0x5FA1,\n 0x8CE5: 0x609F,\n 0x8CE6: 0x68A7,\n 0x8CE7: 0x6A8E,\n 0x8CE8: 0x745A,\n 0x8CE9: 0x7881,\n 0x8CEA: 0x8A9E,\n 0x8CEB: 0x8AA4,\n 0x8CEC: 0x8B77,\n 0x8CED: 0x9190,\n 0x8CEE: 0x4E5E,\n 0x8CEF: 0x9BC9,\n 0x8CF0: 0x4EA4,\n 0x8CF1: 0x4F7C,\n 0x8CF2: 0x4FAF,\n 0x8CF3: 0x5019,\n 0x8CF4: 0x5016,\n 0x8CF5: 0x5149,\n 0x8CF6: 0x516C,\n 0x8CF7: 0x529F,\n 0x8CF8: 0x52B9,\n 0x8CF9: 0x52FE,\n 0x8CFA: 0x539A,\n 0x8CFB: 0x53E3,\n 0x8CFC: 0x5411,\n 0x8D40: 0x540E,\n 0x8D41: 0x5589,\n 0x8D42: 0x5751,\n 0x8D43: 0x57A2,\n 0x8D44: 0x597D,\n 0x8D45: 0x5B54,\n 0x8D46: 0x5B5D,\n 0x8D47: 0x5B8F,\n 0x8D48: 0x5DE5,\n 0x8D49: 0x5DE7,\n 0x8D4A: 0x5DF7,\n 0x8D4B: 0x5E78,\n 0x8D4C: 0x5E83,\n 0x8D4D: 0x5E9A,\n 0x8D4E: 0x5EB7,\n 0x8D4F: 0x5F18,\n 0x8D50: 0x6052,\n 0x8D51: 0x614C,\n 0x8D52: 0x6297,\n 0x8D53: 0x62D8,\n 0x8D54: 0x63A7,\n 0x8D55: 0x653B,\n 0x8D56: 0x6602,\n 0x8D57: 0x6643,\n 0x8D58: 0x66F4,\n 0x8D59: 0x676D,\n 0x8D5A: 0x6821,\n 0x8D5B: 0x6897,\n 0x8D5C: 0x69CB,\n 0x8D5D: 0x6C5F,\n 0x8D5E: 0x6D2A,\n 0x8D5F: 0x6D69,\n 0x8D60: 0x6E2F,\n 0x8D61: 0x6E9D,\n 0x8D62: 0x7532,\n 0x8D63: 0x7687,\n 0x8D64: 0x786C,\n 0x8D65: 0x7A3F,\n 0x8D66: 0x7CE0,\n 0x8D67: 0x7D05,\n 0x8D68: 0x7D18,\n 0x8D69: 0x7D5E,\n 0x8D6A: 0x7DB1,\n 0x8D6B: 0x8015,\n 0x8D6C: 0x8003,\n 0x8D6D: 0x80AF,\n 0x8D6E: 0x80B1,\n 0x8D6F: 0x8154,\n 0x8D70: 0x818F,\n 0x8D71: 0x822A,\n 0x8D72: 0x8352,\n 0x8D73: 0x884C,\n 0x8D74: 0x8861,\n 0x8D75: 0x8B1B,\n 0x8D76: 0x8CA2,\n 0x8D77: 0x8CFC,\n 0x8D78: 0x90CA,\n 0x8D79: 0x9175,\n 0x8D7A: 0x9271,\n 0x8D7B: 0x783F,\n 0x8D7C: 0x92FC,\n 0x8D7D: 0x95A4,\n 0x8D7E: 0x964D,\n 0x8D80: 0x9805,\n 0x8D81: 0x9999,\n 0x8D82: 0x9AD8,\n 0x8D83: 0x9D3B,\n 0x8D84: 0x525B,\n 0x8D85: 0x52AB,\n 0x8D86: 0x53F7,\n 0x8D87: 0x5408,\n 0x8D88: 0x58D5,\n 0x8D89: 0x62F7,\n 0x8D8A: 0x6FE0,\n 0x8D8B: 0x8C6A,\n 0x8D8C: 0x8F5F,\n 0x8D8D: 0x9EB9,\n 0x8D8E: 0x514B,\n 0x8D8F: 0x523B,\n 0x8D90: 0x544A,\n 0x8D91: 0x56FD,\n 0x8D92: 0x7A40,\n 0x8D93: 0x9177,\n 0x8D94: 0x9D60,\n 0x8D95: 0x9ED2,\n 0x8D96: 0x7344,\n 0x8D97: 0x6F09,\n 0x8D98: 0x8170,\n 0x8D99: 0x7511,\n 0x8D9A: 0x5FFD,\n 0x8D9B: 0x60DA,\n 0x8D9C: 0x9AA8,\n 0x8D9D: 0x72DB,\n 0x8D9E: 0x8FBC,\n 0x8D9F: 0x6B64,\n 0x8DA0: 0x9803,\n 0x8DA1: 0x4ECA,\n 0x8DA2: 0x56F0,\n 0x8DA3: 0x5764,\n 0x8DA4: 0x58BE,\n 0x8DA5: 0x5A5A,\n 0x8DA6: 0x6068,\n 0x8DA7: 0x61C7,\n 0x8DA8: 0x660F,\n 0x8DA9: 0x6606,\n 0x8DAA: 0x6839,\n 0x8DAB: 0x68B1,\n 0x8DAC: 0x6DF7,\n 0x8DAD: 0x75D5,\n 0x8DAE: 0x7D3A,\n 0x8DAF: 0x826E,\n 0x8DB0: 0x9B42,\n 0x8DB1: 0x4E9B,\n 0x8DB2: 0x4F50,\n 0x8DB3: 0x53C9,\n 0x8DB4: 0x5506,\n 0x8DB5: 0x5D6F,\n 0x8DB6: 0x5DE6,\n 0x8DB7: 0x5DEE,\n 0x8DB8: 0x67FB,\n 0x8DB9: 0x6C99,\n 0x8DBA: 0x7473,\n 0x8DBB: 0x7802,\n 0x8DBC: 0x8A50,\n 0x8DBD: 0x9396,\n 0x8DBE: 0x88DF,\n 0x8DBF: 0x5750,\n 0x8DC0: 0x5EA7,\n 0x8DC1: 0x632B,\n 0x8DC2: 0x50B5,\n 0x8DC3: 0x50AC,\n 0x8DC4: 0x518D,\n 0x8DC5: 0x6700,\n 0x8DC6: 0x54C9,\n 0x8DC7: 0x585E,\n 0x8DC8: 0x59BB,\n 0x8DC9: 0x5BB0,\n 0x8DCA: 0x5F69,\n 0x8DCB: 0x624D,\n 0x8DCC: 0x63A1,\n 0x8DCD: 0x683D,\n 0x8DCE: 0x6B73,\n 0x8DCF: 0x6E08,\n 0x8DD0: 0x707D,\n 0x8DD1: 0x91C7,\n 0x8DD2: 0x7280,\n 0x8DD3: 0x7815,\n 0x8DD4: 0x7826,\n 0x8DD5: 0x796D,\n 0x8DD6: 0x658E,\n 0x8DD7: 0x7D30,\n 0x8DD8: 0x83DC,\n 0x8DD9: 0x88C1,\n 0x8DDA: 0x8F09,\n 0x8DDB: 0x969B,\n 0x8DDC: 0x5264,\n 0x8DDD: 0x5728,\n 0x8DDE: 0x6750,\n 0x8DDF: 0x7F6A,\n 0x8DE0: 0x8CA1,\n 0x8DE1: 0x51B4,\n 0x8DE2: 0x5742,\n 0x8DE3: 0x962A,\n 0x8DE4: 0x583A,\n 0x8DE5: 0x698A,\n 0x8DE6: 0x80B4,\n 0x8DE7: 0x54B2,\n 0x8DE8: 0x5D0E,\n 0x8DE9: 0x57FC,\n 0x8DEA: 0x7895,\n 0x8DEB: 0x9DFA,\n 0x8DEC: 0x4F5C,\n 0x8DED: 0x524A,\n 0x8DEE: 0x548B,\n 0x8DEF: 0x643E,\n 0x8DF0: 0x6628,\n 0x8DF1: 0x6714,\n 0x8DF2: 0x67F5,\n 0x8DF3: 0x7A84,\n 0x8DF4: 0x7B56,\n 0x8DF5: 0x7D22,\n 0x8DF6: 0x932F,\n 0x8DF7: 0x685C,\n 0x8DF8: 0x9BAD,\n 0x8DF9: 0x7B39,\n 0x8DFA: 0x5319,\n 0x8DFB: 0x518A,\n 0x8DFC: 0x5237,\n 0x8E40: 0x5BDF,\n 0x8E41: 0x62F6,\n 0x8E42: 0x64AE,\n 0x8E43: 0x64E6,\n 0x8E44: 0x672D,\n 0x8E45: 0x6BBA,\n 0x8E46: 0x85A9,\n 0x8E47: 0x96D1,\n 0x8E48: 0x7690,\n 0x8E49: 0x9BD6,\n 0x8E4A: 0x634C,\n 0x8E4B: 0x9306,\n 0x8E4C: 0x9BAB,\n 0x8E4D: 0x76BF,\n 0x8E4E: 0x6652,\n 0x8E4F: 0x4E09,\n 0x8E50: 0x5098,\n 0x8E51: 0x53C2,\n 0x8E52: 0x5C71,\n 0x8E53: 0x60E8,\n 0x8E54: 0x6492,\n 0x8E55: 0x6563,\n 0x8E56: 0x685F,\n 0x8E57: 0x71E6,\n 0x8E58: 0x73CA,\n 0x8E59: 0x7523,\n 0x8E5A: 0x7B97,\n 0x8E5B: 0x7E82,\n 0x8E5C: 0x8695,\n 0x8E5D: 0x8B83,\n 0x8E5E: 0x8CDB,\n 0x8E5F: 0x9178,\n 0x8E60: 0x9910,\n 0x8E61: 0x65AC,\n 0x8E62: 0x66AB,\n 0x8E63: 0x6B8B,\n 0x8E64: 0x4ED5,\n 0x8E65: 0x4ED4,\n 0x8E66: 0x4F3A,\n 0x8E67: 0x4F7F,\n 0x8E68: 0x523A,\n 0x8E69: 0x53F8,\n 0x8E6A: 0x53F2,\n 0x8E6B: 0x55E3,\n 0x8E6C: 0x56DB,\n 0x8E6D: 0x58EB,\n 0x8E6E: 0x59CB,\n 0x8E6F: 0x59C9,\n 0x8E70: 0x59FF,\n 0x8E71: 0x5B50,\n 0x8E72: 0x5C4D,\n 0x8E73: 0x5E02,\n 0x8E74: 0x5E2B,\n 0x8E75: 0x5FD7,\n 0x8E76: 0x601D,\n 0x8E77: 0x6307,\n 0x8E78: 0x652F,\n 0x8E79: 0x5B5C,\n 0x8E7A: 0x65AF,\n 0x8E7B: 0x65BD,\n 0x8E7C: 0x65E8,\n 0x8E7D: 0x679D,\n 0x8E7E: 0x6B62,\n 0x8E80: 0x6B7B,\n 0x8E81: 0x6C0F,\n 0x8E82: 0x7345,\n 0x8E83: 0x7949,\n 0x8E84: 0x79C1,\n 0x8E85: 0x7CF8,\n 0x8E86: 0x7D19,\n 0x8E87: 0x7D2B,\n 0x8E88: 0x80A2,\n 0x8E89: 0x8102,\n 0x8E8A: 0x81F3,\n 0x8E8B: 0x8996,\n 0x8E8C: 0x8A5E,\n 0x8E8D: 0x8A69,\n 0x8E8E: 0x8A66,\n 0x8E8F: 0x8A8C,\n 0x8E90: 0x8AEE,\n 0x8E91: 0x8CC7,\n 0x8E92: 0x8CDC,\n 0x8E93: 0x96CC,\n 0x8E94: 0x98FC,\n 0x8E95: 0x6B6F,\n 0x8E96: 0x4E8B,\n 0x8E97: 0x4F3C,\n 0x8E98: 0x4F8D,\n 0x8E99: 0x5150,\n 0x8E9A: 0x5B57,\n 0x8E9B: 0x5BFA,\n 0x8E9C: 0x6148,\n 0x8E9D: 0x6301,\n 0x8E9E: 0x6642,\n 0x8E9F: 0x6B21,\n 0x8EA0: 0x6ECB,\n 0x8EA1: 0x6CBB,\n 0x8EA2: 0x723E,\n 0x8EA3: 0x74BD,\n 0x8EA4: 0x75D4,\n 0x8EA5: 0x78C1,\n 0x8EA6: 0x793A,\n 0x8EA7: 0x800C,\n 0x8EA8: 0x8033,\n 0x8EA9: 0x81EA,\n 0x8EAA: 0x8494,\n 0x8EAB: 0x8F9E,\n 0x8EAC: 0x6C50,\n 0x8EAD: 0x9E7F,\n 0x8EAE: 0x5F0F,\n 0x8EAF: 0x8B58,\n 0x8EB0: 0x9D2B,\n 0x8EB1: 0x7AFA,\n 0x8EB2: 0x8EF8,\n 0x8EB3: 0x5B8D,\n 0x8EB4: 0x96EB,\n 0x8EB5: 0x4E03,\n 0x8EB6: 0x53F1,\n 0x8EB7: 0x57F7,\n 0x8EB8: 0x5931,\n 0x8EB9: 0x5AC9,\n 0x8EBA: 0x5BA4,\n 0x8EBB: 0x6089,\n 0x8EBC: 0x6E7F,\n 0x8EBD: 0x6F06,\n 0x8EBE: 0x75BE,\n 0x8EBF: 0x8CEA,\n 0x8EC0: 0x5B9F,\n 0x8EC1: 0x8500,\n 0x8EC2: 0x7BE0,\n 0x8EC3: 0x5072,\n 0x8EC4: 0x67F4,\n 0x8EC5: 0x829D,\n 0x8EC6: 0x5C61,\n 0x8EC7: 0x854A,\n 0x8EC8: 0x7E1E,\n 0x8EC9: 0x820E,\n 0x8ECA: 0x5199,\n 0x8ECB: 0x5C04,\n 0x8ECC: 0x6368,\n 0x8ECD: 0x8D66,\n 0x8ECE: 0x659C,\n 0x8ECF: 0x716E,\n 0x8ED0: 0x793E,\n 0x8ED1: 0x7D17,\n 0x8ED2: 0x8005,\n 0x8ED3: 0x8B1D,\n 0x8ED4: 0x8ECA,\n 0x8ED5: 0x906E,\n 0x8ED6: 0x86C7,\n 0x8ED7: 0x90AA,\n 0x8ED8: 0x501F,\n 0x8ED9: 0x52FA,\n 0x8EDA: 0x5C3A,\n 0x8EDB: 0x6753,\n 0x8EDC: 0x707C,\n 0x8EDD: 0x7235,\n 0x8EDE: 0x914C,\n 0x8EDF: 0x91C8,\n 0x8EE0: 0x932B,\n 0x8EE1: 0x82E5,\n 0x8EE2: 0x5BC2,\n 0x8EE3: 0x5F31,\n 0x8EE4: 0x60F9,\n 0x8EE5: 0x4E3B,\n 0x8EE6: 0x53D6,\n 0x8EE7: 0x5B88,\n 0x8EE8: 0x624B,\n 0x8EE9: 0x6731,\n 0x8EEA: 0x6B8A,\n 0x8EEB: 0x72E9,\n 0x8EEC: 0x73E0,\n 0x8EED: 0x7A2E,\n 0x8EEE: 0x816B,\n 0x8EEF: 0x8DA3,\n 0x8EF0: 0x9152,\n 0x8EF1: 0x9996,\n 0x8EF2: 0x5112,\n 0x8EF3: 0x53D7,\n 0x8EF4: 0x546A,\n 0x8EF5: 0x5BFF,\n 0x8EF6: 0x6388,\n 0x8EF7: 0x6A39,\n 0x8EF8: 0x7DAC,\n 0x8EF9: 0x9700,\n 0x8EFA: 0x56DA,\n 0x8EFB: 0x53CE,\n 0x8EFC: 0x5468,\n 0x8F40: 0x5B97,\n 0x8F41: 0x5C31,\n 0x8F42: 0x5DDE,\n 0x8F43: 0x4FEE,\n 0x8F44: 0x6101,\n 0x8F45: 0x62FE,\n 0x8F46: 0x6D32,\n 0x8F47: 0x79C0,\n 0x8F48: 0x79CB,\n 0x8F49: 0x7D42,\n 0x8F4A: 0x7E4D,\n 0x8F4B: 0x7FD2,\n 0x8F4C: 0x81ED,\n 0x8F4D: 0x821F,\n 0x8F4E: 0x8490,\n 0x8F4F: 0x8846,\n 0x8F50: 0x8972,\n 0x8F51: 0x8B90,\n 0x8F52: 0x8E74,\n 0x8F53: 0x8F2F,\n 0x8F54: 0x9031,\n 0x8F55: 0x914B,\n 0x8F56: 0x916C,\n 0x8F57: 0x96C6,\n 0x8F58: 0x919C,\n 0x8F59: 0x4EC0,\n 0x8F5A: 0x4F4F,\n 0x8F5B: 0x5145,\n 0x8F5C: 0x5341,\n 0x8F5D: 0x5F93,\n 0x8F5E: 0x620E,\n 0x8F5F: 0x67D4,\n 0x8F60: 0x6C41,\n 0x8F61: 0x6E0B,\n 0x8F62: 0x7363,\n 0x8F63: 0x7E26,\n 0x8F64: 0x91CD,\n 0x8F65: 0x9283,\n 0x8F66: 0x53D4,\n 0x8F67: 0x5919,\n 0x8F68: 0x5BBF,\n 0x8F69: 0x6DD1,\n 0x8F6A: 0x795D,\n 0x8F6B: 0x7E2E,\n 0x8F6C: 0x7C9B,\n 0x8F6D: 0x587E,\n 0x8F6E: 0x719F,\n 0x8F6F: 0x51FA,\n 0x8F70: 0x8853,\n 0x8F71: 0x8FF0,\n 0x8F72: 0x4FCA,\n 0x8F73: 0x5CFB,\n 0x8F74: 0x6625,\n 0x8F75: 0x77AC,\n 0x8F76: 0x7AE3,\n 0x8F77: 0x821C,\n 0x8F78: 0x99FF,\n 0x8F79: 0x51C6,\n 0x8F7A: 0x5FAA,\n 0x8F7B: 0x65EC,\n 0x8F7C: 0x696F,\n 0x8F7D: 0x6B89,\n 0x8F7E: 0x6DF3,\n 0x8F80: 0x6E96,\n 0x8F81: 0x6F64,\n 0x8F82: 0x76FE,\n 0x8F83: 0x7D14,\n 0x8F84: 0x5DE1,\n 0x8F85: 0x9075,\n 0x8F86: 0x9187,\n 0x8F87: 0x9806,\n 0x8F88: 0x51E6,\n 0x8F89: 0x521D,\n 0x8F8A: 0x6240,\n 0x8F8B: 0x6691,\n 0x8F8C: 0x66D9,\n 0x8F8D: 0x6E1A,\n 0x8F8E: 0x5EB6,\n 0x8F8F: 0x7DD2,\n 0x8F90: 0x7F72,\n 0x8F91: 0x66F8,\n 0x8F92: 0x85AF,\n 0x8F93: 0x85F7,\n 0x8F94: 0x8AF8,\n 0x8F95: 0x52A9,\n 0x8F96: 0x53D9,\n 0x8F97: 0x5973,\n 0x8F98: 0x5E8F,\n 0x8F99: 0x5F90,\n 0x8F9A: 0x6055,\n 0x8F9B: 0x92E4,\n 0x8F9C: 0x9664,\n 0x8F9D: 0x50B7,\n 0x8F9E: 0x511F,\n 0x8F9F: 0x52DD,\n 0x8FA0: 0x5320,\n 0x8FA1: 0x5347,\n 0x8FA2: 0x53EC,\n 0x8FA3: 0x54E8,\n 0x8FA4: 0x5546,\n 0x8FA5: 0x5531,\n 0x8FA6: 0x5617,\n 0x8FA7: 0x5968,\n 0x8FA8: 0x59BE,\n 0x8FA9: 0x5A3C,\n 0x8FAA: 0x5BB5,\n 0x8FAB: 0x5C06,\n 0x8FAC: 0x5C0F,\n 0x8FAD: 0x5C11,\n 0x8FAE: 0x5C1A,\n 0x8FAF: 0x5E84,\n 0x8FB0: 0x5E8A,\n 0x8FB1: 0x5EE0,\n 0x8FB2: 0x5F70,\n 0x8FB3: 0x627F,\n 0x8FB4: 0x6284,\n 0x8FB5: 0x62DB,\n 0x8FB6: 0x638C,\n 0x8FB7: 0x6377,\n 0x8FB8: 0x6607,\n 0x8FB9: 0x660C,\n 0x8FBA: 0x662D,\n 0x8FBB: 0x6676,\n 0x8FBC: 0x677E,\n 0x8FBD: 0x68A2,\n 0x8FBE: 0x6A1F,\n 0x8FBF: 0x6A35,\n 0x8FC0: 0x6CBC,\n 0x8FC1: 0x6D88,\n 0x8FC2: 0x6E09,\n 0x8FC3: 0x6E58,\n 0x8FC4: 0x713C,\n 0x8FC5: 0x7126,\n 0x8FC6: 0x7167,\n 0x8FC7: 0x75C7,\n 0x8FC8: 0x7701,\n 0x8FC9: 0x785D,\n 0x8FCA: 0x7901,\n 0x8FCB: 0x7965,\n 0x8FCC: 0x79F0,\n 0x8FCD: 0x7AE0,\n 0x8FCE: 0x7B11,\n 0x8FCF: 0x7CA7,\n 0x8FD0: 0x7D39,\n 0x8FD1: 0x8096,\n 0x8FD2: 0x83D6,\n 0x8FD3: 0x848B,\n 0x8FD4: 0x8549,\n 0x8FD5: 0x885D,\n 0x8FD6: 0x88F3,\n 0x8FD7: 0x8A1F,\n 0x8FD8: 0x8A3C,\n 0x8FD9: 0x8A54,\n 0x8FDA: 0x8A73,\n 0x8FDB: 0x8C61,\n 0x8FDC: 0x8CDE,\n 0x8FDD: 0x91A4,\n 0x8FDE: 0x9266,\n 0x8FDF: 0x937E,\n 0x8FE0: 0x9418,\n 0x8FE1: 0x969C,\n 0x8FE2: 0x9798,\n 0x8FE3: 0x4E0A,\n 0x8FE4: 0x4E08,\n 0x8FE5: 0x4E1E,\n 0x8FE6: 0x4E57,\n 0x8FE7: 0x5197,\n 0x8FE8: 0x5270,\n 0x8FE9: 0x57CE,\n 0x8FEA: 0x5834,\n 0x8FEB: 0x58CC,\n 0x8FEC: 0x5B22,\n 0x8FED: 0x5E38,\n 0x8FEE: 0x60C5,\n 0x8FEF: 0x64FE,\n 0x8FF0: 0x6761,\n 0x8FF1: 0x6756,\n 0x8FF2: 0x6D44,\n 0x8FF3: 0x72B6,\n 0x8FF4: 0x7573,\n 0x8FF5: 0x7A63,\n 0x8FF6: 0x84B8,\n 0x8FF7: 0x8B72,\n 0x8FF8: 0x91B8,\n 0x8FF9: 0x9320,\n 0x8FFA: 0x5631,\n 0x8FFB: 0x57F4,\n 0x8FFC: 0x98FE,\n 0x9040: 0x62ED,\n 0x9041: 0x690D,\n 0x9042: 0x6B96,\n 0x9043: 0x71ED,\n 0x9044: 0x7E54,\n 0x9045: 0x8077,\n 0x9046: 0x8272,\n 0x9047: 0x89E6,\n 0x9048: 0x98DF,\n 0x9049: 0x8755,\n 0x904A: 0x8FB1,\n 0x904B: 0x5C3B,\n 0x904C: 0x4F38,\n 0x904D: 0x4FE1,\n 0x904E: 0x4FB5,\n 0x904F: 0x5507,\n 0x9050: 0x5A20,\n 0x9051: 0x5BDD,\n 0x9052: 0x5BE9,\n 0x9053: 0x5FC3,\n 0x9054: 0x614E,\n 0x9055: 0x632F,\n 0x9056: 0x65B0,\n 0x9057: 0x664B,\n 0x9058: 0x68EE,\n 0x9059: 0x699B,\n 0x905A: 0x6D78,\n 0x905B: 0x6DF1,\n 0x905C: 0x7533,\n 0x905D: 0x75B9,\n 0x905E: 0x771F,\n 0x905F: 0x795E,\n 0x9060: 0x79E6,\n 0x9061: 0x7D33,\n 0x9062: 0x81E3,\n 0x9063: 0x82AF,\n 0x9064: 0x85AA,\n 0x9065: 0x89AA,\n 0x9066: 0x8A3A,\n 0x9067: 0x8EAB,\n 0x9068: 0x8F9B,\n 0x9069: 0x9032,\n 0x906A: 0x91DD,\n 0x906B: 0x9707,\n 0x906C: 0x4EBA,\n 0x906D: 0x4EC1,\n 0x906E: 0x5203,\n 0x906F: 0x5875,\n 0x9070: 0x58EC,\n 0x9071: 0x5C0B,\n 0x9072: 0x751A,\n 0x9073: 0x5C3D,\n 0x9074: 0x814E,\n 0x9075: 0x8A0A,\n 0x9076: 0x8FC5,\n 0x9077: 0x9663,\n 0x9078: 0x976D,\n 0x9079: 0x7B25,\n 0x907A: 0x8ACF,\n 0x907B: 0x9808,\n 0x907C: 0x9162,\n 0x907D: 0x56F3,\n 0x907E: 0x53A8,\n 0x9080: 0x9017,\n 0x9081: 0x5439,\n 0x9082: 0x5782,\n 0x9083: 0x5E25,\n 0x9084: 0x63A8,\n 0x9085: 0x6C34,\n 0x9086: 0x708A,\n 0x9087: 0x7761,\n 0x9088: 0x7C8B,\n 0x9089: 0x7FE0,\n 0x908A: 0x8870,\n 0x908B: 0x9042,\n 0x908C: 0x9154,\n 0x908D: 0x9310,\n 0x908E: 0x9318,\n 0x908F: 0x968F,\n 0x9090: 0x745E,\n 0x9091: 0x9AC4,\n 0x9092: 0x5D07,\n 0x9093: 0x5D69,\n 0x9094: 0x6570,\n 0x9095: 0x67A2,\n 0x9096: 0x8DA8,\n 0x9097: 0x96DB,\n 0x9098: 0x636E,\n 0x9099: 0x6749,\n 0x909A: 0x6919,\n 0x909B: 0x83C5,\n 0x909C: 0x9817,\n 0x909D: 0x96C0,\n 0x909E: 0x88FE,\n 0x909F: 0x6F84,\n 0x90A0: 0x647A,\n 0x90A1: 0x5BF8,\n 0x90A2: 0x4E16,\n 0x90A3: 0x702C,\n 0x90A4: 0x755D,\n 0x90A5: 0x662F,\n 0x90A6: 0x51C4,\n 0x90A7: 0x5236,\n 0x90A8: 0x52E2,\n 0x90A9: 0x59D3,\n 0x90AA: 0x5F81,\n 0x90AB: 0x6027,\n 0x90AC: 0x6210,\n 0x90AD: 0x653F,\n 0x90AE: 0x6574,\n 0x90AF: 0x661F,\n 0x90B0: 0x6674,\n 0x90B1: 0x68F2,\n 0x90B2: 0x6816,\n 0x90B3: 0x6B63,\n 0x90B4: 0x6E05,\n 0x90B5: 0x7272,\n 0x90B6: 0x751F,\n 0x90B7: 0x76DB,\n 0x90B8: 0x7CBE,\n 0x90B9: 0x8056,\n 0x90BA: 0x58F0,\n 0x90BB: 0x88FD,\n 0x90BC: 0x897F,\n 0x90BD: 0x8AA0,\n 0x90BE: 0x8A93,\n 0x90BF: 0x8ACB,\n 0x90C0: 0x901D,\n 0x90C1: 0x9192,\n 0x90C2: 0x9752,\n 0x90C3: 0x9759,\n 0x90C4: 0x6589,\n 0x90C5: 0x7A0E,\n 0x90C6: 0x8106,\n 0x90C7: 0x96BB,\n 0x90C8: 0x5E2D,\n 0x90C9: 0x60DC,\n 0x90CA: 0x621A,\n 0x90CB: 0x65A5,\n 0x90CC: 0x6614,\n 0x90CD: 0x6790,\n 0x90CE: 0x77F3,\n 0x90CF: 0x7A4D,\n 0x90D0: 0x7C4D,\n 0x90D1: 0x7E3E,\n 0x90D2: 0x810A,\n 0x90D3: 0x8CAC,\n 0x90D4: 0x8D64,\n 0x90D5: 0x8DE1,\n 0x90D6: 0x8E5F,\n 0x90D7: 0x78A9,\n 0x90D8: 0x5207,\n 0x90D9: 0x62D9,\n 0x90DA: 0x63A5,\n 0x90DB: 0x6442,\n 0x90DC: 0x6298,\n 0x90DD: 0x8A2D,\n 0x90DE: 0x7A83,\n 0x90DF: 0x7BC0,\n 0x90E0: 0x8AAC,\n 0x90E1: 0x96EA,\n 0x90E2: 0x7D76,\n 0x90E3: 0x820C,\n 0x90E4: 0x8749,\n 0x90E5: 0x4ED9,\n 0x90E6: 0x5148,\n 0x90E7: 0x5343,\n 0x90E8: 0x5360,\n 0x90E9: 0x5BA3,\n 0x90EA: 0x5C02,\n 0x90EB: 0x5C16,\n 0x90EC: 0x5DDD,\n 0x90ED: 0x6226,\n 0x90EE: 0x6247,\n 0x90EF: 0x64B0,\n 0x90F0: 0x6813,\n 0x90F1: 0x6834,\n 0x90F2: 0x6CC9,\n 0x90F3: 0x6D45,\n 0x90F4: 0x6D17,\n 0x90F5: 0x67D3,\n 0x90F6: 0x6F5C,\n 0x90F7: 0x714E,\n 0x90F8: 0x717D,\n 0x90F9: 0x65CB,\n 0x90FA: 0x7A7F,\n 0x90FB: 0x7BAD,\n 0x90FC: 0x7DDA,\n 0x9140: 0x7E4A,\n 0x9141: 0x7FA8,\n 0x9142: 0x817A,\n 0x9143: 0x821B,\n 0x9144: 0x8239,\n 0x9145: 0x85A6,\n 0x9146: 0x8A6E,\n 0x9147: 0x8CCE,\n 0x9148: 0x8DF5,\n 0x9149: 0x9078,\n 0x914A: 0x9077,\n 0x914B: 0x92AD,\n 0x914C: 0x9291,\n 0x914D: 0x9583,\n 0x914E: 0x9BAE,\n 0x914F: 0x524D,\n 0x9150: 0x5584,\n 0x9151: 0x6F38,\n 0x9152: 0x7136,\n 0x9153: 0x5168,\n 0x9154: 0x7985,\n 0x9155: 0x7E55,\n 0x9156: 0x81B3,\n 0x9157: 0x7CCE,\n 0x9158: 0x564C,\n 0x9159: 0x5851,\n 0x915A: 0x5CA8,\n 0x915B: 0x63AA,\n 0x915C: 0x66FE,\n 0x915D: 0x66FD,\n 0x915E: 0x695A,\n 0x915F: 0x72D9,\n 0x9160: 0x758F,\n 0x9161: 0x758E,\n 0x9162: 0x790E,\n 0x9163: 0x7956,\n 0x9164: 0x79DF,\n 0x9165: 0x7C97,\n 0x9166: 0x7D20,\n 0x9167: 0x7D44,\n 0x9168: 0x8607,\n 0x9169: 0x8A34,\n 0x916A: 0x963B,\n 0x916B: 0x9061,\n 0x916C: 0x9F20,\n 0x916D: 0x50E7,\n 0x916E: 0x5275,\n 0x916F: 0x53CC,\n 0x9170: 0x53E2,\n 0x9171: 0x5009,\n 0x9172: 0x55AA,\n 0x9173: 0x58EE,\n 0x9174: 0x594F,\n 0x9175: 0x723D,\n 0x9176: 0x5B8B,\n 0x9177: 0x5C64,\n 0x9178: 0x531D,\n 0x9179: 0x60E3,\n 0x917A: 0x60F3,\n 0x917B: 0x635C,\n 0x917C: 0x6383,\n 0x917D: 0x633F,\n 0x917E: 0x63BB,\n 0x9180: 0x64CD,\n 0x9181: 0x65E9,\n 0x9182: 0x66F9,\n 0x9183: 0x5DE3,\n 0x9184: 0x69CD,\n 0x9185: 0x69FD,\n 0x9186: 0x6F15,\n 0x9187: 0x71E5,\n 0x9188: 0x4E89,\n 0x9189: 0x75E9,\n 0x918A: 0x76F8,\n 0x918B: 0x7A93,\n 0x918C: 0x7CDF,\n 0x918D: 0x7DCF,\n 0x918E: 0x7D9C,\n 0x918F: 0x8061,\n 0x9190: 0x8349,\n 0x9191: 0x8358,\n 0x9192: 0x846C,\n 0x9193: 0x84BC,\n 0x9194: 0x85FB,\n 0x9195: 0x88C5,\n 0x9196: 0x8D70,\n 0x9197: 0x9001,\n 0x9198: 0x906D,\n 0x9199: 0x9397,\n 0x919A: 0x971C,\n 0x919B: 0x9A12,\n 0x919C: 0x50CF,\n 0x919D: 0x5897,\n 0x919E: 0x618E,\n 0x919F: 0x81D3,\n 0x91A0: 0x8535,\n 0x91A1: 0x8D08,\n 0x91A2: 0x9020,\n 0x91A3: 0x4FC3,\n 0x91A4: 0x5074,\n 0x91A5: 0x5247,\n 0x91A6: 0x5373,\n 0x91A7: 0x606F,\n 0x91A8: 0x6349,\n 0x91A9: 0x675F,\n 0x91AA: 0x6E2C,\n 0x91AB: 0x8DB3,\n 0x91AC: 0x901F,\n 0x91AD: 0x4FD7,\n 0x91AE: 0x5C5E,\n 0x91AF: 0x8CCA,\n 0x91B0: 0x65CF,\n 0x91B1: 0x7D9A,\n 0x91B2: 0x5352,\n 0x91B3: 0x8896,\n 0x91B4: 0x5176,\n 0x91B5: 0x63C3,\n 0x91B6: 0x5B58,\n 0x91B7: 0x5B6B,\n 0x91B8: 0x5C0A,\n 0x91B9: 0x640D,\n 0x91BA: 0x6751,\n 0x91BB: 0x905C,\n 0x91BC: 0x4ED6,\n 0x91BD: 0x591A,\n 0x91BE: 0x592A,\n 0x91BF: 0x6C70,\n 0x91C0: 0x8A51,\n 0x91C1: 0x553E,\n 0x91C2: 0x5815,\n 0x91C3: 0x59A5,\n 0x91C4: 0x60F0,\n 0x91C5: 0x6253,\n 0x91C6: 0x67C1,\n 0x91C7: 0x8235,\n 0x91C8: 0x6955,\n 0x91C9: 0x9640,\n 0x91CA: 0x99C4,\n 0x91CB: 0x9A28,\n 0x91CC: 0x4F53,\n 0x91CD: 0x5806,\n 0x91CE: 0x5BFE,\n 0x91CF: 0x8010,\n 0x91D0: 0x5CB1,\n 0x91D1: 0x5E2F,\n 0x91D2: 0x5F85,\n 0x91D3: 0x6020,\n 0x91D4: 0x614B,\n 0x91D5: 0x6234,\n 0x91D6: 0x66FF,\n 0x91D7: 0x6CF0,\n 0x91D8: 0x6EDE,\n 0x91D9: 0x80CE,\n 0x91DA: 0x817F,\n 0x91DB: 0x82D4,\n 0x91DC: 0x888B,\n 0x91DD: 0x8CB8,\n 0x91DE: 0x9000,\n 0x91DF: 0x902E,\n 0x91E0: 0x968A,\n 0x91E1: 0x9EDB,\n 0x91E2: 0x9BDB,\n 0x91E3: 0x4EE3,\n 0x91E4: 0x53F0,\n 0x91E5: 0x5927,\n 0x91E6: 0x7B2C,\n 0x91E7: 0x918D,\n 0x91E8: 0x984C,\n 0x91E9: 0x9DF9,\n 0x91EA: 0x6EDD,\n 0x91EB: 0x7027,\n 0x91EC: 0x5353,\n 0x91ED: 0x5544,\n 0x91EE: 0x5B85,\n 0x91EF: 0x6258,\n 0x91F0: 0x629E,\n 0x91F1: 0x62D3,\n 0x91F2: 0x6CA2,\n 0x91F3: 0x6FEF,\n 0x91F4: 0x7422,\n 0x91F5: 0x8A17,\n 0x91F6: 0x9438,\n 0x91F7: 0x6FC1,\n 0x91F8: 0x8AFE,\n 0x91F9: 0x8338,\n 0x91FA: 0x51E7,\n 0x91FB: 0x86F8,\n 0x91FC: 0x53EA,\n 0x9240: 0x53E9,\n 0x9241: 0x4F46,\n 0x9242: 0x9054,\n 0x9243: 0x8FB0,\n 0x9244: 0x596A,\n 0x9245: 0x8131,\n 0x9246: 0x5DFD,\n 0x9247: 0x7AEA,\n 0x9248: 0x8FBF,\n 0x9249: 0x68DA,\n 0x924A: 0x8C37,\n 0x924B: 0x72F8,\n 0x924C: 0x9C48,\n 0x924D: 0x6A3D,\n 0x924E: 0x8AB0,\n 0x924F: 0x4E39,\n 0x9250: 0x5358,\n 0x9251: 0x5606,\n 0x9252: 0x5766,\n 0x9253: 0x62C5,\n 0x9254: 0x63A2,\n 0x9255: 0x65E6,\n 0x9256: 0x6B4E,\n 0x9257: 0x6DE1,\n 0x9258: 0x6E5B,\n 0x9259: 0x70AD,\n 0x925A: 0x77ED,\n 0x925B: 0x7AEF,\n 0x925C: 0x7BAA,\n 0x925D: 0x7DBB,\n 0x925E: 0x803D,\n 0x925F: 0x80C6,\n 0x9260: 0x86CB,\n 0x9261: 0x8A95,\n 0x9262: 0x935B,\n 0x9263: 0x56E3,\n 0x9264: 0x58C7,\n 0x9265: 0x5F3E,\n 0x9266: 0x65AD,\n 0x9267: 0x6696,\n 0x9268: 0x6A80,\n 0x9269: 0x6BB5,\n 0x926A: 0x7537,\n 0x926B: 0x8AC7,\n 0x926C: 0x5024,\n 0x926D: 0x77E5,\n 0x926E: 0x5730,\n 0x926F: 0x5F1B,\n 0x9270: 0x6065,\n 0x9271: 0x667A,\n 0x9272: 0x6C60,\n 0x9273: 0x75F4,\n 0x9274: 0x7A1A,\n 0x9275: 0x7F6E,\n 0x9276: 0x81F4,\n 0x9277: 0x8718,\n 0x9278: 0x9045,\n 0x9279: 0x99B3,\n 0x927A: 0x7BC9,\n 0x927B: 0x755C,\n 0x927C: 0x7AF9,\n 0x927D: 0x7B51,\n 0x927E: 0x84C4,\n 0x9280: 0x9010,\n 0x9281: 0x79E9,\n 0x9282: 0x7A92,\n 0x9283: 0x8336,\n 0x9284: 0x5AE1,\n 0x9285: 0x7740,\n 0x9286: 0x4E2D,\n 0x9287: 0x4EF2,\n 0x9288: 0x5B99,\n 0x9289: 0x5FE0,\n 0x928A: 0x62BD,\n 0x928B: 0x663C,\n 0x928C: 0x67F1,\n 0x928D: 0x6CE8,\n 0x928E: 0x866B,\n 0x928F: 0x8877,\n 0x9290: 0x8A3B,\n 0x9291: 0x914E,\n 0x9292: 0x92F3,\n 0x9293: 0x99D0,\n 0x9294: 0x6A17,\n 0x9295: 0x7026,\n 0x9296: 0x732A,\n 0x9297: 0x82E7,\n 0x9298: 0x8457,\n 0x9299: 0x8CAF,\n 0x929A: 0x4E01,\n 0x929B: 0x5146,\n 0x929C: 0x51CB,\n 0x929D: 0x558B,\n 0x929E: 0x5BF5,\n 0x929F: 0x5E16,\n 0x92A0: 0x5E33,\n 0x92A1: 0x5E81,\n 0x92A2: 0x5F14,\n 0x92A3: 0x5F35,\n 0x92A4: 0x5F6B,\n 0x92A5: 0x5FB4,\n 0x92A6: 0x61F2,\n 0x92A7: 0x6311,\n 0x92A8: 0x66A2,\n 0x92A9: 0x671D,\n 0x92AA: 0x6F6E,\n 0x92AB: 0x7252,\n 0x92AC: 0x753A,\n 0x92AD: 0x773A,\n 0x92AE: 0x8074,\n 0x92AF: 0x8139,\n 0x92B0: 0x8178,\n 0x92B1: 0x8776,\n 0x92B2: 0x8ABF,\n 0x92B3: 0x8ADC,\n 0x92B4: 0x8D85,\n 0x92B5: 0x8DF3,\n 0x92B6: 0x929A,\n 0x92B7: 0x9577,\n 0x92B8: 0x9802,\n 0x92B9: 0x9CE5,\n 0x92BA: 0x52C5,\n 0x92BB: 0x6357,\n 0x92BC: 0x76F4,\n 0x92BD: 0x6715,\n 0x92BE: 0x6C88,\n 0x92BF: 0x73CD,\n 0x92C0: 0x8CC3,\n 0x92C1: 0x93AE,\n 0x92C2: 0x9673,\n 0x92C3: 0x6D25,\n 0x92C4: 0x589C,\n 0x92C5: 0x690E,\n 0x92C6: 0x69CC,\n 0x92C7: 0x8FFD,\n 0x92C8: 0x939A,\n 0x92C9: 0x75DB,\n 0x92CA: 0x901A,\n 0x92CB: 0x585A,\n 0x92CC: 0x6802,\n 0x92CD: 0x63B4,\n 0x92CE: 0x69FB,\n 0x92CF: 0x4F43,\n 0x92D0: 0x6F2C,\n 0x92D1: 0x67D8,\n 0x92D2: 0x8FBB,\n 0x92D3: 0x8526,\n 0x92D4: 0x7DB4,\n 0x92D5: 0x9354,\n 0x92D6: 0x693F,\n 0x92D7: 0x6F70,\n 0x92D8: 0x576A,\n 0x92D9: 0x58F7,\n 0x92DA: 0x5B2C,\n 0x92DB: 0x7D2C,\n 0x92DC: 0x722A,\n 0x92DD: 0x540A,\n 0x92DE: 0x91E3,\n 0x92DF: 0x9DB4,\n 0x92E0: 0x4EAD,\n 0x92E1: 0x4F4E,\n 0x92E2: 0x505C,\n 0x92E3: 0x5075,\n 0x92E4: 0x5243,\n 0x92E5: 0x8C9E,\n 0x92E6: 0x5448,\n 0x92E7: 0x5824,\n 0x92E8: 0x5B9A,\n 0x92E9: 0x5E1D,\n 0x92EA: 0x5E95,\n 0x92EB: 0x5EAD,\n 0x92EC: 0x5EF7,\n 0x92ED: 0x5F1F,\n 0x92EE: 0x608C,\n 0x92EF: 0x62B5,\n 0x92F0: 0x633A,\n 0x92F1: 0x63D0,\n 0x92F2: 0x68AF,\n 0x92F3: 0x6C40,\n 0x92F4: 0x7887,\n 0x92F5: 0x798E,\n 0x92F6: 0x7A0B,\n 0x92F7: 0x7DE0,\n 0x92F8: 0x8247,\n 0x92F9: 0x8A02,\n 0x92FA: 0x8AE6,\n 0x92FB: 0x8E44,\n 0x92FC: 0x9013,\n 0x9340: 0x90B8,\n 0x9341: 0x912D,\n 0x9342: 0x91D8,\n 0x9343: 0x9F0E,\n 0x9344: 0x6CE5,\n 0x9345: 0x6458,\n 0x9346: 0x64E2,\n 0x9347: 0x6575,\n 0x9348: 0x6EF4,\n 0x9349: 0x7684,\n 0x934A: 0x7B1B,\n 0x934B: 0x9069,\n 0x934C: 0x93D1,\n 0x934D: 0x6EBA,\n 0x934E: 0x54F2,\n 0x934F: 0x5FB9,\n 0x9350: 0x64A4,\n 0x9351: 0x8F4D,\n 0x9352: 0x8FED,\n 0x9353: 0x9244,\n 0x9354: 0x5178,\n 0x9355: 0x586B,\n 0x9356: 0x5929,\n 0x9357: 0x5C55,\n 0x9358: 0x5E97,\n 0x9359: 0x6DFB,\n 0x935A: 0x7E8F,\n 0x935B: 0x751C,\n 0x935C: 0x8CBC,\n 0x935D: 0x8EE2,\n 0x935E: 0x985B,\n 0x935F: 0x70B9,\n 0x9360: 0x4F1D,\n 0x9361: 0x6BBF,\n 0x9362: 0x6FB1,\n 0x9363: 0x7530,\n 0x9364: 0x96FB,\n 0x9365: 0x514E,\n 0x9366: 0x5410,\n 0x9367: 0x5835,\n 0x9368: 0x5857,\n 0x9369: 0x59AC,\n 0x936A: 0x5C60,\n 0x936B: 0x5F92,\n 0x936C: 0x6597,\n 0x936D: 0x675C,\n 0x936E: 0x6E21,\n 0x936F: 0x767B,\n 0x9370: 0x83DF,\n 0x9371: 0x8CED,\n 0x9372: 0x9014,\n 0x9373: 0x90FD,\n 0x9374: 0x934D,\n 0x9375: 0x7825,\n 0x9376: 0x783A,\n 0x9377: 0x52AA,\n 0x9378: 0x5EA6,\n 0x9379: 0x571F,\n 0x937A: 0x5974,\n 0x937B: 0x6012,\n 0x937C: 0x5012,\n 0x937D: 0x515A,\n 0x937E: 0x51AC,\n 0x9380: 0x51CD,\n 0x9381: 0x5200,\n 0x9382: 0x5510,\n 0x9383: 0x5854,\n 0x9384: 0x5858,\n 0x9385: 0x5957,\n 0x9386: 0x5B95,\n 0x9387: 0x5CF6,\n 0x9388: 0x5D8B,\n 0x9389: 0x60BC,\n 0x938A: 0x6295,\n 0x938B: 0x642D,\n 0x938C: 0x6771,\n 0x938D: 0x6843,\n 0x938E: 0x68BC,\n 0x938F: 0x68DF,\n 0x9390: 0x76D7,\n 0x9391: 0x6DD8,\n 0x9392: 0x6E6F,\n 0x9393: 0x6D9B,\n 0x9394: 0x706F,\n 0x9395: 0x71C8,\n 0x9396: 0x5F53,\n 0x9397: 0x75D8,\n 0x9398: 0x7977,\n 0x9399: 0x7B49,\n 0x939A: 0x7B54,\n 0x939B: 0x7B52,\n 0x939C: 0x7CD6,\n 0x939D: 0x7D71,\n 0x939E: 0x5230,\n 0x939F: 0x8463,\n 0x93A0: 0x8569,\n 0x93A1: 0x85E4,\n 0x93A2: 0x8A0E,\n 0x93A3: 0x8B04,\n 0x93A4: 0x8C46,\n 0x93A5: 0x8E0F,\n 0x93A6: 0x9003,\n 0x93A7: 0x900F,\n 0x93A8: 0x9419,\n 0x93A9: 0x9676,\n 0x93AA: 0x982D,\n 0x93AB: 0x9A30,\n 0x93AC: 0x95D8,\n 0x93AD: 0x50CD,\n 0x93AE: 0x52D5,\n 0x93AF: 0x540C,\n 0x93B0: 0x5802,\n 0x93B1: 0x5C0E,\n 0x93B2: 0x61A7,\n 0x93B3: 0x649E,\n 0x93B4: 0x6D1E,\n 0x93B5: 0x77B3,\n 0x93B6: 0x7AE5,\n 0x93B7: 0x80F4,\n 0x93B8: 0x8404,\n 0x93B9: 0x9053,\n 0x93BA: 0x9285,\n 0x93BB: 0x5CE0,\n 0x93BC: 0x9D07,\n 0x93BD: 0x533F,\n 0x93BE: 0x5F97,\n 0x93BF: 0x5FB3,\n 0x93C0: 0x6D9C,\n 0x93C1: 0x7279,\n 0x93C2: 0x7763,\n 0x93C3: 0x79BF,\n 0x93C4: 0x7BE4,\n 0x93C5: 0x6BD2,\n 0x93C6: 0x72EC,\n 0x93C7: 0x8AAD,\n 0x93C8: 0x6803,\n 0x93C9: 0x6A61,\n 0x93CA: 0x51F8,\n 0x93CB: 0x7A81,\n 0x93CC: 0x6934,\n 0x93CD: 0x5C4A,\n 0x93CE: 0x9CF6,\n 0x93CF: 0x82EB,\n 0x93D0: 0x5BC5,\n 0x93D1: 0x9149,\n 0x93D2: 0x701E,\n 0x93D3: 0x5678,\n 0x93D4: 0x5C6F,\n 0x93D5: 0x60C7,\n 0x93D6: 0x6566,\n 0x93D7: 0x6C8C,\n 0x93D8: 0x8C5A,\n 0x93D9: 0x9041,\n 0x93DA: 0x9813,\n 0x93DB: 0x5451,\n 0x93DC: 0x66C7,\n 0x93DD: 0x920D,\n 0x93DE: 0x5948,\n 0x93DF: 0x90A3,\n 0x93E0: 0x5185,\n 0x93E1: 0x4E4D,\n 0x93E2: 0x51EA,\n 0x93E3: 0x8599,\n 0x93E4: 0x8B0E,\n 0x93E5: 0x7058,\n 0x93E6: 0x637A,\n 0x93E7: 0x934B,\n 0x93E8: 0x6962,\n 0x93E9: 0x99B4,\n 0x93EA: 0x7E04,\n 0x93EB: 0x7577,\n 0x93EC: 0x5357,\n 0x93ED: 0x6960,\n 0x93EE: 0x8EDF,\n 0x93EF: 0x96E3,\n 0x93F0: 0x6C5D,\n 0x93F1: 0x4E8C,\n 0x93F2: 0x5C3C,\n 0x93F3: 0x5F10,\n 0x93F4: 0x8FE9,\n 0x93F5: 0x5302,\n 0x93F6: 0x8CD1,\n 0x93F7: 0x8089,\n 0x93F8: 0x8679,\n 0x93F9: 0x5EFF,\n 0x93FA: 0x65E5,\n 0x93FB: 0x4E73,\n 0x93FC: 0x5165,\n 0x9440: 0x5982,\n 0x9441: 0x5C3F,\n 0x9442: 0x97EE,\n 0x9443: 0x4EFB,\n 0x9444: 0x598A,\n 0x9445: 0x5FCD,\n 0x9446: 0x8A8D,\n 0x9447: 0x6FE1,\n 0x9448: 0x79B0,\n 0x9449: 0x7962,\n 0x944A: 0x5BE7,\n 0x944B: 0x8471,\n 0x944C: 0x732B,\n 0x944D: 0x71B1,\n 0x944E: 0x5E74,\n 0x944F: 0x5FF5,\n 0x9450: 0x637B,\n 0x9451: 0x649A,\n 0x9452: 0x71C3,\n 0x9453: 0x7C98,\n 0x9454: 0x4E43,\n 0x9455: 0x5EFC,\n 0x9456: 0x4E4B,\n 0x9457: 0x57DC,\n 0x9458: 0x56A2,\n 0x9459: 0x60A9,\n 0x945A: 0x6FC3,\n 0x945B: 0x7D0D,\n 0x945C: 0x80FD,\n 0x945D: 0x8133,\n 0x945E: 0x81BF,\n 0x945F: 0x8FB2,\n 0x9460: 0x8997,\n 0x9461: 0x86A4,\n 0x9462: 0x5DF4,\n 0x9463: 0x628A,\n 0x9464: 0x64AD,\n 0x9465: 0x8987,\n 0x9466: 0x6777,\n 0x9467: 0x6CE2,\n 0x9468: 0x6D3E,\n 0x9469: 0x7436,\n 0x946A: 0x7834,\n 0x946B: 0x5A46,\n 0x946C: 0x7F75,\n 0x946D: 0x82AD,\n 0x946E: 0x99AC,\n 0x946F: 0x4FF3,\n 0x9470: 0x5EC3,\n 0x9471: 0x62DD,\n 0x9472: 0x6392,\n 0x9473: 0x6557,\n 0x9474: 0x676F,\n 0x9475: 0x76C3,\n 0x9476: 0x724C,\n 0x9477: 0x80CC,\n 0x9478: 0x80BA,\n 0x9479: 0x8F29,\n 0x947A: 0x914D,\n 0x947B: 0x500D,\n 0x947C: 0x57F9,\n 0x947D: 0x5A92,\n 0x947E: 0x6885,\n 0x9480: 0x6973,\n 0x9481: 0x7164,\n 0x9482: 0x72FD,\n 0x9483: 0x8CB7,\n 0x9484: 0x58F2,\n 0x9485: 0x8CE0,\n 0x9486: 0x966A,\n 0x9487: 0x9019,\n 0x9488: 0x877F,\n 0x9489: 0x79E4,\n 0x948A: 0x77E7,\n 0x948B: 0x8429,\n 0x948C: 0x4F2F,\n 0x948D: 0x5265,\n 0x948E: 0x535A,\n 0x948F: 0x62CD,\n 0x9490: 0x67CF,\n 0x9491: 0x6CCA,\n 0x9492: 0x767D,\n 0x9493: 0x7B94,\n 0x9494: 0x7C95,\n 0x9495: 0x8236,\n 0x9496: 0x8584,\n 0x9497: 0x8FEB,\n 0x9498: 0x66DD,\n 0x9499: 0x6F20,\n 0x949A: 0x7206,\n 0x949B: 0x7E1B,\n 0x949C: 0x83AB,\n 0x949D: 0x99C1,\n 0x949E: 0x9EA6,\n 0x949F: 0x51FD,\n 0x94A0: 0x7BB1,\n 0x94A1: 0x7872,\n 0x94A2: 0x7BB8,\n 0x94A3: 0x8087,\n 0x94A4: 0x7B48,\n 0x94A5: 0x6AE8,\n 0x94A6: 0x5E61,\n 0x94A7: 0x808C,\n 0x94A8: 0x7551,\n 0x94A9: 0x7560,\n 0x94AA: 0x516B,\n 0x94AB: 0x9262,\n 0x94AC: 0x6E8C,\n 0x94AD: 0x767A,\n 0x94AE: 0x9197,\n 0x94AF: 0x9AEA,\n 0x94B0: 0x4F10,\n 0x94B1: 0x7F70,\n 0x94B2: 0x629C,\n 0x94B3: 0x7B4F,\n 0x94B4: 0x95A5,\n 0x94B5: 0x9CE9,\n 0x94B6: 0x567A,\n 0x94B7: 0x5859,\n 0x94B8: 0x86E4,\n 0x94B9: 0x96BC,\n 0x94BA: 0x4F34,\n 0x94BB: 0x5224,\n 0x94BC: 0x534A,\n 0x94BD: 0x53CD,\n 0x94BE: 0x53DB,\n 0x94BF: 0x5E06,\n 0x94C0: 0x642C,\n 0x94C1: 0x6591,\n 0x94C2: 0x677F,\n 0x94C3: 0x6C3E,\n 0x94C4: 0x6C4E,\n 0x94C5: 0x7248,\n 0x94C6: 0x72AF,\n 0x94C7: 0x73ED,\n 0x94C8: 0x7554,\n 0x94C9: 0x7E41,\n 0x94CA: 0x822C,\n 0x94CB: 0x85E9,\n 0x94CC: 0x8CA9,\n 0x94CD: 0x7BC4,\n 0x94CE: 0x91C6,\n 0x94CF: 0x7169,\n 0x94D0: 0x9812,\n 0x94D1: 0x98EF,\n 0x94D2: 0x633D,\n 0x94D3: 0x6669,\n 0x94D4: 0x756A,\n 0x94D5: 0x76E4,\n 0x94D6: 0x78D0,\n 0x94D7: 0x8543,\n 0x94D8: 0x86EE,\n 0x94D9: 0x532A,\n 0x94DA: 0x5351,\n 0x94DB: 0x5426,\n 0x94DC: 0x5983,\n 0x94DD: 0x5E87,\n 0x94DE: 0x5F7C,\n 0x94DF: 0x60B2,\n 0x94E0: 0x6249,\n 0x94E1: 0x6279,\n 0x94E2: 0x62AB,\n 0x94E3: 0x6590,\n 0x94E4: 0x6BD4,\n 0x94E5: 0x6CCC,\n 0x94E6: 0x75B2,\n 0x94E7: 0x76AE,\n 0x94E8: 0x7891,\n 0x94E9: 0x79D8,\n 0x94EA: 0x7DCB,\n 0x94EB: 0x7F77,\n 0x94EC: 0x80A5,\n 0x94ED: 0x88AB,\n 0x94EE: 0x8AB9,\n 0x94EF: 0x8CBB,\n 0x94F0: 0x907F,\n 0x94F1: 0x975E,\n 0x94F2: 0x98DB,\n 0x94F3: 0x6A0B,\n 0x94F4: 0x7C38,\n 0x94F5: 0x5099,\n 0x94F6: 0x5C3E,\n 0x94F7: 0x5FAE,\n 0x94F8: 0x6787,\n 0x94F9: 0x6BD8,\n 0x94FA: 0x7435,\n 0x94FB: 0x7709,\n 0x94FC: 0x7F8E,\n 0x9540: 0x9F3B,\n 0x9541: 0x67CA,\n 0x9542: 0x7A17,\n 0x9543: 0x5339,\n 0x9544: 0x758B,\n 0x9545: 0x9AED,\n 0x9546: 0x5F66,\n 0x9547: 0x819D,\n 0x9548: 0x83F1,\n 0x9549: 0x8098,\n 0x954A: 0x5F3C,\n 0x954B: 0x5FC5,\n 0x954C: 0x7562,\n 0x954D: 0x7B46,\n 0x954E: 0x903C,\n 0x954F: 0x6867,\n 0x9550: 0x59EB,\n 0x9551: 0x5A9B,\n 0x9552: 0x7D10,\n 0x9553: 0x767E,\n 0x9554: 0x8B2C,\n 0x9555: 0x4FF5,\n 0x9556: 0x5F6A,\n 0x9557: 0x6A19,\n 0x9558: 0x6C37,\n 0x9559: 0x6F02,\n 0x955A: 0x74E2,\n 0x955B: 0x7968,\n 0x955C: 0x8868,\n 0x955D: 0x8A55,\n 0x955E: 0x8C79,\n 0x955F: 0x5EDF,\n 0x9560: 0x63CF,\n 0x9561: 0x75C5,\n 0x9562: 0x79D2,\n 0x9563: 0x82D7,\n 0x9564: 0x9328,\n 0x9565: 0x92F2,\n 0x9566: 0x849C,\n 0x9567: 0x86ED,\n 0x9568: 0x9C2D,\n 0x9569: 0x54C1,\n 0x956A: 0x5F6C,\n 0x956B: 0x658C,\n 0x956C: 0x6D5C,\n 0x956D: 0x7015,\n 0x956E: 0x8CA7,\n 0x956F: 0x8CD3,\n 0x9570: 0x983B,\n 0x9571: 0x654F,\n 0x9572: 0x74F6,\n 0x9573: 0x4E0D,\n 0x9574: 0x4ED8,\n 0x9575: 0x57E0,\n 0x9576: 0x592B,\n 0x9577: 0x5A66,\n 0x9578: 0x5BCC,\n 0x9579: 0x51A8,\n 0x957A: 0x5E03,\n 0x957B: 0x5E9C,\n 0x957C: 0x6016,\n 0x957D: 0x6276,\n 0x957E: 0x6577,\n 0x9580: 0x65A7,\n 0x9581: 0x666E,\n 0x9582: 0x6D6E,\n 0x9583: 0x7236,\n 0x9584: 0x7B26,\n 0x9585: 0x8150,\n 0x9586: 0x819A,\n 0x9587: 0x8299,\n 0x9588: 0x8B5C,\n 0x9589: 0x8CA0,\n 0x958A: 0x8CE6,\n 0x958B: 0x8D74,\n 0x958C: 0x961C,\n 0x958D: 0x9644,\n 0x958E: 0x4FAE,\n 0x958F: 0x64AB,\n 0x9590: 0x6B66,\n 0x9591: 0x821E,\n 0x9592: 0x8461,\n 0x9593: 0x856A,\n 0x9594: 0x90E8,\n 0x9595: 0x5C01,\n 0x9596: 0x6953,\n 0x9597: 0x98A8,\n 0x9598: 0x847A,\n 0x9599: 0x8557,\n 0x959A: 0x4F0F,\n 0x959B: 0x526F,\n 0x959C: 0x5FA9,\n 0x959D: 0x5E45,\n 0x959E: 0x670D,\n 0x959F: 0x798F,\n 0x95A0: 0x8179,\n 0x95A1: 0x8907,\n 0x95A2: 0x8986,\n 0x95A3: 0x6DF5,\n 0x95A4: 0x5F17,\n 0x95A5: 0x6255,\n 0x95A6: 0x6CB8,\n 0x95A7: 0x4ECF,\n 0x95A8: 0x7269,\n 0x95A9: 0x9B92,\n 0x95AA: 0x5206,\n 0x95AB: 0x543B,\n 0x95AC: 0x5674,\n 0x95AD: 0x58B3,\n 0x95AE: 0x61A4,\n 0x95AF: 0x626E,\n 0x95B0: 0x711A,\n 0x95B1: 0x596E,\n 0x95B2: 0x7C89,\n 0x95B3: 0x7CDE,\n 0x95B4: 0x7D1B,\n 0x95B5: 0x96F0,\n 0x95B6: 0x6587,\n 0x95B7: 0x805E,\n 0x95B8: 0x4E19,\n 0x95B9: 0x4F75,\n 0x95BA: 0x5175,\n 0x95BB: 0x5840,\n 0x95BC: 0x5E63,\n 0x95BD: 0x5E73,\n 0x95BE: 0x5F0A,\n 0x95BF: 0x67C4,\n 0x95C0: 0x4E26,\n 0x95C1: 0x853D,\n 0x95C2: 0x9589,\n 0x95C3: 0x965B,\n 0x95C4: 0x7C73,\n 0x95C5: 0x9801,\n 0x95C6: 0x50FB,\n 0x95C7: 0x58C1,\n 0x95C8: 0x7656,\n 0x95C9: 0x78A7,\n 0x95CA: 0x5225,\n 0x95CB: 0x77A5,\n 0x95CC: 0x8511,\n 0x95CD: 0x7B86,\n 0x95CE: 0x504F,\n 0x95CF: 0x5909,\n 0x95D0: 0x7247,\n 0x95D1: 0x7BC7,\n 0x95D2: 0x7DE8,\n 0x95D3: 0x8FBA,\n 0x95D4: 0x8FD4,\n 0x95D5: 0x904D,\n 0x95D6: 0x4FBF,\n 0x95D7: 0x52C9,\n 0x95D8: 0x5A29,\n 0x95D9: 0x5F01,\n 0x95DA: 0x97AD,\n 0x95DB: 0x4FDD,\n 0x95DC: 0x8217,\n 0x95DD: 0x92EA,\n 0x95DE: 0x5703,\n 0x95DF: 0x6355,\n 0x95E0: 0x6B69,\n 0x95E1: 0x752B,\n 0x95E2: 0x88DC,\n 0x95E3: 0x8F14,\n 0x95E4: 0x7A42,\n 0x95E5: 0x52DF,\n 0x95E6: 0x5893,\n 0x95E7: 0x6155,\n 0x95E8: 0x620A,\n 0x95E9: 0x66AE,\n 0x95EA: 0x6BCD,\n 0x95EB: 0x7C3F,\n 0x95EC: 0x83E9,\n 0x95ED: 0x5023,\n 0x95EE: 0x4FF8,\n 0x95EF: 0x5305,\n 0x95F0: 0x5446,\n 0x95F1: 0x5831,\n 0x95F2: 0x5949,\n 0x95F3: 0x5B9D,\n 0x95F4: 0x5CF0,\n 0x95F5: 0x5CEF,\n 0x95F6: 0x5D29,\n 0x95F7: 0x5E96,\n 0x95F8: 0x62B1,\n 0x95F9: 0x6367,\n 0x95FA: 0x653E,\n 0x95FB: 0x65B9,\n 0x95FC: 0x670B,\n 0x9640: 0x6CD5,\n 0x9641: 0x6CE1,\n 0x9642: 0x70F9,\n 0x9643: 0x7832,\n 0x9644: 0x7E2B,\n 0x9645: 0x80DE,\n 0x9646: 0x82B3,\n 0x9647: 0x840C,\n 0x9648: 0x84EC,\n 0x9649: 0x8702,\n 0x964A: 0x8912,\n 0x964B: 0x8A2A,\n 0x964C: 0x8C4A,\n 0x964D: 0x90A6,\n 0x964E: 0x92D2,\n 0x964F: 0x98FD,\n 0x9650: 0x9CF3,\n 0x9651: 0x9D6C,\n 0x9652: 0x4E4F,\n 0x9653: 0x4EA1,\n 0x9654: 0x508D,\n 0x9655: 0x5256,\n 0x9656: 0x574A,\n 0x9657: 0x59A8,\n 0x9658: 0x5E3D,\n 0x9659: 0x5FD8,\n 0x965A: 0x5FD9,\n 0x965B: 0x623F,\n 0x965C: 0x66B4,\n 0x965D: 0x671B,\n 0x965E: 0x67D0,\n 0x965F: 0x68D2,\n 0x9660: 0x5192,\n 0x9661: 0x7D21,\n 0x9662: 0x80AA,\n 0x9663: 0x81A8,\n 0x9664: 0x8B00,\n 0x9665: 0x8C8C,\n 0x9666: 0x8CBF,\n 0x9667: 0x927E,\n 0x9668: 0x9632,\n 0x9669: 0x5420,\n 0x966A: 0x982C,\n 0x966B: 0x5317,\n 0x966C: 0x50D5,\n 0x966D: 0x535C,\n 0x966E: 0x58A8,\n 0x966F: 0x64B2,\n 0x9670: 0x6734,\n 0x9671: 0x7267,\n 0x9672: 0x7766,\n 0x9673: 0x7A46,\n 0x9674: 0x91E6,\n 0x9675: 0x52C3,\n 0x9676: 0x6CA1,\n 0x9677: 0x6B86,\n 0x9678: 0x5800,\n 0x9679: 0x5E4C,\n 0x967A: 0x5954,\n 0x967B: 0x672C,\n 0x967C: 0x7FFB,\n 0x967D: 0x51E1,\n 0x967E: 0x76C6,\n 0x9680: 0x6469,\n 0x9681: 0x78E8,\n 0x9682: 0x9B54,\n 0x9683: 0x9EBB,\n 0x9684: 0x57CB,\n 0x9685: 0x59B9,\n 0x9686: 0x6627,\n 0x9687: 0x679A,\n 0x9688: 0x6BCE,\n 0x9689: 0x54E9,\n 0x968A: 0x69D9,\n 0x968B: 0x5E55,\n 0x968C: 0x819C,\n 0x968D: 0x6795,\n 0x968E: 0x9BAA,\n 0x968F: 0x67FE,\n 0x9690: 0x9C52,\n 0x9691: 0x685D,\n 0x9692: 0x4EA6,\n 0x9693: 0x4FE3,\n 0x9694: 0x53C8,\n 0x9695: 0x62B9,\n 0x9696: 0x672B,\n 0x9697: 0x6CAB,\n 0x9698: 0x8FC4,\n 0x9699: 0x4FAD,\n 0x969A: 0x7E6D,\n 0x969B: 0x9EBF,\n 0x969C: 0x4E07,\n 0x969D: 0x6162,\n 0x969E: 0x6E80,\n 0x969F: 0x6F2B,\n 0x96A0: 0x8513,\n 0x96A1: 0x5473,\n 0x96A2: 0x672A,\n 0x96A3: 0x9B45,\n 0x96A4: 0x5DF3,\n 0x96A5: 0x7B95,\n 0x96A6: 0x5CAC,\n 0x96A7: 0x5BC6,\n 0x96A8: 0x871C,\n 0x96A9: 0x6E4A,\n 0x96AA: 0x84D1,\n 0x96AB: 0x7A14,\n 0x96AC: 0x8108,\n 0x96AD: 0x5999,\n 0x96AE: 0x7C8D,\n 0x96AF: 0x6C11,\n 0x96B0: 0x7720,\n 0x96B1: 0x52D9,\n 0x96B2: 0x5922,\n 0x96B3: 0x7121,\n 0x96B4: 0x725F,\n 0x96B5: 0x77DB,\n 0x96B6: 0x9727,\n 0x96B7: 0x9D61,\n 0x96B8: 0x690B,\n 0x96B9: 0x5A7F,\n 0x96BA: 0x5A18,\n 0x96BB: 0x51A5,\n 0x96BC: 0x540D,\n 0x96BD: 0x547D,\n 0x96BE: 0x660E,\n 0x96BF: 0x76DF,\n 0x96C0: 0x8FF7,\n 0x96C1: 0x9298,\n 0x96C2: 0x9CF4,\n 0x96C3: 0x59EA,\n 0x96C4: 0x725D,\n 0x96C5: 0x6EC5,\n 0x96C6: 0x514D,\n 0x96C7: 0x68C9,\n 0x96C8: 0x7DBF,\n 0x96C9: 0x7DEC,\n 0x96CA: 0x9762,\n 0x96CB: 0x9EBA,\n 0x96CC: 0x6478,\n 0x96CD: 0x6A21,\n 0x96CE: 0x8302,\n 0x96CF: 0x5984,\n 0x96D0: 0x5B5F,\n 0x96D1: 0x6BDB,\n 0x96D2: 0x731B,\n 0x96D3: 0x76F2,\n 0x96D4: 0x7DB2,\n 0x96D5: 0x8017,\n 0x96D6: 0x8499,\n 0x96D7: 0x5132,\n 0x96D8: 0x6728,\n 0x96D9: 0x9ED9,\n 0x96DA: 0x76EE,\n 0x96DB: 0x6762,\n 0x96DC: 0x52FF,\n 0x96DD: 0x9905,\n 0x96DE: 0x5C24,\n 0x96DF: 0x623B,\n 0x96E0: 0x7C7E,\n 0x96E1: 0x8CB0,\n 0x96E2: 0x554F,\n 0x96E3: 0x60B6,\n 0x96E4: 0x7D0B,\n 0x96E5: 0x9580,\n 0x96E6: 0x5301,\n 0x96E7: 0x4E5F,\n 0x96E8: 0x51B6,\n 0x96E9: 0x591C,\n 0x96EA: 0x723A,\n 0x96EB: 0x8036,\n 0x96EC: 0x91CE,\n 0x96ED: 0x5F25,\n 0x96EE: 0x77E2,\n 0x96EF: 0x5384,\n 0x96F0: 0x5F79,\n 0x96F1: 0x7D04,\n 0x96F2: 0x85AC,\n 0x96F3: 0x8A33,\n 0x96F4: 0x8E8D,\n 0x96F5: 0x9756,\n 0x96F6: 0x67F3,\n 0x96F7: 0x85AE,\n 0x96F8: 0x9453,\n 0x96F9: 0x6109,\n 0x96FA: 0x6108,\n 0x96FB: 0x6CB9,\n 0x96FC: 0x7652,\n 0x9740: 0x8AED,\n 0x9741: 0x8F38,\n 0x9742: 0x552F,\n 0x9743: 0x4F51,\n 0x9744: 0x512A,\n 0x9745: 0x52C7,\n 0x9746: 0x53CB,\n 0x9747: 0x5BA5,\n 0x9748: 0x5E7D,\n 0x9749: 0x60A0,\n 0x974A: 0x6182,\n 0x974B: 0x63D6,\n 0x974C: 0x6709,\n 0x974D: 0x67DA,\n 0x974E: 0x6E67,\n 0x974F: 0x6D8C,\n 0x9750: 0x7336,\n 0x9751: 0x7337,\n 0x9752: 0x7531,\n 0x9753: 0x7950,\n 0x9754: 0x88D5,\n 0x9755: 0x8A98,\n 0x9756: 0x904A,\n 0x9757: 0x9091,\n 0x9758: 0x90F5,\n 0x9759: 0x96C4,\n 0x975A: 0x878D,\n 0x975B: 0x5915,\n 0x975C: 0x4E88,\n 0x975D: 0x4F59,\n 0x975E: 0x4E0E,\n 0x975F: 0x8A89,\n 0x9760: 0x8F3F,\n 0x9761: 0x9810,\n 0x9762: 0x50AD,\n 0x9763: 0x5E7C,\n 0x9764: 0x5996,\n 0x9765: 0x5BB9,\n 0x9766: 0x5EB8,\n 0x9767: 0x63DA,\n 0x9768: 0x63FA,\n 0x9769: 0x64C1,\n 0x976A: 0x66DC,\n 0x976B: 0x694A,\n 0x976C: 0x69D8,\n 0x976D: 0x6D0B,\n 0x976E: 0x6EB6,\n 0x976F: 0x7194,\n 0x9770: 0x7528,\n 0x9771: 0x7AAF,\n 0x9772: 0x7F8A,\n 0x9773: 0x8000,\n 0x9774: 0x8449,\n 0x9775: 0x84C9,\n 0x9776: 0x8981,\n 0x9777: 0x8B21,\n 0x9778: 0x8E0A,\n 0x9779: 0x9065,\n 0x977A: 0x967D,\n 0x977B: 0x990A,\n 0x977C: 0x617E,\n 0x977D: 0x6291,\n 0x977E: 0x6B32,\n 0x9780: 0x6C83,\n 0x9781: 0x6D74,\n 0x9782: 0x7FCC,\n 0x9783: 0x7FFC,\n 0x9784: 0x6DC0,\n 0x9785: 0x7F85,\n 0x9786: 0x87BA,\n 0x9787: 0x88F8,\n 0x9788: 0x6765,\n 0x9789: 0x83B1,\n 0x978A: 0x983C,\n 0x978B: 0x96F7,\n 0x978C: 0x6D1B,\n 0x978D: 0x7D61,\n 0x978E: 0x843D,\n 0x978F: 0x916A,\n 0x9790: 0x4E71,\n 0x9791: 0x5375,\n 0x9792: 0x5D50,\n 0x9793: 0x6B04,\n 0x9794: 0x6FEB,\n 0x9795: 0x85CD,\n 0x9796: 0x862D,\n 0x9797: 0x89A7,\n 0x9798: 0x5229,\n 0x9799: 0x540F,\n 0x979A: 0x5C65,\n 0x979B: 0x674E,\n 0x979C: 0x68A8,\n 0x979D: 0x7406,\n 0x979E: 0x7483,\n 0x979F: 0x75E2,\n 0x97A0: 0x88CF,\n 0x97A1: 0x88E1,\n 0x97A2: 0x91CC,\n 0x97A3: 0x96E2,\n 0x97A4: 0x9678,\n 0x97A5: 0x5F8B,\n 0x97A6: 0x7387,\n 0x97A7: 0x7ACB,\n 0x97A8: 0x844E,\n 0x97A9: 0x63A0,\n 0x97AA: 0x7565,\n 0x97AB: 0x5289,\n 0x97AC: 0x6D41,\n 0x97AD: 0x6E9C,\n 0x97AE: 0x7409,\n 0x97AF: 0x7559,\n 0x97B0: 0x786B,\n 0x97B1: 0x7C92,\n 0x97B2: 0x9686,\n 0x97B3: 0x7ADC,\n 0x97B4: 0x9F8D,\n 0x97B5: 0x4FB6,\n 0x97B6: 0x616E,\n 0x97B7: 0x65C5,\n 0x97B8: 0x865C,\n 0x97B9: 0x4E86,\n 0x97BA: 0x4EAE,\n 0x97BB: 0x50DA,\n 0x97BC: 0x4E21,\n 0x97BD: 0x51CC,\n 0x97BE: 0x5BEE,\n 0x97BF: 0x6599,\n 0x97C0: 0x6881,\n 0x97C1: 0x6DBC,\n 0x97C2: 0x731F,\n 0x97C3: 0x7642,\n 0x97C4: 0x77AD,\n 0x97C5: 0x7A1C,\n 0x97C6: 0x7CE7,\n 0x97C7: 0x826F,\n 0x97C8: 0x8AD2,\n 0x97C9: 0x907C,\n 0x97CA: 0x91CF,\n 0x97CB: 0x9675,\n 0x97CC: 0x9818,\n 0x97CD: 0x529B,\n 0x97CE: 0x7DD1,\n 0x97CF: 0x502B,\n 0x97D0: 0x5398,\n 0x97D1: 0x6797,\n 0x97D2: 0x6DCB,\n 0x97D3: 0x71D0,\n 0x97D4: 0x7433,\n 0x97D5: 0x81E8,\n 0x97D6: 0x8F2A,\n 0x97D7: 0x96A3,\n 0x97D8: 0x9C57,\n 0x97D9: 0x9E9F,\n 0x97DA: 0x7460,\n 0x97DB: 0x5841,\n 0x97DC: 0x6D99,\n 0x97DD: 0x7D2F,\n 0x97DE: 0x985E,\n 0x97DF: 0x4EE4,\n 0x97E0: 0x4F36,\n 0x97E1: 0x4F8B,\n 0x97E2: 0x51B7,\n 0x97E3: 0x52B1,\n 0x97E4: 0x5DBA,\n 0x97E5: 0x601C,\n 0x97E6: 0x73B2,\n 0x97E7: 0x793C,\n 0x97E8: 0x82D3,\n 0x97E9: 0x9234,\n 0x97EA: 0x96B7,\n 0x97EB: 0x96F6,\n 0x97EC: 0x970A,\n 0x97ED: 0x9E97,\n 0x97EE: 0x9F62,\n 0x97EF: 0x66A6,\n 0x97F0: 0x6B74,\n 0x97F1: 0x5217,\n 0x97F2: 0x52A3,\n 0x97F3: 0x70C8,\n 0x97F4: 0x88C2,\n 0x97F5: 0x5EC9,\n 0x97F6: 0x604B,\n 0x97F7: 0x6190,\n 0x97F8: 0x6F23,\n 0x97F9: 0x7149,\n 0x97FA: 0x7C3E,\n 0x97FB: 0x7DF4,\n 0x97FC: 0x806F,\n 0x9840: 0x84EE,\n 0x9841: 0x9023,\n 0x9842: 0x932C,\n 0x9843: 0x5442,\n 0x9844: 0x9B6F,\n 0x9845: 0x6AD3,\n 0x9846: 0x7089,\n 0x9847: 0x8CC2,\n 0x9848: 0x8DEF,\n 0x9849: 0x9732,\n 0x984A: 0x52B4,\n 0x984B: 0x5A41,\n 0x984C: 0x5ECA,\n 0x984D: 0x5F04,\n 0x984E: 0x6717,\n 0x984F: 0x697C,\n 0x9850: 0x6994,\n 0x9851: 0x6D6A,\n 0x9852: 0x6F0F,\n 0x9853: 0x7262,\n 0x9854: 0x72FC,\n 0x9855: 0x7BED,\n 0x9856: 0x8001,\n 0x9857: 0x807E,\n 0x9858: 0x874B,\n 0x9859: 0x90CE,\n 0x985A: 0x516D,\n 0x985B: 0x9E93,\n 0x985C: 0x7984,\n 0x985D: 0x808B,\n 0x985E: 0x9332,\n 0x985F: 0x8AD6,\n 0x9860: 0x502D,\n 0x9861: 0x548C,\n 0x9862: 0x8A71,\n 0x9863: 0x6B6A,\n 0x9864: 0x8CC4,\n 0x9865: 0x8107,\n 0x9866: 0x60D1,\n 0x9867: 0x67A0,\n 0x9868: 0x9DF2,\n 0x9869: 0x4E99,\n 0x986A: 0x4E98,\n 0x986B: 0x9C10,\n 0x986C: 0x8A6B,\n 0x986D: 0x85C1,\n 0x986E: 0x8568,\n 0x986F: 0x6900,\n 0x9870: 0x6E7E,\n 0x9871: 0x7897,\n 0x9872: 0x8155,\n 0x989F: 0x5F0C,\n 0x98A0: 0x4E10,\n 0x98A1: 0x4E15,\n 0x98A2: 0x4E2A,\n 0x98A3: 0x4E31,\n 0x98A4: 0x4E36,\n 0x98A5: 0x4E3C,\n 0x98A6: 0x4E3F,\n 0x98A7: 0x4E42,\n 0x98A8: 0x4E56,\n 0x98A9: 0x4E58,\n 0x98AA: 0x4E82,\n 0x98AB: 0x4E85,\n 0x98AC: 0x8C6B,\n 0x98AD: 0x4E8A,\n 0x98AE: 0x8212,\n 0x98AF: 0x5F0D,\n 0x98B0: 0x4E8E,\n 0x98B1: 0x4E9E,\n 0x98B2: 0x4E9F,\n 0x98B3: 0x4EA0,\n 0x98B4: 0x4EA2,\n 0x98B5: 0x4EB0,\n 0x98B6: 0x4EB3,\n 0x98B7: 0x4EB6,\n 0x98B8: 0x4ECE,\n 0x98B9: 0x4ECD,\n 0x98BA: 0x4EC4,\n 0x98BB: 0x4EC6,\n 0x98BC: 0x4EC2,\n 0x98BD: 0x4ED7,\n 0x98BE: 0x4EDE,\n 0x98BF: 0x4EED,\n 0x98C0: 0x4EDF,\n 0x98C1: 0x4EF7,\n 0x98C2: 0x4F09,\n 0x98C3: 0x4F5A,\n 0x98C4: 0x4F30,\n 0x98C5: 0x4F5B,\n 0x98C6: 0x4F5D,\n 0x98C7: 0x4F57,\n 0x98C8: 0x4F47,\n 0x98C9: 0x4F76,\n 0x98CA: 0x4F88,\n 0x98CB: 0x4F8F,\n 0x98CC: 0x4F98,\n 0x98CD: 0x4F7B,\n 0x98CE: 0x4F69,\n 0x98CF: 0x4F70,\n 0x98D0: 0x4F91,\n 0x98D1: 0x4F6F,\n 0x98D2: 0x4F86,\n 0x98D3: 0x4F96,\n 0x98D4: 0x5118,\n 0x98D5: 0x4FD4,\n 0x98D6: 0x4FDF,\n 0x98D7: 0x4FCE,\n 0x98D8: 0x4FD8,\n 0x98D9: 0x4FDB,\n 0x98DA: 0x4FD1,\n 0x98DB: 0x4FDA,\n 0x98DC: 0x4FD0,\n 0x98DD: 0x4FE4,\n 0x98DE: 0x4FE5,\n 0x98DF: 0x501A,\n 0x98E0: 0x5028,\n 0x98E1: 0x5014,\n 0x98E2: 0x502A,\n 0x98E3: 0x5025,\n 0x98E4: 0x5005,\n 0x98E5: 0x4F1C,\n 0x98E6: 0x4FF6,\n 0x98E7: 0x5021,\n 0x98E8: 0x5029,\n 0x98E9: 0x502C,\n 0x98EA: 0x4FFE,\n 0x98EB: 0x4FEF,\n 0x98EC: 0x5011,\n 0x98ED: 0x5006,\n 0x98EE: 0x5043,\n 0x98EF: 0x5047,\n 0x98F0: 0x6703,\n 0x98F1: 0x5055,\n 0x98F2: 0x5050,\n 0x98F3: 0x5048,\n 0x98F4: 0x505A,\n 0x98F5: 0x5056,\n 0x98F6: 0x506C,\n 0x98F7: 0x5078,\n 0x98F8: 0x5080,\n 0x98F9: 0x509A,\n 0x98FA: 0x5085,\n 0x98FB: 0x50B4,\n 0x98FC: 0x50B2,\n 0x9940: 0x50C9,\n 0x9941: 0x50CA,\n 0x9942: 0x50B3,\n 0x9943: 0x50C2,\n 0x9944: 0x50D6,\n 0x9945: 0x50DE,\n 0x9946: 0x50E5,\n 0x9947: 0x50ED,\n 0x9948: 0x50E3,\n 0x9949: 0x50EE,\n 0x994A: 0x50F9,\n 0x994B: 0x50F5,\n 0x994C: 0x5109,\n 0x994D: 0x5101,\n 0x994E: 0x5102,\n 0x994F: 0x5116,\n 0x9950: 0x5115,\n 0x9951: 0x5114,\n 0x9952: 0x511A,\n 0x9953: 0x5121,\n 0x9954: 0x513A,\n 0x9955: 0x5137,\n 0x9956: 0x513C,\n 0x9957: 0x513B,\n 0x9958: 0x513F,\n 0x9959: 0x5140,\n 0x995A: 0x5152,\n 0x995B: 0x514C,\n 0x995C: 0x5154,\n 0x995D: 0x5162,\n 0x995E: 0x7AF8,\n 0x995F: 0x5169,\n 0x9960: 0x516A,\n 0x9961: 0x516E,\n 0x9962: 0x5180,\n 0x9963: 0x5182,\n 0x9964: 0x56D8,\n 0x9965: 0x518C,\n 0x9966: 0x5189,\n 0x9967: 0x518F,\n 0x9968: 0x5191,\n 0x9969: 0x5193,\n 0x996A: 0x5195,\n 0x996B: 0x5196,\n 0x996C: 0x51A4,\n 0x996D: 0x51A6,\n 0x996E: 0x51A2,\n 0x996F: 0x51A9,\n 0x9970: 0x51AA,\n 0x9971: 0x51AB,\n 0x9972: 0x51B3,\n 0x9973: 0x51B1,\n 0x9974: 0x51B2,\n 0x9975: 0x51B0,\n 0x9976: 0x51B5,\n 0x9977: 0x51BD,\n 0x9978: 0x51C5,\n 0x9979: 0x51C9,\n 0x997A: 0x51DB,\n 0x997B: 0x51E0,\n 0x997C: 0x8655,\n 0x997D: 0x51E9,\n 0x997E: 0x51ED,\n 0x9980: 0x51F0,\n 0x9981: 0x51F5,\n 0x9982: 0x51FE,\n 0x9983: 0x5204,\n 0x9984: 0x520B,\n 0x9985: 0x5214,\n 0x9986: 0x520E,\n 0x9987: 0x5227,\n 0x9988: 0x522A,\n 0x9989: 0x522E,\n 0x998A: 0x5233,\n 0x998B: 0x5239,\n 0x998C: 0x524F,\n 0x998D: 0x5244,\n 0x998E: 0x524B,\n 0x998F: 0x524C,\n 0x9990: 0x525E,\n 0x9991: 0x5254,\n 0x9992: 0x526A,\n 0x9993: 0x5274,\n 0x9994: 0x5269,\n 0x9995: 0x5273,\n 0x9996: 0x527F,\n 0x9997: 0x527D,\n 0x9998: 0x528D,\n 0x9999: 0x5294,\n 0x999A: 0x5292,\n 0x999B: 0x5271,\n 0x999C: 0x5288,\n 0x999D: 0x5291,\n 0x999E: 0x8FA8,\n 0x999F: 0x8FA7,\n 0x99A0: 0x52AC,\n 0x99A1: 0x52AD,\n 0x99A2: 0x52BC,\n 0x99A3: 0x52B5,\n 0x99A4: 0x52C1,\n 0x99A5: 0x52CD,\n 0x99A6: 0x52D7,\n 0x99A7: 0x52DE,\n 0x99A8: 0x52E3,\n 0x99A9: 0x52E6,\n 0x99AA: 0x98ED,\n 0x99AB: 0x52E0,\n 0x99AC: 0x52F3,\n 0x99AD: 0x52F5,\n 0x99AE: 0x52F8,\n 0x99AF: 0x52F9,\n 0x99B0: 0x5306,\n 0x99B1: 0x5308,\n 0x99B2: 0x7538,\n 0x99B3: 0x530D,\n 0x99B4: 0x5310,\n 0x99B5: 0x530F,\n 0x99B6: 0x5315,\n 0x99B7: 0x531A,\n 0x99B8: 0x5323,\n 0x99B9: 0x532F,\n 0x99BA: 0x5331,\n 0x99BB: 0x5333,\n 0x99BC: 0x5338,\n 0x99BD: 0x5340,\n 0x99BE: 0x5346,\n 0x99BF: 0x5345,\n 0x99C0: 0x4E17,\n 0x99C1: 0x5349,\n 0x99C2: 0x534D,\n 0x99C3: 0x51D6,\n 0x99C4: 0x535E,\n 0x99C5: 0x5369,\n 0x99C6: 0x536E,\n 0x99C7: 0x5918,\n 0x99C8: 0x537B,\n 0x99C9: 0x5377,\n 0x99CA: 0x5382,\n 0x99CB: 0x5396,\n 0x99CC: 0x53A0,\n 0x99CD: 0x53A6,\n 0x99CE: 0x53A5,\n 0x99CF: 0x53AE,\n 0x99D0: 0x53B0,\n 0x99D1: 0x53B6,\n 0x99D2: 0x53C3,\n 0x99D3: 0x7C12,\n 0x99D4: 0x96D9,\n 0x99D5: 0x53DF,\n 0x99D6: 0x66FC,\n 0x99D7: 0x71EE,\n 0x99D8: 0x53EE,\n 0x99D9: 0x53E8,\n 0x99DA: 0x53ED,\n 0x99DB: 0x53FA,\n 0x99DC: 0x5401,\n 0x99DD: 0x543D,\n 0x99DE: 0x5440,\n 0x99DF: 0x542C,\n 0x99E0: 0x542D,\n 0x99E1: 0x543C,\n 0x99E2: 0x542E,\n 0x99E3: 0x5436,\n 0x99E4: 0x5429,\n 0x99E5: 0x541D,\n 0x99E6: 0x544E,\n 0x99E7: 0x548F,\n 0x99E8: 0x5475,\n 0x99E9: 0x548E,\n 0x99EA: 0x545F,\n 0x99EB: 0x5471,\n 0x99EC: 0x5477,\n 0x99ED: 0x5470,\n 0x99EE: 0x5492,\n 0x99EF: 0x547B,\n 0x99F0: 0x5480,\n 0x99F1: 0x5476,\n 0x99F2: 0x5484,\n 0x99F3: 0x5490,\n 0x99F4: 0x5486,\n 0x99F5: 0x54C7,\n 0x99F6: 0x54A2,\n 0x99F7: 0x54B8,\n 0x99F8: 0x54A5,\n 0x99F9: 0x54AC,\n 0x99FA: 0x54C4,\n 0x99FB: 0x54C8,\n 0x99FC: 0x54A8,\n 0x9A40: 0x54AB,\n 0x9A41: 0x54C2,\n 0x9A42: 0x54A4,\n 0x9A43: 0x54BE,\n 0x9A44: 0x54BC,\n 0x9A45: 0x54D8,\n 0x9A46: 0x54E5,\n 0x9A47: 0x54E6,\n 0x9A48: 0x550F,\n 0x9A49: 0x5514,\n 0x9A4A: 0x54FD,\n 0x9A4B: 0x54EE,\n 0x9A4C: 0x54ED,\n 0x9A4D: 0x54FA,\n 0x9A4E: 0x54E2,\n 0x9A4F: 0x5539,\n 0x9A50: 0x5540,\n 0x9A51: 0x5563,\n 0x9A52: 0x554C,\n 0x9A53: 0x552E,\n 0x9A54: 0x555C,\n 0x9A55: 0x5545,\n 0x9A56: 0x5556,\n 0x9A57: 0x5557,\n 0x9A58: 0x5538,\n 0x9A59: 0x5533,\n 0x9A5A: 0x555D,\n 0x9A5B: 0x5599,\n 0x9A5C: 0x5580,\n 0x9A5D: 0x54AF,\n 0x9A5E: 0x558A,\n 0x9A5F: 0x559F,\n 0x9A60: 0x557B,\n 0x9A61: 0x557E,\n 0x9A62: 0x5598,\n 0x9A63: 0x559E,\n 0x9A64: 0x55AE,\n 0x9A65: 0x557C,\n 0x9A66: 0x5583,\n 0x9A67: 0x55A9,\n 0x9A68: 0x5587,\n 0x9A69: 0x55A8,\n 0x9A6A: 0x55DA,\n 0x9A6B: 0x55C5,\n 0x9A6C: 0x55DF,\n 0x9A6D: 0x55C4,\n 0x9A6E: 0x55DC,\n 0x9A6F: 0x55E4,\n 0x9A70: 0x55D4,\n 0x9A71: 0x5614,\n 0x9A72: 0x55F7,\n 0x9A73: 0x5616,\n 0x9A74: 0x55FE,\n 0x9A75: 0x55FD,\n 0x9A76: 0x561B,\n 0x9A77: 0x55F9,\n 0x9A78: 0x564E,\n 0x9A79: 0x5650,\n 0x9A7A: 0x71DF,\n 0x9A7B: 0x5634,\n 0x9A7C: 0x5636,\n 0x9A7D: 0x5632,\n 0x9A7E: 0x5638,\n 0x9A80: 0x566B,\n 0x9A81: 0x5664,\n 0x9A82: 0x562F,\n 0x9A83: 0x566C,\n 0x9A84: 0x566A,\n 0x9A85: 0x5686,\n 0x9A86: 0x5680,\n 0x9A87: 0x568A,\n 0x9A88: 0x56A0,\n 0x9A89: 0x5694,\n 0x9A8A: 0x568F,\n 0x9A8B: 0x56A5,\n 0x9A8C: 0x56AE,\n 0x9A8D: 0x56B6,\n 0x9A8E: 0x56B4,\n 0x9A8F: 0x56C2,\n 0x9A90: 0x56BC,\n 0x9A91: 0x56C1,\n 0x9A92: 0x56C3,\n 0x9A93: 0x56C0,\n 0x9A94: 0x56C8,\n 0x9A95: 0x56CE,\n 0x9A96: 0x56D1,\n 0x9A97: 0x56D3,\n 0x9A98: 0x56D7,\n 0x9A99: 0x56EE,\n 0x9A9A: 0x56F9,\n 0x9A9B: 0x5700,\n 0x9A9C: 0x56FF,\n 0x9A9D: 0x5704,\n 0x9A9E: 0x5709,\n 0x9A9F: 0x5708,\n 0x9AA0: 0x570B,\n 0x9AA1: 0x570D,\n 0x9AA2: 0x5713,\n 0x9AA3: 0x5718,\n 0x9AA4: 0x5716,\n 0x9AA5: 0x55C7,\n 0x9AA6: 0x571C,\n 0x9AA7: 0x5726,\n 0x9AA8: 0x5737,\n 0x9AA9: 0x5738,\n 0x9AAA: 0x574E,\n 0x9AAB: 0x573B,\n 0x9AAC: 0x5740,\n 0x9AAD: 0x574F,\n 0x9AAE: 0x5769,\n 0x9AAF: 0x57C0,\n 0x9AB0: 0x5788,\n 0x9AB1: 0x5761,\n 0x9AB2: 0x577F,\n 0x9AB3: 0x5789,\n 0x9AB4: 0x5793,\n 0x9AB5: 0x57A0,\n 0x9AB6: 0x57B3,\n 0x9AB7: 0x57A4,\n 0x9AB8: 0x57AA,\n 0x9AB9: 0x57B0,\n 0x9ABA: 0x57C3,\n 0x9ABB: 0x57C6,\n 0x9ABC: 0x57D4,\n 0x9ABD: 0x57D2,\n 0x9ABE: 0x57D3,\n 0x9ABF: 0x580A,\n 0x9AC0: 0x57D6,\n 0x9AC1: 0x57E3,\n 0x9AC2: 0x580B,\n 0x9AC3: 0x5819,\n 0x9AC4: 0x581D,\n 0x9AC5: 0x5872,\n 0x9AC6: 0x5821,\n 0x9AC7: 0x5862,\n 0x9AC8: 0x584B,\n 0x9AC9: 0x5870,\n 0x9ACA: 0x6BC0,\n 0x9ACB: 0x5852,\n 0x9ACC: 0x583D,\n 0x9ACD: 0x5879,\n 0x9ACE: 0x5885,\n 0x9ACF: 0x58B9,\n 0x9AD0: 0x589F,\n 0x9AD1: 0x58AB,\n 0x9AD2: 0x58BA,\n 0x9AD3: 0x58DE,\n 0x9AD4: 0x58BB,\n 0x9AD5: 0x58B8,\n 0x9AD6: 0x58AE,\n 0x9AD7: 0x58C5,\n 0x9AD8: 0x58D3,\n 0x9AD9: 0x58D1,\n 0x9ADA: 0x58D7,\n 0x9ADB: 0x58D9,\n 0x9ADC: 0x58D8,\n 0x9ADD: 0x58E5,\n 0x9ADE: 0x58DC,\n 0x9ADF: 0x58E4,\n 0x9AE0: 0x58DF,\n 0x9AE1: 0x58EF,\n 0x9AE2: 0x58FA,\n 0x9AE3: 0x58F9,\n 0x9AE4: 0x58FB,\n 0x9AE5: 0x58FC,\n 0x9AE6: 0x58FD,\n 0x9AE7: 0x5902,\n 0x9AE8: 0x590A,\n 0x9AE9: 0x5910,\n 0x9AEA: 0x591B,\n 0x9AEB: 0x68A6,\n 0x9AEC: 0x5925,\n 0x9AED: 0x592C,\n 0x9AEE: 0x592D,\n 0x9AEF: 0x5932,\n 0x9AF0: 0x5938,\n 0x9AF1: 0x593E,\n 0x9AF2: 0x7AD2,\n 0x9AF3: 0x5955,\n 0x9AF4: 0x5950,\n 0x9AF5: 0x594E,\n 0x9AF6: 0x595A,\n 0x9AF7: 0x5958,\n 0x9AF8: 0x5962,\n 0x9AF9: 0x5960,\n 0x9AFA: 0x5967,\n 0x9AFB: 0x596C,\n 0x9AFC: 0x5969,\n 0x9B40: 0x5978,\n 0x9B41: 0x5981,\n 0x9B42: 0x599D,\n 0x9B43: 0x4F5E,\n 0x9B44: 0x4FAB,\n 0x9B45: 0x59A3,\n 0x9B46: 0x59B2,\n 0x9B47: 0x59C6,\n 0x9B48: 0x59E8,\n 0x9B49: 0x59DC,\n 0x9B4A: 0x598D,\n 0x9B4B: 0x59D9,\n 0x9B4C: 0x59DA,\n 0x9B4D: 0x5A25,\n 0x9B4E: 0x5A1F,\n 0x9B4F: 0x5A11,\n 0x9B50: 0x5A1C,\n 0x9B51: 0x5A09,\n 0x9B52: 0x5A1A,\n 0x9B53: 0x5A40,\n 0x9B54: 0x5A6C,\n 0x9B55: 0x5A49,\n 0x9B56: 0x5A35,\n 0x9B57: 0x5A36,\n 0x9B58: 0x5A62,\n 0x9B59: 0x5A6A,\n 0x9B5A: 0x5A9A,\n 0x9B5B: 0x5ABC,\n 0x9B5C: 0x5ABE,\n 0x9B5D: 0x5ACB,\n 0x9B5E: 0x5AC2,\n 0x9B5F: 0x5ABD,\n 0x9B60: 0x5AE3,\n 0x9B61: 0x5AD7,\n 0x9B62: 0x5AE6,\n 0x9B63: 0x5AE9,\n 0x9B64: 0x5AD6,\n 0x9B65: 0x5AFA,\n 0x9B66: 0x5AFB,\n 0x9B67: 0x5B0C,\n 0x9B68: 0x5B0B,\n 0x9B69: 0x5B16,\n 0x9B6A: 0x5B32,\n 0x9B6B: 0x5AD0,\n 0x9B6C: 0x5B2A,\n 0x9B6D: 0x5B36,\n 0x9B6E: 0x5B3E,\n 0x9B6F: 0x5B43,\n 0x9B70: 0x5B45,\n 0x9B71: 0x5B40,\n 0x9B72: 0x5B51,\n 0x9B73: 0x5B55,\n 0x9B74: 0x5B5A,\n 0x9B75: 0x5B5B,\n 0x9B76: 0x5B65,\n 0x9B77: 0x5B69,\n 0x9B78: 0x5B70,\n 0x9B79: 0x5B73,\n 0x9B7A: 0x5B75,\n 0x9B7B: 0x5B78,\n 0x9B7C: 0x6588,\n 0x9B7D: 0x5B7A,\n 0x9B7E: 0x5B80,\n 0x9B80: 0x5B83,\n 0x9B81: 0x5BA6,\n 0x9B82: 0x5BB8,\n 0x9B83: 0x5BC3,\n 0x9B84: 0x5BC7,\n 0x9B85: 0x5BC9,\n 0x9B86: 0x5BD4,\n 0x9B87: 0x5BD0,\n 0x9B88: 0x5BE4,\n 0x9B89: 0x5BE6,\n 0x9B8A: 0x5BE2,\n 0x9B8B: 0x5BDE,\n 0x9B8C: 0x5BE5,\n 0x9B8D: 0x5BEB,\n 0x9B8E: 0x5BF0,\n 0x9B8F: 0x5BF6,\n 0x9B90: 0x5BF3,\n 0x9B91: 0x5C05,\n 0x9B92: 0x5C07,\n 0x9B93: 0x5C08,\n 0x9B94: 0x5C0D,\n 0x9B95: 0x5C13,\n 0x9B96: 0x5C20,\n 0x9B97: 0x5C22,\n 0x9B98: 0x5C28,\n 0x9B99: 0x5C38,\n 0x9B9A: 0x5C39,\n 0x9B9B: 0x5C41,\n 0x9B9C: 0x5C46,\n 0x9B9D: 0x5C4E,\n 0x9B9E: 0x5C53,\n 0x9B9F: 0x5C50,\n 0x9BA0: 0x5C4F,\n 0x9BA1: 0x5B71,\n 0x9BA2: 0x5C6C,\n 0x9BA3: 0x5C6E,\n 0x9BA4: 0x4E62,\n 0x9BA5: 0x5C76,\n 0x9BA6: 0x5C79,\n 0x9BA7: 0x5C8C,\n 0x9BA8: 0x5C91,\n 0x9BA9: 0x5C94,\n 0x9BAA: 0x599B,\n 0x9BAB: 0x5CAB,\n 0x9BAC: 0x5CBB,\n 0x9BAD: 0x5CB6,\n 0x9BAE: 0x5CBC,\n 0x9BAF: 0x5CB7,\n 0x9BB0: 0x5CC5,\n 0x9BB1: 0x5CBE,\n 0x9BB2: 0x5CC7,\n 0x9BB3: 0x5CD9,\n 0x9BB4: 0x5CE9,\n 0x9BB5: 0x5CFD,\n 0x9BB6: 0x5CFA,\n 0x9BB7: 0x5CED,\n 0x9BB8: 0x5D8C,\n 0x9BB9: 0x5CEA,\n 0x9BBA: 0x5D0B,\n 0x9BBB: 0x5D15,\n 0x9BBC: 0x5D17,\n 0x9BBD: 0x5D5C,\n 0x9BBE: 0x5D1F,\n 0x9BBF: 0x5D1B,\n 0x9BC0: 0x5D11,\n 0x9BC1: 0x5D14,\n 0x9BC2: 0x5D22,\n 0x9BC3: 0x5D1A,\n 0x9BC4: 0x5D19,\n 0x9BC5: 0x5D18,\n 0x9BC6: 0x5D4C,\n 0x9BC7: 0x5D52,\n 0x9BC8: 0x5D4E,\n 0x9BC9: 0x5D4B,\n 0x9BCA: 0x5D6C,\n 0x9BCB: 0x5D73,\n 0x9BCC: 0x5D76,\n 0x9BCD: 0x5D87,\n 0x9BCE: 0x5D84,\n 0x9BCF: 0x5D82,\n 0x9BD0: 0x5DA2,\n 0x9BD1: 0x5D9D,\n 0x9BD2: 0x5DAC,\n 0x9BD3: 0x5DAE,\n 0x9BD4: 0x5DBD,\n 0x9BD5: 0x5D90,\n 0x9BD6: 0x5DB7,\n 0x9BD7: 0x5DBC,\n 0x9BD8: 0x5DC9,\n 0x9BD9: 0x5DCD,\n 0x9BDA: 0x5DD3,\n 0x9BDB: 0x5DD2,\n 0x9BDC: 0x5DD6,\n 0x9BDD: 0x5DDB,\n 0x9BDE: 0x5DEB,\n 0x9BDF: 0x5DF2,\n 0x9BE0: 0x5DF5,\n 0x9BE1: 0x5E0B,\n 0x9BE2: 0x5E1A,\n 0x9BE3: 0x5E19,\n 0x9BE4: 0x5E11,\n 0x9BE5: 0x5E1B,\n 0x9BE6: 0x5E36,\n 0x9BE7: 0x5E37,\n 0x9BE8: 0x5E44,\n 0x9BE9: 0x5E43,\n 0x9BEA: 0x5E40,\n 0x9BEB: 0x5E4E,\n 0x9BEC: 0x5E57,\n 0x9BED: 0x5E54,\n 0x9BEE: 0x5E5F,\n 0x9BEF: 0x5E62,\n 0x9BF0: 0x5E64,\n 0x9BF1: 0x5E47,\n 0x9BF2: 0x5E75,\n 0x9BF3: 0x5E76,\n 0x9BF4: 0x5E7A,\n 0x9BF5: 0x9EBC,\n 0x9BF6: 0x5E7F,\n 0x9BF7: 0x5EA0,\n 0x9BF8: 0x5EC1,\n 0x9BF9: 0x5EC2,\n 0x9BFA: 0x5EC8,\n 0x9BFB: 0x5ED0,\n 0x9BFC: 0x5ECF,\n 0x9C40: 0x5ED6,\n 0x9C41: 0x5EE3,\n 0x9C42: 0x5EDD,\n 0x9C43: 0x5EDA,\n 0x9C44: 0x5EDB,\n 0x9C45: 0x5EE2,\n 0x9C46: 0x5EE1,\n 0x9C47: 0x5EE8,\n 0x9C48: 0x5EE9,\n 0x9C49: 0x5EEC,\n 0x9C4A: 0x5EF1,\n 0x9C4B: 0x5EF3,\n 0x9C4C: 0x5EF0,\n 0x9C4D: 0x5EF4,\n 0x9C4E: 0x5EF8,\n 0x9C4F: 0x5EFE,\n 0x9C50: 0x5F03,\n 0x9C51: 0x5F09,\n 0x9C52: 0x5F5D,\n 0x9C53: 0x5F5C,\n 0x9C54: 0x5F0B,\n 0x9C55: 0x5F11,\n 0x9C56: 0x5F16,\n 0x9C57: 0x5F29,\n 0x9C58: 0x5F2D,\n 0x9C59: 0x5F38,\n 0x9C5A: 0x5F41,\n 0x9C5B: 0x5F48,\n 0x9C5C: 0x5F4C,\n 0x9C5D: 0x5F4E,\n 0x9C5E: 0x5F2F,\n 0x9C5F: 0x5F51,\n 0x9C60: 0x5F56,\n 0x9C61: 0x5F57,\n 0x9C62: 0x5F59,\n 0x9C63: 0x5F61,\n 0x9C64: 0x5F6D,\n 0x9C65: 0x5F73,\n 0x9C66: 0x5F77,\n 0x9C67: 0x5F83,\n 0x9C68: 0x5F82,\n 0x9C69: 0x5F7F,\n 0x9C6A: 0x5F8A,\n 0x9C6B: 0x5F88,\n 0x9C6C: 0x5F91,\n 0x9C6D: 0x5F87,\n 0x9C6E: 0x5F9E,\n 0x9C6F: 0x5F99,\n 0x9C70: 0x5F98,\n 0x9C71: 0x5FA0,\n 0x9C72: 0x5FA8,\n 0x9C73: 0x5FAD,\n 0x9C74: 0x5FBC,\n 0x9C75: 0x5FD6,\n 0x9C76: 0x5FFB,\n 0x9C77: 0x5FE4,\n 0x9C78: 0x5FF8,\n 0x9C79: 0x5FF1,\n 0x9C7A: 0x5FDD,\n 0x9C7B: 0x60B3,\n 0x9C7C: 0x5FFF,\n 0x9C7D: 0x6021,\n 0x9C7E: 0x6060,\n 0x9C80: 0x6019,\n 0x9C81: 0x6010,\n 0x9C82: 0x6029,\n 0x9C83: 0x600E,\n 0x9C84: 0x6031,\n 0x9C85: 0x601B,\n 0x9C86: 0x6015,\n 0x9C87: 0x602B,\n 0x9C88: 0x6026,\n 0x9C89: 0x600F,\n 0x9C8A: 0x603A,\n 0x9C8B: 0x605A,\n 0x9C8C: 0x6041,\n 0x9C8D: 0x606A,\n 0x9C8E: 0x6077,\n 0x9C8F: 0x605F,\n 0x9C90: 0x604A,\n 0x9C91: 0x6046,\n 0x9C92: 0x604D,\n 0x9C93: 0x6063,\n 0x9C94: 0x6043,\n 0x9C95: 0x6064,\n 0x9C96: 0x6042,\n 0x9C97: 0x606C,\n 0x9C98: 0x606B,\n 0x9C99: 0x6059,\n 0x9C9A: 0x6081,\n 0x9C9B: 0x608D,\n 0x9C9C: 0x60E7,\n 0x9C9D: 0x6083,\n 0x9C9E: 0x609A,\n 0x9C9F: 0x6084,\n 0x9CA0: 0x609B,\n 0x9CA1: 0x6096,\n 0x9CA2: 0x6097,\n 0x9CA3: 0x6092,\n 0x9CA4: 0x60A7,\n 0x9CA5: 0x608B,\n 0x9CA6: 0x60E1,\n 0x9CA7: 0x60B8,\n 0x9CA8: 0x60E0,\n 0x9CA9: 0x60D3,\n 0x9CAA: 0x60B4,\n 0x9CAB: 0x5FF0,\n 0x9CAC: 0x60BD,\n 0x9CAD: 0x60C6,\n 0x9CAE: 0x60B5,\n 0x9CAF: 0x60D8,\n 0x9CB0: 0x614D,\n 0x9CB1: 0x6115,\n 0x9CB2: 0x6106,\n 0x9CB3: 0x60F6,\n 0x9CB4: 0x60F7,\n 0x9CB5: 0x6100,\n 0x9CB6: 0x60F4,\n 0x9CB7: 0x60FA,\n 0x9CB8: 0x6103,\n 0x9CB9: 0x6121,\n 0x9CBA: 0x60FB,\n 0x9CBB: 0x60F1,\n 0x9CBC: 0x610D,\n 0x9CBD: 0x610E,\n 0x9CBE: 0x6147,\n 0x9CBF: 0x613E,\n 0x9CC0: 0x6128,\n 0x9CC1: 0x6127,\n 0x9CC2: 0x614A,\n 0x9CC3: 0x613F,\n 0x9CC4: 0x613C,\n 0x9CC5: 0x612C,\n 0x9CC6: 0x6134,\n 0x9CC7: 0x613D,\n 0x9CC8: 0x6142,\n 0x9CC9: 0x6144,\n 0x9CCA: 0x6173,\n 0x9CCB: 0x6177,\n 0x9CCC: 0x6158,\n 0x9CCD: 0x6159,\n 0x9CCE: 0x615A,\n 0x9CCF: 0x616B,\n 0x9CD0: 0x6174,\n 0x9CD1: 0x616F,\n 0x9CD2: 0x6165,\n 0x9CD3: 0x6171,\n 0x9CD4: 0x615F,\n 0x9CD5: 0x615D,\n 0x9CD6: 0x6153,\n 0x9CD7: 0x6175,\n 0x9CD8: 0x6199,\n 0x9CD9: 0x6196,\n 0x9CDA: 0x6187,\n 0x9CDB: 0x61AC,\n 0x9CDC: 0x6194,\n 0x9CDD: 0x619A,\n 0x9CDE: 0x618A,\n 0x9CDF: 0x6191,\n 0x9CE0: 0x61AB,\n 0x9CE1: 0x61AE,\n 0x9CE2: 0x61CC,\n 0x9CE3: 0x61CA,\n 0x9CE4: 0x61C9,\n 0x9CE5: 0x61F7,\n 0x9CE6: 0x61C8,\n 0x9CE7: 0x61C3,\n 0x9CE8: 0x61C6,\n 0x9CE9: 0x61BA,\n 0x9CEA: 0x61CB,\n 0x9CEB: 0x7F79,\n 0x9CEC: 0x61CD,\n 0x9CED: 0x61E6,\n 0x9CEE: 0x61E3,\n 0x9CEF: 0x61F6,\n 0x9CF0: 0x61FA,\n 0x9CF1: 0x61F4,\n 0x9CF2: 0x61FF,\n 0x9CF3: 0x61FD,\n 0x9CF4: 0x61FC,\n 0x9CF5: 0x61FE,\n 0x9CF6: 0x6200,\n 0x9CF7: 0x6208,\n 0x9CF8: 0x6209,\n 0x9CF9: 0x620D,\n 0x9CFA: 0x620C,\n 0x9CFB: 0x6214,\n 0x9CFC: 0x621B,\n 0x9D40: 0x621E,\n 0x9D41: 0x6221,\n 0x9D42: 0x622A,\n 0x9D43: 0x622E,\n 0x9D44: 0x6230,\n 0x9D45: 0x6232,\n 0x9D46: 0x6233,\n 0x9D47: 0x6241,\n 0x9D48: 0x624E,\n 0x9D49: 0x625E,\n 0x9D4A: 0x6263,\n 0x9D4B: 0x625B,\n 0x9D4C: 0x6260,\n 0x9D4D: 0x6268,\n 0x9D4E: 0x627C,\n 0x9D4F: 0x6282,\n 0x9D50: 0x6289,\n 0x9D51: 0x627E,\n 0x9D52: 0x6292,\n 0x9D53: 0x6293,\n 0x9D54: 0x6296,\n 0x9D55: 0x62D4,\n 0x9D56: 0x6283,\n 0x9D57: 0x6294,\n 0x9D58: 0x62D7,\n 0x9D59: 0x62D1,\n 0x9D5A: 0x62BB,\n 0x9D5B: 0x62CF,\n 0x9D5C: 0x62FF,\n 0x9D5D: 0x62C6,\n 0x9D5E: 0x64D4,\n 0x9D5F: 0x62C8,\n 0x9D60: 0x62DC,\n 0x9D61: 0x62CC,\n 0x9D62: 0x62CA,\n 0x9D63: 0x62C2,\n 0x9D64: 0x62C7,\n 0x9D65: 0x629B,\n 0x9D66: 0x62C9,\n 0x9D67: 0x630C,\n 0x9D68: 0x62EE,\n 0x9D69: 0x62F1,\n 0x9D6A: 0x6327,\n 0x9D6B: 0x6302,\n 0x9D6C: 0x6308,\n 0x9D6D: 0x62EF,\n 0x9D6E: 0x62F5,\n 0x9D6F: 0x6350,\n 0x9D70: 0x633E,\n 0x9D71: 0x634D,\n 0x9D72: 0x641C,\n 0x9D73: 0x634F,\n 0x9D74: 0x6396,\n 0x9D75: 0x638E,\n 0x9D76: 0x6380,\n 0x9D77: 0x63AB,\n 0x9D78: 0x6376,\n 0x9D79: 0x63A3,\n 0x9D7A: 0x638F,\n 0x9D7B: 0x6389,\n 0x9D7C: 0x639F,\n 0x9D7D: 0x63B5,\n 0x9D7E: 0x636B,\n 0x9D80: 0x6369,\n 0x9D81: 0x63BE,\n 0x9D82: 0x63E9,\n 0x9D83: 0x63C0,\n 0x9D84: 0x63C6,\n 0x9D85: 0x63E3,\n 0x9D86: 0x63C9,\n 0x9D87: 0x63D2,\n 0x9D88: 0x63F6,\n 0x9D89: 0x63C4,\n 0x9D8A: 0x6416,\n 0x9D8B: 0x6434,\n 0x9D8C: 0x6406,\n 0x9D8D: 0x6413,\n 0x9D8E: 0x6426,\n 0x9D8F: 0x6436,\n 0x9D90: 0x651D,\n 0x9D91: 0x6417,\n 0x9D92: 0x6428,\n 0x9D93: 0x640F,\n 0x9D94: 0x6467,\n 0x9D95: 0x646F,\n 0x9D96: 0x6476,\n 0x9D97: 0x644E,\n 0x9D98: 0x652A,\n 0x9D99: 0x6495,\n 0x9D9A: 0x6493,\n 0x9D9B: 0x64A5,\n 0x9D9C: 0x64A9,\n 0x9D9D: 0x6488,\n 0x9D9E: 0x64BC,\n 0x9D9F: 0x64DA,\n 0x9DA0: 0x64D2,\n 0x9DA1: 0x64C5,\n 0x9DA2: 0x64C7,\n 0x9DA3: 0x64BB,\n 0x9DA4: 0x64D8,\n 0x9DA5: 0x64C2,\n 0x9DA6: 0x64F1,\n 0x9DA7: 0x64E7,\n 0x9DA8: 0x8209,\n 0x9DA9: 0x64E0,\n 0x9DAA: 0x64E1,\n 0x9DAB: 0x62AC,\n 0x9DAC: 0x64E3,\n 0x9DAD: 0x64EF,\n 0x9DAE: 0x652C,\n 0x9DAF: 0x64F6,\n 0x9DB0: 0x64F4,\n 0x9DB1: 0x64F2,\n 0x9DB2: 0x64FA,\n 0x9DB3: 0x6500,\n 0x9DB4: 0x64FD,\n 0x9DB5: 0x6518,\n 0x9DB6: 0x651C,\n 0x9DB7: 0x6505,\n 0x9DB8: 0x6524,\n 0x9DB9: 0x6523,\n 0x9DBA: 0x652B,\n 0x9DBB: 0x6534,\n 0x9DBC: 0x6535,\n 0x9DBD: 0x6537,\n 0x9DBE: 0x6536,\n 0x9DBF: 0x6538,\n 0x9DC0: 0x754B,\n 0x9DC1: 0x6548,\n 0x9DC2: 0x6556,\n 0x9DC3: 0x6555,\n 0x9DC4: 0x654D,\n 0x9DC5: 0x6558,\n 0x9DC6: 0x655E,\n 0x9DC7: 0x655D,\n 0x9DC8: 0x6572,\n 0x9DC9: 0x6578,\n 0x9DCA: 0x6582,\n 0x9DCB: 0x6583,\n 0x9DCC: 0x8B8A,\n 0x9DCD: 0x659B,\n 0x9DCE: 0x659F,\n 0x9DCF: 0x65AB,\n 0x9DD0: 0x65B7,\n 0x9DD1: 0x65C3,\n 0x9DD2: 0x65C6,\n 0x9DD3: 0x65C1,\n 0x9DD4: 0x65C4,\n 0x9DD5: 0x65CC,\n 0x9DD6: 0x65D2,\n 0x9DD7: 0x65DB,\n 0x9DD8: 0x65D9,\n 0x9DD9: 0x65E0,\n 0x9DDA: 0x65E1,\n 0x9DDB: 0x65F1,\n 0x9DDC: 0x6772,\n 0x9DDD: 0x660A,\n 0x9DDE: 0x6603,\n 0x9DDF: 0x65FB,\n 0x9DE0: 0x6773,\n 0x9DE1: 0x6635,\n 0x9DE2: 0x6636,\n 0x9DE3: 0x6634,\n 0x9DE4: 0x661C,\n 0x9DE5: 0x664F,\n 0x9DE6: 0x6644,\n 0x9DE7: 0x6649,\n 0x9DE8: 0x6641,\n 0x9DE9: 0x665E,\n 0x9DEA: 0x665D,\n 0x9DEB: 0x6664,\n 0x9DEC: 0x6667,\n 0x9DED: 0x6668,\n 0x9DEE: 0x665F,\n 0x9DEF: 0x6662,\n 0x9DF0: 0x6670,\n 0x9DF1: 0x6683,\n 0x9DF2: 0x6688,\n 0x9DF3: 0x668E,\n 0x9DF4: 0x6689,\n 0x9DF5: 0x6684,\n 0x9DF6: 0x6698,\n 0x9DF7: 0x669D,\n 0x9DF8: 0x66C1,\n 0x9DF9: 0x66B9,\n 0x9DFA: 0x66C9,\n 0x9DFB: 0x66BE,\n 0x9DFC: 0x66BC,\n 0x9E40: 0x66C4,\n 0x9E41: 0x66B8,\n 0x9E42: 0x66D6,\n 0x9E43: 0x66DA,\n 0x9E44: 0x66E0,\n 0x9E45: 0x663F,\n 0x9E46: 0x66E6,\n 0x9E47: 0x66E9,\n 0x9E48: 0x66F0,\n 0x9E49: 0x66F5,\n 0x9E4A: 0x66F7,\n 0x9E4B: 0x670F,\n 0x9E4C: 0x6716,\n 0x9E4D: 0x671E,\n 0x9E4E: 0x6726,\n 0x9E4F: 0x6727,\n 0x9E50: 0x9738,\n 0x9E51: 0x672E,\n 0x9E52: 0x673F,\n 0x9E53: 0x6736,\n 0x9E54: 0x6741,\n 0x9E55: 0x6738,\n 0x9E56: 0x6737,\n 0x9E57: 0x6746,\n 0x9E58: 0x675E,\n 0x9E59: 0x6760,\n 0x9E5A: 0x6759,\n 0x9E5B: 0x6763,\n 0x9E5C: 0x6764,\n 0x9E5D: 0x6789,\n 0x9E5E: 0x6770,\n 0x9E5F: 0x67A9,\n 0x9E60: 0x677C,\n 0x9E61: 0x676A,\n 0x9E62: 0x678C,\n 0x9E63: 0x678B,\n 0x9E64: 0x67A6,\n 0x9E65: 0x67A1,\n 0x9E66: 0x6785,\n 0x9E67: 0x67B7,\n 0x9E68: 0x67EF,\n 0x9E69: 0x67B4,\n 0x9E6A: 0x67EC,\n 0x9E6B: 0x67B3,\n 0x9E6C: 0x67E9,\n 0x9E6D: 0x67B8,\n 0x9E6E: 0x67E4,\n 0x9E6F: 0x67DE,\n 0x9E70: 0x67DD,\n 0x9E71: 0x67E2,\n 0x9E72: 0x67EE,\n 0x9E73: 0x67B9,\n 0x9E74: 0x67CE,\n 0x9E75: 0x67C6,\n 0x9E76: 0x67E7,\n 0x9E77: 0x6A9C,\n 0x9E78: 0x681E,\n 0x9E79: 0x6846,\n 0x9E7A: 0x6829,\n 0x9E7B: 0x6840,\n 0x9E7C: 0x684D,\n 0x9E7D: 0x6832,\n 0x9E7E: 0x684E,\n 0x9E80: 0x68B3,\n 0x9E81: 0x682B,\n 0x9E82: 0x6859,\n 0x9E83: 0x6863,\n 0x9E84: 0x6877,\n 0x9E85: 0x687F,\n 0x9E86: 0x689F,\n 0x9E87: 0x688F,\n 0x9E88: 0x68AD,\n 0x9E89: 0x6894,\n 0x9E8A: 0x689D,\n 0x9E8B: 0x689B,\n 0x9E8C: 0x6883,\n 0x9E8D: 0x6AAE,\n 0x9E8E: 0x68B9,\n 0x9E8F: 0x6874,\n 0x9E90: 0x68B5,\n 0x9E91: 0x68A0,\n 0x9E92: 0x68BA,\n 0x9E93: 0x690F,\n 0x9E94: 0x688D,\n 0x9E95: 0x687E,\n 0x9E96: 0x6901,\n 0x9E97: 0x68CA,\n 0x9E98: 0x6908,\n 0x9E99: 0x68D8,\n 0x9E9A: 0x6922,\n 0x9E9B: 0x6926,\n 0x9E9C: 0x68E1,\n 0x9E9D: 0x690C,\n 0x9E9E: 0x68CD,\n 0x9E9F: 0x68D4,\n 0x9EA0: 0x68E7,\n 0x9EA1: 0x68D5,\n 0x9EA2: 0x6936,\n 0x9EA3: 0x6912,\n 0x9EA4: 0x6904,\n 0x9EA5: 0x68D7,\n 0x9EA6: 0x68E3,\n 0x9EA7: 0x6925,\n 0x9EA8: 0x68F9,\n 0x9EA9: 0x68E0,\n 0x9EAA: 0x68EF,\n 0x9EAB: 0x6928,\n 0x9EAC: 0x692A,\n 0x9EAD: 0x691A,\n 0x9EAE: 0x6923,\n 0x9EAF: 0x6921,\n 0x9EB0: 0x68C6,\n 0x9EB1: 0x6979,\n 0x9EB2: 0x6977,\n 0x9EB3: 0x695C,\n 0x9EB4: 0x6978,\n 0x9EB5: 0x696B,\n 0x9EB6: 0x6954,\n 0x9EB7: 0x697E,\n 0x9EB8: 0x696E,\n 0x9EB9: 0x6939,\n 0x9EBA: 0x6974,\n 0x9EBB: 0x693D,\n 0x9EBC: 0x6959,\n 0x9EBD: 0x6930,\n 0x9EBE: 0x6961,\n 0x9EBF: 0x695E,\n 0x9EC0: 0x695D,\n 0x9EC1: 0x6981,\n 0x9EC2: 0x696A,\n 0x9EC3: 0x69B2,\n 0x9EC4: 0x69AE,\n 0x9EC5: 0x69D0,\n 0x9EC6: 0x69BF,\n 0x9EC7: 0x69C1,\n 0x9EC8: 0x69D3,\n 0x9EC9: 0x69BE,\n 0x9ECA: 0x69CE,\n 0x9ECB: 0x5BE8,\n 0x9ECC: 0x69CA,\n 0x9ECD: 0x69DD,\n 0x9ECE: 0x69BB,\n 0x9ECF: 0x69C3,\n 0x9ED0: 0x69A7,\n 0x9ED1: 0x6A2E,\n 0x9ED2: 0x6991,\n 0x9ED3: 0x69A0,\n 0x9ED4: 0x699C,\n 0x9ED5: 0x6995,\n 0x9ED6: 0x69B4,\n 0x9ED7: 0x69DE,\n 0x9ED8: 0x69E8,\n 0x9ED9: 0x6A02,\n 0x9EDA: 0x6A1B,\n 0x9EDB: 0x69FF,\n 0x9EDC: 0x6B0A,\n 0x9EDD: 0x69F9,\n 0x9EDE: 0x69F2,\n 0x9EDF: 0x69E7,\n 0x9EE0: 0x6A05,\n 0x9EE1: 0x69B1,\n 0x9EE2: 0x6A1E,\n 0x9EE3: 0x69ED,\n 0x9EE4: 0x6A14,\n 0x9EE5: 0x69EB,\n 0x9EE6: 0x6A0A,\n 0x9EE7: 0x6A12,\n 0x9EE8: 0x6AC1,\n 0x9EE9: 0x6A23,\n 0x9EEA: 0x6A13,\n 0x9EEB: 0x6A44,\n 0x9EEC: 0x6A0C,\n 0x9EED: 0x6A72,\n 0x9EEE: 0x6A36,\n 0x9EEF: 0x6A78,\n 0x9EF0: 0x6A47,\n 0x9EF1: 0x6A62,\n 0x9EF2: 0x6A59,\n 0x9EF3: 0x6A66,\n 0x9EF4: 0x6A48,\n 0x9EF5: 0x6A38,\n 0x9EF6: 0x6A22,\n 0x9EF7: 0x6A90,\n 0x9EF8: 0x6A8D,\n 0x9EF9: 0x6AA0,\n 0x9EFA: 0x6A84,\n 0x9EFB: 0x6AA2,\n 0x9EFC: 0x6AA3,\n 0x9F40: 0x6A97,\n 0x9F41: 0x8617,\n 0x9F42: 0x6ABB,\n 0x9F43: 0x6AC3,\n 0x9F44: 0x6AC2,\n 0x9F45: 0x6AB8,\n 0x9F46: 0x6AB3,\n 0x9F47: 0x6AAC,\n 0x9F48: 0x6ADE,\n 0x9F49: 0x6AD1,\n 0x9F4A: 0x6ADF,\n 0x9F4B: 0x6AAA,\n 0x9F4C: 0x6ADA,\n 0x9F4D: 0x6AEA,\n 0x9F4E: 0x6AFB,\n 0x9F4F: 0x6B05,\n 0x9F50: 0x8616,\n 0x9F51: 0x6AFA,\n 0x9F52: 0x6B12,\n 0x9F53: 0x6B16,\n 0x9F54: 0x9B31,\n 0x9F55: 0x6B1F,\n 0x9F56: 0x6B38,\n 0x9F57: 0x6B37,\n 0x9F58: 0x76DC,\n 0x9F59: 0x6B39,\n 0x9F5A: 0x98EE,\n 0x9F5B: 0x6B47,\n 0x9F5C: 0x6B43,\n 0x9F5D: 0x6B49,\n 0x9F5E: 0x6B50,\n 0x9F5F: 0x6B59,\n 0x9F60: 0x6B54,\n 0x9F61: 0x6B5B,\n 0x9F62: 0x6B5F,\n 0x9F63: 0x6B61,\n 0x9F64: 0x6B78,\n 0x9F65: 0x6B79,\n 0x9F66: 0x6B7F,\n 0x9F67: 0x6B80,\n 0x9F68: 0x6B84,\n 0x9F69: 0x6B83,\n 0x9F6A: 0x6B8D,\n 0x9F6B: 0x6B98,\n 0x9F6C: 0x6B95,\n 0x9F6D: 0x6B9E,\n 0x9F6E: 0x6BA4,\n 0x9F6F: 0x6BAA,\n 0x9F70: 0x6BAB,\n 0x9F71: 0x6BAF,\n 0x9F72: 0x6BB2,\n 0x9F73: 0x6BB1,\n 0x9F74: 0x6BB3,\n 0x9F75: 0x6BB7,\n 0x9F76: 0x6BBC,\n 0x9F77: 0x6BC6,\n 0x9F78: 0x6BCB,\n 0x9F79: 0x6BD3,\n 0x9F7A: 0x6BDF,\n 0x9F7B: 0x6BEC,\n 0x9F7C: 0x6BEB,\n 0x9F7D: 0x6BF3,\n 0x9F7E: 0x6BEF,\n 0x9F80: 0x9EBE,\n 0x9F81: 0x6C08,\n 0x9F82: 0x6C13,\n 0x9F83: 0x6C14,\n 0x9F84: 0x6C1B,\n 0x9F85: 0x6C24,\n 0x9F86: 0x6C23,\n 0x9F87: 0x6C5E,\n 0x9F88: 0x6C55,\n 0x9F89: 0x6C62,\n 0x9F8A: 0x6C6A,\n 0x9F8B: 0x6C82,\n 0x9F8C: 0x6C8D,\n 0x9F8D: 0x6C9A,\n 0x9F8E: 0x6C81,\n 0x9F8F: 0x6C9B,\n 0x9F90: 0x6C7E,\n 0x9F91: 0x6C68,\n 0x9F92: 0x6C73,\n 0x9F93: 0x6C92,\n 0x9F94: 0x6C90,\n 0x9F95: 0x6CC4,\n 0x9F96: 0x6CF1,\n 0x9F97: 0x6CD3,\n 0x9F98: 0x6CBD,\n 0x9F99: 0x6CD7,\n 0x9F9A: 0x6CC5,\n 0x9F9B: 0x6CDD,\n 0x9F9C: 0x6CAE,\n 0x9F9D: 0x6CB1,\n 0x9F9E: 0x6CBE,\n 0x9F9F: 0x6CBA,\n 0x9FA0: 0x6CDB,\n 0x9FA1: 0x6CEF,\n 0x9FA2: 0x6CD9,\n 0x9FA3: 0x6CEA,\n 0x9FA4: 0x6D1F,\n 0x9FA5: 0x884D,\n 0x9FA6: 0x6D36,\n 0x9FA7: 0x6D2B,\n 0x9FA8: 0x6D3D,\n 0x9FA9: 0x6D38,\n 0x9FAA: 0x6D19,\n 0x9FAB: 0x6D35,\n 0x9FAC: 0x6D33,\n 0x9FAD: 0x6D12,\n 0x9FAE: 0x6D0C,\n 0x9FAF: 0x6D63,\n 0x9FB0: 0x6D93,\n 0x9FB1: 0x6D64,\n 0x9FB2: 0x6D5A,\n 0x9FB3: 0x6D79,\n 0x9FB4: 0x6D59,\n 0x9FB5: 0x6D8E,\n 0x9FB6: 0x6D95,\n 0x9FB7: 0x6FE4,\n 0x9FB8: 0x6D85,\n 0x9FB9: 0x6DF9,\n 0x9FBA: 0x6E15,\n 0x9FBB: 0x6E0A,\n 0x9FBC: 0x6DB5,\n 0x9FBD: 0x6DC7,\n 0x9FBE: 0x6DE6,\n 0x9FBF: 0x6DB8,\n 0x9FC0: 0x6DC6,\n 0x9FC1: 0x6DEC,\n 0x9FC2: 0x6DDE,\n 0x9FC3: 0x6DCC,\n 0x9FC4: 0x6DE8,\n 0x9FC5: 0x6DD2,\n 0x9FC6: 0x6DC5,\n 0x9FC7: 0x6DFA,\n 0x9FC8: 0x6DD9,\n 0x9FC9: 0x6DE4,\n 0x9FCA: 0x6DD5,\n 0x9FCB: 0x6DEA,\n 0x9FCC: 0x6DEE,\n 0x9FCD: 0x6E2D,\n 0x9FCE: 0x6E6E,\n 0x9FCF: 0x6E2E,\n 0x9FD0: 0x6E19,\n 0x9FD1: 0x6E72,\n 0x9FD2: 0x6E5F,\n 0x9FD3: 0x6E3E,\n 0x9FD4: 0x6E23,\n 0x9FD5: 0x6E6B,\n 0x9FD6: 0x6E2B,\n 0x9FD7: 0x6E76,\n 0x9FD8: 0x6E4D,\n 0x9FD9: 0x6E1F,\n 0x9FDA: 0x6E43,\n 0x9FDB: 0x6E3A,\n 0x9FDC: 0x6E4E,\n 0x9FDD: 0x6E24,\n 0x9FDE: 0x6EFF,\n 0x9FDF: 0x6E1D,\n 0x9FE0: 0x6E38,\n 0x9FE1: 0x6E82,\n 0x9FE2: 0x6EAA,\n 0x9FE3: 0x6E98,\n 0x9FE4: 0x6EC9,\n 0x9FE5: 0x6EB7,\n 0x9FE6: 0x6ED3,\n 0x9FE7: 0x6EBD,\n 0x9FE8: 0x6EAF,\n 0x9FE9: 0x6EC4,\n 0x9FEA: 0x6EB2,\n 0x9FEB: 0x6ED4,\n 0x9FEC: 0x6ED5,\n 0x9FED: 0x6E8F,\n 0x9FEE: 0x6EA5,\n 0x9FEF: 0x6EC2,\n 0x9FF0: 0x6E9F,\n 0x9FF1: 0x6F41,\n 0x9FF2: 0x6F11,\n 0x9FF3: 0x704C,\n 0x9FF4: 0x6EEC,\n 0x9FF5: 0x6EF8,\n 0x9FF6: 0x6EFE,\n 0x9FF7: 0x6F3F,\n 0x9FF8: 0x6EF2,\n 0x9FF9: 0x6F31,\n 0x9FFA: 0x6EEF,\n 0x9FFB: 0x6F32,\n 0x9FFC: 0x6ECC,\n 0xA1: 0xFF61,\n 0xA2: 0xFF62,\n 0xA3: 0xFF63,\n 0xA4: 0xFF64,\n 0xA5: 0xFF65,\n 0xA6: 0xFF66,\n 0xA7: 0xFF67,\n 0xA8: 0xFF68,\n 0xA9: 0xFF69,\n 0xAA: 0xFF6A,\n 0xAB: 0xFF6B,\n 0xAC: 0xFF6C,\n 0xAD: 0xFF6D,\n 0xAE: 0xFF6E,\n 0xAF: 0xFF6F,\n 0xB0: 0xFF70,\n 0xB1: 0xFF71,\n 0xB2: 0xFF72,\n 0xB3: 0xFF73,\n 0xB4: 0xFF74,\n 0xB5: 0xFF75,\n 0xB6: 0xFF76,\n 0xB7: 0xFF77,\n 0xB8: 0xFF78,\n 0xB9: 0xFF79,\n 0xBA: 0xFF7A,\n 0xBB: 0xFF7B,\n 0xBC: 0xFF7C,\n 0xBD: 0xFF7D,\n 0xBE: 0xFF7E,\n 0xBF: 0xFF7F,\n 0xC0: 0xFF80,\n 0xC1: 0xFF81,\n 0xC2: 0xFF82,\n 0xC3: 0xFF83,\n 0xC4: 0xFF84,\n 0xC5: 0xFF85,\n 0xC6: 0xFF86,\n 0xC7: 0xFF87,\n 0xC8: 0xFF88,\n 0xC9: 0xFF89,\n 0xCA: 0xFF8A,\n 0xCB: 0xFF8B,\n 0xCC: 0xFF8C,\n 0xCD: 0xFF8D,\n 0xCE: 0xFF8E,\n 0xCF: 0xFF8F,\n 0xD0: 0xFF90,\n 0xD1: 0xFF91,\n 0xD2: 0xFF92,\n 0xD3: 0xFF93,\n 0xD4: 0xFF94,\n 0xD5: 0xFF95,\n 0xD6: 0xFF96,\n 0xD7: 0xFF97,\n 0xD8: 0xFF98,\n 0xD9: 0xFF99,\n 0xDA: 0xFF9A,\n 0xDB: 0xFF9B,\n 0xDC: 0xFF9C,\n 0xDD: 0xFF9D,\n 0xDE: 0xFF9E,\n 0xDF: 0xFF9F,\n 0xE040: 0x6F3E,\n 0xE041: 0x6F13,\n 0xE042: 0x6EF7,\n 0xE043: 0x6F86,\n 0xE044: 0x6F7A,\n 0xE045: 0x6F78,\n 0xE046: 0x6F81,\n 0xE047: 0x6F80,\n 0xE048: 0x6F6F,\n 0xE049: 0x6F5B,\n 0xE04A: 0x6FF3,\n 0xE04B: 0x6F6D,\n 0xE04C: 0x6F82,\n 0xE04D: 0x6F7C,\n 0xE04E: 0x6F58,\n 0xE04F: 0x6F8E,\n 0xE050: 0x6F91,\n 0xE051: 0x6FC2,\n 0xE052: 0x6F66,\n 0xE053: 0x6FB3,\n 0xE054: 0x6FA3,\n 0xE055: 0x6FA1,\n 0xE056: 0x6FA4,\n 0xE057: 0x6FB9,\n 0xE058: 0x6FC6,\n 0xE059: 0x6FAA,\n 0xE05A: 0x6FDF,\n 0xE05B: 0x6FD5,\n 0xE05C: 0x6FEC,\n 0xE05D: 0x6FD4,\n 0xE05E: 0x6FD8,\n 0xE05F: 0x6FF1,\n 0xE060: 0x6FEE,\n 0xE061: 0x6FDB,\n 0xE062: 0x7009,\n 0xE063: 0x700B,\n 0xE064: 0x6FFA,\n 0xE065: 0x7011,\n 0xE066: 0x7001,\n 0xE067: 0x700F,\n 0xE068: 0x6FFE,\n 0xE069: 0x701B,\n 0xE06A: 0x701A,\n 0xE06B: 0x6F74,\n 0xE06C: 0x701D,\n 0xE06D: 0x7018,\n 0xE06E: 0x701F,\n 0xE06F: 0x7030,\n 0xE070: 0x703E,\n 0xE071: 0x7032,\n 0xE072: 0x7051,\n 0xE073: 0x7063,\n 0xE074: 0x7099,\n 0xE075: 0x7092,\n 0xE076: 0x70AF,\n 0xE077: 0x70F1,\n 0xE078: 0x70AC,\n 0xE079: 0x70B8,\n 0xE07A: 0x70B3,\n 0xE07B: 0x70AE,\n 0xE07C: 0x70DF,\n 0xE07D: 0x70CB,\n 0xE07E: 0x70DD,\n 0xE080: 0x70D9,\n 0xE081: 0x7109,\n 0xE082: 0x70FD,\n 0xE083: 0x711C,\n 0xE084: 0x7119,\n 0xE085: 0x7165,\n 0xE086: 0x7155,\n 0xE087: 0x7188,\n 0xE088: 0x7166,\n 0xE089: 0x7162,\n 0xE08A: 0x714C,\n 0xE08B: 0x7156,\n 0xE08C: 0x716C,\n 0xE08D: 0x718F,\n 0xE08E: 0x71FB,\n 0xE08F: 0x7184,\n 0xE090: 0x7195,\n 0xE091: 0x71A8,\n 0xE092: 0x71AC,\n 0xE093: 0x71D7,\n 0xE094: 0x71B9,\n 0xE095: 0x71BE,\n 0xE096: 0x71D2,\n 0xE097: 0x71C9,\n 0xE098: 0x71D4,\n 0xE099: 0x71CE,\n 0xE09A: 0x71E0,\n 0xE09B: 0x71EC,\n 0xE09C: 0x71E7,\n 0xE09D: 0x71F5,\n 0xE09E: 0x71FC,\n 0xE09F: 0x71F9,\n 0xE0A0: 0x71FF,\n 0xE0A1: 0x720D,\n 0xE0A2: 0x7210,\n 0xE0A3: 0x721B,\n 0xE0A4: 0x7228,\n 0xE0A5: 0x722D,\n 0xE0A6: 0x722C,\n 0xE0A7: 0x7230,\n 0xE0A8: 0x7232,\n 0xE0A9: 0x723B,\n 0xE0AA: 0x723C,\n 0xE0AB: 0x723F,\n 0xE0AC: 0x7240,\n 0xE0AD: 0x7246,\n 0xE0AE: 0x724B,\n 0xE0AF: 0x7258,\n 0xE0B0: 0x7274,\n 0xE0B1: 0x727E,\n 0xE0B2: 0x7282,\n 0xE0B3: 0x7281,\n 0xE0B4: 0x7287,\n 0xE0B5: 0x7292,\n 0xE0B6: 0x7296,\n 0xE0B7: 0x72A2,\n 0xE0B8: 0x72A7,\n 0xE0B9: 0x72B9,\n 0xE0BA: 0x72B2,\n 0xE0BB: 0x72C3,\n 0xE0BC: 0x72C6,\n 0xE0BD: 0x72C4,\n 0xE0BE: 0x72CE,\n 0xE0BF: 0x72D2,\n 0xE0C0: 0x72E2,\n 0xE0C1: 0x72E0,\n 0xE0C2: 0x72E1,\n 0xE0C3: 0x72F9,\n 0xE0C4: 0x72F7,\n 0xE0C5: 0x500F,\n 0xE0C6: 0x7317,\n 0xE0C7: 0x730A,\n 0xE0C8: 0x731C,\n 0xE0C9: 0x7316,\n 0xE0CA: 0x731D,\n 0xE0CB: 0x7334,\n 0xE0CC: 0x732F,\n 0xE0CD: 0x7329,\n 0xE0CE: 0x7325,\n 0xE0CF: 0x733E,\n 0xE0D0: 0x734E,\n 0xE0D1: 0x734F,\n 0xE0D2: 0x9ED8,\n 0xE0D3: 0x7357,\n 0xE0D4: 0x736A,\n 0xE0D5: 0x7368,\n 0xE0D6: 0x7370,\n 0xE0D7: 0x7378,\n 0xE0D8: 0x7375,\n 0xE0D9: 0x737B,\n 0xE0DA: 0x737A,\n 0xE0DB: 0x73C8,\n 0xE0DC: 0x73B3,\n 0xE0DD: 0x73CE,\n 0xE0DE: 0x73BB,\n 0xE0DF: 0x73C0,\n 0xE0E0: 0x73E5,\n 0xE0E1: 0x73EE,\n 0xE0E2: 0x73DE,\n 0xE0E3: 0x74A2,\n 0xE0E4: 0x7405,\n 0xE0E5: 0x746F,\n 0xE0E6: 0x7425,\n 0xE0E7: 0x73F8,\n 0xE0E8: 0x7432,\n 0xE0E9: 0x743A,\n 0xE0EA: 0x7455,\n 0xE0EB: 0x743F,\n 0xE0EC: 0x745F,\n 0xE0ED: 0x7459,\n 0xE0EE: 0x7441,\n 0xE0EF: 0x745C,\n 0xE0F0: 0x7469,\n 0xE0F1: 0x7470,\n 0xE0F2: 0x7463,\n 0xE0F3: 0x746A,\n 0xE0F4: 0x7476,\n 0xE0F5: 0x747E,\n 0xE0F6: 0x748B,\n 0xE0F7: 0x749E,\n 0xE0F8: 0x74A7,\n 0xE0F9: 0x74CA,\n 0xE0FA: 0x74CF,\n 0xE0FB: 0x74D4,\n 0xE0FC: 0x73F1,\n 0xE140: 0x74E0,\n 0xE141: 0x74E3,\n 0xE142: 0x74E7,\n 0xE143: 0x74E9,\n 0xE144: 0x74EE,\n 0xE145: 0x74F2,\n 0xE146: 0x74F0,\n 0xE147: 0x74F1,\n 0xE148: 0x74F8,\n 0xE149: 0x74F7,\n 0xE14A: 0x7504,\n 0xE14B: 0x7503,\n 0xE14C: 0x7505,\n 0xE14D: 0x750C,\n 0xE14E: 0x750E,\n 0xE14F: 0x750D,\n 0xE150: 0x7515,\n 0xE151: 0x7513,\n 0xE152: 0x751E,\n 0xE153: 0x7526,\n 0xE154: 0x752C,\n 0xE155: 0x753C,\n 0xE156: 0x7544,\n 0xE157: 0x754D,\n 0xE158: 0x754A,\n 0xE159: 0x7549,\n 0xE15A: 0x755B,\n 0xE15B: 0x7546,\n 0xE15C: 0x755A,\n 0xE15D: 0x7569,\n 0xE15E: 0x7564,\n 0xE15F: 0x7567,\n 0xE160: 0x756B,\n 0xE161: 0x756D,\n 0xE162: 0x7578,\n 0xE163: 0x7576,\n 0xE164: 0x7586,\n 0xE165: 0x7587,\n 0xE166: 0x7574,\n 0xE167: 0x758A,\n 0xE168: 0x7589,\n 0xE169: 0x7582,\n 0xE16A: 0x7594,\n 0xE16B: 0x759A,\n 0xE16C: 0x759D,\n 0xE16D: 0x75A5,\n 0xE16E: 0x75A3,\n 0xE16F: 0x75C2,\n 0xE170: 0x75B3,\n 0xE171: 0x75C3,\n 0xE172: 0x75B5,\n 0xE173: 0x75BD,\n 0xE174: 0x75B8,\n 0xE175: 0x75BC,\n 0xE176: 0x75B1,\n 0xE177: 0x75CD,\n 0xE178: 0x75CA,\n 0xE179: 0x75D2,\n 0xE17A: 0x75D9,\n 0xE17B: 0x75E3,\n 0xE17C: 0x75DE,\n 0xE17D: 0x75FE,\n 0xE17E: 0x75FF,\n 0xE180: 0x75FC,\n 0xE181: 0x7601,\n 0xE182: 0x75F0,\n 0xE183: 0x75FA,\n 0xE184: 0x75F2,\n 0xE185: 0x75F3,\n 0xE186: 0x760B,\n 0xE187: 0x760D,\n 0xE188: 0x7609,\n 0xE189: 0x761F,\n 0xE18A: 0x7627,\n 0xE18B: 0x7620,\n 0xE18C: 0x7621,\n 0xE18D: 0x7622,\n 0xE18E: 0x7624,\n 0xE18F: 0x7634,\n 0xE190: 0x7630,\n 0xE191: 0x763B,\n 0xE192: 0x7647,\n 0xE193: 0x7648,\n 0xE194: 0x7646,\n 0xE195: 0x765C,\n 0xE196: 0x7658,\n 0xE197: 0x7661,\n 0xE198: 0x7662,\n 0xE199: 0x7668,\n 0xE19A: 0x7669,\n 0xE19B: 0x766A,\n 0xE19C: 0x7667,\n 0xE19D: 0x766C,\n 0xE19E: 0x7670,\n 0xE19F: 0x7672,\n 0xE1A0: 0x7676,\n 0xE1A1: 0x7678,\n 0xE1A2: 0x767C,\n 0xE1A3: 0x7680,\n 0xE1A4: 0x7683,\n 0xE1A5: 0x7688,\n 0xE1A6: 0x768B,\n 0xE1A7: 0x768E,\n 0xE1A8: 0x7696,\n 0xE1A9: 0x7693,\n 0xE1AA: 0x7699,\n 0xE1AB: 0x769A,\n 0xE1AC: 0x76B0,\n 0xE1AD: 0x76B4,\n 0xE1AE: 0x76B8,\n 0xE1AF: 0x76B9,\n 0xE1B0: 0x76BA,\n 0xE1B1: 0x76C2,\n 0xE1B2: 0x76CD,\n 0xE1B3: 0x76D6,\n 0xE1B4: 0x76D2,\n 0xE1B5: 0x76DE,\n 0xE1B6: 0x76E1,\n 0xE1B7: 0x76E5,\n 0xE1B8: 0x76E7,\n 0xE1B9: 0x76EA,\n 0xE1BA: 0x862F,\n 0xE1BB: 0x76FB,\n 0xE1BC: 0x7708,\n 0xE1BD: 0x7707,\n 0xE1BE: 0x7704,\n 0xE1BF: 0x7729,\n 0xE1C0: 0x7724,\n 0xE1C1: 0x771E,\n 0xE1C2: 0x7725,\n 0xE1C3: 0x7726,\n 0xE1C4: 0x771B,\n 0xE1C5: 0x7737,\n 0xE1C6: 0x7738,\n 0xE1C7: 0x7747,\n 0xE1C8: 0x775A,\n 0xE1C9: 0x7768,\n 0xE1CA: 0x776B,\n 0xE1CB: 0x775B,\n 0xE1CC: 0x7765,\n 0xE1CD: 0x777F,\n 0xE1CE: 0x777E,\n 0xE1CF: 0x7779,\n 0xE1D0: 0x778E,\n 0xE1D1: 0x778B,\n 0xE1D2: 0x7791,\n 0xE1D3: 0x77A0,\n 0xE1D4: 0x779E,\n 0xE1D5: 0x77B0,\n 0xE1D6: 0x77B6,\n 0xE1D7: 0x77B9,\n 0xE1D8: 0x77BF,\n 0xE1D9: 0x77BC,\n 0xE1DA: 0x77BD,\n 0xE1DB: 0x77BB,\n 0xE1DC: 0x77C7,\n 0xE1DD: 0x77CD,\n 0xE1DE: 0x77D7,\n 0xE1DF: 0x77DA,\n 0xE1E0: 0x77DC,\n 0xE1E1: 0x77E3,\n 0xE1E2: 0x77EE,\n 0xE1E3: 0x77FC,\n 0xE1E4: 0x780C,\n 0xE1E5: 0x7812,\n 0xE1E6: 0x7926,\n 0xE1E7: 0x7820,\n 0xE1E8: 0x792A,\n 0xE1E9: 0x7845,\n 0xE1EA: 0x788E,\n 0xE1EB: 0x7874,\n 0xE1EC: 0x7886,\n 0xE1ED: 0x787C,\n 0xE1EE: 0x789A,\n 0xE1EF: 0x788C,\n 0xE1F0: 0x78A3,\n 0xE1F1: 0x78B5,\n 0xE1F2: 0x78AA,\n 0xE1F3: 0x78AF,\n 0xE1F4: 0x78D1,\n 0xE1F5: 0x78C6,\n 0xE1F6: 0x78CB,\n 0xE1F7: 0x78D4,\n 0xE1F8: 0x78BE,\n 0xE1F9: 0x78BC,\n 0xE1FA: 0x78C5,\n 0xE1FB: 0x78CA,\n 0xE1FC: 0x78EC,\n 0xE240: 0x78E7,\n 0xE241: 0x78DA,\n 0xE242: 0x78FD,\n 0xE243: 0x78F4,\n 0xE244: 0x7907,\n 0xE245: 0x7912,\n 0xE246: 0x7911,\n 0xE247: 0x7919,\n 0xE248: 0x792C,\n 0xE249: 0x792B,\n 0xE24A: 0x7940,\n 0xE24B: 0x7960,\n 0xE24C: 0x7957,\n 0xE24D: 0x795F,\n 0xE24E: 0x795A,\n 0xE24F: 0x7955,\n 0xE250: 0x7953,\n 0xE251: 0x797A,\n 0xE252: 0x797F,\n 0xE253: 0x798A,\n 0xE254: 0x799D,\n 0xE255: 0x79A7,\n 0xE256: 0x9F4B,\n 0xE257: 0x79AA,\n 0xE258: 0x79AE,\n 0xE259: 0x79B3,\n 0xE25A: 0x79B9,\n 0xE25B: 0x79BA,\n 0xE25C: 0x79C9,\n 0xE25D: 0x79D5,\n 0xE25E: 0x79E7,\n 0xE25F: 0x79EC,\n 0xE260: 0x79E1,\n 0xE261: 0x79E3,\n 0xE262: 0x7A08,\n 0xE263: 0x7A0D,\n 0xE264: 0x7A18,\n 0xE265: 0x7A19,\n 0xE266: 0x7A20,\n 0xE267: 0x7A1F,\n 0xE268: 0x7980,\n 0xE269: 0x7A31,\n 0xE26A: 0x7A3B,\n 0xE26B: 0x7A3E,\n 0xE26C: 0x7A37,\n 0xE26D: 0x7A43,\n 0xE26E: 0x7A57,\n 0xE26F: 0x7A49,\n 0xE270: 0x7A61,\n 0xE271: 0x7A62,\n 0xE272: 0x7A69,\n 0xE273: 0x9F9D,\n 0xE274: 0x7A70,\n 0xE275: 0x7A79,\n 0xE276: 0x7A7D,\n 0xE277: 0x7A88,\n 0xE278: 0x7A97,\n 0xE279: 0x7A95,\n 0xE27A: 0x7A98,\n 0xE27B: 0x7A96,\n 0xE27C: 0x7AA9,\n 0xE27D: 0x7AC8,\n 0xE27E: 0x7AB0,\n 0xE280: 0x7AB6,\n 0xE281: 0x7AC5,\n 0xE282: 0x7AC4,\n 0xE283: 0x7ABF,\n 0xE284: 0x9083,\n 0xE285: 0x7AC7,\n 0xE286: 0x7ACA,\n 0xE287: 0x7ACD,\n 0xE288: 0x7ACF,\n 0xE289: 0x7AD5,\n 0xE28A: 0x7AD3,\n 0xE28B: 0x7AD9,\n 0xE28C: 0x7ADA,\n 0xE28D: 0x7ADD,\n 0xE28E: 0x7AE1,\n 0xE28F: 0x7AE2,\n 0xE290: 0x7AE6,\n 0xE291: 0x7AED,\n 0xE292: 0x7AF0,\n 0xE293: 0x7B02,\n 0xE294: 0x7B0F,\n 0xE295: 0x7B0A,\n 0xE296: 0x7B06,\n 0xE297: 0x7B33,\n 0xE298: 0x7B18,\n 0xE299: 0x7B19,\n 0xE29A: 0x7B1E,\n 0xE29B: 0x7B35,\n 0xE29C: 0x7B28,\n 0xE29D: 0x7B36,\n 0xE29E: 0x7B50,\n 0xE29F: 0x7B7A,\n 0xE2A0: 0x7B04,\n 0xE2A1: 0x7B4D,\n 0xE2A2: 0x7B0B,\n 0xE2A3: 0x7B4C,\n 0xE2A4: 0x7B45,\n 0xE2A5: 0x7B75,\n 0xE2A6: 0x7B65,\n 0xE2A7: 0x7B74,\n 0xE2A8: 0x7B67,\n 0xE2A9: 0x7B70,\n 0xE2AA: 0x7B71,\n 0xE2AB: 0x7B6C,\n 0xE2AC: 0x7B6E,\n 0xE2AD: 0x7B9D,\n 0xE2AE: 0x7B98,\n 0xE2AF: 0x7B9F,\n 0xE2B0: 0x7B8D,\n 0xE2B1: 0x7B9C,\n 0xE2B2: 0x7B9A,\n 0xE2B3: 0x7B8B,\n 0xE2B4: 0x7B92,\n 0xE2B5: 0x7B8F,\n 0xE2B6: 0x7B5D,\n 0xE2B7: 0x7B99,\n 0xE2B8: 0x7BCB,\n 0xE2B9: 0x7BC1,\n 0xE2BA: 0x7BCC,\n 0xE2BB: 0x7BCF,\n 0xE2BC: 0x7BB4,\n 0xE2BD: 0x7BC6,\n 0xE2BE: 0x7BDD,\n 0xE2BF: 0x7BE9,\n 0xE2C0: 0x7C11,\n 0xE2C1: 0x7C14,\n 0xE2C2: 0x7BE6,\n 0xE2C3: 0x7BE5,\n 0xE2C4: 0x7C60,\n 0xE2C5: 0x7C00,\n 0xE2C6: 0x7C07,\n 0xE2C7: 0x7C13,\n 0xE2C8: 0x7BF3,\n 0xE2C9: 0x7BF7,\n 0xE2CA: 0x7C17,\n 0xE2CB: 0x7C0D,\n 0xE2CC: 0x7BF6,\n 0xE2CD: 0x7C23,\n 0xE2CE: 0x7C27,\n 0xE2CF: 0x7C2A,\n 0xE2D0: 0x7C1F,\n 0xE2D1: 0x7C37,\n 0xE2D2: 0x7C2B,\n 0xE2D3: 0x7C3D,\n 0xE2D4: 0x7C4C,\n 0xE2D5: 0x7C43,\n 0xE2D6: 0x7C54,\n 0xE2D7: 0x7C4F,\n 0xE2D8: 0x7C40,\n 0xE2D9: 0x7C50,\n 0xE2DA: 0x7C58,\n 0xE2DB: 0x7C5F,\n 0xE2DC: 0x7C64,\n 0xE2DD: 0x7C56,\n 0xE2DE: 0x7C65,\n 0xE2DF: 0x7C6C,\n 0xE2E0: 0x7C75,\n 0xE2E1: 0x7C83,\n 0xE2E2: 0x7C90,\n 0xE2E3: 0x7CA4,\n 0xE2E4: 0x7CAD,\n 0xE2E5: 0x7CA2,\n 0xE2E6: 0x7CAB,\n 0xE2E7: 0x7CA1,\n 0xE2E8: 0x7CA8,\n 0xE2E9: 0x7CB3,\n 0xE2EA: 0x7CB2,\n 0xE2EB: 0x7CB1,\n 0xE2EC: 0x7CAE,\n 0xE2ED: 0x7CB9,\n 0xE2EE: 0x7CBD,\n 0xE2EF: 0x7CC0,\n 0xE2F0: 0x7CC5,\n 0xE2F1: 0x7CC2,\n 0xE2F2: 0x7CD8,\n 0xE2F3: 0x7CD2,\n 0xE2F4: 0x7CDC,\n 0xE2F5: 0x7CE2,\n 0xE2F6: 0x9B3B,\n 0xE2F7: 0x7CEF,\n 0xE2F8: 0x7CF2,\n 0xE2F9: 0x7CF4,\n 0xE2FA: 0x7CF6,\n 0xE2FB: 0x7CFA,\n 0xE2FC: 0x7D06,\n 0xE340: 0x7D02,\n 0xE341: 0x7D1C,\n 0xE342: 0x7D15,\n 0xE343: 0x7D0A,\n 0xE344: 0x7D45,\n 0xE345: 0x7D4B,\n 0xE346: 0x7D2E,\n 0xE347: 0x7D32,\n 0xE348: 0x7D3F,\n 0xE349: 0x7D35,\n 0xE34A: 0x7D46,\n 0xE34B: 0x7D73,\n 0xE34C: 0x7D56,\n 0xE34D: 0x7D4E,\n 0xE34E: 0x7D72,\n 0xE34F: 0x7D68,\n 0xE350: 0x7D6E,\n 0xE351: 0x7D4F,\n 0xE352: 0x7D63,\n 0xE353: 0x7D93,\n 0xE354: 0x7D89,\n 0xE355: 0x7D5B,\n 0xE356: 0x7D8F,\n 0xE357: 0x7D7D,\n 0xE358: 0x7D9B,\n 0xE359: 0x7DBA,\n 0xE35A: 0x7DAE,\n 0xE35B: 0x7DA3,\n 0xE35C: 0x7DB5,\n 0xE35D: 0x7DC7,\n 0xE35E: 0x7DBD,\n 0xE35F: 0x7DAB,\n 0xE360: 0x7E3D,\n 0xE361: 0x7DA2,\n 0xE362: 0x7DAF,\n 0xE363: 0x7DDC,\n 0xE364: 0x7DB8,\n 0xE365: 0x7D9F,\n 0xE366: 0x7DB0,\n 0xE367: 0x7DD8,\n 0xE368: 0x7DDD,\n 0xE369: 0x7DE4,\n 0xE36A: 0x7DDE,\n 0xE36B: 0x7DFB,\n 0xE36C: 0x7DF2,\n 0xE36D: 0x7DE1,\n 0xE36E: 0x7E05,\n 0xE36F: 0x7E0A,\n 0xE370: 0x7E23,\n 0xE371: 0x7E21,\n 0xE372: 0x7E12,\n 0xE373: 0x7E31,\n 0xE374: 0x7E1F,\n 0xE375: 0x7E09,\n 0xE376: 0x7E0B,\n 0xE377: 0x7E22,\n 0xE378: 0x7E46,\n 0xE379: 0x7E66,\n 0xE37A: 0x7E3B,\n 0xE37B: 0x7E35,\n 0xE37C: 0x7E39,\n 0xE37D: 0x7E43,\n 0xE37E: 0x7E37,\n 0xE380: 0x7E32,\n 0xE381: 0x7E3A,\n 0xE382: 0x7E67,\n 0xE383: 0x7E5D,\n 0xE384: 0x7E56,\n 0xE385: 0x7E5E,\n 0xE386: 0x7E59,\n 0xE387: 0x7E5A,\n 0xE388: 0x7E79,\n 0xE389: 0x7E6A,\n 0xE38A: 0x7E69,\n 0xE38B: 0x7E7C,\n 0xE38C: 0x7E7B,\n 0xE38D: 0x7E83,\n 0xE38E: 0x7DD5,\n 0xE38F: 0x7E7D,\n 0xE390: 0x8FAE,\n 0xE391: 0x7E7F,\n 0xE392: 0x7E88,\n 0xE393: 0x7E89,\n 0xE394: 0x7E8C,\n 0xE395: 0x7E92,\n 0xE396: 0x7E90,\n 0xE397: 0x7E93,\n 0xE398: 0x7E94,\n 0xE399: 0x7E96,\n 0xE39A: 0x7E8E,\n 0xE39B: 0x7E9B,\n 0xE39C: 0x7E9C,\n 0xE39D: 0x7F38,\n 0xE39E: 0x7F3A,\n 0xE39F: 0x7F45,\n 0xE3A0: 0x7F4C,\n 0xE3A1: 0x7F4D,\n 0xE3A2: 0x7F4E,\n 0xE3A3: 0x7F50,\n 0xE3A4: 0x7F51,\n 0xE3A5: 0x7F55,\n 0xE3A6: 0x7F54,\n 0xE3A7: 0x7F58,\n 0xE3A8: 0x7F5F,\n 0xE3A9: 0x7F60,\n 0xE3AA: 0x7F68,\n 0xE3AB: 0x7F69,\n 0xE3AC: 0x7F67,\n 0xE3AD: 0x7F78,\n 0xE3AE: 0x7F82,\n 0xE3AF: 0x7F86,\n 0xE3B0: 0x7F83,\n 0xE3B1: 0x7F88,\n 0xE3B2: 0x7F87,\n 0xE3B3: 0x7F8C,\n 0xE3B4: 0x7F94,\n 0xE3B5: 0x7F9E,\n 0xE3B6: 0x7F9D,\n 0xE3B7: 0x7F9A,\n 0xE3B8: 0x7FA3,\n 0xE3B9: 0x7FAF,\n 0xE3BA: 0x7FB2,\n 0xE3BB: 0x7FB9,\n 0xE3BC: 0x7FAE,\n 0xE3BD: 0x7FB6,\n 0xE3BE: 0x7FB8,\n 0xE3BF: 0x8B71,\n 0xE3C0: 0x7FC5,\n 0xE3C1: 0x7FC6,\n 0xE3C2: 0x7FCA,\n 0xE3C3: 0x7FD5,\n 0xE3C4: 0x7FD4,\n 0xE3C5: 0x7FE1,\n 0xE3C6: 0x7FE6,\n 0xE3C7: 0x7FE9,\n 0xE3C8: 0x7FF3,\n 0xE3C9: 0x7FF9,\n 0xE3CA: 0x98DC,\n 0xE3CB: 0x8006,\n 0xE3CC: 0x8004,\n 0xE3CD: 0x800B,\n 0xE3CE: 0x8012,\n 0xE3CF: 0x8018,\n 0xE3D0: 0x8019,\n 0xE3D1: 0x801C,\n 0xE3D2: 0x8021,\n 0xE3D3: 0x8028,\n 0xE3D4: 0x803F,\n 0xE3D5: 0x803B,\n 0xE3D6: 0x804A,\n 0xE3D7: 0x8046,\n 0xE3D8: 0x8052,\n 0xE3D9: 0x8058,\n 0xE3DA: 0x805A,\n 0xE3DB: 0x805F,\n 0xE3DC: 0x8062,\n 0xE3DD: 0x8068,\n 0xE3DE: 0x8073,\n 0xE3DF: 0x8072,\n 0xE3E0: 0x8070,\n 0xE3E1: 0x8076,\n 0xE3E2: 0x8079,\n 0xE3E3: 0x807D,\n 0xE3E4: 0x807F,\n 0xE3E5: 0x8084,\n 0xE3E6: 0x8086,\n 0xE3E7: 0x8085,\n 0xE3E8: 0x809B,\n 0xE3E9: 0x8093,\n 0xE3EA: 0x809A,\n 0xE3EB: 0x80AD,\n 0xE3EC: 0x5190,\n 0xE3ED: 0x80AC,\n 0xE3EE: 0x80DB,\n 0xE3EF: 0x80E5,\n 0xE3F0: 0x80D9,\n 0xE3F1: 0x80DD,\n 0xE3F2: 0x80C4,\n 0xE3F3: 0x80DA,\n 0xE3F4: 0x80D6,\n 0xE3F5: 0x8109,\n 0xE3F6: 0x80EF,\n 0xE3F7: 0x80F1,\n 0xE3F8: 0x811B,\n 0xE3F9: 0x8129,\n 0xE3FA: 0x8123,\n 0xE3FB: 0x812F,\n 0xE3FC: 0x814B,\n 0xE440: 0x968B,\n 0xE441: 0x8146,\n 0xE442: 0x813E,\n 0xE443: 0x8153,\n 0xE444: 0x8151,\n 0xE445: 0x80FC,\n 0xE446: 0x8171,\n 0xE447: 0x816E,\n 0xE448: 0x8165,\n 0xE449: 0x8166,\n 0xE44A: 0x8174,\n 0xE44B: 0x8183,\n 0xE44C: 0x8188,\n 0xE44D: 0x818A,\n 0xE44E: 0x8180,\n 0xE44F: 0x8182,\n 0xE450: 0x81A0,\n 0xE451: 0x8195,\n 0xE452: 0x81A4,\n 0xE453: 0x81A3,\n 0xE454: 0x815F,\n 0xE455: 0x8193,\n 0xE456: 0x81A9,\n 0xE457: 0x81B0,\n 0xE458: 0x81B5,\n 0xE459: 0x81BE,\n 0xE45A: 0x81B8,\n 0xE45B: 0x81BD,\n 0xE45C: 0x81C0,\n 0xE45D: 0x81C2,\n 0xE45E: 0x81BA,\n 0xE45F: 0x81C9,\n 0xE460: 0x81CD,\n 0xE461: 0x81D1,\n 0xE462: 0x81D9,\n 0xE463: 0x81D8,\n 0xE464: 0x81C8,\n 0xE465: 0x81DA,\n 0xE466: 0x81DF,\n 0xE467: 0x81E0,\n 0xE468: 0x81E7,\n 0xE469: 0x81FA,\n 0xE46A: 0x81FB,\n 0xE46B: 0x81FE,\n 0xE46C: 0x8201,\n 0xE46D: 0x8202,\n 0xE46E: 0x8205,\n 0xE46F: 0x8207,\n 0xE470: 0x820A,\n 0xE471: 0x820D,\n 0xE472: 0x8210,\n 0xE473: 0x8216,\n 0xE474: 0x8229,\n 0xE475: 0x822B,\n 0xE476: 0x8238,\n 0xE477: 0x8233,\n 0xE478: 0x8240,\n 0xE479: 0x8259,\n 0xE47A: 0x8258,\n 0xE47B: 0x825D,\n 0xE47C: 0x825A,\n 0xE47D: 0x825F,\n 0xE47E: 0x8264,\n 0xE480: 0x8262,\n 0xE481: 0x8268,\n 0xE482: 0x826A,\n 0xE483: 0x826B,\n 0xE484: 0x822E,\n 0xE485: 0x8271,\n 0xE486: 0x8277,\n 0xE487: 0x8278,\n 0xE488: 0x827E,\n 0xE489: 0x828D,\n 0xE48A: 0x8292,\n 0xE48B: 0x82AB,\n 0xE48C: 0x829F,\n 0xE48D: 0x82BB,\n 0xE48E: 0x82AC,\n 0xE48F: 0x82E1,\n 0xE490: 0x82E3,\n 0xE491: 0x82DF,\n 0xE492: 0x82D2,\n 0xE493: 0x82F4,\n 0xE494: 0x82F3,\n 0xE495: 0x82FA,\n 0xE496: 0x8393,\n 0xE497: 0x8303,\n 0xE498: 0x82FB,\n 0xE499: 0x82F9,\n 0xE49A: 0x82DE,\n 0xE49B: 0x8306,\n 0xE49C: 0x82DC,\n 0xE49D: 0x8309,\n 0xE49E: 0x82D9,\n 0xE49F: 0x8335,\n 0xE4A0: 0x8334,\n 0xE4A1: 0x8316,\n 0xE4A2: 0x8332,\n 0xE4A3: 0x8331,\n 0xE4A4: 0x8340,\n 0xE4A5: 0x8339,\n 0xE4A6: 0x8350,\n 0xE4A7: 0x8345,\n 0xE4A8: 0x832F,\n 0xE4A9: 0x832B,\n 0xE4AA: 0x8317,\n 0xE4AB: 0x8318,\n 0xE4AC: 0x8385,\n 0xE4AD: 0x839A,\n 0xE4AE: 0x83AA,\n 0xE4AF: 0x839F,\n 0xE4B0: 0x83A2,\n 0xE4B1: 0x8396,\n 0xE4B2: 0x8323,\n 0xE4B3: 0x838E,\n 0xE4B4: 0x8387,\n 0xE4B5: 0x838A,\n 0xE4B6: 0x837C,\n 0xE4B7: 0x83B5,\n 0xE4B8: 0x8373,\n 0xE4B9: 0x8375,\n 0xE4BA: 0x83A0,\n 0xE4BB: 0x8389,\n 0xE4BC: 0x83A8,\n 0xE4BD: 0x83F4,\n 0xE4BE: 0x8413,\n 0xE4BF: 0x83EB,\n 0xE4C0: 0x83CE,\n 0xE4C1: 0x83FD,\n 0xE4C2: 0x8403,\n 0xE4C3: 0x83D8,\n 0xE4C4: 0x840B,\n 0xE4C5: 0x83C1,\n 0xE4C6: 0x83F7,\n 0xE4C7: 0x8407,\n 0xE4C8: 0x83E0,\n 0xE4C9: 0x83F2,\n 0xE4CA: 0x840D,\n 0xE4CB: 0x8422,\n 0xE4CC: 0x8420,\n 0xE4CD: 0x83BD,\n 0xE4CE: 0x8438,\n 0xE4CF: 0x8506,\n 0xE4D0: 0x83FB,\n 0xE4D1: 0x846D,\n 0xE4D2: 0x842A,\n 0xE4D3: 0x843C,\n 0xE4D4: 0x855A,\n 0xE4D5: 0x8484,\n 0xE4D6: 0x8477,\n 0xE4D7: 0x846B,\n 0xE4D8: 0x84AD,\n 0xE4D9: 0x846E,\n 0xE4DA: 0x8482,\n 0xE4DB: 0x8469,\n 0xE4DC: 0x8446,\n 0xE4DD: 0x842C,\n 0xE4DE: 0x846F,\n 0xE4DF: 0x8479,\n 0xE4E0: 0x8435,\n 0xE4E1: 0x84CA,\n 0xE4E2: 0x8462,\n 0xE4E3: 0x84B9,\n 0xE4E4: 0x84BF,\n 0xE4E5: 0x849F,\n 0xE4E6: 0x84D9,\n 0xE4E7: 0x84CD,\n 0xE4E8: 0x84BB,\n 0xE4E9: 0x84DA,\n 0xE4EA: 0x84D0,\n 0xE4EB: 0x84C1,\n 0xE4EC: 0x84C6,\n 0xE4ED: 0x84D6,\n 0xE4EE: 0x84A1,\n 0xE4EF: 0x8521,\n 0xE4F0: 0x84FF,\n 0xE4F1: 0x84F4,\n 0xE4F2: 0x8517,\n 0xE4F3: 0x8518,\n 0xE4F4: 0x852C,\n 0xE4F5: 0x851F,\n 0xE4F6: 0x8515,\n 0xE4F7: 0x8514,\n 0xE4F8: 0x84FC,\n 0xE4F9: 0x8540,\n 0xE4FA: 0x8563,\n 0xE4FB: 0x8558,\n 0xE4FC: 0x8548,\n 0xE540: 0x8541,\n 0xE541: 0x8602,\n 0xE542: 0x854B,\n 0xE543: 0x8555,\n 0xE544: 0x8580,\n 0xE545: 0x85A4,\n 0xE546: 0x8588,\n 0xE547: 0x8591,\n 0xE548: 0x858A,\n 0xE549: 0x85A8,\n 0xE54A: 0x856D,\n 0xE54B: 0x8594,\n 0xE54C: 0x859B,\n 0xE54D: 0x85EA,\n 0xE54E: 0x8587,\n 0xE54F: 0x859C,\n 0xE550: 0x8577,\n 0xE551: 0x857E,\n 0xE552: 0x8590,\n 0xE553: 0x85C9,\n 0xE554: 0x85BA,\n 0xE555: 0x85CF,\n 0xE556: 0x85B9,\n 0xE557: 0x85D0,\n 0xE558: 0x85D5,\n 0xE559: 0x85DD,\n 0xE55A: 0x85E5,\n 0xE55B: 0x85DC,\n 0xE55C: 0x85F9,\n 0xE55D: 0x860A,\n 0xE55E: 0x8613,\n 0xE55F: 0x860B,\n 0xE560: 0x85FE,\n 0xE561: 0x85FA,\n 0xE562: 0x8606,\n 0xE563: 0x8622,\n 0xE564: 0x861A,\n 0xE565: 0x8630,\n 0xE566: 0x863F,\n 0xE567: 0x864D,\n 0xE568: 0x4E55,\n 0xE569: 0x8654,\n 0xE56A: 0x865F,\n 0xE56B: 0x8667,\n 0xE56C: 0x8671,\n 0xE56D: 0x8693,\n 0xE56E: 0x86A3,\n 0xE56F: 0x86A9,\n 0xE570: 0x86AA,\n 0xE571: 0x868B,\n 0xE572: 0x868C,\n 0xE573: 0x86B6,\n 0xE574: 0x86AF,\n 0xE575: 0x86C4,\n 0xE576: 0x86C6,\n 0xE577: 0x86B0,\n 0xE578: 0x86C9,\n 0xE579: 0x8823,\n 0xE57A: 0x86AB,\n 0xE57B: 0x86D4,\n 0xE57C: 0x86DE,\n 0xE57D: 0x86E9,\n 0xE57E: 0x86EC,\n 0xE580: 0x86DF,\n 0xE581: 0x86DB,\n 0xE582: 0x86EF,\n 0xE583: 0x8712,\n 0xE584: 0x8706,\n 0xE585: 0x8708,\n 0xE586: 0x8700,\n 0xE587: 0x8703,\n 0xE588: 0x86FB,\n 0xE589: 0x8711,\n 0xE58A: 0x8709,\n 0xE58B: 0x870D,\n 0xE58C: 0x86F9,\n 0xE58D: 0x870A,\n 0xE58E: 0x8734,\n 0xE58F: 0x873F,\n 0xE590: 0x8737,\n 0xE591: 0x873B,\n 0xE592: 0x8725,\n 0xE593: 0x8729,\n 0xE594: 0x871A,\n 0xE595: 0x8760,\n 0xE596: 0x875F,\n 0xE597: 0x8778,\n 0xE598: 0x874C,\n 0xE599: 0x874E,\n 0xE59A: 0x8774,\n 0xE59B: 0x8757,\n 0xE59C: 0x8768,\n 0xE59D: 0x876E,\n 0xE59E: 0x8759,\n 0xE59F: 0x8753,\n 0xE5A0: 0x8763,\n 0xE5A1: 0x876A,\n 0xE5A2: 0x8805,\n 0xE5A3: 0x87A2,\n 0xE5A4: 0x879F,\n 0xE5A5: 0x8782,\n 0xE5A6: 0x87AF,\n 0xE5A7: 0x87CB,\n 0xE5A8: 0x87BD,\n 0xE5A9: 0x87C0,\n 0xE5AA: 0x87D0,\n 0xE5AB: 0x96D6,\n 0xE5AC: 0x87AB,\n 0xE5AD: 0x87C4,\n 0xE5AE: 0x87B3,\n 0xE5AF: 0x87C7,\n 0xE5B0: 0x87C6,\n 0xE5B1: 0x87BB,\n 0xE5B2: 0x87EF,\n 0xE5B3: 0x87F2,\n 0xE5B4: 0x87E0,\n 0xE5B5: 0x880F,\n 0xE5B6: 0x880D,\n 0xE5B7: 0x87FE,\n 0xE5B8: 0x87F6,\n 0xE5B9: 0x87F7,\n 0xE5BA: 0x880E,\n 0xE5BB: 0x87D2,\n 0xE5BC: 0x8811,\n 0xE5BD: 0x8816,\n 0xE5BE: 0x8815,\n 0xE5BF: 0x8822,\n 0xE5C0: 0x8821,\n 0xE5C1: 0x8831,\n 0xE5C2: 0x8836,\n 0xE5C3: 0x8839,\n 0xE5C4: 0x8827,\n 0xE5C5: 0x883B,\n 0xE5C6: 0x8844,\n 0xE5C7: 0x8842,\n 0xE5C8: 0x8852,\n 0xE5C9: 0x8859,\n 0xE5CA: 0x885E,\n 0xE5CB: 0x8862,\n 0xE5CC: 0x886B,\n 0xE5CD: 0x8881,\n 0xE5CE: 0x887E,\n 0xE5CF: 0x889E,\n 0xE5D0: 0x8875,\n 0xE5D1: 0x887D,\n 0xE5D2: 0x88B5,\n 0xE5D3: 0x8872,\n 0xE5D4: 0x8882,\n 0xE5D5: 0x8897,\n 0xE5D6: 0x8892,\n 0xE5D7: 0x88AE,\n 0xE5D8: 0x8899,\n 0xE5D9: 0x88A2,\n 0xE5DA: 0x888D,\n 0xE5DB: 0x88A4,\n 0xE5DC: 0x88B0,\n 0xE5DD: 0x88BF,\n 0xE5DE: 0x88B1,\n 0xE5DF: 0x88C3,\n 0xE5E0: 0x88C4,\n 0xE5E1: 0x88D4,\n 0xE5E2: 0x88D8,\n 0xE5E3: 0x88D9,\n 0xE5E4: 0x88DD,\n 0xE5E5: 0x88F9,\n 0xE5E6: 0x8902,\n 0xE5E7: 0x88FC,\n 0xE5E8: 0x88F4,\n 0xE5E9: 0x88E8,\n 0xE5EA: 0x88F2,\n 0xE5EB: 0x8904,\n 0xE5EC: 0x890C,\n 0xE5ED: 0x890A,\n 0xE5EE: 0x8913,\n 0xE5EF: 0x8943,\n 0xE5F0: 0x891E,\n 0xE5F1: 0x8925,\n 0xE5F2: 0x892A,\n 0xE5F3: 0x892B,\n 0xE5F4: 0x8941,\n 0xE5F5: 0x8944,\n 0xE5F6: 0x893B,\n 0xE5F7: 0x8936,\n 0xE5F8: 0x8938,\n 0xE5F9: 0x894C,\n 0xE5FA: 0x891D,\n 0xE5FB: 0x8960,\n 0xE5FC: 0x895E,\n 0xE640: 0x8966,\n 0xE641: 0x8964,\n 0xE642: 0x896D,\n 0xE643: 0x896A,\n 0xE644: 0x896F,\n 0xE645: 0x8974,\n 0xE646: 0x8977,\n 0xE647: 0x897E,\n 0xE648: 0x8983,\n 0xE649: 0x8988,\n 0xE64A: 0x898A,\n 0xE64B: 0x8993,\n 0xE64C: 0x8998,\n 0xE64D: 0x89A1,\n 0xE64E: 0x89A9,\n 0xE64F: 0x89A6,\n 0xE650: 0x89AC,\n 0xE651: 0x89AF,\n 0xE652: 0x89B2,\n 0xE653: 0x89BA,\n 0xE654: 0x89BD,\n 0xE655: 0x89BF,\n 0xE656: 0x89C0,\n 0xE657: 0x89DA,\n 0xE658: 0x89DC,\n 0xE659: 0x89DD,\n 0xE65A: 0x89E7,\n 0xE65B: 0x89F4,\n 0xE65C: 0x89F8,\n 0xE65D: 0x8A03,\n 0xE65E: 0x8A16,\n 0xE65F: 0x8A10,\n 0xE660: 0x8A0C,\n 0xE661: 0x8A1B,\n 0xE662: 0x8A1D,\n 0xE663: 0x8A25,\n 0xE664: 0x8A36,\n 0xE665: 0x8A41,\n 0xE666: 0x8A5B,\n 0xE667: 0x8A52,\n 0xE668: 0x8A46,\n 0xE669: 0x8A48,\n 0xE66A: 0x8A7C,\n 0xE66B: 0x8A6D,\n 0xE66C: 0x8A6C,\n 0xE66D: 0x8A62,\n 0xE66E: 0x8A85,\n 0xE66F: 0x8A82,\n 0xE670: 0x8A84,\n 0xE671: 0x8AA8,\n 0xE672: 0x8AA1,\n 0xE673: 0x8A91,\n 0xE674: 0x8AA5,\n 0xE675: 0x8AA6,\n 0xE676: 0x8A9A,\n 0xE677: 0x8AA3,\n 0xE678: 0x8AC4,\n 0xE679: 0x8ACD,\n 0xE67A: 0x8AC2,\n 0xE67B: 0x8ADA,\n 0xE67C: 0x8AEB,\n 0xE67D: 0x8AF3,\n 0xE67E: 0x8AE7,\n 0xE680: 0x8AE4,\n 0xE681: 0x8AF1,\n 0xE682: 0x8B14,\n 0xE683: 0x8AE0,\n 0xE684: 0x8AE2,\n 0xE685: 0x8AF7,\n 0xE686: 0x8ADE,\n 0xE687: 0x8ADB,\n 0xE688: 0x8B0C,\n 0xE689: 0x8B07,\n 0xE68A: 0x8B1A,\n 0xE68B: 0x8AE1,\n 0xE68C: 0x8B16,\n 0xE68D: 0x8B10,\n 0xE68E: 0x8B17,\n 0xE68F: 0x8B20,\n 0xE690: 0x8B33,\n 0xE691: 0x97AB,\n 0xE692: 0x8B26,\n 0xE693: 0x8B2B,\n 0xE694: 0x8B3E,\n 0xE695: 0x8B28,\n 0xE696: 0x8B41,\n 0xE697: 0x8B4C,\n 0xE698: 0x8B4F,\n 0xE699: 0x8B4E,\n 0xE69A: 0x8B49,\n 0xE69B: 0x8B56,\n 0xE69C: 0x8B5B,\n 0xE69D: 0x8B5A,\n 0xE69E: 0x8B6B,\n 0xE69F: 0x8B5F,\n 0xE6A0: 0x8B6C,\n 0xE6A1: 0x8B6F,\n 0xE6A2: 0x8B74,\n 0xE6A3: 0x8B7D,\n 0xE6A4: 0x8B80,\n 0xE6A5: 0x8B8C,\n 0xE6A6: 0x8B8E,\n 0xE6A7: 0x8B92,\n 0xE6A8: 0x8B93,\n 0xE6A9: 0x8B96,\n 0xE6AA: 0x8B99,\n 0xE6AB: 0x8B9A,\n 0xE6AC: 0x8C3A,\n 0xE6AD: 0x8C41,\n 0xE6AE: 0x8C3F,\n 0xE6AF: 0x8C48,\n 0xE6B0: 0x8C4C,\n 0xE6B1: 0x8C4E,\n 0xE6B2: 0x8C50,\n 0xE6B3: 0x8C55,\n 0xE6B4: 0x8C62,\n 0xE6B5: 0x8C6C,\n 0xE6B6: 0x8C78,\n 0xE6B7: 0x8C7A,\n 0xE6B8: 0x8C82,\n 0xE6B9: 0x8C89,\n 0xE6BA: 0x8C85,\n 0xE6BB: 0x8C8A,\n 0xE6BC: 0x8C8D,\n 0xE6BD: 0x8C8E,\n 0xE6BE: 0x8C94,\n 0xE6BF: 0x8C7C,\n 0xE6C0: 0x8C98,\n 0xE6C1: 0x621D,\n 0xE6C2: 0x8CAD,\n 0xE6C3: 0x8CAA,\n 0xE6C4: 0x8CBD,\n 0xE6C5: 0x8CB2,\n 0xE6C6: 0x8CB3,\n 0xE6C7: 0x8CAE,\n 0xE6C8: 0x8CB6,\n 0xE6C9: 0x8CC8,\n 0xE6CA: 0x8CC1,\n 0xE6CB: 0x8CE4,\n 0xE6CC: 0x8CE3,\n 0xE6CD: 0x8CDA,\n 0xE6CE: 0x8CFD,\n 0xE6CF: 0x8CFA,\n 0xE6D0: 0x8CFB,\n 0xE6D1: 0x8D04,\n 0xE6D2: 0x8D05,\n 0xE6D3: 0x8D0A,\n 0xE6D4: 0x8D07,\n 0xE6D5: 0x8D0F,\n 0xE6D6: 0x8D0D,\n 0xE6D7: 0x8D10,\n 0xE6D8: 0x9F4E,\n 0xE6D9: 0x8D13,\n 0xE6DA: 0x8CCD,\n 0xE6DB: 0x8D14,\n 0xE6DC: 0x8D16,\n 0xE6DD: 0x8D67,\n 0xE6DE: 0x8D6D,\n 0xE6DF: 0x8D71,\n 0xE6E0: 0x8D73,\n 0xE6E1: 0x8D81,\n 0xE6E2: 0x8D99,\n 0xE6E3: 0x8DC2,\n 0xE6E4: 0x8DBE,\n 0xE6E5: 0x8DBA,\n 0xE6E6: 0x8DCF,\n 0xE6E7: 0x8DDA,\n 0xE6E8: 0x8DD6,\n 0xE6E9: 0x8DCC,\n 0xE6EA: 0x8DDB,\n 0xE6EB: 0x8DCB,\n 0xE6EC: 0x8DEA,\n 0xE6ED: 0x8DEB,\n 0xE6EE: 0x8DDF,\n 0xE6EF: 0x8DE3,\n 0xE6F0: 0x8DFC,\n 0xE6F1: 0x8E08,\n 0xE6F2: 0x8E09,\n 0xE6F3: 0x8DFF,\n 0xE6F4: 0x8E1D,\n 0xE6F5: 0x8E1E,\n 0xE6F6: 0x8E10,\n 0xE6F7: 0x8E1F,\n 0xE6F8: 0x8E42,\n 0xE6F9: 0x8E35,\n 0xE6FA: 0x8E30,\n 0xE6FB: 0x8E34,\n 0xE6FC: 0x8E4A,\n 0xE740: 0x8E47,\n 0xE741: 0x8E49,\n 0xE742: 0x8E4C,\n 0xE743: 0x8E50,\n 0xE744: 0x8E48,\n 0xE745: 0x8E59,\n 0xE746: 0x8E64,\n 0xE747: 0x8E60,\n 0xE748: 0x8E2A,\n 0xE749: 0x8E63,\n 0xE74A: 0x8E55,\n 0xE74B: 0x8E76,\n 0xE74C: 0x8E72,\n 0xE74D: 0x8E7C,\n 0xE74E: 0x8E81,\n 0xE74F: 0x8E87,\n 0xE750: 0x8E85,\n 0xE751: 0x8E84,\n 0xE752: 0x8E8B,\n 0xE753: 0x8E8A,\n 0xE754: 0x8E93,\n 0xE755: 0x8E91,\n 0xE756: 0x8E94,\n 0xE757: 0x8E99,\n 0xE758: 0x8EAA,\n 0xE759: 0x8EA1,\n 0xE75A: 0x8EAC,\n 0xE75B: 0x8EB0,\n 0xE75C: 0x8EC6,\n 0xE75D: 0x8EB1,\n 0xE75E: 0x8EBE,\n 0xE75F: 0x8EC5,\n 0xE760: 0x8EC8,\n 0xE761: 0x8ECB,\n 0xE762: 0x8EDB,\n 0xE763: 0x8EE3,\n 0xE764: 0x8EFC,\n 0xE765: 0x8EFB,\n 0xE766: 0x8EEB,\n 0xE767: 0x8EFE,\n 0xE768: 0x8F0A,\n 0xE769: 0x8F05,\n 0xE76A: 0x8F15,\n 0xE76B: 0x8F12,\n 0xE76C: 0x8F19,\n 0xE76D: 0x8F13,\n 0xE76E: 0x8F1C,\n 0xE76F: 0x8F1F,\n 0xE770: 0x8F1B,\n 0xE771: 0x8F0C,\n 0xE772: 0x8F26,\n 0xE773: 0x8F33,\n 0xE774: 0x8F3B,\n 0xE775: 0x8F39,\n 0xE776: 0x8F45,\n 0xE777: 0x8F42,\n 0xE778: 0x8F3E,\n 0xE779: 0x8F4C,\n 0xE77A: 0x8F49,\n 0xE77B: 0x8F46,\n 0xE77C: 0x8F4E,\n 0xE77D: 0x8F57,\n 0xE77E: 0x8F5C,\n 0xE780: 0x8F62,\n 0xE781: 0x8F63,\n 0xE782: 0x8F64,\n 0xE783: 0x8F9C,\n 0xE784: 0x8F9F,\n 0xE785: 0x8FA3,\n 0xE786: 0x8FAD,\n 0xE787: 0x8FAF,\n 0xE788: 0x8FB7,\n 0xE789: 0x8FDA,\n 0xE78A: 0x8FE5,\n 0xE78B: 0x8FE2,\n 0xE78C: 0x8FEA,\n 0xE78D: 0x8FEF,\n 0xE78E: 0x9087,\n 0xE78F: 0x8FF4,\n 0xE790: 0x9005,\n 0xE791: 0x8FF9,\n 0xE792: 0x8FFA,\n 0xE793: 0x9011,\n 0xE794: 0x9015,\n 0xE795: 0x9021,\n 0xE796: 0x900D,\n 0xE797: 0x901E,\n 0xE798: 0x9016,\n 0xE799: 0x900B,\n 0xE79A: 0x9027,\n 0xE79B: 0x9036,\n 0xE79C: 0x9035,\n 0xE79D: 0x9039,\n 0xE79E: 0x8FF8,\n 0xE79F: 0x904F,\n 0xE7A0: 0x9050,\n 0xE7A1: 0x9051,\n 0xE7A2: 0x9052,\n 0xE7A3: 0x900E,\n 0xE7A4: 0x9049,\n 0xE7A5: 0x903E,\n 0xE7A6: 0x9056,\n 0xE7A7: 0x9058,\n 0xE7A8: 0x905E,\n 0xE7A9: 0x9068,\n 0xE7AA: 0x906F,\n 0xE7AB: 0x9076,\n 0xE7AC: 0x96A8,\n 0xE7AD: 0x9072,\n 0xE7AE: 0x9082,\n 0xE7AF: 0x907D,\n 0xE7B0: 0x9081,\n 0xE7B1: 0x9080,\n 0xE7B2: 0x908A,\n 0xE7B3: 0x9089,\n 0xE7B4: 0x908F,\n 0xE7B5: 0x90A8,\n 0xE7B6: 0x90AF,\n 0xE7B7: 0x90B1,\n 0xE7B8: 0x90B5,\n 0xE7B9: 0x90E2,\n 0xE7BA: 0x90E4,\n 0xE7BB: 0x6248,\n 0xE7BC: 0x90DB,\n 0xE7BD: 0x9102,\n 0xE7BE: 0x9112,\n 0xE7BF: 0x9119,\n 0xE7C0: 0x9132,\n 0xE7C1: 0x9130,\n 0xE7C2: 0x914A,\n 0xE7C3: 0x9156,\n 0xE7C4: 0x9158,\n 0xE7C5: 0x9163,\n 0xE7C6: 0x9165,\n 0xE7C7: 0x9169,\n 0xE7C8: 0x9173,\n 0xE7C9: 0x9172,\n 0xE7CA: 0x918B,\n 0xE7CB: 0x9189,\n 0xE7CC: 0x9182,\n 0xE7CD: 0x91A2,\n 0xE7CE: 0x91AB,\n 0xE7CF: 0x91AF,\n 0xE7D0: 0x91AA,\n 0xE7D1: 0x91B5,\n 0xE7D2: 0x91B4,\n 0xE7D3: 0x91BA,\n 0xE7D4: 0x91C0,\n 0xE7D5: 0x91C1,\n 0xE7D6: 0x91C9,\n 0xE7D7: 0x91CB,\n 0xE7D8: 0x91D0,\n 0xE7D9: 0x91D6,\n 0xE7DA: 0x91DF,\n 0xE7DB: 0x91E1,\n 0xE7DC: 0x91DB,\n 0xE7DD: 0x91FC,\n 0xE7DE: 0x91F5,\n 0xE7DF: 0x91F6,\n 0xE7E0: 0x921E,\n 0xE7E1: 0x91FF,\n 0xE7E2: 0x9214,\n 0xE7E3: 0x922C,\n 0xE7E4: 0x9215,\n 0xE7E5: 0x9211,\n 0xE7E6: 0x925E,\n 0xE7E7: 0x9257,\n 0xE7E8: 0x9245,\n 0xE7E9: 0x9249,\n 0xE7EA: 0x9264,\n 0xE7EB: 0x9248,\n 0xE7EC: 0x9295,\n 0xE7ED: 0x923F,\n 0xE7EE: 0x924B,\n 0xE7EF: 0x9250,\n 0xE7F0: 0x929C,\n 0xE7F1: 0x9296,\n 0xE7F2: 0x9293,\n 0xE7F3: 0x929B,\n 0xE7F4: 0x925A,\n 0xE7F5: 0x92CF,\n 0xE7F6: 0x92B9,\n 0xE7F7: 0x92B7,\n 0xE7F8: 0x92E9,\n 0xE7F9: 0x930F,\n 0xE7FA: 0x92FA,\n 0xE7FB: 0x9344,\n 0xE7FC: 0x932E,\n 0xE840: 0x9319,\n 0xE841: 0x9322,\n 0xE842: 0x931A,\n 0xE843: 0x9323,\n 0xE844: 0x933A,\n 0xE845: 0x9335,\n 0xE846: 0x933B,\n 0xE847: 0x935C,\n 0xE848: 0x9360,\n 0xE849: 0x937C,\n 0xE84A: 0x936E,\n 0xE84B: 0x9356,\n 0xE84C: 0x93B0,\n 0xE84D: 0x93AC,\n 0xE84E: 0x93AD,\n 0xE84F: 0x9394,\n 0xE850: 0x93B9,\n 0xE851: 0x93D6,\n 0xE852: 0x93D7,\n 0xE853: 0x93E8,\n 0xE854: 0x93E5,\n 0xE855: 0x93D8,\n 0xE856: 0x93C3,\n 0xE857: 0x93DD,\n 0xE858: 0x93D0,\n 0xE859: 0x93C8,\n 0xE85A: 0x93E4,\n 0xE85B: 0x941A,\n 0xE85C: 0x9414,\n 0xE85D: 0x9413,\n 0xE85E: 0x9403,\n 0xE85F: 0x9407,\n 0xE860: 0x9410,\n 0xE861: 0x9436,\n 0xE862: 0x942B,\n 0xE863: 0x9435,\n 0xE864: 0x9421,\n 0xE865: 0x943A,\n 0xE866: 0x9441,\n 0xE867: 0x9452,\n 0xE868: 0x9444,\n 0xE869: 0x945B,\n 0xE86A: 0x9460,\n 0xE86B: 0x9462,\n 0xE86C: 0x945E,\n 0xE86D: 0x946A,\n 0xE86E: 0x9229,\n 0xE86F: 0x9470,\n 0xE870: 0x9475,\n 0xE871: 0x9477,\n 0xE872: 0x947D,\n 0xE873: 0x945A,\n 0xE874: 0x947C,\n 0xE875: 0x947E,\n 0xE876: 0x9481,\n 0xE877: 0x947F,\n 0xE878: 0x9582,\n 0xE879: 0x9587,\n 0xE87A: 0x958A,\n 0xE87B: 0x9594,\n 0xE87C: 0x9596,\n 0xE87D: 0x9598,\n 0xE87E: 0x9599,\n 0xE880: 0x95A0,\n 0xE881: 0x95A8,\n 0xE882: 0x95A7,\n 0xE883: 0x95AD,\n 0xE884: 0x95BC,\n 0xE885: 0x95BB,\n 0xE886: 0x95B9,\n 0xE887: 0x95BE,\n 0xE888: 0x95CA,\n 0xE889: 0x6FF6,\n 0xE88A: 0x95C3,\n 0xE88B: 0x95CD,\n 0xE88C: 0x95CC,\n 0xE88D: 0x95D5,\n 0xE88E: 0x95D4,\n 0xE88F: 0x95D6,\n 0xE890: 0x95DC,\n 0xE891: 0x95E1,\n 0xE892: 0x95E5,\n 0xE893: 0x95E2,\n 0xE894: 0x9621,\n 0xE895: 0x9628,\n 0xE896: 0x962E,\n 0xE897: 0x962F,\n 0xE898: 0x9642,\n 0xE899: 0x964C,\n 0xE89A: 0x964F,\n 0xE89B: 0x964B,\n 0xE89C: 0x9677,\n 0xE89D: 0x965C,\n 0xE89E: 0x965E,\n 0xE89F: 0x965D,\n 0xE8A0: 0x965F,\n 0xE8A1: 0x9666,\n 0xE8A2: 0x9672,\n 0xE8A3: 0x966C,\n 0xE8A4: 0x968D,\n 0xE8A5: 0x9698,\n 0xE8A6: 0x9695,\n 0xE8A7: 0x9697,\n 0xE8A8: 0x96AA,\n 0xE8A9: 0x96A7,\n 0xE8AA: 0x96B1,\n 0xE8AB: 0x96B2,\n 0xE8AC: 0x96B0,\n 0xE8AD: 0x96B4,\n 0xE8AE: 0x96B6,\n 0xE8AF: 0x96B8,\n 0xE8B0: 0x96B9,\n 0xE8B1: 0x96CE,\n 0xE8B2: 0x96CB,\n 0xE8B3: 0x96C9,\n 0xE8B4: 0x96CD,\n 0xE8B5: 0x894D,\n 0xE8B6: 0x96DC,\n 0xE8B7: 0x970D,\n 0xE8B8: 0x96D5,\n 0xE8B9: 0x96F9,\n 0xE8BA: 0x9704,\n 0xE8BB: 0x9706,\n 0xE8BC: 0x9708,\n 0xE8BD: 0x9713,\n 0xE8BE: 0x970E,\n 0xE8BF: 0x9711,\n 0xE8C0: 0x970F,\n 0xE8C1: 0x9716,\n 0xE8C2: 0x9719,\n 0xE8C3: 0x9724,\n 0xE8C4: 0x972A,\n 0xE8C5: 0x9730,\n 0xE8C6: 0x9739,\n 0xE8C7: 0x973D,\n 0xE8C8: 0x973E,\n 0xE8C9: 0x9744,\n 0xE8CA: 0x9746,\n 0xE8CB: 0x9748,\n 0xE8CC: 0x9742,\n 0xE8CD: 0x9749,\n 0xE8CE: 0x975C,\n 0xE8CF: 0x9760,\n 0xE8D0: 0x9764,\n 0xE8D1: 0x9766,\n 0xE8D2: 0x9768,\n 0xE8D3: 0x52D2,\n 0xE8D4: 0x976B,\n 0xE8D5: 0x9771,\n 0xE8D6: 0x9779,\n 0xE8D7: 0x9785,\n 0xE8D8: 0x977C,\n 0xE8D9: 0x9781,\n 0xE8DA: 0x977A,\n 0xE8DB: 0x9786,\n 0xE8DC: 0x978B,\n 0xE8DD: 0x978F,\n 0xE8DE: 0x9790,\n 0xE8DF: 0x979C,\n 0xE8E0: 0x97A8,\n 0xE8E1: 0x97A6,\n 0xE8E2: 0x97A3,\n 0xE8E3: 0x97B3,\n 0xE8E4: 0x97B4,\n 0xE8E5: 0x97C3,\n 0xE8E6: 0x97C6,\n 0xE8E7: 0x97C8,\n 0xE8E8: 0x97CB,\n 0xE8E9: 0x97DC,\n 0xE8EA: 0x97ED,\n 0xE8EB: 0x9F4F,\n 0xE8EC: 0x97F2,\n 0xE8ED: 0x7ADF,\n 0xE8EE: 0x97F6,\n 0xE8EF: 0x97F5,\n 0xE8F0: 0x980F,\n 0xE8F1: 0x980C,\n 0xE8F2: 0x9838,\n 0xE8F3: 0x9824,\n 0xE8F4: 0x9821,\n 0xE8F5: 0x9837,\n 0xE8F6: 0x983D,\n 0xE8F7: 0x9846,\n 0xE8F8: 0x984F,\n 0xE8F9: 0x984B,\n 0xE8FA: 0x986B,\n 0xE8FB: 0x986F,\n 0xE8FC: 0x9870,\n 0xE940: 0x9871,\n 0xE941: 0x9874,\n 0xE942: 0x9873,\n 0xE943: 0x98AA,\n 0xE944: 0x98AF,\n 0xE945: 0x98B1,\n 0xE946: 0x98B6,\n 0xE947: 0x98C4,\n 0xE948: 0x98C3,\n 0xE949: 0x98C6,\n 0xE94A: 0x98E9,\n 0xE94B: 0x98EB,\n 0xE94C: 0x9903,\n 0xE94D: 0x9909,\n 0xE94E: 0x9912,\n 0xE94F: 0x9914,\n 0xE950: 0x9918,\n 0xE951: 0x9921,\n 0xE952: 0x991D,\n 0xE953: 0x991E,\n 0xE954: 0x9924,\n 0xE955: 0x9920,\n 0xE956: 0x992C,\n 0xE957: 0x992E,\n 0xE958: 0x993D,\n 0xE959: 0x993E,\n 0xE95A: 0x9942,\n 0xE95B: 0x9949,\n 0xE95C: 0x9945,\n 0xE95D: 0x9950,\n 0xE95E: 0x994B,\n 0xE95F: 0x9951,\n 0xE960: 0x9952,\n 0xE961: 0x994C,\n 0xE962: 0x9955,\n 0xE963: 0x9997,\n 0xE964: 0x9998,\n 0xE965: 0x99A5,\n 0xE966: 0x99AD,\n 0xE967: 0x99AE,\n 0xE968: 0x99BC,\n 0xE969: 0x99DF,\n 0xE96A: 0x99DB,\n 0xE96B: 0x99DD,\n 0xE96C: 0x99D8,\n 0xE96D: 0x99D1,\n 0xE96E: 0x99ED,\n 0xE96F: 0x99EE,\n 0xE970: 0x99F1,\n 0xE971: 0x99F2,\n 0xE972: 0x99FB,\n 0xE973: 0x99F8,\n 0xE974: 0x9A01,\n 0xE975: 0x9A0F,\n 0xE976: 0x9A05,\n 0xE977: 0x99E2,\n 0xE978: 0x9A19,\n 0xE979: 0x9A2B,\n 0xE97A: 0x9A37,\n 0xE97B: 0x9A45,\n 0xE97C: 0x9A42,\n 0xE97D: 0x9A40,\n 0xE97E: 0x9A43,\n 0xE980: 0x9A3E,\n 0xE981: 0x9A55,\n 0xE982: 0x9A4D,\n 0xE983: 0x9A5B,\n 0xE984: 0x9A57,\n 0xE985: 0x9A5F,\n 0xE986: 0x9A62,\n 0xE987: 0x9A65,\n 0xE988: 0x9A64,\n 0xE989: 0x9A69,\n 0xE98A: 0x9A6B,\n 0xE98B: 0x9A6A,\n 0xE98C: 0x9AAD,\n 0xE98D: 0x9AB0,\n 0xE98E: 0x9ABC,\n 0xE98F: 0x9AC0,\n 0xE990: 0x9ACF,\n 0xE991: 0x9AD1,\n 0xE992: 0x9AD3,\n 0xE993: 0x9AD4,\n 0xE994: 0x9ADE,\n 0xE995: 0x9ADF,\n 0xE996: 0x9AE2,\n 0xE997: 0x9AE3,\n 0xE998: 0x9AE6,\n 0xE999: 0x9AEF,\n 0xE99A: 0x9AEB,\n 0xE99B: 0x9AEE,\n 0xE99C: 0x9AF4,\n 0xE99D: 0x9AF1,\n 0xE99E: 0x9AF7,\n 0xE99F: 0x9AFB,\n 0xE9A0: 0x9B06,\n 0xE9A1: 0x9B18,\n 0xE9A2: 0x9B1A,\n 0xE9A3: 0x9B1F,\n 0xE9A4: 0x9B22,\n 0xE9A5: 0x9B23,\n 0xE9A6: 0x9B25,\n 0xE9A7: 0x9B27,\n 0xE9A8: 0x9B28,\n 0xE9A9: 0x9B29,\n 0xE9AA: 0x9B2A,\n 0xE9AB: 0x9B2E,\n 0xE9AC: 0x9B2F,\n 0xE9AD: 0x9B32,\n 0xE9AE: 0x9B44,\n 0xE9AF: 0x9B43,\n 0xE9B0: 0x9B4F,\n 0xE9B1: 0x9B4D,\n 0xE9B2: 0x9B4E,\n 0xE9B3: 0x9B51,\n 0xE9B4: 0x9B58,\n 0xE9B5: 0x9B74,\n 0xE9B6: 0x9B93,\n 0xE9B7: 0x9B83,\n 0xE9B8: 0x9B91,\n 0xE9B9: 0x9B96,\n 0xE9BA: 0x9B97,\n 0xE9BB: 0x9B9F,\n 0xE9BC: 0x9BA0,\n 0xE9BD: 0x9BA8,\n 0xE9BE: 0x9BB4,\n 0xE9BF: 0x9BC0,\n 0xE9C0: 0x9BCA,\n 0xE9C1: 0x9BB9,\n 0xE9C2: 0x9BC6,\n 0xE9C3: 0x9BCF,\n 0xE9C4: 0x9BD1,\n 0xE9C5: 0x9BD2,\n 0xE9C6: 0x9BE3,\n 0xE9C7: 0x9BE2,\n 0xE9C8: 0x9BE4,\n 0xE9C9: 0x9BD4,\n 0xE9CA: 0x9BE1,\n 0xE9CB: 0x9C3A,\n 0xE9CC: 0x9BF2,\n 0xE9CD: 0x9BF1,\n 0xE9CE: 0x9BF0,\n 0xE9CF: 0x9C15,\n 0xE9D0: 0x9C14,\n 0xE9D1: 0x9C09,\n 0xE9D2: 0x9C13,\n 0xE9D3: 0x9C0C,\n 0xE9D4: 0x9C06,\n 0xE9D5: 0x9C08,\n 0xE9D6: 0x9C12,\n 0xE9D7: 0x9C0A,\n 0xE9D8: 0x9C04,\n 0xE9D9: 0x9C2E,\n 0xE9DA: 0x9C1B,\n 0xE9DB: 0x9C25,\n 0xE9DC: 0x9C24,\n 0xE9DD: 0x9C21,\n 0xE9DE: 0x9C30,\n 0xE9DF: 0x9C47,\n 0xE9E0: 0x9C32,\n 0xE9E1: 0x9C46,\n 0xE9E2: 0x9C3E,\n 0xE9E3: 0x9C5A,\n 0xE9E4: 0x9C60,\n 0xE9E5: 0x9C67,\n 0xE9E6: 0x9C76,\n 0xE9E7: 0x9C78,\n 0xE9E8: 0x9CE7,\n 0xE9E9: 0x9CEC,\n 0xE9EA: 0x9CF0,\n 0xE9EB: 0x9D09,\n 0xE9EC: 0x9D08,\n 0xE9ED: 0x9CEB,\n 0xE9EE: 0x9D03,\n 0xE9EF: 0x9D06,\n 0xE9F0: 0x9D2A,\n 0xE9F1: 0x9D26,\n 0xE9F2: 0x9DAF,\n 0xE9F3: 0x9D23,\n 0xE9F4: 0x9D1F,\n 0xE9F5: 0x9D44,\n 0xE9F6: 0x9D15,\n 0xE9F7: 0x9D12,\n 0xE9F8: 0x9D41,\n 0xE9F9: 0x9D3F,\n 0xE9FA: 0x9D3E,\n 0xE9FB: 0x9D46,\n 0xE9FC: 0x9D48,\n 0xEA40: 0x9D5D,\n 0xEA41: 0x9D5E,\n 0xEA42: 0x9D64,\n 0xEA43: 0x9D51,\n 0xEA44: 0x9D50,\n 0xEA45: 0x9D59,\n 0xEA46: 0x9D72,\n 0xEA47: 0x9D89,\n 0xEA48: 0x9D87,\n 0xEA49: 0x9DAB,\n 0xEA4A: 0x9D6F,\n 0xEA4B: 0x9D7A,\n 0xEA4C: 0x9D9A,\n 0xEA4D: 0x9DA4,\n 0xEA4E: 0x9DA9,\n 0xEA4F: 0x9DB2,\n 0xEA50: 0x9DC4,\n 0xEA51: 0x9DC1,\n 0xEA52: 0x9DBB,\n 0xEA53: 0x9DB8,\n 0xEA54: 0x9DBA,\n 0xEA55: 0x9DC6,\n 0xEA56: 0x9DCF,\n 0xEA57: 0x9DC2,\n 0xEA58: 0x9DD9,\n 0xEA59: 0x9DD3,\n 0xEA5A: 0x9DF8,\n 0xEA5B: 0x9DE6,\n 0xEA5C: 0x9DED,\n 0xEA5D: 0x9DEF,\n 0xEA5E: 0x9DFD,\n 0xEA5F: 0x9E1A,\n 0xEA60: 0x9E1B,\n 0xEA61: 0x9E1E,\n 0xEA62: 0x9E75,\n 0xEA63: 0x9E79,\n 0xEA64: 0x9E7D,\n 0xEA65: 0x9E81,\n 0xEA66: 0x9E88,\n 0xEA67: 0x9E8B,\n 0xEA68: 0x9E8C,\n 0xEA69: 0x9E92,\n 0xEA6A: 0x9E95,\n 0xEA6B: 0x9E91,\n 0xEA6C: 0x9E9D,\n 0xEA6D: 0x9EA5,\n 0xEA6E: 0x9EA9,\n 0xEA6F: 0x9EB8,\n 0xEA70: 0x9EAA,\n 0xEA71: 0x9EAD,\n 0xEA72: 0x9761,\n 0xEA73: 0x9ECC,\n 0xEA74: 0x9ECE,\n 0xEA75: 0x9ECF,\n 0xEA76: 0x9ED0,\n 0xEA77: 0x9ED4,\n 0xEA78: 0x9EDC,\n 0xEA79: 0x9EDE,\n 0xEA7A: 0x9EDD,\n 0xEA7B: 0x9EE0,\n 0xEA7C: 0x9EE5,\n 0xEA7D: 0x9EE8,\n 0xEA7E: 0x9EEF,\n 0xEA80: 0x9EF4,\n 0xEA81: 0x9EF6,\n 0xEA82: 0x9EF7,\n 0xEA83: 0x9EF9,\n 0xEA84: 0x9EFB,\n 0xEA85: 0x9EFC,\n 0xEA86: 0x9EFD,\n 0xEA87: 0x9F07,\n 0xEA88: 0x9F08,\n 0xEA89: 0x76B7,\n 0xEA8A: 0x9F15,\n 0xEA8B: 0x9F21,\n 0xEA8C: 0x9F2C,\n 0xEA8D: 0x9F3E,\n 0xEA8E: 0x9F4A,\n 0xEA8F: 0x9F52,\n 0xEA90: 0x9F54,\n 0xEA91: 0x9F63,\n 0xEA92: 0x9F5F,\n 0xEA93: 0x9F60,\n 0xEA94: 0x9F61,\n 0xEA95: 0x9F66,\n 0xEA96: 0x9F67,\n 0xEA97: 0x9F6C,\n 0xEA98: 0x9F6A,\n 0xEA99: 0x9F77,\n 0xEA9A: 0x9F72,\n 0xEA9B: 0x9F76,\n 0xEA9C: 0x9F95,\n 0xEA9D: 0x9F9C,\n 0xEA9E: 0x9FA0,\n 0xEA9F: 0x582F,\n 0xEAA0: 0x69C7,\n 0xEAA1: 0x9059,\n 0xEAA2: 0x7464,\n 0xEAA3: 0x51DC,\n 0xEAA4: 0x7199,\n};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGF_1 = __webpack_require__(1);\nvar GenericGFPoly_1 = __webpack_require__(2);\nfunction runEuclideanAlgorithm(field, a, b, R) {\n // Assume a's degree is >= b's\n if (a.degree() < b.degree()) {\n _a = [b, a], a = _a[0], b = _a[1];\n }\n var rLast = a;\n var r = b;\n var tLast = field.zero;\n var t = field.one;\n // Run Euclidean algorithm until r's degree is less than R/2\n while (r.degree() >= R / 2) {\n var rLastLast = rLast;\n var tLastLast = tLast;\n rLast = r;\n tLast = t;\n // Divide rLastLast by rLast, with quotient in q and remainder in r\n if (rLast.isZero()) {\n // Euclidean algorithm already terminated?\n return null;\n }\n r = rLastLast;\n var q = field.zero;\n var denominatorLeadingTerm = rLast.getCoefficient(rLast.degree());\n var dltInverse = field.inverse(denominatorLeadingTerm);\n while (r.degree() >= rLast.degree() && !r.isZero()) {\n var degreeDiff = r.degree() - rLast.degree();\n var scale = field.multiply(r.getCoefficient(r.degree()), dltInverse);\n q = q.addOrSubtract(field.buildMonomial(degreeDiff, scale));\n r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale));\n }\n t = q.multiplyPoly(tLast).addOrSubtract(tLastLast);\n if (r.degree() >= rLast.degree()) {\n return null;\n }\n }\n var sigmaTildeAtZero = t.getCoefficient(0);\n if (sigmaTildeAtZero === 0) {\n return null;\n }\n var inverse = field.inverse(sigmaTildeAtZero);\n return [t.multiply(inverse), r.multiply(inverse)];\n var _a;\n}\nfunction findErrorLocations(field, errorLocator) {\n // This is a direct application of Chien's search\n var numErrors = errorLocator.degree();\n if (numErrors === 1) {\n return [errorLocator.getCoefficient(1)];\n }\n var result = new Array(numErrors);\n var errorCount = 0;\n for (var i = 1; i < field.size && errorCount < numErrors; i++) {\n if (errorLocator.evaluateAt(i) === 0) {\n result[errorCount] = field.inverse(i);\n errorCount++;\n }\n }\n if (errorCount !== numErrors) {\n return null;\n }\n return result;\n}\nfunction findErrorMagnitudes(field, errorEvaluator, errorLocations) {\n // This is directly applying Forney's Formula\n var s = errorLocations.length;\n var result = new Array(s);\n for (var i = 0; i < s; i++) {\n var xiInverse = field.inverse(errorLocations[i]);\n var denominator = 1;\n for (var j = 0; j < s; j++) {\n if (i !== j) {\n denominator = field.multiply(denominator, GenericGF_1.addOrSubtractGF(1, field.multiply(errorLocations[j], xiInverse)));\n }\n }\n result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), field.inverse(denominator));\n if (field.generatorBase !== 0) {\n result[i] = field.multiply(result[i], xiInverse);\n }\n }\n return result;\n}\nfunction decode(bytes, twoS) {\n var outputBytes = new Uint8ClampedArray(bytes.length);\n outputBytes.set(bytes);\n var field = new GenericGF_1.default(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1\n var poly = new GenericGFPoly_1.default(field, outputBytes);\n var syndromeCoefficients = new Uint8ClampedArray(twoS);\n var error = false;\n for (var s = 0; s < twoS; s++) {\n var evaluation = poly.evaluateAt(field.exp(s + field.generatorBase));\n syndromeCoefficients[syndromeCoefficients.length - 1 - s] = evaluation;\n if (evaluation !== 0) {\n error = true;\n }\n }\n if (!error) {\n return outputBytes;\n }\n var syndrome = new GenericGFPoly_1.default(field, syndromeCoefficients);\n var sigmaOmega = runEuclideanAlgorithm(field, field.buildMonomial(twoS, 1), syndrome, twoS);\n if (sigmaOmega === null) {\n return null;\n }\n var errorLocations = findErrorLocations(field, sigmaOmega[0]);\n if (errorLocations == null) {\n return null;\n }\n var errorMagnitudes = findErrorMagnitudes(field, sigmaOmega[1], errorLocations);\n for (var i = 0; i < errorLocations.length; i++) {\n var position = outputBytes.length - 1 - field.log(errorLocations[i]);\n if (position < 0) {\n return null;\n }\n outputBytes[position] = GenericGF_1.addOrSubtractGF(outputBytes[position], errorMagnitudes[i]);\n }\n return outputBytes;\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VERSIONS = [\n {\n infoBits: null,\n versionNumber: 1,\n alignmentPatternCenters: [],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 7,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 19 }],\n },\n {\n ecCodewordsPerBlock: 10,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }],\n },\n {\n ecCodewordsPerBlock: 13,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 13 }],\n },\n {\n ecCodewordsPerBlock: 17,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 9 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 2,\n alignmentPatternCenters: [6, 18],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 10,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 34 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 28 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 22 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 3,\n alignmentPatternCenters: [6, 22],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 15,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 55 }],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 44 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 17 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 13 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 4,\n alignmentPatternCenters: [6, 26],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 80 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 32 }],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 24 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 9 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 5,\n alignmentPatternCenters: [6, 30],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 108 }],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 43 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n { numBlocks: 2, dataCodewordsPerBlock: 16 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 11 },\n { numBlocks: 2, dataCodewordsPerBlock: 12 },\n ],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 6,\n alignmentPatternCenters: [6, 34],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 68 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 27 }],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 19 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 15 }],\n },\n ],\n },\n {\n infoBits: 0x07C94,\n versionNumber: 7,\n alignmentPatternCenters: [6, 22, 38],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 78 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 31 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 4, dataCodewordsPerBlock: 15 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 13 },\n { numBlocks: 1, dataCodewordsPerBlock: 14 },\n ],\n },\n ],\n },\n {\n infoBits: 0x085BC,\n versionNumber: 8,\n alignmentPatternCenters: [6, 24, 42],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 97 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 38 },\n { numBlocks: 2, dataCodewordsPerBlock: 39 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 18 },\n { numBlocks: 2, dataCodewordsPerBlock: 19 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 14 },\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x09A99,\n versionNumber: 9,\n alignmentPatternCenters: [6, 26, 46],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 116 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 36 },\n { numBlocks: 2, dataCodewordsPerBlock: 37 },\n ],\n },\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 16 },\n { numBlocks: 4, dataCodewordsPerBlock: 17 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 12 },\n { numBlocks: 4, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0A4D3,\n versionNumber: 10,\n alignmentPatternCenters: [6, 28, 50],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 68 },\n { numBlocks: 2, dataCodewordsPerBlock: 69 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 43 },\n { numBlocks: 1, dataCodewordsPerBlock: 44 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 19 },\n { numBlocks: 2, dataCodewordsPerBlock: 20 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 15 },\n { numBlocks: 2, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0BBF6,\n versionNumber: 11,\n alignmentPatternCenters: [6, 30, 54],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 81 }],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 50 },\n { numBlocks: 4, dataCodewordsPerBlock: 51 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 22 },\n { numBlocks: 4, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 12 },\n { numBlocks: 8, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0C762,\n versionNumber: 12,\n alignmentPatternCenters: [6, 32, 58],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 92 },\n { numBlocks: 2, dataCodewordsPerBlock: 93 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 36 },\n { numBlocks: 2, dataCodewordsPerBlock: 37 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 20 },\n { numBlocks: 6, dataCodewordsPerBlock: 21 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 14 },\n { numBlocks: 4, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0D847,\n versionNumber: 13,\n alignmentPatternCenters: [6, 34, 62],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 107 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 37 },\n { numBlocks: 1, dataCodewordsPerBlock: 38 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 20 },\n { numBlocks: 4, dataCodewordsPerBlock: 21 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 11 },\n { numBlocks: 4, dataCodewordsPerBlock: 12 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0E60D,\n versionNumber: 14,\n alignmentPatternCenters: [6, 26, 46, 66],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 115 },\n { numBlocks: 1, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 40 },\n { numBlocks: 5, dataCodewordsPerBlock: 41 },\n ],\n },\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 16 },\n { numBlocks: 5, dataCodewordsPerBlock: 17 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 12 },\n { numBlocks: 5, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0F928,\n versionNumber: 15,\n alignmentPatternCenters: [6, 26, 48, 70],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 87 },\n { numBlocks: 1, dataCodewordsPerBlock: 88 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 41 },\n { numBlocks: 5, dataCodewordsPerBlock: 42 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 24 },\n { numBlocks: 7, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 12 },\n { numBlocks: 7, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x10B78,\n versionNumber: 16,\n alignmentPatternCenters: [6, 26, 50, 74],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 98 },\n { numBlocks: 1, dataCodewordsPerBlock: 99 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 45 },\n { numBlocks: 3, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 19 },\n { numBlocks: 2, dataCodewordsPerBlock: 20 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 15 },\n { numBlocks: 13, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1145D,\n versionNumber: 17,\n alignmentPatternCenters: [6, 30, 54, 78],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 107 },\n { numBlocks: 5, dataCodewordsPerBlock: 108 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 46 },\n { numBlocks: 1, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 22 },\n { numBlocks: 15, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 17, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x12A17,\n versionNumber: 18,\n alignmentPatternCenters: [6, 30, 56, 82],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 120 },\n { numBlocks: 1, dataCodewordsPerBlock: 121 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 9, dataCodewordsPerBlock: 43 },\n { numBlocks: 4, dataCodewordsPerBlock: 44 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 22 },\n { numBlocks: 1, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x13532,\n versionNumber: 19,\n alignmentPatternCenters: [6, 30, 58, 86],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 113 },\n { numBlocks: 4, dataCodewordsPerBlock: 114 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 44 },\n { numBlocks: 11, dataCodewordsPerBlock: 45 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 21 },\n { numBlocks: 4, dataCodewordsPerBlock: 22 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 9, dataCodewordsPerBlock: 13 },\n { numBlocks: 16, dataCodewordsPerBlock: 14 },\n ],\n },\n ],\n },\n {\n infoBits: 0x149A6,\n versionNumber: 20,\n alignmentPatternCenters: [6, 34, 62, 90],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 107 },\n { numBlocks: 5, dataCodewordsPerBlock: 108 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 41 },\n { numBlocks: 13, dataCodewordsPerBlock: 42 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 24 },\n { numBlocks: 5, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 15 },\n { numBlocks: 10, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x15683,\n versionNumber: 21,\n alignmentPatternCenters: [6, 28, 50, 72, 94],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 116 },\n { numBlocks: 4, dataCodewordsPerBlock: 117 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 42 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 22 },\n { numBlocks: 6, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 16 },\n { numBlocks: 6, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x168C9,\n versionNumber: 22,\n alignmentPatternCenters: [6, 26, 50, 74, 98],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 111 },\n { numBlocks: 7, dataCodewordsPerBlock: 112 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 46 }],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 24 },\n { numBlocks: 16, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 34, dataCodewordsPerBlock: 13 }],\n },\n ],\n },\n {\n infoBits: 0x177EC,\n versionNumber: 23,\n alignmentPatternCenters: [6, 30, 54, 74, 102],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 121 },\n { numBlocks: 5, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 47 },\n { numBlocks: 14, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 16, dataCodewordsPerBlock: 15 },\n { numBlocks: 14, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x18EC4,\n versionNumber: 24,\n alignmentPatternCenters: [6, 28, 54, 80, 106],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 117 },\n { numBlocks: 4, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 45 },\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 24 },\n { numBlocks: 16, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 30, dataCodewordsPerBlock: 16 },\n { numBlocks: 2, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x191E1,\n versionNumber: 25,\n alignmentPatternCenters: [6, 32, 58, 84, 110],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 106 },\n { numBlocks: 4, dataCodewordsPerBlock: 107 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 47 },\n { numBlocks: 13, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 24 },\n { numBlocks: 22, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 15 },\n { numBlocks: 13, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1AFAB,\n versionNumber: 26,\n alignmentPatternCenters: [6, 30, 58, 86, 114],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 114 },\n { numBlocks: 2, dataCodewordsPerBlock: 115 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 46 },\n { numBlocks: 4, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 28, dataCodewordsPerBlock: 22 },\n { numBlocks: 6, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 33, dataCodewordsPerBlock: 16 },\n { numBlocks: 4, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1B08E,\n versionNumber: 27,\n alignmentPatternCenters: [6, 34, 62, 90, 118],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 122 },\n { numBlocks: 4, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 45 },\n { numBlocks: 3, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 23 },\n { numBlocks: 26, dataCodewordsPerBlock: 24 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 15 },\n { numBlocks: 28, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1CC1A,\n versionNumber: 28,\n alignmentPatternCenters: [6, 26, 50, 74, 98, 122],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 117 },\n { numBlocks: 10, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 45 },\n { numBlocks: 23, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 24 },\n { numBlocks: 31, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 15 },\n { numBlocks: 31, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1D33F,\n versionNumber: 29,\n alignmentPatternCenters: [6, 30, 54, 78, 102, 126],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 116 },\n { numBlocks: 7, dataCodewordsPerBlock: 117 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 21, dataCodewordsPerBlock: 45 },\n { numBlocks: 7, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 23 },\n { numBlocks: 37, dataCodewordsPerBlock: 24 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n { numBlocks: 26, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1ED75,\n versionNumber: 30,\n alignmentPatternCenters: [6, 26, 52, 78, 104, 130],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 115 },\n { numBlocks: 10, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 47 },\n { numBlocks: 10, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 24 },\n { numBlocks: 25, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 23, dataCodewordsPerBlock: 15 },\n { numBlocks: 25, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1F250,\n versionNumber: 31,\n alignmentPatternCenters: [6, 30, 56, 82, 108, 134],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 115 },\n { numBlocks: 3, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 46 },\n { numBlocks: 29, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 42, dataCodewordsPerBlock: 24 },\n { numBlocks: 1, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 23, dataCodewordsPerBlock: 15 },\n { numBlocks: 28, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x209D5,\n versionNumber: 32,\n alignmentPatternCenters: [6, 34, 60, 86, 112, 138],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 115 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 46 },\n { numBlocks: 23, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 24 },\n { numBlocks: 35, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n { numBlocks: 35, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x216F0,\n versionNumber: 33,\n alignmentPatternCenters: [6, 30, 58, 86, 114, 142],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 115 },\n { numBlocks: 1, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n { numBlocks: 21, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 29, dataCodewordsPerBlock: 24 },\n { numBlocks: 19, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 15 },\n { numBlocks: 46, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x228BA,\n versionNumber: 34,\n alignmentPatternCenters: [6, 34, 62, 90, 118, 146],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 115 },\n { numBlocks: 6, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n { numBlocks: 23, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 44, dataCodewordsPerBlock: 24 },\n { numBlocks: 7, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 59, dataCodewordsPerBlock: 16 },\n { numBlocks: 1, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x2379F,\n versionNumber: 35,\n alignmentPatternCenters: [6, 30, 54, 78, 102, 126, 150],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 121 },\n { numBlocks: 7, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 47 },\n { numBlocks: 26, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 39, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 15 },\n { numBlocks: 41, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x24B0B,\n versionNumber: 36,\n alignmentPatternCenters: [6, 24, 50, 76, 102, 128, 154],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 121 },\n { numBlocks: 14, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 47 },\n { numBlocks: 34, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 46, dataCodewordsPerBlock: 24 },\n { numBlocks: 10, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n { numBlocks: 64, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x2542E,\n versionNumber: 37,\n alignmentPatternCenters: [6, 28, 54, 80, 106, 132, 158],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 122 },\n { numBlocks: 4, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 29, dataCodewordsPerBlock: 46 },\n { numBlocks: 14, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 49, dataCodewordsPerBlock: 24 },\n { numBlocks: 10, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 24, dataCodewordsPerBlock: 15 },\n { numBlocks: 46, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x26A64,\n versionNumber: 38,\n alignmentPatternCenters: [6, 32, 58, 84, 110, 136, 162],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 122 },\n { numBlocks: 18, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 46 },\n { numBlocks: 32, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 48, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 42, dataCodewordsPerBlock: 15 },\n { numBlocks: 32, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x27541,\n versionNumber: 39,\n alignmentPatternCenters: [6, 26, 54, 82, 110, 138, 166],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 20, dataCodewordsPerBlock: 117 },\n { numBlocks: 4, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 40, dataCodewordsPerBlock: 47 },\n { numBlocks: 7, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 43, dataCodewordsPerBlock: 24 },\n { numBlocks: 22, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 15 },\n { numBlocks: 67, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x28C69,\n versionNumber: 40,\n alignmentPatternCenters: [6, 30, 58, 86, 114, 142, 170],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 118 },\n { numBlocks: 6, dataCodewordsPerBlock: 119 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 18, dataCodewordsPerBlock: 47 },\n { numBlocks: 31, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 34, dataCodewordsPerBlock: 24 },\n { numBlocks: 34, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 20, dataCodewordsPerBlock: 15 },\n { numBlocks: 61, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n];\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nfunction squareToQuadrilateral(p1, p2, p3, p4) {\n var dx3 = p1.x - p2.x + p3.x - p4.x;\n var dy3 = p1.y - p2.y + p3.y - p4.y;\n if (dx3 === 0 && dy3 === 0) {\n return {\n a11: p2.x - p1.x,\n a12: p2.y - p1.y,\n a13: 0,\n a21: p3.x - p2.x,\n a22: p3.y - p2.y,\n a23: 0,\n a31: p1.x,\n a32: p1.y,\n a33: 1,\n };\n }\n else {\n var dx1 = p2.x - p3.x;\n var dx2 = p4.x - p3.x;\n var dy1 = p2.y - p3.y;\n var dy2 = p4.y - p3.y;\n var denominator = dx1 * dy2 - dx2 * dy1;\n var a13 = (dx3 * dy2 - dx2 * dy3) / denominator;\n var a23 = (dx1 * dy3 - dx3 * dy1) / denominator;\n return {\n a11: p2.x - p1.x + a13 * p2.x,\n a12: p2.y - p1.y + a13 * p2.y,\n a13: a13,\n a21: p4.x - p1.x + a23 * p4.x,\n a22: p4.y - p1.y + a23 * p4.y,\n a23: a23,\n a31: p1.x,\n a32: p1.y,\n a33: 1,\n };\n }\n}\nfunction quadrilateralToSquare(p1, p2, p3, p4) {\n // Here, the adjoint serves as the inverse:\n var sToQ = squareToQuadrilateral(p1, p2, p3, p4);\n return {\n a11: sToQ.a22 * sToQ.a33 - sToQ.a23 * sToQ.a32,\n a12: sToQ.a13 * sToQ.a32 - sToQ.a12 * sToQ.a33,\n a13: sToQ.a12 * sToQ.a23 - sToQ.a13 * sToQ.a22,\n a21: sToQ.a23 * sToQ.a31 - sToQ.a21 * sToQ.a33,\n a22: sToQ.a11 * sToQ.a33 - sToQ.a13 * sToQ.a31,\n a23: sToQ.a13 * sToQ.a21 - sToQ.a11 * sToQ.a23,\n a31: sToQ.a21 * sToQ.a32 - sToQ.a22 * sToQ.a31,\n a32: sToQ.a12 * sToQ.a31 - sToQ.a11 * sToQ.a32,\n a33: sToQ.a11 * sToQ.a22 - sToQ.a12 * sToQ.a21,\n };\n}\nfunction times(a, b) {\n return {\n a11: a.a11 * b.a11 + a.a21 * b.a12 + a.a31 * b.a13,\n a12: a.a12 * b.a11 + a.a22 * b.a12 + a.a32 * b.a13,\n a13: a.a13 * b.a11 + a.a23 * b.a12 + a.a33 * b.a13,\n a21: a.a11 * b.a21 + a.a21 * b.a22 + a.a31 * b.a23,\n a22: a.a12 * b.a21 + a.a22 * b.a22 + a.a32 * b.a23,\n a23: a.a13 * b.a21 + a.a23 * b.a22 + a.a33 * b.a23,\n a31: a.a11 * b.a31 + a.a21 * b.a32 + a.a31 * b.a33,\n a32: a.a12 * b.a31 + a.a22 * b.a32 + a.a32 * b.a33,\n a33: a.a13 * b.a31 + a.a23 * b.a32 + a.a33 * b.a33,\n };\n}\nfunction extract(image, location) {\n var qToS = quadrilateralToSquare({ x: 3.5, y: 3.5 }, { x: location.dimension - 3.5, y: 3.5 }, { x: location.dimension - 6.5, y: location.dimension - 6.5 }, { x: 3.5, y: location.dimension - 3.5 });\n var sToQ = squareToQuadrilateral(location.topLeft, location.topRight, location.alignmentPattern, location.bottomLeft);\n var transform = times(sToQ, qToS);\n var matrix = BitMatrix_1.BitMatrix.createEmpty(location.dimension, location.dimension);\n var mappingFunction = function (x, y) {\n var denominator = transform.a13 * x + transform.a23 * y + transform.a33;\n return {\n x: (transform.a11 * x + transform.a21 * y + transform.a31) / denominator,\n y: (transform.a12 * x + transform.a22 * y + transform.a32) / denominator,\n };\n };\n for (var y = 0; y < location.dimension; y++) {\n for (var x = 0; x < location.dimension; x++) {\n var xValue = x + 0.5;\n var yValue = y + 0.5;\n var sourcePixel = mappingFunction(xValue, yValue);\n matrix.set(x, y, image.get(Math.floor(sourcePixel.x), Math.floor(sourcePixel.y)));\n }\n }\n return {\n matrix: matrix,\n mappingFunction: mappingFunction,\n };\n}\nexports.extract = extract;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MAX_FINDERPATTERNS_TO_SEARCH = 4;\nvar MIN_QUAD_RATIO = 0.5;\nvar MAX_QUAD_RATIO = 1.5;\nvar distance = function (a, b) { return Math.sqrt(Math.pow((b.x - a.x), 2) + Math.pow((b.y - a.y), 2)); };\nfunction sum(values) {\n return values.reduce(function (a, b) { return a + b; });\n}\n// Takes three finder patterns and organizes them into topLeft, topRight, etc\nfunction reorderFinderPatterns(pattern1, pattern2, pattern3) {\n // Find distances between pattern centers\n var oneTwoDistance = distance(pattern1, pattern2);\n var twoThreeDistance = distance(pattern2, pattern3);\n var oneThreeDistance = distance(pattern1, pattern3);\n var bottomLeft;\n var topLeft;\n var topRight;\n // Assume one closest to other two is B; A and C will just be guesses at first\n if (twoThreeDistance >= oneTwoDistance && twoThreeDistance >= oneThreeDistance) {\n _a = [pattern2, pattern1, pattern3], bottomLeft = _a[0], topLeft = _a[1], topRight = _a[2];\n }\n else if (oneThreeDistance >= twoThreeDistance && oneThreeDistance >= oneTwoDistance) {\n _b = [pattern1, pattern2, pattern3], bottomLeft = _b[0], topLeft = _b[1], topRight = _b[2];\n }\n else {\n _c = [pattern1, pattern3, pattern2], bottomLeft = _c[0], topLeft = _c[1], topRight = _c[2];\n }\n // Use cross product to figure out whether bottomLeft (A) and topRight (C) are correct or flipped in relation to topLeft (B)\n // This asks whether BC x BA has a positive z component, which is the arrangement we want. If it's negative, then\n // we've got it flipped around and should swap topRight and bottomLeft.\n if (((topRight.x - topLeft.x) * (bottomLeft.y - topLeft.y)) - ((topRight.y - topLeft.y) * (bottomLeft.x - topLeft.x)) < 0) {\n _d = [topRight, bottomLeft], bottomLeft = _d[0], topRight = _d[1];\n }\n return { bottomLeft: bottomLeft, topLeft: topLeft, topRight: topRight };\n var _a, _b, _c, _d;\n}\n// Computes the dimension (number of modules on a side) of the QR Code based on the position of the finder patterns\nfunction computeDimension(topLeft, topRight, bottomLeft, matrix) {\n var moduleSize = (sum(countBlackWhiteRun(topLeft, bottomLeft, matrix, 5)) / 7 + // Divide by 7 since the ratio is 1:1:3:1:1\n sum(countBlackWhiteRun(topLeft, topRight, matrix, 5)) / 7 +\n sum(countBlackWhiteRun(bottomLeft, topLeft, matrix, 5)) / 7 +\n sum(countBlackWhiteRun(topRight, topLeft, matrix, 5)) / 7) / 4;\n if (moduleSize < 1) {\n throw new Error(\"Invalid module size\");\n }\n var topDimension = Math.round(distance(topLeft, topRight) / moduleSize);\n var sideDimension = Math.round(distance(topLeft, bottomLeft) / moduleSize);\n var dimension = Math.floor((topDimension + sideDimension) / 2) + 7;\n switch (dimension % 4) {\n case 0:\n dimension++;\n break;\n case 2:\n dimension--;\n break;\n }\n return { dimension: dimension, moduleSize: moduleSize };\n}\n// Takes an origin point and an end point and counts the sizes of the black white run from the origin towards the end point.\n// Returns an array of elements, representing the pixel size of the black white run.\n// Uses a variant of http://en.wikipedia.org/wiki/Bresenham's_line_algorithm\nfunction countBlackWhiteRunTowardsPoint(origin, end, matrix, length) {\n var switchPoints = [{ x: Math.floor(origin.x), y: Math.floor(origin.y) }];\n var steep = Math.abs(end.y - origin.y) > Math.abs(end.x - origin.x);\n var fromX;\n var fromY;\n var toX;\n var toY;\n if (steep) {\n fromX = Math.floor(origin.y);\n fromY = Math.floor(origin.x);\n toX = Math.floor(end.y);\n toY = Math.floor(end.x);\n }\n else {\n fromX = Math.floor(origin.x);\n fromY = Math.floor(origin.y);\n toX = Math.floor(end.x);\n toY = Math.floor(end.y);\n }\n var dx = Math.abs(toX - fromX);\n var dy = Math.abs(toY - fromY);\n var error = Math.floor(-dx / 2);\n var xStep = fromX < toX ? 1 : -1;\n var yStep = fromY < toY ? 1 : -1;\n var currentPixel = true;\n // Loop up until x == toX, but not beyond\n for (var x = fromX, y = fromY; x !== toX + xStep; x += xStep) {\n // Does current pixel mean we have moved white to black or vice versa?\n // Scanning black in state 0,2 and white in state 1, so if we find the wrong\n // color, advance to next state or end if we are in state 2 already\n var realX = steep ? y : x;\n var realY = steep ? x : y;\n if (matrix.get(realX, realY) !== currentPixel) {\n currentPixel = !currentPixel;\n switchPoints.push({ x: realX, y: realY });\n if (switchPoints.length === length + 1) {\n break;\n }\n }\n error += dy;\n if (error > 0) {\n if (y === toY) {\n break;\n }\n y += yStep;\n error -= dx;\n }\n }\n var distances = [];\n for (var i = 0; i < length; i++) {\n if (switchPoints[i] && switchPoints[i + 1]) {\n distances.push(distance(switchPoints[i], switchPoints[i + 1]));\n }\n else {\n distances.push(0);\n }\n }\n return distances;\n}\n// Takes an origin point and an end point and counts the sizes of the black white run in the origin point\n// along the line that intersects with the end point. Returns an array of elements, representing the pixel sizes\n// of the black white run. Takes a length which represents the number of switches from black to white to look for.\nfunction countBlackWhiteRun(origin, end, matrix, length) {\n var rise = end.y - origin.y;\n var run = end.x - origin.x;\n var towardsEnd = countBlackWhiteRunTowardsPoint(origin, end, matrix, Math.ceil(length / 2));\n var awayFromEnd = countBlackWhiteRunTowardsPoint(origin, { x: origin.x - run, y: origin.y - rise }, matrix, Math.ceil(length / 2));\n var middleValue = towardsEnd.shift() + awayFromEnd.shift() - 1; // Substract one so we don't double count a pixel\n return (_a = awayFromEnd.concat(middleValue)).concat.apply(_a, towardsEnd);\n var _a;\n}\n// Takes in a black white run and an array of expected ratios. Returns the average size of the run as well as the \"error\" -\n// that is the amount the run diverges from the expected ratio\nfunction scoreBlackWhiteRun(sequence, ratios) {\n var averageSize = sum(sequence) / sum(ratios);\n var error = 0;\n ratios.forEach(function (ratio, i) {\n error += Math.pow((sequence[i] - ratio * averageSize), 2);\n });\n return { averageSize: averageSize, error: error };\n}\n// Takes an X,Y point and an array of sizes and scores the point against those ratios.\n// For example for a finder pattern takes the ratio list of 1:1:3:1:1 and checks horizontal, vertical and diagonal ratios\n// against that.\nfunction scorePattern(point, ratios, matrix) {\n try {\n var horizontalRun = countBlackWhiteRun(point, { x: -1, y: point.y }, matrix, ratios.length);\n var verticalRun = countBlackWhiteRun(point, { x: point.x, y: -1 }, matrix, ratios.length);\n var topLeftPoint = {\n x: Math.max(0, point.x - point.y) - 1,\n y: Math.max(0, point.y - point.x) - 1,\n };\n var topLeftBottomRightRun = countBlackWhiteRun(point, topLeftPoint, matrix, ratios.length);\n var bottomLeftPoint = {\n x: Math.min(matrix.width, point.x + point.y) + 1,\n y: Math.min(matrix.height, point.y + point.x) + 1,\n };\n var bottomLeftTopRightRun = countBlackWhiteRun(point, bottomLeftPoint, matrix, ratios.length);\n var horzError = scoreBlackWhiteRun(horizontalRun, ratios);\n var vertError = scoreBlackWhiteRun(verticalRun, ratios);\n var diagDownError = scoreBlackWhiteRun(topLeftBottomRightRun, ratios);\n var diagUpError = scoreBlackWhiteRun(bottomLeftTopRightRun, ratios);\n var ratioError = Math.sqrt(horzError.error * horzError.error +\n vertError.error * vertError.error +\n diagDownError.error * diagDownError.error +\n diagUpError.error * diagUpError.error);\n var avgSize = (horzError.averageSize + vertError.averageSize + diagDownError.averageSize + diagUpError.averageSize) / 4;\n var sizeError = (Math.pow((horzError.averageSize - avgSize), 2) +\n Math.pow((vertError.averageSize - avgSize), 2) +\n Math.pow((diagDownError.averageSize - avgSize), 2) +\n Math.pow((diagUpError.averageSize - avgSize), 2)) / avgSize;\n return ratioError + sizeError;\n }\n catch (_a) {\n return Infinity;\n }\n}\nfunction locate(matrix) {\n var finderPatternQuads = [];\n var activeFinderPatternQuads = [];\n var alignmentPatternQuads = [];\n var activeAlignmentPatternQuads = [];\n var _loop_1 = function (y) {\n var length_1 = 0;\n var lastBit = false;\n var scans = [0, 0, 0, 0, 0];\n var _loop_2 = function (x) {\n var v = matrix.get(x, y);\n if (v === lastBit) {\n length_1++;\n }\n else {\n scans = [scans[1], scans[2], scans[3], scans[4], length_1];\n length_1 = 1;\n lastBit = v;\n // Do the last 5 color changes ~ match the expected ratio for a finder pattern? 1:1:3:1:1 of b:w:b:w:b\n var averageFinderPatternBlocksize = sum(scans) / 7;\n var validFinderPattern = Math.abs(scans[0] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[1] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[2] - 3 * averageFinderPatternBlocksize) < 3 * averageFinderPatternBlocksize &&\n Math.abs(scans[3] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[4] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n !v; // And make sure the current pixel is white since finder patterns are bordered in white\n // Do the last 3 color changes ~ match the expected ratio for an alignment pattern? 1:1:1 of w:b:w\n var averageAlignmentPatternBlocksize = sum(scans.slice(-3)) / 3;\n var validAlignmentPattern = Math.abs(scans[2] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n Math.abs(scans[3] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n Math.abs(scans[4] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n v; // Is the current pixel black since alignment patterns are bordered in black\n if (validFinderPattern) {\n // Compute the start and end x values of the large center black square\n var endX_1 = x - scans[3] - scans[4];\n var startX_1 = endX_1 - scans[2];\n var line = { startX: startX_1, endX: endX_1, y: y };\n // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with\n // that line as the starting point.\n var matchingQuads = activeFinderPatternQuads.filter(function (q) {\n return (startX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) ||\n (endX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) ||\n (startX_1 <= q.bottom.startX && endX_1 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO &&\n (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO));\n });\n if (matchingQuads.length > 0) {\n matchingQuads[0].bottom = line;\n }\n else {\n activeFinderPatternQuads.push({ top: line, bottom: line });\n }\n }\n if (validAlignmentPattern) {\n // Compute the start and end x values of the center black square\n var endX_2 = x - scans[4];\n var startX_2 = endX_2 - scans[3];\n var line = { startX: startX_2, y: y, endX: endX_2 };\n // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with\n // that line as the starting point.\n var matchingQuads = activeAlignmentPatternQuads.filter(function (q) {\n return (startX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) ||\n (endX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) ||\n (startX_2 <= q.bottom.startX && endX_2 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO &&\n (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO));\n });\n if (matchingQuads.length > 0) {\n matchingQuads[0].bottom = line;\n }\n else {\n activeAlignmentPatternQuads.push({ top: line, bottom: line });\n }\n }\n }\n };\n for (var x = -1; x <= matrix.width; x++) {\n _loop_2(x);\n }\n finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y !== y && q.bottom.y - q.top.y >= 2; }));\n activeFinderPatternQuads = activeFinderPatternQuads.filter(function (q) { return q.bottom.y === y; });\n alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y !== y; }));\n activeAlignmentPatternQuads = activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y === y; });\n };\n for (var y = 0; y <= matrix.height; y++) {\n _loop_1(y);\n }\n finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y - q.top.y >= 2; }));\n alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads);\n var finderPatternGroups = finderPatternQuads\n .filter(function (q) { return q.bottom.y - q.top.y >= 2; }) // All quads must be at least 2px tall since the center square is larger than a block\n .map(function (q) {\n var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;\n var y = (q.top.y + q.bottom.y + 1) / 2;\n if (!matrix.get(Math.round(x), Math.round(y))) {\n return;\n }\n var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, q.bottom.y - q.top.y + 1];\n var size = sum(lengths) / lengths.length;\n var score = scorePattern({ x: Math.round(x), y: Math.round(y) }, [1, 1, 3, 1, 1], matrix);\n return { score: score, x: x, y: y, size: size };\n })\n .filter(function (q) { return !!q; }) // Filter out any rejected quads from above\n .sort(function (a, b) { return a.score - b.score; })\n .map(function (point, i, finderPatterns) {\n if (i > MAX_FINDERPATTERNS_TO_SEARCH) {\n return null;\n }\n var otherPoints = finderPatterns\n .filter(function (p, ii) { return i !== ii; })\n .map(function (p) { return ({ x: p.x, y: p.y, score: p.score + (Math.pow((p.size - point.size), 2)) / point.size, size: p.size }); })\n .sort(function (a, b) { return a.score - b.score; });\n if (otherPoints.length < 2) {\n return null;\n }\n var score = point.score + otherPoints[0].score + otherPoints[1].score;\n return { points: [point].concat(otherPoints.slice(0, 2)), score: score };\n })\n .filter(function (q) { return !!q; }) // Filter out any rejected finder patterns from above\n .sort(function (a, b) { return a.score - b.score; });\n if (finderPatternGroups.length === 0) {\n return null;\n }\n var _a = reorderFinderPatterns(finderPatternGroups[0].points[0], finderPatternGroups[0].points[1], finderPatternGroups[0].points[2]), topRight = _a.topRight, topLeft = _a.topLeft, bottomLeft = _a.bottomLeft;\n // Now that we've found the three finder patterns we can determine the blockSize and the size of the QR code.\n // We'll use these to help find the alignment pattern but also later when we do the extraction.\n var dimension;\n var moduleSize;\n try {\n (_b = computeDimension(topLeft, topRight, bottomLeft, matrix), dimension = _b.dimension, moduleSize = _b.moduleSize);\n }\n catch (e) {\n return null;\n }\n // Now find the alignment pattern\n var bottomRightFinderPattern = {\n x: topRight.x - topLeft.x + bottomLeft.x,\n y: topRight.y - topLeft.y + bottomLeft.y,\n };\n var modulesBetweenFinderPatterns = ((distance(topLeft, bottomLeft) + distance(topLeft, topRight)) / 2 / moduleSize);\n var correctionToTopLeft = 1 - (3 / modulesBetweenFinderPatterns);\n var expectedAlignmentPattern = {\n x: topLeft.x + correctionToTopLeft * (bottomRightFinderPattern.x - topLeft.x),\n y: topLeft.y + correctionToTopLeft * (bottomRightFinderPattern.y - topLeft.y),\n };\n var alignmentPatterns = alignmentPatternQuads\n .map(function (q) {\n var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;\n var y = (q.top.y + q.bottom.y + 1) / 2;\n if (!matrix.get(Math.floor(x), Math.floor(y))) {\n return;\n }\n var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, (q.bottom.y - q.top.y + 1)];\n var size = sum(lengths) / lengths.length;\n var sizeScore = scorePattern({ x: Math.floor(x), y: Math.floor(y) }, [1, 1, 1], matrix);\n var score = sizeScore + distance({ x: x, y: y }, expectedAlignmentPattern);\n return { x: x, y: y, score: score };\n })\n .filter(function (v) { return !!v; })\n .sort(function (a, b) { return a.score - b.score; });\n // If there are less than 15 modules between finder patterns it's a version 1 QR code and as such has no alignmemnt pattern\n // so we can only use our best guess.\n var alignmentPattern = modulesBetweenFinderPatterns >= 15 && alignmentPatterns.length ? alignmentPatterns[0] : expectedAlignmentPattern;\n return {\n alignmentPattern: { x: alignmentPattern.x, y: alignmentPattern.y },\n bottomLeft: { x: bottomLeft.x, y: bottomLeft.y },\n dimension: dimension,\n topLeft: { x: topLeft.x, y: topLeft.y },\n topRight: { x: topRight.x, y: topRight.y },\n };\n var _b;\n}\nexports.locate = locate;\n\n\n/***/ })\n/******/ ])[\"default\"];\n});"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_translations__template_json.chunk.js b/cypress/fixtures/v3-client/locale_res_translations__template_json.chunk.js deleted file mode 100644 index 5fcbef98..00000000 --- a/cypress/fixtures/v3-client/locale_res_translations__template_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_translations__template_json"],{ - -/***/ "../locale/res/translations/_template.json": -/*!*************************************************!*\ - !*** ../locale/res/translations/_template.json ***! - \*************************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('[["OK",""],["o f f l i n e",""],["Could not find invite! Did you use the correct link?",""],["Get Premium",""],["Cancel",""],["It looks like the app cannot connect to the Padloc servers right now, probably due to a missing internet connection. You can still access your vaults and even create or edit Vault Items but your changes won\'t be synchronized until you\'re back online.",""],["You\'re Offline",""],["Do you want to enable biometric unlock for this device?",""],["Setup",""],["Biometric Unlock",""],["Biometric authentication failed! Canceling Setup.",""],["Setup Failed",""],["Biometric unlock failed! Canceling Setup. (Reason: {0})",""],["Please enter your master password!",""],["Enter Master Password",""],["Wrong password! Please try again!",""],["Biometric unlock activated successfully!",""],["Are you sure you want to delete this attachment?",""],["Delete",""],["Delete Attachment",""],["Download failed!",""],["Do you want to save this file to your disk? WARNING: Doing this will leave the file exposed and unprotected on your harddrive!",""],["Save",""],["Save To Disk",""],["Edit Name",""],["Attachment Name",""],["Please enter an attachment name!",""],["Unknown File Type",""],["downloading... {0}/{1}",""],["Unnamed",""],["uploading... {0}/{1}",""],["Failed to upload!",""],["Failed to download! Click to try again.",""],["Update Billing Info",""],["Select A Country",""],["To update your billing info and payment method, please log in through our website (found under \\"Settings\\") or contact us at ",""],["Payment Details",""],["Billing Address",""],["Billing Email",""],["Name",""],["Address",""],["Postal Code",""],["City",""],["Tax Info",""],["This is a business",""],["Tax ID",""],["Coupon Code",""],["Add Later",""],["Something went wrong. Please try again later!",""],["Add Payment Method",""],["per user / month",""],["USD, billed annually",""],["Try For Free",""],["Please enter at least one email address!",""],["You have entered too many email addresses! Please delete some before submitting!",""],["Some of the emails you entered appear to be invalid!",""],["Something went wrong! Please try again later!",""],["Invite New Members",""],["Please enter up to {0} email addresses of the persons you would like to invite, separated by spaces or commas!",""],["Enter Email Address",""],["Submit",""],["New Vault Item",""],["Item Name",""],["Template",""],["Vault",""],["Create & Edit",""],["You have reached the maximum number of items for this account. Upgrade to Premium to get unlimited items for your private vault!",""],["You have reached the maximum number of items for this account!",""],["Please enter an organization name!",""],["Free For {0} Days",""],["then",""],["per month",""],["{0} min",""],["{0} max",""],["Seats",""],["Add Billing Info",""],["Create Organization",""],["Organization Name",""],["Create",""],["Export Data",""],["Target Vault",""],["Format",""],["WARNING: Exporting to CSV format will save your data without encyryption of any kind which means it can be read by anyone. We strongly recommend exporting your data as a secure, encrypted file, instead!",""],["Export {0} Items",""],["Please choose a password to protect this backup with!",""],["Choose Password",""],["Please choose a password!",""],["Please repeat the password!",""],["Password not repeated correctly!",""],["Choose A Field Type",""],["What kind of field you would like to add?",""],["Enter Notes Here",""],["Enter Secret",""],["Enter Password",""],["Enter Value Here",""],["Enter Field Name",""],["Dash",""],["Underscore",""],["Slash",""],["Space",""],["Generate Password",""],["passphrase",""],["random string",""],["Word Separator",""],["Language",""],["words",""],["length",""],["Use",""],["Discard",""],["Are you sure you want to delete this group?",""],["Delete Group",""],["Type \'DELETE\' to confirm",""],["Enter Group Name",""],["Search...",""],["Import Data",""],["IMPORTANT: Before importing, please make sure that your CSV data is structured according to Padlocks specific requirements!",""],["Learn More",""],["Import {0} Items",""],["This file is protected by a password.",""],["Wrong Password",""],["The number of imported items exceeds your remaining quota. Upgrade to Premium to get unlimited items for your private vault!",""],["The number of imported items exceeds your remaining quota.",""],["Successfully imported {0} items.",""],["This invite has expired",""],["Accepted",""],["expires {0}",""],["Confirm Membership",""],["Organization Invite",""],["Please wait for an admin to complete the process. You will be notified as soon as you receive access.",""],["Enter Confirmation Code",""],["If you haven\'t received the confirmation code yet, please ask the organization owner to provide it to you!",""],["They will also need the following confirmation code, which you should communicate to them separately:",""],["Resend",""],["Please enter a confirmation code!",""],["You have successfully accepted the invite. You\'ll be notified once you\'ve been granted access.",""],["Wrong confirmation code. Please try again!",""],["expired",""],["accepted",""],["{0}",""],["Confirm",""],["Confirmation Code:",""],["Upgrade to Premium now and get 1GB of encrypted file storage!",""],["Enter Item Name",""],["Field",""],["Attachment",""],["Move",""],["by {0}",""],["Are you sure you want to delete this item?",""],["Items with attachments cannot be moved!",""],["The selected file is too large! Only files of up to 5 MB are supported.",""],["File uploaded successfully!",""],["Favorites",""],["Recently Used",""],["Attachments",""],["All Items",""],["My Vault",""],["Tags",""],["You don\'t have any tags yet.",""],["Your search did not match any items.",""],["This vault does not have any items yet.",""],["You don\'t have any attachments yet.",""],["You don\'t have any favorites yet.",""],["You don\'t have any recently used items!",""],["You don\'t have any items yet.",""],["Type To Search",""],["{0} items selected",""],["Some items in your selection are from Vaults you don\'t have write access to and cannot be deleted. Do you want to proceed deleting the other items?",""],["Yes",""],["No",""],["Are you sure you want to delete these items? This action can not be undone!",""],["Delete {0} Items",""],["Some items in your selection have attachments and cannot be moved. Do you want to proceed moving the other items?",""],["Some items in your selection are from Vaults you don\'t have write access to and cannot be moved. Do you want to proceed moving the other items?",""],["No Name",""],["copied",""],["No Fields",""],["This item has no fields.",""],["Email Address",""],["Master Password",""],["Login",""],["New to Padloc?",""],["Sign Up Now",""],["Please enter a valid email address!",""],["Please enter the confirmation code sent to your email address to proceed!",""],["One Last Step!",""],["Enter Verification Code",""],["Maximum number of tries exceeded! Please resubmit and try again!",""],["Wrong username or password. Please try again!",""],["Can\'t remember your master password?",""],["Recover Account",""],["Try Again",""],["An account with this email address does not exist!",""],["Sign Up",""],["Remove",""],["Suspend",""],["Remove Admin",""],["Make Admin",""],["Are you sure you want to remove this member from this organization?",""],["Remove Member",""],["Are you sure you want to make this member an admin? Admins can manage vaults, groups and permissions.",""],["Are you sure you want to remove this member as admin?",""],["Are you sure you want to suspend this member?",""],["Suspend Member",""],["Groups",""],["Vaults",""],["read",""],["write",""],["Owner",""],["Admin",""],["Suspended",""],["Items",""],["Orgs & Teams",""],["New Organization",""],["Settings",""],["{0} Items",""],["Move {0} To",""],["No target vaults available!",""],["Move Item",""],["Move Items",""],["Successfully created {0} invites!",""],["Unsuspend",""],["Are you sure you want to delete this organization? All associated vaults and the data within them will be lost! This action can not be undone.",""],["Delete Organization",""],["Rename Organization",""],["Company Name",""],["Please enter a name!",""],["Do you want to rotate this organizations cryptographic keys? All organization memberships will have to be reconfirmed but no data will be lost.",""],["The organizations cryptographic keys have been rotated successfully and membership confirmation requests for all members have been sent out.",""],["Members",""],["This organization currently does not have an active subscription and has been put in \\"frozen\\" state as a result. While in this state, you won\'t be able to make any changes to members, groups or vaults of this organization.",""],["Update Subscription",""],["New Group",""],["New Vault",""],["Subscription",""],["Billing Info",""],["Security",""],["Rotate Cryptographic Keys",""],["General",""],["Change Organization Name",""],["Organizations allow you to securely share passwords, documents and other data within your family, team or any other kind of group!",""],["Start Trial",""],["Scan QR Code",""],["Failed to scan QR code. Error: ",""],["Please enter your email address and new master password.",""],["New Master Password",""],["WARNING: Weak Password!",""],["Repeat Master Password",""],["IMPORTANT, READ CAREFULLY: Padloc is designed in a way that makes it impossible for us to access the data encrypted in any of your vaults even if we wanted to. While this is essential to ensuring the security of your data, it also has the following implications:",""],["Any data stored in your private vault can not be recovered and will be permantently lost.",""],["All your organization memberships will be suspended temporarily until confirmed by the organization owner.",""],["All members of organizations you own will be suspended temporarily until confirmed by you.",""],["Please enter a master password!",""],["You didn\'t repeat your master password correctly. Try again!",""],["The password you entered is weak which makes it easier for attackers to break the encryption used to protect your data. Try to use a longer password or include a variation of uppercase, lowercase and special characters as well as numbers!",""],["Choose Different Password",""],["Use Anyway",""],["WARNING: Weak Password",""],["To complete the account recovery process, please enter the confirmation code sent to your email address!",""],["Account recovery successful!",""],["Report Errors",""],["{0} Errors Detected",""],["Padloc has registered {0} errors during your use of the app. These errors may not have any impact on functionality and can often be ignored, but reporting them may help us diagnose problems, identify possible failure modes and generally improve the stability of the app.",""],["Profile",""],["Log Out",""],["Change Master Password",""],["Auto Lock",""],["Lock Automatically",""],[" min",""],["After",""],["Enable Biometric Unlock",""],["Import / Export",""],["Import...",""],["Export...",""],["Support",""],["Website",""],["Contact Support",""],["Danger Zone",""],["Delete Account",""],["Edit Profile",""],["Do you really want to log out?",""],["Please enter your current password!",""],["Enter Current Password",""],["Now choose a new master password!",""],["Enter New Password",""],["Please enter a password!",""],["Please confirm your new password!",""],["Repeat New Password",""],["Master password changed successfully.",""],["Please enter your master password to proceed.",""],["Are you sure you want to delete this account? All associated vaults and the data within them will be lost and any active subscriptions will be canceled immediately. This action can not be undone!",""],["Are you sure you want to disable biometric unlock?",""],["Welcome to Padloc! Let\'s get you started by creating an account for you.",""],["Your email address serves as your username and allows us to get in touch with you. Don\'t worry, we would never send you any spam!",""],["Your Name",""],["What should we call you?",""],["Continue",""],["Already have an account?",""],["Sign In",""],["You\'ve Got Mail!",""],["To verify your email address, please enter the confirmation code we sent to {0}.",""],["Confirmation Code",""],["Say hello to your",""],["It\'s the last password you\'ll ever have to remember! Please memorize it and never reveal it to anyone (not even us)! We recommend writing it down on a piece of paper and storing it somewhere safe, at least until you have it safely memorized.",""],["[Tap To Reveal]",""],["[Hover To Reveal]",""],["This random passphrase was generated just for you and is designed to be both secure and easy to remember. Don\'t like it?",""],["Try Another One",""],["Choose Your Own",""],["An account with this email address already exists!",""],["Change Email",""],["We recommend using a randomly generated password that is both strong and easy to remember.",""],["Keep This One",""],["Generate Another",""],["Choose My Own",""],["Want A Different Master Password?",""],["Choose Own Master Password",""],["Resume Subscription",""],["Cancel Subscription",""],["Update Plan",""],["Are you sure you want to downgrade to the Free Plan?",""],["Downgrade",""],["No Plan Selected",""],["Unlimited",""],["{0} / Year",""],["Canceled ({0} days left)",""],["Authentication Required",""],["Inactive",""],["Trialing ({0} days left)",""],["Choose Plan",""],["Complete Payment",""],["Downgrade To Free Plan",""],["Add Tag",""],["Choose A Template",""],["What kind of item you would like to add?",""],["Invalid Code",""],["Logged In As",""],["Unlock",""],["Wrong password! Please try again.",""],["Logout / Switch Account",""],["Forgot Password",""],["Are you sure you want to log out of this account?",""],["Biometric unlock expired. Complete setup to reeneable.",""],["Biometric unlock failed! Reason: {0}",""],["Failed To Unlock",""],["Update",""],["Storage limit exceeded!",""],["Upload failed! Please try again!",""],["Upload Attachment",""],["Unkown File Type",""],["Retry Upload",""],["Upload",""],["Are you sure you want to delete this vault? All the data stored in it will be lost! This action can not be undone.",""],["Delete Vault",""],["Enter Vault Name",""],["Username",""],["Password",""],["URL",""],["Notes",""],["Your session has expired. Please log in again!",""],["A new update is ready to install! Do you want to install it now?",""],["Install & Reload",""],["Later",""],["Date",""],["Month",""],["Credit Card Number",""],["Phone Number",""],["PIN",""],["Two-Factor Token",""],["Note",""],["Other",""],["Credit Card",""],["Card Number",""],["Card Owner",""],["Valid Until",""],["CVC",""],["Bank Account",""],["Account Owner",""],["IBAN",""],["BIC",""],["Card PIN",""],["WIFI Password",""],["Passport",""],["Full Name",""],["Passport Number",""],["Country",""],["Birthdate",""],["Birthplace",""],["Issued On",""],["Expires",""],["Document",""],["Custom",""],["{0} on {1}",""],["{0} Device",""]]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_translations_de_json.chunk.js b/cypress/fixtures/v3-client/locale_res_translations_de_json.chunk.js deleted file mode 100644 index 243280bc..00000000 --- a/cypress/fixtures/v3-client/locale_res_translations_de_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_translations_de_json"],{ - -/***/ "../locale/res/translations/de.json": -/*!******************************************!*\ - !*** ../locale/res/translations/de.json ***! - \******************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('[["OK","OK"],["o f f l i n e","o f f l i n e"],["Could not find invite! Did you use the correct link?","Einladung nicht gefunden! Bitte stelle sicher, dass du die richtige URL verwendet hast!"],["Get Premium","Premium Kaufen"],["Cancel","Abbrechen"],["It looks like the app cannot connect to the Padloc servers right now, probably due to a missing internet connection. You can still access your vaults and even create or edit Vault Items but your changes won\'t be synchronized until you\'re back online.","Die App kann sich gerade nicht mit den Padloc Servern verbinden, vermutlich aufgrund einer fehlenden Internetverbindung. Du kannst weiterhin auf deine Tresore zugreifen und Einträge ändern oder erstellen aber deine Änderungen werden erst synchronisiert sobald du wieder online bist."],["You\'re Offline","Du Bist Offline"],["Do you want to enable biometric unlock for this device?","Willst du biometrisches Entsperren für dieses Gerät aktivieren?"],["Setup","Einrichten"],["Biometric Unlock","Biometrisches Entsperren"],["Biometric authentication failed! Canceling Setup.","Biometrische Authentifizierung fehlgeschlagen! Vorgang wird abgebrochen."],["Setup Failed","Einrichtung Fehlgeschlagen"],["Biometric unlock failed! Canceling Setup. (Reason: {0})","Biometrisches Entsperren fehlgeschlagen. Vorgang wird abgebrochen. (Grund: {0})"],["Please enter your master password!","Bitte geben Sie Ihr Master Passwort ein!"],["Enter Master Password","Master Passwort Eingeben"],["Wrong password! Please try again!","Falsches Passwort! Bitte versuchen Sie es erneut!"],["Biometric unlock activated successfully!","Biometrisches Entsperren wurde erfolgreich aktiviert!"],["Are you sure you want to delete this attachment?","Sind Sie sicher dass Sie diesen Anhang entfernen möchten?"],["Delete","Löschen"],["Delete Attachment","Anhang Löschen"],["Download failed!","Download fehlgeschlagen!"],["Do you want to save this file to your disk? WARNING: Doing this will leave the file exposed and unprotected on your harddrive!","Wist du diese Datei wirklich lokal speichern? WARNUNG: Die Datei liegt dann unverschlüsselt auf deiner Festplatte und kann potentiell von anderen geöffnet werden!"],["Save","Speichern"],["Save To Disk","Auf Festplatte Speichern"],["Edit Name","Namen Bearbeiten"],["Attachment Name","Name des Anhangs"],["Please enter an attachment name!","Bitten gib einen Name für diesen Anhang ein!"],["Unknown File Type","Unbekannter Dateityp"],["downloading... {0}/{1}","wird heruntergeladen... {0}/{1}"],["Unnamed","Unbenannt"],["uploading... {0}/{1}","wird hochgeladen {0}/{1}"],["Failed to upload!","Upload Fehlgeschlagen!"],["Failed to download! Click to try again.","Download Fehlgeschlagen! Bitte versuch es noch einmal."],["Update Billing Info","Rechnungsdaten Updaten"],["Select A Country","Wähle Ein Land"],["To update your billing info and payment method, please log in through our website (found under \\"Settings\\") or contact us at ",""],["Payment Details","Zahlungsdetails"],["Billing Address","Rechnungsadresse"],["Billing Email","Rechnungsemail"],["Name","Name"],["Address","Adresse"],["Postal Code","Postleitzahl"],["City","Stadt"],["Tax Info","Steuer"],["This is a business","Dies ist ein Unternehmen"],["Tax ID","Steuernummer"],["Coupon Code","Gutscheincode"],["Add Later","Später Hinzufügen"],["Something went wrong. Please try again later!","Es ist ein Fehler aufgetreten. Bitte versuche es später noch einmal!"],["Add Payment Method","Zahlungsmittel Hinzufügen"],["per user / month","pro Nutzer / Monat"],["USD, billed annually","USD, jährlich abgerechnet"],["Try For Free","Kostenlos Testen"],["Please enter at least one email address!","Bitten gib deine Emailadresse ein!"],["You have entered too many email addresses! Please delete some before submitting!","Du hast zu viele Emailadressen eingegeben! Bitte lösche einige before vor dem Abschicken!"],["Some of the emails you entered appear to be invalid!","Einige der eingegebenen Emailadressen scheinen ungültig zu sein!"],["Something went wrong! Please try again later!","Es ist ein Fehler aufgetreten. Bitte versuch es später noch einmal!"],["Invite New Members","Neue Nutzer Einladen"],["Please enter up to {0} email addresses of the persons you would like to invite, separated by spaces or commas!","Bitte gib bis zu {0} Emailadressen ein für die Personen die du einladen möchtest, getrennt durch Leerzeichen oder Kommas."],["Enter Email Address","Emailadresse Eingeben"],["Submit","Abschicken"],["New Vault Item","Neuer Tresoreintrag"],["Item Name","Name"],["Template","Vorlage"],["Vault","Tresor"],["Create & Edit","Erstellen & Bearbeiten"],["You have reached the maximum number of items for this account. Upgrade to Premium to get unlimited items for your private vault!","Du hast die maximale Anzahl and Einträgen für diesen Account erreicht. Bitte upgrade auf Premium um unbegrenzte Einträge für deinen persönlichen Tresor freizuschalten!"],["You have reached the maximum number of items for this account!","Du hast die maximale Anzahl and Einträgen für diesen Account erreicht!"],["Please enter an organization name!","Bitten geben einen Organisationsnamen ein!"],["Free For {0} Days","{0} Tage Kostenlos"],["then","dann"],["per month","pro Monat"],["{0} min","{0} min"],["{0} max","{0} max"],["Seats","Nutzer"],["Add Billing Info","Zahlungsdaten Hinzufügen"],["Create Organization","Organisation Erstellen"],["Organization Name","Organisationsname"],["Create","Erstellen"],["Export Data","Daten Exportieren"],["Target Vault","Zieltresor"],["Format","Format"],["WARNING: Exporting to CSV format will save your data without encyryption of any kind which means it can be read by anyone. We strongly recommend exporting your data as a secure, encrypted file, instead!","WARNUNG: Beim Export im CSV-Format werden deine Daten unverschlüsselt gespeichert und können potentiell von jedem gelesen werden. Wir empfehlen deshalb Ihre Daten nur als verschlüsselte Datei zu exportieren!"],["Export {0} Items","{0} Einträge Exportieren"],["Please choose a password to protect this backup with!","Bitten wähle ein Passwort zum Sichern des Backups!"],["Choose Password","Password Wählen"],["Please choose a password!","Bitte wähle ein Passwort!"],["Please repeat the password!","Bitte wiederholen Sie das Passwort!"],["Password not repeated correctly!","Passwort nicht richtig wiederholt!"],["Choose A Field Type","Wählen Sie einen Feldart"],["What kind of field you would like to add?","Welche Art von Feld möchten Sie hinzufügen?"],["Enter Notes Here","Hier kannst du deine Notizen eingeben."],["Enter Secret","Code Eingeben"],["Enter Password","Password Eingeben"],["Enter Value Here","Wert Eingeben"],["Enter Field Name","Feldname"],["Dash","Bindestrich"],["Underscore","Unterstrich"],["Slash","Querstrich"],["Space","Leerzeichen"],["Generate Password","Passwort Generieren"],["passphrase","Zufällige Wörter"],["random string","Zufällige Zeichen"],["Word Separator","Worttrenner"],["Language","Sprache"],["words","Wörter"],["length","Länge"],["Use","Anwenden"],["Discard","Verwerfen"],["Are you sure you want to delete this group?","Bist du sicher dass du diese Gruppe löschen möchtest?"],["Delete Group","Gruppe Löschen"],["Type \'DELETE\' to confirm","Geben sie das Wort \'DELETE\' ein."],["Enter Group Name","Gruppennamen Eingeben"],["Search...","Suche..."],["Import Data","Daten Importieren"],["IMPORTANT: Before importing, please make sure that your CSV data is structured according to Padlocks specific requirements!","WICHTIG: Bevor du die CSV-Datei importierst, stelle bitte sicher dass sie den Anforderungen entspricht!"],["Learn More","Mehr Erfahren"],["Import {0} Items","{0} Einträge Importieren"],["This file is protected by a password.","Diese Datei ist Passwortgeschützt."],["Wrong Password","Falsches Passwort"],["The number of imported items exceeds your remaining quota. Upgrade to Premium to get unlimited items for your private vault!","Du hast die maximale Anzahl an Einträgen überschritten. Bitte upgrade auf Premium um unbegrenzte Einträge zu erhalten!"],["The number of imported items exceeds your remaining quota.","Die Anzahl der importierten Einträge überschreitet die maximale Anzahl an Einträgen."],["Successfully imported {0} items.","{0} Einträge wurden erfolgreich importiert."],["This invite has expired","Diese Einladung ist abgelaufen."],["Accepted","Angenommen"],["expires {0}","läuft ab {0}"],["Confirm Membership","Mitgliedschaft Bestätigen"],["Organization Invite","Einladung"],["Please wait for an admin to complete the process. You will be notified as soon as you receive access.","Bitte warte darauf dass ein Administrator deine Mitgliedschaft bestätigt. Die wirst benachrichtigt sobald du Zugriff erhältst."],["Enter Confirmation Code","Bestätigungscode Eingeben"],["If you haven\'t received the confirmation code yet, please ask the organization owner to provide it to you!","Falls du den Bestätigungscode noch nicht erhalten hast, erfrage ihn von der Besitzer der Organisation!"],["They will also need the following confirmation code, which you should communicate to them separately:","Der folgende Bestätigungscode ist für die Annahme der Einladung erforderlich und sollte der Person separat mitgeteilt werden:"],["Resend","Erneut Versenden"],["Please enter a confirmation code!","Bitten gib den Bestätigungscode ein!"],["You have successfully accepted the invite. You\'ll be notified once you\'ve been granted access.","Du hast die Einladung erfolgreich angenommen und wirst benachrichtigt, sobald deine Mitgliedschaft bestätigt ist."],["Wrong confirmation code. Please try again!","Falscher Bestätigungscode. Bitte versuche es noch einmal!"],["expired","abgelaufen"],["accepted","angenommen"],["{0}","{0}"],["Confirm","Bestätigen"],["Confirmation Code:","Bestätigungscode:"],["Upgrade to Premium now and get 1GB of encrypted file storage!","Jetzt auf Premium upgraden und 1GB verschlüsselten Datenspeicher freischalten!"],["Enter Item Name","Name des Eintrags"],["Field","Feld"],["Attachment","Anhang"],["Move","Verschieben"],["by {0}","von {0}"],["Are you sure you want to delete this item?","Bist du sicher dass du diesen Eintrag löschen möchtest?"],["Items with attachments cannot be moved!","Einträge mit Anhängen können nicht verschoben werden!"],["The selected file is too large! Only files of up to 5 MB are supported.","Diese Datei ist zu groß! Das Maximum ist 5 MB."],["File uploaded successfully!","Datei erfolgreich hochgeladen!"],["Favorites","Favoriten"],["Recently Used","Kürzlich Benutzt"],["Attachments","Anhänge"],["All Items","Alle Einträge"],["My Vault","Mein Tresor"],["Tags","Tags"],["You don\'t have any tags yet.","Du hast noch keine Tags."],["Your search did not match any items.","Deine Suche hat keine Treffer ergeben."],["This vault does not have any items yet.","Dieser Tresor enthält noch keine Einträge."],["You don\'t have any attachments yet.","Du hast noch keine Anhänge."],["You don\'t have any favorites yet.","Du hast noch keine Favoriten."],["You don\'t have any recently used items!","Du hast noch keine kürzlich benutzten Einträge!"],["You don\'t have any items yet.","Du hast noch keine Einträge."],["Type To Search","Suchen..."],["{0} items selected","{0} Einträge selektiert"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be deleted. Do you want to proceed deleting the other items?","Einige der selektierten Einträge sind aus Tresoren auf die du keinen Schreibzugriff hast und können nicht gelöscht werden. Möchtest du die restlichen Einträge trotzdem löschen?"],["Yes","Ja"],["No","Nein"],["Are you sure you want to delete these items? This action can not be undone!","Bist du sicher dass du die Einträge löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden!"],["Delete {0} Items","{0} Einträge Löschen"],["Some items in your selection have attachments and cannot be moved. Do you want to proceed moving the other items?","Einige der selektierten Einträge haben Anhänge und können nicht verschoben werden. Möchtest du die restlichen Einträge trotzdem verschieben? "],["Some items in your selection are from Vaults you don\'t have write access to and cannot be moved. Do you want to proceed moving the other items?","Einige der selektierten Einträge sind aus Tresoren auf die du keinen Schreibzugriff hast und können nicht verschoben werden. Möchtest du die restlichen Einträge trotzdem verschieben?"],["No Name","Kein Name"],["copied","kopiert"],["No Fields","Keine Felder"],["This item has no fields.","Dieser Eintrag hat keine Felder"],["Email Address","Emailadresse"],["Master Password","Masterpasswort"],["Login","Einloggen"],["New to Padloc?","Neu bei Padloc?"],["Sign Up Now","Jetzt Registrieren"],["Please enter a valid email address!","Bitte gib eine gültige Emailadresse ein!"],["Please enter the confirmation code sent to your email address to proceed!","Bitte gib den Bestätigungscode ein, der an deine Emailadresse versandt wurde!"],["One Last Step!","Ein Letzter Schritt!"],["Enter Verification Code","Bestätigungscode Eingeben"],["Maximum number of tries exceeded! Please resubmit and try again!","Maximale Anzahl an Versuchen überschritten! Bitte versuche es später erneut!"],["Wrong username or password. Please try again!","Falscher Benutzername oder Password. Bitte versuche es erneut!"],["Can\'t remember your master password?","Du kannst dich nicht an dein Masterpasswort erinnern?"],["Recover Account","Account Wiederherstellen"],["Try Again","Erneut Versuchen"],["An account with this email address does not exist!","Es existiert kein Account mit dieser Emailadresse!"],["Sign Up","Anmelden"],["Remove","Entfernen"],["Suspend","Sperren"],["Remove Admin","Als Admin Entfernen"],["Make Admin","Zum Admin Machen"],["Are you sure you want to remove this member from this organization?","Bist du sicher dass du diesen Nutzer von der Organisation entfernen möchtest?"],["Remove Member","Nutzer Entfernen"],["Are you sure you want to make this member an admin? Admins can manage vaults, groups and permissions.","Bist du sicher dass du diesen Nutzer zum Admin machen möchtest? Admins können Tresore, Gruppen und Zugriffsberechtigungen verwalten."],["Are you sure you want to remove this member as admin?","Bist du sicher dass du diesen Nutzer als Admin entfernen möchtest?"],["Are you sure you want to suspend this member?","Bist du sicher dass du diesen Nutzer vorübergehend sperren möchtest?"],["Suspend Member","Nutzer Vorübergehend Sperren"],["Groups","Gruppen"],["Vaults","Tresore"],["read","lesen"],["write","schreiben"],["Owner","Besitzer"],["Admin","Admin"],["Suspended","Gesperrt"],["Items","Einträge"],["Orgs & Teams","Orgs & Teams"],["New Organization","Neue Organisation"],["Settings","Einstellungen"],["{0} Items","{0} Einträge"],["Move {0} To","{0} Verschieben Nach"],["No target vaults available!","Keine anderen Tresore verfügbar!"],["Move Item","Eintrag Verschieben"],["Move Items","Einträge Verschieben"],["Successfully created {0} invites!","Es wurden {0} Einladungen erfolgreich versendet!"],["Unsuspend","Entsperren"],["Are you sure you want to delete this organization? All associated vaults and the data within them will be lost! This action can not be undone.","Bist du sicher dass du diese Organisation löschen möchtest? Alle verknüpften Tresore und die darin enthaltenen Daten gehen dabei verloren und können nicht wiederhergestellt werden!"],["Delete Organization","Organisation Löschen"],["Rename Organization","Organisation Umbenennen"],["Company Name","Organisationsname"],["Please enter a name!","Bitte gib einen Namen ein!"],["Do you want to rotate this organizations cryptographic keys? All organization memberships will have to be reconfirmed but no data will be lost.","Willst du die kryptographischen Schlüssel für diese Organisation durchwechseln? Dies erfordert zwar die erneute Bestätigung aller Mitgliedschaften führt aber zu keinen Datenverlust."],["The organizations cryptographic keys have been rotated successfully and membership confirmation requests for all members have been sent out.","Die kryptographischen Schlüssel der Organisation wurden erfolgreich durchgewechselt und Anfragen zur Bestätigung der Mitgliedschaft an alle Mitglieder versandt."],["Members","Mitglieder"],["This organization currently does not have an active subscription and has been put in \\"frozen\\" state as a result. While in this state, you won\'t be able to make any changes to members, groups or vaults of this organization.","Diese Organisation hat momentan kein aktives Abonnement und wurde deshalb eingefroren. Du kannst also momentan keine Änderungen an Mitgliedschaften, Gruppen oder Tresoren dieser Organisation machen."],["Update Subscription","Abonnement Anpassen"],["New Group","Neue Gruppe"],["New Vault","Neuer Tresor"],["Subscription","Abonnement"],["Billing Info","Zahlungsdetails"],["Security","Sicherheit"],["Rotate Cryptographic Keys","Kryptgraphische Schlüssel Durchwechseln"],["General","Allgemein"],["Change Organization Name","Organisationsnamen Ändern"],["Organizations allow you to securely share passwords, documents and other data within your family, team or any other kind of group!","Organisationen ermöglichen das sichere teilen von Passwörtern, Dokumenten und anderen Daten mit deiner Familie, Team oder anderen Gruppen!"],["Start Trial","Testphase Starten"],["Scan QR Code","QR-Code Scannen"],["Failed to scan QR code. Error: ","QR-Code wurde nicht erkannt. Fehler: "],["Please enter your email address and new master password.","Bitte gib deine Emailadresse und ein neues Masterpasswort ein."],["New Master Password","Neues Master Passwort"],["WARNING: Weak Password!","WARNUNG: Schwaches Passwort!"],["Repeat Master Password","Passwort Wiederholen"],["IMPORTANT, READ CAREFULLY: Padloc is designed in a way that makes it impossible for us to access the data encrypted in any of your vaults even if we wanted to. While this is essential to ensuring the security of your data, it also has the following implications:","WICHTIG, BITTE SORGFÄLTIG LESEN: Um die Sicherheit deiner Daten zu gewährleisten wurde Padloc so entworfen dass es für uns unmöglich ist auf die verschlüsselten Daten in deinen Tresoren zuzugreifen. Dies hat folgende Auswirkungen:"],["Any data stored in your private vault can not be recovered and will be permantently lost.","Alle Daten in deinem persönlichen Tresor können nicht wiederhergestellt werden und gehen verloren."],["All your organization memberships will be suspended temporarily until confirmed by the organization owner.","Alle Organisationsmitgliedschaften werden vorübergehend gesperrt und müssen vom Organsiationsbesitzer erneut bestätigt werden."],["All members of organizations you own will be suspended temporarily until confirmed by you.","Alle Mitglieder von Organisation die du erstellt hast werden vorübergehen gesperrt und müssen von dir erneut bestätigt werden."],["Please enter a master password!","Bitte gib ein Masterpasswort ein!"],["You didn\'t repeat your master password correctly. Try again!","Du hast dein Masterpasswort nicht richtig wiederholt. Bitte versuche es erneut!"],["The password you entered is weak which makes it easier for attackers to break the encryption used to protect your data. Try to use a longer password or include a variation of uppercase, lowercase and special characters as well as numbers!","Das Passwort, dass du gewählt hast ist schwach und stellt womöglich einen unzureichenden Schutz für deine Daten dar. Versuche es mit einem längeren Passwort und verwende eine Mischung aus Groß- und Kleinbuchstaben, Sonderzeichen und Zahlen!"],["Choose Different Password","Anderes Passwort Wählen"],["Use Anyway","Trotzdem Verwenden"],["WARNING: Weak Password","WARNUNG: Schwaches Passwort"],["To complete the account recovery process, please enter the confirmation code sent to your email address!","Um die Wiederherstellung deines Accounts abzuschließen gib bitte den Bestätigungscode ein der an deine Emailadresse verschickt wurde!"],["Account recovery successful!","Account erfolgreich wiederhergestellt!"],["Report Errors","Fehler Melden"],["{0} Errors Detected","{0} Fehler Erkannt"],["Padloc has registered {0} errors during your use of the app. These errors may not have any impact on functionality and can often be ignored, but reporting them may help us diagnose problems, identify possible failure modes and generally improve the stability of the app.","Padloc hat {0} Fehler beim Ausführen der App erkannt. Diese Fehler haben womöglich keinen Einfluss auf die Funktionalität der App und können oft ignoriert werden. Das Melden der Fehler kann uns jedoch dabei helfen, mögliche Probleme zu identifizieren und die Stabilität der App zu verbessern."],["Profile","Profil"],["Log Out","Abmelden"],["Change Master Password","Masterpasswort Ändern"],["Auto Lock","Automatische Sperrung"],["Lock Automatically","Automatisch Sperren"],[" min"," min"],["After","Nach"],["Enable Biometric Unlock","Biometrisches Entsperren Aktivieren"],["Import / Export","Import / Export"],["Import...","Importieren..."],["Export...","Exportieren..."],["Support","Hilfe"],["Website","Webseite"],["Contact Support","Support Kontaktieren"],["Danger Zone","Gefahrenzone"],["Delete Account","Account Löschen"],["Edit Profile","Profil Bearbeiten"],["Do you really want to log out?","Bist du sicher dass du dich abmelden möchtest?"],["Please enter your current password!","Bitte gib dein aktuelles Passwort ein!"],["Enter Current Password","Aktuelles Passwort Eingeben"],["Now choose a new master password!","Wähle nun ein neues Masterpasswort!"],["Enter New Password","Neues Passwort Eingeben"],["Please enter a password!","Bitte gibt ein Passwort ein!"],["Please confirm your new password!","Bitte bestätige dein neues Passwort!"],["Repeat New Password","Neues Passwort Wiederholen"],["Master password changed successfully.","Masterpasswort erfolgreich geändert."],["Please enter your master password to proceed.","Bitte gib dein Masterpasswort ein um fortzufahren."],["Are you sure you want to delete this account? All associated vaults and the data within them will be lost and any active subscriptions will be canceled immediately. This action can not be undone!","Bist du sicher, dass du diesen Account löschen möchtest? Alle verknüpften Tresore und die darin enthaltenen Daten gehen dabei verloren und dein aktuelles Abonnement wird unmittelbar gekündigt. Diese Aktion kann nicht rückgängig gemacht werden!"],["Are you sure you want to disable biometric unlock?","Bist du sicher dass du biometrisches Entsperren deaktivieren möchtest?"],["Welcome to Padloc! Let\'s get you started by creating an account for you.","Willkommen bei Padloc! Bevor du loslegen kannst müssen wir zunächst einen Account für dich erstellen."],["Your email address serves as your username and allows us to get in touch with you. Don\'t worry, we would never send you any spam!","Deine Emailadresse dient als Benutzername und als Mittel der Kontaktaufnahme. Keine Sorge, wir werden niemals Spam and dich versenden!"],["Your Name","Dein Name"],["What should we call you?","Wie sollen wir dich nennen?"],["Continue","Weiter"],["Already have an account?","Du hast bereits einen Account?"],["Sign In","Einloggen"],["You\'ve Got Mail!","Sie haben Post!"],["To verify your email address, please enter the confirmation code we sent to {0}.","Um Ihre Emailadresse zu verifizieren, geben Sie bitte den Bestätigungscode ein, den wir an {0} gesendet haben."],["Confirmation Code","Bestätigungscode"],["Say hello to your","Sag Hallo zu deinem"],["It\'s the last password you\'ll ever have to remember! Please memorize it and never reveal it to anyone (not even us)! We recommend writing it down on a piece of paper and storing it somewhere safe, at least until you have it safely memorized.","Das letzte Passwort dass du dir je merken musst! Merke es dir gut und verrate es niemandem (auch nicht uns)! Wir empfehlen es auf ein Blatt Papier zu schreiben und an einem sicheren Ort zu verfahren, zumindest so lange bis du es sicher im Gedächtnis hast!"],["[Tap To Reveal]","[Zum Anzeigen Antippen]"],["[Hover To Reveal]","[Zum Anzeigen Maus Hier Bewegen]"],["This random passphrase was generated just for you and is designed to be both secure and easy to remember. Don\'t like it?","Diese zufällige Wortfolge wurde für speziell für dich generiert und ist so gewählt dass sie sowohl sicher als auch leicht zu merken ist. Gefällt dir nicht?"],["Try Another One","Neu Generieren"],["Choose Your Own","Eigenes Wählen"],["An account with this email address already exists!","Ein Account mit dieser Emailadresse existiert bereits!"],["Change Email","Emailadresse Ändern"],["We recommend using a randomly generated password that is both strong and easy to remember.","Wir empfehlen ein zufällig generiertes Passwort zu wählen das sowohl sicher als auch leicht zu merken ist."],["Keep This One","Passwort Beibehalten"],["Generate Another","Anderes Generieren"],["Choose My Own","Eigenes Passwort Wählen"],["Want A Different Master Password?","Du willst ein anderes Masterpasswort?"],["Choose Own Master Password","Eigenes Masterpasswort Wählen"],["Resume Subscription","Abonnement Wiederaufnehmen"],["Cancel Subscription","Abonnement Kündigen"],["Update Plan","Packet Ändern"],["Are you sure you want to downgrade to the Free Plan?","Bist du sicher dass du auf das Kostenlos Packet downgraden möchtest?"],["Downgrade","Downgraden"],["No Plan Selected","Kein Packet Gewählt"],["Unlimited","Unbegrenzt"],["{0} / Year","{0} / Jahr"],["Canceled ({0} days left)","Gekündigt ({0} Tage übrig)"],["Authentication Required","Authentifizierung Benötigt"],["Inactive","Pausiert"],["Trialing ({0} days left)","Testphase ({0} Tage übrig)"],["Choose Plan","Packet Wählen"],["Complete Payment","Zahlung Abschließen"],["Downgrade To Free Plan","Packet Downgraden"],["Add Tag","Tag Hinzuf."],["Choose A Template","Wähle Eine Vorlage"],["What kind of item you would like to add?","Welche Art von Eintrag möchtest du erstellen?"],["Invalid Code","Ungültiger Code"],["Logged In As","Eingeloggt Als"],["Unlock","Entsperren"],["Wrong password! Please try again.","Falsches Passwort! Bitte versuche es erneut."],["Logout / Switch Account","Abmelden / Account Wechseln"],["Forgot Password","Passwort Vergessen"],["Are you sure you want to log out of this account?","Bist du sicher dass du dich von diesem Account abmelden möchtest?"],["Biometric unlock expired. Complete setup to reeneable.","Biometrisches Entsperren Abgelaufen. Bitte richte es erneut ein."],["Biometric unlock failed! Reason: {0}","Biometrisches Entsperren fehlgeschlagen! Grund: {0}"],["Failed To Unlock","Entsperren Fehlgeschlagen"],["Update","Updaten"],["Storage limit exceeded!","Speicherlimit überschritten!"],["Upload failed! Please try again!","Upload fehlgeschlagen! Bitte versuche es erneut!"],["Upload Attachment","Anhang Hochladen"],["Unkown File Type","Unbekannter Dateityp"],["Retry Upload","Erneut Versuchen"],["Upload","Upload"],["Are you sure you want to delete this vault? All the data stored in it will be lost! This action can not be undone.","Bist du sicher dass du diesen Tresor löschen möchtest? Alle darin gespeicherten Daten gehen dabei verloren! Diese Aktion kann nicht rückgängig gemacht werden!"],["Delete Vault","Tresor Löschen"],["Enter Vault Name","Tresornamen Eingeben"],["Username","Benutzername"],["Password","Passwort"],["URL","URL"],["Notes","Notizen"],["Your session has expired. Please log in again!","Deine Sitzung ist abgelaufen. Bitte melde dich erneut an!"],["A new update is ready to install! Do you want to install it now?","Eine neue Version ist verfügbar! Willst du diese jetzt installieren?"],["Install & Reload","Installieren"],["Later","Später"],["Date","Datum"],["Month","Monat"],["Credit Card Number","Kreditkartennummer"],["Phone Number","Telefonnummer"],["PIN","PIN"],["2FA Token","2FA-Code"],["Note","Notiz"],["Other","Sonstiges"],["Credit Card","Kreditkarte"],["Card Number","Kartennummer"],["Card Owner","Karteninhaber"],["Valid Until","Gültig Bis"],["CVC","Sicherheitscode"],["Bank Account","Bankkonto"],["Account Owner","Kontoinhaber"],["IBAN","IBAN"],["BIC","BIC"],["Card PIN","Karten-PIN"],["WIFI Password","WLAN-Passwort"],["Passport","Reisepass"],["Full Name","Vor- und Zuname"],["Passport Number","Reisepassnummer"],["Country","Land"],["Birthdate","Geburtstag"],["Birthplace","Geburtsort"],["Issued On","Ausstellungsdatum"],["Expires","Verfallsdatum"],["Document","Dokument"],["Custom","Benutzerdefiniert"],["{0} on {1}","{0} am {1}"],["{0} Device","{0} Gerät"]]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_translations_es_json.chunk.js b/cypress/fixtures/v3-client/locale_res_translations_es_json.chunk.js deleted file mode 100644 index ea37e9b3..00000000 --- a/cypress/fixtures/v3-client/locale_res_translations_es_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_translations_es_json"],{ - -/***/ "../locale/res/translations/es.json": -/*!******************************************!*\ - !*** ../locale/res/translations/es.json ***! - \******************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('[["OK","OK"],["o f f l i n e","o f f l i n e"],["Could not find invite! Did you use the correct link?","¡No se econtró la invitación! ¿Usaste el link correcto?"],["Get Premium","Obtén Premium"],["Cancel","Cancelar"],["It looks like the app cannot connect to the Padloc servers right now, probably due to a missing internet connection. You can still access your vaults and even create or edit Vault Items but your changes won\'t be synchronized until you\'re back online.","Parece que la aplicaión no puede conectar con los servidores de Padloc en este momento, probablemente debido a que no hay conexión a internet. Aún puedes acceder a tus alamacenes e incluso crear o editar sus elementos pero tus cambios no serán sincronizados hasta que vuelvas a tener conexión."],["You\'re Offline","Estás Offline"],["Do you want to enable biometric unlock for this device?","¿Quieres habilitar el desbloqueo biométrico para este dispositivo?"],["Setup","Configurar"],["Biometric Unlock","Desbloqueo Biométrico"],["Biometric authentication failed! Canceling Setup.","¡Autenticación Biométrica fallida! Cancelando Configuración."],["Setup Failed","Configuración Fallida"],["Biometric unlock failed! Canceling Setup. (Reason: {0})","¡Desbloqueo Biométrico fallido! Cancelando Configuración. (Motivo: {0})"],["Please enter your master password!","¡Por favor, introduce tu contraseña maestra!"],["Enter Master Password","Introduce tu Contraseña Maestra"],["Wrong password! Please try again!","¡Contraseña errónea! ¡Por favor, inténtalo de nuevo!"],["Biometric unlock activated successfully!","!Desbloqueo biométrico activado correctamente!"],["Are you sure you want to delete this attachment?","¿Estás seguro de que quieres eliminar este adjunto?"],["Delete","Eliminar"],["Delete Attachment","Eliminar adjunto"],["Download failed!","¡Descarga fallida!"],["Do you want to save this file to your disk? WARNING: Doing this will leave the file exposed and unprotected on your harddrive!","¿Quieres guardar este archivo en tu disco? AVISO: ¡Hacer esto deja el archivo expuesto y desprotegido en tu disco duro!"],["Save","Guardar"],["Save To Disk","Guardar En Disco"],["Edit Name","Editar Nombre"],["Attachment Name","Nombre de Adjunto"],["Please enter an attachment name!","¡Por favor, introduce un nombre para el adjunto!"],["Unknown File Type","Tipo de Archivo Desconocido"],["downloading... {0}/{1}","descargando... {0}/{1}"],["Unnamed","Sin nombre"],["uploading... {0}/{1}","cargando... {0}/{1}"],["Failed to upload!","¡Carga fallida!"],["Failed to download! Click to try again.","¡Fallo en la descarga! Click para intentarlo de nuevo"],["Update Billing Info","Actualizar Información de Facturación"],["Select A Country","Selecciona Un País"],["To update your billing info and payment method, please log in through our website (found under \\"Settings\\") or contact us at ",""],["Payment Details","Detalles de Pago"],["Billing Address","Dirección de Facturación"],["Billing Email","Email de Facturación"],["Name","Nombre"],["Address","Dirección"],["Postal Code","Código Postal"],["City","Ciudad"],["Tax Info","Información de Tasas"],["This is a business","Esto es un negocio"],["Tax ID","ID de Tasa"],["Coupon Code","Código de Cupón"],["Add Later","Añadir Después"],["Something went wrong. Please try again later!","Algo salió mal. ¡Por favor, inténtalo de nuevo!"],["Add Payment Method","Añadir Método de Pago"],["per user / month","por usuario / mes"],["USD, billed annually","USD, cargado anualmente"],["Try For Free","Prueba Gratuita"],["Please enter at least one email address!","¡Por favor, introduce al menos una dirección de email!"],["You have entered too many email addresses! Please delete some before submitting!","¡Has introducido demasiadas direcciones de email! ¡Por favor, elimina algunas antes de enviar!"],["Some of the emails you entered appear to be invalid!","!Parece que algunos emails que has introducido no son válidos!"],["Something went wrong! Please try again later!","¡Algo salió mal! ¡Por favor, inténtalo de nuevo más tarde!"],["Invite New Members","Invitar A Nuevos Miembros"],["Please enter up to {0} email addresses of the persons you would like to invite, separated by spaces or commas!","¡Por favor, introduce hasta {0} direcciones de email de personas a las que quieres invitar, separadas por espacios o comas!"],["Enter Email Address","Introduce Email"],["Submit","Enviar"],["New Vault Item","Nuevo Elemento de Almacén"],["Item Name","Nombre del Elemento"],["Template","Plantilla"],["Vault","Almacén"],["Create & Edit","Crear & Editar"],["You have reached the maximum number of items for this account. Upgrade to Premium to get unlimited items for your private vault!","Has alcanzado el número máximo de elementos para esta cuenta. ¡Actualiza a Premium para obtener un número ilimidado de elementos para tu almacén privado!"],["You have reached the maximum number of items for this account!","¡Has alcanzado el número máximo de elementos para esta cuenta!"],["Please enter an organization name!","¡Por favor, introduce un nombre de organización!"],["Free For {0} Days","Gratis Durante {0} Días"],["then","entonces"],["per month","por mes"],["{0} min","{0} min"],["{0} max","{0} max"],["Seats","Plazas"],["Add Billing Info","Añadir Información de Facturación"],["Create Organization","Crear Organización"],["Organization Name","Nombre de Organización"],["Create","Crear"],["Export Data","Exportar Datos"],["Target Vault","Almacén de Destino"],["Format","Formato"],["WARNING: Exporting to CSV format will save your data without encyryption of any kind which means it can be read by anyone. We strongly recommend exporting your data as a secure, encrypted file, instead!","AVISO: Exportar con formato CSV guardará tus datos sin ninguna encriptación, lo que significa que podrán ser leidos por cualquiera. !Te recomentados que exportes tus datos como un archivo encriptado seguro en su lugar!"],["Export {0} Items","Exportar {0} Elementos"],["Please choose a password to protect this backup with!","!Por favor, elige una contraseña para proteger este backup!"],["Choose Password","Elige Contraseña"],["Please choose a password!","¡Por favor, introduce una contraseña!"],["Please repeat the password!","¡Por favor, repite la contraseña!"],["Password not repeated correctly!","¡Contraseña repetida incorrecta!"],["Choose A Field Type","Elige Un Tipo de Campo"],["What kind of field you would like to add?","¿Que tipo de campo quieres añadir?"],["Enter Notes Here","Introduce Notas Aquí"],["Enter Secret","Introduce Secreto"],["Enter Password","Introduce Contraseña"],["Enter Value Here","Introduce Valor Aquí"],["Enter Field Name","Introduce Nombre de Campo"],["Dash","Guión"],["Underscore","Guión Bajo"],["Slash","Barra Oblícua"],["Space","Espacio"],["Generate Password","Generar Contraseña"],["passphrase","frase de contraseña"],["random string","cadena de texto aleatoria"],["Word Separator","Separador de Palabra"],["Language","Idioma"],["words","palabras"],["length","longitud"],["Use","Usar"],["Discard","Descartar"],["Are you sure you want to delete this group?","¿Estás seguro/a de que quieres eliminar este grupo?"],["Delete Group","Eliminar Groupo"],["Type \'DELETE\' to confirm","Escribe \'DELETE\' para confirmar"],["Enter Group Name","Introduce Nombre de Grupo"],["Search...","Buscar..."],["Import Data","Importar Datos"],["IMPORTANT: Before importing, please make sure that your CSV data is structured according to Padlocks specific requirements!","IMPORTANTE: !Antes de importar, por favor, asegurate de que tus CSV está estructurado de acuerdo con los requerimientos específicos de Padlock!"],["Learn More","Aprender Más"],["Import {0} Items","Importar {0} Elementos"],["This file is protected by a password.","Este archivo está protegido mediante una contraseña."],["Wrong Password","Contraseña Incorrecta"],["The number of imported items exceeds your remaining quota. Upgrade to Premium to get unlimited items for your private vault!","El número de elementos importados supera tu quota restante. ¡Actualiza a Premium para obtener un número ilimitado de elementos para tu almacén privado!"],["The number of imported items exceeds your remaining quota.","El número de elementos importados supera tu quota restante."],["Successfully imported {0} items.","{0} elementos importados correctamente"],["This invite has expired","Esta invitación ha expirado"],["Accepted","Aceptado"],["expires {0}","expira {0}"],["Confirm Membership","Confirmar Membresía"],["Organization Invite","Invitación de Organización"],["Please wait for an admin to complete the process. You will be notified as soon as you receive access.","Por favor, espera a que un administrador complete el proceso. Serás notificado/a tan pronto como recibas acceso."],["Enter Confirmation Code","Introduce Código de Confirmación"],["If you haven\'t received the confirmation code yet, please ask the organization owner to provide it to you!","¡Si aún no has recibido el código de confirmación, por favor, pídeselo al dueño/a de la organización!"],["They will also need the following confirmation code, which you should communicate to them separately:","También necesitarán el siguiente código de confirmación, el cual deberás comunicarles de forma separada:"],["Resend","Reenviar"],["Please enter a confirmation code!","¡Por favor, introduce un código de confirmación!"],["You have successfully accepted the invite. You\'ll be notified once you\'ve been granted access.","Has aceptado la invitación correctamente. Serás notificado/a una vez que se te haya concedido acceso."],["Wrong confirmation code. Please try again!","Código de confirmación incorrecto. ¡Por favor, intentalo de nuevo!"],["expired","expirado"],["accepted","aceptado"],["{0}","{0}"],["Confirm","Confirmar"],["Confirmation Code:","Código de Confirmación:"],["Upgrade to Premium now and get 1GB of encrypted file storage!","¡Actualiza a Premium ahora y obtén 1GB de espacio encriptado!"],["Enter Item Name","Introduce Nombre de Elemento"],["Field","Campo"],["Attachment","Adjunto"],["Move","Mover"],["by {0}","por {0}"],["Are you sure you want to delete this item?","¿Estás seguro/a de que quieres eliminar este elemento?"],["Items with attachments cannot be moved!","¡Elementos con adjuntos no se pueden mover!"],["The selected file is too large! Only files of up to 5 MB are supported.","¡El archivo seleccionado es demasiado grande! Sólo archivos de hasta 5 MB son soportados."],["File uploaded successfully!","¡Archivo cargado correctamente!"],["Favorites","Favoritos"],["Recently Used","Usados Recientemente"],["Attachments","Adjuntos"],["All Items","Todos los Elementos"],["My Vault","Mi Almacén"],["Tags","Etiquetas"],["You don\'t have any tags yet.","Aún no tienes etiquetas."],["Your search did not match any items.","Tu búsqueda no encontró ningún elemento."],["This vault does not have any items yet.","Este almacén aún no tiene elementos."],["You don\'t have any attachments yet.","Aún no tienes adjuntos."],["You don\'t have any favorites yet.","Aún no tienes favoritos."],["You don\'t have any recently used items!","¡No tienes ningún elemento usado recientemente!"],["You don\'t have any items yet.","Aún no tienes elementos."],["Type To Search","Escribe Para Buscar"],["{0} items selected","{0} elementos seleccionados"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be deleted. Do you want to proceed deleting the other items?","Algunos elementos en tu selección son de Almacénes sobre los que no tienes permiso de escritura y no se pueden eliminar. ¿Quieres proceder a eliminar el resto de elementos?"],["Yes","Sí"],["No","No"],["Are you sure you want to delete these items? This action can not be undone!","¿Estás seguro/a de que quieres eliminar estos elementos? ¡Esta acción no se puede deshacer!"],["Delete {0} Items","Eliminar {0} Elementos"],["Some items in your selection have attachments and cannot be moved. Do you want to proceed moving the other items?","Algunos elementos en tu selección tienen adjuntos y no se pueden mover. ¿Quieres proceder a mover el resto de elementos?"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be moved. Do you want to proceed moving the other items?","Algunos elementos en tu selección son de Almacénes sobre los que no tienes premiso de escritura y no se pueden mover. ¿Quieres proceder a mover el resto de elementos?"],["No Name","Sin Nombre"],["copied","copiado"],["No Fields","Sin Campos"],["This item has no fields.","Este elemento no tiene campos."],["Email Address","Dirección Email"],["Master Password","Contraseña Maestra"],["Login","Iniciar Sesión"],["New to Padloc?","¿Nuevo/a en Padloc?"],["Sign Up Now","Regístrate Ahora"],["Please enter a valid email address!","¡Por favor, introduce una dirección email válida!"],["Please enter the confirmation code sent to your email address to proceed!","¡Por favor, introduce el código de confirmación enviado a tu dirección email para continuar!"],["One Last Step!","¡Un Último Paso!"],["Enter Verification Code","Introduce el Código de Verificación"],["Maximum number of tries exceeded! Please resubmit and try again!","¡Número máximo de intentos sobrepasado! ¡Por favor, reenvía e inténtalo de nuevo!"],["Wrong username or password. Please try again!","usuario o contraseña incorrectos. ¡Por favor, inténtalo de nuevo!"],["Can\'t remember your master password?","¿No puedes recordar tu contraseña maestra?"],["Recover Account","Recuperar Cuenta"],["Try Again","Inténtalo de Nuevo"],["An account with this email address does not exist!","¡No existe una cuenta con esta dirección de email!"],["Sign Up","Regístrate"],["Remove","Eliminar"],["Suspend","Suspender"],["Remove Admin","Eliminar Administrador"],["Make Admin","Crear Administrador"],["Are you sure you want to remove this member from this organization?","¿Estás seguro/a de que quieres eliminar este miembro de la organización?"],["Remove Member","Eliminar Miembro"],["Are you sure you want to make this member an admin? Admins can manage vaults, groups and permissions.","¿Estas seguro/a de que quieres hacer a este miembro un administrador? Los administradores pueden gestionar alamcenes, grupos y permisos"],["Are you sure you want to remove this member as admin?","¿Estás seguro/a de que quieres eliminar a este miembro como administrador?"],["Are you sure you want to suspend this member?","¿Estás seguro/a de que quieres suspender a este miembro?"],["Suspend Member","Suspender Miembro"],["Groups","Grupos"],["Vaults","Almacénes"],["read","leer"],["write","escribir"],["Owner","Dueño/a"],["Admin","Administrador"],["Suspended","Suspendido"],["Items","Elementos"],["Orgs & Teams","Orgs & Equipos"],["New Organization","Nueva Organización"],["Settings","Ajustes"],["{0} Items","{0} Elementos"],["Move {0} To","Mover {0} A"],["No target vaults available!","¡No hay almacénes de destino disponibles!"],["Move Item","Mover Elemento"],["Move Items","Mover Elementos"],["Successfully created {0} invites!","¡{0} invitaciones creadas correctamente!"],["Unsuspend","Reactivar"],["Are you sure you want to delete this organization? All associated vaults and the data within them will be lost! This action can not be undone.","¿Estás seguro/a de que quieres eliminar esta organización? ¡Todos los almacénes asociados y sus datos se perderán! Esta acción no se puede deshacer."],["Delete Organization","Eliminar Organización"],["Rename Organization","Renombrar Organización"],["Company Name","Nombre de Compañía"],["Please enter a name!","¡Por favor, introduce un nombre!"],["Do you want to rotate this organizations cryptographic keys? All organization memberships will have to be reconfirmed but no data will be lost.","¿Quieres rotar las claves criptográficas de estas organizaciones? Todas las membresías de organización tendran que ser reconfirmadas, pero no se perderá ningún dato."],["The organizations cryptographic keys have been rotated successfully and membership confirmation requests for all members have been sent out.","Las claves criptográficas de las organizaciones se han rotado correctamente y las peticiones de confirmación de membresía para todos los miembros han sido enviadas."],["Members","Miembros"],["This organization currently does not have an active subscription and has been put in \\"frozen\\" state as a result. While in this state, you won\'t be able to make any changes to members, groups or vaults of this organization.","Esta organización no tiene una subscripción activa actualmente y ha sido puesta en estado \\"congelado\\" como resultado. Mientras esté en este estado, no podrás hacer ningún cambio en los miembros, grupos o almacénes de esta organización."],["Update Subscription","Actualizar Subscripción"],["New Group","Nuevo Grupo"],["New Vault","Nuevo Almacén"],["Subscription","Nueva Suscripción"],["Billing Info","Información de Facturación"],["Security","Seguridad"],["Rotate Cryptographic Keys","Rotar Claves Criptográficas"],["General","General"],["Change Organization Name","Cambiar Nombre de Organización"],["Organizations allow you to securely share passwords, documents and other data within your family, team or any other kind of group!","!Las Organizaciones te permiten compartir contraseñas, documentos y otros datos de forma segura entre tu familia, equipo o cualquier otro tipo de grupo!"],["Start Trial","Empezar Prueba"],["Scan QR Code","Escanear Código QR"],["Failed to scan QR code. Error: ","Escaneo QR fallido: Error: "],["Please enter your email address and new master password.","Por favor, introduce tu dirección email y una nueva contraseña maestra"],["New Master Password","Nueva Contraseña Maestra"],["WARNING: Weak Password!","AVISO: ¡Contraseña Débil!"],["Repeat Master Password","Repite la Contraseña Maestra"],["IMPORTANT, READ CAREFULLY: Padloc is designed in a way that makes it impossible for us to access the data encrypted in any of your vaults even if we wanted to. While this is essential to ensuring the security of your data, it also has the following implications:","IMPORTANTE, LEE ATENTAMENTE: Padloc está diseñado de una forma que hace imposible para nosotros acceder a la información encriptada de tus almacénes, incluso aunque quisieramos. Mientras que esto es esencial para asegurar la seguridad de tus datos, también tiene las siguientes implicaciones:"],["Any data stored in your private vault can not be recovered and will be permantently lost.","Cualquier dato guardado en tu almacén privado no puede ser recuperado y estará perdido permanentemente"],["All your organization memberships will be suspended temporarily until confirmed by the organization owner.","Todas tus membresías de organización serán suspendidas temporalmente hasta que el dueño/a de la organización lo confirme."],["All members of organizations you own will be suspended temporarily until confirmed by you.","Todos los miembros de organizaciones de las que seas dueño/a serán temporalmente suspendidas hasta que las confirmes."],["Please enter a master password!","¡Por favor, introduce una contraseña maestra!"],["You didn\'t repeat your master password correctly. Try again!","No repetiste tu contraseña maestra correctamente. ¡Inténtalo de nuevo!"],["The password you entered is weak which makes it easier for attackers to break the encryption used to protect your data. Try to use a longer password or include a variation of uppercase, lowercase and special characters as well as numbers!","La contraseña que has introducido es débil, lo que hace más fácil a atacantes romper la encriptación usada para proteger tus datos. Intenta usar una contraseña más larga o incluir alguna variación en mayúsculas, minúsculas o caracteres especiales así como números."],["Choose Different Password","Elige una Contraseña Diferente"],["Use Anyway","Usar de todos modos"],["WARNING: Weak Password","AVISO: Contraseña Débil"],["To complete the account recovery process, please enter the confirmation code sent to your email address!","¡Para completar el proceso de recuperación de cuenta, por favor, inserta el código de confirmación enviado a tu dirección de email!"],["Account recovery successful!","¡Recuperación de contraseña correcta!"],["Report Errors","Reportar Errores"],["{0} Errors Detected","{0} Errores Detectados"],["Padloc has registered {0} errors during your use of the app. These errors may not have any impact on functionality and can often be ignored, but reporting them may help us diagnose problems, identify possible failure modes and generally improve the stability of the app.","Padloc ha registrado {0} errores durante tu uso de la aplicación. Estos errores pueden no tener ningún impacto en la fucionalidad y normalmente pueden ser ignorados, pero reportarlos puede ayudarnos a diagnosticar futuros problemas, identificar posibles fallos y de manera general, mejorar la estabilidad de la aplicación."],["Profile","Perfil"],["Log Out","Cerrar Sesión"],["Change Master Password","Cambiar Contraseña Maestra"],["Auto Lock","Bloqueo Automático"],["Lock Automatically","Bloquear Automáticamente"],[" min"," min"],["After","Después"],["Enable Biometric Unlock","Habilitar Desbloqueo Biométrico"],["Import / Export","Importar / Exportar"],["Import...","Importar..."],["Export...","Exportar..."],["Support","Soporte"],["Website","Sitio Web"],["Contact Support","Concactar Soporte"],["Danger Zone","Zona de Peligro"],["Delete Account","Eliminar Cuenta"],["Edit Profile","Editar Perfil"],["Do you really want to log out?","¿Seguro que quieres cerrar sesión?"],["Please enter your current password!","¡Por favor, inserta tu contraseña actual!"],["Enter Current Password","Instar Contraseña Actual"],["Now choose a new master password!","¡Ahora elige una contraseña maestra nueva!"],["Enter New Password","Insertar Nueva Contraseña"],["Please enter a password!","¡Por favor, inserta una contraseña!"],["Please confirm your new password!","¡Por favor, confirma tu nueva contraseña!"],["Repeat New Password","Repetir Nueva Contraseña"],["Master password changed successfully.","Contraseña maestra cambiada correctamente"],["Please enter your master password to proceed.","Por favor, inserta tu contraseña maestra para continuar."],["Are you sure you want to delete this account? All associated vaults and the data within them will be lost and any active subscriptions will be canceled immediately. This action can not be undone!","¿Estás seguro/a de borrar esta cuenta? Todos los almacénes asociados y sus datos se perderán, y cualquier subscripción activa será cancelada inmediatamente. ¡Esta acción no puede deshacerse!"],["Are you sure you want to disable biometric unlock?","¿Estás seguro/a de que quieres deshabilitar el desbloqueo automático?"],["Welcome to Padloc! Let\'s get you started by creating an account for you.","¡Bienveinod a Padloc! Empecemos por crearte una cuenta."],["Your email address serves as your username and allows us to get in touch with you. Don\'t worry, we would never send you any spam!","Tu dirección email sirve como tu nombre de usuario y nos permite ponernos end contacto contigo. ¡No te preocupes, nunca te enviaremos spam!"],["Your Name","Tu Nombre"],["What should we call you?","¿Cómo debemos llamarte?"],["Continue","Continuar"],["Already have an account?","¿Ya tienes una cuenta?"],["Sign In","Iniciar Sesión"],["You\'ve Got Mail!","¡Tienes Correo!"],["To verify your email address, please enter the confirmation code we sent to {0}.","Para verificar tu dirección de correo electrónico, introduzca el código de confirmación que enviamos a {0}."],["Confirmation Code","Código de Confirmación"],["Say hello to your","Di hola a tu"],["It\'s the last password you\'ll ever have to remember! Please memorize it and never reveal it to anyone (not even us)! We recommend writing it down on a piece of paper and storing it somewhere safe, at least until you have it safely memorized.","¡Esta es la última contraseña que tendras que recordar! ¡Por favor, memorizala y nunca la reveles a nadie (ni tan siquiera a nosotros)! Te recomendamos que la escribas en papel y la guardes en algún lugar seguro, al menos hasta que la hayas memorizado de forma segura."],["[Tap To Reveal]","[Pulsa para Mostrar]"],["[Hover To Reveal]","[Pasa por encima para Mostrar]"],["This random passphrase was generated just for you and is designed to be both secure and easy to remember. Don\'t like it?","Esta frase de contraseña aleatoria fue generada sólo para tí, y está diseñada para ser a la vez segura y fácil de recordar. ¿No te gusta?"],["Try Another One","Intenta una nueva"],["Choose Your Own","Elige la tuya"],["An account with this email address already exists!","¡Una cuenta con esta dirección email ya existe!"],["Change Email","Cambiar Email"],["We recommend using a randomly generated password that is both strong and easy to remember.","Te recomendamos usar una contraseña generada aleatoriamente que sea a la vez fuerte y fácil de recordar."],["Keep This One","Mantener Esta"],["Generate Another","Generar Otra"],["Choose My Own","Elegir Una Propia"],["Want A Different Master Password?","¿Quieres Una Contraseña Maestra Diferente?"],["Choose Own Master Password","Elegir Una Contraseña Maestra Propia"],["Resume Subscription","Reactivar Subscripción"],["Cancel Subscription","Cancelar Subscripción"],["Update Plan","Actualizar Plan"],["Are you sure you want to downgrade to the Free Plan?","¿Estás seguro/a de que quieres degradar al Plan Gratuito?"],["Downgrade","Degradar"],["No Plan Selected","Sin Plan Seleccionado"],["Unlimited","Ilimitado"],["{0} / Year","{0} / Año"],["Canceled ({0} days left)","Cancelado (quedan {0} días)"],["Authentication Required","Autenticación Requerida"],["Inactive","Inactivo"],["Trialing ({0} days left)","Prueba (quedan {0} días)"],["Choose Plan","Elegir Plan"],["Complete Payment","Completar Pago"],["Downgrade To Free Plan","Degradar al Plan Gratuito"],["Add Tag","Añadir Etiqueta"],["Choose A Template","Elige una Etiqueta"],["What kind of item you would like to add?","¿Qué tipo de elemento te gustaría añadir?"],["Invalid Code","Código Invalido"],["Logged In As","Sesión Iniciada Como"],["Unlock","Desbloquear"],["Wrong password! Please try again.","¡Contraseña incorrecta! Por favor, inténtalo de nuevo."],["Logout / Switch Account","Cerrar Sesión / Cambiar Cuenta"],["Forgot Password","Olvidé mi Contraseña"],["Are you sure you want to log out of this account?","¿Estás seguro/a de que quieres cerrar la sesión de esta cuenta?"],["Biometric unlock expired. Complete setup to reeneable.","Desbloqueo Biométrico expirado. Completa la configuración para rehabilitarlo."],["Biometric unlock failed! Reason: {0}","¡Desbloqueo Biométrico fallido! Motivo: {0}"],["Failed To Unlock","Fallo al Desbloquear"],["Update","Actualizar"],["Storage limit exceeded!","¡Límite de Almacénamiento superado!"],["Upload failed! Please try again!","¡Carga fallida! ¡Por favor, inténtalo de nuevo!"],["Upload Attachment","Cargar Adjunto"],["Unkown File Type","Tipo de Fichero Desconocido"],["Retry Upload","Reintentar Carga"],["Upload","Cargar"],["Are you sure you want to delete this vault? All the data stored in it will be lost! This action can not be undone.","¿Estás seguro/a de que quieres eliminar este almacén? ¡Todos los datos guardados en el mismo se perderán! Esta acción no se puede deshacer."],["Delete Vault","Eliminar Almacén"],["Enter Vault Name","Insertar Nombre de Almacén"],["Username","Nombre de Usuario"],["Password","Contraseña"],["URL","URL"],["Notes","Notas"],["Your session has expired. Please log in again!","Tu sesión ha expirado. ¡Por favor, Inicia sesión de nuevo!"],["A new update is ready to install! Do you want to install it now?","¡Una nueva actualización está lista para ser instalada! ¿Quieres instalarla ahora?"],["Install & Reload","Instalar & Recargar"],["Later","Después"],["Date","Fecha"],["Month","Mes"],["Credit Card Number","Número de Tarjeta de Crédito"],["Phone Number","Número de Teléfono"],["PIN","PIN"],["2FA Token","Token de 2FA"],["Note","Nota"],["Other","Otro"],["Credit Card","Tarjeta de Crédito"],["Card Number","Número de Tarjeta"],["Card Owner","Dueño de la Tarjeta"],["Valid Until","Válido Hasta"],["CVC","CVC"],["Bank Account","Número De Cuenta"],["Account Owner","Dueño de la Cuenta"],["IBAN","IBAN"],["BIC","BIC"],["Card PIN","PIN de la Tarjeta"],["WIFI Password","Contraseña WIFI"],["Passport","Pasaporte"],["Full Name","Nombre Completo"],["Passport Number","Número de Pasaporte"],["Country","País"],["Birthdate","Fecha de Nacimiento"],["Birthplace","Lugar de Nacimiento"],["Issued On","Emitido en"],["Expires","Expira"],["Document","Documento"],["Custom","Personalizado"],["{0} on {1}","{0} de {1}"],["{0} Device","{0} Dispositivo"]]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_translations_fr_json.chunk.js b/cypress/fixtures/v3-client/locale_res_translations_fr_json.chunk.js deleted file mode 100644 index 1e85bda4..00000000 --- a/cypress/fixtures/v3-client/locale_res_translations_fr_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_translations_fr_json"],{ - -/***/ "../locale/res/translations/fr.json": -/*!******************************************!*\ - !*** ../locale/res/translations/fr.json ***! - \******************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('[["OK","OK"],["o f f l i n e","hors ligne"],["Could not find invite! Did you use the correct link?","Impossible de trouver une invitation ! Avez-vous utilisé le bon lien ?"],["Get Premium","Devenir Premium"],["Cancel","Annuler"],["It looks like the app cannot connect to the Padloc servers right now, probably due to a missing internet connection. You can still access your vaults and even create or edit Vault Items but your changes won\'t be synchronized until you\'re back online.","Il semble que l\'application ne puisse pas se connecter aux serveurs de Padloc pour le moment, probablement en raison d\'un problème de connexion Internet. Vous pouvez toujours accéder à vos coffres-forts et même créer ou modifier des éléments des coffres-forts, mais vos modifications ne seront pas synchronisées tant que vous ne serez pas à nouveau connecté à Internet."],["You\'re Offline","Vous êtes hors ligne"],["Do you want to enable biometric unlock for this device?","Souhaitez-vous activer le déverrouillage biométrique pour cet appareil ?"],["Setup","Configuration"],["Biometric Unlock","Déverrouillage biométrique"],["Biometric authentication failed! Canceling Setup.","L\'authentification biométrique a échoué ! Annulation de la configuration."],["Setup Failed","Échec de la configuration"],["Biometric unlock failed! Canceling Setup. (Reason: {0})","Le déverrouillage biométrique a échoué ! Annulation de la configuration. (Raison: {0})"],["Please enter your master password!","Veuillez entrer votre mot de passe principal !"],["Enter Master Password","Entrez le mot de passe principal"],["Wrong password! Please try again!","Mauvais mot de passe ! Veuillez réessayer !"],["Biometric unlock activated successfully!","Déverrouillage biométrique activé avec succès !"],["Are you sure you want to delete this attachment?","Êtes-vous sûr de vouloir supprimer cette pièce jointe ?"],["Delete","Supprimer"],["Delete Attachment","Supprimer la pièce jointe"],["Download failed!","Le téléchargement a échoué !"],["Do you want to save this file to your disk? WARNING: Doing this will leave the file exposed and unprotected on your harddrive!","Voulez-vous enregistrer ce fichier sur votre disque ? ATTENTION: En faisant cela, le fichier sera exposé et non protégé sur votre disque dur !"],["Save","Sauvegarder"],["Save To Disk","Sauvegarder sur le disque"],["Edit Name","Modifier le nom"],["Attachment Name","Nom de la pièce jointe"],["Please enter an attachment name!","Veuillez entrer un nom de pièce jointe !"],["Unknown File Type","Type de fichier inconnu"],["downloading... {0}/{1}","téléchargement... {0}/{1}"],["Unnamed","Sans nom"],["uploading... {0}/{1}","uploading... {0}/{1}"],["Failed to upload!","Echec de l\'upload!"],["Failed to download! Click to try again.","Le téléchargement n\'a pas réussi ! Cliquez pour réessayer."],["Update Billing Info","Mise à jour des informations de facturation"],["Select A Country","Sélectionnez un pays"],["To update your billing info and payment method, please log in through our website (found under \\"Settings\\") or contact us at ","Pour mettre à jour vos informations de facturation et votre mode de paiement, veuillez vous connecter sur notre site web (dans la section \\"Paramètres\\") ou nous contacter à l\'adresse suivante "],["Payment Details","Détails du paiement"],["Billing Address","Adresse de facturation"],["Billing Email","E-mail de facturation"],["Name","Nom"],["Address","Adresse"],["Postal Code","Code postal"],["City","Ville"],["Tax Info","Informations fiscales"],["This is a business","Il s\'agit d\'une entreprise"],["Tax ID","ID fiscal"],["Coupon Code","Code promo"],["Add Later","Ajouter plus tard"],["Something went wrong. Please try again later!","Quelque chose s\'est mal passé. Veuillez réessayer plus tard !"],["Add Payment Method","Ajouter un mode de paiement"],["per user / month","par utilisateur / mois"],["USD, billed annually","USD, facturé annuellement"],["Try For Free","Essayez gratuitement"],["Please enter at least one email address!","Veuillez saisir au moins une adresse e-mail !"],["You have entered too many email addresses! Please delete some before submitting!","Vous avez saisi trop d\'adresses e-mail ! Veuillez en effacer quelques-unes avant de les soumettre !"],["Some of the emails you entered appear to be invalid!","Certains des e-mails que vous avez saisis semblent être invalides !"],["Something went wrong! Please try again later!","Quelque chose s\'est mal passé. Veuillez réessayer plus tard !"],["Invite New Members","Invitez de nouveaux membres"],["Please enter up to {0} email addresses of the persons you would like to invite, separated by spaces or commas!","Veuillez saisir jusqu\'à {0} adresses email des personnes que vous souhaitez inviter, séparées les par des espaces ou des virgules !"],["Enter Email Address","Entrez les adresses e-mail"],["Submit","Envoyer"],["New Vault Item","Nouvel élément du coffre-fort"],["Item Name","Nom de l\'élément"],["Template","Modèle"],["Vault","Coffre-fort"],["Create & Edit","Créer et Éditer"],["You have reached the maximum number of items for this account. Upgrade to Premium to get unlimited items for your private vault!","Vous avez atteint le nombre maximum d\'élément pour ce compte. Passez à la version Premium pour obtenir un nombre illimité d\'éléments dans votre coffre-fort privé !"],["You have reached the maximum number of items for this account!","Vous avez atteint le nombre maximum d\'éléments pour ce compte !"],["Please enter an organization name!","Veuillez entrer un nom d\'organisation !"],["Free For {0} Days","Gratuit pendant {0} jours"],["then","alors"],["per month","par mois"],["{0} min","{0} min"],["{0} max","{0} max"],["Seats","Places"],["Add Billing Info","Ajouter des informations de facturation"],["Create Organization","Créer une organisation"],["Organization Name","Nom de l\'organisation"],["Create","Créez"],["Export Data","Exporter les données"],["Target Vault","Coffre-fort sélectionné"],["Format","Format"],["WARNING: Exporting to CSV format will save your data without encyryption of any kind which means it can be read by anyone. We strongly recommend exporting your data as a secure, encrypted file, instead!","AVERTISSEMENT: l\'exportation au format CSV permet de sauvegarder vos données sans aucun chiffrement, ce qui signifie qu\'elles peuvent être lues par n\'importe qui. Nous vous recommandons vivement d\'exporter vos données sous forme de fichier chiffré et sécurisé !"],["Export {0} Items","Exporter {0} éléments"],["Please choose a password to protect this backup with!","Veuillez choisir un mot de passe pour protéger cette sauvegarde !"],["Choose Password","Choisissez un mot de passe"],["Please choose a password!","Veuillez choisir un mot de passe !"],["Please repeat the password!","Veuillez répéter le mot de passe !"],["Password not repeated correctly!","Le mot de passe n\'est pas répété correctement !"],["Choose A Field Type","Choisissez un type de champ"],["What kind of field you would like to add?","Quel type de champ souhaitez-vous ajouter ?"],["Enter Notes Here","Entrez vos notes ici"],["Enter Secret","Entrez le secret"],["Enter Password","Entrez le mot de passe"],["Enter Value Here","Entrez la valeur ici"],["Enter Field Name","Entrez le nom du champ"],["Dash","Tiret"],["Underscore","Tiret du bas"],["Slash","Slash"],["Space","Espace"],["Generate Password","Générer un mot de passe"],["passphrase","phrase de mot de passe"],["random string","chaîne de caractères aléatoire"],["Word Separator","Séparateur de mots"],["Language","Langue"],["words","mots"],["length","longueur"],["Use","Utiliser"],["Discard","Jeter"],["Are you sure you want to delete this group?","Êtes-vous sûr de vouloir supprimer ce groupe ?"],["Delete Group","Supprimer le groupe"],["Type \'DELETE\' to confirm","Tapez \'DELETE\' pour confirmer"],["Enter Group Name","Entrez le nom du groupe"],["Search...","Recherche..."],["Import Data","Importer des données"],["IMPORTANT: Before importing, please make sure that your CSV data is structured according to Padlocks specific requirements!","IMPORTANT: Avant d\'importer, veuillez vous assurer que vos données CSV sont structurées selon les exigences spécifiques à Padloc !"],["Learn More","En savoir plus"],["Import {0} Items","Importation de {0} éléments"],["This file is protected by a password.","Ce fichier est protégé par un mot de passe."],["Wrong Password","Mauvais mot de passe"],["The number of imported items exceeds your remaining quota. Upgrade to Premium to get unlimited items for your private vault!","Le nombre d\'éléments importés dépasse votre quota restant. Passez à la version Premium pour obtenir un nombre illimité d\'éléments dans votre coffre-fort privé !"],["The number of imported items exceeds your remaining quota.","Le nombre d\'éléments importés dépasse votre quota restant."],["Successfully imported {0} items.","Importation de {0} éléments réussie."],["This invite has expired","Cette invitation a expiré"],["Accepted","Accepté"],["expires {0}","expire {0}"],["Confirm Membership","Confirmation de l\'adhésion"],["Organization Invite","Invitation d\'un Organisation"],["Please wait for an admin to complete the process. You will be notified as soon as you receive access.","Veuillez attendre qu\'un administrateur termine la procédure. Vous serez informé dès que vous aurez reçu l\'accès."],["Enter Confirmation Code","Entrez le code de confirmation"],["If you haven\'t received the confirmation code yet, please ask the organization owner to provide it to you!","Si vous n\'avez pas encore reçu le code de confirmation, veuillez demander au propriétaire de l\'organisation de vous le fournir !"],["They will also need the following confirmation code, which you should communicate to them separately:","Ils auront également besoin du code de confirmation suivant, que vous devez leur communiquer séparément:"],["Resend","Renvoyer"],["Please enter a confirmation code!","Veuillez entrer un code de confirmation !"],["You have successfully accepted the invite. You\'ll be notified once you\'ve been granted access.","Vous avez accepté l\'invitation avec succès. Vous serez informé dès que l\'accès vous sera accordé."],["Wrong confirmation code. Please try again!","Code de confirmation incorrect. Veuillez réessayer !"],["expired","expiré"],["accepted","accepté"],["{0}","{0}"],["Confirm","Confirmer"],["Confirmation Code:","Code de confirmation:"],["Upgrade to Premium now and get 1GB of encrypted file storage!","Passez à la version Premium dès maintenant et obtenez 1 Go de stockage de fichiers chiffré !"],["Enter Item Name","Entrez le nom de l\'élément"],["Field","Champ"],["Attachment","Pièce jointe"],["Move","Déplacer"],["by {0}","par {0}"],["Are you sure you want to delete this item?","Êtes-vous sûr de vouloir supprimer cet élément ?"],["Items with attachments cannot be moved!","Les éléments avec des pièces jointes ne peuvent pas être déplacés !"],["The selected file is too large! Only files of up to 5 MB are supported.","Le fichier sélectionné est trop volumineux ! Seuls les fichiers de moins de 5 Mo sont pris en charge."],["File uploaded successfully!","Fichier téléchargé avec succès !"],["Favorites","Favoris"],["Recently Used","Récemment utilisé"],["Attachments","Pièces jointes"],["All Items","Tous les éléments"],["My Vault","Mon coffre-fort"],["Tags","Étiquettes"],["You don\'t have any tags yet.","Vous n\'avez pas encore d\'étiquettes."],["Your search did not match any items.","Votre recherche n\'a donné aucun résultat."],["This vault does not have any items yet.","Ce coffre-fort n\'a pas encore de contenu."],["You don\'t have any attachments yet.","Vous n\'avez pas encore de pièces jointes."],["You don\'t have any favorites yet.","Vous n\'avez pas encore de favoris."],["You don\'t have any recently used items!","Vous n\'avez pas d\'éléments récemment utilisés !"],["You don\'t have any items yet.","Vous n\'avez pas encore d\'éléments."],["Type To Search","Tapez pour faire une rechercher"],["{0} items selected","{0} éléments sélectionnés"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be deleted. Do you want to proceed deleting the other items?","Certains éléments de votre sélection proviennent de coffres-forts auxquels vous n\'avez pas accès en écriture et qui ne peuvent donc pas être supprimés. Souhaitez-vous supprimer les autres éléments ?"],["Yes","Oui"],["No","Non"],["Are you sure you want to delete these items? This action can not be undone!","Êtes-vous sûr de vouloir supprimer ces éléments ? Cette action ne peut pas être annulée !"],["Delete {0} Items","Supprimer {0} éléments"],["Some items in your selection have attachments and cannot be moved. Do you want to proceed moving the other items?","Certains éléments de votre sélection ont des pièces jointes et ne peuvent pas être déplacés. Souhaitez-vous déplacer les autres objets ?"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be moved. Do you want to proceed moving the other items?","Certains éléments de votre sélection proviennent de coffres-forts auxquels vous n\'avez pas accès en écriture et qui ne peuvent donc pas être déplacés. Souhaitez-vous déplacer les autres objets ?"],["No Name","Pas de nom"],["copied","copié"],["No Fields","Pas de champs"],["This item has no fields.","Cet élément n\'a pas de champs."],["Email Address","Adresse e-mail"],["Master Password","Mot de passe principal"],["Login","Connexion"],["New to Padloc?","Nouveau sur Padloc ?"],["Sign Up Now","S\'inscrire maintenant"],["Please enter a valid email address!","Veuillez entrer une adresse e-mail valide !"],["Please enter the confirmation code sent to your email address to proceed!","Veuillez saisir le code de confirmation envoyé à votre adresse e-mail pour continuer !"],["One Last Step!","Une dernière étape !"],["Enter Verification Code","Entrez le code de vérification"],["Maximum number of tries exceeded! Please resubmit and try again!","Nombre maximum d\'essais dépassé ! Veuillez soumettre à nouveau et réessayer !"],["Wrong username or password. Please try again!","Nom d\'utilisateur ou mot de passe incorrect. Veuillez réessayer !"],["Can\'t remember your master password?","Vous ne vous souvenez pas de votre mot de passe principal ?"],["Recover Account","Récupérer votre compte"],["Try Again","Essayer à nouveau"],["An account with this email address does not exist!","Un compte avec cette adresse e-mail n\'existe pas !"],["Sign Up","S\'inscrire"],["Remove","Supprimer"],["Suspend","Suspendre"],["Remove Admin","Supprimer l\'administration"],["Make Admin","Passer administrateur"],["Are you sure you want to remove this member from this organization?","Êtes-vous sûr de vouloir supprimer ce membre de cette organisation ?"],["Remove Member","Supprimer un membre"],["Are you sure you want to make this member an admin? Admins can manage vaults, groups and permissions.","Êtes-vous sûr de vouloir faire de ce membre un administrateur ? Les administrateurs peuvent gérer les coffres-forts, les groupes et les autorisations."],["Are you sure you want to remove this member as admin?","Êtes-vous sûr de vouloir supprimer ce membre des administrateur ?"],["Are you sure you want to suspend this member?","Êtes-vous sûr de vouloir suspendre ce membre ?"],["Suspend Member","Suspendre un membre"],["Groups","Groupes"],["Vaults","Coffres-forts"],["read","lire"],["write","écrire"],["Owner","Propriétaire"],["Admin","Administrateur"],["Suspended","Suspendu"],["Items","Éléments"],["Orgs & Teams","Organisations et Équipes"],["New Organization","Nouvelle Organisation"],["Settings","Paramètres"],["{0} Items","{0} éléments"],["Move {0} To","Déplacer {0} vers"],["No target vaults available!","Aucun coffre-fort cible disponible !"],["Move Item","Déplacer un élément"],["Move Items","Déplacer des éléments"],["Successfully created {0} invites!","{0} invitations créées avec succès !"],["Unsuspend","Ne plus suspendre"],["Are you sure you want to delete this organization? All associated vaults and the data within them will be lost! This action can not be undone.","Êtes-vous sûr de vouloir supprimer cette organisation ? Tous les coffres-forts associés et les données qu\'ils contiennent seront perdus ! Cette action ne peut pas être annulée."],["Delete Organization","Supprimer l\'organisation"],["Rename Organization","Renommer l\'organisation"],["Company Name","Nom de la société"],["Please enter a name!","Veuillez entrer un nom !"],["Do you want to rotate this organizations cryptographic keys? All organization memberships will have to be reconfirmed but no data will be lost.","Voulez-vous faire une rotation des clés de chiffrement de cette organisation ? Toutes les adhésions à l\'organisation devront être reconfirmées mais aucune donnée ne sera perdue."],["The organizations cryptographic keys have been rotated successfully and membership confirmation requests for all members have been sent out.","La rotation des clés de chiffrement des organisations a été effectuée avec succès et les demandes de confirmation d\'adhésion pour tous les membres ont été envoyées."],["Members","Membres"],["This organization currently does not have an active subscription and has been put in \\"frozen\\" state as a result. While in this state, you won\'t be able to make any changes to members, groups or vaults of this organization.","Cette organisation n\'a actuellement pas d\'abonnement actif et a donc été mise en état \\"gelé\\". Tant que cet état sera maintenu, vous ne pourrez pas apporter de modifications aux membres, aux groupes ou aux coffres-forts de cette organisation."],["Update Subscription","Abonnement aux mises à jour"],["New Group","Nouveau Groupe"],["New Vault","Nouveau Coffre-fort"],["Subscription","Abonnement"],["Billing Info","Informations de facturation"],["Security","Securité"],["Rotate Cryptographic Keys","Rotation des clés de chiffrement"],["General","Général"],["Change Organization Name","Changer le nom de l\'organisation"],["Organizations allow you to securely share passwords, documents and other data within your family, team or any other kind of group!","Les organisations vous permettent de partager en toute sécurité des mots de passe, des documents et d\'autres données au sein de votre famille, de votre équipe ou de tout autre type de groupe !"],["Start Trial","Commencer l\'essaie"],["Scan QR Code","Scannez le QR code"],["Failed to scan QR code. Error: ","Impossible de scanner le QR code. Erreur: "],["Please enter your email address and new master password.","Veuillez saisir votre adresse e-mail et votre nouveau mot de passe principal."],["New Master Password","Nouveau mot de passe principal"],["WARNING: Weak Password!","AVERTISSEMENT: mot de passe faible !"],["Repeat Master Password","Répéter le mot de passe principal"],["IMPORTANT, READ CAREFULLY: Padloc is designed in a way that makes it impossible for us to access the data encrypted in any of your vaults even if we wanted to. While this is essential to ensuring the security of your data, it also has the following implications:","IMPORTANT, A LIRE ATTENTIVEMENT: Padloc est conçu de telle manière qu\'il nous est impossible d\'accéder aux données chiffré dans l\'un de vos coffre-fort, même si nous le voulions. Bien que cela soit essentiel pour garantir la sécurité de vos données, cela a également les implications suivantes:"],["Any data stored in your private vault can not be recovered and will be permantently lost.","Toute donnée stockée dans votre coffre-fort privé ne peut être récupérée et sera perdue de façon permanente."],["All your organization memberships will be suspended temporarily until confirmed by the organization owner.","Toutes les adhésions à votre organisation seront temporairement suspendues jusqu\'à ce qu\'elles soient confirmées par le propriétaire de l\'organisation."],["All members of organizations you own will be suspended temporarily until confirmed by you.","Tous les membres des organisations que vous possédez seront temporairement suspendus jusqu\'à ce que vous les confirmiez."],["Please enter a master password!","Veuillez entrer un mot de passe principal !"],["You didn\'t repeat your master password correctly. Try again!","Vous n\'avez pas répété correctement votre mot de passe principal. Essayez à nouveau !"],["The password you entered is weak which makes it easier for attackers to break the encryption used to protect your data. Try to use a longer password or include a variation of uppercase, lowercase and special characters as well as numbers!","Le mot de passe que vous avez saisi est faible, ce qui permet aux attaquants de casser plus facilement le cryptage utilisé pour protéger vos données. Essayez d\'utiliser un mot de passe plus long ou d\'inclure une variation de majuscules, de minuscules et de caractères spéciaux ainsi que des chiffres !"],["Choose Different Password","Choisissez un autre mot de passe"],["Use Anyway","Utiliser quand même"],["WARNING: Weak Password","AVERTISSEMENT: mot de passe faible"],["To complete the account recovery process, please enter the confirmation code sent to your email address!","Pour terminer le processus de récupération du compte, veuillez saisir le code de confirmation envoyé à votre adresse électronique !"],["Account recovery successful!","Récupération de compte réussie !"],["Report Errors","Signaler les erreurs"],["{0} Errors Detected","{0} erreurs détectées"],["Padloc has registered {0} errors during your use of the app. These errors may not have any impact on functionality and can often be ignored, but reporting them may help us diagnose problems, identify possible failure modes and generally improve the stability of the app.","Padloc a enregistré {0} erreurs lors de votre utilisation de l\'application. Ces erreurs peuvent ne pas avoir d\'impact sur les fonctionnalités et peuvent souvent être ignorées, mais les signaler peut nous aider à diagnostiquer les problèmes, à identifier les modes de défaillance possibles et, de manière générale, à améliorer la stabilité de l\'application."],["Profile","Profil"],["Log Out","Déconnexion"],["Change Master Password","Changer le mot de passe principal"],["Auto Lock","Verrouillage automatique"],["Lock Automatically","Verrouillage automatique"],[" min"," min"],["After","Après"],["Enable Biometric Unlock","Activer le déverrouillage biométrique"],["Import / Export","Importer / Exporter"],["Import...","Importation..."],["Export...","Exportation..."],["Support","Support"],["Website","Site web"],["Contact Support","Contact Support"],["Danger Zone","Zone dangereuse"],["Delete Account","Supprimer le compte"],["Edit Profile","Modifier le profil"],["Do you really want to log out?","Vous voulez vraiment vous déconnecter ?"],["Please enter your current password!","Veuillez entrer votre mot de passe actuel !"],["Enter Current Password","Entrez le mot de passe actuel"],["Now choose a new master password!","Maintenant choisissez un nouveau mot de passe principal !"],["Enter New Password","Entrez un nouveau mot de passe"],["Please enter a password!","Veuillez entrer un mot de passe !"],["Please confirm your new password!","Veuillez confirmer votre nouveau mot de passe !"],["Repeat New Password","Répétez le nouveau mot de passe"],["Master password changed successfully.","Le mot de passe principal a été modifié avec succès."],["Please enter your master password to proceed.","Veuillez entrer votre mot de passe principal pour continuer."],["Are you sure you want to delete this account? All associated vaults and the data within them will be lost and any active subscriptions will be canceled immediately. This action can not be undone!","Êtes-vous sûr de vouloir supprimer ce compte ? Tous les coffres-forts associées et les données qu\'ils contiennent seront perdues et tout abonnement actif sera immédiatement annulé. Cette action ne peut pas être annulée !"],["Are you sure you want to disable biometric unlock?","Vous êtes sûr de vouloir désactiver le déverrouillage biométrique ?"],["Welcome to Padloc! Let\'s get you started by creating an account for you.","Bienvenue sur Padloc ! Commençons par vous créer un compte."],["Your email address serves as your username and allows us to get in touch with you. Don\'t worry, we would never send you any spam!","Votre adresse e-mail vous sert de nom d\'utilisateur et nous permet de vous contacter. Ne vous inquiétez pas, nous ne vous enverrons jamais de spam !"],["Your Name","Votre nom"],["What should we call you?","Comment devrions-nous vous appeler ?"],["Continue","Continuer"],["Already have an account?","Vous avez déjà un compte ?"],["Sign In","Connexion"],["You\'ve Got Mail!","Vous avez du courrier !"],["To verify your email address, please enter the confirmation code we sent to {0}.","Pour vérifier votre adresse e-mail, veuillez entrer le code de confirmation que nous avons envoyé à {0}."],["Confirmation Code","Code de confirmation"],["Say hello to your","Dites bonjour à votre"],["It\'s the last password you\'ll ever have to remember! Please memorize it and never reveal it to anyone (not even us)! We recommend writing it down on a piece of paper and storing it somewhere safe, at least until you have it safely memorized.","C\'est le dernier mot de passe dont vous devrez vous souvenir ! Veuillez le mémoriser et ne le révélez jamais à personne (même pas à nous) ! Nous vous recommandons de le noter sur un morceau de papier et de le conserver dans un endroit sûr, au moins jusqu\'à ce que vous l\'ayez mémorisé."],["[Tap To Reveal]","[Tapez pour révéler]"],["[Hover To Reveal]","[Survolez pour révéler]"],["This random passphrase was generated just for you and is designed to be both secure and easy to remember. Don\'t like it?","Cette phrase de mot de passe passe aléatoire a été générée juste pour vous et est conçue pour être à la fois sûre et facile à retenir. Vous ne l\'aimez pas ?"],["Try Another One","En essayer une autre"],["Choose Your Own","Choisissez la vôtre"],["An account with this email address already exists!","Un compte avec cette adresse e-mail existe déjà !"],["Change Email","Changer d\'adresse e-mail"],["We recommend using a randomly generated password that is both strong and easy to remember.","Nous recommandons d\'utiliser un mot de passe généré de manière aléatoire qui soit à la fois solide et facile à retenir."],["Keep This One","Garder celui-ci"],["Generate Another","Générer un autre"],["Choose My Own","Choisir le mien"],["Want A Different Master Password?","Vous voulez un autre mot de passe principal ?"],["Choose Own Master Password","Choisissez votre propre mot de passe principal"],["Resume Subscription","Résumé de l\'abonnement"],["Cancel Subscription","Annuler l\'abonnement"],["Update Plan","Mettre à jour le Plan"],["Are you sure you want to downgrade to the Free Plan?","Vous êtes sûr de vouloir passer au plan gratuit ?"],["Downgrade","Downgrade"],["No Plan Selected","Aucun plan sélectionné"],["Unlimited","Illimité"],["{0} / Year","{0} / An"],["Canceled ({0} days left)","Annulé ({0} jours restants)"],["Authentication Required","Authentification requise"],["Inactive","Inactif"],["Trialing ({0} days left)","Essai ({0} jours restants)"],["Choose Plan","Choisir un plan"],["Complete Payment","Paiement complet"],["Downgrade To Free Plan","Passager au plan gratuit"],["Add Tag","Ajouter une étiquette"],["Choose A Template","Choisissez un modèle"],["What kind of item you would like to add?","Quel type d\'élément souhaitez-vous ajouter ?"],["Invalid Code","Code invalide"],["Logged In As","Connexion en tant que"],["Unlock","Déverrouiller"],["Wrong password! Please try again.","Mot de passe incorrect ! Veuillez réessayer."],["Logout / Switch Account","Déconnexion / Changement de compte"],["Forgot Password","Mot de passe oublié"],["Are you sure you want to log out of this account?","Êtes-vous sûr de vouloir vous déconnecter de ce compte ?"],["Biometric unlock expired. Complete setup to reeneable.","Le déverrouillage biométrique a expiré. Configuration complète pour réactiver."],["Biometric unlock failed! Reason: {0}","Le déverrouillage biométrique a échoué ! La raison: "],["Failed To Unlock","Échec du déverrouillage"],["Update","Mise à jour"],["Storage limit exceeded!","Limite de stockage dépassée !"],["Upload failed! Please try again!","L\'upload a échoué ! Veuillez réessayer !"],["Upload Attachment","Upload la pièce jointe"],["Unkown File Type","Type de fichier inconnu"],["Retry Upload","Réessayer l\'upload"],["Upload","Upload"],["Are you sure you want to delete this vault? All the data stored in it will be lost! This action can not be undone.","Êtes-vous sûr de vouloir supprimer ce coffre-fort ? Toutes les données qui y sont stockées seront perdues ! Cette action ne peut pas être annulée."],["Delete Vault","Supprimer ce coffre-fort"],["Enter Vault Name","Entrez le nom du coffre-fort"],["Username","Nom d\'utilisateur"],["Password","Mot de passe"],["URL","URL"],["Notes","Notes"],["Your session has expired. Please log in again!","Votre session est terminée. Veuillez vous reconnecter !"],["A new update is ready to install! Do you want to install it now?","Une nouvelle mise à jour est prête à être installée ! Voulez vous l\'installer maintenant ?"],["Install & Reload","Installer et recharger"],["Later","Plus tard"],["Date","Date"],["Month","Mois"],["Credit Card Number","Numéro de la carte de crédit"],["Phone Number","Numéro de téléphone"],["PIN","PIN"],["Two-Factor Token","Jeton à deux facteurs"],["Note","Note"],["Other","Autre"],["Credit Card","Carte de crédit"],["Card Number","Numéro de carte"],["Card Owner","Propriétaire de la carte"],["Valid Until","Valable jusqu\'au"],["CVC","CVV"],["Bank Account","Compte bancaire"],["Account Owner","Propriétaire du compte"],["IBAN","IBAN"],["BIC","BIC"],["Card PIN","Code PIN de la carte"],["WIFI Password","Mot de passe WIFI"],["Passport","Passeport"],["Full Name","Nom complet"],["Passport Number","Numéro de passeport"],["Country","Pays"],["Birthdate","Date de naissance"],["Birthplace","Lieu de naissance"],["Issued On","Publié le"],["Expires","Expire"],["Document","Document"],["Custom","Personnalisé"],["{0} on {1}","{0} sur {1}"],["{0} Device","{0} Appareil"]]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_translations_pl_json.chunk.js b/cypress/fixtures/v3-client/locale_res_translations_pl_json.chunk.js deleted file mode 100644 index c2021711..00000000 --- a/cypress/fixtures/v3-client/locale_res_translations_pl_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_translations_pl_json"],{ - -/***/ "../locale/res/translations/pl.json": -/*!******************************************!*\ - !*** ../locale/res/translations/pl.json ***! - \******************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('[["OK","OK"],["o f f l i n e","o f f l i n e"],["Could not find invite! Did you use the correct link?","Nie można znaleźć zaproszenia. Czy użyłeś/aś prawidłowego linku?"],["Get Premium","Zdobądź Premium"],["Cancel","Anuluj"],["It looks like the app cannot connect to the Padloc servers right now, probably due to a missing internet connection. You can still access your vaults and even create or edit Vault Items but your changes won\'t be synchronized until you\'re back online.","Wygląda na to, że aplikacji nie udało się połączyć z serwerami Padloc, prawdopodobnie z powodu braku połączenia z internetem. Masz nadal dostęp do swoich klucz - możesz nawet je tworzyć albo edytować. Nie będną jednak zsynchronizowane dopóki połączenie nie zostanie przywrócone."],["You\'re Offline","Jesteś offline"],["Do you want to enable biometric unlock for this device?","Czy chcesz włączyć odblokowywanie biometryczne dla tego urządzenia?"],["Setup","Konfiguracja"],["Biometric Unlock","Odblokowywanie biometryczne"],["Biometric authentication failed! Canceling Setup.","Autentykacja biometryczna zakończona niepowodzeniem! Konfiguracja zostanie anulowana."],["Setup Failed","Konfiguracja nieudana"],["Biometric unlock failed! Canceling Setup. (Reason: {0})","Odblokowanie biometryczne nieudana. Konfiguracja zostanie anulowana. (Powód: {0})"],["Please enter your master password!","Podaj swoje główne hasło"],["Enter Master Password","Podaj główne hasło"],["Wrong password! Please try again!","Niepoprawne hasło! Spróbuj ponownie!"],["Biometric unlock activated successfully!","Odblokowanie biometryczne aktywowane pomyślnie!"],["Are you sure you want to delete this attachment?","Czy na pewno chcesz usunąć ten załącznik?"],["Delete","Usuń"],["Delete Attachment","Usuń załącznik"],["Download failed!","Pobieranie nieudane!"],["Do you want to save this file to your disk? WARNING: Doing this will leave the file exposed and unprotected on your harddrive!","Czy chcesz zapisać ten plik na dysk? UWAGA: Ten plik będzie przechowywany na Twoim dysku w formie niezabezpieczonej!"],["Save","Zapisz"],["Save To Disk","Zapisz na dysk"],["Edit Name","Edytuj nazwę"],["Attachment Name","Nazwa załącznika"],["Please enter an attachment name!","Podaj nazwę załącznika!"],["Unknown File Type","Nieznany typ pliku"],["downloading... {0}/{1}","pobieranie... {0}/{1}"],["Unnamed","Nienazwany"],["uploading... {0}/{1}","wysyłanie... {0}/{1}"],["Failed to upload!","Nieudane wysyłanie!"],["Failed to download! Click to try again.","Pobieranie nieudane! Kliknij, aby ponowic."],["Update Billing Info","Zaktualizuj dane rozliczeniowe"],["Select A Country","Wybierz kraj"],["To update your billing info and payment method, please log in through our website (found under \\"Settings\\") or contact us at ","Aby zaktualizować swoje dane rozliczeniowe oraz metodę płatności, zaloguj się na naszej stronie (możńa znaleźć w zakładce \\"Ustawienia\\") albo skontaktuj się z nami."],["Payment Details","Szczegóły płatności"],["Billing Address","Adres rozliczeniowy"],["Billing Email","Rozliczeniowy adres e-mail"],["Name","Nazwa"],["Address","Adres"],["Postal Code","Kod pocztowy"],["City","Miast"],["Tax Info","Informacja podatkowa"],["This is a business","Na firmę"],["Tax ID","Numer VAT"],["Coupon Code","Kod zniżkowy"],["Add Later","Dodaj później"],["Something went wrong. Please try again later!","Coś poszło nie tak. Spróbuj ponownie później!"],["Add Payment Method","Dodaj metodę płatności"],["per user / month","za użytkownika / miesiąc"],["USD, billed annually","USD, płatne rocznie"],["Try For Free","Spróbuj za darmo"],["Please enter at least one email address!","Podaj przynajmniej jeden, poprawny adres e-mail!"],["You have entered too many email addresses! Please delete some before submitting!","Podałeś/aś zbyt dużą liczbę adresów e-mail! Usuń proszę parę przed zatwierdzeniem!"],["Some of the emails you entered appear to be invalid!","Parę z podanych adresów e-mail jest niepoprawnych!"],["Something went wrong! Please try again later!","Coś poszło nie tak. Spróbuj później!"],["Invite New Members","Zaproś nowych członków"],["Please enter up to {0} email addresses of the persons you would like to invite, separated by spaces or commas!","Podaj do {0} adresów e-mail osób, które zostaną zaproszone. Adresy rozdziel przecienkiem albo spacją!"],["Enter Email Address","Podaj adres e-mail"],["Submit","Wyślij"],["New Vault Item","Nowy element sejfu"],["Item Name","Nazwa elementów"],["Template","Szablon"],["Vault","Sejf"],["Create & Edit","Stwórz & Edytuj"],["You have reached the maximum number of items for this account. Upgrade to Premium to get unlimited items for your private vault!","Osiągnąłeś maksymalną liczbę elementów dla tego konta. Rozszerz swoje konto do wersji Premium, aby mieć nielimitowaną liczbę elementów w prywatnym sejfie!"],["You have reached the maximum number of items for this account!","Osiągnąłeś maksymalną liczbę elementów dla tego konta!"],["Please enter an organization name!","Podaj nazwę organizacji"],["Free For {0} Days","Farmowe przez {0} dni"],["then","a potem"],["per month","na miesiąc"],["{0} min","minimalnie {0}"],["{0} max","maksymalnie {0}"],["Seats","Stanowisko"],["Add Billing Info","Dodaj dane rozliczeniowe"],["Create Organization","Stwórz organizację"],["Organization Name","Nazwa organizacji"],["Create","Stwórz"],["Export Data","Eksportuj dane"],["Target Vault","Sejf docelowy"],["Format","Format"],["WARNING: Exporting to CSV format will save your data without encyryption of any kind which means it can be read by anyone. We strongly recommend exporting your data as a secure, encrypted file, instead!","UWAGA: eksport danych do CSV zapisze Twoje dane bez szyfrowania co oznacza, że mogą być przeczytane przez kogokolwiek. Zamiast tego, możesz wyeksportować dane jako zaszyfrowany plik, co polecamy!"],["Export {0} Items","Eksportuj elementy: {0}"],["Wybierz hasło do zabezpiecznia kopii!",""],["Choose Password","Wybierz hasło"],["Please choose a password!","Wybierz proszę hasło!"],["Please repeat the password!","Powtórz swoje hasło!"],["Password not repeated correctly!","Podane hasła się różnią!"],["Choose A Field Type","Wybierz typ pola"],["What kind of field you would like to add?","Jakiego typu pole chciałbyś/aś dodać?"],["Enter Notes Here","Podaj notatkę"],["Enter Secret","Podaj wrażliwe dane"],["Enter Password","Podaj hasło"],["Enter Value Here","Wpisz tutaj wartość"],["Enter Field Name","Podaj nazwę pola"],["Dash","Myślnik"],["Underscore","Podkreślnik"],["Slash","Slash"],["Space","Spacja"],["Generate Password","Wygeneruj hasło"],["passphrase","hasło"],["random string","losowy ciąg znaków"],["Word Separator","Separator słów"],["Language","Język"],["words","słowa"],["length","długość"],["Use","Użyj"],["Discard","Anuluj"],["Are you sure you want to delete this group?","Czy na pewno chcesz usunąć tą grupę?"],["Delete Group","Usuń grupę"],["Type \'DELETE\' to confirm","Wpisz \'DELETE\' aby potwierdzić"],["Enter Group Name","Podaj nazwę grupy"],["Search...","Szukaj..."],["Import Data","Importuj dane"],["IMPORTANT: Before importing, please make sure that your CSV data is structured according to Padlocks specific requirements!","UWAGA: Przed importowanie, upewnij się ze struktura pliku CSV spełnia wymagania."],["Learn More","Dowiedz się więcej"],["Import {0} Items","Importuj elementy: {0}"],["This file is protected by a password.","Tne plik zabezpieczony jest przez hasło."],["Wrong Password","Niepoprawne hasło."],["The number of imported items exceeds your remaining quota. Upgrade to Premium to get unlimited items for your private vault!","Liczba zaimportowanych elementów przekracza limit. Zdobądź wersję Preium, aby uzyskać nielimitowaną liczbę elementów w prywatnym sejfie!"],["The number of imported items exceeds your remaining quota.","Liczba zaimportowanych elementów przekracza limit."],["Successfully imported {0} items.","Zaimportowano pomyślnie elementy: {0}"],["This invite has expired","TO zaproszenie już wygasło."],["Accepted","Zaakceptowane"],["expires {0}","wygasa {0}"],["Confirm Membership","Potwierdź członkostwo"],["Organization Invite","Zaproszenia organizacji"],["Please wait for an admin to complete the process. You will be notified as soon as you receive access.","Poczekaj, aż administrator zakończony proces. Zostaniesz poinformwany/a jak tylko przyznany zostanie dostęp."],["Enter Confirmation Code","Podaj kod potwierdzający"],["If you haven\'t received the confirmation code yet, please ask the organization owner to provide it to you!","Jeśli nie otrzymałeś jeszcze kody potwierdzającego, poproś właściciela orgniazacji, aby Ci go podał!"],["They will also need the following confirmation code, which you should communicate to them separately:","Będą potrzebować następującego kodu potwierdzającego, który musisz im dostarczyć:"],["Resend","Wyślij ponownie"],["Please enter a confirmation code!","Podaj kod potwierdzający"],["You have successfully accepted the invite. You\'ll be notified once you\'ve been granted access.","Pomyślnie przyjąłeś zaprszoenie. Zostaniesz poinformowany jak przyznany zostanie Ci dostęp."],["Wrong confirmation code. Please try again!","Błędny kod. Spróbuj ponownie!"],["expired","wygasło"],["accepted","zaakceptowane"],["{0}","{0}"],["Confirm","Zatwierdź"],["Confirmation Code:","Kod potwierdzający:"],["Upgrade to Premium now and get 1GB of encrypted file storage!","Zdobądź Preium teraz i zyskaj pojemność 1 GB na przechowywanie Twoich plików!"],["Enter Item Name","Podaj nazwę elementu"],["Field","Pole"],["Attachment","Załącznik"],["Move","Przenieś"],["by {0}","przez {0}"],["Are you sure you want to delete this item?","Czy na pewno chcesz usunąć ten element?"],["Items with attachments cannot be moved!","Elementy z załącznikami nie mogą być przeniesione!"],["The selected file is too large! Only files of up to 5 MB are supported.","Wybrany plik jest za duży. Możesz wgrać pliki o maksymalym rozmiarze 5 MB."],["File uploaded successfully!","Plik wgrany pomyślnie"],["Favorites","Ulubione"],["Recently Used","Ostatnio użyte"],["Attachments","Załączniki"],["All Items","Wszystkie elementy"],["My Vault","Mój sejf"],["Tags","Tagi"],["You don\'t have any tags yet.","Nie masz jeszcze tagów"],["Your search did not match any items.","Twoje wyszukiwanie nie odpowiada żadnym elementom"],["This vault does not have any items yet.","Twój sejf nie zawiera jeszcze elementów."],["You don\'t have any attachments yet.","Nie masz jeszcze załączników."],["You don\'t have any favorites yet.","Nie masz jeszcze ulubionych."],["You don\'t have any recently used items!","Nie użyłeś żadnych elementów!"],["You don\'t have any items yet.","Nie masz jeszcze elementów."],["Type To Search","Wpisz, aby wyszukać"],["{0} items selected","Zaznaczono elementy: {0}"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be deleted. Do you want to proceed deleting the other items?","Niektóre zaznaczone elementy z Twojego sejfu nie mają uprawnień zapisu i nie mogą zostać usunięta. Czy chcesz kontynuwać z bez nich?"],["Yes","Tak"],["No","Nie"],["Are you sure you want to delete these items? This action can not be undone!","Czy na pewno chcesz usunąć te elementy? Akcja nie może być odwrócona!"],["Delete {0} Items","Usuń elementy: {0]=}"],["Some items in your selection have attachments and cannot be moved. Do you want to proceed moving the other items?","Niektóre elementy z zaznaczonych mają załączniki i nie mogą zostać przeniesione. Czy chcesz kontynuować z pozostałymi?"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be moved. Do you want to proceed moving the other items?","Niektóre elementy z zaznaczonych nie mają uprawnień do zapisu i nie mogą zostać przeniesione. Czy chcesz kontynuować z pozostałymi?"],["No Name","Brak nazwy"],["copied","skopiowany"],["No Fields","Brak pól!"],["This item has no fields.","Ten element nie ma pól."],["Email Address","Adres e-mail"],["Master Password","Główne hasło"],["Login","Login"],["New to Padloc?","Jesteś nowym użytkownikiem Padloc?"],["Sign Up Now","Dołącz teraz"],["Please enter a valid email address!","Podaj poprawny adres e-mail!"],["Please enter the confirmation code sent to your email address to proceed!","Podaj kod potwierdzający wysłany na Twoją skrzynkę pocztową!"],["One Last Step!","Ostatni krok!"],["Enter Verification Code","Podaj kod potwierdzający"],["Maximum number of tries exceeded! Please resubmit and try again!","Maksymalna liczba prób przekroczona. Prześlij ponownie i spróbuj jeszcze raz!"],["Wrong username or password. Please try again!","Zla nazwa użytkownika albo hasło. Spróbuj ponownie!"],["Can\'t remember your master password?","Nie pamiętasz hasła głównego?"],["Recover Account","Odzsykaj konto"],["Try Again","Spróbuj ponownie"],["An account with this email address does not exist!","Konto z takim adresem e-mail nie istnieje!"],["Sign Up","Dołącz"],["Remove","Usuń"],["Suspend","Zawieś"],["Remove Admin","Usuń administratora"],["Make Admin","Mianuj administratorem"],["Are you sure you want to remove this member from this organization?","Czy na pewno chcesz usunąć tego członka z tej organizacji?"],["Remove Member","Usuń członka"],["Are you sure you want to make this member an admin? Admins can manage vaults, groups and permissions.","Czy na pewno chcesz mianować tego członka administratorem? Administratorzy mogą zarządzać sejfami, grupami i uprawnieniami."],["Are you sure you want to remove this member as admin?","Czy na pewno chcesz odebrać administratora temu członkowi?"],["Are you sure you want to suspend this member?","Czy na pewno chcesz zawiesić tego członka?"],["Suspend Member","Zawieś członka"],["Groups","Grupy"],["Vaults","Sejfy"],["read","odczyt"],["write","zapis"],["Owner","Właściciel"],["Admin","Administrator"],["Suspended","Zawieszony"],["Items","Elementy"],["Orgs & Teams","Organizacje & Grupy"],["New Organization","Nowa organizacja"],["Settings","Ustawienia"],["{0} Items","Elementy: {0}"],["Move {0} To","Przenieś {0} do"],["No target vaults available!","Brak dostępnych sejfów!"],["Move Item","Przenieś element"],["Move Items","Przenieś elementy"],["Successfully created {0} invites!","Pomyślnie stworzono zaproszenia: {0}"],["Unsuspend","Odwieś"],["Are you sure you want to delete this organization? All associated vaults and the data within them will be lost! This action can not be undone.","Czy na pewno chcesz usunąć tą organizację? Wszystkie związane z nią dane zostaną utracone. Ta operacja nie może zostać odwrócona."],["Delete Organization","Usuń organizację"],["Rename Organization","Zmień nazwę organizacji"],["Company Name","nazwa firmy"],["Please enter a name!","Podaj nazwe!"],["Do you want to rotate this organizations cryptographic keys? All organization memberships will have to be reconfirmed but no data will be lost.","Czy chcesz przegenerować klucze kryptograficzne tej organizacji? Wszyscy członkowie będą musieli być zatwierdzeni ponownie, ale dane nie zostaną utracone"],["The organizations cryptographic keys have been rotated successfully and membership confirmation requests for all members have been sent out.","Klucz kryptograficznie organizacji zostały przegenerowane i prośba o potwierdzenie członków została wysłana."],["Members","Członkowie"],["This organization currently does not have an active subscription and has been put in \\"frozen\\" state as a result. While in this state, you won\'t be able to make any changes to members, groups or vaults of this organization.","Twoja organizacja nie posiada aktualnie aktywnej subskrypcji i jest w stanie \\"zamrożony\\". Oznacza to, że nie będzie można przeprowadzać żadnych zmian dla członków, grup i sejfów."],["Update Subscription","Aktualizuj subskrypcję"],["New Group","Nowa grupa"],["New Vault","Nowy sejf"],["Subscription","Subskrypcja"],["Billing Info","Dane rozliczeniowe"],["Security","Bezpieczeństwo"],["Rotate Cryptographic Keys","Przegeneruj klucze kryptograficzne"],["General","Ogólne"],["Change Organization Name","Zmień nazwę organizacji"],["Organizations allow you to securely share passwords, documents and other data within your family, team or any other kind of group!","Organizacje pozwalają na bezpieczne dzielenie się hasłami, dokumentami i innymi danymi w obrębie rodziny, zespołów czy innych grup!"],["Start Trial","Rozpocznij okres próbny"],["Scan QR Code","Zeskanuj kod QR"],["Failed to scan QR code. Error: ","Nie udało się zeskanować kodu QR: Błędy: "],["Please enter your email address and new master password.","Podaj swój adres e-mail i nowe hasło główne."],["New Master Password","Nowe hasło główne"],["WARNING: Weak Password!","UWAGA: Słabe hasło!"],["Repeat Master Password","Powtórz hasło główne"],["IMPORTANT, READ CAREFULLY: Padloc is designed in a way that makes it impossible for us to access the data encrypted in any of your vaults even if we wanted to. While this is essential to ensuring the security of your data, it also has the following implications:","WAŻNE, PRZECZYTAJ: Padloc jest zaprojektowany tak, aby niemożliwy był dla nas dostęp do sejfów. O ile to zapewnia pełne bezpieczeństwo Twoich danych, ciągnie za sobą pewne konsekwencje:"],["Any data stored in your private vault can not be recovered and will be permantently lost.","Wszelkie dane w prywatnym sejf nie mogą zostać odzyskane i zginą bezpowrotnie"],["All your organization memberships will be suspended temporarily until confirmed by the organization owner.","Wszyscy członkowie organizacji będą tymczasowo zawieszenie dopóki nie zostaną zatwierdzeni przez właściciela."],["All members of organizations you own will be suspended temporarily until confirmed by you.","Wszyscy członkowie organizacji będą tymczasowo zawieszeni dopóki nie zostaną zatwierdzeni przez Ciebie."],["Please enter a master password!","Podaj hasło główne:"],["You didn\'t repeat your master password correctly. Try again!","Niepowtórzyłeś hasła poprawnie. Spróbuj jeszcze raz!"],["The password you entered is weak which makes it easier for attackers to break the encryption used to protect your data. Try to use a longer password or include a variation of uppercase, lowercase and special characters as well as numbers!","Podane hasło jest słabe, co sprawia że jest łatwe do żlamania. Spróbuj podać dłusze hasło, albo użyj różnych znaków jak duże litery, małe litery czy znaki specjalne."],["Choose Different Password","Wybierz inne hasło"],["Use Anyway","Użyj mimowszystko"],["WARNING: Weak Password","UWAGA: Słabe hasło"],["To complete the account recovery process, please enter the confirmation code sent to your email address!","Aby zakończyć proces odzyskiwania hasła, podaj kod potwierdzający wysłany na skrzynkę pocztową!"],["Account recovery successful!","Konto odzyskane poprawnie!"],["Report Errors","Zgłoś błędy"],["{0} Errors Detected","Wybrano błędy: {0}"],["Padloc has registered {0} errors during your use of the app. These errors may not have any impact on functionality and can often be ignored, but reporting them may help us diagnose problems, identify possible failure modes and generally improve the stability of the app.","Padloc zarejestrował błędy w liczbie: {0}. Te błędy nie mają wpływo na funkcjonowanie aplikacji i mogą często być zignorowane. Ale zgloszenie ich może pomóc rozwiązywać problemy, identyfikować przyszłe blędy oraz poprawiać stabilność aplikacji."],["Profile","Profil"],["Log Out","Wyloguj"],["Change Master Password","Zmień hasło główne"],["Auto Lock","Auto-blokowanie"],["Lock Automatically","Zablokuj automatycznie"],[" min"," min"],["After","Po"],["Enable Biometric Unlock","Włącz odblokowywanie biometryczne"],["Import / Export","Import / Eksport"],["Import...","Importuj..."],["Export...","Eskportuj..."],["Support","Wsparcie"],["Website","Strona"],["Contact Support","Skontaktuj się z działem wsparcia"],["Danger Zone","Niebezpieczna strefa"],["Delete Account","Usuń konto"],["Edit Profile","Edytuj profil"],["Do you really want to log out?","Czy na pewno chcesz się wylogować?"],["Please enter your current password!","Podaj swoje obecne hasło"],["Enter Current Password","Podaj obecne hasło"],["Now choose a new master password!","Teraz wybierz nowe główne hasło!"],["Enter New Password","Podaj nowe hasło"],["Please enter a password!","Podaj hasło!"],["Please confirm your new password!","Powtórz swoje nowe hasło!"],["Repeat New Password","Powtórz nowe hasło"],["Master password changed successfully.","Główne hasło zmienione poprawnie."],["Please enter your master password to proceed.","Podaj główne hasło, aby kontynuować."],["Are you sure you want to delete this account? All associated vaults and the data within them will be lost and any active subscriptions will be canceled immediately. This action can not be undone!","Czy na pewno chcesz usunąć to konto? Wszystkie sejfy i dane zostaną utracone a subskrypcje anulowane. Nie można odwrócić tej akcji."],["Are you sure you want to disable biometric unlock?","Czy na pewno chcesz wyłączyć odblokowywanie biometryczne?"],["Welcome to Padloc! Let\'s get you started by creating an account for you.","Witamy w Padloc. Zacznijmy od stworzenia konta dla Ciebie."],["Your email address serves as your username and allows us to get in touch with you. Don\'t worry, we would never send you any spam!","Twój adres e-mail sluży jako nazwa użytkownika i pozwala nam być w kontakcie z Tobą. Nie martw się, nigdy nie wyślemy spamu!"],["Your Name","Twoje imię"],["What should we call you?","Jak powinniśmy Cię nazywać?"],["Continue","Kontynuuj"],["Already have an account?","Posiadasz już konto?"],["Sign In","Zaloguj się"],["You\'ve Got Mail!","Otrzymałeś pocztę!"],["To verify your email address, please enter the confirmation code we sent to {0}.","Aby zweryfikować adres e-mail, podaj kod który wysłaliśmy Ci na {0}."],["Confirmation Code","Kod potwierzający"],["Say hello to your","Powiedz Cześć swojemu"],["It\'s the last password you\'ll ever have to remember! Please memorize it and never reveal it to anyone (not even us)! We recommend writing it down on a piece of paper and storing it somewhere safe, at least until you have it safely memorized.","To jest ostatnie hasło, które musisz zapamięć. Zaszyj je w swojej pamięci i nigdy nikomu o nim nie mów (nawet nam). Zalecamy, abys je gdzieś zapisal i trzymał w bezpiecznym miejscu. Przynajmniej do momentu, aż je w pełni zapamiętasz."],["[Tap To Reveal]","[Stuknij, aby pokazać]"],["[Hover To Reveal]","[Najedź, aby pokazać]"],["This random passphrase was generated just for you and is designed to be both secure and easy to remember. Don\'t like it?","To losowe hasło zostało wygenerowane tylko dla Ciebie, tak aby było bezpieczne i łatwie do zapamiętania. Nie podoba się?"],["Try Another One","Spróbuj inne"],["Choose Your Own","Wybierz swoje"],["An account with this email address already exists!","Konto z takim adresem e-mail już istnieje!"],["Change Email","Zmień e-mail"],["We recommend using a randomly generated password that is both strong and easy to remember.","Zalecamy użycie wygenerowanego hasła, które jest zarówno silne jak i łatwie do zapamiętania."],["Keep This One","Zatrzymaj to"],["Generate Another","Wygeneruj inne"],["Choose My Own","Wybiorę sam"],["Want A Different Master Password?","Chcesz inne hasło główne?"],["Choose Own Master Password","Wybierz hasło główne!"],["Resume Subscription","Wznów subskrypcję"],["Cancel Subscription","Anuluj subskrypcję"],["Update Plan","Zaktualizuj plan"],["Are you sure you want to downgrade to the Free Plan?","Czy na pewno chcesz obniżyć to planu darmowego?"],["Downgrade","Downgrade"],["No Plan Selected","Brak planu"],["Unlimited","Nielimitowane"],["{0} / Year","{0} / rok"],["Canceled ({0} days left)","Anulowany (pozostało dni: {0})"],["Authentication Required","Wymagana autentykacja"],["Inactive","Niekatywny"],["Trialing ({0} days left)","Wersja próbna (pozostało dni: {0})"],["Choose Plan","Wybierz plan"],["Complete Payment","Zakończ płatność"],["Downgrade To Free Plan","Obniż do planu darmowego"],["Add Tag","Dodaj Tag"],["Choose A Template","Wybierz szablon"],["What kind of item you would like to add?","Jakiego typu element chcesz dodać?"],["Invalid Code","Niepoprawny kod"],["Logged In As","Zalogowany jako"],["Unlock","Odblokuj"],["Wrong password! Please try again.","Błędne hasło. Spróbuj ponownie."],["Logout / Switch Account","Wyloguj / Przełącz konto"],["Forgot Password","Przypomnij hasło"],["Are you sure you want to log out of this account?","Czy na pewno chcesz się wylogować?"],["Biometric unlock expired. Complete setup to reeneable.","Biometryczne odblokowanie wygasło. Potwórz konfigurację, aby włączyć ponownie."],["Biometric unlock failed! Reason: {0}","Biometryczne odblokowanie nieudane. Powód: {0}"],["Failed To Unlock","Nieudało się odblokować"],["Update","Aktualizuj"],["Storage limit exceeded!","Przekroczono limit dla przechowywanych danych!"],["Upload failed! Please try again!","Wysyłanie nie udało się. Spróbuj ponownie!"],["Upload Attachment","Wgraj załącznik"],["Unkown File Type","Nieznany typ pliku"],["Retry Upload","Ponów wgrywanie"],["Upload","Wgraj"],["Are you sure you want to delete this vault? All the data stored in it will be lost! This action can not be undone.","Czy na pewno chcesz usunąć ten sejf? Wszystkie dane przechowywane w środku zostaną utracone. Nie da się tego cofnąć."],["Delete Vault","Usuń sejf"],["Enter Vault Name","Podaj nazwę sejfu"],["Username","Nazwa użytkownika"],["Password","Hasło"],["URL","Link"],["Notes","Notatki"],["Your session has expired. Please log in again!","Twoja sesja wygasła. Zaloguj się ponownie!"],["A new update is ready to install! Do you want to install it now?","Nowa aktualizacja jest gotowa do zainstalowania! Czy chcesz zainstalować teraz?"],["Instaluj & Przeładuj",""],["Later","Później"],["Date","Data"],["Month","Miesiąc"],["Credit Card Number","Numer karty kredytowej"],["Phone Number","Numer telefonu"],["PIN","PIN"],["Two-Factor Token","Token dwu-składnikowy"],["Note","Notatka"],["Other","Inne"],["Credit Card","Karta kredytowa"],["Card Number","Numer karty"],["Card Owner","Właściciel karty"],["Valid Until","Ważna do"],["CVC","CVC"],["Bank Account","Numer konta"],["Account Owner","Właściciel konta"],["IBAN","IBAN"],["BIC","BIC"],["Card PIN","PIN karty"],["WIFI Password","Hasło WIFI"],["Passport","Paszport"],["Full Name","Imię i nazwisko"],["Passport Number","Numer paszportu"],["Country","Państwo"],["Birthdate","Data urodzenia"],["Birthplace","Miejsce urodzenia"],["Issued On","Podpisane na"],["Expires","Wygasa"],["Document","Dokument"],["Custom","Własne"],["{0} on {1}","{0} na {1}"],["{0} Device","Urządzenie {0}"]]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_translations_ru_json.chunk.js b/cypress/fixtures/v3-client/locale_res_translations_ru_json.chunk.js deleted file mode 100644 index 3b046a47..00000000 --- a/cypress/fixtures/v3-client/locale_res_translations_ru_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_translations_ru_json"],{ - -/***/ "../locale/res/translations/ru.json": -/*!******************************************!*\ - !*** ../locale/res/translations/ru.json ***! - \******************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('[["OK","OK"],["o f f l i n e","о ф л а й н"],["Could not find invite! Did you use the correct link?","Приглашение не найдено! Проверьте правильность ссылки."],["Get Premium","Получить Премиум"],["Cancel","Отмена"],["It looks like the app cannot connect to the Padloc servers right now, probably due to a missing internet connection. You can still access your vaults and even create or edit Vault Items but your changes won\'t be synchronized until you\'re back online.","Похоже сейчас приложение не может соединиться с Padloc сервером, возможно отсутствует интернет соединение. У вас есть доступ к локальному хранилищу, вы можете создавать и редактировать записи, но они не будут синхронизированы до восстановления соединения с интернетом."],["You\'re Offline","Нет соединения с интернетом"],["Do you want to enable biometric unlock for this device?","Желаете включить биометрическую разблокировку для этого устройства?"],["Setup","Настройка"],["Biometric Unlock","Биометрическая разблокировка"],["Biometric authentication failed! Canceling Setup.","Биометрическая аутентификация не удалась! Настройка прекращается."],["Setup Failed","Настройка не удалась"],["Biometric unlock failed! Canceling Setup. (Reason: {0})","Биометрическая аутентификация не удалась! Настройка прекращается. (Причина: {0})"],["Please enter your master password!","Введите мастер-пароль!"],["Enter Master Password","Ввод мастер пароля"],["Wrong password! Please try again!","Неверный пароль! Попробуйте снова!"],["Biometric unlock activated successfully!","Биометрическая разблокировка активирована успешно!"],["Are you sure you want to delete this attachment?","Вы уверены, что желаете удалить это вложение?"],["Delete","Удалить"],["Delete Attachment","Удалить вложение"],["Download failed!","Загрузка не удалась!"],["Do you want to save this file to your disk? WARNING: Doing this will leave the file exposed and unprotected on your harddrive!","Желаете сохранить этот файл на диск? ВНИМАНИЕ: Файл, сохраненный на диске будет не зашифрован и не защищен от просмотра!"],["Save","Сохранить"],["Save To Disk","Сохранить на диск"],["Edit Name","Редактировать название"],["Attachment Name","Название вложения"],["Please enter an attachment name!","Введите название вложения"],["Unknown File Type","Неизвестный тип файла"],["downloading... {0}/{1}","загрузка... {0}/{1}"],["Unnamed","Без названия"],["uploading... {0}/{1}","закачка... {0}/{1}"],["Failed to upload!","Закачка не удалась!"],["Failed to download! Click to try again.","Загрузка не удалась! Щелкните, чтобы повторить попытку."],["Update Billing Info","Обновление информации по выставлению счетов"],["Select A Country","Выберите страну"],["To update your billing info and payment method, please log in through our website (found under \\"Settings\\") or contact us at ","Для обновления информации по выставлению счетов и метода оплаты залогиньтесь на нашем сайте (доступно в разделе \\"Настройки\\") или свяжитесь с нами через "],["Payment Details","Детали платежа"],["Billing Address","Адрес для выставления счета"],["Billing Email","Email для выставления счета"],["Name","Имя"],["Address","Адрес"],["Postal Code","Почтовый индекс"],["City","Город"],["Tax Info","Налоговая информация"],["This is a business","Это рабочий"],["Tax ID","ИНН"],["Coupon Code","Код купона"],["Add Later","Добавить позднее"],["Something went wrong. Please try again later!","Что-то пошло не так. Попробуйте позже!"],["Add Payment Method","Добавить метод оплаты"],["per user / month","на пользователя / в месяц"],["USD, billed annually","USD, ежегодный платеж"],["Try For Free","Попробуйте бесплатно"],["Please enter at least one email address!","Пожалуйста, введите как минимум один email адрес!"],["You have entered too many email addresses! Please delete some before submitting!","Вы ввели слишком много адресов! Удалите некоторые перед отправкой!"],["Some of the emails you entered appear to be invalid!","Некоторые из введенных адресов некорректны!"],["Something went wrong! Please try again later!","Что-то пошло не так! Попробуйте позже!"],["Invite New Members","Пригласить новых членов"],["Please enter up to {0} email addresses of the persons you would like to invite, separated by spaces or commas!","Введите до {0} email адресов людей, которых вы хотите пригласить, разделяя адреса пробелом или запятой!"],["Enter Email Address","Введите email адрес"],["Submit","Отправить"],["New Vault Item","Новая запись в хранилище"],["Item Name","Название записи"],["Template","Шаблон"],["Vault","Хранилище"],["Create & Edit","Создать и редактировать"],["You have reached the maximum number of items for this account. Upgrade to Premium to get unlimited items for your private vault!","Вы достигли максимума записей для этого аккаунта. Перейдите на Премиум чтобы получить неограниченное количество записей для приватного хранилища!"],["You have reached the maximum number of items for this account!","Вы достигли максимума записей для этого аккаунта."],["Please enter an organization name!","Введите название организации!"],["Free For {0} Days","Бесплатно на {0} дней"],["then","далее"],["per month","на месяц"],["{0} min","{0} min"],["{0} max","{0} max"],["Seats","Мест"],["Add Billing Info","Добавить информацию для выставления счетов"],["Create Organization","Создать организацию"],["Organization Name","Название организации"],["Create","Создать"],["Export Data","Экспортировать данные"],["Target Vault","Целевое хранилище"],["Format","Формат"],["WARNING: Exporting to CSV format will save your data without encyryption of any kind which means it can be read by anyone. We strongly recommend exporting your data as a secure, encrypted file, instead!","ВНИМАНИЕ: Экспорт в CSV формате сохранит данные не зашифрованными, что значит, что их сможет прочесть кто угодно. Мы настоятельно рекомендуем экспортировать данные наиболее безопасным методом в виде зашифрованного файла!"],["Export {0} Items","Экспорт {0} записей"],["Please choose a password to protect this backup with!","Задайте пароль для защиты этого архива"],["Choose Password","Задайте пароль"],["Please choose a password!","Пожалуйста, задайте пароль!"],["Please repeat the password!","Повторите пароль!"],["Password not repeated correctly!","Пароли не совпадают!"],["Choose A Field Type","Выберите тип поля"],["What kind of field you would like to add?","Какого типа поле вы хотите добавить?"],["Enter Notes Here","Добавьте заметки"],["Enter Secret","Введите секрет"],["Enter Password","Введите пароль"],["Enter Value Here","Введите значение"],["Enter Field Name","Введите название поля"],["Dash","Тире"],["Underscore","Подчеркивание"],["Slash","Слэш"],["Space","Пробел"],["Generate Password","Сгенерировать пароль"],["passphrase","парольная фраза"],["random string","случайная строка"],["Word Separator","Разделитель слов"],["Language","Язык"],["words","слова"],["length","длина"],["Use","Использовать"],["Discard","Отменить"],["Are you sure you want to delete this group?","Вы уверены, что хотите удалить эту группу?"],["Delete Group","Удалить группу"],["Type \'DELETE\' to confirm","Введите \'DELETE\' для подтверждения"],["Enter Group Name","Введите название группы"],["Search...","Поиск..."],["Import Data","Импорт данных"],["IMPORTANT: Before importing, please make sure that your CSV data is structured according to Padlocks specific requirements!","ВНИМАНИЕ: Перед импортом убедитесь, что данные в CSV формате структурированы в соответствии с требованиями Padlock!"],["Learn More","Узнать больше"],["Import {0} Items","Импорт {0} записей"],["This file is protected by a password.","Этот файл защищен паролем."],["Wrong Password","Неверный пароль"],["The number of imported items exceeds your remaining quota. Upgrade to Premium to get unlimited items for your private vault!","Количество импортированных записей превышает оставшийся лимит. Перейдите на Премиум, чтобы получить неограниченное количество записей в приватном хранилище!"],["The number of imported items exceeds your remaining quota.","Количество импортированных записей превышает оставшийся лимит."],["Successfully imported {0} items.","Успешно импортировано {0} записей."],["This invite has expired","Срок действия этого приглашения истёк"],["Accepted","Принято"],["expires {0}","истекает {0}"],["Confirm Membership","Подтвердить членство"],["Organization Invite","Приглашение организации"],["Please wait for an admin to complete the process. You will be notified as soon as you receive access.","Дождитесь подтверждения администратора для продолжения процесса. Вы будете уведомлены о получении доступа."],["Enter Confirmation Code","Введите код подтверждения"],["If you haven\'t received the confirmation code yet, please ask the organization owner to provide it to you!","Если вы еще не получили код подтверждения, запросите его у владельца вашей организации!"],["They will also need the following confirmation code, which you should communicate to them separately:","Им также потребуется следующий код подтверждения, который вы должны сообщить им отдельно:"],["Resend","Послать снова"],["Please enter a confirmation code!","Введите код подтверждения!"],["You have successfully accepted the invite. You\'ll be notified once you\'ve been granted access.","Вы успешно подтвердили приглашение. Вы будете уведомлены, как только получите доступ."],["Wrong confirmation code. Please try again!","Неверный код подтверждения. Попробуйте снова!"],["expired","устарел"],["accepted","принято"],["{0}","{0}"],["Confirm","Подтвердить"],["Confirmation Code:","Код подтверждения:"],["Upgrade to Premium now and get 1GB of encrypted file storage!","Перейдите на Премиум сейчас и получите 1Гб зашифрованного файлового хранилища!"],["Enter Item Name","Введите название записи"],["Field","Поле"],["Attachment","Вложение"],["Move","Переместить"],["by {0}","по {0}"],["Are you sure you want to delete this item?","Вы уверены, что хотите удалить эту запись?"],["Items with attachments cannot be moved!","Записи с вложениями не могут быть перемещены!"],["The selected file is too large! Only files of up to 5 MB are supported.","Выбранный файл слишком большой! Поддерживаются файлы до 5Мб."],["File uploaded successfully!","Файл закачен успешно!"],["Favorites","Избранное"],["Recently Used","Недавние"],["Attachments","Вложения"],["All Items","Все записи"],["My Vault","Моё хранилище"],["Tags","Тэги"],["You don\'t have any tags yet.","У вас нет ни одного тэга."],["Your search did not match any items.","Поиск не дал результатов."],["This vault does not have any items yet.","В этом хранилище нет записей."],["You don\'t have any attachments yet.","У вас нет ни одного вложения."],["You don\'t have any favorites yet.","У вас нет элементов в избранном."],["You don\'t have any recently used items!","У вас нет недавно использованных записей!"],["You don\'t have any items yet.","У вас нет записей."],["Type To Search","Введите для поиска"],["{0} items selected","{0} записей выбрано"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be deleted. Do you want to proceed deleting the other items?","Некоторые выбранные записи находятся в хранилищах, к которым у вас нет доступа на запись, и не могут быть удалены. Удалить остальные записи?"],["Yes","Да"],["No","Нет"],["Are you sure you want to delete these items? This action can not be undone!","Вы уверены, что следует удалить эти записи? Это действие необратимо!"],["Delete {0} Items","Удалить {0} записей"],["Some items in your selection have attachments and cannot be moved. Do you want to proceed moving the other items?","Некоторые выбранные записи имеют вложения и не могут быть перемещены. Переместить оставшиеся?"],["Some items in your selection are from Vaults you don\'t have write access to and cannot be moved. Do you want to proceed moving the other items?","Некоторые выбранные записи находятся в хранилищах, к которым у вас нет доступа на запись, и не могут быть перемещены. Продолжить перемещение оставшихся?"],["No Name","Без имени"],["copied","скопировано"],["No Fields","Нет полей"],["This item has no fields.","Эта запись не имеет полей."],["Email Address","Email адрес"],["Master Password","Мастер пароль"],["Login","Логин"],["New to Padloc?","Впервые в Padloc?"],["Sign Up Now","Зарегистрироваться"],["Please enter a valid email address!","Введите действительный email!"],["Please enter the confirmation code sent to your email address to proceed!","Введите код подтверждения, посланный на ваш email!"],["One Last Step!","Еще один шаг!"],["Enter Verification Code","Введите код подтверждения"],["Maximum number of tries exceeded! Please resubmit and try again!","Превышено максимальное количество попыток! Переотправьте и попробуйте снова!"],["Wrong username or password. Please try again!","Неверное имя пользователя или пароль! Попробуйте снова!"],["Can\'t remember your master password?","Не можете вспомнить ваш мастер-пароль?"],["Recover Account","Восстановить аккаунт"],["Try Again","Попробуйте снова"],["An account with this email address does not exist!","Аккаунт с указанным адресом не существует!"],["Sign Up","Зарегистрироваться"],["Remove","Удалить"],["Suspend","Приостановить"],["Remove Admin","Убрать права администратора"],["Make Admin","Дать права администратора"],["Are you sure you want to remove this member from this organization?","Вы уверены, что хотите удалить этого члена организации?"],["Remove Member","Удалить члена организации"],["Are you sure you want to make this member an admin? Admins can manage vaults, groups and permissions.","Вы уверены, что хотите предоставить этому члену организации права администратора? Администратор может управлять хранилищами, группами и правами."],["Are you sure you want to remove this member as admin?","Вы уверены, что хотите убрать у этого пользователя права администратора?"],["Are you sure you want to suspend this member?","Вы уверены, что хотите приостановить членство этого пользователя в организации?"],["Suspend Member","Приостановить членство пользователя"],["Groups","Группы"],["Vaults","Хранилища"],["read","читать"],["write","писать"],["Owner","Владелец"],["Admin","Администратор"],["Suspended","Приостановлен"],["Items","Записи"],["Orgs & Teams","Организации и команды"],["New Organization","Новая организация"],["Settings","Настройки"],["{0} Items","{0} записей"],["Move {0} To","Переместить {0} в"],["No target vaults available!","Нет доступных целевых хранилищ!"],["Move Item","Переместить запись"],["Move Items","Переместить записи"],["Successfully created {0} invites!","{0} приглашений созданы успешно!"],["Unsuspend","Разблокировать"],["Are you sure you want to delete this organization? All associated vaults and the data within them will be lost! This action can not be undone.","Вы уверены, что хотите удалить эту организацию? Все хранилища организации и данные в них будут утеряны! Эта операция необратима!"],["Delete Organization","Удалить организацию"],["Rename Organization","Переименовать организацию"],["Company Name","Название компании"],["Please enter a name!","Пожалуйста, введите название!"],["Do you want to rotate this organizations cryptographic keys? All organization memberships will have to be reconfirmed but no data will be lost.","Вы хотите сменить криптографический ключ организации? Все члены организации должны будут заново подтвердить членство но все данные будут сохранены."],["The organizations cryptographic keys have been rotated successfully and membership confirmation requests for all members have been sent out.","Криптографический ключ организации изменен успешно, запросы на подтверждение разосланы членам организации."],["Members","Члены организации"],["This organization currently does not have an active subscription and has been put in \\"frozen\\" state as a result. While in this state, you won\'t be able to make any changes to members, groups or vaults of this organization.","Данная организация не имеет активной подписки и находится в \\"замороженном\\" состоянии. В этом состоянии вы не можете производить изменения членов организации, групп или хранилищ."],["Update Subscription","Обновить подписку"],["New Group","Новая группа"],["New Vault","Новое хранилище"],["Subscription","Подписка"],["Billing Info","Платежная информация"],["Security","Безопасность"],["Rotate Cryptographic Keys","Сменить криптографический ключ"],["General","Общие"],["Change Organization Name","Сменить название организации"],["Organizations allow you to securely share passwords, documents and other data within your family, team or any other kind of group!","Организации позволяют безопасно совместно использовать пароли, документы и другие данные в вашей семье, команде и любых других группах!"],["Start Trial","Начать пробный период"],["Scan QR Code","Сканировать QR-код"],["Failed to scan QR code. Error: ","Не удалось отсканировать QR-код. Ошибка: "],["Please enter your email address and new master password.","Введите ваш email адрес и новый мастер-пароль."],["New Master Password","Новый мастер-пароль"],["WARNING: Weak Password!","ВНИМАНИЕ: Слабый пароль!"],["Repeat Master Password","Повторите мастер пароль"],["IMPORTANT, READ CAREFULLY: Padloc is designed in a way that makes it impossible for us to access the data encrypted in any of your vaults even if we wanted to. While this is essential to ensuring the security of your data, it also has the following implications:","ВАЖНО, ПРОЧТИТЕ ВНИМАТЕЛЬНО: Padloc спроектирован так, что не позволяет нам получить доступ к зашифрованным данным в ваших хранилищах, даже в случае если бы мы захотели его получить. Это важно для обеспечения уверенности в безопасности ваших данных, но также подразумевает следующее:"],["Any data stored in your private vault can not be recovered and will be permantently lost.","Все данные в вашем приватном хранилище не могут быть восстановлены и будут утеряны навсегда."],["All your organization memberships will be suspended temporarily until confirmed by the organization owner.","Ваше членство во всех организациях будет приостановлено до подтверждения владельцем организации."],["All members of organizations you own will be suspended temporarily until confirmed by you.","Членство всех пользователей в ваших организациях будет приостановлено до подтверждения вами."],["Please enter a master password!","Введите ваш мастер-пароль!"],["You didn\'t repeat your master password correctly. Try again!","Повторно введенный мастер-пароль не совпадает с первоначальным. Попробуйте снова!"],["The password you entered is weak which makes it easier for attackers to break the encryption used to protect your data. Try to use a longer password or include a variation of uppercase, lowercase and special characters as well as numbers!","Вы ввели слабый пароль, что может позволить злоумышленникам взломать защиту ваших данных. Попробуйте использовать более длинный пароль или включить в него различные символы в разных регистрах и специальные символы!"],["Choose Different Password","Выберите другой пароль"],["Use Anyway","Использовать этот"],["WARNING: Weak Password","ВНИМАНИЕ: Слабый пароль"],["To complete the account recovery process, please enter the confirmation code sent to your email address!","Для завершения процесса восстановления аккаунта, введите код подтверждения высланный на ваш email!"],["Account recovery successful!","Аккаунт успешно восстановлен!"],["Report Errors","Сообщить об ошибке"],["{0} Errors Detected","Ошибок обнаружено: {0}"],["Padloc has registered {0} errors during your use of the app. These errors may not have any impact on functionality and can often be ignored, but reporting them may help us diagnose problems, identify possible failure modes and generally improve the stability of the app.","Padloc обнаружил {0} ошибок в работе приложения. Эти ошибки могут не оказывать влияния на функционал и скорее всего могут быть проигнорированы, но если вы сообщите нам о них, это поможет диагностировать возможные проблемы и улучшить функциональность и стабильность приложения."],["Profile","Профиль"],["Log Out","Выйти"],["Change Master Password","Сменить мастер пароль"],["Auto Lock","Автоматическая блокировка"],["Lock Automatically","Блокировать автоматически"],[" min"," мин."],["After","После"],["Enable Biometric Unlock","Включить биометрическую разблокировку"],["Import / Export","Импорт / Экспорт"],["Import...","Импорт..."],["Export...","Экспорт..."],["Support","Поддержка"],["Website","Сайт"],["Contact Support","Написать в поддержку"],["Danger Zone","Опасный раздел"],["Delete Account","Удалить аккаунт"],["Edit Profile","Редактировать профиль"],["Do you really want to log out?","Вы действительно хотите выйти?"],["Please enter your current password!","Введите ваш текущий пароль!"],["Enter Current Password","Ввод текущего пароля"],["Now choose a new master password!","Выберите новый мастер-пароль!"],["Enter New Password","Ввод нового пароля"],["Please enter a password!","Пожалуйста введите пароль!"],["Please confirm your new password!","Подтвердите ваш новый пароль!"],["Repeat New Password","Подтверждение пароля"],["Master password changed successfully.","Мастер-пароль изменен успешно."],["Please enter your master password to proceed.","Введите ваш мастер-пароль для продолжения."],["Are you sure you want to delete this account? All associated vaults and the data within them will be lost and any active subscriptions will be canceled immediately. This action can not be undone!","Вы уверены, что хотите удалить этот аккаунт? Все хранилища этого аккаунта и данные в них будут потеряны, все активные подписки будут отменены. Эта операция необратима!"],["Are you sure you want to disable biometric unlock?","Вы уверены, что хотите отключить биометическую разблокировку?"],["Welcome to Padloc! Let\'s get you started by creating an account for you.","Добро пожаловать в Padloc! Давайте начнем с создания аккаунта для вас."],["Your email address serves as your username and allows us to get in touch with you. Don\'t worry, we would never send you any spam!","Ваш Email адрес будет служить именем пользователя и позволит связаться с вами. Не беспокойтесь, мы не посылаем никакого спама!"],["Your Name","Ваше имя"],["What should we call you?","Как к вам обращаться?"],["Continue","Продолжить"],["Already have an account?","Уже есть аккаунт?"],["Sign In","Войти"],["You\'ve Got Mail!","У вас есть сообщения!"],["To verify your email address, please enter the confirmation code we sent to {0}.","Для проверки email, введите код подтверждения, который мы выслали на {0}."],["Confirmation Code","Код подтверждения"],["Say hello to your",""],["It\'s the last password you\'ll ever have to remember! Please memorize it and never reveal it to anyone (not even us)! We recommend writing it down on a piece of paper and storing it somewhere safe, at least until you have it safely memorized.","Это последний пароль, который вам придется запомнить! Запомните его и никогда никому не сообщайте (даже нам)! Мы советуем записать его на бумаге и хранить в надежном месте, как минимум до тех пор пока вы его хорошо не запомните."],["[Tap To Reveal]","[Нажмите чтобы показать]"],["[Hover To Reveal]","[Наведите мышь, чтобы показать]"],["This random passphrase was generated just for you and is designed to be both secure and easy to remember. Don\'t like it?","Этот случайный пароль сформирован для вас, так, чтобы быть надежным паролем и при этом легко запоминаться. Вам он не нравится?"],["Try Another One","Попробуйте другой"],["Choose Your Own","Задайте свой"],["An account with this email address already exists!","Аккаунт с этим email уже существует!"],["Change Email","Сменить email"],["We recommend using a randomly generated password that is both strong and easy to remember.","Мы рекомендуем использовать случайно сгенерированный надежный пароль, который легко запомнить."],["Keep This One","Использовать этот"],["Generate Another","Сгенерировать другой"],["Choose My Own","Задать мой собственный"],["Want A Different Master Password?","Хотите другой мастер-пароль?"],["Choose Own Master Password","Задайте свой мастер-пароль"],["Resume Subscription","Возобновить подписку"],["Cancel Subscription","Отменить подписку"],["Update Plan","Обновить тарифный план"],["Are you sure you want to downgrade to the Free Plan?","Вы уверены, что хотите изменить тарифный план на бесплатный?"],["Downgrade","Сменить тарифный план"],["No Plan Selected","Тарифный план не выбран"],["Unlimited","Без ограничений"],["{0} / Год",""],["Canceled ({0} days left)","Отменено ({0} дней осталось)"],["Authentication Required","Требуется аутентификация"],["Inactive","Неактивно"],["Trialing ({0} days left)","Пробный период ({0} дней осталось)"],["Choose Plan","Выберите тарифный план"],["Complete Payment","Завершить платеж"],["Downgrade To Free Plan","Понизить до бесплатного тарифа"],["Add Tag","Добавить тег"],["Choose A Template","Выберите шаблон"],["What kind of item you would like to add?","Какой тип записи вы хотите добавить?"],["Invalid Code","Неверный код"],["Logged In As","Вход как"],["Unlock","Разблокировать"],["Wrong password! Please try again.","Неверный пароль! Попробуйте снова."],["Logout / Switch Account","Выйти / Сменить аккаунт"],["Forgot Password","Забыли пароль"],["Are you sure you want to log out of this account?","Вы уверены, что хотите выйти из этого аккаунта?"],["Biometric unlock expired. Complete setup to reeneable.","Биометрическая разблокировка устарела. Настройте ее заново."],["Biometric unlock failed! Reason: {0}","Биометрическая разблокировка не удалась! Причина: {0}"],["Failed To Unlock","Разблокировка не удалась"],["Update","Обновить"],["Storage limit exceeded!","Превышен лимит хранения!"],["Upload failed! Please try again!","Закачка не удалась! Попробуйте снова!"],["Upload Attachment","Закачка вложения"],["Unkown File Type","Неизвестный тип файла"],["Retry Upload","Повторить закачку"],["Upload","Закачка"],["Are you sure you want to delete this vault? All the data stored in it will be lost! This action can not be undone.","Вы уверены, что хотите удалить это хранилище? Все данные в хранилище будут потеряны! Это действие необратимо."],["Delete Vault","Удалить хранилище"],["Enter Vault Name","Введите название хранилища"],["Username","Имя пользователя"],["Password","Пароль"],["URL","URL"],["Notes","Заметки"],["Your session has expired. Please log in again!","Ваша сессия устарела. Повторите вход!"],["A new update is ready to install! Do you want to install it now?","Новые обновления готовы к установке! Хотите установить их сейчас?"],["Install & Reload","Установить и перезагрузить"],["Later","Позже"],["Date","Дата"],["Month","Месяц"],["Credit Card Number","Номер кредитной карты"],["Phone Number","Номер телефона"],["PIN","PIN"],["2FA Token","Токен 2FA"],["Note","Заметки"],["Other","Другое"],["Credit Card","Кредитная карта"],["Card Number","Номер карты"],["Card Owner","Владелец карты"],["Valid Until","Действительно до"],["CVC","CVC"],["Bank Account","Номер счета"],["Account Owner","Владелец счета"],["IBAN","IBAN"],["BIC","BIC"],["Card PIN","PIN карты"],["WIFI Password","Пароль WiFi"],["Passport","Паспорт"],["Full Name","Полное имя"],["Passport Number","Номер паспорта"],["Country","Страна"],["Birthdate","Дата рождения"],["Birthplace","Место рождения"],["Issued On","Выдан"],["Expires","Истекает"],["Document","Документ"],["Custom","Другое"],["{0} on {1}","{0} на {1}"],["{0} Device","{0} Устройств"]]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_wordlists_de_json.chunk.js b/cypress/fixtures/v3-client/locale_res_wordlists_de_json.chunk.js deleted file mode 100644 index 3f2e068f..00000000 --- a/cypress/fixtures/v3-client/locale_res_wordlists_de_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_wordlists_de_json"],{ - -/***/ "../locale/res/wordlists/de.json": -/*!***************************************!*\ - !*** ../locale/res/wordlists/de.json ***! - \***************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('["der","die","und","in","den","von","zu","das","mit","sich","des","auf","für","ist","im","dem","nicht","ein","die","eine","als","auch","es","an","werden","aus","er","hat","daß","sie","nach","wird","bei","einer","der","um","am","sind","noch","wie","einem","über","einen","das","so","sie","zum","war","haben","nur","oder","aber","vor","zur","bis","mehr","durch","man","sein","wurde","sei","in","prozent","hatte","kann","gegen","vom","können","schon","wenn","habe","seine","mark","ihre","dann","unter","wir","soll","ich","eines","es","jahr","zwei","jahren","diese","dieser","wieder","keine","uhr","seiner","worden","und","will","zwischen","im","immer","millionen","ein","was","sagte","er","gibt","alle","dm","diesem","seit","muß","wurden","beim","doch","jetzt","waren","drei","jahre","mit","neue","neuen","damit","bereits","da","auch","ihr","seinen","müssen","ab","ihrer","nach","ohne","sondern","selbst","ersten","nun","etwa","bei","heute","ihren","weil","ihm","seien","menschen","anderen","werde","ich","sagt","wir","eine","rund","für","aber","ihn","ende","jedoch","zeit","sollen","ins","wenn","so","seinem","uns","stadt","geht","doch","sehr","hier","ganz","erst","wollen","berlin","sowie","hatten","kein","deutschen","machen","lassen","als","andere","ob","dieses","steht","dabei","wegen","weiter","denn","beiden","einmal","etwas","wie","nichts","allerdings","vier","gut","viele","wo","viel","dort","alles","auf","wäre","spd","kommt","denen","fast","fünf","könnte","hätten","frau","am","dafür","kommen","diesen","letzten","zwar","diese","großen","dazu","von","mann","da","sollte","würde","also","bisher","leben","milliarden","welt","regierung","konnte","ihrem","frauen","während","land","zehn","würden","stehen","ja","usa","heißt","dies","zurück","kinder","dessen","ihnen","deren","sogar","frage","gewesen","erste","gab","liegt","gar","davon","gestern","geben","teil","polizei","dass","hätte","eigenen","kaum","sieht","große","denn","weitere","was","sehen","macht","angaben","weniger","gerade","läßt","geld","münchen","deutsche","allen","darauf","wohl","später","könne","deshalb","aller","kam","arbeit","mich","gegenüber","nächsten","bleibt","wenig","lange","gemacht","wer","dies","fall","mir","gehen","berliner","mal","weg","cdu","wollte","sechs","keinen","woche","dagegen","alten","möglich","gilt","erklärte","müsse","dabei","könnten","geschichte","zusammen","finden","tag","art","erhalten","man","dollar","wochen","jeder","nie","bleiben","besonders","jahres","deutschen","den","zu","zunächst","derzeit","allein","deutlich","weiß","einige","sollten","präsident","geworden","statt","bonn","platz","inzwischen","nur","freitag","um","pro","seines","damit","montag","europa","sonntag","einfach","gehört","eher","oft","zahl","neben","hält","weit","partei","meisten","thema","zeigt","politik","aus","zweiten","januar","insgesamt","je","mußte","anfang","hinter","ebenfalls","ging","darüber","vielen","ziel","darf","seite","fest","hin","erklärt","namen","haus","an","frankfurt","mittwoch","damals","dienstag","hilfe","mai","markt","seit","tage","donnerstag","halten","gleich","nehmen","solche","besser","alte","leute","ergebnis","samstag","daß","sagen","system","märz","tun","monaten","kleinen","lang","nicht","knapp","bringen","wissen","kosten","erfolg","bekannt","findet","daran","künftig","wer","acht","grünen","schnell","grund","scheint","zukunft","stuttgart","bin","liegen","gruppe","rolle","stellt","juni","sieben","september","nämlich","männer","oktober","mrd","überhaupt","eigene","dann","gegeben","außerdem","stunden","eigentlich","meter","ließ","probleme","vielleicht","ebenso","bereich","bis","höhe","familie","während","bild","ländern","frankreich","tagen","schwer","zuvor","vor","genau","april","stellen","neu","erwartet","hamburg","sicher","führen","mal","über","mehrere","wirtschaft","mio","programm","offenbar","hier","weiteren","natürlich","konnten","stark","dezember","juli","ganze","kommenden","kunden","bekommen","eben","kleine","trotz","wirklich","lage","länder","leicht","gekommen","spiel","laut","november","kurz","politische","führt","innerhalb","unsere","meint","form","münchner","ag","anders","ihres","völlig","gute","bislang","august","hand","jede","gmbh","film","minuten","erreicht","beide","musik","kritik","mitte","verfügung","buch","dürfen","unter","jeweils","einigen","zum","umsatz","spielen","daten","welche","müßten","hieß","paar","nachdem","kunst","euro","gebracht","problem","noch","jeden","ihre","sprecher","recht","erneut","längst","sein","eltern","beginn","besteht","seine","mindestens","machte","jetzt","bietet","außerdem","bürger","trainer","bald","deutsche","schon","fragen","klar","durch","seiten","gehören","dort","erstmals","februar","zeigen","titel","stück","größten","fdp","setzt","wert","staat","möchte","daher","wolle","lediglich","nacht","krieg","opfer","tod","nimmt","firma","zuletzt","werk","hohen","leben","dieser","kirche","weiterhin","gebe","gestellt","mitglieder","rahmen","zweite","paris","situation","gefunden","wochenende","wasser","recht","sonst","stand","hälfte","versucht","blieb","junge","mehrheit","straße","sache","arbeiten","monate","mutter","berichtet","letzte","gericht","wollten","ihr","zwölf","zumindest","wahl","genug","weise","vater","bericht","hoch","beginnt","wort","obwohl","kopf","spielt","interesse","westen","verloren","preis","erst","jedem","erreichen","setzen","spricht","früher","teilte","landes","zudem","einzelnen","bereit","blick","druck","bayern","kilometer","gemeinsam","bedeutung","chance","politiker","dazu","zwei","besten","ansicht","endlich","stelle","direkt","beim","viele","solchen","alle","solle","jungen","einsatz","richtig","größte","sofort","neuer","ehemaligen","unserer","dürfte","schaffen","augen","rußland","internet","allerdings","raum","mannschaft","neun","kamen","zeiten","dem","einzige","meine","nun","verfahren","angebot","richtung","projekt","niemand","kampf","weder","personen","dpa","heute","geführt","gespräch","kreis","hamburger","schule","guten","hauptstadt","durchaus","darin","amt","schritt","meist","groß","zufolge","sprache","region","punkte","vergleich","genommen","gleichen","du","ob","soldaten","kollegen","neues","angst","stellte","sommer","danach","anderer","gesagt","sicherheit","macht","bau","handelt","folge","bilder","lag","osten","handel","sprach","aufgabe","chef","frei","dennoch","ddr","hohe","firmen","bzw","koalition","mädchen","zur","entwickelt","fand","diskussion","bringt","deshalb","hause","gefahr","per","zugleich","früheren","dadurch","ganzen","abend","erzählt","streit","parteien","jedenfalls","gesehen","trotz","darunter","spieler","forderte","beispiel","meinung","wenigen","publikum","sowohl","meinte","mag","auto","lösung","boden","einen","hinaus","zwar","verletzt","weltweit","sohn","bevor","peter","mußten","keiner","produktion","ort","braucht","kind","verein","sprechen","aktien","london","richter","geplant","italien","mittel","her","freilich","mensch","großer","bonner","wenige","dritten","nahm","bedeutet","feld","dr.","bank","oben","gesetzt","ausland","vertreter","z.b.","jedes","ziehen","parlament","berichtete","dieses","china","aufgrund","stellen","warum","kindern","heraus","heutigen","anteil","herr","abend","selbst","liebe","neben","rechnen","fällt","industrie","welt","wären","vorjahr","sicht","idee","banken","verlassen","leiter","bühne","offen","stets","theater","ändern","staaten","experten","gesetz","geschäft","tochter","angesichts","gelten","mehr","erwarten","läuft","fordert","japan","sieg","ist","stimmen","wählen","russischen","gewinnen","csu","bieten","nähe","jährlich","bremen","schüler","rede","funktion","zuschauer","hingegen","anderes","führung","besucher","drittel","moskau","immerhin","urteil","kultur","betonte","saison","konzept","suchen","zahlen","roman","gewalt","köln","gesamte","indem","eu","stunde","ehemalige","auftrag","genannt","tragen","börse","langen","häufig","chancen","position","alt","luft","studenten","übernehmen","stärker","ohnehin","zeigte","geplanten","reihe","darum","verhindern","begann","medien","verkauft","minister","wichtig","sah","gesamten","einst","verwendet","vorbei","behörden","helfen","folgen","bezeichnet","weil","ihnen","voll","deutscher","worten","plötzlich","müßte","vertrag","monat","oder","herbst","israel","zahlen","zeitung","grenzen","partner","patienten","nutzen","bund","setzte","betrieb","michael","beteiligt","professor","fernsehen","künstler","mehreren","erinnert","liste","autor","täglich","eingesetzt","versuch","alter","autos","kohl","außer","hoffnung","verkauf","nennt","erscheint","führte","prozeß","täter","bisherigen","länger","erkennen","treffen","kein","unser","begonnen","antrag","opposition","maßnahmen","brachte","nächste","zudem","gezeigt","dennoch","sinn","erde","gefordert","wohnung","all","menge","gerne","hören","selten","weitere","bestätigt","bestimmt","statt","entstehen","nannte","schreibt","union","brauchen","gewählt","kraft","elf","trägt","zieht","grenze","team","gebäude","tonnen","wettbewerb","anspruch","polen","morgen","bremer","wegen","gebiet","glaubt","sa","natur","arbeiten","jene","fällen","leisten","zeitpunkt","mein","konkurrenz","stieg","notwendig","sogenannte","fahren","kostet","geplante","fehler","zweifel","erklärung","wiederum","erschienen","gehe","glück","fehlt","gruppen","aktion","kündigte","meinen","manchmal","übernommen","möglichst","sz","lieber","vielleicht","warum","gespräche","suche","gern","fallen","preise","weitgehend","basis","computer","schutz","eindruck","fiel","nahe","schlecht","lebt","verhältnis","forderung","britischen","sozialen","technik","entstanden","vorstand","of","bestimmten","jüngsten","geboren","erhält","wobei","gegner","gründen","material","spitze","gewinn","punkten","vertreten","schulen","studie","zeichen","gewonnen","kurs","washington","türkei","wirkt","armee","erhielt","beginnen","bißchen","entfernt","vorgesehen","ergebnisse","zahlreiche","entgegen","ohne","hielt","privaten","sucht","gemeinde","antwort","zentrum","bilden","legen","schweiz","weg","teilweise","licht","hannover","produkte","stimme","diesmal","schluß","gingen","angeboten","gesicht","treffen","nachdem","ließen","eröffnet","versuchen","konzern","leistungen","gäste","wohnungen","dafür","wichtige","neue","rund","zog","geraten","bewegung","gegen","nötig","mitglied","hundert","düsseldorf","pds","danach","vermutlich","selber","ständig","senat","branche","enthält","laufen","vom","straßen","einführung","arbeitet","verlangt","werke","insgesamt","runde","besuch","manager","brüssel","de","schweren","sitzt","jemand","bereits","wachstum","taz","bestimmte","drei","freiheit","kennt","band","glauben","wege","verurteilt","tritt","volk","pläne","satz","sitzen","vorschlag","rechnet","muss","erhöht","aufgaben","warten","entdeckt","heimat","verstehen","schrieb","trotzdem","erfahren","frühere","bekommt","dinge","institut","wirkung","sorgen","trifft","reden","werte","forscher","wo","sitzung","zusätzlich","vielmehr","anlaß","beide","gehalten","tel.","schweizer","serben","bundestag","verwaltung","vorher","betont","leistung","obwohl","zufrieden","papier","thomas","verbindung","sinne","ziemlich","debatte","enthalten","bestehen","freund","themen","überall","droht","text","punkt","erfahrung","the","soziale","russische","tisch","republik","höher","reicht","million","gehabt","politisch","folgen","ähnlich","geschaffen","schaden","erster","körper","amerikaner","getötet","einige","frieden","zählt","wagen","bahn","vergessen","verlust","tiere","museum","gegründet","daraus","start","kontrolle","einfluß","österreich","allein","norden","wunsch","manche","wahlen","reise","steigen","gemeinsame","demokratie","könig","england","nennen","teile","denken","name","lehrer","s.","laufenden","verbunden","qualität","widerstand","schön","spanien","gegangen","beamten","jeder","europas","freunde","mitteilte","erklären","familien","gerade","gefallen","aktie","krise","nummer","wies","außerhalb","gestiegen","reform","literatur","lebens","gewann","moment","angeblich","mill","weiteres","beträgt","dritte","wesentlich","amerika","insel","britische","nachfolger","entspricht","dahin","unseren","solcher","juden","sport","rathaus","verkaufen","größere","frühjahr","gebaut","wahrheit","dar","kommission","polizisten","bosnien","grundlage","relativ","nein","klasse","tut","hängt","wenigstens","aktuellen","modell","hinzu","gedanken","übernahme","entwickeln","quartal","meiner","dürften","keine","jener","zustimmung","legt","fordern","einheit","natürlich","blieben","laut","szene","klaus","geblieben","lesen","besonders","getroffen","keineswegs","abschluß","verlag","interessen","netz","plan","ausbildung","befindet","zunehmend","verzichten","gespielt","ermittelt","legte","ruhe","hans","händler","genutzt","höhere","starke","treten","stimmung","ärzte","erheblich","standen","teilnehmer","möchten","starken","stand","anlage","siehe","erfolgt","vertrieb","beste","gelungen","ordnung","andreas","lautet","kritisiert","schröder","machten","verstärkt","süden","haltung","freien","weist","nahezu","motto","abgelehnt","gelang","gezogen","frühen","schreiben","aufs","gleiche","öffentlich","häuser","kleiner","folgt","einer","ja","wien","möglichen","weiterer","kaufen","gefühl","initiative","hofft","dürfe","person","telekom","kennen","beitrag","lernen","gefragt","meister","bücher","kürzlich","tradition","einzelne","verband","grüne","überzeugt","rückkehr","also","schwere","falsch","unten","behandelt","indes","großes","worte","getan","somit","langsam","wählen","gedacht","geändert","bisher","hervor","hessen","städte","unbedingt","hotel","artikel","tätig","geburtstag","gesprochen","schließen","engagement","alles","gründe","erlaubt","kl.","ausländer","anleger","größer","verlieren","verhalten","fanden","betriebe","praxis","ums","galt","gemeinden","wolfgang","kanzler","viertel","private","zustand","genauso","planung","forschung","gott","einzigen","wichtigen","kosten","verkehr","befinden","kauf","halle","rom","bessere","unserem","jeweiligen","angelegt","beendet","fälle","stehe","dienst","herrscht","begriff","sekunden","essen","ans","erfüllt","auskunft","bauen","rechnung","endgültig","truppen","jungen","aufbau","leider","auffassung","komme","karriere","bezahlen","telefon","rest","umwelt","schlägt","bewußt","wichtiger","sonne","trat","inzwischen","gelangen","schneller","kandidaten","brief","folgenden","erscheinen","nr.","fahrer","rennen","nachfrage","morgen","verdacht","eigener","hinweis","umgebung","bestätigte","regelung","fenster","dienen","modernen","zuständig","flughafen","generation","gelegt","ergeben","nationalen","waffen","schicksal","jugend","niederlage","spaß","niveau","gelände","trend","heißen","tatsache","presse","feuer","bezahlt","förderung","ganz","bildung","vorstellen","voller","winter","botschaft","investoren","grad","geschäfte","leser","spielte","erzielt","reichen","energie","regelmäßig","übertragen","freude","verändert","umgang","fans","entweder","dauer","hersteller","größe","kontakt","früh","prinzip","ausdruck","definieren","wunder","eindeutig","behandlung","größeren","nachbarn","himmel","hoffen","auge","risiko","verdient","tor","maria","behauptet","rücktritt","schwarzen","bewegen","immerhin","plus","mögliche","passiert","angesichts","betroffen","entsteht","vorwürfe","näher","bekam","aussage","verfassung","bewohner","vorhanden","richtige","übrigens","kommunen","städten","werner","verfügt","filme","tabelle","werbung","fragt","gegenteil","fischer","gegensatz","bauern","arzt","leitung","dieter","besondere","sehe","die","arbeiter","beschluß","minute","anzahl","willen","ruf","aktiv","zwischen","karlsruhe","einiger","westlichen","schweden","verwenden","vorwurf","zwanzig","the","höheren","offiziell","tief","du","ausbau","auswahl","richtigen","schien","festgelegt","bilanz","erhöhen","kurzem","fast","gang","vorerst","hände","wirken","vertrauen","denkt","lösen","positionen","zählen","besitzt","falle","entwurf","ziele","sichern","ernst","positiv","tat","ermöglicht","ideen","damals","änderung","ebene","äußerst","lager","zweimal","tür","dringend","regisseur","wechsel","begründung","alter","pfennig","fehlen","links","summe","erinnerung","zugang","ii","praktisch","geöffnet","leipzig","frank","strecke","fährt","wende","herz","autoren","fürs","übrigen","andere","ausgabe","fußball","kölner","projekte","versteht","stil","letztlich","aussagen","herum","bundeswehr","steigt","kämpfen","zugunsten","glaube","fraktion","posten","dorf","post","bruder","außen","welcher","dagegen","rang","trotzdem","krankheit","heinz","strom","bloß","zumal","struktur","linie","felder","dient","clinton","wußte","falls","entstand","herrn","autofahrer","sitz","definiert","warf","fusion","gaben","verlor","los","daraufhin","zinsen","scheinen","büro","angenommen","ursache","steuern","fühlen","anlagen","jürgen","franzosen","allzu","liege","verteilt","soviel","jelzin","landtag","nürnberg","ab","bereichen","stammt","service","künftigen","kino","behörde","gehandelt","nutzung","interview","wissen","zuerst","davor","ausnahme","erhöhung","wächst","gearbeitet","rechte","eins","walter","geradezu","wirft","zug","erreichte","bedarf","erlebt","teuer","kritiker","flucht","klage","änderungen","u.","informiert","geschickt","gerhard","erinnern","männern","klingt","hinweise","kräftig","fort","rein","eigenes","immer","spät","eröffnung","beratung","franz","gefängnis","angezeigt","rasch","erfüllen","freie","fertig","haushalt","dadurch","schlagen","direktor","realität","falls","schreiben","sender","provinz","job","standort","beruf","gestorben","voraus","gesucht","stellung","einigung","vorschläge","texte","fühlt","schuld","leichter","vierten","halbjahr","rücken","karten","halben","betrachtet","schlug","geschehen","zeitraum","vermeiden","prüfen","vieler","formen","tore","starb","regeln","umfang","fragen","konflikt","vier","je","teilen","plätze","beraten","einwohner","verluste","rechten","zugeordnet","tausend","gerechnet","offenen","warnte","verbessern","unterwegs","führenden","hauses","anbieter","übernimmt","diskutiert","herren","anstieg","objekte","versuchte","bisherige","beschreibt","etwa","hof","serie","allem","weißen","türkischen","revolution","personal","hilft","karl","gründung","martin","verboten","verhindert","nahmen","lust","fahrt","begründet","wahlkampf","auftritt","guter","gutes","ard","dichter","vorbild","allianz","zerstört","hart","rief","einnahmen","einig","beamte","and","gelingt","status","gefährdet","vorteil","strukturen","rechts","staatliche","spiele","kräfte","persönlich","wachsen","atmosphäre","wann","angriff","müller","regionen","dresden","besetzt","technische","plus","gesichert","besonderen","gehörte","verspricht","vergeben","traf","wonach","inhalt","vorhaben","plant","galerie","horst","protest","urlaub","gelassen","traum","geben","steckt","leuten","bestimmen","mehrfach","sollte","tätigkeit","josef","alexander","beteiligen","unabhängig","anwalt","pflegen","roten","bildet","solange","erfolge","schließt","helmut","innenstadt","junge","mitteln","peking","aufgebaut","zeitungen","becker","wähler","software","demnächst","wird","erzeugt","retten","höchsten","stimmt","reaktion","bernd","halte","reduziert","moderne","mache","m.","rückgang","schwierig","produziert","ausgaben","hört","kassen","tokio","general","schloß","günter","deswegen","zdf","methode","sorge","sorgen","verfolgt","ungarn","nato","messe","figuren","kurzen","fest","bosnischen","welchen","höhepunkt","künftige","finanziert","aktuelle","zeigten","bekannten","spätestens","strategie","bemüht","sorgt","rat","meinem","neuen","benötigt","spur","ball","finale","keinem","schöne","reagiert","manfred","schützen","ernst","stammen","rande","schatten","verbessert","jüdischen","positive","manchen","entlassen","phase","vorgang","asien","eng","halbe","abschnitt","verbrechen","dank","geist","tot","eingeführt","berichten","anlegen","kirchen","funktionen","sanierung","sieger","aktionen","vorgelegt","wind","fahrzeuge","kurse","untersucht","durfte","u.a.","maschinen","unsere","ausgelöst","indien","haft","bewegt","zweck","währung","bitte","wald","wichtigste","zimmer","verlauf","ausgesetzt","prüfung","verwendung","kurze","zunächst","blut","anwendung","anhänger","aufnahme","sammlung","benutzt","angebote","umsetzung","dach","irak","gezwungen","premiere","ap","hoher","starten","kasse","nichts","hektar","paul","termin","gemeldet","kontakte","anbieten","räume","stellten","abbau","meldete","ton","unfall","touristen","englischen","abkommen","erfaßt","solche","metern","stiftung","existenz","zeugen","gold","absicht","objekt","anders","anklage","großen","einkommen","beider","sinnvoll","abstimmung","liefern","schafft","ecke","siemens","gutachten","version","konferenz","pariser","bundesliga","erhebliche","erfolgen","dialog","dutzend","abhängig","hängen","ausgegeben","bedenken","ergibt","iran","vermutet","aufnehmen","verzichtet","bundesweit","bekannte","befürchten","bekl","ehe","liest","gast","damaligen","wiener","genügend","ersetzt","vereine","beobachtet","verdienen","niemals","brand","verstanden","stolz","reagieren","laufe","schönen","erhoben","spuren","mitten","reformen","erschien","mut","grünen","christian","verliert","anna","aussicht","staates","charakter","spiegel","analyse","kapital","herzen","einiges","bedroht","linken","deutscher","russen","derzeit","eingeladen","verlangen","langem","stadtrat","beiträge","erkannt","zuschauern","trug","afrika","schritte","höchste","mord","dortmund","studium","erläutert","alltag","teilnahme","befürchtet","geschafft","betrag","nachmittag","solches","jenen","bildern","fläche","berichte","wiesbaden","heftig","äußerte","gewinne","gesprächen","klare","umgesetzt","justiz","soweit","wiederholt","bislang","endet","atlanta","holen","abstand","geprägt","nation","meer","berlins","keinerlei","aufgerufen","gewisse","programme","musiker","einsetzen","aufträge","pflege","management","behaupten","bier","gewinnt","jahresende","belegt","besseren","zuge","sap","saal","berufung","schwarze","farbe","georg","konzert","umfeld","gelernt","besitz","wand","kabinett","kosovo","sachsen","pause","erstes","waren","händen","fuhr","gebeten","gering","vorlage","www","schloß","risiken","sämtliche","gelegen","aufklärung","fünf","daher","erleben","pflanzen","spüren","feiern","schwerer","draußen","beweis","gewicht","lagen","fonds","kompromiß","handeln","training","kunde","geschlagen","hinweg","gelte","gesundheit","nachricht","mein","junger","kapitel","fördern","kamera","greifen","normalen","augenblick","waigel","werfen","äußerungen","tausende","begleitet","üblichen","blatt","bereiche","abteilung","erzählen","dauert","heinrich","belastet","verträge","wetter","keller","farben","entlang","begründete","welche","fielen","zugleich","sprecherin","führer","gegenwart","erste","londoner","angewiesen","kriterien","kurz","vereinbart","lasse","ihren","pfund","schlechte","kanada","bundesbank","dividende","investiert","gut","südafrika","gestern","getragen","japanische","geprüft","sparen","systems","stadtteil","robert","versichert","hinein","co","brasilien","späten","gesetze","neues","irgendwann","unseres","maschine","beobachten","typ","seele","not","bord","bmw","zuviel","zentimeter","später","ereignisse","offene","identität","folgte","bahnhof","hielten","allenfalls","spanischen","anfrage","serbischen","produkt","australien","a.","landschaft","schmidt","große","vorteile","leiden","arbeitete","bayerische","passieren","regie","eigentlich","übrig","kleines","höchstens","bemühungen","märkte","wert","pfarrer","ungefähr","zentrale","warnt","beinahe","microsoft","mischung","desto","vorgehen","oper","zentralen","sowieso","liefert","ruft","niemand","kern","beziehung","jüngste","aufmerksam","seitdem","reisen","führten","fuß","bleibe","leer","beobachter","vermitteln","überrascht","werken","klein","manche","öffnen","schätzt","bus","toten","zogen","mancher","besitzen","hotels","rebellen","ausgleich","gefeiert","ereignis","benutzer","erhöhte","reuter","methoden","feuerwehr","angegeben","darin","reihen","erzielte","wm","übernahm","abschied","behalten","lande","nationale","wartet","stärke","nunmehr","anzeigen","verändern","türkische","bäume","briten","gerät","selben","ihrer","vortrag","bedeuten","halt","analysten","hongkong","schlechter","davon","getrennt","figur","derart","schlüssel","stücke","bündnis","geschieht","liter","mauer","erkenntnis","paßt","kongreß","hoffnungen","späteren","marke","kenntnis","mannes","umständen","greift","saß","details","unmöglich","fragte","gewiß","belastung","namens","beweisen","verfügen","anschlag","gebieten","zahlt","kaum","höchst","falschen","schlechten","lösungen","gestartet","konkrete","hat","bundesrat","tendenz","falsche","lehnte","zuständige","helden","sichtbar","setzten","stefan","regen","vorne","lief","geboten","solch","milliarde","dauern","häufiger","kilogramm","meine","besitzer","partie","elisabeth","magistrat","unser","doppelt","dich","kollege","ältere","fürchten","problemen","arten","diejenigen","holz","denken","bewertung","deutliche","spielen","landkreis","geringer","jede","aufgrund","variante","schwester","festlegen","bürgern","schäden","sind","nein","betreiben","positiven","übergeben","mitteilung","lehre","gefördert","kleinere","geeignet","umfrage","mieter","halb","berg","kroatien","herbert","nochmals","tempo","spannung","klima","alten","allgemeine","see","bewerber","irgendwie","freundin","pflicht","erweitert","papst","teilnehmen","trennung","welchem","erstellt","nase","erklärten","sicherlich","schulden","senken","herzog","stoff","gerecht","vw","besucht","enttäuscht","anzeige","festen","hessischen","stiegen","ersetzen","aktionäre","verhandelt","zweiter","sorgte","otto","auftakt","zweier","richtet","einheiten","versuche","zellen","mengen","beziehen","führende","schiff","umfaßt","begegnung","ähnliche","großteil","theorie","denke","vermittelt","zürich","welches","erschossen","gekauft","maß","dienste","gesperrt","gestalt","stein","neubau","weisen","harten","forderten","feiert","extrem","allgemein","diesen","voran","versorgung","eis","billiger","überprüfen","mannheim","betrifft","verwies","minus","mögen","überlassen","lädt","schicken","notwendige","foto","finanziell","dank","schneider","ehe","image","belgien","gefährlich","betrieben","freiburg","steigerung","baut","rußlands","ablehnung","geklärt","brücke","dreißig","bewußtsein","glücklich","alleine","ferner","gewachsen","empfiehlt","errichtet","egal","legten","einstieg","osteuropa","scheinbar","reich","kostenlos","anteile","älteren","geriet","ärger","länge","verzicht","elemente","gesorgt","weiße","gestaltung","teams","gebildet","ruhig","jerusalem","geräte","mund","lafontaine","vereins","gefahren","früher","jenseits","wechseln","versuchten","sank","samt","polnischen","autobahn","grüne","gehörten","herkunft","rückzug","david","potsdam","hinzu","garten","betragen","dpa-afx","sterben","teufel","erzielen","fahrzeug","bestand","moderne","john","viel","womöglich","lauf","beschränkt","glas","aufgehoben","szenen","wahr","lebenden","auftreten","vorfeld","ansonsten","transport","zeichnet","strafe","hinten","jetzigen","neuesten","bett","bestätigen","gesunken","erhielten","parteitag","krieges","verbot","beispiele","sahen","sendung","verbreitet","vielmehr","eintritt","gezahlt","belgrad","kümmern","zustande","antreten","teurer","steigern","wünschen","ganze","türen","us-dollar","alfred","riesigen","vergeblich","zumeist","maler","manchmal","raus","schlicht","bereitet","hochschule","unklar","vorgänge","großem","bewertet","kaiser","breit","lehnt","üblich","signal","maximal","klinik","käufer","dame","reagierte","einziger","bestehe","auflösung","forum","brachten","beine","küche","glauben","gelöst","griff","wahren","züge","gemeint","betreuung","gestalten","betrug","inneren","erteilt","ausschuß","dreimal","dax","gedichte","verhaftet","yen","mexiko","vorigen","abends","erwiesen","bot","innen","dänemark","argument","haut","angeklagte","aufwand","reine","distanz","einstellen","betrieben","zuvor","rtl","konjunktur","bernhard","irgendwo","park","sagten","damen","offizielle","harte","amtszeit","laufende","hinter","konto","ursachen","vorn","gelesen","teilen","akzeptiert","absolut","bestellt","verweist","vieles","vermögen","politikern","schnellen","denkbar","fotos","gemessen","freuen","sprung","stimmen","reichlich","restaurant","gestrichen","gewarnt","achten","abgeben","friedrich","akten","küste","jüngst","berufen","schnelle","briefe","räumte","kaffee","gelder","symbol","gebühren","kleineren","europäer","johann","teilt","italiener","parameter","freunden","stecken","garantiert","zuwachs","rand","haushalte","weltweiten","club","nieder","bestehende","einfache","geschätzt","uno","b.","moskauer","nachmittag","ebenso","mühe","phantasie","berater","medizin","geleistet","stößt","tode","teil","vorwiegend","vgl","freiwillig","verursacht","h.","alte","fr","hafen","allmählich","überzeugen","kurden","teils","vorgänger","jahrzehnte","begeistert","beenden","richard","fleisch","barcelona","schnitt","drogen","mitgeteilt","leitet","nachts","anwohner","export","regel","mittels","besuchen","handlung","erworben","brach","breiten","gerät","ohren","konkreten","würde","gäbe","ablauf","fließen","bezug","ukraine","eingang","entschied","flugzeug","stock","aussehen","froh","treibt","haben","einfachen","gepflegt","gestanden","beitragen","zähler","beantragt","gefühle","ergab","wesen","betreibt","brauche","überprüft","auflage","besetzten","jazz","stern","mangel","tasche","scharping","verschoben","hund","barbara","volle","melden","d.h.","weshalb","berühmten","dokument","öl","anerkannt","genannten","echte","dw","reduzieren","bundes","komplett","mainz","sprachen","fliegen","liebsten","folgende","maßnahme","konzerns","hinsicht","benutzen","richten","mehrere","adresse","meldung","modelle","schließung","umbau","speziell","vaters","verlangte","fachleute","chaos","zehn","abgesehen","reaktionen","monatlich","operation","geäußert","hinnehmen","gebraucht","fünfzig","bestand","report","türken","kroaten","dachte","verbindet","papiere","liga","mir","studien","maße","einerseits","büros","scharf","teure","ausgebaut","teuren","gremium","bildschirm","innere","überlegen","hoffe","dir","sätze","gefaßt","anhand","formuliert","chinas","räumt","ehefrau","gewissen","morgens","erfassen","j.","stars","absatz","sturm","begrenzt","eigentümer","klagt","löst","ihrem","militärs","finde","aufstieg","gebiete","genossen","kinkel","rente","kommende","ware","kämen","ergänzt","genf","gestaltet","normale","katalog","stünden","heutige","systeme","vierte","datum","finger","zufall","wolf","standard","betreut","demnach","dokumente","armut","verfolgen","gebrauch","steuer","prag","hinterher","kampagne","tanz","bezieht","geburt","existiert","startet","hermann","geheimnis","ansprüche","arm","lange","wirkte","rudolf","arme","treiben","umzug","verletzung","lasten","lässt","premier","scheitern","muster","lufthansa","befand","sicherung","abgegeben","jahrelang","aufgegeben","abgebaut","masse","abzug","begrüßt","käme","zitiert","drücken","niedriger","kurzer","radio","verlegt","freut","spezielle","fünften","breite","star","gegend","direkten","karte","letzter","erinnerte","instituts","schauen","seinerzeit","turnier","leichte","ost","profis","kiel","genau","engen","absolute","fritz","handeln","aufschwung","vertretern","nazis","wilhelm","kilometern","gesteigert","minus","zentrale","paar","religion","seitdem","beifall","merkmale","grundstück","halbes","sarajewo","kurt","herrschaft","verbinden","tier","gesenkt","öffnung","drohen","einziges","umgekehrt","konflikte","ähnlich","baum","kapitän","planen","ots","betrachten","front","geliefert","gastgeber","stadion","trennen","lebte","längere","gefahren","produkten","senkung","kritisch","anschluß","darmstadt","wachsenden","böblingen","wuchs","spenden","zugelassen","lastwagen","klären","ulrich","schönheit","antworten","milosevic","bezirk","liberalen","vielzahl","geringen","erkennt","stabilität","orchester","eigener","deutsch","sänger","durchs","kämpfe","fraktionen","klaren","weiter","erzeugen","franc","beklagt","gibt\'s","bezogen","anlegen","graf","unterricht","kommentar","etat","tiefer","minderheit","index","brigitte","umsätze","tat","einstigen","seither","aufruf","rufen","rumänien","augsburg","einladung","gewährt","bewiesen","regelungen","west","bricht","landrat","zugute","langer","streng","hunderte","unterlagen","schlag","sammeln","instrument","bischof","holte","aussichten","kredite","äußern","tv","verteilung","proteste","hohem","geringe","israels","joachim","jederzeit","suchte","ändert","nato","verlängert","geworfen","respekt","derartige","lieben","ring","technisch","plänen","angesehen","englische","akt","vogel","sinken","mercedes","wenden","lsw","hierzu","wandel","handwerk","tote","stoiber","singen","bekämpfung","ensemble","besetzung","erstmals","belegen","perfekt","gemäß","gesammelt","helfer","definition","wider","versorgt","jobs","show","volkes","verbände","flächen","rainer","empfangen","konsequent","sozusagen","lauter","datenbank","wohnen","institute","dicht","darauf","offenbach","alkohol","bevor","vermuten","hanau","ca","drohte","jan","daneben","ehemaliger","erzählung","uwe","ernsthaft","streik","gefällt","armen","schaut","jenem","schuldig","erfährt","statistik","kreisen","bürgerhaus","verhandeln","gegenstand","oberfläche","befreit","verhalten","pc","ermordet","binnen","konsequenz","drängen","heidelberg","hab","erläuterte","city","stärken","anläßlich","verkündet","zusammen","stieß","gas","gezielt","quelle","volumen","schaffung","malerei","madrid","sechs","k.","handele","tiefe","stufe","mütter","zeilen","leider","studierte","engagiert","verweigert","ihm","dran","stelle","laden","daneben","einzig","preisen","bedient","rechte","rote","jüdische","träger","genaue","ehre","wahre","wieviel","ausgeführt","anträge","esslingen","endete","angriffe","chemie","serbien","mehrmals","kleinen","einander","internen","eigens","sponsoren","leidet","vorsichtig","genauer","klassen","bitte","darstellen","häusern","truppe","bedarf","normal","telephon","kassel","rundfunk","schnee","abrechnung","stoppen","damalige","erwarteten","thüringen","örtlichen","schau","versehen","speziellen","vollen","nutzen","hinblick","tagung","versetzt","zuordnung","südlich","schätzen","sprachen","riesige","kämpft","stich","innerhalb","umfassende","zustimmen","bewegungen","nürnberger","inszeniert","kritischen","zugestimmt","tour","genehmigt","ausgang","these","sachen","mode","müll","zufällig","absage","sand","profil","gerufen","vernunft","unglück","entlastung","korruption","amsterdam","dreht","feste","zerstörung","rhein","mörder","fehlte","all","tourismus","lohn","autorin","gottes","direkte","mittleren","ansatz","element","live","historiker","frisch","kritische","singt","last","vielfalt","klassische","erlitten","moral","trafen","deutsch","vorsprung","hitler","kulturelle","sekunde","erich","größter","kandidat","enge","fluß","ähnlichen","gefolgt","einmal","meistens","gegenüber","passen","regionalen","quer","mediziner","günther","genießen","gramm","essen","prof","leichten","militär","vision","norwegen","wünscht","stürmer","frankfurt","inklusive","journalist","station","rolf","geeinigt","ferner","liebt","ausgehen","museen","affäre","serbische","töne","intensiv","deutlicher","fassen","aufführung","zahlung","prognose","war","versprach","wein","mailand","uni","ursula","portugal","vortag","büchern","meldet","motiv","ließe","durchbruch","wünsche","erkennbar","vornehmen","schumacher","lieder","fr","geschehen","arabischen","drin","niedrigen","nutzt","vielfach","christen","wieder","ob","quellen","folgten","fakten","aufgelöst","ägypten","eröffnen","benötigen","gründete","vertraut","zuschüsse","erhältlich","fortsetzen","hals","inseln","zusätzlich","bayerns","klub","ermitteln","buches","therapie","öfter","verdanken","erwachsene","konsens","explosion","fügte","dunklen","beschloß","wachsende","sobald","öffnet","parlaments","jedes","drauf","enger","argumente","gipfel","erstellen","bauer","gelingen","verläßt","kann","parteichef","phänomen","umstritten","scheiterte","bemerkt","johannes","gerüchte","iii","ausmaß","treffer","stolz","iwf","heftigen","bemühen","kammer","schülern","globalen","branchen","redet","passagiere","gebunden","rücksicht","drastisch","option","lieferung","menschheit","reinen","haare","schäfer","entdecken","plätzen","fürchtet","angeben","jörg","beherrscht","sturz","weitaus","sofern","existieren","reisen","skandal","räumen","zugrunde","ibm","tieren","nachwuchs","st.","treffpunkt","gelangt","derweil","rollen","wendet","greenpeace","vorgaben","spielten","verringert","abwehr","geschützt","annahme","getrieben","erreichten","japaner","stärksten","kreise","generell","solange","städtische","einsicht","anzeigen","böse","parallel","wagner","erstenmal","fähigkeit","anliegen","befreiung","total","test","vorläufig","zeile","gebucht","abends","mythos","vierzig","ansonsten","werben","gehirn","erwerben","substanz","unteren","rostock","rentner","zweites","dgb","vorstoß","deutlichen","musste","bewahren","motive","erledigt","vorlegen","vertritt","deren","weiten","sowohl","schwarz","akademie","löste","luxemburg","euch","empfehlen","linke","erwähnt","schönsten","kleine","entdeckung","taten","waffe","löschen","golf","etliche","zugriff","leverkusen","einzelner","jenes","hierfür","loch","verwandelt","kehrt","eingeräumt","holding","ansehen","ausfallen","merkmal","dfb","füßen","letztes","stoffe","regime","schweigen","periode","feierte","durften","for","abenteuer","endgültige","bittet","redaktion","reden","gästen","versteckt","immobilien","kilo","gerichtet","ludwig","börsen","echten","bezeichnen","überblick","kündigung","zumindest","krank","stehenden","faust","freistaat","soll","fazit","jemals","umstellung","spanische","komponente","verbandes","gewußt","brechen","handelte","lediglich","rot-grünen","gerettet","müde","streiten","genügt","kulturen","ehemals","herrschte","steigenden","meldungen","kindheit","bewölkt","oft","freundlich","betreiber","hanauer","besorgt","restlichen","erlauben","etwas","un","gestoßen","bibliothek","berichten","gute","lied","agentur","gemeinsam","erwerb","sportler","geborene","quote","berechnet","komödie","religiösen","offenbar","münchener","einzug","schwach","quasi","schildert","sonst","motor","rettung","aufgeben","drängt","geholfen","schuß","verglichen","protokoll","sozial","christine","zunahme","börsengang","wohl","vermag","gestoppt","offensive","gehöre","behandeln","sogar","gelaufen","do","brüder","mitunter","entlassung","aufgeführt","inflation","übergang","monika","bearbeitet","sicher","löhne","filmen","heimischen","gefüllt","unrecht","magazin","detail","kürzungen","begannen","begegnen","entdeckte","geholt","massiven","umgehen","potential","einfacher","verließ","weite","münster","rock","franken","sanktionen","anfangs","jüngeren","köpfe","bayer","weniger","eingeben","zugesagt","mehrerer","eines","besuchern","blauen","ehemann","haar","defizit","bach","halbfinale","fax","lebende","skeptisch","reichte","karin","irland","realisiert","verfolgung","geleitet","tages","andrea","senator","optimismus","tränen","westliche","singapur","leeren","zwingen","zeitweise","ersatz","to","linken","flügel","erhalt","jung","stimmten","außer","bedrohung","romans","scheitern","oberen","locker","eventuell","impulse","opfern","gestohlen","vorliegen","wandte","drehen","einstimmig","v.chr.","koch","täglichen","darstellt","verteidigt","massiv","brüsseler","verteilen","messer","entfallen","aufhebung","klagen","weber","prognosen","flugzeuge","vergangene","karlsruher","angehörige","geltend","geschmack","völker","derselben","holland","führe","kommunalen","lokalen","fassung","nationen","pkk","ruhestand","empfohlen","flug","dimension","verdoppelt","dortigen","films","gegründete","aufbauen","steigende","wohin","gegenzug","erbe","taiwan","wohnt","bearbeiten","schöner","festival","bedeute","lautete","held","auflagen","nehme","angeht","kompetenz","freizeit","stoßen","fabrik","reiche","deutet","wann","überwinden","blickt","studiert","beratungen","lebten","finanzen","spielern","chor","freier","laufzeit","ali","harald","vollkommen","photo","hob","ministerin","präsenz","gewohnt","delegation","geltenden","sonnabend","exakt","architekt","anton","helga","abs","heftige","schwarz","release","altstadt","leiden","italiens","schiffe","bruch","füllen","eg","werden","begangen","zugänglich","erika","ausnahmen","gehalt","polnische","diesmal","varianten","nerven","flammen","zeuge","befreien","zeige","nördlich","kandidatur","lohnt","steuern","islam","still","programms","kleidung","neuerdings","anderswo","sage","max","dorthin","gründen","errichten","märkten","märchen","inhalte","null","kubikmeter","marketing","nötigen","arbeitsamt","planungen","bedingung","tübingen","weder","gewannen","sabine","dass","plädiert","bist","gekostet","bearbeiten","lesen","getreten","usd","leise","überdies","mißbrauch","klubs","überleben","termine","stirbt","exil","effekt","leiche","prozesse","dramatisch","stimmte","stadtwerke","lächeln","fügt","negativ","griff","verlierer","übersehen","orten","cd","kindes","wirksam","goethe","instanz","fraglich","erziehung","tschechien","frist","gelöscht","klagen","brot","miete","göppingen","wut","südlichen","schlimmer","gesichter","ralf","einbruch","verraten","interne","neuem","w.","anzeichen","eineinhalb","zuordnen","villa","schwierige","sieben","auswertung","berechnung","sehr","befassen","gewünschte","aspekt","bekamen","witz","austausch","schwachen","schäuble","angemeldet","fühlte","konkurs","geschah","erfüllung","engel","neuer","inland","massive","gerd","angehören","aktiven","fremden","gebrochen","geregelt","zwecke","daran","zugenommen","gerichte","jury","humor","entfernung","römer","genannte","angebracht","gestrigen","udssr","marktes","befaßt","wußten","gertrud","weiß","disziplin","stahl","center","bunten","rechner","furcht","günstig","tiefe","bewältigen","heiße","autors","sehnsucht","gefangenen","fülle","älter","weltweite","skepsis","erweist","ganzes","ausgewählt","magdeburg","gleichwohl","siegfried","gewissen","kündigt","geschossen","mannesmann","spürbar","spielraum","integriert","verkündete","syrien","fließt","eva","lob","stabil","eigenem","kinos","gleich","starben","aussieht","straftaten","heran","moderner","kürze","km","verstärken","dresdner","ebenfalls","ernannt","vertrieben","planeten","illegal","digitalen","hörte","momentan","kalt","vorjahres","weiblichen","brauchte","können","erheben","sozialer","warnen","juristen","besonderer","schwäche","vermieden","konzepte","rot-grüne","bombe","spannungen","faktoren","dahinter","via","halbzeit","ausstieg","ausweitung","gemälde","opel","empfang","aktive","entziehen","überfall","rendite","rückt","erhofft","tunnel","berühmte","gelegenen","erarbeitet","messen","schaffte","behauptung","athen","drückt","petra","geiseln","hast","gesetzlich","ufer","anpassung","gesetzes","ohr","überleben","zeit","nahrung","indonesien","vergabe","vorzeitig","weitem","konkret","verwiesen","nachfolge","kriegen","bestanden","mission","unbekannte","tabellen","lärm","diplomaten","spanier","leitete","senioren","leipziger","bereiten","gabriele","amerikas","kontrollen","beleg","läden","erfuhr","männlichen","markiert","business","gewidmet","r.","kreuz","tiefen","annehmen","hollywood","erzählte","klarheit","enden","erster","holt","senats","sitze","wurzeln","verlaufen","matthias","rechten","regiert","partnern","vogts","claudia","niedrig","formel","bestraft","grün","beauftragt","eröffnete","renate","signale","olympia","gründlich","fertigung","athleten","ausführung","jungs","knie","überaus","hebt","errichtung","sicheren","arafat","korrekt","drama","kenne","studio","verringern","aufzubauen","konzerne","zeitalter","tests","substanzen","jedenfalls","betten","beute","grundsatz","bitten","aspekte","haß","ständigen","königin","bgb","manches","is","erlitt","begreifen","verliehen","erhöhten","bauch","schrift","leiten","jährlichen","allemal","gisela","zunehmende","hut","indischen","entstehung","studieren","angabe","ära","blätter","negativen","eingehen","bedienen","runden","hoechst","benannt","weichen","bakterien","daniel","glaubte","vorsitz","bat","balkan","beschädigt","dicken","befragten","a.","brust","schlossen","gewinner","römischen","christoph","meines","erlebte","anfangen","chirac","niemanden","wehren","bisweilen","stürzte","leichen","seinen","empfehlung","erlassen","di","gleicher","regionale","bgh","gefährden","trinken","vorsicht","englisch","lobte","warnung","günstigen","inc.","nachweisen","östlichen","anwälte","norbert","geht\'s","südwesten","finnland","profitiert","südkorea","markieren","kürzung","gleichwohl","üben","umfragen","ausländern","berge","fehlende","schrecken","jagd","angesagt","rechtlich","sorgten","verweisen","erfordert","hessische","vfb","erweitern","begegnet","demokraten","übers","bevorzugt","dauerte","beruht","blumen","gezählt","ulm","träume","einbezogen","fünfzehn","gekürzt","photos","fester","kehrte","wechselt","resultat","zweifellos","denkmal","design","erholung","gelebt","gedroht","mo","prinz","marktplatz","dirk","café","acht","mandat","haftbefehl","spätere","diente","parkplatz","künstlern","materials","g.","vögel","zählte","busse","video","digitale","albert","rezession","pferde","schriften","bekämpfen","bestellung","hunde","orte","schlimm","gedanke","beste","interviews","fünfte","trugen","selbstmord","früherer","schuhe","privat","medium","unbekannte","etc.","abgelegt","sichere","bosnische","friedhof","wände","stärkere","e.v.","bayerische","konten","wem","empfänger","renten","typisch","heuer","strecken","tal","linke","beeinflußt","votum","natürliche","vorhandene","angemessen","komplette","weimar","milch","anmeldung","monats","chemische","moslems","reich","rhythmus","werten","japans","mangelnde","übersetzt","landen","f.","ehepaar","netanjahu","genuß","mängel","coach","siedlung","kletterte","illegalen","schickt","sorgfältig","springen","kieler","welle","fehlten","traten","schock","negative","nötige","rwe","ford","glanz","schlacht","wirbt","kostete","anordnung","erwies","bochum","charme","begrüßte","ankunft","ingrid","gibt","ökologisch","klavier","faktor","schickte","söhne","verleger","toren","pakistan","aufregung","unterhalb","texten","investor","kannte","unbekannt","krebs","infotyp","offener","rühe","triumph","rät","zahlungen","engländer","chemischen","mühsam","ausbauen","e.","notfalls","bedingt","umgehend","wüste","zuschuß","wenigsten","kommune","gewerbe","experiment","darüber","angepaßt","indessen","d-mark","dortmunder","daraus","gänzlich","dasa","bester","zahlreiche","daraufhin","jahrestag","christa","bergen","geladen","grundlagen","dingen","belasten","steine","feldern","landstraße","ermittler","hsv","ausbruch","beschlüsse","anzubieten","liebe","streichen","stadthalle","pferd","vietnam","längeren","ausgeben","erzielten","währungen","darlehen","kälte","tennis","em","lektüre","zelle","chinesen","prüft","projekts","ermordung","lesung","einzelfall","fern","heiß","logik","gattung","schwung","staatschef","stasi","hildegard","bestehen","derzeitige","indirekt","fällig","aids","anleihen","warschau","womit","fernseher","weltbank","räumen","gedreht","gedicht","male","gewähren","angeordnet","rekord","vergnügen","erfunden","beseitigt","zulässig","gutachter","erwarte","nördlichen","auschwitz","genießt","erfolgte","füße","wechselte","wichtig","anstatt","älteste","baustelle","arbeitslos","nord","geduld","beweist","dörfer","muslime","tips","elf","aufnahmen","kontinent","beseitigen","billig","präsent","jetzige","ihrerseits","ach","mainzer","schichten","ärzten","erwartete","sex","lyrik","torwart","vornherein","platte","ressourcen","saßen","enorm","orientiert","verfahrens","knapp","ersten","prompt","vereinen","markus","präsidium","taucht","blockiert","hohes","leiterin","umstände","festhalten","fortan","strikt","einwohnern","feier","väter","israelis","filialen","http","erweisen","deswegen","mochte","knappen","kräftigen","bein","klar","verkaufte","derer","songs","beachten","gleichsam","schweigen","schwächen","lachen","bundesland","stärkung","anwender","boeing","usw","schießen","gebäudes","töchter","wäre","absturz","boot","alpen","landete","fahrbahn","verschärft","locken","dessen","gewordenen","kümmert","ggf","fünftel","religiöse","mehrzahl","feind","beklagen","unruhe","fühle","dichtung","fahrzeugen","verrät","nutzer","verbringen","beides","priester","nutzte","armen","überlebt","talent","festnahme","ältesten","einrichten","angelika","berechtigt","student","kauft","kuba","angesetzt","rechtliche","stichwort","dynamik","budapest","lücke","versorgen","übersicht","chefs","gewaltigen","mond","tragödie","kräften","neu","legende","zivilisten","mi","spätestens","ruanda","fahrrad","bescheiden","ankara","weibliche","nachteil","wenig","aktuell","zulassung","paß","revision","mittlere","pro","linien","gutem","infolge","kämpfer","autonomie","bewährung","erträge","jüngster","bestimmter","wichtiges","hoffmann","eintrag","patient","fördert","eigentum","besuchte","stationen","jubiläum","bad","freien","erwartung","gestärkt","rücken","biographie","annähernd","physiker","reporter","strich","privater","sechsten","stärkste","strebt","suchten","lernt","bestimmung","abgesetzt","wisse","van","rechts","ötv","hunger","manuell","notiert","stört","group","angefangen","heim","rätsel","beurteilen","jäger","gedrängt","gedruckt","schuld","lacht","einhaltung","stille","schwarzen","lothar","gesteckt","zuhörer","museums","stuttgart","urlauber","nächster","bestreiten","oftmals","bagdad","ewig","roland","prinzipien","steuert","heutzutage","piloten","maßgeblich","herstellen","globale","bulgarien","geredet","keiner","absoluten","sinkt","eingriff","überwunden","werkstatt","chicago","springen","zusage","stören","verlief","birgit","main","new","ergänzen","abgestimmt","kapazität","ertrag","bewahrt","erkannte","sportliche","hilfen","maßstab","geste","auswählen","freilich","bestritten","gebürtige","knoten","blicken","zone","wen","anderthalb","aufenthalt","rad","wille","richtete","versagt","zuletzt","exemplare","schulter","expansion","angetreten","gewünscht","begriffen","trost","verfasser","abitur","wenige","lieferte","liefen","kohle","zuschlag","geschäften","mißtrauen","schmerzen","entlastet","reinhard","tatsachen","freiburger","wirkliche","strengen","ironie","asyl","ständige","unlängst","träumen","praktische","moralische","deutsches","empörung","jüngere","fehlenden","russland","buchstaben","zorn","baute","begriffe","angekommen","knochen","fremde","mieten","leistet","zeichnen","bewirkt","früchte","fremd","umwandlung","wagen","nachhaltig","häftlinge","zerstören","listen","abbruch","en","demnach","sparte","thailand","siehe","notierte","schwache","broschüre","stuhl","lauten","wärme","devise","kameras","wirklichen","vorfall","mafia","ängste","polizist","starker","decke","auslösen","mannheimer","passanten","bald","aufkommen","ändern","sollten","bruno","budget","katholiken","begleiten","attraktiv","krone","sterne","jahrzehnt","wiese","jegliche","block","grab","entnehmen","dicke","freigabe","autorität","streiks","soeben","dieselbe","dilemma","wohlstand","aussteller","standorte","fängt","fisch","hitze","epoche","rückstand","entdeckten","lägen","angeklagt","benötigten","gestalten","plötzlich","verknüpft","bundesamt","erlös","real","trio","seoul","verläuft","klagte","anhörung","rasen","ferne","vorrang","verfügbar","mandanten","cursor","jelzins","projekten","begrüßen","insofern","bedeutende","gewählten","com","annäherung","mindestens","la","erfindung","bauten","drohung","beklagte","geistigen","längerem","zigaretten","c.","d.","bedenken","spiegelt","verwandten","fliegt","merkt","schulz","gerichts","vernichtet","unruhen","leinwand","tödlich","dunkle","bestreitet","nebenbei","ausweg","irakischen","rot","einstige","panik","untersagt","inhaber","rache","differenz","duisburg","priorität","susanne","willi","legen","versammelt","ebenen","köpfen","original","online","ingenieure","schuf","kirch","gaststätte","inmitten","sicherte","fehle","kliniken","sarajevo","gesund","stürzen","jens","typischen","lokale","neuwahlen","möller","turm","tanzen","party","warfen","appell","erreichbar","albanien","erwin","meyer","spielzeit","beliebt","konzerte","süd","besonderes","vorliegt","bewerten","grosny","soldat","hochzeit","verstärkte","umsonst","belgischen","akteure","intendant","akzeptanz","überlegt","spürt","silber","metropole","terror","setze","standards","nächstes","entsorgung","antwortete","frühzeitig","versöhnung","befanden","fremde","lehnen","erfurt","lachen","strand","mißbraucht","gründer","ruhm","extra","parkett","zuweilen","wolken","wählt","datei","areal","stammdaten","hang","gespart","russischer","größerer","heroin","ahnung","mittelfeld","trauer","sonstigen","florida","töten","toleranz","beurteilt","defizite","gedächtnis","behinderte","antonio","teheran","daimler","grauen","vollzogen","angehoben","schwestern","kategorie","gestört","berührt","ortsbeirat","umsetzen","menü","gespannt","unmut","wohnen","afp","überfallen","radikalen","übliche","gestürzt","erneuerung","venedig","axel","verordnung","bar","kloster","vermißt","einem","staub","betreten","s-bahn","istanbul","illegale","schmerz","elend","erdbeben","gewöhnt","obersten","schlugen","bestens","basiert","summen","jeweilige","abgelöst","erhebt","potsdamer","erneuten","decken","verlautete","theaters","na","künstlerin","engagieren","scharfe","kalten","entzogen","bedeckt","benzin","störungen","seither","diktatur","kanal","hansestadt","günstige","getestet","attentat","beck","lübeck","sir","pech","verbieten","eier","zeitlich","libanon","verwaltet","vorsieht","holocaust","untergang","spannend","zuwenig","mächtigen","p.","verwandeln","zukommen","komponist","aktivität","einbringen","zwang","dauerhaft","einträge","sichtlich","schmuck","romane","atem","beträge","dasselbe","behauptete","angehört","bund","klingen","gene","zaire","ansätze","irgend","archiv","basf","resonanz","enorme","landwirte","handwerker","algerien","reiz","plattform","zagreb","beweise","erstellung","historisch","brd","burg","anfragen","kriegsende","stockholm","anweisung","kreises","hölle","betrachter","vermieter","beitritt","altes","anlauf","reichtum","reagierten","blüm","fit","markieren","ginge","verleihen","analysiert","heiligen","eingabe","enormen","einfluss","kairo","kämpfen","typische","zuerst","empört","befehl","gemüse","aachen","verweigern","veränderte","beendete","massaker","mordes","korrigiert","eingestuft","typen","anstelle","cdu/csu","illusion","grunde","landesbank","james","klärung","daheim","umzusetzen","endlich","fach","landsleute","realen","poesie","bahnen","berger","gremien","konzeption","zustände","aol","euphorie","libero","umgeben","sexuellen","gebäuden","bunte","duell","fahrgäste","südamerika","spektrum","half","charles","rot","einkauf","verlegen","verhängt","gedrückt","fuchs","ordentlich","marken","kg","gedeckt","hierbei","antwortet","einordnung","satelliten","sektor","paket","charlotte","günstiger","befragt","verwickelt","freitags","allerlei","geltende","iranischen","problemlos","vollem","massen","sicherer","widmen","liegenden","jährliche","erwischt","diversen","straßburg","drohenden","doppelte","genauen","räuber","zwingt","major","allesamt","hamburgs","montags","ernährung","auftreten","streifen","rechnungen","marianne","würzburg","fassade","kenntnisse","gekämpft","möge","adressen","beendigung","baby","abgesagt","umsatzes","beliebig","ferien","griechen","flaschen","panzer","traurig","verdrängt","verstoßen","ämter","klinsmann","labor","noten","legendären","nachweis","gewöhnlich","trainiert","basel","materie","behindert","anschläge","niedrige","abstieg","rexrodt","engagierte","kreuzberg","kreuzung","stützen","wellen","dritter","anhebung","ermittlung","volker","gebühr","treuhand","großstadt","aufsehen","experte","liberalen","kassiert","vehement","laufbahn","reichstag","unfälle","darum","versuche","gleicht","ritter","physik","einmalige","präzise","biete","welten","sed","leib","thyssen","darunter","schwarze","beantragen","tatort","objekten","westeuropa","gelben","visionen","berühmt","resolution","jemanden","katharina","aufstand","teilten","mächtig","beschwerde","kette","clintons","unterkunft","gymnasium","profi","bibel","muß","meinungen","sobald","erfolglos","roth","lippen","möbel","frühstück","basler","dritter","verbirgt","diepgen","bildeten","schicht","freie","besetzen","leere","klassiker","weile","schlafen","paradies","startete","elke","dänischen","schlange","virus","zurück","huber","spiele","geschenk","ausgemacht","lizenz","mario","betracht","george","ii.","mangels","gitarre","u-bahn","arbeiteten","bitter","brücken","gesang","rassismus","löwen","oberste","errechnet","elbe","taktik","fische","seitens","bewährt","umstand","wiesen","geräten","erhaltung","äußeren","heiligen","siegte","pflegt","geforderte","ps","logistik","nie","belegte","insofern","sonntags","leid","format","bogen","regeln","handy","gewaltige","kabel","dazwischen","identisch","nah","onkel","abwarten","mozart","proben","sparkassen","abgenommen","rot-grün","entlasten","ioc","breiter","schwaben","echt","treu","techniken","stephan","führender","lupe","braun","fußgänger","abwicklung","testen","anzunehmen","pkw","saarland","spontan","raketen","bösen","zulegen","geeignete","verletzte","bedauert","liebhaber","henkel","platten","adolf","laden","worauf","billionen","beinen","genügen","untergrund","ansichten","jeden","verbrauch","veranlaßt","wodurch","überhaupt","inneren","zumal","nebel","favoriten","vermutlich","lustig","ignoriert","seminar","buchen","begleitung","bringe","wovon","begründen","neigung","jurist","verlängern","reiter","erspart","tänzer","friedlich","boom","lebendig","harmonie","überholt","plädierte","spalte","siedler","kohls","scharfen","world","temperatur","paare","drehte","fuhren","sauber","gesteuert","anbietet","maske","ausmachen","ähnliches","container","werkzeuge","schwächer","begeben","schultern","ding","diverse","luftwaffe","offiziere","westens","sendungen","vorgeführt","ordnen","belege","angebliche","zivilen","schoß","erben","geistige","matthäus","klein","bekenntnis","minder","vorkommen","insassen","schild","lehrerin","verübt","angeboten","foyer","erfassung","kundschaft","focus","zulassen","zählern","ferrari","gültig","kundgebung","frühestens","werkes","horizont","beziffert","rubel","gekündigt","bedeutete","semester","kripo","verpaßt","bescheid","erfreut","abfall","flughäfen","königs","multimedia","korrektur","bekräftigt","spekuliert","kredit","buche","breite","aufbringen","springt","möglicher","empfunden","staatlich","flasche","boris","uns","amtlichen","hessischen","torhüter","on","mitmachen","zukünftig","wilden","chile","schüsse","irgendwann","netzwerk","eingelegt","wenngleich","passagen","ehrlich","v.","erlebnis","unerwartet","zitierte","schottland","gutes","bäumen","erstens","vormittag","steuerung","faßt","schuster","mauern","kreml","slowakei","vermutung","wohnzimmer","westlich","radikale","windows","solide","comeback","dritte","kroatische","karadzic","edith","wertete","endspiel","bezahlung","vulkan","freute","gehälter","deuten","stetig","joseph","neueste","hallen","hierzu","kriege","koffer","herrscher","laune","brunnen","gültigen","verschafft","wehrt","willkommen","ansehen","geglaubt","berufliche","audi","erschöpft","billigen","stolpe","abap","stehende","hätte","bonn","besatzung","geführten","betonen","nahen","visier","aufrufen","applaus","esslinger","ertragen","bielefeld","blues","amtes","nationalen","seltener","gewiß","viermal","entführung","beschert","gesteht","erneute","heimlich","nannten","klarer","stirn","wälder","ruth","männliche","lockt","schlaf","bargeld","motivation","ideologie","peinlich","urteile","anzusehen","merken","göttingen","standpunkt","nervös","härte","verstoß","entfällt","verlangten","tägliche","geflogen","einsamkeit","zeitplan","derartigen","schieben","äußert","siege","rau","schauspiel","festlegung","vertretung","simon","seehofer","bildete","kriegt","weichen","werks","augsburger","verkäufer","betreffen","seiten","margarete","lebensjahr","debatten","ergänzung","eisen","verdankt","geldes","wild","allen","detlef","publikums","beschrieb","sprang","künftig","vertreiben","schmalen","bloße","abgabe","wunderbar","lernte","umland","lire","kaufte","ideale","operativen","aufhalten","pistole","zugelegt","schein","sympathie","höherer","stufen","werdenden","flut","drohe","künstlers","verkauften","fernen","kanzleramt","anblick","ringen","aktionären","will","bedacht","tauchen","erlöse","galten","heben","residenz","teilung","stammende","doris","besaß","moderator","lutz","auskünfte","nordirland","bewerbung","elfriede","spieltag","stillen","lehrern","sparpaket","auslöser","müssten","veba","programmen","neuordnung","gouverneur","wertvolle","zeug","überall","münchens","ausüben","bande","durchweg","ausführen","trainieren","goldenen","exporte","einblick","polens","vorzüge","stützt","heike","kalte","echo","witwe","ehrgeiz","ehren","kaufpreis","feinde","betrug","skulpturen","telecom","erobert","eingebaut","nationaler","angeregt","kanther","auftritte","energien","eintreten","regelrecht","dankbar","sichern","sängerin","verlagert","ba","bremsen","unschuld","aktiviert","palette","dieselben","finanzamt","nachteile","hitlers","gerda","nigeria","bewirken","bezüglich","äußerung","hürden","bleibt","ostern","regensburg","richtig","glaube","harry","verbreiten","manch","ursprung","oliver","analysen","erarbeiten","entfernten","rechne","sogleich","erzähler","flog","intern","zukünftige","volkswagen","emotionen","virtuellen","intensive","blaue","prinzessin","sydney","geringere","schade","elektronik","gewisser","auswirken","samstags","filiale","hierarchie","abgezogen","etabliert","shell","tätigen","kids","radfahrer","optimal","kuchen","sexuelle","mars","gefangene","verbergen","kaufmann","strenge","friedliche","metall","kranken","zähne","niemandem","schwarzer","verlorenen","ausgelegt","maastricht","verlage","wandern","gebilligt","verwirrung","liberale","leere","bemühen","einbußen","strafen","östlich","verdachts","sätzen","eingriffe","wänden","unterm","übt","verliebt","widmet","lobt","ira","neun","millimeter","vorgehen","porsche","spruch","langweilig","schiebt","tödlichen","bomben","beinhaltet","kurzerhand","zweiter","hörer","gestand","einwände","jedermann","enkel","entfernen","unterhält","paragraph","unsicher","thesen","american","aufbruch","buchung","beachtung","ausgeht","gesetzen","lebe","strategien","systemen","handle","hauch","fronten","podium","löcher","feinen","wagt","trage","bewegte","mehmet","jesus","national","zweitens","vorab","äußerten","la","gerhardt","ilse","amtierende","protesten","lernen","klang","bemerkbar","zeugnis","william","jena","ungewiß","rollen","gewertet","sonstige","verrückt","vorwürfen","souverän","blutigen","güter","lokal","ausreichen","abgerissen","marsch","frühling","aufhören","verhaftung","hahn","optionen","erfinder","bewerben","momente","kleinste","entführt","kräftige","v.","einnehmen","anstalt","körpers","frühe","zimmermann","mathematik","texas","dag","befördert","externen","schwere","malaysia","einseitig","vereint","company","geeigneten","geübt","begraben","geteilt","prüfungen","konsum","arena","nachdenken","kg","insekten","entwürfe","empfinden","haufen","zunehmen","umfassen","offenheit","albaner","szenario","kopieren","glatt","verkraften","techniker","saniert","todes","dominiert","sichert","netze","heft","aufsteiger","tonne","tel","kehren","verfaßt","föderation","formular","entworfen","referendum","örtliche","warm","niedergang","meldeten","eintracht","verärgert","kommunale","spektakel","einführen","donau","luxus","geringeren","diagnose","streß","wahlgang","weiterhin","verfall","morgigen","toten","großzügig","bestellen","kurdischen","kollegin","wozu","besseres","prozesses","plakate","tendenzen","hinauf","zerstörten","clubs","stamm","fein","entgehen","heftiger","nebenan","gesunden","bosniens","schützt","standorten","gewaltig","angela","sparkasse","duo","bedürfnis","friedens","stücken","löschen","herrschen","beamter","nordkorea","wörter","fliehen","nachdruck","erna","einzeln","ausschluß","porträt","doppelten","jedesmal","bvg","erledigen","trocken","rückgabe","flüge","etappe","wählte","vorurteile","reist","eher","beton","abfahrt","anhängern","eindeutige","gießen","anmelden","tee","spiels","hinterlegt","ländlichen","entkommen","bürokratie","siebten","stünde","wiederwahl","verstehe","sonstige","las","gewartet","lübecker","verfehlt","tschechen","versuchen","hose","schwerin","chemnitz","hiesigen","segen","ästhetik","geschenkt","somalia","übergabe","somit","entspreche","schier","maus","erkrankung","abbauen","redner","sammler","kommando","erregt","bischöfe","feierten","mr.","unsinn","knappe","album","media","durchgang","radikal","kneipe","kopenhagen","zweite","dichters","anzulegen","bezweifelt","funk","härter","verbrannt","vertrages","geldstrafe","überwachen","gelegene","künstlich","gefangen","gewordene","bekannten","scheidung","isoliert","rasche","bestritt","gewollt","eingegeben","qm","zweitens","salzburg","gerissen","erobern","verlusten","favorit","betroffene","empfahl","sagen","flughafens","sechzig","trieb","neuseeland","kolumbien","aufteilung","schritten","schönste","handlungen","hammer","denselben","doktor","ungeachtet","erhebung","vorrangig","martina","profit","belange","net","sap-system","umgebracht","guten","sohnes","entweder","kranke","zwingend","wofür","benötigte","sammelt","rtr","gift","vermittler","langsamer","buchungen","bindung","richtungen","verdienst","pünktlich","kennzahlen","kader","verfallen","verbraucht","gelandet","bse","fußballer","handels","klientel","aufgeteilt","belohnt","stz","gefährdung","hilflos","adam","spaniens","null","aktivieren","abzubauen","sports","anbau","wecken","westlicher","beachtet","arbeite","kugel","töpfer","anregungen","wdr","ewigen","gerieten","kardinal","terrain","bemerkte","schwebt","überschuß","verbotenen","krisen","nordosten","reifen","rabin","bestände","einspruch","fühlten","sparen","gärten","vernehmen","aufweisen","wahnsinn","autobahnen","birgt","schauplatz","folter","bauen","match","siedlungen","befunden","etablieren","services","indianer","ausrüstung","aok","weißen","auskommen","blockieren","verletzte","tragen","kasten","vorliebe","entnommen","georgios","halbinsel","verschwand","hauptsache","britischer","gus","ergaben","inhaltlich","streichung","ökologie","irmgard","ergriffen","erteilen","zielgruppe","zeichnete","reißt","holger","gestimmt","blüten","pathos","gewechselt","übte","island","jahrgang","intensiver","überwacht","pflichten","verschont","operiert","künstliche","drohende","sterben","reserven","strahlung","bekennt","klappt","wortes","versagen","ecken","rezept","gestattet","fahnen","reichten","fremden","nutzten","warten","johnson","grün","zügig","ähnlicher","erstreckt","johanna","absolviert","misere","ingenieur","montage","scheitert","gesten","realismus","trends","europaweit","dumm","briefen","inge","psychisch","attacken","energisch","treppe","sperre","wegfall","sehen","händlern","gerückt","zwölf","einigkeit","dublin","achtung","wahrnehmen","riefen","provinzen","freispruch","ergreifen","gezielte","spart","trauen","vorbehalte","jubel","mittag","absprache","vermehrt","rückte","ihres","darsteller","ablehnen","konzipiert","alliierten","laien","geister","gewählte","ulrike","bemerkung","abseits","mahnte","bezüge","gesunde","geht","anstoß","essener","server","abgaben","wundert","just","gezeichnet","probe","drehbuch","echter","medaille","sekte","sonderlich","kannst","musical","binden","prosa","schlechtes","aufsicht","zielt","vertrat","lieber","heiraten","vorschrift","lehrt","verstand","hilfreich","ahnen","hannelore","gewebe","garantie","offizier","verbietet","schönes","import","agieren","kleider","eberhard","kulisse","geständnis","per","siegen","gentechnik","einsätze","verleiht","andern","herunter","verbuchen","bush","gewandt","schöne","bedrohten","verletzten","offenbart","begleiter","propaganda","erschwert","rüttgers","feiern","tarife","komisch","fähig","bands","jeans","helsinki","zuversicht","ärgert","maßstäbe","stau","geborgen","beruhigt","nasdaq","gebot","äußere","verhält","rehhagel","d.","song","kategorien","viktor","überzogen","reste","winzigen","spreche","parkplätze","atomwaffen","wimbledon","messungen","jedoch","einklang","verborgen","bände","kuwait","pop","wettkampf","marie","absurd","zentren","meist","dutzende","angestrebt","oslo","wirt","ausflug","verdienste","englischer","ernte","private","warmen","ude","olg","wollen","weltmarkt","positives","gen","längst","leid","woher","gehörende","trennt","sternen","geistig","tricks","lehmann","obst","konsortium","fehlen","reale","höchst","mitarbeit","alleingang","viren","südosten","operative","drohungen","gorleben","großvater","antike","erbracht","rivalen","zugegeben","besten","hemd","kommt","spree","geräumt","relevanten","kontext","springer","brutal","reißen","fasziniert","besserung","bezirke","nahverkehr","einziehen","zielen","notenbank","erholt","friedberg","oldenburg","eduard","behält","textilien","postbank","genfer","treiben","bewohnern","willen","viag","besondere","hosen","landet","michel","novelle","kläger","kapitals","stabile","entfielen","frust","stießen","beiseite","weh","hill","effekte","sofortige","langen","geführte","reserviert","dritten","qualitäten","auslegung","lkw","ökonomie","rose","wilde","verdoppeln","stürzt","einbrecher","kostenlose","normen","begrenzen","zurecht","attraktive","know-how","dick","schilling","marokko","kreistag","verletzten","belgische","lehnten","vergangen","nummern","irischen","zählten","eingespart","aufzugeben","prager","bronze","hartmann","anlegern","sprich","landsmann","anpassen","t.","iv","abermals","regieren","gegnern","stämme","räder","stillstand","nirgendwo","kartoffeln","franzose","erlaubnis","strauß","fing","transrapid","fabriken","anc","airbus","tagebuch","islamische","reparatur","befragung","geheimen","rollt","jutta","ulmer","fotografen","seen","angelegten","ezb","eingreifen","traut","kleinsten","zusagen","milieu","mithin","hügel","anhaltende","kürzen","zyklus","wolfsburg","flüsse","betreuen","sitzungen","abgang","bequem","schwärmt","appelliert","anneliese","angetan","welch","beteuert","ankommt","demselben","ausgezahlt","harter","intel","politische","grafik","anzug","iranische","metro","verkörpert","zehnten","di","meinten","treue","erörtert","flexibel","gras","tenor","versionen","nordsee","absichten","abzugeben","schaden","wehrmacht","utopie","marion","steigerte","henry","dementiert","irrtum","blicke","gelbe","irene","senden","dunkelheit","vorträge","slowenien","referent","einigten","bunt","verbänden","entsprach","verbrachte","fahne","folglich","erscheinen","oberhalb","träumt","hohe","drückte","university","verbucht","bewag","nordwesten","kaputt","sv","verdiente","pilot","großmutter","erfreulich","reiste","soweit","lohnarten","kokain","vernehmung","tempel","fernsehens","lebed","dietrich","repertoire","frischen","theologie","zucker","schwersten","lächelt","götter","abbildung","taten","schafe","bar","vergrößert","kursen","zimmern","angreifer","organe","peru","mussten","lächerlich","gesungen","aufgeklärt","getränke","externe","fund","ddr-zeiten","bezog","feine","ingeborg","reis","gesamtjahr","hubert","beschließt","beate","supermarkt","bliebe","höchster","geschlecht","dom","betreuer","zueinander","boykott","fachleuten","dietmar","computern","hartmut","ostsee","bekämpft","nähere","schiene","irakische","verlegung","spalten","rio","getreide","konrad","selektion","litauen","intensität","elite","anruf","stärken","kopie","einmalig","wundern","plädoyer","messen","verließen","los","handvoll","sitzen","manchem","nehmen","verhelfen","angriffen","peres","sparten","indische","zivile","symbole","gehörenden","kommentare","wünschen","wählern","auftritt","dringt","befragten","runter","dirigent","vernünftig","schmitt","festivals","angenehm","virtuelle","mustafa","nützt","zügen","schienen","großhandel","jüdischer","sony","geplant","nagel","gulden","ambiente","schreiber","seltsam","kleinstadt","gelitten","mitteilt","philips","hafenstadt","derlei","dunkel","typs","halt","abzusehen","story","hierbei","schmid","kurve","heer","abriß","besonderes","kritikern","jeglicher","bundesbahn","abgewiesen","einerseits","obendrein","wohnraum","mostar","haaren","wartete","merkel","übung","tagsüber","romantik","vierzehn","eroberung","winkel","wahlsieg","global","quartett","erneuert","grundsätze","sog","effizienz","philosoph","treff","glaubten","dörfern","bühnen","ne","herzlich","nachdenken","ergänzte","sponsor","entschluß","meiste","wunden","geflohen","geehrt","höhen","gelernte","recherchen","helene","sportlich","angehen","unterlag","rinder","dreck","ei","allgemeine","hindernis","technische","umgebaut","scheibe","nominiert","kenia","drastische","angeführt","überdies","fiskus","plastik","blockade","mama","verbund","tiger","ruhen","mithalten","namentlich","verwandt","anne","absehbarer","schluss","konstanz","gen","veto","knapper","scheiben","frische","verkünden","wirkten","anbietern","mächtige","jakob","haushalten","olga","vorhang","weltweit","spaltung","langeweile","pleite","symptome","bekannter","stalin","sachlich","mittag","tante","drucker","route","antiken","starkes","kompletten","häufigsten","börsianer","unnötig","vorabend","hinunter","konstant","weißer","ethik","abfälle","mailänder","ivan","mohamed","wieviel","fröhlich","zoo","größeres","sauerstoff","eichel","stückliste","deutschem","sinnvolle","kämpfte","salz","martha","rauch","videos","drucken","gestützt","plutonium","älterer","ingolstadt","heimspiel","adler","riß","phasen","boten","verbracht","nikolaus","mitleid","parolen","bekomme","besser","zusätze","arg","routine","tätern","afrikas","morde","erfolgen","red","hebron","us","zunge","wiegt","felix","kunststoff","reichweite","deutete","smith","satzung","ladung","stichtag","ltd","zutiefst","eingeplant","albrecht","konkurrent","motoren","normalität","rückschlag","griffen","erweiterte","keines","erteilte","kalender","kühl","vage","bewies","beachten","nrw","gefertigt","dasein","einfallen","entfalten","fangen","erwarb","auszubauen","juristisch","normaler","brille","formal","rückgängig","buben","verdammt","stärkeren","empfindet","öffnete","lüge","makler","flüchtete","ernsthafte","drohten","nächte","vormittag","anschein","innovation","rufnummer","reisenden","verstand","elementen","dienten","änderte","problems","kenner","taxifahrer","ad","dienstags","tübinger","haustür","runden","verzögert","dateien","dimitrios","gereicht","sanft","gehen","research","oskar","tribüne","gültigkeit","verstecken","kunsthalle","vorfahren","akzente","begrenzung","reisende","jordanien","alarm","eignet","wirkungen","christel","wobei","angewandt","schätzung","sexualität","gewürdigt","arme","diktator","fenstern","arnold","schießt","verkürzt","oberbayern","jeher","gefühlen","vwd","seltenen","et","serviert","dahinter","vatikan","neubauten","logische","versäumt","umzugehen","ambitionen","geprägten","eingezogen","analyst","deine","schloss","fc","teils","euch","nationale","innere","kabarett","fundament","ernennung","vertagt","williams","krupp","wahrlich","verwundert","zelt","motiven","laufe","reichen","lücken","beihilfe","bebauung","mehrheiten","abgesehen","sound","ethnischen","fulda","einsteigen","raten","gewißheit","regisseure","weit","gläubiger","nochmal","christiane","wehr","gemalt","diesem","note","palast","verfolgte","graue","schröders","sauer","begnügen","tötung","roten","anderem","verbundene","strahlt","abgestellt","nachbar","libyen","talente","gedichten","korea","haftstrafe","networks","bekennen","erstattet","horn","werkzeug","trick","rückblick","kunstwerke","regulären","papa","indiz","kiew","gewagt","halbwegs","besiegt","udo","beruhigen","toll","dotierten","spd-chef","miami","plakat","zitat","ungeklärt","arbeitern","einflüsse","bnd","satire","akte","durchsucht","gab\'s","brav","segment","geraumer","mitteilen","klang","gepäck","effektiv","überwiesen","römische","warnungen","flagge","ballett","ausgeübt","landung","weisheit","schlichten","prophezeit","mantel","eh","überein","oberursel","liebevoll","baden","taschen","adac","flecken","verankert","jochen","gunst","populär","prominente","beruft","kanäle","allee","ganzer","klug","hierher","eigen","boston","abtreibung","arabische","siebzig","anschlägen","des","wto","kassieren","kriterium","aufträgen","tausenden","redakteur","klischees","dein","sucht","erhob","verschickt","umfasst","leder","eins","bezug","brecht","abstimmen","thüringer","lieferten","dänische","entspannt","rektor","beiträgen","gestritten","füllt","ressorts","zutage","kürzer","dünn","baumann","umso","hürde","planer","belebung","infos","anja","desaster","erstens","böse","regt","lenken","steigender","kündigen","besetzte","gegriffen","billige","beliebten","wünsche","sang","zensur","ost-berlin","preußen","marine","erdgas","erzwingen","anwesend","schläge","unheimlich","pflanze","kühe","litt","derjenigen","nett","achtzig","größen","heilbronn","globus","hindurch","bodensee","atelier","geliebten","kopiert","kanzlers","einmaligen","gehör","gemein","leitungen","erstmal","eingeweiht","inwieweit","konvention","auftauchen","florenz","avantgarde","ablösung","versichern","teilchen","anbindung","lee","diana","ereignete","mobilität","hellen","jean","monitor","verspätung","christina","25jährige","holländer","abzuwarten","neugier","mangelt","humanitäre","kindergeld","deal","erprobt","aggressiv","angestellt","de","böden","sg","blind","innovative","astronomen","tiergarten","eisenbahn","sensation","bekannte","zehntel","brauchten","kombiniert","pädagogen","srebrenica","goethes","rutschte","begrenzten","bremens","wertet","kronen","nähert","moralisch","jenseits","vorweisen","tankstelle","schwelle","liegende","begrenzte","optimale","parat","hauptrolle","sich","rover","anstalten","raumfahrt","steinen","entgegen","lud","alptraum","dayton","sozialamt","jahreszeit","verwertung","angerufen","kündigten","würden","munition","unterliegt","sauna","sporthalle","aufschrift","amtliche","pence","magen","jude","steckte","belgrader","gnade","weithin","heimische","letzte","dtb","reisebüros","niedrigere","mazedonien","zentral","schimpft","faschismus","verrat","islamisten","rückläufig","30jährige","blättern","mandate","verwalten","zeichnung","verstöße","ratten","königreich","pension","deckung","erdgeschoß","mythen","englisch","lagern","jünger","geruch","aufstellen","wörtlich","zigarette","entsetzen","angewendet","le","coup","störung","uniform","steigert","seminare","fehlern","orden","thron","agenten","osze","kontrast","senders","teppich","titeln","eur","erreger","satt","ute","julia","frage","zahlte","prinzen","stabilen","reports","schade","belaufen","beantragte","carl","einnahme","aneinander","beläuft","fahrten","südafrikas","uhren","rosa","brauerei","erstaunt","parallel","jordan","antworten","araber","bayreuth","beirat","ewige","münzen","passende","packen","king","vorgängen","drüben","apple","beethoven","ampel","kabul","körperlich","warteten","parks","obersten","zirkus","wiesen","bezifferte","renditen","diplomat","weite","bewegten","beschwert","kunstwerk","banker","baustellen","bdi","vergebens","minen","dax","extremen","erlebnisse","belohnung","wichtigste","komplexen","zerstörte","trendwende","plaziert","gültige","schubert","hoch","vergessen","totale","buchen","gewinnen","moskaus","innern","nützlich","bedauerte","nix","käse","erzbischof","ausfall","konflikts","goldene","marx","erhoffen","längerer","geliebte","völlig","landesweit","dominieren","bittere","versetzen","abgehalten","chemiker","einsam","blau","anregung","kameraden","wilfried","schalke","zusatz","unweit","illusionen","bemühte","klares","einsparen","anführer","fliegen","bedrohte","vorläufige","vorbilder","betonten","verfügte","bloßen","berät","gemerkt","verwehrt","hütte","nebst","theorien","angeblich","kaufhaus","atlantik","tief","hertha","gängigen","leuchtet","berufe","bezirken"]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_wordlists_en_json.chunk.js b/cypress/fixtures/v3-client/locale_res_wordlists_en_json.chunk.js deleted file mode 100644 index 8e4d735d..00000000 --- a/cypress/fixtures/v3-client/locale_res_wordlists_en_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_wordlists_en_json"],{ - -/***/ "../locale/res/wordlists/en.json": -/*!***************************************!*\ - !*** ../locale/res/wordlists/en.json ***! - \***************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('["abacus","abdomen","abdominal","abide","abiding","ability","ablaze","able","abnormal","abrasion","abrasive","abreast","abridge","abroad","abruptly","absence","absentee","absently","absinthe","absolute","absolve","abstain","abstract","absurd","accent","acclaim","acclimate","accompany","account","accuracy","accurate","accustom","acetone","achiness","aching","acid","acorn","acquaint","acquire","acre","acrobat","acronym","acting","action","activate","activator","active","activism","activist","activity","actress","acts","acutely","acuteness","aeration","aerobics","aerosol","aerospace","afar","affair","affected","affecting","affection","affidavit","affiliate","affirm","affix","afflicted","affluent","afford","affront","aflame","afloat","aflutter","afoot","afraid","afterglow","afterlife","aftermath","aftermost","afternoon","aged","ageless","agency","agenda","agent","aggregate","aghast","agile","agility","aging","agnostic","agonize","agonizing","agony","agreeable","agreeably","agreed","agreeing","agreement","aground","ahead","ahoy","aide","aids","aim","ajar","alabaster","alarm","albatross","album","alfalfa","algebra","algorithm","alias","alibi","alienable","alienate","aliens","alike","alive","alkaline","alkalize","almanac","almighty","almost","aloe","aloft","aloha","alone","alongside","aloof","alphabet","alright","although","altitude","alto","aluminum","alumni","always","amaretto","amaze","amazingly","amber","ambiance","ambiguity","ambiguous","ambition","ambitious","ambulance","ambush","amendable","amendment","amends","amenity","amiable","amicably","amid","amigo","amino","amiss","ammonia","ammonium","amnesty","amniotic","among","amount","amperage","ample","amplifier","amplify","amply","amuck","amulet","amusable","amused","amusement","amuser","amusing","anaconda","anaerobic","anagram","anatomist","anatomy","anchor","anchovy","ancient","android","anemia","anemic","aneurism","anew","angelfish","angelic","anger","angled","angler","angles","angling","angrily","angriness","anguished","angular","animal","animate","animating","animation","animator","anime","animosity","ankle","annex","annotate","announcer","annoying","annually","annuity","anointer","another","answering","antacid","antarctic","anteater","antelope","antennae","anthem","anthill","anthology","antibody","antics","antidote","antihero","antiquely","antiques","antiquity","antirust","antitoxic","antitrust","antiviral","antivirus","antler","antonym","antsy","anvil","anybody","anyhow","anymore","anyone","anyplace","anything","anytime","anyway","anywhere","aorta","apache","apostle","appealing","appear","appease","appeasing","appendage","appendix","appetite","appetizer","applaud","applause","apple","appliance","applicant","applied","apply","appointee","appraisal","appraiser","apprehend","approach","approval","approve","apricot","april","apron","aptitude","aptly","aqua","aqueduct","arbitrary","arbitrate","ardently","area","arena","arguable","arguably","argue","arise","armadillo","armband","armchair","armed","armful","armhole","arming","armless","armoire","armored","armory","armrest","army","aroma","arose","around","arousal","arrange","array","arrest","arrival","arrive","arrogance","arrogant","arson","art","ascend","ascension","ascent","ascertain","ashamed","ashen","ashes","ashy","aside","askew","asleep","asparagus","aspect","aspirate","aspire","aspirin","astonish","astound","astride","astrology","astronaut","astronomy","astute","atlantic","atlas","atom","atonable","atop","atrium","atrocious","atrophy","attach","attain","attempt","attendant","attendee","attention","attentive","attest","attic","attire","attitude","attractor","attribute","atypical","auction","audacious","audacity","audible","audibly","audience","audio","audition","augmented","august","authentic","author","autism","autistic","autograph","automaker","automated","automatic","autopilot","available","avalanche","avatar","avenge","avenging","avenue","average","aversion","avert","aviation","aviator","avid","avoid","await","awaken","award","aware","awhile","awkward","awning","awoke","awry","axis","babble","babbling","babied","baboon","backache","backboard","backboned","backdrop","backed","backer","backfield","backfire","backhand","backing","backlands","backlash","backless","backlight","backlit","backlog","backpack","backpedal","backrest","backroom","backshift","backside","backslid","backspace","backspin","backstab","backstage","backtalk","backtrack","backup","backward","backwash","backwater","backyard","bacon","bacteria","bacterium","badass","badge","badland","badly","badness","baffle","baffling","bagel","bagful","baggage","bagged","baggie","bagginess","bagging","baggy","bagpipe","baguette","baked","bakery","bakeshop","baking","balance","balancing","balcony","balmy","balsamic","bamboo","banana","banish","banister","banjo","bankable","bankbook","banked","banker","banking","banknote","bankroll","banner","bannister","banshee","banter","barbecue","barbed","barbell","barber","barcode","barge","bargraph","barista","baritone","barley","barmaid","barman","barn","barometer","barrack","barracuda","barrel","barrette","barricade","barrier","barstool","bartender","barterer","bash","basically","basics","basil","basin","basis","basket","batboy","batch","bath","baton","bats","battalion","battered","battering","battery","batting","battle","bauble","bazooka","blabber","bladder","blade","blah","blame","blaming","blanching","blandness","blank","blaspheme","blasphemy","blast","blatancy","blatantly","blazer","blazing","bleach","bleak","bleep","blemish","blend","bless","blighted","blimp","bling","blinked","blinker","blinking","blinks","blip","blissful","blitz","blizzard","bloated","bloating","blob","blog","bloomers","blooming","blooper","blot","blouse","blubber","bluff","bluish","blunderer","blunt","blurb","blurred","blurry","blurt","blush","blustery","boaster","boastful","boasting","boat","bobbed","bobbing","bobble","bobcat","bobsled","bobtail","bodacious","body","bogged","boggle","bogus","boil","bok","bolster","bolt","bonanza","bonded","bonding","bondless","boned","bonehead","boneless","bonelike","boney","bonfire","bonnet","bonsai","bonus","bony","boogeyman","boogieman","book","boondocks","booted","booth","bootie","booting","bootlace","bootleg","boots","boozy","borax","boring","borough","borrower","borrowing","boss","botanical","botanist","botany","botch","both","bottle","bottling","bottom","bounce","bouncing","bouncy","bounding","boundless","bountiful","bovine","boxcar","boxer","boxing","boxlike","boxy","breach","breath","breeches","breeching","breeder","breeding","breeze","breezy","brethren","brewery","brewing","briar","bribe","brick","bride","bridged","brigade","bright","brilliant","brim","bring","brink","brisket","briskly","briskness","bristle","brittle","broadband","broadcast","broaden","broadly","broadness","broadside","broadways","broiler","broiling","broken","broker","bronchial","bronco","bronze","bronzing","brook","broom","brought","browbeat","brownnose","browse","browsing","bruising","brunch","brunette","brunt","brush","brussels","brute","brutishly","bubble","bubbling","bubbly","buccaneer","bucked","bucket","buckle","buckshot","buckskin","bucktooth","buckwheat","buddhism","buddhist","budding","buddy","budget","buffalo","buffed","buffer","buffing","buffoon","buggy","bulb","bulge","bulginess","bulgur","bulk","bulldog","bulldozer","bullfight","bullfrog","bullhorn","bullion","bullish","bullpen","bullring","bullseye","bullwhip","bully","bunch","bundle","bungee","bunion","bunkbed","bunkhouse","bunkmate","bunny","bunt","busboy","bush","busily","busload","bust","busybody","buzz","cabana","cabbage","cabbie","cabdriver","cable","caboose","cache","cackle","cacti","cactus","caddie","caddy","cadet","cadillac","cadmium","cage","cahoots","cake","calamari","calamity","calcium","calculate","calculus","caliber","calibrate","calm","caloric","calorie","calzone","camcorder","cameo","camera","camisole","camper","campfire","camping","campsite","campus","canal","canary","cancel","candied","candle","candy","cane","canine","canister","cannabis","canned","canning","cannon","cannot","canola","canon","canopener","canopy","canteen","canyon","capable","capably","capacity","cape","capillary","capital","capitol","capped","capricorn","capsize","capsule","caption","captivate","captive","captivity","capture","caramel","carat","caravan","carbon","cardboard","carded","cardiac","cardigan","cardinal","cardstock","carefully","caregiver","careless","caress","caretaker","cargo","caring","carless","carload","carmaker","carnage","carnation","carnival","carnivore","carol","carpenter","carpentry","carpool","carport","carried","carrot","carrousel","carry","cartel","cartload","carton","cartoon","cartridge","cartwheel","carve","carving","carwash","cascade","case","cash","casing","casino","casket","cassette","casually","casualty","catacomb","catalog","catalyst","catalyze","catapult","cataract","catatonic","catcall","catchable","catcher","catching","catchy","caterer","catering","catfight","catfish","cathedral","cathouse","catlike","catnap","catnip","catsup","cattail","cattishly","cattle","catty","catwalk","caucasian","caucus","causal","causation","cause","causing","cauterize","caution","cautious","cavalier","cavalry","caviar","cavity","cedar","celery","celestial","celibacy","celibate","celtic","cement","census","ceramics","ceremony","certainly","certainty","certified","certify","cesarean","cesspool","chafe","chaffing","chain","chair","chalice","challenge","chamber","chamomile","champion","chance","change","channel","chant","chaos","chaperone","chaplain","chapped","chaps","chapter","character","charbroil","charcoal","charger","charging","chariot","charity","charm","charred","charter","charting","chase","chasing","chaste","chastise","chastity","chatroom","chatter","chatting","chatty","cheating","cheddar","cheek","cheer","cheese","cheesy","chef","chemicals","chemist","chemo","cherisher","cherub","chess","chest","chevron","chevy","chewable","chewer","chewing","chewy","chief","chihuahua","childcare","childhood","childish","childless","childlike","chili","chill","chimp","chip","chirping","chirpy","chitchat","chivalry","chive","chloride","chlorine","choice","chokehold","choking","chomp","chooser","choosing","choosy","chop","chosen","chowder","chowtime","chrome","chubby","chuck","chug","chummy","chump","chunk","churn","chute","cider","cilantro","cinch","cinema","cinnamon","circle","circling","circular","circulate","circus","citable","citadel","citation","citizen","citric","citrus","city","civic","civil","clad","claim","clambake","clammy","clamor","clamp","clamshell","clang","clanking","clapped","clapper","clapping","clarify","clarinet","clarity","clash","clasp","class","clatter","clause","clavicle","claw","clay","clean","clear","cleat","cleaver","cleft","clench","clergyman","clerical","clerk","clever","clicker","client","climate","climatic","cling","clinic","clinking","clip","clique","cloak","clobber","clock","clone","cloning","closable","closure","clothes","clothing","cloud","clover","clubbed","clubbing","clubhouse","clump","clumsily","clumsy","clunky","clustered","clutch","clutter","coach","coagulant","coastal","coaster","coasting","coastland","coastline","coat","coauthor","cobalt","cobbler","cobweb","cocoa","coconut","cod","coeditor","coerce","coexist","coffee","cofounder","cognition","cognitive","cogwheel","coherence","coherent","cohesive","coil","coke","cola","cold","coleslaw","coliseum","collage","collapse","collar","collected","collector","collide","collie","collision","colonial","colonist","colonize","colony","colossal","colt","coma","come","comfort","comfy","comic","coming","comma","commence","commend","comment","commerce","commode","commodity","commodore","common","commotion","commute","commuting","compacted","compacter","compactly","compactor","companion","company","compare","compel","compile","comply","component","composed","composer","composite","compost","composure","compound","compress","comprised","computer","computing","comrade","concave","conceal","conceded","concept","concerned","concert","conch","concierge","concise","conclude","concrete","concur","condense","condiment","condition","condone","conducive","conductor","conduit","cone","confess","confetti","confidant","confident","confider","confiding","configure","confined","confining","confirm","conflict","conform","confound","confront","confused","confusing","confusion","congenial","congested","congrats","congress","conical","conjoined","conjure","conjuror","connected","connector","consensus","consent","console","consoling","consonant","constable","constant","constrain","constrict","construct","consult","consumer","consuming","contact","container","contempt","contend","contented","contently","contents","contest","context","contort","contour","contrite","control","contusion","convene","convent","copartner","cope","copied","copier","copilot","coping","copious","copper","copy","coral","cork","cornball","cornbread","corncob","cornea","corned","corner","cornfield","cornflake","cornhusk","cornmeal","cornstalk","corny","coronary","coroner","corporal","corporate","corral","correct","corridor","corrode","corroding","corrosive","corsage","corset","cortex","cosigner","cosmetics","cosmic","cosmos","cosponsor","cost","cottage","cotton","couch","cough","could","countable","countdown","counting","countless","country","county","courier","covenant","cover","coveted","coveting","coyness","cozily","coziness","cozy","crabbing","crabgrass","crablike","crabmeat","cradle","cradling","crafter","craftily","craftsman","craftwork","crafty","cramp","cranberry","crane","cranial","cranium","crank","crate","crave","craving","crawfish","crawlers","crawling","crayfish","crayon","crazed","crazily","craziness","crazy","creamed","creamer","creamlike","crease","creasing","creatable","create","creation","creative","creature","credible","credibly","credit","creed","creme","creole","crepe","crept","crescent","crested","cresting","crestless","crevice","crewless","crewman","crewmate","crib","cricket","cried","crier","crimp","crimson","cringe","cringing","crinkle","crinkly","crisped","crisping","crisply","crispness","crispy","criteria","critter","croak","crock","crook","croon","crop","cross","crouch","crouton","crowbar","crowd","crown","crucial","crudely","crudeness","cruelly","cruelness","cruelty","crumb","crummiest","crummy","crumpet","crumpled","cruncher","crunching","crunchy","crusader","crushable","crushed","crusher","crushing","crust","crux","crying","cryptic","crystal","cubbyhole","cube","cubical","cubicle","cucumber","cuddle","cuddly","cufflink","culinary","culminate","culpable","culprit","cultivate","cultural","culture","cupbearer","cupcake","cupid","cupped","cupping","curable","curator","curdle","cure","curfew","curing","curled","curler","curliness","curling","curly","curry","curse","cursive","cursor","curtain","curtly","curtsy","curvature","curve","curvy","cushy","cusp","cussed","custard","custodian","custody","customary","customer","customize","customs","cut","cycle","cyclic","cycling","cyclist","cylinder","cymbal","cytoplasm","cytoplast","dab","dad","daffodil","dagger","daily","daintily","dainty","dairy","daisy","dallying","dance","dancing","dandelion","dander","dandruff","dandy","danger","dangle","dangling","daredevil","dares","daringly","darkened","darkening","darkish","darkness","darkroom","darling","darn","dart","darwinism","dash","dastardly","data","datebook","dating","daughter","daunting","dawdler","dawn","daybed","daybreak","daycare","daydream","daylight","daylong","dayroom","daytime","dazzler","dazzling","deacon","deafening","deafness","dealer","dealing","dealmaker","dealt","dean","debatable","debate","debating","debit","debrief","debtless","debtor","debug","debunk","decade","decaf","decal","decathlon","decay","deceased","deceit","deceiver","deceiving","december","decency","decent","deception","deceptive","decibel","decidable","decimal","decimeter","decipher","deck","declared","decline","decode","decompose","decorated","decorator","decoy","decrease","decree","dedicate","dedicator","deduce","deduct","deed","deem","deepen","deeply","deepness","deface","defacing","defame","default","defeat","defection","defective","defendant","defender","defense","defensive","deferral","deferred","defiance","defiant","defile","defiling","define","definite","deflate","deflation","deflator","deflected","deflector","defog","deforest","defraud","defrost","deftly","defuse","defy","degraded","degrading","degrease","degree","dehydrate","deity","dejected","delay","delegate","delegator","delete","deletion","delicacy","delicate","delicious","delighted","delirious","delirium","deliverer","delivery","delouse","delta","deluge","delusion","deluxe","demanding","demeaning","demeanor","demise","democracy","democrat","demote","demotion","demystify","denatured","deniable","denial","denim","denote","dense","density","dental","dentist","denture","deny","deodorant","deodorize","departed","departure","depict","deplete","depletion","deplored","deploy","deport","depose","depraved","depravity","deprecate","depress","deprive","depth","deputize","deputy","derail","deranged","derby","derived","desecrate","deserve","deserving","designate","designed","designer","designing","deskbound","desktop","deskwork","desolate","despair","despise","despite","destiny","destitute","destruct","detached","detail","detection","detective","detector","detention","detergent","detest","detonate","detonator","detoxify","detract","deuce","devalue","deviancy","deviant","deviate","deviation","deviator","device","devious","devotedly","devotee","devotion","devourer","devouring","devoutly","dexterity","dexterous","diabetes","diabetic","diabolic","diagnoses","diagnosis","diagram","dial","diameter","diaper","diaphragm","diary","dice","dicing","dictate","dictation","dictator","difficult","diffused","diffuser","diffusion","diffusive","dig","dilation","diligence","diligent","dill","dilute","dime","diminish","dimly","dimmed","dimmer","dimness","dimple","diner","dingbat","dinghy","dinginess","dingo","dingy","dining","dinner","diocese","dioxide","diploma","dipped","dipper","dipping","directed","direction","directive","directly","directory","direness","dirtiness","disabled","disagree","disallow","disarm","disarray","disaster","disband","disbelief","disburse","discard","discern","discharge","disclose","discolor","discount","discourse","discover","discuss","disdain","disengage","disfigure","disgrace","dish","disinfect","disjoin","disk","dislike","disliking","dislocate","dislodge","disloyal","dismantle","dismay","dismiss","dismount","disobey","disorder","disown","disparate","disparity","dispatch","dispense","dispersal","dispersed","disperser","displace","display","displease","disposal","dispose","disprove","dispute","disregard","disrupt","dissuade","distance","distant","distaste","distill","distinct","distort","distract","distress","district","distrust","ditch","ditto","ditzy","dividable","divided","dividend","dividers","dividing","divinely","diving","divinity","divisible","divisibly","division","divisive","divorcee","dizziness","dizzy","doable","docile","dock","doctrine","document","dodge","dodgy","doily","doing","dole","dollar","dollhouse","dollop","dolly","dolphin","domain","domelike","domestic","dominion","dominoes","donated","donation","donator","donor","donut","doodle","doorbell","doorframe","doorknob","doorman","doormat","doornail","doorpost","doorstep","doorstop","doorway","doozy","dork","dormitory","dorsal","dosage","dose","dotted","doubling","douche","dove","down","dowry","doze","drab","dragging","dragonfly","dragonish","dragster","drainable","drainage","drained","drainer","drainpipe","dramatic","dramatize","drank","drapery","drastic","draw","dreaded","dreadful","dreadlock","dreamboat","dreamily","dreamland","dreamless","dreamlike","dreamt","dreamy","drearily","dreary","drench","dress","drew","dribble","dried","drier","drift","driller","drilling","drinkable","drinking","dripping","drippy","drivable","driven","driver","driveway","driving","drizzle","drizzly","drone","drool","droop","drop-down","dropbox","dropkick","droplet","dropout","dropper","drove","drown","drowsily","drudge","drum","dry","dubbed","dubiously","duchess","duckbill","ducking","duckling","ducktail","ducky","duct","dude","duffel","dugout","duh","duke","duller","dullness","duly","dumping","dumpling","dumpster","duo","dupe","duplex","duplicate","duplicity","durable","durably","duration","duress","during","dusk","dust","dutiful","duty","duvet","dwarf","dweeb","dwelled","dweller","dwelling","dwindle","dwindling","dynamic","dynamite","dynasty","dyslexia","dyslexic","each","eagle","earache","eardrum","earflap","earful","earlobe","early","earmark","earmuff","earphone","earpiece","earplugs","earring","earshot","earthen","earthlike","earthling","earthly","earthworm","earthy","earwig","easeful","easel","easiest","easily","easiness","easing","eastbound","eastcoast","easter","eastward","eatable","eaten","eatery","eating","eats","ebay","ebony","ebook","ecard","eccentric","echo","eclair","eclipse","ecologist","ecology","economic","economist","economy","ecosphere","ecosystem","edge","edginess","edging","edgy","edition","editor","educated","education","educator","eel","effective","effects","efficient","effort","eggbeater","egging","eggnog","eggplant","eggshell","egomaniac","egotism","egotistic","either","eject","elaborate","elastic","elated","elbow","eldercare","elderly","eldest","electable","election","elective","elephant","elevate","elevating","elevation","elevator","eleven","elf","eligible","eligibly","eliminate","elite","elitism","elixir","elk","ellipse","elliptic","elm","elongated","elope","eloquence","eloquent","elsewhere","elude","elusive","elves","email","embargo","embark","embassy","embattled","embellish","ember","embezzle","emblaze","emblem","embody","embolism","emboss","embroider","emcee","emerald","emergency","emission","emit","emote","emoticon","emotion","empathic","empathy","emperor","emphases","emphasis","emphasize","emphatic","empirical","employed","employee","employer","emporium","empower","emptier","emptiness","empty","emu","enable","enactment","enamel","enchanted","enchilada","encircle","enclose","enclosure","encode","encore","encounter","encourage","encroach","encrust","encrypt","endanger","endeared","endearing","ended","ending","endless","endnote","endocrine","endorphin","endorse","endowment","endpoint","endurable","endurance","enduring","energetic","energize","energy","enforced","enforcer","engaged","engaging","engine","engorge","engraved","engraver","engraving","engross","engulf","enhance","enigmatic","enjoyable","enjoyably","enjoyer","enjoying","enjoyment","enlarged","enlarging","enlighten","enlisted","enquirer","enrage","enrich","enroll","enslave","ensnare","ensure","entail","entangled","entering","entertain","enticing","entire","entitle","entity","entomb","entourage","entrap","entree","entrench","entrust","entryway","entwine","enunciate","envelope","enviable","enviably","envious","envision","envoy","envy","enzyme","epic","epidemic","epidermal","epidermis","epidural","epilepsy","epileptic","epilogue","epiphany","episode","equal","equate","equation","equator","equinox","equipment","equity","equivocal","eradicate","erasable","erased","eraser","erasure","ergonomic","errand","errant","erratic","error","erupt","escalate","escalator","escapable","escapade","escapist","escargot","eskimo","esophagus","espionage","espresso","esquire","essay","essence","essential","establish","estate","esteemed","estimate","estimator","estranged","estrogen","etching","eternal","eternity","ethanol","ether","ethically","ethics","euphemism","evacuate","evacuee","evade","evaluate","evaluator","evaporate","evasion","evasive","even","everglade","evergreen","everybody","everyday","everyone","evict","evidence","evident","evil","evoke","evolution","evolve","exact","exalted","example","excavate","excavator","exceeding","exception","excess","exchange","excitable","exciting","exclaim","exclude","excluding","exclusion","exclusive","excretion","excretory","excursion","excusable","excusably","excuse","exemplary","exemplify","exemption","exerciser","exert","exes","exfoliate","exhale","exhaust","exhume","exile","existing","exit","exodus","exonerate","exorcism","exorcist","expand","expanse","expansion","expansive","expectant","expedited","expediter","expel","expend","expenses","expensive","expert","expire","expiring","explain","expletive","explicit","explode","exploit","explore","exploring","exponent","exporter","exposable","expose","exposure","express","expulsion","exquisite","extended","extending","extent","extenuate","exterior","external","extinct","extortion","extradite","extras","extrovert","extrude","extruding","exuberant","fable","fabric","fabulous","facebook","facecloth","facedown","faceless","facelift","faceplate","faceted","facial","facility","facing","facsimile","faction","factoid","factor","factsheet","factual","faculty","fade","fading","failing","falcon","fall","false","falsify","fame","familiar","family","famine","famished","fanatic","fancied","fanciness","fancy","fanfare","fang","fanning","fantasize","fantastic","fantasy","fascism","fastball","faster","fasting","fastness","faucet","favorable","favorably","favored","favoring","favorite","fax","feast","federal","fedora","feeble","feed","feel","feisty","feline","felt-tip","feminine","feminism","feminist","feminize","femur","fence","fencing","fender","ferment","fernlike","ferocious","ferocity","ferret","ferris","ferry","fervor","fester","festival","festive","festivity","fetal","fetch","fever","fiber","fiction","fiddle","fiddling","fidelity","fidgeting","fidgety","fifteen","fifth","fiftieth","fifty","figment","figure","figurine","filing","filled","filler","filling","film","filter","filth","filtrate","finale","finalist","finalize","finally","finance","financial","finch","fineness","finer","finicky","finished","finisher","finishing","finite","finless","finlike","fiscally","fit","five","flaccid","flagman","flagpole","flagship","flagstick","flagstone","flail","flakily","flaky","flame","flammable","flanked","flanking","flannels","flap","flaring","flashback","flashbulb","flashcard","flashily","flashing","flashy","flask","flatbed","flatfoot","flatly","flatness","flatten","flattered","flatterer","flattery","flattop","flatware","flatworm","flavored","flavorful","flavoring","flaxseed","fled","fleshed","fleshy","flick","flier","flight","flinch","fling","flint","flip","flirt","float","flock","flogging","flop","floral","florist","floss","flounder","flyable","flyaway","flyer","flying","flyover","flypaper","foam","foe","fog","foil","folic","folk","follicle","follow","fondling","fondly","fondness","fondue","font","food","fool","footage","football","footbath","footboard","footer","footgear","foothill","foothold","footing","footless","footman","footnote","footpad","footpath","footprint","footrest","footsie","footsore","footwear","footwork","fossil","foster","founder","founding","fountain","fox","foyer","fraction","fracture","fragile","fragility","fragment","fragrance","fragrant","frail","frame","framing","frantic","fraternal","frayed","fraying","frays","freckled","freckles","freebase","freebee","freebie","freedom","freefall","freehand","freeing","freeload","freely","freemason","freeness","freestyle","freeware","freeway","freewill","freezable","freezing","freight","french","frenzied","frenzy","frequency","frequent","fresh","fretful","fretted","friction","friday","fridge","fried","friend","frighten","frightful","frigidity","frigidly","frill","fringe","frisbee","frisk","fritter","frivolous","frolic","from","front","frostbite","frosted","frostily","frosting","frostlike","frosty","froth","frown","frozen","fructose","frugality","frugally","fruit","frustrate","frying","gab","gaffe","gag","gainfully","gaining","gains","gala","gallantly","galleria","gallery","galley","gallon","gallows","gallstone","galore","galvanize","gambling","game","gaming","gamma","gander","gangly","gangrene","gangway","gap","garage","garbage","garden","gargle","garland","garlic","garment","garnet","garnish","garter","gas","gatherer","gathering","gating","gauging","gauntlet","gauze","gave","gawk","gazing","gear","gecko","geek","geiger","gem","gender","generic","generous","genetics","genre","gentile","gentleman","gently","gents","geography","geologic","geologist","geology","geometric","geometry","geranium","gerbil","geriatric","germicide","germinate","germless","germproof","gestate","gestation","gesture","getaway","getting","getup","giant","gibberish","giblet","giddily","giddiness","giddy","gift","gigabyte","gigahertz","gigantic","giggle","giggling","giggly","gigolo","gilled","gills","gimmick","girdle","giveaway","given","giver","giving","gizmo","gizzard","glacial","glacier","glade","gladiator","gladly","glamorous","glamour","glance","glancing","glandular","glare","glaring","glass","glaucoma","glazing","gleaming","gleeful","glider","gliding","glimmer","glimpse","glisten","glitch","glitter","glitzy","gloater","gloating","gloomily","gloomy","glorified","glorifier","glorify","glorious","glory","gloss","glove","glowing","glowworm","glucose","glue","gluten","glutinous","glutton","gnarly","gnat","goal","goatskin","goes","goggles","going","goldfish","goldmine","goldsmith","golf","goliath","gonad","gondola","gone","gong","good","gooey","goofball","goofiness","goofy","google","goon","gopher","gore","gorged","gorgeous","gory","gosling","gossip","gothic","gotten","gout","gown","grab","graceful","graceless","gracious","gradation","graded","grader","gradient","grading","gradually","graduate","graffiti","grafted","grafting","grain","granddad","grandkid","grandly","grandma","grandpa","grandson","granite","granny","granola","grant","granular","grape","graph","grapple","grappling","grasp","grass","gratified","gratify","grating","gratitude","gratuity","gravel","graveness","graves","graveyard","gravitate","gravity","gravy","gray","grazing","greasily","greedily","greedless","greedy","green","greeter","greeting","grew","greyhound","grid","grief","grievance","grieving","grievous","grill","grimace","grimacing","grime","griminess","grimy","grinch","grinning","grip","gristle","grit","groggily","groggy","groin","groom","groove","grooving","groovy","grope","ground","grouped","grout","grove","grower","growing","growl","grub","grudge","grudging","grueling","gruffly","grumble","grumbling","grumbly","grumpily","grunge","grunt","guacamole","guidable","guidance","guide","guiding","guileless","guise","gulf","gullible","gully","gulp","gumball","gumdrop","gumminess","gumming","gummy","gurgle","gurgling","guru","gush","gusto","gusty","gutless","guts","gutter","guy","guzzler","gyration","habitable","habitant","habitat","habitual","hacked","hacker","hacking","hacksaw","had","haggler","haiku","half","halogen","halt","halved","halves","hamburger","hamlet","hammock","hamper","hamster","hamstring","handbag","handball","handbook","handbrake","handcart","handclap","handclasp","handcraft","handcuff","handed","handful","handgrip","handgun","handheld","handiness","handiwork","handlebar","handled","handler","handling","handmade","handoff","handpick","handprint","handrail","handsaw","handset","handsfree","handshake","handstand","handwash","handwork","handwoven","handwrite","handyman","hangnail","hangout","hangover","hangup","hankering","hankie","hanky","haphazard","happening","happier","happiest","happily","happiness","happy","harbor","hardcopy","hardcore","hardcover","harddisk","hardened","hardener","hardening","hardhat","hardhead","hardiness","hardly","hardness","hardship","hardware","hardwired","hardwood","hardy","harmful","harmless","harmonica","harmonics","harmonize","harmony","harness","harpist","harsh","harvest","hash","hassle","haste","hastily","hastiness","hasty","hatbox","hatchback","hatchery","hatchet","hatching","hatchling","hate","hatless","hatred","haunt","haven","hazard","hazelnut","hazily","haziness","hazing","hazy","headache","headband","headboard","headcount","headdress","headed","header","headfirst","headgear","heading","headlamp","headless","headlock","headphone","headpiece","headrest","headroom","headscarf","headset","headsman","headstand","headstone","headway","headwear","heap","heat","heave","heavily","heaviness","heaving","hedge","hedging","heftiness","hefty","helium","helmet","helper","helpful","helping","helpless","helpline","hemlock","hemstitch","hence","henchman","henna","herald","herbal","herbicide","herbs","heritage","hermit","heroics","heroism","herring","herself","hertz","hesitancy","hesitant","hesitate","hexagon","hexagram","hubcap","huddle","huddling","huff","hug","hula","hulk","hull","human","humble","humbling","humbly","humid","humiliate","humility","humming","hummus","humongous","humorist","humorless","humorous","humpback","humped","humvee","hunchback","hundredth","hunger","hungrily","hungry","hunk","hunter","hunting","huntress","huntsman","hurdle","hurled","hurler","hurling","hurray","hurricane","hurried","hurry","hurt","husband","hush","husked","huskiness","hut","hybrid","hydrant","hydrated","hydration","hydrogen","hydroxide","hyperlink","hypertext","hyphen","hypnoses","hypnosis","hypnotic","hypnotism","hypnotist","hypnotize","hypocrisy","hypocrite","ibuprofen","ice","iciness","icing","icky","icon","icy","idealism","idealist","idealize","ideally","idealness","identical","identify","identity","ideology","idiocy","idiom","idly","igloo","ignition","ignore","iguana","illicitly","illusion","illusive","image","imaginary","imagines","imaging","imbecile","imitate","imitation","immature","immerse","immersion","imminent","immobile","immodest","immorally","immortal","immovable","immovably","immunity","immunize","impaired","impale","impart","impatient","impeach","impeding","impending","imperfect","imperial","impish","implant","implement","implicate","implicit","implode","implosion","implosive","imply","impolite","important","importer","impose","imposing","impotence","impotency","impotent","impound","imprecise","imprint","imprison","impromptu","improper","improve","improving","improvise","imprudent","impulse","impulsive","impure","impurity","iodine","iodize","ion","ipad","iphone","ipod","irate","irk","iron","irregular","irrigate","irritable","irritably","irritant","irritate","islamic","islamist","isolated","isolating","isolation","isotope","issue","issuing","italicize","italics","item","itinerary","itunes","ivory","ivy","jab","jackal","jacket","jackknife","jackpot","jailbird","jailbreak","jailer","jailhouse","jalapeno","jam","janitor","january","jargon","jarring","jasmine","jaundice","jaunt","java","jawed","jawless","jawline","jaws","jaybird","jaywalker","jazz","jeep","jeeringly","jellied","jelly","jersey","jester","jet","jiffy","jigsaw","jimmy","jingle","jingling","jinx","jitters","jittery","job","jockey","jockstrap","jogger","jogging","john","joining","jokester","jokingly","jolliness","jolly","jolt","jot","jovial","joyfully","joylessly","joyous","joyride","joystick","jubilance","jubilant","judge","judgingly","judicial","judiciary","judo","juggle","juggling","jugular","juice","juiciness","juicy","jujitsu","jukebox","july","jumble","jumbo","jump","junction","juncture","june","junior","juniper","junkie","junkman","junkyard","jurist","juror","jury","justice","justifier","justify","justly","justness","juvenile","kabob","kangaroo","karaoke","karate","karma","kebab","keenly","keenness","keep","keg","kelp","kennel","kept","kerchief","kerosene","kettle","kick","kiln","kilobyte","kilogram","kilometer","kilowatt","kilt","kimono","kindle","kindling","kindly","kindness","kindred","kinetic","kinfolk","king","kinship","kinsman","kinswoman","kissable","kisser","kissing","kitchen","kite","kitten","kitty","kiwi","kleenex","knapsack","knee","knelt","knickers","knoll","koala","kooky","kosher","krypton","kudos","kung","labored","laborer","laboring","laborious","labrador","ladder","ladies","ladle","ladybug","ladylike","lagged","lagging","lagoon","lair","lake","lance","landed","landfall","landfill","landing","landlady","landless","landline","landlord","landmark","landmass","landmine","landowner","landscape","landside","landslide","language","lankiness","lanky","lantern","lapdog","lapel","lapped","lapping","laptop","lard","large","lark","lash","lasso","last","latch","late","lather","latitude","latrine","latter","latticed","launch","launder","laundry","laurel","lavender","lavish","laxative","lazily","laziness","lazy","lecturer","left","legacy","legal","legend","legged","leggings","legible","legibly","legislate","lego","legroom","legume","legwarmer","legwork","lemon","lend","length","lens","lent","leotard","lesser","letdown","lethargic","lethargy","letter","lettuce","level","leverage","levers","levitate","levitator","liability","liable","liberty","librarian","library","licking","licorice","lid","life","lifter","lifting","liftoff","ligament","likely","likeness","likewise","liking","lilac","lilly","lily","limb","limeade","limelight","limes","limit","limping","limpness","line","lingo","linguini","linguist","lining","linked","linoleum","linseed","lint","lion","lip","liquefy","liqueur","liquid","lisp","list","litigate","litigator","litmus","litter","little","livable","lived","lively","liver","livestock","lividly","living","lizard","lubricant","lubricate","lucid","luckily","luckiness","luckless","lucrative","ludicrous","lugged","lukewarm","lullaby","lumber","luminance","luminous","lumpiness","lumping","lumpish","lunacy","lunar","lunchbox","luncheon","lunchroom","lunchtime","lung","lurch","lure","luridness","lurk","lushly","lushness","luster","lustfully","lustily","lustiness","lustrous","lusty","luxurious","luxury","lying","lyrically","lyricism","lyricist","lyrics","macarena","macaroni","macaw","mace","machine","machinist","magazine","magenta","maggot","magical","magician","magma","magnesium","magnetic","magnetism","magnetize","magnifier","magnify","magnitude","magnolia","mahogany","maimed","majestic","majesty","majorette","majority","makeover","maker","makeshift","making","malformed","malt","mama","mammal","mammary","mammogram","manager","managing","manatee","mandarin","mandate","mandatory","mandolin","manger","mangle","mango","mangy","manhandle","manhole","manhood","manhunt","manicotti","manicure","manifesto","manila","mankind","manlike","manliness","manly","manmade","manned","mannish","manor","manpower","mantis","mantra","manual","many","map","marathon","marauding","marbled","marbles","marbling","march","mardi","margarine","margarita","margin","marigold","marina","marine","marital","maritime","marlin","marmalade","maroon","married","marrow","marry","marshland","marshy","marsupial","marvelous","marxism","mascot","masculine","mashed","mashing","massager","masses","massive","mastiff","matador","matchbook","matchbox","matcher","matching","matchless","material","maternal","maternity","math","mating","matriarch","matrimony","matrix","matron","matted","matter","maturely","maturing","maturity","mauve","maverick","maximize","maximum","maybe","mayday","mayflower","moaner","moaning","mobile","mobility","mobilize","mobster","mocha","mocker","mockup","modified","modify","modular","modulator","module","moisten","moistness","moisture","molar","molasses","mold","molecular","molecule","molehill","mollusk","mom","monastery","monday","monetary","monetize","moneybags","moneyless","moneywise","mongoose","mongrel","monitor","monkhood","monogamy","monogram","monologue","monopoly","monorail","monotone","monotype","monoxide","monsieur","monsoon","monstrous","monthly","monument","moocher","moodiness","moody","mooing","moonbeam","mooned","moonlight","moonlike","moonlit","moonrise","moonscape","moonshine","moonstone","moonwalk","mop","morale","morality","morally","morbidity","morbidly","morphine","morphing","morse","mortality","mortally","mortician","mortified","mortify","mortuary","mosaic","mossy","most","mothball","mothproof","motion","motivate","motivator","motive","motocross","motor","motto","mountable","mountain","mounted","mounting","mourner","mournful","mouse","mousiness","moustache","mousy","mouth","movable","move","movie","moving","mower","mowing","much","muck","mud","mug","mulberry","mulch","mule","mulled","mullets","multiple","multiply","multitask","multitude","mumble","mumbling","mumbo","mummified","mummify","mummy","mumps","munchkin","mundane","municipal","muppet","mural","murkiness","murky","murmuring","muscular","museum","mushily","mushiness","mushroom","mushy","music","musket","muskiness","musky","mustang","mustard","muster","mustiness","musty","mutable","mutate","mutation","mute","mutilated","mutilator","mutiny","mutt","mutual","muzzle","myself","myspace","mystified","mystify","myth","nacho","nag","nail","name","naming","nanny","nanometer","nape","napkin","napped","napping","nappy","narrow","nastily","nastiness","national","native","nativity","natural","nature","naturist","nautical","navigate","navigator","navy","nearby","nearest","nearly","nearness","neatly","neatness","nebula","nebulizer","nectar","negate","negation","negative","neglector","negligee","negligent","negotiate","nemeses","nemesis","neon","nephew","nerd","nervous","nervy","nest","net","neurology","neuron","neurosis","neurotic","neuter","neutron","never","next","nibble","nickname","nicotine","niece","nifty","nimble","nimbly","nineteen","ninetieth","ninja","nintendo","ninth","nuclear","nuclei","nucleus","nugget","nullify","number","numbing","numbly","numbness","numeral","numerate","numerator","numeric","numerous","nuptials","nursery","nursing","nurture","nutcase","nutlike","nutmeg","nutrient","nutshell","nuttiness","nutty","nuzzle","nylon","oaf","oak","oasis","oat","obedience","obedient","obituary","object","obligate","obliged","oblivion","oblivious","oblong","obnoxious","oboe","obscure","obscurity","observant","observer","observing","obsessed","obsession","obsessive","obsolete","obstacle","obstinate","obstruct","obtain","obtrusive","obtuse","obvious","occultist","occupancy","occupant","occupier","occupy","ocean","ocelot","octagon","octane","october","octopus","ogle","oil","oink","ointment","okay","old","olive","olympics","omega","omen","ominous","omission","omit","omnivore","onboard","oncoming","ongoing","onion","online","onlooker","only","onscreen","onset","onshore","onslaught","onstage","onto","onward","onyx","oops","ooze","oozy","opacity","opal","open","operable","operate","operating","operation","operative","operator","opium","opossum","opponent","oppose","opposing","opposite","oppressed","oppressor","opt","opulently","osmosis","other","otter","ouch","ought","ounce","outage","outback","outbid","outboard","outbound","outbreak","outburst","outcast","outclass","outcome","outdated","outdoors","outer","outfield","outfit","outflank","outgoing","outgrow","outhouse","outing","outlast","outlet","outline","outlook","outlying","outmatch","outmost","outnumber","outplayed","outpost","outpour","output","outrage","outrank","outreach","outright","outscore","outsell","outshine","outshoot","outsider","outskirts","outsmart","outsource","outspoken","outtakes","outthink","outward","outweigh","outwit","oval","ovary","oven","overact","overall","overarch","overbid","overbill","overbite","overblown","overboard","overbook","overbuilt","overcast","overcoat","overcome","overcook","overcrowd","overdraft","overdrawn","overdress","overdrive","overdue","overeager","overeater","overexert","overfed","overfeed","overfill","overflow","overfull","overgrown","overhand","overhang","overhaul","overhead","overhear","overheat","overhung","overjoyed","overkill","overlabor","overlaid","overlap","overlay","overload","overlook","overlord","overlying","overnight","overpass","overpay","overplant","overplay","overpower","overprice","overrate","overreach","overreact","override","overripe","overrule","overrun","overshoot","overshot","oversight","oversized","oversleep","oversold","overspend","overstate","overstay","overstep","overstock","overstuff","oversweet","overtake","overthrow","overtime","overtly","overtone","overture","overturn","overuse","overvalue","overview","overwrite","owl","oxford","oxidant","oxidation","oxidize","oxidizing","oxygen","oxymoron","oyster","ozone","paced","pacemaker","pacific","pacifier","pacifism","pacifist","pacify","padded","padding","paddle","paddling","padlock","pagan","pager","paging","pajamas","palace","palatable","palm","palpable","palpitate","paltry","pampered","pamperer","pampers","pamphlet","panama","pancake","pancreas","panda","pandemic","pang","panhandle","panic","panning","panorama","panoramic","panther","pantomime","pantry","pants","pantyhose","paparazzi","papaya","paper","paprika","papyrus","parabola","parachute","parade","paradox","paragraph","parakeet","paralegal","paralyses","paralysis","paralyze","paramedic","parameter","paramount","parasail","parasite","parasitic","parcel","parched","parchment","pardon","parish","parka","parking","parkway","parlor","parmesan","parole","parrot","parsley","parsnip","partake","parted","parting","partition","partly","partner","partridge","party","passable","passably","passage","passcode","passenger","passerby","passing","passion","passive","passivism","passover","passport","password","pasta","pasted","pastel","pastime","pastor","pastrami","pasture","pasty","patchwork","patchy","paternal","paternity","path","patience","patient","patio","patriarch","patriot","patrol","patronage","patronize","pauper","pavement","paver","pavestone","pavilion","paving","pawing","payable","payback","paycheck","payday","payee","payer","paying","payment","payphone","payroll","pebble","pebbly","pecan","pectin","peculiar","peddling","pediatric","pedicure","pedigree","pedometer","pegboard","pelican","pellet","pelt","pelvis","penalize","penalty","pencil","pendant","pending","penholder","penknife","pennant","penniless","penny","penpal","pension","pentagon","pentagram","pep","perceive","percent","perch","percolate","perennial","perfected","perfectly","perfume","periscope","perish","perjurer","perjury","perkiness","perky","perm","peroxide","perpetual","perplexed","persecute","persevere","persuaded","persuader","pesky","peso","pessimism","pessimist","pester","pesticide","petal","petite","petition","petri","petroleum","petted","petticoat","pettiness","petty","petunia","phantom","phobia","phoenix","phonebook","phoney","phonics","phoniness","phony","phosphate","photo","phrase","phrasing","placard","placate","placidly","plank","planner","plant","plasma","plaster","plastic","plated","platform","plating","platinum","platonic","platter","platypus","plausible","plausibly","playable","playback","player","playful","playgroup","playhouse","playing","playlist","playmaker","playmate","playoff","playpen","playroom","playset","plaything","playtime","plaza","pleading","pleat","pledge","plentiful","plenty","plethora","plexiglas","pliable","plod","plop","plot","plow","ploy","pluck","plug","plunder","plunging","plural","plus","plutonium","plywood","poach","pod","poem","poet","pogo","pointed","pointer","pointing","pointless","pointy","poise","poison","poker","poking","polar","police","policy","polio","polish","politely","polka","polo","polyester","polygon","polygraph","polymer","poncho","pond","pony","popcorn","pope","poplar","popper","poppy","popsicle","populace","popular","populate","porcupine","pork","porous","porridge","portable","portal","portfolio","porthole","portion","portly","portside","poser","posh","posing","possible","possibly","possum","postage","postal","postbox","postcard","posted","poster","posting","postnasal","posture","postwar","pouch","pounce","pouncing","pound","pouring","pout","powdered","powdering","powdery","power","powwow","pox","praising","prance","prancing","pranker","prankish","prankster","prayer","praying","preacher","preaching","preachy","preamble","precinct","precise","precision","precook","precut","predator","predefine","predict","preface","prefix","preflight","preformed","pregame","pregnancy","pregnant","preheated","prelaunch","prelaw","prelude","premiere","premises","premium","prenatal","preoccupy","preorder","prepaid","prepay","preplan","preppy","preschool","prescribe","preseason","preset","preshow","president","presoak","press","presume","presuming","preteen","pretended","pretender","pretense","pretext","pretty","pretzel","prevail","prevalent","prevent","preview","previous","prewar","prewashed","prideful","pried","primal","primarily","primary","primate","primer","primp","princess","print","prior","prism","prison","prissy","pristine","privacy","private","privatize","prize","proactive","probable","probably","probation","probe","probing","probiotic","problem","procedure","process","proclaim","procreate","procurer","prodigal","prodigy","produce","product","profane","profanity","professed","professor","profile","profound","profusely","progeny","prognosis","program","progress","projector","prologue","prolonged","promenade","prominent","promoter","promotion","prompter","promptly","prone","prong","pronounce","pronto","proofing","proofread","proofs","propeller","properly","property","proponent","proposal","propose","props","prorate","protector","protegee","proton","prototype","protozoan","protract","protrude","proud","provable","proved","proven","provided","provider","providing","province","proving","provoke","provoking","provolone","prowess","prowler","prowling","proximity","proxy","prozac","prude","prudishly","prune","pruning","pry","psychic","public","publisher","pucker","pueblo","pug","pull","pulmonary","pulp","pulsate","pulse","pulverize","puma","pumice","pummel","punch","punctual","punctuate","punctured","pungent","punisher","punk","pupil","puppet","puppy","purchase","pureblood","purebred","purely","pureness","purgatory","purge","purging","purifier","purify","purist","puritan","purity","purple","purplish","purposely","purr","purse","pursuable","pursuant","pursuit","purveyor","pushcart","pushchair","pusher","pushiness","pushing","pushover","pushpin","pushup","pushy","putdown","putt","puzzle","puzzling","pyramid","pyromania","python","quack","quadrant","quail","quaintly","quake","quaking","qualified","qualifier","qualify","quality","qualm","quantum","quarrel","quarry","quartered","quarterly","quarters","quartet","quench","query","quicken","quickly","quickness","quicksand","quickstep","quiet","quill","quilt","quintet","quintuple","quirk","quit","quiver","quizzical","quotable","quotation","quote","rabid","race","racing","racism","rack","racoon","radar","radial","radiance","radiantly","radiated","radiation","radiator","radio","radish","raffle","raft","rage","ragged","raging","ragweed","raider","railcar","railing","railroad","railway","raisin","rake","raking","rally","ramble","rambling","ramp","ramrod","ranch","rancidity","random","ranged","ranger","ranging","ranked","ranking","ransack","ranting","rants","rare","rarity","rascal","rash","rasping","ravage","raven","ravine","raving","ravioli","ravishing","reabsorb","reach","reacquire","reaction","reactive","reactor","reaffirm","ream","reanalyze","reappear","reapply","reappoint","reapprove","rearrange","rearview","reason","reassign","reassure","reattach","reawake","rebalance","rebate","rebel","rebirth","reboot","reborn","rebound","rebuff","rebuild","rebuilt","reburial","rebuttal","recall","recant","recapture","recast","recede","recent","recess","recharger","recipient","recital","recite","reckless","reclaim","recliner","reclining","recluse","reclusive","recognize","recoil","recollect","recolor","reconcile","reconfirm","reconvene","recopy","record","recount","recoup","recovery","recreate","rectal","rectangle","rectified","rectify","recycled","recycler","recycling","reemerge","reenact","reenter","reentry","reexamine","referable","referee","reference","refill","refinance","refined","refinery","refining","refinish","reflected","reflector","reflex","reflux","refocus","refold","reforest","reformat","reformed","reformer","reformist","refract","refrain","refreeze","refresh","refried","refueling","refund","refurbish","refurnish","refusal","refuse","refusing","refutable","refute","regain","regalia","regally","reggae","regime","region","register","registrar","registry","regress","regretful","regroup","regular","regulate","regulator","rehab","reheat","rehire","rehydrate","reimburse","reissue","reiterate","rejoice","rejoicing","rejoin","rekindle","relapse","relapsing","relatable","related","relation","relative","relax","relay","relearn","release","relenting","reliable","reliably","reliance","reliant","relic","relieve","relieving","relight","relish","relive","reload","relocate","relock","reluctant","rely","remake","remark","remarry","rematch","remedial","remedy","remember","reminder","remindful","remission","remix","remnant","remodeler","remold","remorse","remote","removable","removal","removed","remover","removing","rename","renderer","rendering","rendition","renegade","renewable","renewably","renewal","renewed","renounce","renovate","renovator","rentable","rental","rented","renter","reoccupy","reoccur","reopen","reorder","repackage","repacking","repaint","repair","repave","repaying","repayment","repeal","repeated","repeater","repent","rephrase","replace","replay","replica","reply","reporter","repose","repossess","repost","repressed","reprimand","reprint","reprise","reproach","reprocess","reproduce","reprogram","reps","reptile","reptilian","repugnant","repulsion","repulsive","repurpose","reputable","reputably","request","require","requisite","reroute","rerun","resale","resample","rescuer","reseal","research","reselect","reseller","resemble","resend","resent","reset","reshape","reshoot","reshuffle","residence","residency","resident","residual","residue","resigned","resilient","resistant","resisting","resize","resolute","resolved","resonant","resonate","resort","resource","respect","resubmit","result","resume","resupply","resurface","resurrect","retail","retainer","retaining","retake","retaliate","retention","rethink","retinal","retired","retiree","retiring","retold","retool","retorted","retouch","retrace","retract","retrain","retread","retreat","retrial","retrieval","retriever","retry","return","retying","retype","reunion","reunite","reusable","reuse","reveal","reveler","revenge","revenue","reverb","revered","reverence","reverend","reversal","reverse","reversing","reversion","revert","revisable","revise","revision","revisit","revivable","revival","reviver","reviving","revocable","revoke","revolt","revolver","revolving","reward","rewash","rewind","rewire","reword","rework","rewrap","rewrite","rhyme","ribbon","ribcage","rice","riches","richly","richness","rickety","ricotta","riddance","ridden","ride","riding","rifling","rift","rigging","rigid","rigor","rimless","rimmed","rind","rink","rinse","rinsing","riot","ripcord","ripeness","ripening","ripping","ripple","rippling","riptide","rise","rising","risk","risotto","ritalin","ritzy","rival","riverbank","riverbed","riverboat","riverside","riveter","riveting","roamer","roaming","roast","robbing","robe","robin","robotics","robust","rockband","rocker","rocket","rockfish","rockiness","rocking","rocklike","rockslide","rockstar","rocky","rogue","roman","romp","rope","roping","roster","rosy","rotten","rotting","rotunda","roulette","rounding","roundish","roundness","roundup","roundworm","routine","routing","rover","roving","royal","rubbed","rubber","rubbing","rubble","rubdown","ruby","ruckus","rudder","rug","ruined","rule","rumble","rumbling","rummage","rumor","runaround","rundown","runner","running","runny","runt","runway","rupture","rural","ruse","rush","rust","rut","sabbath","sabotage","sacrament","sacred","sacrifice","sadden","saddlebag","saddled","saddling","sadly","sadness","safari","safeguard","safehouse","safely","safeness","saffron","saga","sage","sagging","saggy","said","saint","sake","salad","salami","salaried","salary","saline","salon","saloon","salsa","salt","salutary","salute","salvage","salvaging","salvation","same","sample","sampling","sanction","sanctity","sanctuary","sandal","sandbag","sandbank","sandbar","sandblast","sandbox","sanded","sandfish","sanding","sandlot","sandpaper","sandpit","sandstone","sandstorm","sandworm","sandy","sanitary","sanitizer","sank","santa","sapling","sappiness","sappy","sarcasm","sarcastic","sardine","sash","sasquatch","sassy","satchel","satiable","satin","satirical","satisfied","satisfy","saturate","saturday","sauciness","saucy","sauna","savage","savanna","saved","savings","savior","savor","saxophone","say","scabbed","scabby","scalded","scalding","scale","scaling","scallion","scallop","scalping","scam","scandal","scanner","scanning","scant","scapegoat","scarce","scarcity","scarecrow","scared","scarf","scarily","scariness","scarring","scary","scavenger","scenic","schedule","schematic","scheme","scheming","schilling","schnapps","scholar","science","scientist","scion","scoff","scolding","scone","scoop","scooter","scope","scorch","scorebook","scorecard","scored","scoreless","scorer","scoring","scorn","scorpion","scotch","scoundrel","scoured","scouring","scouting","scouts","scowling","scrabble","scraggly","scrambled","scrambler","scrap","scratch","scrawny","screen","scribble","scribe","scribing","scrimmage","script","scroll","scrooge","scrounger","scrubbed","scrubber","scruffy","scrunch","scrutiny","scuba","scuff","sculptor","sculpture","scurvy","scuttle","secluded","secluding","seclusion","second","secrecy","secret","sectional","sector","secular","securely","security","sedan","sedate","sedation","sedative","sediment","seduce","seducing","segment","seismic","seizing","seldom","selected","selection","selective","selector","self","seltzer","semantic","semester","semicolon","semifinal","seminar","semisoft","semisweet","senate","senator","send","senior","senorita","sensation","sensitive","sensitize","sensually","sensuous","sepia","september","septic","septum","sequel","sequence","sequester","series","sermon","serotonin","serpent","serrated","serve","service","serving","sesame","sessions","setback","setting","settle","settling","setup","sevenfold","seventeen","seventh","seventy","severity","shabby","shack","shaded","shadily","shadiness","shading","shadow","shady","shaft","shakable","shakily","shakiness","shaking","shaky","shale","shallot","shallow","shame","shampoo","shamrock","shank","shanty","shape","shaping","share","sharpener","sharper","sharpie","sharply","sharpness","shawl","sheath","shed","sheep","sheet","shelf","shell","shelter","shelve","shelving","sherry","shield","shifter","shifting","shiftless","shifty","shimmer","shimmy","shindig","shine","shingle","shininess","shining","shiny","ship","shirt","shivering","shock","shone","shoplift","shopper","shopping","shoptalk","shore","shortage","shortcake","shortcut","shorten","shorter","shorthand","shortlist","shortly","shortness","shorts","shortwave","shorty","shout","shove","showbiz","showcase","showdown","shower","showgirl","showing","showman","shown","showoff","showpiece","showplace","showroom","showy","shrank","shrapnel","shredder","shredding","shrewdly","shriek","shrill","shrimp","shrine","shrink","shrivel","shrouded","shrubbery","shrubs","shrug","shrunk","shucking","shudder","shuffle","shuffling","shun","shush","shut","shy","siamese","siberian","sibling","siding","sierra","siesta","sift","sighing","silenced","silencer","silent","silica","silicon","silk","silliness","silly","silo","silt","silver","similarly","simile","simmering","simple","simplify","simply","sincere","sincerity","singer","singing","single","singular","sinister","sinless","sinner","sinuous","sip","siren","sister","sitcom","sitter","sitting","situated","situation","sixfold","sixteen","sixth","sixties","sixtieth","sixtyfold","sizable","sizably","size","sizing","sizzle","sizzling","skater","skating","skedaddle","skeletal","skeleton","skeptic","sketch","skewed","skewer","skid","skied","skier","skies","skiing","skilled","skillet","skillful","skimmed","skimmer","skimming","skimpily","skincare","skinhead","skinless","skinning","skinny","skintight","skipper","skipping","skirmish","skirt","skittle","skydiver","skylight","skyline","skype","skyrocket","skyward","slab","slacked","slacker","slacking","slackness","slacks","slain","slam","slander","slang","slapping","slapstick","slashed","slashing","slate","slather","slaw","sled","sleek","sleep","sleet","sleeve","slept","sliceable","sliced","slicer","slicing","slick","slider","slideshow","sliding","slighted","slighting","slightly","slimness","slimy","slinging","slingshot","slinky","slip","slit","sliver","slobbery","slogan","sloped","sloping","sloppily","sloppy","slot","slouching","slouchy","sludge","slug","slum","slurp","slush","sly","small","smartly","smartness","smasher","smashing","smashup","smell","smelting","smile","smilingly","smirk","smite","smith","smitten","smock","smog","smoked","smokeless","smokiness","smoking","smoky","smolder","smooth","smother","smudge","smudgy","smuggler","smuggling","smugly","smugness","snack","snagged","snaking","snap","snare","snarl","snazzy","sneak","sneer","sneeze","sneezing","snide","sniff","snippet","snipping","snitch","snooper","snooze","snore","snoring","snorkel","snort","snout","snowbird","snowboard","snowbound","snowcap","snowdrift","snowdrop","snowfall","snowfield","snowflake","snowiness","snowless","snowman","snowplow","snowshoe","snowstorm","snowsuit","snowy","snub","snuff","snuggle","snugly","snugness","speak","spearfish","spearhead","spearman","spearmint","species","specimen","specked","speckled","specks","spectacle","spectator","spectrum","speculate","speech","speed","spellbind","speller","spelling","spendable","spender","spending","spent","spew","sphere","spherical","sphinx","spider","spied","spiffy","spill","spilt","spinach","spinal","spindle","spinner","spinning","spinout","spinster","spiny","spiral","spirited","spiritism","spirits","spiritual","splashed","splashing","splashy","splatter","spleen","splendid","splendor","splice","splicing","splinter","splotchy","splurge","spoilage","spoiled","spoiler","spoiling","spoils","spoken","spokesman","sponge","spongy","sponsor","spoof","spookily","spooky","spool","spoon","spore","sporting","sports","sporty","spotless","spotlight","spotted","spotter","spotting","spotty","spousal","spouse","spout","sprain","sprang","sprawl","spray","spree","sprig","spring","sprinkled","sprinkler","sprint","sprite","sprout","spruce","sprung","spry","spud","spur","sputter","spyglass","squabble","squad","squall","squander","squash","squatted","squatter","squatting","squeak","squealer","squealing","squeamish","squeegee","squeeze","squeezing","squid","squiggle","squiggly","squint","squire","squirt","squishier","squishy","stability","stabilize","stable","stack","stadium","staff","stage","staging","stagnant","stagnate","stainable","stained","staining","stainless","stalemate","staleness","stalling","stallion","stamina","stammer","stamp","stand","stank","staple","stapling","starboard","starch","stardom","stardust","starfish","stargazer","staring","stark","starless","starlet","starlight","starlit","starring","starry","starship","starter","starting","startle","startling","startup","starved","starving","stash","state","static","statistic","statue","stature","status","statute","statutory","staunch","stays","steadfast","steadier","steadily","steadying","steam","steed","steep","steerable","steering","steersman","stegosaur","stellar","stem","stench","stencil","step","stereo","sterile","sterility","sterilize","sterling","sternness","sternum","stew","stick","stiffen","stiffly","stiffness","stifle","stifling","stillness","stilt","stimulant","stimulate","stimuli","stimulus","stinger","stingily","stinging","stingray","stingy","stinking","stinky","stipend","stipulate","stir","stitch","stock","stoic","stoke","stole","stomp","stonewall","stoneware","stonework","stoning","stony","stood","stooge","stool","stoop","stoplight","stoppable","stoppage","stopped","stopper","stopping","stopwatch","storable","storage","storeroom","storewide","storm","stout","stove","stowaway","stowing","straddle","straggler","strained","strainer","straining","strangely","stranger","strangle","strategic","strategy","stratus","straw","stray","streak","stream","street","strength","strenuous","strep","stress","stretch","strewn","stricken","strict","stride","strife","strike","striking","strive","striving","strobe","strode","stroller","strongbox","strongly","strongman","struck","structure","strudel","struggle","strum","strung","strut","stubbed","stubble","stubbly","stubborn","stucco","stuck","student","studied","studio","study","stuffed","stuffing","stuffy","stumble","stumbling","stump","stung","stunned","stunner","stunning","stunt","stupor","sturdily","sturdy","styling","stylishly","stylist","stylized","stylus","suave","subarctic","subatomic","subdivide","subdued","subduing","subfloor","subgroup","subheader","subject","sublease","sublet","sublevel","sublime","submarine","submerge","submersed","submitter","subpanel","subpar","subplot","subprime","subscribe","subscript","subsector","subside","subsiding","subsidize","subsidy","subsoil","subsonic","substance","subsystem","subtext","subtitle","subtly","subtotal","subtract","subtype","suburb","subway","subwoofer","subzero","succulent","such","suction","sudden","sudoku","suds","sufferer","suffering","suffice","suffix","suffocate","suffrage","sugar","suggest","suing","suitable","suitably","suitcase","suitor","sulfate","sulfide","sulfite","sulfur","sulk","sullen","sulphate","sulphuric","sultry","superbowl","superglue","superhero","superior","superjet","superman","supermom","supernova","supervise","supper","supplier","supply","support","supremacy","supreme","surcharge","surely","sureness","surface","surfacing","surfboard","surfer","surgery","surgical","surging","surname","surpass","surplus","surprise","surreal","surrender","surrogate","surround","survey","survival","survive","surviving","survivor","sushi","suspect","suspend","suspense","sustained","sustainer","swab","swaddling","swagger","swampland","swan","swapping","swarm","sway","swear","sweat","sweep","swell","swept","swerve","swifter","swiftly","swiftness","swimmable","swimmer","swimming","swimsuit","swimwear","swinger","swinging","swipe","swirl","switch","swivel","swizzle","swooned","swoop","swoosh","swore","sworn","swung","sycamore","sympathy","symphonic","symphony","symptom","synapse","syndrome","synergy","synopses","synopsis","synthesis","synthetic","syrup","system","t-shirt","tabasco","tabby","tableful","tables","tablet","tableware","tabloid","tackiness","tacking","tackle","tackling","tacky","taco","tactful","tactical","tactics","tactile","tactless","tadpole","taekwondo","tag","tainted","take","taking","talcum","talisman","tall","talon","tamale","tameness","tamer","tamper","tank","tanned","tannery","tanning","tantrum","tapeless","tapered","tapering","tapestry","tapioca","tapping","taps","tarantula","target","tarmac","tarnish","tarot","tartar","tartly","tartness","task","tassel","taste","tastiness","tasting","tasty","tattered","tattle","tattling","tattoo","taunt","tavern","thank","that","thaw","theater","theatrics","thee","theft","theme","theology","theorize","thermal","thermos","thesaurus","these","thesis","thespian","thicken","thicket","thickness","thieving","thievish","thigh","thimble","thing","think","thinly","thinner","thinness","thinning","thirstily","thirsting","thirsty","thirteen","thirty","thong","thorn","those","thousand","thrash","thread","threaten","threefold","thrift","thrill","thrive","thriving","throat","throbbing","throng","throttle","throwaway","throwback","thrower","throwing","thud","thumb","thumping","thursday","thus","thwarting","thyself","tiara","tibia","tidal","tidbit","tidiness","tidings","tidy","tiger","tighten","tightly","tightness","tightrope","tightwad","tigress","tile","tiling","till","tilt","timid","timing","timothy","tinderbox","tinfoil","tingle","tingling","tingly","tinker","tinkling","tinsel","tinsmith","tint","tinwork","tiny","tipoff","tipped","tipper","tipping","tiptoeing","tiptop","tiring","tissue","trace","tracing","track","traction","tractor","trade","trading","tradition","traffic","tragedy","trailing","trailside","train","traitor","trance","tranquil","transfer","transform","translate","transpire","transport","transpose","trapdoor","trapeze","trapezoid","trapped","trapper","trapping","traps","trash","travel","traverse","travesty","tray","treachery","treading","treadmill","treason","treat","treble","tree","trekker","tremble","trembling","tremor","trench","trend","trespass","triage","trial","triangle","tribesman","tribunal","tribune","tributary","tribute","triceps","trickery","trickily","tricking","trickle","trickster","tricky","tricolor","tricycle","trident","tried","trifle","trifocals","trillion","trilogy","trimester","trimmer","trimming","trimness","trinity","trio","tripod","tripping","triumph","trivial","trodden","trolling","trombone","trophy","tropical","tropics","trouble","troubling","trough","trousers","trout","trowel","truce","truck","truffle","trump","trunks","trustable","trustee","trustful","trusting","trustless","truth","try","tubby","tubeless","tubular","tucking","tuesday","tug","tuition","tulip","tumble","tumbling","tummy","turban","turbine","turbofan","turbojet","turbulent","turf","turkey","turmoil","turret","turtle","tusk","tutor","tutu","tux","tweak","tweed","tweet","tweezers","twelve","twentieth","twenty","twerp","twice","twiddle","twiddling","twig","twilight","twine","twins","twirl","twistable","twisted","twister","twisting","twisty","twitch","twitter","tycoon","tying","tyke","udder","ultimate","ultimatum","ultra","umbilical","umbrella","umpire","unabashed","unable","unadorned","unadvised","unafraid","unaired","unaligned","unaltered","unarmored","unashamed","unaudited","unawake","unaware","unbaked","unbalance","unbeaten","unbend","unbent","unbiased","unbitten","unblended","unblessed","unblock","unbolted","unbounded","unboxed","unbraided","unbridle","unbroken","unbuckled","unbundle","unburned","unbutton","uncanny","uncapped","uncaring","uncertain","unchain","unchanged","uncharted","uncheck","uncivil","unclad","unclaimed","unclamped","unclasp","uncle","unclip","uncloak","unclog","unclothed","uncoated","uncoiled","uncolored","uncombed","uncommon","uncooked","uncork","uncorrupt","uncounted","uncouple","uncouth","uncover","uncross","uncrown","uncrushed","uncured","uncurious","uncurled","uncut","undamaged","undated","undaunted","undead","undecided","undefined","underage","underarm","undercoat","undercook","undercut","underdog","underdone","underfed","underfeed","underfoot","undergo","undergrad","underhand","underline","underling","undermine","undermost","underpaid","underpass","underpay","underrate","undertake","undertone","undertook","undertow","underuse","underwear","underwent","underwire","undesired","undiluted","undivided","undocked","undoing","undone","undrafted","undress","undrilled","undusted","undying","unearned","unearth","unease","uneasily","uneasy","uneatable","uneaten","unedited","unelected","unending","unengaged","unenvied","unequal","unethical","uneven","unexpired","unexposed","unfailing","unfair","unfasten","unfazed","unfeeling","unfiled","unfilled","unfitted","unfitting","unfixable","unfixed","unflawed","unfocused","unfold","unfounded","unframed","unfreeze","unfrosted","unfrozen","unfunded","unglazed","ungloved","unglue","ungodly","ungraded","ungreased","unguarded","unguided","unhappily","unhappy","unharmed","unhealthy","unheard","unhearing","unheated","unhelpful","unhidden","unhinge","unhitched","unholy","unhook","unicorn","unicycle","unified","unifier","uniformed","uniformly","unify","unimpeded","uninjured","uninstall","uninsured","uninvited","union","uniquely","unisexual","unison","unissued","unit","universal","universe","unjustly","unkempt","unkind","unknotted","unknowing","unknown","unlaced","unlatch","unlawful","unleaded","unlearned","unleash","unless","unleveled","unlighted","unlikable","unlimited","unlined","unlinked","unlisted","unlit","unlivable","unloaded","unloader","unlocked","unlocking","unlovable","unloved","unlovely","unloving","unluckily","unlucky","unmade","unmanaged","unmanned","unmapped","unmarked","unmasked","unmasking","unmatched","unmindful","unmixable","unmixed","unmolded","unmoral","unmovable","unmoved","unmoving","unnamable","unnamed","unnatural","unneeded","unnerve","unnerving","unnoticed","unopened","unopposed","unpack","unpadded","unpaid","unpainted","unpaired","unpaved","unpeeled","unpicked","unpiloted","unpinned","unplanned","unplanted","unpleased","unpledged","unplowed","unplug","unpopular","unproven","unquote","unranked","unrated","unraveled","unreached","unread","unreal","unreeling","unrefined","unrelated","unrented","unrest","unretired","unrevised","unrigged","unripe","unrivaled","unroasted","unrobed","unroll","unruffled","unruly","unrushed","unsaddle","unsafe","unsaid","unsalted","unsaved","unsavory","unscathed","unscented","unscrew","unsealed","unseated","unsecured","unseeing","unseemly","unseen","unselect","unselfish","unsent","unsettled","unshackle","unshaken","unshaved","unshaven","unsheathe","unshipped","unsightly","unsigned","unskilled","unsliced","unsmooth","unsnap","unsocial","unsoiled","unsold","unsolved","unsorted","unspoiled","unspoken","unstable","unstaffed","unstamped","unsteady","unsterile","unstirred","unstitch","unstopped","unstuck","unstuffed","unstylish","unsubtle","unsubtly","unsuited","unsure","unsworn","untagged","untainted","untaken","untamed","untangled","untapped","untaxed","unthawed","unthread","untidy","untie","until","untimed","untimely","untitled","untoasted","untold","untouched","untracked","untrained","untreated","untried","untrimmed","untrue","untruth","unturned","untwist","untying","unusable","unused","unusual","unvalued","unvaried","unvarying","unveiled","unveiling","unvented","unviable","unvisited","unvocal","unwanted","unwarlike","unwary","unwashed","unwatched","unweave","unwed","unwelcome","unwell","unwieldy","unwilling","unwind","unwired","unwitting","unwomanly","unworldly","unworn","unworried","unworthy","unwound","unwoven","unwrapped","unwritten","unzip","upbeat","upchuck","upcoming","upcountry","update","upfront","upgrade","upheaval","upheld","uphill","uphold","uplifted","uplifting","upload","upon","upper","upright","uprising","upriver","uproar","uproot","upscale","upside","upstage","upstairs","upstart","upstate","upstream","upstroke","upswing","uptake","uptight","uptown","upturned","upward","upwind","uranium","urban","urchin","urethane","urgency","urgent","urging","urologist","urology","usable","usage","useable","used","uselessly","user","usher","usual","utensil","utility","utilize","utmost","utopia","utter","vacancy","vacant","vacate","vacation","vagabond","vagrancy","vagrantly","vaguely","vagueness","valiant","valid","valium","valley","valuables","value","vanilla","vanish","vanity","vanquish","vantage","vaporizer","variable","variably","varied","variety","various","varmint","varnish","varsity","varying","vascular","vaseline","vastly","vastness","veal","vegan","veggie","vehicular","velcro","velocity","velvet","vendetta","vending","vendor","veneering","vengeful","venomous","ventricle","venture","venue","venus","verbalize","verbally","verbose","verdict","verify","verse","version","versus","vertebrae","vertical","vertigo","very","vessel","vest","veteran","veto","vexingly","viability","viable","vibes","vice","vicinity","victory","video","viewable","viewer","viewing","viewless","viewpoint","vigorous","village","villain","vindicate","vineyard","vintage","violate","violation","violator","violet","violin","viper","viral","virtual","virtuous","virus","visa","viscosity","viscous","viselike","visible","visibly","vision","visiting","visitor","visor","vista","vitality","vitalize","vitally","vitamins","vivacious","vividly","vividness","vixen","vocalist","vocalize","vocally","vocation","voice","voicing","void","volatile","volley","voltage","volumes","voter","voting","voucher","vowed","vowel","voyage","wackiness","wad","wafer","waffle","waged","wager","wages","waggle","wagon","wake","waking","walk","walmart","walnut","walrus","waltz","wand","wannabe","wanted","wanting","wasabi","washable","washbasin","washboard","washbowl","washcloth","washday","washed","washer","washhouse","washing","washout","washroom","washstand","washtub","wasp","wasting","watch","water","waviness","waving","wavy","whacking","whacky","wham","wharf","wheat","whenever","whiff","whimsical","whinny","whiny","whisking","whoever","whole","whomever","whoopee","whooping","whoops","why","wick","widely","widen","widget","widow","width","wieldable","wielder","wife","wifi","wikipedia","wildcard","wildcat","wilder","wildfire","wildfowl","wildland","wildlife","wildly","wildness","willed","willfully","willing","willow","willpower","wilt","wimp","wince","wincing","wind","wing","winking","winner","winnings","winter","wipe","wired","wireless","wiring","wiry","wisdom","wise","wish","wisplike","wispy","wistful","wizard","wobble","wobbling","wobbly","wok","wolf","wolverine","womanhood","womankind","womanless","womanlike","womanly","womb","woof","wooing","wool","woozy","word","work","worried","worrier","worrisome","worry","worsening","worshiper","worst","wound","woven","wow","wrangle","wrath","wreath","wreckage","wrecker","wrecking","wrench","wriggle","wriggly","wrinkle","wrinkly","wrist","writing","written","wrongdoer","wronged","wrongful","wrongly","wrongness","wrought","xbox","xerox","yahoo","yam","yanking","yapping","yard","yarn","yeah","yearbook","yearling","yearly","yearning","yeast","yelling","yelp","yen","yesterday","yiddish","yield","yin","yippee","yo-yo","yodel","yoga","yogurt","yonder","yoyo","yummy","zap","zealous","zebra","zen","zeppelin","zero","zestfully","zesty","zigzagged","zipfile","zipping","zippy","zips","zit","zodiac","zombie","zone","zoning","zookeeper","zoologist","zoology","zoom"]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_wordlists_es_json.chunk.js b/cypress/fixtures/v3-client/locale_res_wordlists_es_json.chunk.js deleted file mode 100644 index 0da2cf16..00000000 --- a/cypress/fixtures/v3-client/locale_res_wordlists_es_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_wordlists_es_json"],{ - -/***/ "../locale/res/wordlists/es.json": -/*!***************************************!*\ - !*** ../locale/res/wordlists/es.json ***! - \***************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('["de","que","no","la","el","es","en","lo","un","por","qué","me","una","los","se","te","con","para","está","mi","pero","sí","si","bien","eso","su","las","yo","del","como","aquí","tu","al","más","le","esto","todo","ya","estoy","ahora","muy","ha","esta","así","vamos","algo","hay","bueno","tengo","él","cuando","estás","sé","tú","nos","nada","cómo","este","he","ser","tiene","puedo","ella","quiero","hacer","fue","gracias","vez","era","soy","sólo","todos","porque","son","tienes","creo","voy","sabes","estaba","puede","eres","ese","usted","entonces","hola","solo","verdad","casa","tan","quién","sus","tiempo","dos","esa","nunca","dónde","va","oh","favor","mucho","mí","quieres","siento","señor","mejor","hace","has","decir","también","sobre","dios","sin","tenemos","están","ti","puedes","ver","hombre","vida","alguien","cosas","siempre","hasta","ahí","ir","años","antes","estar","ni","poco","día","uno","noche","hecho","mis","estamos","otra","acuerdo","trabajo","nosotros","parece","gente","sea","padre","mira","mismo","dijo","nadie","quiere","podría","hablar","vas","ellos","sr.","tal","pasa","fuera","después","han","desde","dinero","mundo","claro","momento","les","tener","estado","otro","había","mañana","tenía","madre","vale","lugar","haciendo","donde","seguro","sabe","podemos","tus","espera","nuevo","sido","cosa","hijo","allí","menos","tipo","amigo","gran","nuestro","mujer","mamá","luego","papá","días","dice","hoy","tres","buena","necesito","dije","oye","gusta","quería","será","haber","parte","todas","crees","buen","conmigo","nombre","mierda","nuestra","mal","debe","realmente","estas","aún","mío","toda","hacerlo","cada","visto","importa","contigo","tienen","hemos","razón","alguna","tanto","saber","hizo","veces","serio","ven","idea","eh","tarde","problema","hora","cierto","dicho","quien","demasiado","amor","entre","ve","pasado","familia","estos","policía","debería","ustedes","chica","esos","chicos","cuenta","haces","todavía","salir","algún","vaya","unos","veo","amigos","hermano","pensé","sabía","cabeza","ah","cariño","digo","van","hombres","buenas","somos","cualquier","forma","mientras","lado","debo","sería","caso","pueden","pasó","primera","genial","chico","supuesto","hice","pues","adiós","muchas","personas","señora","volver","esas","quizá","contra","camino","durante","hablando","manera","muerto","persona","rápido","cuál","ayuda","historia","iba","supongo","nueva","entiendo","dentro","casi","puerta","ves","pasar","primero","significa","semana","hacia","quizás","espero","juntos","año","niños","pronto","tío","suerte","ciudad","siquiera","feliz","venir","hija","gustaría","minutos","cuánto","os","hey","muerte","dejar","realidad","deja","problemas","vi","da","dijiste","corazón","miedo","jefe","agua","haré","justo","horas","poder","buenos","esposa","manos","debes","viene","venga","nuestros","ojos","adelante","encontrar","mano","cinco","niño","ninguna","otros","cara","cuidado","bajo","cerca","viejo","déjame","noches","bastante","fin","tomar","único","misma","escucha","ningún","punto","cuándo","sigue","haya","equipo","grande","necesita","llegar","incluso","algunos","doctor","difícil","aunque","hubiera","primer","coche","hago","clase","cuatro","mas","dices","pequeño","llama","toma","hiciste","allá","última","arriba","tierra","guerra","pensar","pueda","igual","loco","sangre","mujeres","vuelta","fui","trabajar","tenido","juego","deberías","cuerpo","algunas","entrar","cree","podía","debemos","teléfono","final","listo","fiesta","muchos","estabas","quieren","vete","auto","dar","vivir","posible","ok","hermana","número","meses","culpa","abajo","escuela","ido","fuerte","diciendo","habla","esté","ello","pregunta","chicas","eran","unas","pasando","atrás","malo","capitán","sra.","bebé","segundo","sabemos","mayor","comida","morir","conozco","dame","fácil","comer","vino","lista","haga","necesitas","hijos","padres","creer","pensando","fueron","dime","trata","buscando","tuve","tampoco","amo","joven","podrías","sola","par","única","hacen","seguir","dr.","dicen","medio","puta","saben","sentido","hagas","segura","esperar","lejos","arma","alto","pequeña","dólares","seis","estaban","seguridad","maldita","estuvo","preocupes","palabra","esperando","queda","oficina","matar","iré","cama","además","último","oído","habría","estará","dio","recuerdo","siendo","acerca","tenga","luz","correcto","ud.","demonios","nuestras","verte","dormir","sitio","ayudar","conseguir","di","marido","paz","idiota","plan","dado","cuanto","peor","murió","pueblo","vivo","venido","john","basta","paso","música","diga","minuto","anoche","llamar","piensa","país","digas","rey","perdón","mucha","falta","pienso","diablos","perdido","niña","señorita","diez","lleva","hospital","grandes","maldito","otras","llamado","hacemos","llevar","fuego","aqui","tuvo","poner","calle","acaba","prueba","increíble","real","libro","orden","semanas","especial","mía","café","duro","empezar","afuera","queremos","perro","cielo","jack","puesto","viaje","detrás","cuarto","querida","haría","preguntas","piensas","querido","libre","buscar","cual","diré","suena","jugar","cambio","película","millones","habrá","llamada","resto","vemos","extraño","mala","srta.","irme","ropa","perder","vuelve","agente","palabras","raro","hará","entiendes","éste","tratando","general","trato","usar","perfecto","derecho","modo","ayer","conoces","demás","quieras","podríamos","noticias","asesino","control","odio","frente","sexo","decirle","estaré","divertido","armas","recuerdas","amiga","grupo","asunto","acabo","mensaje","encima","atención","diferente","uh","cállate","daño","sucede","cambiar","siguiente","sino","the","seas","médico","boca","dejó","error","jamás","largo","pena","voz","futuro","siente","secreto","baño","mil","decirte","sam","pensaba","novia","propia","sueño","haz","fuerza","deben","supone","estábamos","ambos","ay","estuve","encontré","vuelto","dolor","dile","encanta","edad","darle","pie","negro","ganar","york","aire","lamento","verlo","asesinato","vio","adónde","llegado","disculpe","cita","estaría","fuiste","sistema","gusto","pobre","negocio","mente","tuyo","campo","mire","situación","tras","hotel","vosotros","funciona","foto","abogado","loca","propio","alrededor","próxima","terminado","hablas","pagar","mató","llamo","personal","sientes","ocurre","ésta","recuerda","mitad","quiera","pelo","tenías","viste","oficial","llegó","compañía","relación","conoce","pase","montón","mejores","creí","cena","sentir","través","accidente","ellas","caja","tranquilo","bonito","eras","asi","pudo","vive","vista","estúpido","línea","haremos","dan","quédate","tienda","comprar","entendido","centro","salvo","mes","joe","sol","tonto","hambre","michael","mesa","respuesta","david","carta","imposible","pruebas","novio","normal","gustan","frank","pude","charlie","traje","dirección","siete","dijeron","placer","sean","tendrá","barco","blanco","tom","profesor","servicio","muchacho","reunión","dejado","ley","quisiera","hubo","george","programa","carrera","muchachos","culo","canción","hermosa","boda","decirme","tengas","hacía","estés","sala","llevo","decisión","espere","don","necesario","sal","entra","prisa","carajo","embargo","tendrás","escuchar","abuela","hicieron","detective","horrible","suelo","fotos","cárcel","acá","io","mike","siéntate","decía","vámonos","maldición","silencio","muerta","capaz","salió","club","terminar","temo","broma","gobierno","prometo","cámara","media","terrible","llamó","regalo","amable","dulce","muertos","querías","ataque","das","navidad","negocios","pudiera","ocho","avión","acabó","juro","mantener","ejército","papel","partes","ten","gracioso","diría","principio","delante","teniente","deseo","vayas","nave","sale","basura","vine","contacto","esposo","tren","dale","verdadero","tuya","alma","hazlo","disculpa","junto","anda","tendré","saberlo","locura","oro","permiso","director","peligro","libertad","alegro","baja","tendremos","derecha","encuentra","pies","segunda","espacio","rato","abuelo","esperaba","mirando","salud","sorpresa","ninguno","miren","triste","aun","pensado","maestro","según","infierno","podrían","tipos","tía","crimen","conocido","consejo","ante","iglesia","intento","mayoría","doy","peter","hicimos","escena","piso","señal","honor","llamas","abre","cerebro","veras","viendo","pone","pregunto","cocina","vestido","vieja","caballo","vienen","vidas","bar","corte","sucedió","adentro","drogas","enseguida","busca","agradable","carne","parecía","lindo","mar","duda","edificio","conocer","cargo","víctima","luna","energía","frío","hablo","baile","trabaja","misión","listos","ayudarte","izquierda","paul","beber","deje","simple","daré","sabías","puedas","puso","creía","regresar","llega","entender","mirar","sacar","cambiado","trae","hermoso","opinión","verás","linda","apenas","segundos","cerveza","harás","estuviera","creen","oír","tendría","cuántos","hablado","hablamos","reina","temprano","tema","prisión","porqué","vuelva","público","ocurrió","veré","salvar","partido","bonita","joder","causa","caliente","sargento","cenar","compañero","llevó","banco","existe","ben","zona","destino","base","solía","cliente","irse","perra","james","encuentro","encontró","pelea","san","norte","quise","coronel","apuesto","peligroso","viva","max","vienes","necesitan","té","excepto","juicio","podamos","llave","posición","trasero","irnos","espalda","excelente","éxito","modos","ventana","veamos","especie","teníamos","formas","pedir","últimos","escúchame","ejemplo","ése","radio","lee","calma","hogar","volveré","fondo","humano","henry","tí","iremos","unidos","habían","jesús","planeta","verme","respecto","regreso","debido","seré","tenían","leer","parar","lleno","dejé","respeto","debajo","harry","escribir","estación","pidió","alta","pista","estrella","enfermo","duele","sueños","veremos","miles","darme","órdenes","ocupado","sigues","corre","podido","dejes","nivel","habéis","darte","salida","decirlo","confiar","hacerte","hermanos","zapatos","color","vistazo","nena","tratar","parecer","juez","próximo","paciente","hayas","bolsa","arte","mary","jugando","llevas","alegra","bailar","diablo","oí","sepa","estarás","sur","banda","aprender","precio","completo","santo","culpable","ganas","tuvimos","you","verla","volvió","libros","ojo","serán","cielos","matado","azul","irte","ia","acción","reglas","obra","esperanza","cuestión","molesta","teniendo","bill","informe","jimmy","río","abrir","tocar","bob","contar","sigo","interior","vea","estados","estáis","preocupa","tomó","principal","empieza","londres","empezó","vayan","jim","llaman","ojalá","perdona","vuelvo","golpe","quedarme","llamaré","acabado","estilo","nueve","quedar","cartas","bomba","guardia","pistola","probar","majestad","traer","marcha","pareces","común","aquel","hacerle","vuelo","nota","danny","humanos","estaremos","valor","suyo","objetivo","repente","debía","rojo","bromeando","irá","entrada","doble","dejaré","evitar","máquina","cuello","conocí","tiempos","tome","nick","animales","alex","acaso","tuviera","pareja","verano","escuché","ama","serás","mentira","tarjeta","hagan","perdí","correr","steve","traído","llegue","preparado","haberlo","tony","usa","intentar","ayudarme","flores","dando","vos","opción","isla","cierra","piel","enemigo","dejo","exacto","imbécil","jóvenes","pedido","larga","entiende","justicia","nuevos","despierta","pido","calor","luces","refiero","fuimos","batalla","déjalo","intenta","sarah","brazo","llena","hacerme","salga","recordar","escapar","bosque","gay","señores","quedan","piernas","visita","parís","usando","ganado","blanca","rico","inocente","pesar","absoluto","um","mismos","tomado","habías","planes","cine","toca","brillante","confianza","vuestra","nombres","fbi","esperen","defensa","terminó","salido","estupendo","jane","presión","testigo","deberían","olvidado","soldados","resulta","tommy","depende","motivo","inglés","suya","estudio","acabar","tomando","dieron","parecen","llaves","perros","propósito","noticia","partir","vuestro","metros","santa","quedarse","clientes","podrá","cuántas","ridículo","damas","estuviste","tranquila","operación","come","empresa","ayúdame","elección","menudo","beso","copa","brazos","espíritu","dejas","cansado","interesa","refieres","casado","enorme","asuntos","fe","muestra","trampa","ray","billy","memoria","johnny","contrario","soldado","subir","turno","saliendo","escrito","cálmate","caer","llevaré","leche","estrellas","prefiero","red","viejos","solamente","oiga","estén","cuentas","taxi","anillo","richard","preguntar","victoria","quiénes","héroe","pequeños","decidido","películas","trago","volverá","árbol","ibas","dientes","encantado","camión","vender","llame","detente","luchar","cabo","ruido","lucha","muere","reloj","gato","averiguar","volar","vayamos","tanta","vendrá","corriendo","yendo","colegio","sonido","caballero","pasada","código","hagamos","imagen","riesgo","llegamos","alguno","pan","millón","malas","dama","hielo","coño","cayó","prensa","querer","vengan","eddie","caminar","pasará","momentos","coger","hubiese","mark","asiento","tuviste","herido","maría","proyecto","pared","sentí","ésa","silla","perdió","robert","policías","arreglar","sentado","papi","ideas","obtener","felices","señoría","cantidad","bebe","mírame","chris","papa","llorar","quedó","familiar","desastre","locos","escuche","quedarte","política","pedí","sois","nosotras","will","colega","príncipe","verde","bajar","nervioso","vengo","inspector","sirve","puertas","fuerzas","playa","cantar","déjeme","velocidad","total","cabello","huellas","haberte","debí","unidad","estan","cuchillo","oigan","quienes","gana","tonterías","perfecta","hable","gustaba","lugares","ryan","show","robo","permite","parque","uds.","roto","serie","puse","nuevas","evidencia","conocerte","estúpida","preocupe","perdone","botella","viento","mando","extraña","historias","aquella","tenéis","solos","apoyo","bala","verdadera","tiro","época","puente","olvídalo","distancia","desea","dejarlo","pelear","pierna","echar","descanso","américa","área","orgulloso","datos","sube","dejaste","acabas","verá","magia","nacional","universo","llevaba","necesitar","nariz","aquellos","clases","jake","casas","vergüenza","estarán","monstruo","princesa","autobús","cuidar","ei","huevos","pocos","podrás","enferma","paseo","detalles","llamadas","belleza","francia","abierto","viviendo","envió","puntos","ministro","conducir","aceptar","borracho","animal","caballos","trajo","contrato","viernes","bobby","martin","amy","ex","hechos","sociedad","dra.","tengan","quede","carga","diste","puto","lleve","presente","conocía","uso","dedos","oferta","sentía","proteger","daniel","date","hiciera","hablé","recibir","agradezco","robar","enamorado","sepas","oeste","herida","despacio","ayude","supe","inmediato","oscuro","mercado","cerdo","tardes","líder","grave","llegué","jurado","casos","acuerdas","ahi","debió","hubieras","piedra","éramos","habló","charles","paga","secretos","digamos","intención","humor","dura","dará","seguros","leo","adam","and","ángeles","querría","cerrar","peso","víctimas","asesinado","humana","directo","central","termina","escuchado","contento","llevan","podré","oscuridad","actuar","siga","llevado","comenzó","regresa","privado","mirada","demonio","abierta","kevin","llámame","siguen","romper","cambia","fiscal","jardín","natural","gratis","cuesta","amenaza","pon","marca","comenzar","ponte","medicina","podremos","tomé","preciosa","sexual","acceso","necesidad","dueño","merece","rayos","mintiendo","tantas","imagino","fantasma","creerlo","llamé","ponga","brian","dé","pollo","varios","efecto","felicidad","espada","entró","resultado","sombrero","menor","recibido","negra","to","habido","limpio","china","juegos","correo","confía","video","harán","teatro","dormido","local","quedado","lástima","calles","créeme","búsqueda","dedo","tonta","recuerdos","razones","eric","elegir","amas","huele","almuerzo","cien","adn","tantos","pago","mr","pastel","bastardo","cinta","pasé","dígame","anna","costa","levántate","llamando","cerrado","interés","enfermera","comienzo","olvidé","fuese","militar","polvo","bella","quedo","kate","voluntad","varias","teoría","roja","cuento","escenario","diario","propiedad","agujero","aspecto","descansar","matarme","metido","quiso","ángel","enviar","proceso","intentado","mio","fuente","alcalde","ocurrido","malos","carretera","desayuno","débil","roma","sabido","comienza","tambien","miembro","perdiendo","hayan","fueras","jerry","mata","sr","valiente","deber","pecho","gustó","oyes","thomas","periódico","mami","piensan","tv","cansada","limpiar","crear","explicar","robado","resolver","maté","guapo","continuar","sheriff","funcionar","extra","primo","manejar","primeros","acto","poniendo","números","andy","llevará","rachel","niñas","premio","internet","harías","inútil","domingo","tomas","sensación","alcohol","tercera","agentes","disculpas","antiguo","guapa","asustado","puedan","sexy","genio","recuperar","creemos","lengua","ladrón","intenté","examen","deprisa","montaña","durmiendo","disparar","queso","entero","papeles","pones","modelo","fútbol","detener","lados","miembros","sábado","pongo","mataron","vuelvas","talento","descubrir","gordo","tribunal","toque","wow","hables","conocemos","haberme","dispuesto","tamaño","dejen","invitado","derechos","scott","pacientes","pérdida","in","iban","pudiste","profundo","gas","consigue","olvidar","gloria","olvides","volviendo","coge","fué","llamaba","pete","tendrán","instituto","disparo","querían","hablemos","dia","enviado","pertenece","sienta","pensó","cadáver","gracia","doctora","escuchen","amante","temporada","kim","cuerpos","amigas","larry","francés","mataste","techo","íbamos","médicos","lisa","venganza","pensamos","walter","contó","discutir","comprendo","idiotas","enemigos","camisa","superior","criminal","bote","escribió","llevamos","testigos","recoger","emily","truco","jason","original","pide","jeff","rosa","mama","negros","rostro","crédito","compartir","saca","irás","pequeñas","veía","empezando","registro","continúa","grandioso","viniste","esquina","contado","tengamos","cientos","tormenta","relájate","siéntese","chocolate","matt","pedazo","tomo","olor","ciencia","kelly","conexión","vieron","salón","sucio","firma","vimos","pidiendo","casarse","bebida","tercer","propios","fuertes","lluvia","recién","tomaré","europa","toques","cámaras","visión","llego","americano","diversión","pareció","libras","curso","disco","probable","precioso","tenia","lago","leído","consiguió","parecido","material","discurso","entera","it","corta","completa","decirles","lunes","efectivo","cura","antigua","hablan","juntas","william","cáncer","funeral","jodido","dave","artista","favorito","guste","cae","termine","sir","pintura","quieto","falso","india","corto","destruir","cargos","podías","mentiras","señoras","helado","camioneta","mueve","aparte","rock","tumba","seguimos","hablaba","verle","mapa","tarea","cambió","móvil","responder","vacío","muriendo","construir","conocen","clara","solución","mundial","plato","famoso","des","dirá","ambas","notas","malditos","cabrón","dudo","robó","escucho","laura","bordo","nieve","mensajes","fecha","violencia","sujeto","acciones","fría","droga","saldrá","suponía","empezamos","errores","grace","siglo","molesto","acabamos","sabéis","cortar","seria","muevas","fortuna","of","imaginar","archivos","presencia","familias","ey","quedas","solas","oficiales","aventura","gira","social","comunidad","annie","alan","cero","clark","esperamos","ocupada","muévete","carl","pieza","estómago","disparó","legal","conseguí","emma","carter","rara","reino","alegría","barrio","granja","podéis","esfuerzo","trabajaba","claire","perdóname","tesoro","empleo","compré","cirugía","dejamos","busco","trabajas","clave","bravo","ed","desearía","cerrada","new","chicago","controlar","pregunté","mostrar","piloto","pocas","tuvieron","ayudarle","bolso","llorando","kyle","duerme","dejarme","intentó","respirar","aparece","campaña","amistad","corriente","viven","huesos","invitados","planta","ritmo","socio","esperas","caído","motor","mono","llevaron","página","poquito","habíamos","ruego","dejan","aburrido","paquete","casada","llevarte","ted","combate","útil","castillo","bola","canciones","mataré","muchísimo","asistente","llegaron","correcta","pondré","simon","comido","salgan","empecé","tirar","pasan","cierta","honesto","carro","limpia","volví","confío","venta","huir","apareció","vais","gustas","aseguro","ira","promesa","decírselo","cuáles","compras","lección","hablaré","hacerse","roger","luke","bolsillo","enojado","desgracia","artículo","labios","cola","estemos","whisky","taza","despues","gary","pelota","caminando","andar","crea","chaqueta","den","llegará","atrapado","supiera","matarlo","árboles","obvio","amaba","pescado","últimas","pobres","dioses","nerviosa","vueltas","autos","alice","lucy","abrigo","okay","estudiar","sonrisa","cobarde","olvida","convirtió","coches","venía","josh","charla","vives","bruja","celular","rose","rompió","andando","vean","susan","veinte","encargo","matarte","palacio","convierte","ja","vivos","pasamos","firme","daría","piense","oigo","phil","sorprende","alemanes","milagro","soportar","dejaron","smith","disculpen","moda","despacho","vecinos","vaso","dejarte","explosión","poderes","regla","acaban","copia","siguiendo","viajar","cadena","fábrica","mantiene","meter","contenta","comiendo","educación","maneras","fumar","cuantos","homicidio","madera","mayores","grado","blancos","lord","anterior","comisario","pizza","millas","tira","fueran","cumplir","plata","quedará","quedaré","aléjate","decidir","lío","preguntó","agencia","humanidad","usado","guardias","parada","leyes","funcionó","odia","levanta","mires","respira","escaleras","queréis","salvaje","pasos","trabajado","tratado","parado","mentiroso","libres","servicios","pedirle","vivía","medios","compra","armario","lobo","quedamos","permitir","tráfico","uniforme","estuvimos","alemania","suave","propias","balas","asqueroso","ciento","invierno","consigo","encuentre","jenny","conductor","equipos","arena","park","licencia","tíos","jackson","dijera","espejo","marina","matando","seres","fiestas","mover","análisis","llegando","azúcar","tim","casar","sótano","volvamos","sabrá","taylor","ocasión","cheque","revisar","ponerme","suceder","acusado","dímelo","quedé","doc","pesadilla","sopa","saltar","heridas","pienses","suicidio","llamarme","elegido","divorcio","registros","recibí","joey","escuchas","mirad","pierde","abogados","trataba","llevando","miel","regrese","dilo","hermanas","alemán","iría","lady","salí","miras","frontera","ventaja","alerta","piscina","regalos","julia","señales","salimos","revista","hecha","imágenes","llegas","rápida","canal","paciencia","sacado","echo","crisis","asesinos","oíste","dejando","estarías","desierto","asustada","cuerda","míos","chuck","seguido","seremos","morgan","pene","despierto","sección","casarme","trabajos","karen","murieron","oso","vd.","hank","impresión","pez","pasaba","torre","sientas","mentir","pasillo","juega","suéltame","arresto","ricos","sencillo","ruta","enamorada","apuesta","perdida","vinieron","ayudarnos","presento","hazme","leí","arthur","virus","lárgate","sigan","compró","servir","pongas","alarma","identidad","iguales","aviso","aprendido","caza","daba","muchacha","bebés","opciones","responde","vernos","julie","llamaste","ponerse","sacó","orgullo","reales","esperan","vuelves","maggie","serlo","cuantas","enfadado","ponen","altura","jones","archivo","fred","ayudará","criatura","saco","máximo","viniendo","vendría","louis","ilegal","refiere","llamamos","versión","incendio","gritar","recibió","concierto","excusa","rodillas","cruz","dulces","zorra","cómodo","cruel","sofá","perdiste","salgamos","sombra","ganó","encantada","firmar","muñeca","rastro","gigante","pájaro","ducha","tomamos","déjenme","condición","doce","actor","actitud","cuida","salsa","hubieran","carlos","personaje","dudas","jackie","cambios","votos","vivido","perdimos","entrega","comercial","decidí","tribu","pura","voto","méxico","amar","poderoso","traigo","fresco","privada","seamos","guarda","orgullosa","vivimos","difíciles","hagámoslo","jefa","trató","senador","ayudando","campeón","bebiendo","adorable","ayudó","ciego","falsa","jo","sara","bestia","alteza","deseos","episodio","celda","llevarlo","aguanta","vengas","jueves","montañas","llevarme","garganta","sesión","pensaste","diles","muera","coma","sentimos","creas","escribe","veneno","primavera","súper","vuestros","queríamos","aquello","martes","feo","cristo","francisco","howard","virgen","distrito","decidió","socorro","castigo","dígale","límite","junta","ponerte","casados","líneas","estudios","muévanse","audiencia","helen","nació","mato","jugador","hmm","humo","popular","nación","conocimos","tropas","salen","presentar","donna","celebrar","envía","mantén","verlos","fila","ésto","misterio","ganador","puerto","vehículo","escapó","traeré","julio","lograr","muero","quítate","favorita","patio","golpeó","tontería","miss","pecado","comité","preparada","comprado","parezca","caras","rescate","título","llegaste","decírtelo","adivina","elizabeth","pánico","barry","quieran","abby","exterior","pasión","llegan","preparar","guau","patrick","tierras","demostrar","elegante","visitar","asegúrate","darles","cabezas","abra","andrew","dean","ambiente","conde","urgente","impuestos","antonio","distinto","encantan","ron","marcas","ayudarlo","leyendo","adecuado","cajas","abandonar","dispara","buscamos","traté","cia","tomen","darnos","intentas","lily","gustado","jamie","luchando","apesta","volando","lucas","detenido","curioso","tetas","caro","asco","usó","buscas","amanda","salgo","decirnos","enseñó","rick","mírate","stan","debiste","océano","bolas","damos","pagado","federal","cuán","escalera","acepto","km","terapia","lágrimas","terreno","autoridad","roca","cubierta","terry","hierba","juan","prometido","crecer","mental","madame","prometí","mismas","existen","veas","lento","dirige","capaces","chino","vuelvan","meta","suelta","despedida","sucedido","pasta","cristal","vegas","gritando","pare","peces","brown","guardar","podían","sabían","salvó","aprecio","patrón","esposas","king","desafío","asombroso","pedazos","robin","sales","clínica","atrapar","experto","medida","tele","custodia","nacido","anuncio","física","hollywood","empezado","ma","fiebre","johnson","compañera","ayudarla","echa","mina","deuda","digan","cocinar","delicioso","podíamos","greg","dirás","pudieras","golpes","nadar","admitir","templo","adios","maravilla","quita","mate","piano","bombas","paredes","pantalla","italia","pusieron","sally","amén","mac","civil","fantasmas","gasolina","sabia","tyler","judíos","s.","pagan","arrestado","extraños","canta","texas","estando","flor","ricky","usan","cruzar","esperemos","guía","enseñar","irán","miro","galletas","hablarle","delito","atacar","objeto","disparos","museo","ruedas","huevo","violación","regresó","sufrir","tina","rica","habilidad","práctica","acabe","amado","haberle","volvemos","tendrías","maestra","city","pastillas","aprendí","cable","alcance","evento","alquiler","ordenador","incidente","huh","escribí","intentaré","metió","maleta","condado","piezas","ladrones","metro","kilos","recuerde","español","motivos","explica","renunciar","actuación","refugio","harto","reacción","paliza","chef","ocurra","marty","entrado","quitar","amanecer","molly","corazones","rumores","llames","celoso","utilizar","olvide","disfrutar","intentaba","vecino","pública","collar","golf","betty","marco","cercano","fondos","ross","bruce","montar","salvado","grados","dylan","moto","treinta","gordon","adonde","hablarte","jesse","emperador","cuéntame","do","secreta","haberse","hitler","anne","mortal","ronda","cuídate","metal","puro","cierre","colores","eva","rusia","botón","hijas","tenerlo","tono","espía","empleados","conduce","detalle","oliver","rusos","déjala","crema","roy","contesta","casarte","manda","dias","echado","trajiste","charlotte","flota","marie","mmm","platos","crímenes","cometido","golpear","dejará","tontos","sabría","abran","ayudante","cultura","hombro","botas","adoro","olvidó","biblia","saludos","katie","deme","adultos","sitios","serpiente","parker","nathan","romántico","adivinar","peores","buscan","enfrente","restos","capacidad","aliento","placa","rata","áfrica","entendí","metas","cuadro","puestos","japón","división","entradas","bicicleta","vuestras","pesado","sugiero","calla","espacial","st","ventanas","mejorar","concurso","comisaría","sincero","centavos","deseas","pasara","jay","esperado","ocurrir","pondrá","recursos","raza","muestras","wilson","volverás","ceremonia","almacén","sabor","sentarse","on","unión","frankie","reserva","españa","encanto","aviones","calidad","escondido","citas","aceite","pusiste","querrá","punta","cinturón","podrán","cuales","chiste","lewis","hablaste","vaca","vuelven","chloe","apellido","actual","despertar","instante","vincent","ud","morirá","sacaste","justin","traiga","sentada","mueva","jordan","terminé","emociones","pulso","atreves","frase","partida","sabíamos","parezco","despedido","moral","asalto","decente","informes","asusta","trabajan","my","doug","poca","pasaría","médica","discusión","verán","ciertas","pata","jean","antiguos","requiere","cogido","manzana","sed","tio","joyas","cojones","noble","ee.uu.","pediste","piedras","traidor","gané","letra","vía","sacerdote","efectos","arroz","arreglado","tarjetas","descubrió","mínimo","disparado","boston","entienden","bandera","llamarte","plaza","entrando","tomará","visitas","cooper","demasiada","faltan","planeado","imperio","esperaré","enfadada","levantar","cartera","jeremy","importar","depósito","colegas","comprobar","funcione","nina","mereces","forense","tensión","vacía","vídeo","ruso","círculo","judío","cole","gritos","carol","empecemos","resultó","campos","váyanse","divertida","pasen","pinta","supo","ascensor","quedarnos","matará","aparecer","actuando","ooh","pasas","apúrate","big","entregar","escape","indios","limpieza","rebecca","querrás","hueso","jessica","magnífico","caída","habia","dejaría","ejercicio","lealtad","alas","pasaron","diamantes","unidades","miller","enojada","decimos","leyenda","tomaste","paraíso","gatos","costumbre","podria","cabaña","ensayo","pagó","gimnasio","negativo","lenguaje","pájaros","presenta","quedes","garaje","palo","león","oídos","dick","espaldas","apuestas","pelotas","actividad","dragón","necesite","aguantar","davis","primeras","sexuales","apetece","grupos","capital","dejemos","habrías","máquinas","barato","monsieur","sistemas","fingir","pensarlo","miércoles","escritor","solitario","recibo","conocerlo","pudimos","almas","salto","sonar","russell","temporal","probado","todd","kenny","llamaron","atractivo","váyase","barra","intereses","madres","deba","imagina","niñera","quince","holmes","muro","recibe","luce","nací","prima","cubierto","contando","reír","producto","daños","abrazo","gafas","sobrino","man","demanda","ayudaré","buscado","criaturas","dejarla","perfil","trozo","actriz","repito","bendiga","pistas","whoa","hannah","marcus","ataques","razonable","vende","gerente","sensible","ríe","izquierdo","camina","traes","tuvieras","albert","conté","rueda","conoció","grano","pagaré","límites","moneda","super","piedad","militares","seguía","tocado","creado","temas","acepta","encerrado","opinas","empiezo","borde","llevarla","barcos","toby","pudieron","tocando","harvey","profesora","dejame","expresión","asesinada","escándalo","nervios","ios","randy","emoción","blake","catherine","perdedor","margaret","sienten","rumbo","valle","ian","viejas","buscaba","gorda","juventud","hayamos","desnudo","guión","grant","envié","señoritas","carreras","tratas","sucia","sophie","ratas","mayo","tirado","heroína","háblame","contestar","caos","estupidez","derek","pedirte","egoísta","mostraré","sentarme","casey","peligrosa","ánimo","viajes","lujo","mia","cantando","religión","nate","risas","despejado","miserable","hierro","corona","wayne","serías","mencionar","brad","mencionó","inmunidad","grabación","nuclear","clima","puesta","buscarlo","carácter","llamarlo","steven","máscara","alegre","volviste","cambiando","alianza","positivo","siglos","serían","guitarra","hacían","entré","vinimos","poli","that","elena","llevé","vince","prohibido","caray","arruinar","masa","túnel","bromas","evitarlo","industria","trasera","monstruos","mete","inocentes","colección","empleado","fatal","stephen","olivia","intente","nancy","putas","jess","petición","ayudado","lou","beth","vendido","cerebral","coraje","adulto","rubia","mandar","pierdes","gano","almorzar","caridad","oscar","sepan","llegada","capítulo","viniera","gastos","sentirse","entren","quédese","tarta","volvería","jersey","mataría","breve","obras","acero","llévame","street","suceda","alicia","haberla","camarada","confesión","dijimos","coartada","desnuda","payaso","rayo","guay","naves","americana","político","diseño","condenado","edward","policia","italiano","pedro","mm","camiseta","vendrán","extrañas","impacto","equipaje","lois","salieron","mantente","sabiendo","maten","soltero","descubrí","oxígeno","absurdo","algun","habrían","ponerle","empiece","devolver","propuesta","tómalo","michelle","abrió","plantas","cantante","traición","florida","pozo","patrulla","brandon","planeando","ann","tragedia","ethan","miami","trate","fantasía","billetes","ganamos","secuestro","sabrás","prestado","bodas","béisbol","ciudades","conejo","billete","díselo","mueren","shawn","cincuenta","jugadores","web","apropiado","robot","alcanzar","patatas","mantenga","tradición","países","ocultar","bebidas","siguió","reto","aldea","robaron","aguas","caminos","ellen","permitido","alli","cima","éi","risa","cumplido","objetos","decide","pregunte","once","matan","tomes","términos","reyes","revés","explotar","maletas","nubes","circo","darse","west","tanque","uñas","encargaré","estúpidos","héroes","salta","daremos","victor","terror","keith","teddy","texto","peleas","liga","martha","ana","enviaré","teléfonos","porno","diera","oscura","tuyos","olvido","queridos","colina","bromeas","sano","únicos","musical","pastor","ponerlo","naranja","batería","trabajó","reuniones","sue","figura","funcionan","voces","caroline","jacob","caramba","callejón","técnica","marshall","refería","notado","lanzar","cadáveres","atacó","vendiendo","bailando","tenerte","cubrir","liz","policial","fase","gus","joseph","importaba","armada","fea","porquería","mickey","superar","disfruta","sueldo","abiertos","piénsalo","incómodo","oyó","costado","apaga","bolsas","seguiré","imaginé","detenerlo","diana","pasaporte","infancia","suele","productos","rocas","reverendo","mediodía","golpeado","destruido","reconozco","plástico","young","barba","mago","hojas","conocerla","hallar","lidiar","sentencia","ideal","dámelo","mandó","guerrero","ayudo","sigamos","jennifer","engañar","baje","contaré","guantes","rompe","conociste","hoja","decían","recepción","logrado","odias","comisión","vampiro","finales","sufrido","azules","usarlo","cometer","descansa","peleando","docena","sera","lanza","moverse","ho","falla","angela","dejara","medias","míralo","físico","hacerla","multitud","potencial","hacías","famosa","rutina","progreso","ensalada","cómoda","prepara","tráeme","equivocas","tubo","owen","sacarlo","is","usas","letras","dennis","éstas","socios","pecados","novela","apostar","vestidos","festival","franceses","queria","gustar","auxilio","éstos","fracaso","berlín","cañón","empezaron","spencer","fíjate","votar","merezco","infantil","asesina","sentarte","mintió","grita","ofrecer","ruth","esclavos","academia","probarlo","viuda","reporte","monedas","rob","jugo","malcolm","pico","miré","rota","sociales","amarillo","encargado","so","listas","as","poderosa","prometió","drama","olvídate","normales","asegurar","locales","informado","resuelto","cueva","perdidos","escuchó","patético","abril","eliminar","venid","hicieras","causar","vigilando","función","solar","williams","dólar","trucos","lectura","camarero","toman","regresaré","tiendas","dimos","cabina","deporte","virginia","fuga","holly","jonathan","ala","champán","quedaba","viera","formar","walker","orejas","obligado","creyó","darán","materia","detuvo","casco","sabremos","agenda","rosas","aceptado","bello","fabuloso","llores","arruinado","enterado","junio","baila","artistas","realizar","hechizo","extremo","historial","pongan","yeah","próximos","tigre","fianza","consejos","mostrarte","doctores","auténtico","usamos","romance","miente","matthew","importan","paren","indio","pierdo","ví","ofrece","seco","willie","quinn","sagrado","monte","paris","discos","louise","carrie","juguetes","cerdos","enteré","escapado","matarla","casó","ali","salgas","pasajeros","debilidad","civiles","corbata","dispuesta","cuartel","cazar","robando","convencer","rollo","pescar","mezcla","parejas","giro","bonitas","necesites","molestar","amantes","gris","zoe","pedimos","refuerzos","josé","colgar","heridos","arreglo","plazo","harold","salvajes","elliot","sintió","hermosas","ashley","convertir","contarle","retiro","francis","gravedad","importe","lata","enseñaré","velas","suyos","símbolo","típico","ayudas","regresado","conducta","lane","ken","am","lana","shane","hacernos","tratan","vendedor","federales","diane","estrés","césar","soltera","gustará","em","brujas","horario","recuerden","hill","alfombra","perdóneme","actores","atractiva","permítame","desperté","salía","preciso","white","altos","fan","papas","anciano","profunda","petróleo","francesa","neil","jin","rango","sombras","malvado","defender","lleguemos","suba","jaula","watson","natalie","dosis","cartel","disparen","esperad","cargar","enviaron","jodida","seguí","postre","escala","pavo","origen","fiel","diego","embajador","tatuaje","población","harris","comes","llamen","horribles","vampiros","dormida","niveles","largas","pandilla","agrada","traigan","onda","atrapados","duque","bajas","dejaremos","b.","trono","canto","aumento","esconder","políticos","muertes","anthony","pensabas","saqué","taller","practicar","asientos","armado","gibbs","habrán","considera","atender","ponemos","we","consigues","sentados","costó","soñando","stanley","creó","ayúdenme","juzgado","hablarme","janet","bebido","pierdas","ponlo","gallina","miguel","octubre","sentirme","riesgos","dificil","besar","lavar","sacarte","cuyo","cayendo","emocional","prometida","molestia","christine","consiga","huella","agarra","karl","condena","decírmelo","cafetería","honesta","tómate","pablo","medidas","ofreció","dió","quizas","celosa","instinto","bancos","mías","juguete","villa","conocida","servirá","norman","centavo","lincoln","connor","potencia","unido","julian","copias","receta","seguirá","oírme","normas","cocaína","cambie","asesinó","huyendo","marihuana","entramos","congreso","capa","tocó","mágico","aburrida","invito","período","corredor","marte","ayudaría","cortado","mentiste","olvidaste","nieto","odiaba","fraude","zapato","liam","tiró","sector","furgoneta","causado","beneficio","querrías","alejado","junior","complejo","miraba","patas","columna","empieces","bienes","quisieras","clásico","saque","oírlo","hígado","robaste","decías","all","lleven","trabajé","muebles","actos","células","presa","travis","joan","páginas","raymond","llenar","riley","cambian","sonríe","moscú","ordenó","go","motel","venimos","cuente","a.","preguntes","mentido","decidimos","house","alimentos","actúa","prefieres","mason","prepárate","ubicación","etapa","olvidaré","trajes","santos","idioma","fruta","reconoce","vuela","ganando","bendición","luis","compasión","reconocer","contarte","vomitar","cazador","pesca","arco","wendy","llora","abandonó","supiste","abogada","fama","plano","elige","maíz","remedio","harta","maria","muéstrame","audrey","green","leonard","disfraz","termino","hombros","química","vela","muelle","tiroteo","dirigir","enterrado","acento","escoger","estupenda","canadá","indica","deudas","subiendo","bla","desayunar","tomaron","fines","espíritus","ingeniero","cráneo","baby","separados","queja","jugada","bajando","signos","dirías","von","buscaré","comen","hong","pediré","documento","tercero","rehenes","lleguen","botellas","bomberos","horno","préstamo","black","tratamos","autopsia","ocupados","penny","metí","pares","supieras","adecuada","cuarenta","profesión","británico","exámenes","tracy","evan","seth","moleste","agosto","logró","marchar","logan","crecido","empiezas","tareas","gabriel","vodka","dí","re","terribles","infeliz","enormes","geniales","generoso","brindis","rita","directa","hacéis","rifle","casino","logro","trajeron","celos","artículos","estable","escuadrón","ciudadano","colin","sospecha","violento","engañado","niega","vietnam","batman","vendió","ralph","chaval","macho","allison","menores","conozca","directora","borracha","ventas","alivio","trauma","enseñarte","bart","negociar","todavia","copas","golpea","edificios","región","duros","moviendo","kitty","aman","kong","ford","shh","lógica","eligió","sammy","sangrando","jefes","comió","traducido","narices","deberes","grito","empresas","contactos","engaño","acusación","cirujano","pagando","cenizas","retraso","asesinar","mentí","imaginas","pechos","solicitud","soporto","buscarla","mona","fresca","prioridad","mentes","francos","rumor","confías","dibujo","saliste","contaste","buscarte","prefiere","almirante","gastar","vendrás","use","craig","warren","conjunto","ciertos","verdes","invitó","alumnos","presentó","informar","cortó","maya","apagar","malditas","harían","nelson","besos","graciosa","chinos","noviembre","invisible","contarme","economía","logramos","enfermos","conectado","sucederá","asumir","rusa","habitual","id","posesión","inténtalo","saludable","firmado","oreja","calientes","liberar","cogió","toro","pintar","eternidad","similar","sobrina","tortura","máxima","franco","earl","raras","paige","espérame","nene","deportes","sígueme","sra","pulmones","cuánta","isabel","acabará","manzanas","ratón","eléctrica","ee","productor","quédense","demuestra","lauren","eventos","reciente","empiezan","pasaste","enfrentar","dejaba","aves","radiación","advierto","quemado","corea","sandy","síntomas","japoneses","kurt","juzgar","adrian","cervezas","quemar","kent","marzo","meterme","cuarta","gatillo","azar","soledad","vera","método","creciendo","amenazas","alfa","afecta","alguacil","jugado","excepción","dignidad","graves","riendo","aaron","pasear","concepto","enseñado","molestes","volvieron","llevaría","pato","duncan","padrino","vigila","quedando","numero","permiten","bebo","contratar","pides","continúe","eli","case","inusual","feria","mancha","leal","corran","parto","pegado","estarían","mafia","poesía","mel","constante","selva","mostró","jenna","juegas","contrató","sintiendo","gane","aprende","fuentes","raíces","meterte","nicole","escolar","digno","shock","heather","bastardos","quinto","for","star","your","campana","juramento","matarán","mitchell","utiliza","ronnie","ilusión","vencer","rezar","hoyo","tristeza","miró","pases","dolores","sigas","doloroso","love","debbie","equivoqué","cuidando","ocuparé","bandas","harper","protocolo","unirse","vosotras","sufriendo","tomaremos","otoño","estatal","candidato","vencido","autor","aérea","usaba","comprende","polla","huelga","rabia","agujeros","estuviese","esperabas","jovencita","callado","encender","grosero","mitch","rancho","conflicto","comando","gota","escenas","pa","colonia","medalla","contactar","jugamos","stone","cabra","traerme","parientes","creído","llenos","ultima","altas","cambiará","dieta","quedarás","vería","suelto","fans","japonés","ropas","recibimos","elementos","bonnie","piensen","pondremos","contiene","diciembre","motores","graham","estarlo","na","comercio","llegara","amada","grasa","infección","comenzado","llevarse","pesada","megan","barney","envío","desfile","suma","meterse","atrapada","mientes","cajón","tragos","salve","valores","pierre","leslie","ejecución","sándwich","lobos","fortaleza","furioso","barbara","salario","débiles","plena","pierda","murphy","cuero","jodan","oculta","salvaste","quema","cometió","temor","nora","bo","comedor","aclarar","controla","admito","ji","esconde","valioso","aguja","equivoco","ingleses","objetivos","casarnos","sello","quietos","escuelas","merecía","tiburón","mostrarle","nube","formación","compraste","autopista","evidente","camiones","programas","falsas","daisy","matas","quitado","líderes","escuchad","global","esclavo","ocasiones","dejarle","confirmar","pendiente","toalla","creación","raros","novios","escuches","temía","detiene","be","gusano","atmósfera","gina","reunir","pensión","sirven","saldremos","marica","república","siéntense","sabio","embajada","quieta","escribo","poema","kang","terminará","tenis","patada","cuerdas","dibujos","perdieron","brenda","tirando","miran","prometes","chase","pluma","posibles","fallo","iris","superman","rodilla","vestida","echó","philip","tirador","aparato","modales","horror","quisiste","pavos","permitiré","estatua","regresen","mandado","continua","siesta","ausencia","perdemos","collins","cuentos","wade","maletín","phoebe","jules","ellie","perfume","grabar","crece","jen","echarle","entro","duelo","israel","cometí","organizar","subió","revistas","dejarás","lleves","walt","carla","jill","enciende","quitó","radar","capullo","deseando","dana","bang","habrás","ganaste","locas","hall","encantó","llegues","micrófono","margen","gesto","cintas","sugiere","embarazo","stuart","encaja","consuelo","llamarla","sabiduría","sincera","bolsillos","paula","comencé","noel","muestran","lea","mágica","recuerdan","solíamos","susto","ocurrirá","hadas","sos","hare","vidrio","término","volverán","desorden","alimentar","boleto","lavado","confusión","angeles","ave","cambié","temer","pense","danos","facultad","mochila","satélite","intentan","enero","busqué","diosa","barón","clay","artes","nocturno","timbre","escapa","what","duermo","araña","detenga","intentes","correos","enseñarle","guerreros","ancianos","preocupo","bebes","imaginaba","mundos","martillo","eterna","sufrió","inicio","buscarme","estelar","pagas","álbum","rojos","jueces","allen","sufre","internos","casé","teresa","pudieran","ola","equivoca","retrato","justa","mentirosa","uu","mirado","confesar","vacas","deberá","rojas","repetir","respiro","cuya","ganancias","comedia","boy","chip","amables","inversión","gemelos","minas","falsos","times","pat","matarnos","cogí","australia","seda","distintas","diamante","april","cojo","agarrar","dirán","cobrar","lápiz","pague","deberia","caiga","tara","avenida","seca","contentos","vivió","hágalo","que-","bruno","llévate","oculto","metes","soo","mario","vic","euros","salva","mantengan","entras","manhattan","promesas","kennedy","ataúd","cancelar","island","excusas","creerme","brooklyn","seguida","busque","encendido","coro","urgencias","tales","observa","manual","ll","pasaré","cuartos","semejante","sobra","oler","basado","paro","dinos","tenerla","lawrence","andrea","modelos","pida","saluda","dejadme","comí","nido","curtis","benny","booth","pam","entran","pagué","objeción","reconoces","clan","chance","tokio","vital","vanessa","vinieras","pañuelo","preso","durar","llevarnos","esperé","trampas","quedaron","ned","saludar","prométeme","caen","franklin","halloween","donald","aguarda","causó","darás","niebla","psicópata","rodeado","invitar","cal","culpo","vamonos","colgado","goma","talla","oración","turner","acércate","tomemos","maestros","cómplice","cercana","preguntan","preocupas","saldré","licor","llevara","teme","ídolo","sindicato","fallado","crane","usé","simpson","globo","blancas","audición","vigilar","almohada","oido","increible","galaxia","long","curar","elefante","robé","guardián","fuéramos","tejido","muñecas","llamaría","anderson","atacado","vagina","samantha","levantado","tabla","monos","escudo","denise","bañera","pop","ayudarlos","moderna","blue","rapido","merecen","bonitos","angel","woo","brasil","freddie","pagará","novato","avisar","conviene","ajá","perrito","créame","olas","sabré","caí","manejarlo","fenómeno","quejas","coca","lotería","acerques","bigote","aca","bondad","aterrizar","misiles","planos","despierte","connie","avance","sacarme","tumor","camarera","herencia","vaquero","trenes","largos","patria","ponía","enviando","apagado","rastrear","acababa","técnico","injusto","activo","galería","drew","sacando","vió","tanques","enseña","editor","quinta","levante","pesa","responda","lance","pondría","resistir","hueles","bajen","hermosos","mueres","duke","agallas","verlas","sentirlo","faltaba","cindy","armados","volumen","hunter","bailarina","huyó","edición","atreve","ganan","debate","cables","compraré","odian","poeta","cortes","doña","manta","competir","nazis","fritas","dentista","amamos","menú","may","negras","apetito","cameron","traen","muriera","visual","acostado","ángulo","inferior","sydney","incapaz","volante","sierra","probando","distinta","sentiría","abuso","diente","tuyas","humilde","gene","suicidó","lámpara","sabrán","métodos","marcos","huéspedes","crean","preocupen","baker","planetas","condesa","ópera","corten","joy","medicinas","rory","mansión","torres","lecciones","sentirte","comprando","trevor","lograrlo","culpar","sacas","crecí","certeza","observar","nacer","hechas","sacaron","olvidas","can","famosos","melissa","ias","girar","aceptarlo","danza","little","métete","mates","ordenado","confuso","j.","moderno","tocas","tabaco","balón","top","boletos","lentes","consejero","chistes","guerras","sacaré","distintos","fingiendo","mensajero","judy","test","cortesía","campus","compro","bingo","asumo","impulso","pensaría","venden","conozcas","chan","explicaré","signo","ajedrez","aseguraré","crítica","ciega","cordero","rastros","protege","papeleo","cubo","judicial","sid","masaje","beca","verse","miseria","conocías","contenido","razon","sana","ritual","aliados","orina","ofender","hilo","seattle","subido","eche","quedaría","entienda","matrícula","jung","dejarán","a.m.","raya","islas","mascota","ascenso","delicado","incluye","revisa","entraron","estabamos","llevaste","duermes","neal","empuja","atado","telegrama","oir","christian","pegó","salvarte","deseaba","pisos","soñar","interna","avanzar","guy","mercancía","localizar","choque","d.","águila","rebeldes","apunta","troy","líquido","llegaré","rompí","bailey","jodas","carbón","regresé","sandra","ayúdeme","cocinero","quitarme","entraste","katherine","baños","creías","ácido","agresión","lex","consulta","nicky","alison","jan","detenerme","órganos","zach","barro","jódete","jazz","debamos","amber","cleveland","múltiples","cuentan","apártate","cretino","brooke","gays","obtuvo","min","drake","multa","anillos","kirk","quedara","claudia","hacerles","acabaron","quirófano","aéreo","carmen","misa","riqueza","separado","toneladas","criada","ida","madison","deténgase","asistir","compañías","mm-hmm","freddy","puñado","ligero","cuadros","incendios","meg","pega","c.","añadir","harrison","músculos","reunirse","sheila","sacamos","depresión","afueras","sordo","vano","brigada","diremos","perdonar","gigantes","pila","presentes","bahía","lesbiana","ligera","acceder","sentar","fáciles","píldoras","eve","compre","desean","ansioso","suplico","with","escúcheme","demos","stella","pierden","ii","olvidarlo","interno","pacífico","hablará","comunista","osos","espías","ohh","arreglaré","cuentes","coincide","servido","mick","filosofía","simpático","pillado","naomi","volviera","veredicto","regresará","cubre","jabón","egipto","simples","dejarnos","déjanos","factura","zack","cargado","submarino","expertos","cazadores","afecto","sonreír","volvía","dejad","one","oírte","cristiano","víctor","invasión","maricón","permanece","jon","botones","habríamos","criado","dawson","despertó","oriente","imbéciles","alexander","suiza","tapa","alla","votación","shaw","lloyd","heredero","atravesar","adams","favoritos","traerá","engañando","esfuerzos","diarios","arrogante","moriré","excitante","entrenar","maneja","permíteme","creíste","bosques","insectos","liberado","irene","brillo","becky","romántica","ruby","harvard","debías","choi","molestado","rosie","admiro","georgia","costillas","bernard","valentín","llenas","retirado","anciana","hablen","matamos","fuegos","suban","sucios","astuto","hueco","pariente","oficinas","reed","coja","acercarse","oficio","tejado","dorado","marinero","sentidos","torneo","kit","encantaba","this","hacha","palmer","pasteles","despedir","enteró","echaré","marchó","miranda","burro","etiqueta","sharon","marcharse","produce","naciones","polo","maldad","jodidos","perry","costo","recorrido","retrasado","arnold","lograste","núcleo","pm","bell","pidieron","acuerda","grabado","cadenas","cálmese","reducir","bajos","honorable","comidas","bodega","amenazó","renta","saliera","tiros","toco","metiendo","tímido","cerrados","ie","inocencia","pinturas","estadio","elemento","marrón","supuse","retrocede","sillas","individuo","sorpresas","adicto","cabrones","terapeuta","ridícula","busquen","derrota","traerlo","hazte","finn","morirás","orilla","mientas","construyó","escuchan","chimenea","febrero","respondió","recoge","wallace","doyle","inglesa","mueras","cumple","muevan","muertas","dormí","limpiando","suite","caleb","piratas","reparar","dorothy","rehén","manchas","bud","cicatriz","borrar","fundación","robbie","ciencias","iniciar","reservado","conocidos","niego","ningun","descubre","blair","aah","sábanas","argumento","dueños","castle","viajando","metiste","sip","flash","alec","enseño","fox","phillip","cruzado","roba","creció","cobertura","pillo","escritura","entere","billetera","hacíamos","vapor","cosecha","wyatt","capturado","cuñado","damon","sagrada","sonidos","eeuu","gatito","periodo","ocupo","furia","cuide","tortuga","patty","piden","mo","ficción","nikki","fuí","milagros","soñado","pis","andas","ovejas","granero","docenas","juegan","lógico","revisando","recibiste","retirarse","noah","salvador","secuencia","pensaré","antiguas","lydia","semillas","ponernos","falda","mikey","morris","tendrían","acompaño","escocia","menuda","utilizado","linea","pelos","circuito","richie","up","mantuvo","novedad","impedir","ego","conocerle","imaginado","protegido","gustaria","pirata","mantenido","burke","usarla","aterrador","lindsay","dolares","logré","borrachos","cheques","norma","mecánico","houston","polis","videos","gripe","ataca","sacarle","existir","jesus","thompson","bus","precios","pusimos","cuba","estúpidas","matarlos","lastimado","delitos","espantoso","comience","quitarle","postal","irak","claridad","hal","hans","bicho","beverly","sencilla","saltó","chofer","tomarlo","creéis","encantará","dr","ejecutivo","escondite","aumentar","entregado","desee","femenina","romeo","torpe","maurice","enano","cerró","pásame","delgado","denuncia","dispare","vasos","apoyar","retirar","dada","cállese","aquellas","detención","tristes","perímetro","bloqueo","intenso","pierce","suelen","portátil","vagabundo","comemos","pueblos","casamos","putos","conversar","daphne","valientes","sebastian","mcgee","hockey","vendré","garantía","torta","tremendo","entremos","devolveré","barata","alfred","pegar","isaac","stark","costará","descanse","dulzura","lastimar","pasaje","acercó","negar","pensaron","lenta","atacaron","quite","suéltalo","manny","mercedes","portal","pudiese","linterna","alemana","lindos","zorro","vestuario","garantizo","criar","colocar","auténtica","pendejo","ordenar","debimos","cabe","alimento","pilotos","amiguito","gorra","revisión","exacta","hanna","dong","vehículos","recibirá","khan","joel","senado","atras","caramelos","ofrezco","trataré","er","usaste","déme","salvación","cobra","pacto","aceptó","vientre","jessie","yang","callar","deliciosa","mirarme","opina","roll","negó","rubio","boyd","tomate","césped","inicial","aplauso","ordenes","peggy","ingresos","homero","declarar","canalla","oyeron","douglas","ordeno","jovencito","engañó","esperes","respetar","filmar","rana","mosca","vecina","ansiedad","puño","veis","premios","leerlo","rama","perderte","envíe","retirada","averigua","curva","brilla","debas","aventuras","ofrecido","considero","romano","portero","sospechas","elaine","sepamos","bobo","algodón","sexto","bajó","crítico","soñé","eterno","manejo","saludo","compramos","ultimo","posee","castigado","cohete","gps","disculpo","extrañar","salvarme","nazi","sostén","fórmula","limón","erica","jamón","boom","sensores","esencia","renuncia","elegí","fusión","atrevas","suicida","rebelde","vago","vías","samuel","camaradas","winston","asustó","revelar","srta","echas","caca","shirley","legales","clyde","won","promedio","tela","kathy","superado","aires","ardiendo","alturas","preferido","arrestar","sonaba","rocky","griego","conservar","huelo","crucero","esencial","cerradura","récord","aparecen","atascado","camas","acordamos","tucker","echaron","tomarme","caramelo","bastantes","liras","lees","arranca","manejando","vendrías","enviaste","barnes","manada","llamaban","bienestar","hugo","galleta","encantar","fiscalía","reunido","lola","fumando","ríes","enrique","mediante","bishop","expresar","sientan","tierno","valen","ginebra","levantó","políticas","interesan","deberias","pistolas","agotado","especies","llamará","oscuras","herir","acostarse","arruinó","brutal","glenn","pretende","inyección","adora","arregla","flecha","mudó","armadura","advertí","necesaria","mañanas","cortinas","cruce","músico","tire","parecían","serios","escoria","morirán","coco","sullivan","marta","nevera","sonriendo","beach","decides","pagarle","dejarlos","aceptas","culpables","sacarla","cigarro","lindas","honrado","farmacia","bretaña","sentirás","gwen","obispo","agradecer","maletero","tocaba","dallas","tenias","vivas","queden","tess","murray","ilegales","salchicha","empezaste","previsto","poderosos","cogeré","trabaje","raj","cruzando","vendo","fotógrafo","leon","próximas","fracasado","serena","ardiente","acompañe","protector","abiertas","portada","expulsado","est","bandeja","comunes","envidia","marcado","vacías","evans","ballet","traerte","alcanza","bajado","ahh","carson","fisher","década","órbita","ocupa","helena","tardará","fiona","flujo","toni","imagínate","sonny","suyas","kansas","llegarán","presta","jungla","ayudé","destinado","triple","colinas","ofrecerle","pantano","mantienen","rex","broadway","cometa","morgue","implica","set","stefan","drogado","ai","divina","lenny","detesto","granjero","admitirlo","malvada","códigos","mueven","orleans","femenino","dueña","cercanos","madrid","niñita","basada","marge","operar","yo-","invita","pausa","asilo","grey","póngase","rompiste","invitada","cambiaron","meredith","anuncios","montones","mesas","avery","bárbara","queriendo","síganme","gentil","tardar","abejas","cuna","permita","piper","durará","únicas","monk","dormía","buck","enlace","completar","benjamin","síndrome","stevie","quitarte","haley","legado","disparé","acostarme","mandé","rincón","sun","milord","dee","jeffrey","sonó","foster","chaleco","subasta","pasaremos","talvez","cam","naturales","scotty","entiendas","estate","caes","dándole","líos","jodiendo","hablaron","soltar","llevarle","marcar","quedaste","déjate","proyectos","educado","guardado","zonas","repite","hermanito","tobillo","insiste","categoría","dimensión","ayudes","domingos","li","romanos","bloque","producir","pasarme","aplausos","vaqueros","ciclo","enterrar","elvis","charlar","inventó","sentarnos","bata","aparecido","robos","duras","descuento","cardíaco","randall","recto","valerie","unir","buddy","angie","infarto","km.","echando","plumas","escrita","tomaría","creando","hammond","gusanos","detengan","abrí","entres","sida","déjelo","obligó","magnífica","l.a.","sobrio","felix","italianos","saquen","obsesión","sasha","entregó","acerque","mírala","ayudan","llevaban","deprimido","robots","rudo","partidos","cuidadoso","ayudarles","arreglos","austin","fijo","servidor","solían","estimado","bases","mónica","propongo","bendito","get","caerá","marilyn","altar","disfruten","luchador","cierren","alboroto","extrañé","formal","hermandad","rompiendo","facebook","arriesgar","vestíbulo","cobardes","racista","cuadra","explique","rio","claus","láser","tribal","dedicado","rudy","divino","campbell","tomaba","pobreza","ebrio","griffin","ambición","sirvo","tenés","enseñarme","rival","tarda","marcho","violet","christina","out","terminan","captura","parad","aparezca","acercando","tomarte","usaré","debieron","bici","bush","frágil","pensará","mejora","qu","tinta","nieta","silver","inventado","dejaras","cuchillos","ruptura","preocupan","debéis","viaja","cepillo","velada","propina","escribes","activa","toqué","cathy","tiré","caravana","callate","sherlock","gustaban","wes","meto","traseros","atracción","noté","revisé","atrae","grabando","reportero","explorar","tiburones","denny","acepte","chad","yoon","gil","postura","concreto","desnudos","gastado","apertura","hurra","trates","ahorrar","decida","regular","ruidos","film","bate","suenas","bennett","lunar","delta","pongamos","erik","cógelo","vestir","venas","reservas","opiniones","pagamos","reagan","edgar","capturar","espadas","marino","singh","lejano","altamente","solías","ocuparme","creerá","vulgar","oímos","estafa","describir","escopeta","orquesta","sentiste","sabias","llámeme","volvimos","cassie","cool","like","lester","hábito","perdono","melanie","orinar","rodar","décadas","cardenal","sospecho","amarilla","reese","arizona","escriba","dwight","hembra","pruebe","primaria","debían","cago","tiras","firmes","ignorar","falleció","quemó","bésame","corrió","picante","déjale","destruyó","marc","permitió","cambiarme","árabe","voló","stewart","boxeo","pintor","ejercito","delantera","yoga","time","forman","disfrute","reggie","mulder","hope","chi","ríen","vicky","campanas","dijeras","fallar","raíz","sheldon","marea","buzón","monroe","pareciera","hicieran","eliminado","rechazado","turistas","inútiles","facturas","cortos","visiones","habernos","lena","comparado","ponme","matarle","lesiones","desear","cerebros","ra","jorge","indican","tuviese","oyen","hermanita","estallar","paró","know","flynn","extras","temes","bromeo","atraer","mear","anunciar","tae","eléctrico","sujetos","litros","judía","dawn","cañones","golpeando","acoso","placas","remoto","conectar","enojar","cuelga","cuernos","nietos","gallo","mojado","obtiene","monica","aprendió","hubieses","moore","reid","entrenado","cuidaré","reynolds","naciste","escudos","cerradas","palos","vínculo","básico","kay","limpias","evolución","olviden","pelotón","suene","debíamos","agarró","irlandés","sudor","conociera","muchachas","huye","nucleares","hada","marcharme","convertí","haríamos","similares","comienzan","concierne","valga","eché","mito","claras","duró","rencor","persigue","trágico","brandy","violó","volverse","road","wells","poirot","generador","aguanto","amelia","riñón","navaja","dedica","muñeco","matty","usaron","by","oscuros","niles","cliff","ocultando","hara","polly","saint","protesta","hudson","llevarán","ruina","mátalo","gratitud","andan","oraciones","círculos","decidiste","plaga","uses","corazon","revólver","andre","exceso","barras","santuario","estrado","insisto","sirena","are","héctor","áreas","frito","absoluta","barrera","estándar","cargando","públicas","primos","perseguir","favores","cuan","lizzie","mierdas","supremo","matara","une","ohio","llamados","farsa","terminal","kira","moriremos","val","erin","químicos","oyendo","técnicas","adulta","venían","empiecen","permites","ocupar","tijeras","senos","calibre","dominio","asustaste","sostener","esperma","porter","dados","bién","firmó","p.m.","alias","atento","indicado","unidas","movido","lanzó","rápidos","toallas","carnicero","hunt","colgando","positiva","ari","triunfo","vendí","ballena","cállense","cayeron","regreses","uds","moriría","cheryl","terremoto","salvé","habré","frutas","resumen","llevarás","ricardo","chiflado","planea","m.","ahorros","omar","tuvieran","nolan","explotó","flotando","andaba","demente","automóvil","bellas","doler","jonas","saldrás","ondas","barril","adopción","instintos","patadas","acostarte","moscas","sirvió","huésped","existía","have","asia","inmortal","comeré","cambiaste","abro","varón","resiste","músicos","patear","sácame","grayson","cueste","combatir","ponerla","tour","contaba","hoteles","guardo","denme","cambiarlo","mejorando","avísame","orfanato","enseñando","contratos","beba","vistas","dixon","anual","declarado","aborto","paquetes","dámela","diseñado","solitaria","prepare","salvarla","facil","atraparon","venda","dj","cacería","e-mail","penas","británica","selección","culto","joyce","telefono","dormiste","entendió","notar","inestable","manga","lava","delicada","cambias","generales","bay","jugaba","mandy","congelado","nocturna","marines","einstein","ruinas","madrugada","mostrado","bichos","sácalo","boris","suponer","unico","ordena","vivirá","champagne","derrotar","cavar","sólido","mariposa","provocar","salvarlo","asquerosa","mantendré","parecerá","batallas","temblando","dragones","but","súbete","leíste","woody","asustar","mantengo","querrán","trofeo","crecen","prácticas","bares","stevens","causando","sonia","echarme","cifras","enséñame","polonia","cachorro","aumenta","fractura","revisado","roberts","guante","muros","fu","uniformes","confiado","rotos","leyó","mostrando","toquen","acordado","apuro","pañales","sonando","comiste","presos","otto","tomada","mínima","incluido","rindo","enseñé","opuesto","parecería","catalina","pito","follar","hamilton","sesenta","balcón","jefferson","camilla","bauer","sirva","llueve","paloma","irlanda","ático","homicida","dañado","preparen","cálculos","rusty","calvin","trozos","granada","filas","baúl","inventar","impide","not","llover","falló","tanner","cody","sirviente","rechazar","funciones","june","ocurren","llegaría","verificar","abuelos","bruto","teorías","separar","crío","publicar","afectado","alcanzado","estabais","vivian","tatuajes","clásica","prestar","consiguen","verduras","digital","dirigen","archer","imperial","t.","emboscada","finanzas","recta","enviamos","llévalo","soga","mudo","apodo","stephanie","courtney","paisaje","surgió","brennan","fletcher","pub","dirijo","lesión","marvin","empujar","acabemos","fuma","regina","novias","matones","redes","encendida","mátame","entorno","hablabas","burt","cambiaría","theo","bastón","explico","canales","armar","carlo","garcía","pedirme","alá","atacando","vientos","usada","hablara","verga","estudiado","llamara","cha","cd","avanzando","botes","encerrada","ayudaste","escondida","gordos","salidas","leones","garras","pleno","perfectos","acompaña","promoción","televisor","masacre","moveos","llegaba","jet","queen","detendrá","quedarán","importará","margarita","chau","devuelve","peluca","cansados","factor","recientes","trece","violín","navegar","picnic","beckett","incómoda","patrones","examinar","lazos","mrs","chantaje","alquilar","durmió","artie","enseñe","humanas","negativa","talentos","cory","futura","melodía","entierro","sentirá","permitirá","reza","cambiamos","carajos","an","fijado","urgencia","milla","plomo","deb","destruye","bufete","detroit","aparta","evelyn","conrad","creería","hogares","klaus","casaste","envuelto","dexter","dinamita","avanza","porfavor","madura","cuñada","sabés","arturo","convenció","hee","tronco","there","empezaré","gray","monja","lake","zoológico","kane","insistió","creador","monje","convierta","spock","no.","perdería","cagar","ganará","burns","roman","logra","controles","clavo","utilizó","alumno","perderé","ponle","down","túneles","furiosa","ivan","xena","apunto","cortas","abandona","cuidados","hills","arrancar","carolina","elegiste","misiones","masculino","crack","soporte","pólvora","perderás","lazo","jae","mortales","nicholas","tocan","corrí","hallamos","gol","lemon","intimidad","hacerlos","rescatar","podrias","recuerdes","mascotas","just","avanzada","invertir","costar","morfina","creencias","banquete","llamarle","pearl","hastings","enfoque","enamoré","spike","joya","gancho","escribiré","causas","gallinas","pretendía","deseado","perdonado","brady","valía","billones","colorado","post","east","capilla","lucky","reflejo","avanzado","deberíais","creyendo","reciben","subo","manuel","duerma","contador","carruaje","lote","champaña","palomitas","registrar","quedate","agresivo","grites","mariscal","gavin","brick","zumo","velo","invité","virtud","chandler","nueces","soda","bájate","matón","brody","pretendo","colocado","eco","oriental","llevarlos","valiosa","quito","ernie","pelicula","karma","descuida","dirigido","bestias","comprueba","tumbas","agnes","amos","estupido","napoleón","dudar","cómico","limpios","unirte","chicle","e.","tocino","brett","obliga","miento","descarga","corren","wang","leña","bond","sylvia","abraham","religiosa","perderá","ilusiones","saldría","analizar","perdidas","chelsea","estreno","cosita","peste","podia","software","pasajero","frenos","paja","aquél","herr","cortina","queramos","puñetazo","habiendo","rodney","odiar","hugh","hostia","termines","frasier","confirma","finch","schmidt","delgada","honestos","prepararé","tomarse","sidney","anton","cocinando","difunto","fugitivo","violenta","cerrando","donovan","danielle","conejos","preciosas","eramos","grecia","asegurado","actúas","panel","asesor","séptimo","bando","declaro","south","resfriado","devuelto","tablero","bradley","archie","turnos","sesos","movernos","viena","quitaron","confíe","atraparlo","sombreros","oxford","relajarte","michel","nobles","ética","apoya","munición","táctica","perderlo","atacan","recordaba","admite","comas","éso","frio","fumo","aprieta","destruida","payasos","bandidos","whoo","cruza","llámalo","sofía","provecho","trataron","envían","day","perras","botín","rechazo","entenderá","donante","avisado","vitales","genética","venecia","ram","muestre","paranoico","lynn","casaré","sucias","hierbas","ash","empezaba","wally","marchado","suspira","doncella","aspectos","girl","conserje","letal","arregló","chang","chen","hormigas","fechas","dvd","escolta","laurel","valla","mayordomo","claude","deportivo","mordió","jacques","apuntando","guardas","establo","asombrosa","gilbert","religioso","willy","latas","traerla","perlas","entendía","cristina","saltando","pensaban","p.","obtuve","pondrás","corporal","realista","italiana","monta","ofrecerte","helados","apos","admirador","ayudara","montado","prudente","generosa","fenomenal","acusa","comprarme","barbacoa","célula","juguemos","rodando","caigo","asustando","sabrías","decepción","pérdidas","gotas","carbono","moverte","arde","viví","demandas","rogers","semestre","javier","miramos","recibes","cristiana","hacienda","disparan","género","cat","wall","refresco","conducía","halcón","mudarse","coloca","codo","valentía","promete","pipa","sustancia","posterior","was","atrapó","envíen","brisa","reparto","forenses","taberna","ratones","aleluya","gritó","pulgar","disfraces","frasco","tequila","perdonen","bernie","pidas","decís","planear","ocúpate","es-","volved","relojes","lider","convento","tráelo","regaló","coges","insulto","paces","cargada","jared","kid","coña","lloviendo","vigilante","metida","cálido","pero-","abras","robada","gabinete","excursión","filete","acepté","dante","rich","ésas","mecanismo","atiende","liv","invento","dorada","seguirán","exitoso","fronteras","alterado","pulmón","ellis","frases","mostrador","precisión","conste","laurie","camisas","bromeaba","manicomio","freno","hondo","cynthia","america","dispares","basurero","querés","mini","abriendo","pensara","ábrelo","infiel","provoca","rodea","favoritas","mataran","respeta","comprador","domicilio","reduce","obedecer","levanten","antoine","juntar","moverme","hyun","bóveda","gimnasia","respecta","suéltala","baxter","trayendo","iván","levanto","doris","privados","fantasías","mantendrá","traidores","residente","joshua","gemelas","dibujar","violar","dirigida","cangrejo","burbuja","ignorante","sesiones","now","ejecutar","ciegas","alberto","proviene","dolió","ch00ffff","parcial","empacar","victima","sentamos","católica","creían","mocoso","semilla","ring","chatarra","hablarlo","pascua","sadie","vé","golpearon","cómodos","aceptaré","acercarme","juegues","bert","dicha","afirma","hostil","calvo","cintura","tomara","separamos","barriga","disfruto","survivor","suprema","despegar","monitor","globos","mandaré","vagón","régimen","bates","ward","huracán","cera","mirarte","aroma","enfrenta","curado","paraguas","bloqueado","misil","ensayos","declaró","pasemos","buffy","irónico","busquemos","paradero","esther","rechazó","aprobado","iros","pagaron","cocinera","felicito","agáchate","gerald","führer","robinson","renuncio","apretado","serias","escogido","catorce","liderazgo","atlanta","fabulosa","ganadores","olla","cyrus","guarde","traicionó","ocupación","hablaban","lloras","bragas","obstáculo","inodoro","denle","terraza","patricia","stacy","unica","estancia","confesó","molestias","suelte","enfades","american","éxtasis","joon","elsa","colchón","escoge","profeta","camille","world","realizado","espuma","glen","huido","ramas","fija","morimos","informó","conocían","song","pala","entregas","acusada","recorrer","acabando","mostrarme","pastilla","peleamos","perdon","viajado","tardaré","metieron","eleanor","susie","bum","latín","fanny","cristales","callada","cuchara","casero","nasa","billar","desprecio","discursos","peinado","mola","juvenil","cogiendo","masiva","derribar","anfitrión","tutor","agujas","iniciales","fino","kilo","venus","pollos","bolos","elijo","recordaré","ingenioso","cuaderno","coinciden","burton","comprarte","herman","walsh","públicos","oveja","resultar","mande","máscaras","gases","acabé","kung","asado","tímida","inmediata","data","oz","sátur","resaca","ángela","cadera","mérito","got","compañia","ventajas","santidad","cancelado","ninja","lin","seguid","monty","blues","contamos","defensor","sentó","villano","soviética","grand","fort","capitan","optimista","protesto","mejorado","keller","palma","asegúrese","luchado","pegarle","basa","anteojos","yate","g.","cobre","superarlo","mejilla","proceder","phoenix","cortando","unirme","martín","they","creerás","pica","párate","palanca","merecido","firmas","acosté","cooperar","conteste","tramando","llegarás","esclava","enterar","jerusalén","ando","look","hazle","técnicos","atrevido","práctico","reciba","forzado","ganarse","cebolla","vivían","apropiada","experta","cogerlo","duermas","limusina","ancestros","rebelión","tardado","sede","abrimos","ava","póquer","mide","escuchame","pagos","exclusiva","cría","je","mudar","culos","lesbianas","mirarlo","pusiera","està","torno","denver","sacaremos","golpeé","tentación","coman","deberás","callie","judith","sermón","dramático","sutil","fanático","cuerno","franz","sillón","eduardo","libra","suecia","confiable","detén","autobuses","copiado","buscó","digitales","surf","nadia","trigo","precisa","acercan","activos","siguieron","chao","timmy","tanya","detenerte","milán","trajimos","pretendes","d.c.","abres","escáner","daban","joo","enseñaron","nudo","baltimore","mentales","disculpan","veros","asusté","félix","olvidemos","concejal","dental","potter","suéter","mudarme","comprarle","dirigía","perpetua","ofrecí","punk","molestó","cuadras","traía","ríos","alaska","mexicano","arroyo","seríamos","novedades","abuelita","suero","matthews","abren","ciegos","sopla","amorosa","quemando","confiaba","tenso","ofendido","ballenas","posada","libera","fernando","pieles","tremenda","píldora","country","unió","creativo","escocés","bandido","crucial","yu","filme","meten","pónganse","parados","summer","dominar","infinito","escondió","carteles","marqués","gregory","pimienta","mandíbula","langosta","lastima","asustes","kat","notable","cultural","fideos","preparo","shelly","rupert","sacan","relevante","musica","respetos","químico","duermen","oponente","hallado","hércules","sujeta","decano","atrapa","at","louie","relajarse","asustados","hipócrita","déjenlo","unida","bailarín","apretar","evita","camisetas","ancho","temen","quitas","natal","ajo","adoran","evitando","angustia","consiste","andré","fran","amé","shin","nerviosos","amenazado","wesley","creamos","informa","relleno","pedo","zombi","decido","quiebra","good","pagarme","marcel","peg","obreros","olvidaba","avisaré","preparé","amen","robados","hood","ponla","universal","terrestre","price","reconoció","hipoteca","rupias","jardinero","preston","lori","condón","garrett","vuelan","facilidad","pinky","clarke","rejas","subí","harina","batallón","histórico","baba","here","pajarito","condones","chester","hábitos","prevenir","despido","padrastro","besarte","blusa","ugh","alimenta","estudia","maridos","vístete","jugó","colapso","wong","pesos","cachorros","defectos","pondrán","menta","gu","claros","internado","ofertas","lanzado","ganadora","japonesa","gail","aconsejo","mencioné","ow","pagarlo","goa","cápsula","cálmense","sherman","bombero","cumplió","aparecerá","acelera","lorenzo","sólida","eugene","scully","amarte","buda","girando","engaña","usaremos","ginger","lodo","sospechar","aislado","exige","ivy","ally","deshazte","calmado","piérdete","estes","fitz","enseñaste","asegura","poemas","tránsito","brooks","viviente","acostaste","prometer","pais","tribus","adjunto","demora","joda","trabajaré","cortaron","seguirme","vuelos","filmando","burla","anita","cásate","invitarte","traten","echamos","cross","mueves","pésimo","kara","pagarás","toc","mapas","tenerlos","hongos","mateo","gorila","facial","sushi","gabe","jeep","shannon","cambies","calabaza","autógrafo","topo","nace","if","penal","noto","amabas","eliges","entregue","aceptamos","levanté","agregar","sang","nadando","clubes","violador","suzanne","rompieron","respaldo","jenkins","simón","besado","ofensiva","planeas","apreciar","baterías","abigail","olvidamos","descubra","legítimo","calabozo","ésos","escapando","inventé","chispa","grandeza","paramos","satanás","suélteme","abe","escondes","cantan","retorno","abeja","pulgadas","preciosos","cargas","fallecido","buzz","tacos","aliado","declara","mienten","marion","sirvienta","asignado","nevada","tasa","eminencia","dales","helada","privadas","cogiste","plana","cortada","volado","regresas","extiende","simone","movió","roberto","pijama","irías","defecto","roban","corrupto","luchamos","ausente","or","sensual","millie","recupere","naval","encárgate","distante","corra","lecho","salid","conocéis","roland","dc","milo","expuesto","square","suaves","jinete","conozcan","traslado","camello","húmedo","besa","dedicas","dele","tesoros","extrema","profundas","usen","reúne","taco","seguiría","she","tratos","cierro","caminata","mantienes","guardería","tormentas","juliette","tubos","vengarse","ochenta","daga","estudié","tiraste","adicción","gemela","cartero","fichas","dárselo","explosivo","árabes","labor","fina","pentágono","barb","roosevelt","guardando","ademas","natasha","matanza","cubiertos","fax","empujó","conmoción","reunirnos","déjalos","novelas","tammy","atardecer","provocado","lacey","sumamente","misterios","residuos","verónica","rostros","frances","besó","oposición","aleja","intruso","wu","maní","gabrielle","nikita","feas","escuchaba","masas","sendero","artefacto","cancha","limonada","laberinto","ardilla","horizonte","menciona","kenneth","despegue","decirse","late","cajero","atún","deseamos","pobrecito","creíamos","comete","explicado","tomates","river","haced","violada","abandono","deberán","yerno","sandwich","ingenuo","rol","coñac","fanáticos","pretender","suenan","tardis","clinton","sugerir","armonía","salmón","arreglé","arteria","escalar","cazando","alabado","pasarlo","cigarros","correa","contener","feroz","provocó","mirándome","contexto","quítame","recogió","violentos","miedos","aparición","ofrecen","haberlos","casera","racha","trent","repentino","rezo","trish","bailes","hallaron","invitarme","conduzco","ensayar","derrotado","faro","yale","semen","creerte","contestó","chulo","aceptable","nomás","cubriendo","damien","ayuden","brien","mantenlo","taxista","rezando","estais","tos","atentos","describe","jasper","insecto","jr","let","cantaba","carros","mudamos","vacuna","deshacer","ironía","tregua","stalin","devuelva","soborno","valer","alba","ame","mandaron","volcán","consumo","presionar","tontas","venderlo","antídoto","ramera","burbujas","echarte","reportes","atraco","ciervo","críticas","vieras","belle","nápoles","hulk","saldrán","mimi","bendita","mandan","tías","sabrina","viviré","apúrense","griegos","hot","agárrate","alejarme","madam","caña","rodaje","jun","sígame","pamela","frutos","rené","importó","empleada","who","radical","obstante","corté","papás","hector","comparar","júpiter","reunirme","us","nat","cemento","montaje","quité","jang","espiando","pelean","tocarme","marcharte","contraté","divierte","donación","elefantes","leve","conforme","estanque","celulares","clarence","françois","retiró","creencia","reunimos","acudir","bolígrafo","encarga","hagáis","valió","capas","salvando","gates","echemos","cuéntanos","serviría","aléjense","hart","publicado","ocuparse","paguen","limpiado","traerle","luther","detenerla","forzar","sugirió","pediría","tia","okey","angelo","google","panda","contable","española","ganaron","genes","finge","whitney","eficiente","arregle","seminario","shelby","pelirroja","happy","gibson","grandiosa","cohetes","hughes","pantalón","lionel","celestial","gideon","mirá","sonda","ingreso","suéltenme","maduro","afrontar","revisen","cesta","donnie","engañarme","muerde","ncis","retira","adoptar","cuervo","fijamente","portland","art","lastimó","simpática","escogió","lila","clive","moon","duquesa","eun","nombrado","paras","figuras","terminen","dom","empuje","vendes","du","recurso","creyeron","ramón","adicional","delhi","zombis","turco","frijoles","cebo","exijo","pesados","caía","life","echen","dobles","peyton","músculo","mack","edith","existido","harriet","trataste","apágalo","ganarme","redada","oportuno","jardines","vega","tate","chile","janice","aceptan","henri","caros","sophia","locuras","setenta","alf","suceden","caderas","hayes","buque","nana","reconocí","suegra","apuntar","alejarse","ceder","pintado","crezca","henderson","atleta","arruiné","escritora","devon","poste","bryan","acogida","mermelada","ficha","reno","granos","tendréis","golpeaste","gobernar","peligros","intensa","lema","despejen","alejada","reducido","muda","tope","terminas","móviles","pagaste","podrido","mula","powell","variedad","hubiesen","llévala","azotea","cóctel","tripas","tocarlo","díganme","biología","julien","galaxias","correctas","atrapamos","pillar","lecturas","populares","luchó","luto","rafael","thor","terminaré","ayudarás","agarre","corres","reactor","kilómetro","háganlo","dígales","gerry","comiencen","entrará","bonos","veronica","edwards","despidió","spa","centros","puños","martini","holt","cuidarte","visitante","newton","enteras","patos","laboral","apestoso","acera","potente","bombardeo","gritaba","borrado","enterarse","becca","pakistán","guarida","acompañar","tendencia","vacíos","pasarán","católico","comenzará","descifrar","brazalete","profecía","paseando","briggs"]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_wordlists_fr_json.chunk.js b/cypress/fixtures/v3-client/locale_res_wordlists_fr_json.chunk.js deleted file mode 100644 index 0812e86d..00000000 --- a/cypress/fixtures/v3-client/locale_res_wordlists_fr_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_wordlists_fr_json"],{ - -/***/ "../locale/res/wordlists/fr.json": -/*!***************************************!*\ - !*** ../locale/res/wordlists/fr.json ***! - \***************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('["de","je","est","pas","le","que","la","vous","tu","un","c\'","et","il","l\'","ne","les","j\'","en","on","ça","une","d\'","ce","qu\'","pour","ai","n\'","des","qui","mais","dans","nous","elle","me","bien","si","du","suis","non","t\'","avec","tout","plus","mon","m\'","te","au","fait","moi","s\'","oui","va","était","as","faire","ils","sur","quoi","se","comme","sais","être","veux","ici","ma","toi","est-ce","dit","lui","votre","es","pourquoi","où","là","rien","cette","sont","quand","peux","dire","son","avez","vais","alors","ton","comment","par","ou","chose","bon","ont","merci","juste","très","jamais","été","aussi","avoir","vraiment","voir","même","sa","oh","tous","peut","deux","ces","êtes","allez","ta","autre","peu","temps","quelque","fais","toujours","encore","notre","mes","besoin","avait","accord","faut","dois","vie","peut-être","aller","fois","vu","donc","sans","monde","étais","parce","avant","sûr","trop","quelqu\'","parler","personne","avais","père","crois","après","aux","dieu","ouais","ses","pense","eu","aime","leur","homme","viens","vrai","femme","ok","doit","veut","ans","m.","mal","chez","déjà","depuis","beaucoup","vos","bonne","mort","mieux","vas","mère","sera","dis","fille","tes","gens","quel","vois","désolé","ca","voilà","avons","petit","maison","soit","cela","autres","toute","soir","passé","prendre","jour","monsieur","nos","savoir","choses","salut","cet","nom","argent","bonjour","nuit","raison","moins","arrive","maman","reste","moment","voulais","seul","aider","air","entre","papa","passe","aurais","problème","ah","peur","regarde","voulez","gars","trouvé","fils","attends","savez","jusqu\'","trouver","trois","assez","famille","dû","eh","toutes","plaît","pourrait","travail","pris","pu","tête","quelle","sait","sommes","appelle","quelques","faites","partir","vite","arrête","seule","serait","voiture","enfants","tuer","merde","hé","pendant","idée","chance","parle","aurait","part","elles","jours","grand","venir","ami","demain","hein","tard","puis","truc","passer","petite","tant","connais","combien","mec","sens","pouvez","porte","sortir","super","heure","contre","coup","comprends","entendu","vient","allons","ensemble","nouveau","amour","importe","sang","désolée","cas","sous","rester","amis","prends","fini","hommes","tué","question","partie","histoire","devrais","aide","dernière","demande","chercher","pensais","genre","seulement","police","car","mois","frère","laisser","aucun","mettre","eux","laisse","chaque","ville","arrivé","devrait","parlé","avez-vous","vont","longtemps","aucune","heures","bébé","place","revoir","putain","compris","ni","savais","leurs","étaient","attention","donner","affaire","endroit","pourrais","corps","façon","donné","est-il","voici","train","dont","écoute","yeux","trouve","pouvoir","type","perdu","premier","première","côté","point","tellement","main","tiens","sois","enfant","vieux","matin","venu","pardon","là-bas","suite","vers","minutes","demandé","venez","devant","dr","enfin","arrêter","cause","nouvelle","attendez","chambre","droit","parti","mis","eau","compte","dirait","terre","belle","espère","aimerais","loin","as-tu","mari","donne","fin","croire","mme","aura","gros","boulot","plutôt","chérie","prêt","filles","bureau","mourir","hier","possible","jouer","demander","celui","voulait","beau","jeune","euh","dehors","docteur","a-t-il","confiance","appeler","années","vérité","école","chef","femmes","propos","semaine","vivre","regardez","feu","journée","madame","hey","téléphone","près","affaires","meilleur","devez","dessus","mains","penses","prie","équipe","vas-y","grande","manger","arriver","dur","guerre","ait","appelé","marche","sécurité","garçon","essaie","important","dites","font","fort","presque","plein","derrière","ben","mariage","parents","capitaine","dernier","fou","ceux","tomber","attendre","vue","pensé","souviens","envie","fête","jeu","génial","pays","garde","cours","bientôt","ii","numéro","personnes","cinq","parfait","laissé","ainsi","retour","semble","autant","peine","minute","essayé","plan","instant","serai","prison","penser","essayer","prend","arme","mauvais","mot","quatre","rentrer","regarder","choix","êtes-vous","parfois","film","abord","voyez","faute","facile","croyais","bas","changer","entendre","plaisir","heureux","entrer","voudrais","es-tu","propre","étiez","tour","fera","ensuite","garder","agent","allait","lit","travaille","adore","amie","rendre","allons-y","route","lieu","année","voit","commence","service","devoir","attend","drôle","difficile","sûre","pire","pos","peuvent","sujet","état","ceci","sorte","perdre","dollars","voulu","morte","ira","faisait","bizarre","oublié","arrêtez","ferai","serais","tôt","inquiète","payer","coeur","dès","pouvais","reviens","chien","suffit","prenez","pensez","café","calme","cherche","montrer","parles","photo","ferme","problèmes","the","cœur","sûrement","verre","aimes","devons","veulent","doute","musique","courant","sauf","moyen","nouvelles","puis-je","avis","sauver","hôpital","questions","meurtre","sérieux","seconde","trucs","allais","esprit","cool","mlle","marché","fous","haut","salle","malade","changé","gentil","allé","six","simple","john","semaines","celle","jack","appris","seigneur","dîner","sors","commencé","suppose","chemin","partout","bras","cul","prochaine","visage","meilleure","face","soirée","roi","surtout","retard","écrit","livre","rapport","chéri","message","vaut","ferais","morts","boire","soyez","président","plait","bois","sinon","erreur","new","ecoute","mr","rentre","devait","revenir","joue","pauvre","devenir","sort","commencer","pouvait","occupe","entends","souvent","pièce","reçu","grave","mets","intérieur","honneur","dormir","an","faux","messieurs","groupe","rêve","carte","aviez","appel","manque","envoyé","début","sam","puisse","écoutez","bonsoir","content","secret","venue","cher","dis-moi","effet","voyons","sac","continue","acheter","voix","certains","occuper","noël","gagner","grâce","maître","prix","mauvaise","général","âge","long","rue","tirer","apprendre","cheveux","noir","promis","avaient","patron","avocat","force","accident","dix","laissez","bout","ordre","armes","cru","déteste","retrouver","millions","voyage","ailleurs","oublie","ressemble","bienvenue","disparu","protéger","utiliser","situation","petits","aurai","veux-tu","scène","sœur","prête","oncle","devriez","liste","soeur","dos","armée","paix","battre","york","crime","finir","réussi","agit","retourner","sale","libre","bouge","contrôle","rappelle","arrêté","hôtel","idiot","okay","rencontré","restez","mots","victime","décidé","sympa","pars","fasse","avion","bordel","habitude","table","rouge","système","photos","médecin","seras","bateau","stupide","faim","autour","fond","surprise","croyez","devais","ligne","porter","imagine","colère","clair","seront","savait","balle","gagné","or","hors","risque","terminé","su","heureuse","mission","jolie","parlez","présent","sorti","cadeau","expliquer","volé","plusieurs","gauche","ferait","neuf","ouvre","disais","dedans","disent","pouvons","allez-y","suivre","pourra","réponse","lumière","pieds","pote","montre","pied","marcher","charlie","auras","envoyer","vraie","espèce","doivent","allô","pareil","vas-tu","soleil","camp","fallait","coin","ignore","moitié","you","selon","tenir","grosse","vouloir","michael","vieille","devenu","continuer","rend","sortie","recherche","arrière","lire","doucement","joli","avance","exact","disait","club","arrivée","tue","laquelle","poser","chaud","aimé","david","fais-tu","tom","quitter","loi","tueur","donne-moi","flics","connaître","lettre","forme","connaît","conseil","bar","normal","danger","dangereux","folle","jure","tiré","essaye","bonnes","offre","but","froid","prêts","gamin","joe","classe","joué","poste","con","mike","attaque","boîte","enquête","visite","juge","moi-même","bord","debout","envoie","preuve","oublier","bons","vivant","ciel","lu","touche","aimer","télé","met","écouter","serez","ll","pourtant","change","triste","droite","gueule","tombe","sentir","ouvrir","travers","santé","dossier","ie","jeunes","frank","coucher","cuisine","monte","signifie","entrez","relation","centre","dame","chacun","chanson","foutre","voler","blanc","george","certain","don","âme","manière","flic","décision","mange","vit","compagnie","déjeuner","différent","tire","ordres","clé","vaisseau","secondes","enfer","sortez","vendre","faisais","mecs","nulle","signe","aille","acheté","étrange","diable","viennent","monter","là-dedans","capable","emmener","écrire","honte","bouche","préfère","coupable","rire","payé","soin","milieu","prochain","cerveau","paris","blague","choisi","époque","aurez","voie","réunion","connu","allée","intérêt","cheval","combat","silence","coups","existe","ia","retourne","tel","trou","public","peter","oeil","pleine","cacher","amoureux","drogue","garçons","faisons","paul","tient","est-elle","prise","dirai","client","adresse","journal","contact","dingue","sent","récupérer","base","preuves","présente","peau","servir","peuple","exemple","fiche","max","promets","lequel","blessé","société","tort","sept","pourriez","savent","ouvert","héros","menti","mer","contente","quitté","jeter","sauvé","bière","assis","robe","ecoutez","devient","opération","prévu","fut","tenez","livres","répondre","seuls","pute","entrée","vol","horrible","vin","dommage","dites-moi","auriez","colonel","ramener","règles","nez","justice","fbi","découvert","départ","bruit","secours","vérifier","enceinte","mise","témoin","dirais","directeur","excuse","environ","inutile","terrible","danse","position","humain","avenir","rêves","œil","bête","bravo","approche","fric","plupart","lycée","tas","empêcher","longue","sexe","niveau","banque","éviter","étions","lune","pitié","liberté","procès","radio","hum","verra","thé","partez","utilisé","mur","pose","revenu","deuxième","bande","certaines","ridicule","nord","appelez","copine","baiser","anglais","henry","toilettes","portes","faudra","occupé","grands","and","dérange","rôle","censé","james","reine","croit","cour","église","vide","obtenir","conneries","ennuis","personnel","conduire","tombé","sol","code","huit","avions","espoir","comprenez","spécial","vidéo","vêtements","défense","alex","sud","match","bombe","intéresse","zone","tante","paraît","excuser","magasin","marier","chère","aie","souvenir","proche","revient","danny","douleur","arrivera","presse","asseoir","ravi","aimais","h.","amérique","fenêtre","mien","terrain","sergent","peux-tu","projet","quartier","planète","rapide","lorsque","assurer","rendu","mignon","tourne","danser","bob","clients","petites","aimez","présenter","venus","jimmy","sache","mérite","machine","derniers","programme","mesdames","meilleurs","honnête","essayez","irai","connard","occasion","prouver","travaillé","glace","ayez","parie","camion","fier","discuter","village","spectacle","nul","rose","touché","mangé","vis","parole","rencontre","apprécie","jane","réalité","savons","respect","remettre","vacances","détruire","choisir","ha","découvrir","idées","officier","frères","sert","bill","solution","attendais","monstre","sexy","retrouvé","nature","rappeler","énergie","pierre","utilise","pression","faite","histoires","sarah","marié","espace","soient","nick","portable","préparer","court","offrir","will","ai-je","tony","envers","bain","charge","mary","harry","jim","ennemi","arrivent","énorme","test","gagne","réfléchir","victimes","chanter","futur","lâche","copain","enlever","retrouve","épouser","fleurs","salope","aies","gosse","arranger","riche","faits","ancien","stop","accepter","restes","nouveaux","sauter","suspect","vies","durant","invité","politique","dents","patient","repas","urgence","cartes","jambes","telle","bus","to","tourner","toucher","mémoire","série","mariée","contraire","vent","taille","trouves","celui-là","chat","continuez","contrat","couteau","double","dure","carrière","ray","regardé","descendre","papier","remarqué","noms","vécu","courage","beauté","bu","tais-toi","excellent","richard","propres","parmi","forte","étant","couple","aiment","permis","faudrait","course","humains","dégage","mille","accès","cible","joyeux","bonheur","aimait","manqué","action","steve","aidé","vouliez","trouvez","films","emmène","marie","taxi","crise","piste","dernières","puisque","blanche","coupe","secrets","prince","marrant","raisons","refuse","apporté","cassé","lors","mettez","dis-lui","tuée","maladie","mienne","rentré","week-end","excuses","km","alcool","voudrait","fil","rends","quitte","couché","disons","claire","it","londres","remercier","mêmes","partis","pensait","île","tommy","remercie","caméra","pensent","suis-je","pleurer","régler","ouvrez","entier","foutu","types","fermer","animaux","dise","image","étage","rejoindre","soldats","amuser","points","suivi","oubliez","langue","direction","frais","veuillez","miss","soldat","couleur","bouger","frappé","frapper","venait","raté","sacré","clés","mentir","épouse","troisième","johnny","amy","jésus","faible","ryan","afin","bleu","failli","courir","américain","détails","pont","gay","jake","billy","attraper","papiers","poisson","lui-même","wow","chiens","date","intention","procureur","goût","pourras","shérif","sais-tu","arrêt","sourire","lait","chasse","signal","parlait","destin","marre","français","princesse","paie","foi","chier","dois-je","présence","doigts","quelles","daniel","préféré","adieu","costume","utile","calme-toi","lien","unique","attendant","amené","moindre","quels","amener","amène","enfoiré","discours","données","robert","art","appelles","salaud","penses-tu","magie","bouteille","justement","raconter","bref","tribunal","viendra","passée","superbe","pourrai","pièces","certaine","obligé","pause","identité","campagne","lee","auraient","couper","mark","morceau","os","lettres","nombre","gâteau","dépend","job","jeux","compter","cou","of","reprendre","joie","agents","gardes","star","regard","demandez","balles","vendu","majesté","menace","malgré","appareil","demandais","là-haut","privé","adam","forces","méchant","jambe","ange","agir","noire","imbécile","gentille","labo","résultats","toi-même","cinéma","nouvel","décider","né","voulons","détruit","martin","produit","réparer","chapeau","gérer","adn","échange","mince","bougez","parfaite","meurt","fout","vitesse","fermé","succès","au-dessus","etre","souvenirs","comprend","odeur","pain","falloir","aise","caché","règle","imaginer","raconte","vus","accepté","trouvée","dors","celui-ci","ministre","infos","vendredi","voitures","lever","arbre","maire","faveur","prendra","surpris","jeté","également","fac","apporter","champ","peut-on","comptes","échapper","valeur","in","réel","million","article","doux","parc","toit","unité","resté","plage","partager","malin","recevoir","inquiétez","attendu","charles","coffre","uh","eddie","chris","celle-là","ramène","mode","folie","extérieur","van","membre","prévenir","cache","inquiéter","hasard","concerne","réponds","génie","parlais","parlons","jardin","saison","montré","frappe","enchanté","gosses","assure","apporte","prépare","mètres","suivant","souhaite","services","ouest","va-t\'","poids","poche","faisant","répondu","source","france","créer","samedi","aidez-moi","univers","saura","réalisé","perds","membres","viande","o\'","bobby","sont-ils","crois-moi","amoureuse","grandes","compliqué","bal","page","conduit","passage","piège","kevin","ressens","accepte","grace","fais-le","amusant","dan","donnez","traces","trésor","explique","fesses","perte","fantôme","naissance","retraite","regardes","côtés","larry","étranger","poulet","vienne","enlève","marque","mens","cent","beaux","entendez","ouverte","bâtiment","a-t-elle","devrions","embrasser","tombée","manquer","entré","san","chevaux","habite","animal","fatigué","billets","appelait","rachel","paradis","émission","lance","nettoyer","file","dimanche","agréable","plans","ennemis","disant","douce","belles","sentiment","bataille","perd","pourrez","relations","espérais","fais-moi","vôtre","servi","souci","note","doigt","mensonge","volonté","walter","victoire","direct","abandonné","joindre","proches","brian","droits","eric","nerveux","coupé","patients","invités","arrivés","descends","pleure","jerry","senti","cancer","répète","reposer","regrette","aide-moi","flingue","cousin","désormais","vérifié","crains","douche","gaz","interdit","théorie","scott","trace","contrôler","signer","no","demandes","internet","andy","cherchez","salon","pete","serons","appels","lancer","pantalon","rappelles","dossiers","style","ravie","semblant","yeah","kim","offert","vieil","humaine","grandi","acte","moyens","lois","kate","meurs","laisserai","aéroport","mauvaises","détective","autrement","témoins","queue","coincé","mariés","sonne","innocent","dira","créé","jason","supporter","milliers","heu","métier","crétin","retirer","chances","oreilles","trouvera","suicide","militaire","atteindre","fuir","casse","dormi","pilote","rires","appelée","risques","leçon","paquet","man","défendre","immeuble","récemment","chinois","battu","aveugle","oiseau","qu","ancienne","veste","anna","simon","saviez","amies","cherché","tirez","al","gardez","feras","lisa","lis","station","mandat","assassin","thomas","célèbre","dort","bague","tente","devenue","ventre","carter","respire","haute","genoux","terme","vert","emily","refusé","hâte","réveiller","commande","commun","souris","partons","perdue","dirige","verras","charmant","chante","sport","celle-ci","viré","ies","fiston","étoiles","laisses","parlant","là-dessus","signé","virer","permettre","pouvoirs","luke","pluie","passez","vrais","enlevé","moments","blesser","ombre","rome","épisode","talent","chocolat","assurance","couche","site","neige","gardé","chemise","ted","voulaient","emploi","privée","entière","saint","parlent","réfléchi","my","attendent","jette","joues","jury","passera","voleur","véritable","entend","chaise","accusé","zéro","mouvement","celles","sommeil","blancs","survivre","semblait","craint","notes","repos","siège","policier","allés","puissance","familles","second","cellule","engagé","adorable","matt","spéciale","violence","ours","gorge","examen","dieux","major","obtenu","évident","distance","titre","lundi","choc","théâtre","exploser","rivière","paye","allo","revenez","écoutes","logique","alice","miracle","lève","montagne","essayais","pauvres","tenu","chicago","auprès","lèvres","plat","lunettes","journaux","attaquer","mine","pistolet","divorce","noirs","meurtres","premiers","forêt","respirer","fortune","réponses","devraient","explosion","reviendra","mène","doc","maria","annie","erreurs","principal","épée","tienne","tableau","cabinet","normale","alerte","meurtrier","whoa","libérer","commis","sérieuse","carl","rock","vision","réveillé","auront","mesure","arthur","kyle","ed","louis","1er","dave","images","fuite","amitié","annonce","pousser","william","idiote","nombreux","brisé","raconté","cardiaque","minuit","humeur","physique","prof","lieux","los","seins","crier","top","go","lac","vente","vache","suit","clark","courses","casser","études","modèle","susan","version","jeff","pensées","prudent","plaisante","emmené","réfléchis","concert","blessure","tir","chauffeur","midi","souvenez","puissant","moteur","répond","hmm","city","coûte","reculez","dessous","souffle","démon","achète","smith","caméras","pousse","cesse","gare","rentrée","finit","bosse","kelly","fer","couilles","quiconque","vole","ignorais","soutien","usine","château","lâche-moi","ont-ils","garage","délicieux","oreille","virus","posé","avancer","maisons","voisins","dites-lui","deviens","sage","crédit","ambulance","gamins","fière","tourné","puce","finie","canon","liquide","devine","prennent","traverser","rues","park","criminel","cependant","sombre","agence","artiste","bosser","paroles","résoudre","chut","période","bat","seraient","bébés","cherches","donnes","préparé","soucis","traiter","street","reconnais","bye","fromage","essence","ayant","côte","tenté","chaleur","tests","champagne","objet","ouai","oiseaux","re","europe","supposé","supplie","tournée","résultat","roger","vérifie","souffrir","occupée","fusil","gardien","déranger","verrai","fatiguée","vote","dégagez","anciens","voila","tués","forcément","cadeaux","herbe","menteur","vivante","riches","vive","sacrée","taylor","adulte","siècle","attente","endroits","écris","rapports","piscine","rentrez","lendemain","fumer","concours","ment","monté","passait","vous-même","inviter","coach","fausse","élevé","chair","magique","chaîne","chèque","réseau","enfance","mensonges","pourrions","choisis","taire","inquiet","enfuir","bel","profiter","science","revenue","billet","crâne","jaloux","tien","laver","nuits","caisse","russe","cris","traité","attaqué","montez","sean","promesse","sénateur","blessures","sucre","murs","attrape","emma","esprits","cloche","phil","cia","étudier","trompe","chute","jackson","demi","devra","plainte","tim","joey","sorcière","venant","alan","tenue","soyons","chouette","karen","aurons","avocats","cherchais","angeles","surveille","abandonne","prendrai","peinture","refaire","opinion","geste","étais-tu","gaffe","empire","aient","pizza","seriez","fan","poitrine","y\'","jenny","lorsqu\'","médecins","remonte","aventure","réglé","mac","abby","barre","foyer","jean","amuse","mener","uniforme","cauchemar","soupe","jus","prêtre","lily","trompé","chuck","corde","champion","somme","répondez","attrapé","red","racontes","deviner","dis-tu","complet","crimes","maggie","crème","construit","excusez","centaines","calmer","joueur","couloir","horreur","propriété","admettre","matériel","verrez","foule","st","réaction","ennuie","laura","pub","hiver","manteau","pis","débile","trouverai","humanité","studio","josh","lapin","désert","combattre","big","julie","boutique","fonds","voient","ramené","vegas","sir","fiancée","remonter","incendie","arbres","conseils","géniale","messages","ex","surface","appellent","atteint","curieux","lucy","ascenseur","mars","apprend","abri","larmes","impliqué","répéter","pardonner","donnerai","soi","marine","cadavre","o.k.","front","traîner","rare","permet","stan","parking","morceaux","réussir","morgan","empêche","traversé","hank","décide","doué","gloire","gang","jones","portait","croient","projets","frontière","saute","hais","laissée","prénom","tenter","liaison","cérémonie","fasses","vivent","ho","océan","vélo","aimerait","réaliser","poupée","navire","saches","parties","patrick","remplacer","ménage","porté","employés","bouton","acteur","show","julia","mardi","juré","barry","médecine","restera","lourd","chargé","au-delà","survécu","bite","soudain","voyais","prévenu","baisse","filer","rompu","véhicule","sauve","emmerde","estomac","donna","couvrir","rater","terminée","fred","tâche","réserve","brûler","chou","réveille","sentez","ferme-la","etait","origine","rêvé","gary","pouviez","actions","tapis","absence","lâcher","tempête","um","souffre","touchez","cents","rempli","écran","dis-le","victor","affreux","inconnu","venger","team","feriez","sara","inventé","installer","ya","va-t-il","rythme","étudiants","pratique","whisky","ballon","équipage","signes","élèves","faites-le","parlera","attirer","reconnu","irait","loup","traite","ca.","vengeance","imaginez","navré","feront","finis","propose","forcé","lutte","2e","boss","arrêtes","convaincu","essayons","limite","panique","brillant","king","afrique","nourrir","région","nathan","passent","salaire","veille","ceinture","chansons","profond","possède","étonnant","venais","casier","jouez","roman","sandwich","arrives","nana","nommé","incident","retournez","sophie","potes","comité","chine","technique","haine","jackie","annoncer","portée","fleur","roule","palais","tromper","lady","attendait","jeudi","abruti","disiez","canapé","protège","affronter","connait","élève","pêche","masque","couvert","malheur","sentais","royaume","porc","envoyez","brûle","entretien","vingt","objets","gêne","bloc","aidera","final","conduis","brûlé","amanda","business","sauté","trouvent","ferez","alarme","laisse-le","rencard","étoile","engager","singe","colle","ooh","assistant","fallu","mm","central","naturel","essayait","étape","cage","davantage","alliance","collègues","collier","rayon","correct","jesse","gâcher","quant","assassiné","placard","soif","min","remis","russes","miel","howard","passes","créature","black","lancé","sers","échappé","parte","prouve","associé","monnaie","dean","moque","voisin","clinique","tape","têtes","lentement","classique","temple","steven","produits","passion","prenne","échoué","écouté","existence","analyse","retire","mystère","maîtresse","port","tension","qualité","nationale","respecte","vierge","piano","secteur","espérons","devoirs","pot","contacter","secrète","dispute","cigarette","manques","bouffe","jugement","idiots","courageux","limites","désir","condition","sales","courrier","volant","fumée","chanceux","expert","anne","rick","lève-toi","tasse","poussé","étrangers","censée","permettez","hall","approcher","that","greg","pile","japonais","soigner","urgences","effets","essai","fruits","yo","remplir","miles","donnera","soins","charlotte","risqué","avouer","passés","épreuve","vivants","conduite","robin","chffffff","découvre","avantage","retenir","love","miroir","etat","procédure","verres","copie","jaune","dames","betty","efforts","proposé","blessée","crie","voyager","disque","golf","annuler","section","catherine","aube","précis","doug","etes-vous","lumières","helen","briser","fait-il","vampire","échec","mexique","figure","repose","urgent","profil","médical","chiffres","carrément","pointe","is","sauce","séance","fiancé","chaude","sacs","vivait","aimerai","alliez","partage","johnson","assise","foot","bagages","boule","copains","nu","patience","suivez","criminels","poissons","fermez","bleue","tyler","égal","organiser","œuvre","moto","parlerai","texas","attitude","documents","effort","enchantée","restent","diriger","apprends","pareille","terres","serpent","all","audience","info","voyait","intéressé","pattes","football","poison","maudit","cochon","paire","your","condamné","croyait","sauvage","maximum","domaine","drogues","poussière","visiter","nôtres","policiers","rat","ajouter","chambres","séparer","valise","idéal","exprès","cooper","empereur","forcer","vincent","juger","montagnes","t-il","printemps","rebecca","avoue","oliver","faisaient","allaient","aides","collègue","bonbons","fantômes","légende","embrasse","suivante","commencez","poule","semblez","éducation","restée","dragon","plaque","prenons","mobile","peut-il","jamie","elizabeth","malades","molly","invite","musée","elle-même","bijoux","refuser","chers","pensée","andrew","psy","saurais","adultes","préviens","appart","chasser","sable","balance","critique","fièvre","irais","terminer","brown","monstres","angela","leo","essaies","charmante","née","suggère","jouait","décisions","lucas","sensible","déposer","objection","chirurgie","ordinaire","rouges","voudra","vieilles","hollywood","magazine","matière","rentres","vend","libéré","sexuelle","posez","bagarre","ross","solide","lié","marques","cercle","caroline","sûrs","sortira","étudiant","digne","cirque","amen","carlos","congé","roy","prenait","boston","meurent","beurre","émotions","causé","sortes","el","stade","entraîner","préférée","allemand","blonde","japon","sortis","barbara","épaule","était-ce","we","pigé","lls","menacé","arrivait","taux","tireur","mamie","3e","supporte","lignes","voyant","examiner","terry","orange","nerveuse","ouverture","patiente","huile","trouverez","sire","mignonne","parfum","retourné","fêter","publique","invitée","incapable","cap","couleurs","sainte","camarade","éliminer","croix","large","moral","détail","wilson","thérapie","troupes","froide","signature","pensons","parker","donnée","éloigner","trahi","jo","enterré","brave","jeunesse","guérir","officiers","recule","toby","machines","justin","sommet","géant","démons","taper","linda","organisé","sally","adorer","scénario","emprunter","tours","etes","nate","alibi","respecter","marchera","tentative","décès","rappelez","lord","livrer","blessés","donnent","fêtes","pressé","frankie","davis","supérieur","précieux","poil","rats","cave","progrès","objectif","grosses","cole","bruce","armé","panne","iras","bains","enculé","renvoyer","miller","allemagne","loyer","plateau","trés","mai","humour","marcus","olivia","actes","êtres","cinglé","moche","suffisant","douée","obligée","junior","boit","juifs","enfermé","joseph","travaux","approchez","jolies","cherchait","libres","jordan","race","injuste","gordon","plu","trafic","eue","déplacer","exercice","forts","épousé","do","cabine","miami","baise","tenait","changera","populaire","descend","nager","ferons","énervé","nôtre","furieux","jessica","nation","for","placé","traître","juif","ouah","cassette","péché","instinct","katie","derek","remise","allemands","sexuel","excitant","foutez","arrangé","original","agression","rendez","commandé","ailes","employé","ricky","boite","coupez","angle","neveu","activité","coucou","bleus","cherchent","bourse","reçois","éternité","poubelle","harvey","milliards","vol.","viol","marty","coté","pouls","jay","illégal","termine","ranger","élever","places","autorité","échelle","tribu","voleurs","comédie","seules","accueil","pommes","premières","autorisé","taule","absurde","rattraper","demi-tour","indiens","parle-moi","mérites","dégâts","fermée","réception","french","réservé","annulé","wayne","mercredi","meme","négatif","union","durer","semblent","bombes","ivre","avancez","témoigner","bah","langage","tunnel","chats","pur","poudre","oeuvre","jour-là","influence","todd","méchants","by","numéros","récupéré","pure","biens","garce","tarte","tres","hauteur","carol","finale","culture","revienne","pensiez","pénis","crois-tu","déçu","bible","pierres","gants","sous-sol","beth","oeufs","nina","rumeurs","intérêts","regardais","indice","ministère","brad","œufs","effrayant","fouiller","prier","diane","actrice","suspects","soirs","pisser","causer","finira","entrepôt","oxygène","s.","marshall","west","inquiètes","conclu","devras","francisco","salade","indique","matinée","flotte","uns","rage","amiral","perdus","gagnant","mettent","national","frigo","christ","vince","sachant","stress","tuera","grant","lâchez","commander","guide","blagues","chic","comte","fauteuil","prises","vampires","noble","apprécier","auteur","kilos","tuerai","séparés","l.a.","pouvaient","bottes","miens","foutue","espion","album","sortent","lou","violent","énerve","voudras","repartir","spencer","teddy","serment","unités","restait","promotion","sure","division","ron","viendrai","foie","puisses","pardonne","robot","relax","jess","mères","ethan","joueurs","rejoint","stupides","option","bizarres","rigole","anges","vague","innocents","lewis","soutenir","vends","floride","charme","ian","adjoint","trouvait","paraître","clan","livraison","jalouse","retiré","efficace","revenus","diplôme","piégé","interne","ennuyeux","ignorer","buvez","pervers","baby","gâché","phase","trouvés","repris","besoins","passons","sein","valait","barbe","pari","fans","dylan","connue","commerce","formation","habiller","fichu","bêtises","michelle","parent","tina","gratuit","tuyau","couvre","convient","adoré","total","oû","nancy","autrefois","éteint","étude","fenêtres","écart","charger","habitants","comté","étudié","bol","dette","diner","rêver","micro","liens","plastique","rompre","éteindre","dégoûtant","deviez","minable","égoïste","casey","léger","sœurs","edward","réveillée","one","cité","be","las","adorerais","pourrons","produire","nucléaire","russie","rejoins","tandis","descendez","espagnol","volée","vaisseaux","régime","pilules","aïe","empreinte","russell","sain","identifié","évidence","fidèle","trouveras","diras","remède","cimetière","couler","1re","emporter","fâché","exécution","porno","devrez","cellules","éléments","rang","autorités","laissera","hannah","fierté","vérifiez","congrès","enfui","métro","diamants","raymond","façons","processus","âmes","caution","lecture","rond","camarades","écraser","caractère","trous","renforts","résister","roses","ressenti","douze","gus","gibbs","plaindre","voudrez","so","ali","exprimer","religion","survie","couches","pourri","esclave","septembre","tradition","dennis","aidez","jusque","stratégie","chasseur","walker","quinn","guitare","loué","attaché","nue","améliorer","termes","soeurs","randy","vidéos","amant","courte","escalier","owen","bêtes","défi","gentils","rentrons","créatures","dollar","quatrième","changent","accent","durs","lampe","kenny","crever","ken","centrale","oscar","espérer","goûter","nerfs","grandir","feux","dépassé","tuez","faut-il","passant","totale","pro","carrie","méchante","ressentir","déclaré","dessin","généreux","attendons","bourré","mn","manuel","officiel","boisson","embrassé","savaient","appétit","commandes","risquer","entendue","excité","rouler","câble","fume","phrase","réveil","avère","champs","levé","julian","dose","coma","cuisiner","groupes","envoyée","dépêche","sociale","assister","comptez","manières","mangez","équipes","gère","mortel","voies","dick","indien","enterrer","stylo","gamine","homicide","vais-je","laissons","sue","détendre","dis-leur","blake","martha","regardant","riz","aurions","b.","ailles","crée","imagines","transfert","complexe","zut","ongles","portrait","présenté","remarque","désastre","vraies","métal","jennifer","traverse","italie","degrés","up","coincée","masse","drapeau","traîne","plaire","baisé","reçoit","liz","devenus","noix","cabane","lion","jonathan","budget","inde","souffert","villes","keith","lot","escaliers","rumeur","serviette","méthode","eli","avenue","autopsie","pue","cliente","arrange","venons","descendu","arrêtée","chefs","priorité","serré","italien","quoique","casino","acteurs","passeport","pomme","can","elena","connor","louise","rigoles","ellen","menaces","toast","bâton","doutes","préfères","bail","réunis","négocier","remets","sacrifice","williams","jeremy","citoyens","abattu","habits","otage","tatouage","interview","couru","héroïne","opérer","tendance","rupture","médias","marqué","batterie","enseigne","manager","promener","héritage","écrivain","clown","positif","hitler","jungle","penny","complice","réalise","préparez","profite","assuré","mette","pages","cousine","tester","bâtard","torture","putains","creuser","mmm","jacob","a-t-on","loyauté","cravate","mourra","effacer","t-shirt","brigade","événement","rappelé","dises","étranges","collège","leader","ténèbres","samantha","trompes","associés","examens","taré","bart","dent","poumons","holly","bateaux","trouvais","pires","charité","considère","révérend","retrouvée","girl","surement","quart","poches","désire","boîtes","malcolm","moderne","résolu","manges","mentionné","pétrole","solitaire","essayant","démarre","arracher","tendre","sincère","issue","saut","mickey","regardait","white","devaient","timide","chevalier","continues","halloween","ordures","trahison","vomir","tueurs","travis","confirmé","cri","clay","cassée","soucie","censés","adrian","siècles","cruel","agi","probable","scandale","laissent","otages","invisible","mélange","ashley","harold","albert","attendrai","déménager","perdez","visages","explosé","jouent","homer","nan","flash","systèmes","usa","simples","christine","charges","césar","evan","jouets","chaos","mm-hmm","green","outils","audrey","dessert","cons","insiste","veuve","riley","neil","moyenne","logan","contient","espagne","virée","épaules","stone","passe-moi","altesse","gênant","voter","manquait","laisse-la","protégé","esclaves","arrêtera","utilisez","cadavres","immense","net","renvoyé","mondiale","juillet","capacité","sortait","expliqué","va-t-on","sensation","sien","mason","retenu","informer","récupère","ordonné","potentiel","baisser","admire","morale","pasteur","connerie","impact","partant","baseball","sel","maintenir","stable","motel","pourront","poker","abattre","hill","oublierai","tokyo","jules","panneau","évite","regardent","tragédie","angel","serveur","fruit","aaron","marge","earl","prière","activités","légiste","impôts","confirmer","out","vendeur","discuté","dépasse","apprécié","joan","proposer","séjour","utilisent","exception","lincoln","craindre","allison","boy","poing","commences","chapitre","four","rapporte","audition","ordure","écriture","publicité","cendres","motif","rends-moi","quinze","art.","regretter","avril","boue","pleuré","rita","pipi","noté","sammy","tv","cran","échappe","veuille","vivez","apparence","principe","oublies","essentiel","moment-là","quittez","sortons","alpha","gentleman","gabriel","eaux","house","brise","verte","boules","lauren","canada","demandent","exige","règlement","francis","barney","aimable","habillé","ann","symbole","endormi","margaret","marin","what","docteurs","adorent","revanche","rarement","gâteaux","parait","with","fonce","satellite","paige","dettes","passagers","luxe","vallée","médicale","reprend","transport","effrayé","franc","couronne","chacune","plante","menu","revolver","bonhomme","légal","liam","discute","bonté","bières","complète","acier","subir","sentait","berlin","kitty","plais","planté","branche","puissante","imaginé","options","coûté","révéler","mesures","contacts","bip","cessé","fonction","lame","donnait","navrée","shawn","cachée","salopard","cuir","monica","megan","direz","goutte","rate","ticket","douter","chloé","fédéral","stephen","maths","ose","attaques","autoroute","accuser","dealer","victoria","étonne","deuil","légère","huh","avocate","statue","coule","armés","piqué","eva","pères","basket","harris","remarquer","booth","matthew","innocente","fichiers","casque","ruiné","mené","prime","bloqué","faisiez","jenna","bénisse","hélas","sec","éclater","bienvenu","aile","mortes","combats","kg","protocole","prendrais","chatte","poignée","gloria","nelson","aah","vodka","roue","oblige","quartiers","boucle","mordu","fois-ci","légitime","délire","resto","trente","island","vues","tonnes","jersey","attire","bagnole","serveuse","contacté","relève","reprends","allume","conflit","accomplir","shane","pensant","lisez","prêtes","badge","little","pension","déposé","routine","crève","articles","chagrin","local","saurai","appuie","filmer","ayons","know","servent","réduire","remet","filé","courez","rit","symptômes","feuilles","candidat","vides","soupirs","rory","wade","sauvages","organise","munitions","cercueil","cm","enquêter","disparue","réelle","trône","ouverts","planque","asile","louer","allumer","craig","tarder","fausses","existent","hop","juin","sachez","wendy","conseille","ford","fabrique","mitchell","obscurité","talents","enlevez","informé","colline","telles","horribles","avoué","mentez","fait-on","puits","octobre","cherchons","costumes","irez","suis-moi","léo","renoncer","aimée","rendent","longues","sauvée","nuit-là","testament","facture","domicile","basse","emmenée","médaille","texte","établir","vanessa","sienne","kong","record","connaisse","blé","guerrier","sms","entrain","quittes","plantes","restons","accéder","suprême","warren","installé","tuent","décrire","enveloppe","était-il","manche","écoles","batman","embête","espèces","dalle","auquel","mrs","cadre","enseigner","fâchée","restant","prétend","demandait","gris","levez","nora","sépare","magicien","1ère","piquer","stanley","canard","lancement","quantité","gym","time","punir","dinde","subi","énerver","auto","mêle","anthony","placer","réduit","fédéraux","bruits","sujets","jetez","he","tube","organes","poils","époux","tendu","ingénieur","pape","routes","lâché","portant","bats","laissant","pouce","infection","faiblesse","mettra","manhattan","devinez","tenais","mérité","collins","santa","élément","vaincre","attiré","mêler","bouffer","souvient","profonde","morgue","accuse","portez","estime","soda","diana","faibles","avertir","côtes","tournage","bonnie","valises","délit","fui","menottes","bureaux","this","requin","détention","factures","agissait","continué","donne-lui","observer","visites","conscient","maya","sortant","nicole","enfermer","vôtres","tumeur","marches","crainte","panier","ruth","immunité","compromis","serait-ce","minimum","tels","coûter","revue","hong","scotch","tracy","repéré","ruiner","violée","harper","trompez","salauds","putes","clara","pleins","come","péchés","fascinant","utilisée","avaler","nièce","élu","meubles","devienne","explose","portent","viennes","passerai","sagesse","seth","fouillé","française","janet","just","imaginais","douzaine","fusillade","puissent","serrer","trouble","sachiez","connexion","renversé","voudriez","équilibre","usage","rapporter","meure","sydney","sourd","vaudrait","industrie","connus","norman","états","brooklyn","croirait","déménagé","saigne","longs","festival","inconnue","parliez","revu","destinée","linge","ressent","câlin","trouvons","promettre","jugé","fragile","fabuleux","sieste","conçu","indices","obéir","suicider","chant","simpson","curiosité","balancer","judy","écrasé","archives","intimité","demeure","ambiance","c.","brillante","ramasser","satisfait","tara","karl","connaitre","hector","tissu","viendrais","nuages","avait-il","phoebe","soir-là","résidence","jouais","arriverai","débat","bo","homo","pompiers","sorcières","parles-tu","leçons","rendra","vic","naturelle","réunions","implique","bracelet","look","zoo","navette","cervelle","baron","jumeaux","genou","ralph","may","coincés","campus","augmenter","tragique","cash","elliot","vilain","toc","essaient","moscou","heather","grossesse","foiré","royal","amuse-toi","nid","artistes","vise","merdé","mafia","assiette","finn","kit","capables","aiderait","fréquence","ceux-là","montrent","caches","stars","dépensé","lane","méthodes","boum","atelier","passées","divine","balade","passais","capitale","générale","prouvé","déplacé","massage","mets-toi","daisy","suffira","emmenez","ranch","touchée","murphy","draps","novembre","young","opéra","prenais","violé","endormir","prends-le","échanger","racheter","fillette","duré","cessez","locale","punition","juliette","accrocher","lesquels","chaussure","natalie","rob","tiroir","agis","debbie","devrai","arrivez","hello","quête","arrivais","chase","sources","dommages","allant","fringues","marco","grève","baissez","scènes","nettoie","rendue","batte","sauras","menteuse","tennis","rares","vire","dale","désirez","culotte","disques","oignons","alicia","entraîne","mitch","tigre","foire","solitude","chariot","deal","mannequin","carla","localiser","tombent","cesser","aiguille","mettons","suisse","allumé","atterri","euros","misérable","a.","fournir","juan","diego","légumes","sperme","agit-il","confirme","pneus","évacuer","ex-femme","crié","gras","sembles","jouet","citoyen","plafond","fiers","willie","signaler","pisse","poème","pendu","holmes","prières","prêter","resterai","confier","arrêtés","voyages","ligue","voisine","irons","pique","trompée","fermes","tiendra","sandy","périmètre","dana","furent","massacre","kent","walt","muscles","détestes","aiderai","irlandais","météo","veiller","internes","verrons","défaut","enlevée","anonyme","ambassade","buter","fermeture","quasiment","chasseurs","soupir","mangent","civils","automne","excitée","aurait-il","partira","refait","splendide","accro","horloge","moteurs","bougé","enverrai","sentent","vomi","économie","feuille","colonne","vagues","pétrin","pistes","dépenser","pipe","osé","pirate","promesses","frites","parier","essayes","envoyés","peindre","partent","admets","doutais","dés","dépose","ancêtres","acide","blue","saisir","mettrai","liés","patty","kirk","obligés","vedette","marchait","christian","aidée","familier","fixe","dignité","tirs","disparaît","élections","dessins","déclare","choisit","prétendre","amenez","marteau","jet","paierai","cameron","accorder","affection","disaient","ordonne","tombes","saisi","trouille","poignardé","ronnie","fiches","scanner","document","colin","atterrir","rois","jill","sec.","serre","fichier","gina","dentiste","fassiez","occupes","plairait","plats","accorde","formes","machin","va-t-elle","ouvriers","times","utilisant","sexuels","célébrer","allen","oublions","montée","philip","partirai","civil","got","pompes","marc","promenade","entraîné","jetée","profit","tiennent","tache","franklin","emporte","damon","absent","désespéré","burke","création","cinquième","ellie","refuge","base-ball","diamant","coke","antenne","satan","aperçu","antoine","réussite","guère","provoquer","formule","fleuve","recette","intime","cordes","plaie","réagir","cuire","leslie","saloperie","eve","brooke","vaux","obsédé","duc","curtis","bidon","divorcer","relever","sobre","deviné","occupés","sonné","drogué","von","merveille","flammes","illusion","anneau","sauvetage","madison","gentiment","lana","canal","pleut","exposé","violet","élevée","gps","april","rapproche","leonard","fatigue","effrayer","dormais","benjamin","get","like","lave","visiteurs","piéger","péter","occuperai","pédé","désordre","surnom","palmer","drew","meg","range","structure","évasion","dites-le","discret","délicat","appuyer","royale","foutus","disputer","raccroche","ère","normaux","tuerait","seattle","marines","steak","drame","are","intense","svp","août","loups","verdict","échecs","considéré","pirates","assaut","écrite","observe","étudie","explosifs","tues","poursuite","recherché","singes","finisse","téléphoné","sonnerie","synchro","çà","mouche","botter","watson","bingo","plaques","clef","grillé","peint","relecture","décembre","montrez","lindsay","douceur","restés","glisser","allions","faîtes","neal","ned","vider","fonctions","michel","capacités","touches","reverra","anderson","fermés","bougies","baignoire","coincer","familiale","donnerais","eux-mêmes","révélé","fun","banques","émotion","cocaïne","turner","jetons","relais","saleté","retenue","kurt","longueur","thème","magasins","lutter","viendront","mourant","contenu","ennui","corée","référence","-ooo--","cachette","came","insectes","moustache","certes","poésie","lex","tabac","garantie","couples","bacon","apres","freddy","hôte","insisté","pull","défoncé","fraîche","zach","donald","voile","règne","venaient","misère","future","sou","inverse","coller","grotte","élection","fouille","irak","deviendra","vois-tu","tristesse","orchestre","suivent","analyses","portail","mines","montres","spéciales","puni","génétique","robes","aimons","soirées","boissons","planche","eut","chaînes","sorcier","lent","pam","vivons","nuage","now","arrêtent","divorcé","payée","louche","occupera","maladies","biscuits","connards","interrogé","archer","trahir","duke","saurait","reporter","bazar","mondes","antonio","mail","boutons","caporal","j.","poursuit","juges","tombés","plains","nettoyé","beach","marchent","enfuie","demie","mcgee","graves","alison","enfoirés","acceptez","tickets","essaierai","votes","détester","han","rebelles","descente","nicky","confus","possibles","shaw","savon","terreur","innocence","vols","virginie","janvier","cheville","experts","puissiez","ais","plomb","serions","réparé","piper","harvard","galerie","cristal","insensé","mettait","prendrait","décharge","permets","prêté","prenant","épuisé","benny","blanches","gravité","attacher","taupe","centaine","manquent","bétail","sacrifier","salue","e-mail","naomi","arts","casse-toi","majorité","blair","mel","coco","jazz","kennedy","noyer","surprises","peut-etre","relevé","principes","jacques","moquer","rituel","énormes","tordu","concept","extra","nettoyage","missiles","syndicat","bailey","circuit","tournoi","dénoncer","hope","éternel","graham","buck","bond","éternelle","déesse","fée","balancé","fameux","ci","sirène","pat","dérangé","jalousie","carmen","dépêcher","lesbienne","vif","dégager","cat","gardiens","demandons","boucher","noires","désirs","social","barbecue","galaxie","statut","carton","fox","extrême","requête","francs","planter","troy","provoqué","citron","nus","chantier","déplace","baker","chemins","unis","arnaque","ultime","vaches","feraient","quai","maïs","bay","stark","cocktail","pêcher","orbite","étudiante","3ème","comptable","arraché","manny","stuart","pénible","appelés","y.","signez","vain","oreiller","wallace","éclair","sociaux","erica","tactique","alliés","violer","villa","croisé","bang","cicatrice","vitre","postes","apparaît","habitué","codes","tonnerre","road","miracles","maîtres","zoe","sensé","melle","grange","promo","degré","cibles","habillée","duncan","espérant","battus","flamme","apportez","bases","traînée","laser","flipper","katherine","amateur","jen","serpents","garcia","élite","valeurs","contents","chantage","haley","yang","poussez","civile","amber","ralentir","happy","prudente","solaire","miranda","rejeté","meredith","comparé","troubles","banc","engin","amenée","maillot","pété","joy","trajet","démarrer","gagnes","peste","castle","viendrait","down","déconne","denise","habitudes","académie","assassins","inventer","cieux","signalé","avancé","rapporté","trevor","barman","libère","tournez","carnet","complot","éloigne","nier","nanas","pareils","envoient","dépôt","mariages","partagé","actuelle","camions","sonner","appellera","reed","world","nichons","registre","mia","pompe","frappée","veronica","fabriquer","gene","saluer","joint","ondes","évolution","augmente","grippe","détresse","effacé","chiffre","guerriers","battent","guéri","hurler","confié","fit","when","orage","xena","cavalier","commettre","aurais-je","déchiré","énervée","pendre","mordre","brosse","craquer","impatient","mario","guy","pyjama","flèche","suivie","hommage","rentrés","éclate","crevé","anglaise","accompli","boxe","sèche","maudite","décroche","veniez","rendait","habituer","intuition","serena","fondation","consulter","concierge","rosie","bêtise","comptent","réunir","lâches","étrangère","harrison","mairie","poussée","établi","vaisselle","hélico","volés","ronde","fardeau","hockey","choisie","brille","ris","doyle","d.","cuit","remplie","ivan","éteins","enchères","pertes","rayons","annule","kira","monk","livré","standard","glissé","annoncé","rentrant","souper","aprés","veuilles","institut","ventes","filmé","grey","fracture","reparti","engage","fine","dvd","fusils","wyatt","éléphant","bouclier","avantages","chips","voyou","connie","houston","fabriqué","coiffure","payez","jusque-là","ri","botte","arrêtait","député","stefan","patronne","cookies","barrière","obtient","papillon","capturé","attendra","entrés","tucker","adorait","emporté","pourvu","originale","accroche","ras","superman","pop","district","apprendra","sorties","sharon","arrières","préférez","radar","halte","deux-là","zombie","grille","critiques","soucier","promet","mâle","donnant","ciao","copines","brenda","paniqué","poète","licence","sauvés","col","titres","verrais","chan","valent","admis","emprunté","honnêtes","melissa","réalises","reculer","drake","gré","poignet","montant","beau-père","maîtrise","lydia","remplace","solo","toile","hunter","parrain","honorable","jolis","aussitôt","facteur","pere","east","claque","chloe","impliquée","sabre","filet","troupe","henri","brandon","onze","conclure","claudia","analyser","pâle","servira","sentie","pére","puissants","facebook","bud","fixer","levée","paula","poli","day","shopping","visuel","imbéciles","pacifique","retiens","éliminé","chienne","conte","compagnon","fées","arrivant","caravane","da","disparus","embêter","balader","pharmacie","défilé","ramasse","âgé","chanteur","avery","précise","rançon","bossé","grayson","miguel","bauer","retient","lawrence","miennes","kidnappé","souhaitez","nounou","adams","ralentis","repérer","bowling","détruite","emménager","laissés","comptais","us","dormez","cindy","sebastian","gant","maurice","bisou","bernard","paperasse","essais","hauts","affiche","pardonné","dallas","enfermée","recevez","good","fisher","loge","rocher","transféré","héritier","payés","terribles","sénat","polly","partes","individu","décevoir","fusion","conne","ado","crane","angie","airs","pierce","comtesse","basé","défaite","khan","talons","œuf","compté","rosa","haricots","roulé","fiable","voulions","morris","renfort","escroc","fassent","déconner","andré","céréales","tit","bandes","fins","georges","blâmer","perdant","décédé","lloyd","oses-tu","caleb","brute","puisqu\'","cinquante","calibre","trottoir","poubelles","pilule","portais","arabe","qualités","voire","encre","eus","foudre","visions","loupé","not","blesse","fortes","existait","cochons","aimeriez","shirley","marchand","poursuivi","script","loyal","respirez","sueur","espions","li","battue","changez","précieuse","impliquer","empêché","plonger","pilotes","reagan","toilette","spéciaux","vagin","décrit","hanna","boucles","coupables","coupée","former","typique","pleures","humaines","faille","alfred","allure","sucer","copies","habiter","raciste","allonger","ressort","drôles","serviteur","e.","sexuelles","case","web","locaux","cd","remplis","veine","pa","ennuyer","honnêteté","moques","sid","thompson","approprié","patrie","canons","philippe","monroe","forcée","guider","verts","amende","présume","pan","ana","fusée","zack","jeffrey","renvoie","beverly","sciences","caca","désespoir","voeux","auberge","diront","moore","bishop","zombies","boyd","magazines","marquer","soie","stella","chèvre","hache","winston","fraude","perry","ignorez","racontez","hot","mont","carburant","ve","tapé","veines","méritent","méritait","alien","médicaux","australie","insulte","farce","tires","appât","folles","explorer","noah","gage","concentré","précédent","cortex","curieuse","déçue","âne","hal","lt","scotty","danseuse","oeuf","ombres","who","économies","chauve","reese","tableaux","entouré","contrats","sauront","retournes","fumé","silver","adopter","comptait","demandant","épicerie","bennett","rentrera","suicidé","déchets","installe","clyde","inconnus","souhaiter","voté","have","pleurs","crache","rideau","février","mises","préoccupe","repousser","roues","surmonter","cœurs","exécuter","agneau","ruby","syndrome","mama","dimension","parcours","excite","jesus","becky","scolaire","appelons","dingues","finissent","raser","étages","rende","cheminée","voyous","saoul","merdique","bell","sun","saine","nazis","chiant","clean","grossier","reid","ajoute","délicate","capturer","môme","calmes","sullivan","excepté","papy","4e","distraire","randall","chèques","triple","regret","mulder","vulgaire","jouant","grain","grenier","coopérer","faciles","torturer","crétins","aîné","sembler","journées","char","tire-toi","home","richie","collé","armées","aigle","matelas","proie","furieuse","angoisse","traitée","prévoir","mick","tais","iront","vachement","barrage","gays","coeurs","sens-tu","buddy","austin","marcel","stand","durée","wells","robots","sheila","vietnam","peggy","broadway","rôles","crash","arrache","flynn","texto","délai","reggie","inscrit","cassie","barnes","arnold","nègre","bosses","vainqueur","achetée","manipuler","sortais","elvis","araignée","colonie","faillite","pognon","égalité","honorer","group","pensaient","mentale","espoirs","rideaux","renard","boom","jon","vœux","françois","mineurs","inspire","douleurs","défendu","aimiez","exister","israël","tripes","brésil","denny","plaira","pacte","réagi","dons","choper","honoré","griffin","isabelle","multiples","sacrément","hôpitaux","zones","agressé","ambition","colis","regardons","grimper","dessiner","mouillé","édition","chargée","obsession","mallette","casquette","pèse","purée","invasion","prétexte","was","candidats","impasse","cleveland","tissus","messe","revoilà","vivais","modeste","cow-boy","présents","mona","vice","éloigné","garantis","saurez","vaincu","déja","graisse","poulets","stock","right","vœu","kansas","hunt","camps","opposé","buvons","arc","niveaux","accidents","inutiles","taureau","arrete","selle","na","missile","détestent","inspiré","banane","réplique","remplacé","effrayée","commune","aspect","autorise","examiné","crack","t.","comparer","stopper","relevés","reynolds","prié","matty","offres","emmènes","saisis","rein","lourde","fontaine","flippant","buffy","favori","lits","religieux","glenn","cal","señor","ruine","participé","décoller","déclarer","timing","publié","merdes","ciseaux","empirer","south","attentat","instable","chômage","renverser","dixon","mortelle","endormie","apparu","hésite","pensions","2ème","balai","prit","environs","rapides","revenons","tiens-toi","aventures","florence","isolé","éthique","if","bars","détecteur","aveux","bornes","réussit","sécurisé","coca","utilises","béton","tess","tables","cachés","retournée","fumier","douglas","baraque","franchir","tortue","isaac","revois","verront","nage","clubs","gâche","vidé","glisse","changes","valable","soupçons","lessive","radios","urine","score","escorte","location","fiona","fondre","financier","draguer","outre","fichez","moutons","justifier","supposée","rasoir","utilisait","planifié","latin","tuyaux","chen","répondeur","mineur","active","confusion","fuis","jupe","plancher","épargner","attache","patates","partait","dirais-tu","dawson","séquence","jouons","violation","brennan","marina","intrus","sortirai","yoga","cape","troupeau","déclenché","pouvions","abeilles","fermez-la","rocky","rex","croira","minus","tueront","hotel","cam","ados","vont-ils","gin","traites","menacer","inscrire","manoir","contrarié","brody","provoque","achetez","jambon","papi","cérébrale","brett","avalé","rêvais","pétasse","braquage","chinoise","see","piges","lci","lester","tiers","aliens","suggéré","dîtes","déchire","hypothèse","dwight","demandée","mets-le","gonna","pointer","cigare","adorais","serrure","qg","marron","préserver","dépasser","nuls","accroché","mikey","chanté","anciennes","dégueu","billard","allah","sauveur","séduire","coiffeur","marais","conrad","armoire","glaces","îles","habille","elaine","klaus","vertu","respecté","gangs","campbell","appelais","episode","détestais","cuba","sonny","aimerions","nikki","sheldon","récolte","touristes","darrin","media","maigre","chandler","sourit","éveillé","lola","langues","balcon","cathy","freddie","artie","trophée","chimique","détenu","donnerait","pince","primaire","regrets","nations","kathy","christina","appareils","traîné","enfuit","capital","baie","sandra","invention","gilet","croisés","mexicain","vera","paiement","tueuse","fédérale","joyeuse","deb","omar","rappel","réservoir","brick","office","mi","hayes","paiera","bruno","mental","messager","frangin","combattu","souhait","anton","carson","kid","dépenses","passerait","crochet","naître","age","rude","développé","dee","bones","traquer","samuel","teresa","mêlé","mettez-le","chimiques","addition","exacte","gratitude","cargaison","laissait","planètes","waouh","passager","camille","désolés","jumelles","burt","prudents","guerres","branché","hudson","couteaux","jessie","5e","matins","ncis","raide","via","spock","overdose","schmidt","arizona","craché","privilège","navy","fauché","destiné","sévère","investir","creuse","joel","grec","nues","publier","murray","foster","viendras","er","boucliers","suspendu","obstacle","peintre","pourboire","échangé","comptoir","raclée","altitude","pelle","rebelle","morphine","violon","montage","andrea","offenser","disputés","gabrielle","rhume","doit-on","pablo","sociétés","tâches","claude","attaqués","gâchis","charbon","surprend","night","devront","queen","armure","déménage","gwen","mat","pourrie","divin","g.","ver","poupées","graines","puzzle","roberts","berger","alexander","montrerai","donovan","assumer","ohio","perdent","neuve","amants","karma","stevens","jeanne","meuf","ego","abus","agresseur","donneur","épreuves","cousins","grandit","hills","dirigé","signaux","clefs","wes","oz","croisière","humide","rio","square","alentours","vaste","voisinage","tiendrai","delta","dawn","guérison","écrivez","paille","célébrité","indiquent","gêné","calculs","humble","cachets","accordé","réclame","canne","costaud","ring","mourrai","proximité","scan","exposer","actuel","foirer","moine","utiles","détenus","familial","tirent","assisté","peyton","publiques","litres","garer","maux","traduit","damien","marilyn","dis-nous","chimie","fourni","sons","osez-vous","redevenir","détente","sites","phénomène","pneu","limousine","méritez","serait-il","duel","nolan","at","braves","lake","intégrer","fermier","tronche","réaliste","dorment","vapeur","dormait","fichue","lions","missions","persuadé","néanmoins","sixième","viens-tu","carré","iris","alec","roméo","pigeon","planning","round","agenda","recours","hamilton","mouches","oses","culot","cycle","mit","ressortir","trains","ex-mari","temps-ci","cachez","amusé","renoncé","calvin","marins","habituel","musicale","claires","ohh","retrouvés","épouses","collecte","devions","jonas","taches","laurie","envisager","affamé","vendue","pointé","ouvertes","rejetée","arriveras","perruque","pompier","bonus","directe","flingues","obtiens","gray","bloque","ete","débarquer","prochains","parts","modèles","calcul","achat","sombres","refusez","gardent","life","gil","démission","refus","entrent","rodney","caisses","mousse","supprimer","chauffer","requins","stage","remords","adopté","atroce","maris","revivre","interroge","foutaises","exécuté","hart","girls","étouffer","chaises","comporter","break","pénétrer","petit-ami","pige","trauma","va-t-en","tonton","cherchant","trouvées","gelée","ironie","sanguin","way","grimpe","plume","perdons","rogers","atout","féliciter","chad","ramenez","entende","erin","ella","ouvres","starfleet","coulé","comique","procéder","edgar","dorothy","décrocher","répare","ecoutes","protégée","réflexion","parié","chili","imposer","logiciel","adoption","lavé","pressée","formé","mèche","mile","peut-elle","veut-il","relâcher","guise","déterminé","musicien","del","confort","adapter","refuses","saucisse","bouquin","attachée","souriez","etais","tristes","portables","échouer","evans","finances","substance","maîtriser","phoenix","actif","féminin","préférés","créateur","am","want","ivrogne","there","lapins","sièges","gagnez","prononcer","nés","insulter","est-on","plaint","blâme","ponts","lenny","boris","river","céder","rigoler","chiottes","interdis","minuscule","stewart","em","diversion","mentent","volent","tuant","ignores","affecte","béni","concentre","entendent","ravis","gars-là","injection","otto","hugo","whoo","collines","soigné","romains","causes","décides","réserves","permettra","fantasme","baleine","soutient","juridique","tue-le","cogné","gérant","ressentez","spatial","etc.","positive","suspecte","let","ruse","embarquer","torse","puissions","rusty","cartel","bouges","âgée","risquez","voyagé","baltimore","cody","hans","autel","bénéfices","chanteuse","paient","engagée","eglise","cloches","instants","ow","alias","jurés","vivra","lena","apprenne","cinglée","véhicules","féminine","salles","cyrus","parfaits","profitez","jared","sync","perles","profité","rime","soûl","sida","futé","sasha","crises","positions","ski","ellis","piqûre","baissé","ex.","attaquée","reconnaît","acheteur","express","prennes","élégant","seau","volume","ajouté","pète","rendrai","écho","orteils","tournent","robbie","light","devrons","fidèles","attaquent","they","tanner","accusée","souhaité","saigner","gagnent","fixé","obliger","aérienne","étiquette","coton","navires","embrassée","révèle","mandy","fletcher","virginia","angelo","bandits","crayon","écrase","yes","bonbon","bac","regina","paysans","abraham","cookie","mettant","briques","dîne","rentrerai","soi-même","battait","venues","nuire","raj","adresses","comporte","hélène","beckett","clôture","enfuis","ari","intégrité","parages","maddie","cliff","due","tonne","marvin","shelby","reparlera","penses-y","loser","vendent","investi","danses","chrétien","plumes","évité","soulever","macgyver","reverrai","sapin","enquêtes","chanceuse","épidémie","ch00ffff","comprenne","cachent","augmenté","défoncer","grenade","wally","mignons","fourgon","enseigné","cardinal","gestion","oubliée","keller","raccroché","ballet","défends","menton","glacé","prudence","hôtels","éditeur","voeu","prévenue","pleines","bla","profs","sacrifié","noyé","dessiné","réacteur","devenait","mére","assemblée","rangs","luis","connecté","pedro","débris","chang","summer","hyper","gratuite","kane","hangar","rendrait","régiment","buzz","flux","noces","bloquer","je-je","arrogant","brûlée","mériter","repasser","racines","sûreté","averti","naze","june","bœuf","plaise","composé","font-ils","nadia","stevie","kara","sonde","noel","mimi","pdg","burns","bouts","plombs","défauts","saucisses","interdite","célèbres","saints","testé","soulager","hétéro","embauché","mere","distrait","refais","déconnes","déchirer","bush","vase","torche","fuit","mouillée","largué","poules","coins","superbes","roulant","qualifié","mécanique","outil","reins","pantalons","tuerais","vivian","théories","lemon","semblé","donnés","coupure","dog","goûts","craqué","contenir","trip","hourra","ouragan","liée","spike","mou","pic","haleine","allongé","matchs","espionner","catégorie","abigail","arrivées","dodo","kay","barreaux","poses","ruban","bâtiments","buffet","gavin","romain","embuscade","mo","musiciens","garantir","três","dégagé","kang","rudy","bougie","valentin","soutiens","magiques","grise","felix","entendus","déprimé","masques","vaccin","drôlement","migraine","val","coude","siens","impliqués","sauvez","vilaine","franck","artifice","rico","sherlock","isolement","espionne","liv","dynamite","dj","reprises","étouffe","allemande","reprocher","boeuf","country","pizzas","idéale","pardonnez","durera","sylvia","pâtes","aspirine","soigne","nourrit","emballe","revenait","convenu","richesse","égard","chassé","aident","bilan","adieux","sortiras","trahis","honteux","mater","price","patrons","femelle","dante","mini","démolir","sportif","dizaines","suivait","pope","fouet","introduit","artère","gold","accélère","réglo","juive","mercedes","chapelle","jan","versé","provient","arrêtons","merlin","obtenez","boulots","arbitre","lécher","séparé","ciné","affecté","hésitez","relâche","certitude","bec","crevettes","jin","perdues","hamburger","herbes","transmis","décor","parano","gai","antidote","cachait","revoit","clarke","noter","cracher","horizon","emplois","mouchoir","bernie","agressif","modifier","denver","prenez-le","stacy","grandeur","judith","détestait","parvenir","leon","nerf","accoucher","data","mètre","éclat","hugh","falaise","affreuse","logement","adresser","croiser","entrées","laurel","ivy","cerveaux","torturé","doris","bridget","nicholas","retrait","back","cassettes","épuisée","ruines","cv","chi","clou","détesté","violeur","brutal","illusions","tremble","existé","nomme","dansé","privés","argument","scully","croise","sirop","end","sublime","résiste","renonce","repart","rochers","ruelle","prions","parade","nain","ballons","élevés","marijuana","evelyn","largement","manquez","rampe","bienvenus","inquiets","patte","nommée","écarter","accélérer","tunnels","sachent","nuque","doubler","diplômé","récent","gala","here","aidés","jefferson","quotidien","aérien","fortement","nouilles","gravement","trad","lancez","hypocrite","glacée","enterrée","valet","paysage","mexico","savions","reprenez","cruz","réels","goûte","gâchette","exercices","cure","lucky","ramassé","répétez","fosse","décédée","lin","rancune","quittée","écoutais","dance","dépense","hurle","paisible","apollo","dexter","phillip","supplier","milo","cuisinier","ramènes","weekend","wall","séduisant","gouttes","haïr","oubliais","coloc","marchez","banlieue","évader","corriger","regards","cuillère","souffler","éclaté","beurk","nombres","carlton","imposteur","sofia","insigne","visiteur","caserne","callie","lynn","reportage","effraie","cartons","marianne","abrutis","obéis","sophia","sympas","province","mythe","envoies","légale","puisqu","ward","uniformes","sonnette","enfoncer","muet","erik","camping","posséder","simone","yacht","prophète","observé","contexte","encaisser","optimiste","moon","mate","tomates","cogner","cynthia","entendait","sadie","milan","consiste","convoi","pelouse","flûte","nicolas","gardait","dentaire","modifié","tequila","liées","dragons","confie","willy","contenter","rassemble","tracasse","mourrez","pourrir","fiction","attendiez","jedi","spirituel","organisme","lizzie","indienne","mouton","supplié","suzanne","prés","sente","percy","excès","idole","high","emménagé","perturbé","pois","voudront","infecté","partiez","mettrais","susie","relâché","évanoui","doyen","pearl","échoue","slip","griffes","mesurer","pâques","contacte","gestes","laid","paies","avancée","continent","amuses","mènera","hait","amateurs","pâte","horaires","énigme","localisé","poèmes","josé","bouquet","bijou","majeur","soutenu","yale","men","bassin","bonnet","touchant","courent","secouer","peurs","plaintes","nsa","di","mènent","tatouages","aiguilles","paniquer","sages","clairs","milliard","donnais","joyce","répété","aimaient","pleuvoir","semestre","becca","arrivons","jaunes","cognac","étonné","racine","jurer","débiles","violente","gabe","piloter","médium","intimes","post","soulagé","bunker","capsule","éponge","luther","classes","rétablir","blues","nommer","efface","lavage","vicki","hi","préparent","mâchoire","percer","poster","robinson","malik","curé","ironique","avatar","tournant","plonge","essayent","viser","isabel","sécher","vortex","conseillé","parlaient","thon","cruelle","menacée","choqué","tirée","fais-toi","goûté","maléfique","side","ouf","toutefois","égale","garrett","suffisait","sports","rhum","marshal","débarqué","wesley","buvait","sers-toi","servait","cheryl","chrétiens","potter","merdier","brady","gilbert","refusent","mord","réduction","weaver","proprio","plongée","vendez","ignorait","pr","sdf","porcs","doive","anomalie","alexis","fitz","carbone","dit-il","fi","clinton","indic","chelsea","shepherd","distances","einstein","boys","barb","visible","prévue","ava","fidélité","perde","sérieuses","salir","zoé","gail","réconfort","réagit","croyant","foutent","signale","autorisée","hôtesse","remettra","triomphe","chargez","acquis","soupire","butin","trait","atlanta","fait-elle","horaire","dépit","vanter","from","chiot","spa","coque","burton","déguisé","garé","aimant","indiquer","diffusé","news","pentagone","ninja","brisée","précision","prononce","conquérir","parlerons","mourras","tabasser","bénéfice","more","livreur","entendais","plaisait","défunt","larguer","potion","parcouru","baxter","rassurer","cuisses","gelé","couverts","affirme","toxique","hilarant","barres","montes","librement","invente","vieillard","allées","coupes","brun","suivis","entrant","emballer","approuve","grouille","addison","american","sanchez","occupent","mails","débarque","nasa","souvienne","infini","ramenée","bouchée","condamner","commode","tammy","e-mails","crystal","make","chauffage","adores","merdeux","couvent","survivant","diffusion","cross","greffe","whitney","disparais","conserver","réfugiés","exagéré","nœud","hormones","hm","fiancés","porteur","prends-en","lâche-le","craignais","relié","droguée","humilier","carlo","applique","infiltré","ouaip","condamnés","patricia","ià","won","reconnue","puces","f.b.i.","bourrée","individus","péril","semer","remonté","bisous","alexandre","géante","suggérer","calmement","acceptes","biscuit","heurté","chapeaux","appuyez","prendrez","phrases","jai","canyon","lori","loterie","miettes","pièges","gates","violents","toux","portland","par-là","finch","jasper","aimera","take","majeure","recul","immédiat","archie","olive","vents","stu","trêve","hérité","visa","tate","têtu","griller","lignée","défaire","épave","italiens","fréquente","mômes","brûlures","municipal","améliore","rich","cote","étapes","reçus","soumettre","déception","führer","séminaire","libérée","baisers","défier","briggs","amelia","redevable","sherman","nourri","enverra","ordi","sal","meute","regardée","yens","colorado","aillent","dite","partais","patienter","coq","œuvres","minou","dates","debra","emmerder","salopes","pouces","créée","anéantir","rentrait","fourrure","demandera","fût","dong","mule","fourmis","how","terrasse","chorale","occasions","cavalerie","menthe","préfet","climat","verser","holt","stressé","solutions","secte","bradley","foncé","corrompu","frappes","insecte","capture","extrait","lacey","prêtres","bates","sentence","généreuse","dealers","matos","supposer","attrapez","employée","new-york","reproche","connasse","scoop","boucler","bella","sinistre","pauvreté","harriet","plaider","shannon","épais","bourbon","mortels","gangster","tait","paquets","habites","poings","bien-être","appliquer","ignorent","brèche","chaton","embarque","say","bandit","wong","marks","musulmans","clowns","harmonie","désintox","franchi","insister","héro","tuez-le","hostile","trempé","woody","tete","réalisez","décroché","craignez","prophétie","activé","utilité","habitait","utilisés","cite","placée","ally","saul","culs","pancakes","filez","entres","décollage","valley","embauche","asie","sourcils","close","dot","montréal","amical","quarante","prendront","vicky","avances","froc","berceau","presser","moquez","powell","gregory","glen","chalet","heart","quoiqu\'","provenant","danielle","apprenez","bert","martini","occupez","remettez","envoler","k.","confesser","francine","vaughn","endommagé","harceler","physiques","napoléon","cohen","parlions","tentant","roland","prétends","ernie","serveurs","piraté","danseur","servante","jadis","rôti","anormal","sentiras","gages","insultes","émissions","couverte","malins","wang","tue-moi","étendre","glaçons","mettrait","crawford","emballé","gotham","pleurait","pitoyable","évènement","muscle","rendus","répugnant","beignets","secrètes","programmé","party","enfreint","illégale","flou","24h","irlande","crédible","bd","esclavage","preniez","cire","yep","coupures","zero","gamme","crue","détient","anonymes","écharpe","lier","centime","brune","finiras","jours-ci","noeud","librairie","enfermés","rigolo","banks","aveugles","venise","foin","bouddha","écoutent","mépris","peterson","récente","absolue","bulletin","gideon","avale","croyons","lionel","roche","culte","endurer","souhaits","intrusion","goa\'","ahh","rejeter","arrangera","mentor","terrifié","nobles","évier","county","helena","sensibles","daniels","similaire","vivres","mills","dures","ouvrier","tenant","occupait","onde","exclu","moulin","gagnera","herr","tiens-moi","prendras","sonia","fugitif","chantait","douzaines","millie","indiqué","décolle","plier","raisin","semblable","massacrer","stp","surveillé","gèle","vicieux","citer","trish","lard","sidney","suffire","brien","banquier","brendan","consoler","amènes","évaluer","achèterai","brooks","approché","frappez","sherry","sniper","vega","impulsion","procurer","fanny","marée","joshua","cliché","tranche","valoir","opinions","barbie","mack","moelle","filme","nourris","traque","rush","allié","câbles","never","oeuvres","dinozzo","shh","samouraï","arrêterai","asiatique","chantent","volées","rasé","craque","tendue","horreurs","maudits","comble","abusé","aborder","arabes","écureuil","rentrent","supposons","queens","scie","repère","embaucher","sympathie","sacrés","sutton","atomique","fumes","bataillon","achètes","oups","briquet","timmy","kenneth","piégée","repars","japonaise","old","ramènera","explosif","esther","blog","ouh","complices","maligne","traîtres","mi-temps","quentin","p\'","gibson","achever","parapluie","verrait","disposer","sérum","priez","triche","franchise","suce","devenez","nazi","soupçonne","portera","teint","rattrape","remarques","écrits","hanches","béguin","vivaient","bulle","tiennes","extraire","a2","jouir","burger","chantez","cordon","aurais-tu","brûlant","poumon","tailleur","égouts","intrigue","impoli","épargne","nie","tubes","faisions","approuvé","confiture","présentes","pom-pom","géré","équitable","spatiale","ficelles","tracer","saumon","jade","séances","exercer","hyde","dîné","inattendu","briller","janice","empêchera","orgueil","mangeons","cigares","jeep","immeubles","gymnase","mondial","trainer","franche","disparues","garderai","maladroit","salive","kat","simmons","allumée","cuivre","peigne","hughes","espérait","plombier","cherchiez","piles","baigner","ralenti","celles-ci","solides","ouvrent","bulles","eleanor","gonzesse","song","marquis","drone","détourner","non.","ugh","duchesse","choi","sirènes","cargo","bancaire","clin","fuyez","triché","batailles","barré","limité","torres","vestiaire","graine","emmènerai","participe","sdi","ail","jr","associée","prononcé","session","chauffe","plongé","maniaque","gardons","monty","dirigent","basée","soumis","q2","millier","objectifs","étrangler","studios","exploiter","chauds","espéré","libérez","disputes","p.","pratiquer","fâche","dom","répandre","fondu","lires","devise","manifeste","design","soulève","pâté","humilié","javier","fais-lui","informe","pagaille","virage","admirer","yankees","moutarde","métaphore","bridge","bâtir","jardinier","méfier","donnie","pavillon","she","woo","dévoué","cafétéria","globe","pubs","débuts","lente","arche","deja","passionné","remplit","tricher","éclairer","raccourci","chemises","module","aidait","contrôles","restiez","mexicains","jenkins","clous","tango","contes","douces","ignorance","poisse","avéré","mangeait","branches","cogne","madrid","ambitieux","morsure","ding","sainteté","pigeons","creusé","italienne","sermon","diplômes","alaska","trent","grèce","arriverez","yu","fatigués","loue","avertis","parle-lui","coût","melinda","faveurs","faucon","detroit","fibres","normales","appuyé","barrer","rangé","emmerdes","utérus","rails","prévenez","vexer","maitre","chaudes","croyable","laissais","voleuse","cerf","marion","poussent","parasite","impose","dôme","sentirais","paresseux","enculés","unir","garée","prétendu","mettais","pratt","frérot","classée","pareilles","vendait","probleme","identique","tarés","ignoré","baskets","prends-la","flèches","musical","bouc","greene","freins","limonade","aire","citation","darren","suture","perdra","gênée","mélanger","résumé","thèse","farine","enfonce","absente","wolf","perle","r.","tenez-moi","chantes","naïf","bavarder","envoi","absolu","dansez","assiettes","hawaï","notion","scout","fouillez","boivent","battez","irm","f.","lecteur","bâti","coûtera","kai","amène-toi","retirez","entrevue","mourront","appui","boxeur","reflet","promise","falls","vingtaine","rabbin","bio","dément","découper","permanent","terrestre","criant","lucifer","phare","habituée","onu","bloquée","voulant","moe","généraux","etje","ra","mollo","léon","homard","terminale","supposés","évanouie","hopital","toubib","baguette","initiales","lilly","trésors","poney","concerts","file-moi","malchance","négro","jeannie","confiant","ampoule","drague","éteignez","neill","parachute","cafés","wu","stups","armstrong","gardée","persuader","grade","réactions","effondre","punie","buté","gorille","bourreau","atteinte","sas","neutre","septième","sifflet","abandon","défend","hammond","uh-huh","north","edwards","walsh","cinglés","dormant","cadet","roosevelt","experte","doublé","preston","google","mystères","contrôlé","cocktails","michigan","sloan","félicite","prévenus","nègres","people","holden","veau","châtiment","bad","détruits","c.m.c.","voyageur","resteras","promu","publics","étendue","évanouir","apprête","punis","coutume","obstacles","pressés","capote","porterai","polonais","cruauté","arguments","conduits","banal","creux","morveux","envoye","sieur","pamela","mélodie","egypte","surf","wagon","embarqué","montana","assieds","ketchup","iv","ramon","probation","cheveu","coudes","plaisirs","ceux-ci","franco","gènes","correcte","tartes","déprimant","revenant","marta","traitez","gardner","fermées","4x4","dewey","warner","immobile","arrêtais","critiquer","live","rentrais","elderman","douté","vermine","ôter","orphelins","ennemie","pissé","romans","médocs","privées","tuées","mécanisme","reprenons","martiale","fondé","darryl","julien","dirigeant","batteur","rigolez","paru","mers","marchant","palm","clayton","visité","ronald","financer","jouera","sandwichs","bâtards","devint","encourage","over","blond","sécurisée","masculin","ty","isoler","bree","laine","analysé","seigneurs","exagères","tanya","entrons","anita","sourde","réussis","tombera","équipier","gratuits","mindy","stellaire","détour","opère","entendra","saurons","champions","épousée","palace","diriez","céleste","infirmier","pensez-y","bien-aimé","accomplie","réclamer","pieu","schéma","traduire","opposer","indigne","lorelai","tapette","accusés","fuck","amenés","élan","effondrer","rousse","manches","tentation","fatal","seize","visez","pédale","gratte","profits","zoey","devon","inculper","mouchard","nikita","stephanie","dark","prédit","humiliant","gène","jacuzzi","rejette","préfèrent","lila","rangers","cerise","cha","orphelin","v.","pakistan","athlète","relier","panneaux","crabe","ridicules","short","sugar","vitamines","henderson","renvoyée","choses-là","lie","injustice","indiana","ezra","jérusalem","lueur","étonnes","stagiaire","triangle","peintures","canards","placés","remuer","stephens","épisodes","conduisez","couchée","retarder","general","maintient","pauline","dénoncé","immortel","déroule","elsa","savais-tu","accords","frotter","gerald","affiches","abe","fatale","détacher","baises","rive","montrera","duo","mauviette","sterling","prendrons","auteurs","sierra","hayley","pêcheur","malaise","cavale","georgie","géniaux","gratter","saisie","pologne","moines","touchés","garde-le","creek","louie","origines","satané","lourds","cafard","géants","exagère","parlement","bougent","pots","envisage","croie","amusante","nash","conserve","méprise","plasma","récit","ivresse","réserver","tribus","obscur","cultures","voudrions","elisabeth","jarod","vitrine","tomate","donnons","cassidy","rebours","payait","bruyant","pourris","bouffon","affamés","wheeler","hui","nocturne","5ème","protégez","trembler","relaxe","courtney","affirmer","franz","nécessité","carottes","habitez","seringue","épargné","manquera","fermiers","cho","tirés","biologie","gagnants","iran","patate","décidez","edie","tessa","gêner","trompés","dortoir","marketing","roberto","enterre","protégés","émeute","pros","gueules","box","acceptera","souffrent","volcan","mentait","tireurs","sélection","poussin","marissa","préoccupé","squelette","profondes","rouleau","ducon","achats","faith","détecté","menteurs","brique","dope","inclus","délires","acceptée","vieillir","clarence","shelly","usines","malle","peluche","employeur","pouvant","suivra","kramer","vance","martiaux","désaccord","bronze","écrivait","crichton","évêque","écoulé","visé","bâtons","quitterai","bananes","chimio","hanche","consacrer","andouille","intact","centres","parceque","finirai","chocolats","contactez","procédé","divers","agité","tournait","lancée","gaspiller","exprime","abdomen"]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/locale_res_wordlists_pt_json.chunk.js b/cypress/fixtures/v3-client/locale_res_wordlists_pt_json.chunk.js deleted file mode 100644 index 109ce474..00000000 --- a/cypress/fixtures/v3-client/locale_res_wordlists_pt_json.chunk.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; -(self["webpackChunk_padloc_pwa"] = self["webpackChunk_padloc_pwa"] || []).push([["locale_res_wordlists_pt_json"],{ - -/***/ "../locale/res/wordlists/pt.json": -/*!***************************************!*\ - !*** ../locale/res/wordlists/pt.json ***! - \***************************************/ -/***/ ((module) => { - -module.exports = JSON.parse('["que","não","de","um","para","eu","uma","está","com","se","do","por","os","ele","mas","em","bem","isso","da","como","sim","as","no","mais","na","meu","aqui","me","muito","foi","ela","isto","estou","fazer","vamos","já","ser","vai","minha","só","ao","tem","tudo","te","porque","há","tenho","vou","tu","sei","quando","agora","estás","você","lá","então","ter","era","quem","onde","nada","ou","coisa","dizer","são","quero","estava","sou","seu","pode","mesmo","esta","eles","nós","sua","dos","todos","nos","mim","posso","bom","ver","este","casa","temos","tens","tua","nunca","estão","até","assim","teu","acho","falar","disse","ainda","tempo","também","ir","pai","sobre","vez","quê","quer","és","favor","depois","tão","melhor","mãe","talvez","olá","obrigado","noite","ti","sabes","sempre","deus","estamos","alguém","dia","certo","nem","alguma","vida","anos","dele","sem","vais","das","tinha","estar","queres","coisas","homem","pessoas","algo","pelo","ficar","boa","sabe","parece","claro","dois","verdade","tipo","preciso","antes","senhor","lhe","podes","apenas","sr.","faz","vocês","ninguém","trabalho","outra","espera","saber","comigo","vão","dinheiro","aí","podemos","pouco","essa","esse","grande","pois","pela","qualquer","disso","num","qual","desculpa","dela","hoje","toda","deve","mulher","queria","fora","filho","cá","seja","meus","nosso","olha","vá","daqui","sério","oh","nossa","certeza","diz","nome","às","outro","todo","dar","tentar","sair","têm","quanto","pensar","mal","volta","aconteceu","consigo","três","mundo","menos","amigo","contigo","embora","numa","passa","porquê","problema","carro","lado","vezes","nas","fez","seus","novo","merda","parte","todas","aos","obrigada","primeiro","será","lugar","voltar","pensei","algum","achas","vem","dentro","família","ali","razão","aquele","dias","fui","anda","querida","sabia","duas","ideia","hora","si","polícia","podem","forma","entre","caso","gosto","atrás","homens","devia","aquilo","amor","pessoa","ok","podia","uns","desde","somos","cabeça","horas","deles","fica","ajudar","tarde","momento","tal","tenha","pronto","fiz","foram","ia","cidade","amigos","encontrar","frente","sido","passar","deixar","vi","nenhum","gente","durante","seria","outros","entrar","chegar","nova","trabalhar","quase","desculpe","amanhã","tanto","fosse","história","irmão","cima","contra","morrer","maneira","suas","enquanto","alguns","ajuda","precisa","morto","primeira","porta","minhas","medo","morte","aquela","óptimo","caminho","vir","feliz","sinto","minutos","ouvir","desta","tive","neste","matar","cada","estes","acontecer","espero","ano","rapaz","for","causa","feito","sorte","lamento","filha","acha","teus","levar","conta","estas","arma","pessoal","quarto","olhos","senhora","adeus","cara","disto","algumas","juntos","difícil","última","única","manhã","poder","mãos","ei","água","começar","faço","perto","cuidado","sangue","nossos","semana","mesma","usar","significa","acredito","querem","cinco","acabou","problemas","corpo","altura","disseste","nisso","chefe","jogo","guerra","fala","procura","dr.","sabemos","fizeste","ouve","realmente","terra","havia","ontem","umas","deixa-me","dólares","comer","dormir","dá","escola","logo","querido","sabem","fim","deste","eram","pára","agente","equipa","rapariga","marido","calma","coração","segurança","viver","estado","parar","teve","segundo","muitas","quatro","mão","baixo","maior","meio","meses","mau","vê","ouvi","andar","rápido","número","vejo","mulheres","morreu","nenhuma","acordo","festa","fazes","capitão","raio","pais","poderia","sra.","crianças","estavam","força","muitos","nesta","buscar","filhos","perder","esperar","viu","irmã","chega","possível","devias","sai","acabar","rapazes","precisas","elas","contar","idiota","olhar","vossa","teria","foste","estavas","pena","mil","longe","faça","penso","tivesse","tuas","pedir","estranho","importa","fácil","muita","veio","brincar","bebé","plano","devo","prazer","velho","conseguir","passado","tomar","além","jantar","dá-me","depressa","pergunta","tirar","pequeno","descobrir","sala","ah","telefone","trás","seis","culpa","vos","possa","deixa","errado","vivo","menina","john","casamento","outras","espere","pensa","jack","nossas","correr","mudar","diga","paz","sentir","cama","gostava","sozinho","pelos","comida","sequer","falta","ficou","conheço","gosta","passou","bastante","deu","palavra","demasiado","diferente","essas","armas","digo","licença","demais","pagar","médico","seguir","semanas","consegues","dizem","matou","único","acreditar","local","fazem","pior","próprio","continua","vosso","consegue","fico","diz-me","país","gostaria","forte","partir","prisão","próxima","especial","esteja","livro","viste","rei","chegou","esses","continuar","resto","ar","estive","hospital","sítio","fazê-lo","raios","ligar","porra","minuto","irá","sentido","atenção","vim","quis","sam","queremos","direito","café","venha","visto","criança","luz","filme","música","portanto","haver","esteve","aqueles","pôr","querer","sexo","fogo","connosco","beber","toma","mr","houve","tratar","pequena","ganhar","ponto","milhões","manter","precisar","rua","olhe","pé","fazemos","encontrei","miúda","existe","arranjar","dez","último","assassino","miúdo","tinhas","estávamos","cedo","vês","boca","boas","acontece","jovem","preocupes","comprar","situação","esposa","sistema","devem","jogar","natal","capaz","certa","michael","amiga","seguro","questão","relação","perguntas","encontro","sob","cão","quiseres","negócio","quiser","nisto","sinal","linda","facto","mensagem","próximo","apanhar","adoro","crime","banho","própria","deves","grandes","chamada","novamente","futuro","começou","perguntar","notícias","acabei","fique","ambos","lhes","chamar","entendo","cabelo","entra","grupo","doutor","salvar","livre","viagem","vontade","sozinha","conversa","tipos","fugir","palavras","consegui","tinham","devíamos","lista","gostas","lutar","peço","final","procurar","deixou","alto","interessa","bonito","chão","campo","perfeito","tio","estiver","pelas","dito","respeito","deveria","vista","charlie","breve","melhores","bonita","normal","devemos","fiquei","mortos","faria","tom","mesa","preso","simples","iria","fixe","emprego","achei","faças","chama","linha","dizes","real","nave","assunto","vale","cala-te","ataque","pensava","frank","ai","graças","escolha","ordem","viva","fundo","terá","doente","acidente","má","the","modo","provas","resposta","bocado","papá","avião","deixe-me","vindo","após","erro","acredita","miúdos","jesus","idade","fizeram","pare","morta","leva","percebo","saiu","pensas","advogado","conhece","espaço","estivesse","fazia","serviço","missão","ler","louco","bons","conhecer","nele","lindo","abrir","mente","mike","perceber","amo-te","programa","veja","sol","fomos","caixa","sete","senhores","hotel","nessa","gostar","incrível","puta","amo","vai-te","david","dor","joe","dessa","presente","carta","governo","barco","loja","energia","pra","vítima","roupa","voz","trouxe","luta","câmara","disse-me","fome","professor","estúpido","mamã","mostrar","hipótese","telemóvel","reunião","prova","percebi","casar","general","peter","volto","trazer","olho","chamado","conseguiu","exército","através","lei","digas","banco","naquela","deixe","nesse","disseram","segunda","tempos","podias","tocar","mês","tiro","fbi","soube","tenhas","quantos","creio","george","papel","sonho","ver-te","desse","tínhamos","bar","povo","tentei","eras","fizemos","cena","tenente","centro","tivemos","conversar","teres","nao","vê-lo","proteger","diabo","parabéns","bebida","aposto","base","tradução","sinto-me","esperem","excelente","voltou","namorada","precisam","sabias","empresa","resolver","metade","lembro","acerca","segundos","cair","engraçado","bela","mentir","costas","chave","divertido","ouviste","juro","escrever","piada","oito","levou","passada","guarda","controlo","daí","segredo","decisão","funciona","posição","surpresa","parecia","cerca","céu","negócios","cabo","receber","motivo","olhem","vidas","passo","tribunal","max","contacto","começa","ora","ótimo","bolas","trabalha","tenham","inferno","estrada","delas","falei","diria","cheio","companhia","ouça","sejas","horrível","escuta","saída","ordens","namorado","norte","explicar","aprender","senhoras","fazendo","encontrou","quente","querias","esquece","prometo","saia","padre","detective","ouro","perigo","perdi","falou","coronel","alma","naquele","vestido","últimos","planeta","máquina","raparigas","pés","maioria","tiver","debaixo","pronta","parecer","velha","esquerda","avó","näo","confiar","destino","contente","pudesse","frio","vejam","lidar","regras","homicídio","precisava","james","aonde","gajo","vêm","igreja","conheces","alex","funcionar","sul","abre","vossos","carne","tenta","quantas","vender","sente-se","abaixo","desculpem","direita","liberdade","cavalo","droga","área","destes","parem","quais","triste","bomba","espécie","cérebro","venham","podíamos","tanta","vive","henry","estaria","belo","esquecer","contrário","cerveja","diferença","animais","humano","branco","honra","mandar","tentou","lembro-me","esperança","iorque","sente","falo","acaso","saúde","trata","estará","perigoso","entendido","drogas","paul","pareces","conheci","ideias","público","irei","teste","acham","ben","bola","acaba","aquelas","cliente","roubar","mar","dançar","suspeito","passei","senta-te","suposto","miss","risco","bater","entender","tiveste","nível","rainha","aceitar","clube","pobre","dizer-me","américa","mestre","conselho","perdeu","serão","apesar","parece-me","disse-te","jimmy","alvo","aparecer","entrada","saiam","janela","dúvida","danny","preocupe","estiveste","nick","realidade","mary","poderá","código","zona","prontos","longo","propósito","entrou","provar","avô","ligação","meia","dizer-te","basta","seguinte","menino","chama-se","esconder","criar","afinal","colocar","ias","dê","calhar","dei","loucura","disse-lhe","termos","destas","sargento","vossas","foto","diga-me","humanos","tira","meninas","verificar","terrível","monte","dar-lhe","pedido","ficas","sarah","chorar","céus","sejam","contas","ouviu","usa","sentes","vós","parecem","exemplo","rio","liga","jeito","põe","oficial","odeio","início","enorme","televisão","suponho","socorro","dados","irmãos","repente","percebes","segura","acima","pediu","foda-se","esperava","almoço","xerife","cartão","estarei","planos","cozinha","dizer-lhe","ray","metros","negro","deixei","operação","preço","pele","existem","diabos","principal","justo","chá","vinho","lixo","mudou","novos","relatório","dra.","alta","par","perdido","agentes","dado","imenso","nomes","defesa","comando","tia","bill","dizia","fotos","ilha","subir","farei","opinião","tony","terminar","acesso","fato","braço","saco","lembrar","desejo","correu","senão","pá","série","nela","jim","comboio","roupas","cabra","junto","sonhos","pernas","ido","pedi","discutir","livros","saiba","falamos","saudades","harry","rádio","destruir","traz","silêncio","peça","bob","senti","escolher","carros","maldito","cheia","limpar","ama","caramba","nove","ficam","novas","carrinha","trato","evitar","seres","pista","verão","direcção","soldados","dessas","errada","justiça","costumava","mala","foder","leve","daquela","memória","rabo","azul","calças","graça","tommy","façam","hey","comum","confiança","vens","estação","vídeo","pressão","sapatos","inimigo","ligou","preparar","diz-lhe","ocupado","duro","várias","deviam","sendo","cartas","espírito","igual","prestes","paris","corre","inteiro","branca","gelo","maluco","bem-vindo","cheguei","apareceu","cuidar","vi.","daquele","magia","processo","dentes","porcaria","copo","noites","vermelho","responder","volte","apoio","parque","paciente","quão","tornar","conseguia","andas","viram","arte","jake","visita","buraco","cantar","sucesso","pegar","queira","la","ajudá-lo","conduzir","parede","cheiro","herói","inglês","devagar","troca","batalha","steve","ryan","bala","mentira","férias","toca","americano","coragem","vergonha","caiu","longa","estrela","animal","achar","teremos","acção","tido","juiz","perna","som","desculpas","edifício","vieste","aulas","médicos","will","clientes","enviar","terem","pescoço","lua","fiquem","casaco","monstro","vimos","chaves","gostei","começo","irão","falando","parceiro","ajuda-me","imaginar","recuperar","estranha","simpático","valor","cor","histórias","serei","devido","terei","londres","soldado","ajudar-te","puder","falas","filmes","richard","serem","fale","vê-la","doce","dê-me","vítimas","natureza","vieram","johnny","miúdas","andado","chamo-me","líder","desses","billy","haverá","excepto","máximo","inocente","prefiro","autocarro","más","gabinete","faca","matei","grávida","desistir","fé","salvo","tamanho","voar","carreira","limpo","velhos","porreiro","gostam","árvore","preparado","demorar","possamos","milhares","disparar","distância","conseguem","antigo","brilhante","dança","chamas","pedra","pensam","faculdade","imagem","majestade","serve","caralho","flores","malta","conhecido","comecei","doença","nariz","cortar","estados","polícias","óptima","pontos","preto","éramos","cadeira","peixe","gozar","partido","daniel","bobby","voo","louca","recebi","casas","jovens","visão","jane","dar-te","controlar","felizes","fechar","km","unidos","deixes","queiras","gritar","brian","jogos","gato","cães","li","canção","lugares","corrida","mark","deixado","central","notícia","perdão","chris","come","vários","interior","hei","estilo","acabado","barulho","vás","robert","estrelas","ameaça","dar-me","movimento","fará","scott","eric","tantas","correcto","ligado","clark","vemo-nos","poderes","relógio","entanto","unidade","braços","marca","regressar","baixa","andava","números","forças","verde","pega","floresta","total","ponte","confusão","director","maria","culpado","praia","tv","casos","acreditas","tiveram","língua","descansar","presa","lee","meter","matá-lo","oi","construir","perdemos","sinais","banda","kate","descobri","perfeita","ficará","ficamos","cabrão","busca","ouvido","receio","cristo","atirar","fingir","respirar","rosto","ridículo","mudança","época","nacional","corpos","fonte","dou","major","ando","pense","navio","soubesse","faz-me","escapar","cavalos","eua","cansado","aula","rico","íamos","acordar","charles","fugiu","preocupar","humana","tivesses","beleza","atrasado","portas","agir","dedos","rir","walter","dono","kevin","posto","morre","nervoso","bordo","mandou","depende","magoar","entregar","agradável","eddie","princesa","calor","vou-me","gay","óbvio","colega","pensou","jornal","interesse","combate","atacar","decidir","anel","pago","esperto","inteira","idiotas","estejas","espada","iremos","sentado","luzes","indo","descer","classe","casado","agradeço","podiam","estúpida","aberta","caro","leite","mercado","política","lisa","milhão","género","oferta","entendes","tome","teoria","escuro","ruas","uh","antiga","tê-lo","cadeia","levantar","crescer","continue","via","ouçam","imprensa","uso","santo","treta","noiva","acorda","ajudar-me","dan","claire","servir","pequenos","venho","perda","descobriu","resultado","militar","emily","manda","disser","material","matt","camião","feita","rede","príncipe","concordo","momentos","martin","fantasma","segredos","confia","solução","ouvidos","beijo","impedir","data","jerry","andam","morreram","conhecia","garrafa","dum","orgulho","fizer","bolo","maiores","policia","fuga","sensação","iam","peito","futebol","vinte","terceiro","levá-lo","bilhete","acabaste","cinema","vento","rachel","voltei","jason","táxi","registos","boleia","quinta","matar-me","chapéu","dedo","mano","mexer","deu-me","legal","vingança","dever","exacto","ajude","porco","dá-lhe","doido","pete","raiva","sê","peso","lembra-te","treino","algures","natural","foi-se","estudar","partida","esqueça","maldição","oeste","inimigos","viemos","controle","corte","amy","meninos","sir","tantos","queriam","entende","acalma-te","apanhado","toque","chegaram","baile","aeroporto","poucos","aparece","mostra","ouve-me","pude","convosco","tente","roubou","fosses","terás","decidi","lixar","serviços","universo","frança","bocadinho","daqueles","próprios","don","al","sacana","respostas","thomas","agradecer","chuck","morada","mapa","contou","internet","efeito","bebe","aconteça","notas","super","patrão","importo","ouvir-me","corredor","ficaria","visitar","ás","aguentar","dera","adn","aldeia","razões","guardas","testes","cirurgia","aberto","médica","merece","contrato","vivos","ter-te","gás","sociedade","mata","lar","direitos","instante","leste","usado","mantém","original","zangado","vinha","adam","familiar","parecido","imagino","larga","estejam","pede","haja","luke","pressa","ferido","passaram","treinador","voltas","cia","cu","chamadas","quisesse","duma","crédito","desligar","costa","projecto","dão","escreveu","câmaras","cancro","afasta-te","obter","primo","credo","próximos","carter","andando","encontra","deixá-lo","fossem","objectivo","partes","pedaço","assuntos","jardim","opção","sexual","reino","deixem-me","diante","grave","aspecto","membros","lago","lembra-se","fumar","mrs.","deixem","hipóteses","crer","ovos","usou","presença","tornou-se","melhorar","imagens","vitória","pesquisa","cheira","centenas","anna","pertence","abra","membro","camisa","amigas","ficaram","viajar","explosão","presos","vemos","entendi","giro","útil","maldita","leo","massa","sofrer","fortes","jamais","andy","dave","lembra","falso","loucos","vencer","paga","neve","protecção","adorava","aviso","escrito","simon","admitir","los","annie","negra","kyle","deuses","últimas","carl","assalto","alerta","sábado","pensaste","bairro","roma","famílias","completo","fiques","acredite","maus","dizendo","chicago","enganado","esquadra","saí","farto","ted","vazio","fazer-te","resultar","locais","eis","percebe","avançar","tentando","funeral","bebidas","ossos","pequenas","enfrentar","quieto","discurso","liceu","chocolate","compras","houver","tentativa","prédio","serás","caça","tretas","voce","saltar","bolsa","génio","primeiros","terceira","ganhou","colegas","kelly","crimes","ed","começaram","merdas","mesmos","caraças","explodir","amar","erros","muda","entrem","aprendi","violência","envolvido","condições","ponha","relações","chamam","sean","guardar","montanha","fraco","mensagens","méxico","emma","vêem","registo","penses","modelo","topo","william","prémio","vou-te","anjo","duvido","confio","chuva","bêbado","abby","venda","deixaste","vejo-te","ladrão","ciência","fizesse","pensado","irmos","deitar","pão","balas","york","cofre","torna","pânico","recebeu","detalhes","social","ficado","casal","phil","mandado","falaste","ganha","resta","perdeste","orgulhoso","aguenta","fecha","saibas","pôs","passe","arriscar","incluindo","estiveres","digo-te","quiserem","possas","exame","faremos","sarilhos","estares","deram","castelo","lavar","disposto","limpa","custa","perguntei","zero","terão","digamos","impressão","piloto","princípio","larry","vírus","passeio","alice","peças","dói","idéia","mundial","intenção","curso","domingo","continuo","entrei","avisar","acabaram","mataste","golpe","dean","jackson","decidiu","nota","europa","armadilha","marcas","cansada","trabalhos","falam","susan","detesto","karen","lucy","morrido","árvores","queijo","truque","tendo","estaremos","roubo","juntar","alan","francês","ires","legendas","ajudá-la","dura","imbecil","sozinhos","rápida","segue","new","honesto","tirou","arthur","mentiras","angeles","sede","torre","artigo","pacientes","palco","gelado","maggie","sabiam","quadro","mataram","cem","extra","carga","tento","comprei","caras","liguei","lição","chance","fila","vestir","levado","escondido","parvo","sara","garota","voltamos","superior","geral","prender","pensamos","ocupada","grace","piscina","oferecer","federal","fronteira","óculos","ensinar","ferida","trocar","joey","maluca","mexam-se","inútil","s.","escadas","jenny","esqueças","garantir","diversão","assinar","jesse","armário","privado","adorar","deixa-o","deserto","esperamos","barry","ficava","daquilo","incêndio","acabámos","voltem","cumprir","agência","fábrica","poderoso","partilhar","of","regra","mentiroso","achou","suicídio","malas","dou-te","corda","levá-la","menor","tire","choque","lois","especiais","aceito","virar","you","tá","álcool","vires","fase","adivinhar","partiu","lily","carteira","vegas","telefonar","louis","famoso","bilhetes","antigos","fores","digitais","juntas","atender","dores","rock","passagem","gordo","possam","pensando","cura","demónio","madame","responde","deseja","revisão","sentar","lixe","roubado","bolso","chegue","vermelha","fazer-me","esquisito","talento","formas","uau","ouviram","telhado","proposta","parou","campanha","tiros","iguais","josh","city","secreto","levaram","página","fechado","srta","conhecem","século","discussão","noutro","contei","taylor","morgan","and","ferro","to","nasceu","ambas","motor","senador","chegámos","chateado","humor","nojento","jones","artista","enviou","falámos","bebés","difíceis","tiveres","mínimo","amas","urso","danos","estivemos","terreno","vivem","dorme","red","terminou","permitir","chamou","canto","acabou-se","completa","canal","van","haveria","certas","quartos","levo","bruxa","vejamos","directo","sofá","episódio","solo","perante","irmãs","festas","apanhou","bando","levar-te","julia","regresso","convidado","disco","alegria","ilegal","rose","parado","hank","roger","amizade","presentes","chame","kim","coma","permissão","lados","criminoso","smith","correio","gigante","robin","adora","começamos","consiga","acordado","ligue","carregar","estragar","victor","pesadelo","defender","ena","queda","der","clara","alarme","pó","santa","milagre","cheque","alemães","jornais","teatro","explica","zangada","entrega","período","estômago","provável","estranhos","adorável","ficaste","china","cela","americana","moda","enganar","madeira","garganta","fá-lo","jeff","acusação","planear","brancos","continuas","matar-te","ambiente","chegaste","calmo","bravo","eh","soa","chloe","garagem","assustado","libertar","montanhas","adoro-te","cave","advogados","aumentar","dava","aposta","casada","reserva","erva","retirar","negros","cala","somente","fazeres","promessa","gasolina","patrick","ouço","jackie","gary","ganhei","versão","sorriso","relaxa","campeão","street","causar","gentil","big","rick","seguros","comprou","fales","inverno","vizinhos","tivessem","procuro","achava","bate","saímos","texas","diário","digam","apanha","divisão","daquelas","julie","júri","operações","tomates","ajudou","espelho","fumo","limites","dás","chegamos","rosa","dom","padrão","acções","oliver","secreta","irás","ver-me","tenhamos","garoto","dúvidas","revista","apanhei","elevador","queríamos","tesouro","rato","st","imagina","ter-me","amante","pediu-me","vantagem","obra","cometer","escute","marinha","virá","crise","corrente","pedras","veneno","paciência","funcionou","deixo","feitos","livres","atitude","achamos","aceita","respira","howard","laura","confirmar","memórias","estiveram","empregada","deixar-me","sexy","presumo","fechada","arranja","combinado","demora","ligo","decisões","bicicleta","vidro","fez-me","selvagem","limite","sitio","estarão","saudável","atirador","percebeu","macaco","convencer","tornou","educação","judeus","tropas","tratado","repetir","liga-me","apostar","conto","turno","criatura","confuso","vendo","medida","vi-o","cozinhar","joelhos","usam","próprias","nação","saído","calado","fazer-lhe","medicina","continuem","tim","paredes","francisco","tomei","armazém","mandei","atraso","amava","divórcio","fortuna","deixaram","saio","simpática","estudo","papéis","forem","ricos","amanda","escuridão","nathan","maneiras","perguntou","áfrica","preferia","vaca","sombra","nadar","toques","rebecca","pobres","bombas","postos","motivos","cadáver","falado","falha","traseiras","veremos","faltam","passos","cópia","mel","queixa","chamo","leis","tomou","jogador","botão","batatas","criado","nascer","deixar-te","lucas","ministro","alcance","doces","conheceu","tornar-se","almoçar","linhas","reputação","esforço","carlos","sono","mexas","oceano","assumir","fita","estúdio","nervosa","treinar","temo","compra","motorista","fred","mora","deixam","acabamos","san","sr","areia","tolo","esperando","fundos","trouxeste","poucas","acreditam","alunos","gostou","devolver","desafio","park","sangrar","factos","ciúmes","bateu","noutra","recursos","clínica","miami","segurar","aguento","cooper","voltaste","fã","sós","vincent","sessão","ponta","andrew","paixão","abram","capazes","alimentar","ganho","empregado","ross","elizabeth","alemão","acusações","mortes","jogada","criou","assustada","açúcar","mamas","stan","larga-me","marcar","lobo","tê-la","seremos","pássaro","caixas","máscara","harvey","falava","senhorita","greg","ajudem-me","continuam","pegue","despedida","caçar","johnson","abandonar","terras","contaste","russos","preparada","champanhe","opções","cabeças","russo","bruce","lembras","doentes","bem-vinda","esquecido","escolheu","sobretudo","charlotte","inocentes","máquinas","vivemos","dívida","mistério","tirei","portão","traga","ficares","sentia","chegarmos","qualidade","percebido","alemanha","gajos","noivo","frota","tyler","seca","feitiço","atingido","usando","pausa","trabalhou","preocupa","tarefa","donna","molly","cole","sopa","abrigo","análise","afastar","anterior","cigarro","dissesse","enfim","ritmo","maravilha","piores","sistemas","hitler","ripadas","puto","pt-subs","diga-lhe","pagou","pulso","física","derek","veículo","mesmas","sujo","ódio","pagamento","escrevi","ouvimos","katie","trabalhas","king","visitas","roy","negociar","sugiro","cruel","wilson","exterior","deixas","anúncio","fio","nestes","arranjou","montar","passam","exames","normais","virem","pizza","comissão","adivinha","prato","atrasada","sally","engano","evento","esqueci","nestas","trabalhei","pareceu","chato","esquina","papai","palhaço","recebemos","amostra","cego","osso","sermos","passamos","sujeito","ataques","marcus","limpeza","produção","sobe","museu","atende","perdida","folga","rezar","levei","parker","índia","homer","raça","corta","fria","terry","lábios","lady","porto","mágico","chegado","partam","sabíamos","militares","deva","pus","civil","filmar","gerente","onda","salvou","sentem-se","curioso","montes","brown","aliança","dragão","cidades","castigo","deixá-la","secção","adoraria","ficarei","gira","desastre","ficheiros","arder","galinha","mexe-te","palácio","paraíso","despedido","divertir","jay","poderiam","popular","huh","colocou","resgate","acto","passa-se","maricas","voltarei","barriga","helen","acusado","negativo","metro","molho","pareço","aliás","cobertura","chateada","digo-lhe","frango","conjunto","lançar","império","convite","falhar","gravação","concerto","el","mina","oficiais","campos","terapia","glória","pacote","privada","sal","vampiros","prometi","nate","cargo","vencedor","tentado","audiência","jamie","doutora","terias","e-mail","doida","mac","botas","fantasmas","neles","pessoais","metal","mudanças","suspeitos","fizeres","cenas","show","rota","prenda","pedaços","jordan","gibbs","okay","sumo","feio","favorito","estiverem","assistir","adaptação","pistola","bonitas","firme","condição","responda","doug","olhes","janelas","seguida","las","mudei","randy","solta","febre","violação","libras","buscá-lo","foge","cruz","graus","desliga","virgem","cobra","infância","sabendo","adultos","exercício","teriam","matado","pistas","duplo","vila","mental","justin","daria","lorde","miller","túnel","trabalham","casados","fresco","unidades","refeição","bart","pública","beijar","yeah","espacial","concurso","houvesse","andei","produto","acabo","incidente","lenda","sócio","templo","poderei","começam","comece","localizar","cento","péssimo","davis","heroína","passámos","nuclear","atraente","papa","lata","traidor","naves","jess","venhas","gordon","falsa","bailey","bruxas","romântico","gostamos","cuecas","cardíaco","teríamos","lágrimas","reais","olivia","livrar","feitas","jessica","cinto","seriam","estarmos","carol","vivia","sincero","criaturas","ratos","terminado","quebrar","costume","boston","toby","expressão","perigosa","importas","asas","sexta","ombro","origem","ansioso","frankie","trânsito","morrem","hollywood","tinta","velhote","passava","vê-los","incomodar","elena","ha","filhas","tensão","lealdade","judeu","capitã","lê","turma","ethan","bíblia","sorrir","cabana","farta","queimar","imperador","milhas","primavera","mamãe","beth","rússia","moeda","diamantes","wayne","aceite","vizinho","paragem","mostra-me","mães","traseiro","esquerdo","metido","pura","combater","celebrar","trinta","enviado","impostos","camisola","gostavas","reparar","comercial","largar","golfe","condenado","levem","casey","escreve","sonhar","monstros","moral","votos","união","região","gastar","prazo","resolvido","conta-me","armado","aviões","mortal","voto","descobre","recolher","cale-se","passear","pares","marshall","odeia","romance","jeremy","custódia","porém","contactar","temporada","espião","dylan","contou-me","inspector","desporto","endereço","cai","arquivos","observar","média","escolhe","traição","walker","steven","depósito","resultou","questões","peixes","almas","colar","ladrões","anne","tentaram","encontre","cartões","infeliz","vigiar","barba","permite","trata-se","pila","poderemos","hum","acalmar","certos","ajude-me","estarem","juízo","deixou-me","owen","cultura","perde","tivermos","fantasia","eva","entendeu","dada","brinde","chinês","pesado","reforços","catherine","pegou","apagar","corajoso","chegada","hei-de","abriu","azar","título","sincronia","empresas","posse","impacto","ian","riscos","passaste","vistos","levam","perfil","estranhas","policial","detetive","ondas","suspeita","recado","bancos","souber","recebe","capital","prata","caos","positivo","urgente","comi","dispara","plantas","emoções","ficheiro","frase","west","salão","efeitos","analisar","engraçada","aventura","direção","besta","marco","puro","dou-lhe","carrie","dei-lhe","salto","pediste","face","mexa","michelle","burro","equipas","nasci","ideal","ligo-te","círculo","multidão","sentada","mo","lou","usei","sentir-se","rasto","iniciar","marty","imaginei","reacção","mortas","reféns","chffffff","saíram","fazerem","uísque","andou","podermos","existir","bateria","hannah","pénis","doze","vince","costuma","orgulhosa","águas","booth","salva","disparate","jacob","vampiro","disparou","malditos","mantenha","escolhido","pau","voltará","foda","demónios","rica","geração","usava","gatos","dick","revolução","deverias","morar","óleo","dar-nos","matá-la","gravar","brad","desejar","farias","comeu","angela","dizeres","desejos","joga","chegam","russell","aaron","estudante","ma","primeiras","sofreu","guerreiro","mate","secretos","uniforme","novidades","ellen","pássaros","sentes-te","pouca","plástico","sammy","séculos","despedir","rodas","basebol","deixa-te","decente","alô","coroa","beco","repito","cerimónia","house","atirou","coelho","afaste-se","petróleo","pecado","nancy","nobre","tragam","grant","satélite","oxigénio","levas","deixa-a","cores","julgar","vira","acordei","familia","formos","aérea","imensa","capa","invasão","pôde","nina","cigarros","faziam","potencial","confissão","esperei","mete","sensível","viagens","puxar","linguagem","figura","cavaleiro","redor","dês","vai-se","quilos","edward","heróis","altamente","caminhar","criada","baixar","prima","caridade","cidadãos","guia","curto","damos","rips","dali","vazia","testar","apontar","recente","apostas","piadas","logan","in","saibam","portal","atingir","intervalo","poderosa","disfarce","matthew","voltaram","poderias","manteiga","atira","exposição","ginásio","mentiu","abençoe","andamos","flor","shane","tiroteio","lembre-se","jennifer","betty","levanta","pedimos","copos","miles","acontecem","quinn","setembro","sítios","estudos","todd","patrulha","jóias","detrás","hein","voltares","condutor","renda","doc","salário","stephen","goste","parto","ovo","pergunte","black","mentes","vomitar","entregue","olhadela","tradição","lincoln","pensem","países","noção","deter","paige","phoebe","técnica","caroline","anjos","resistir","coloca","tema","harold","albert","boneca","culpar","vão-se","abertos","perseguir","trazido","cocaína","grupos","egoísta","dormi","relaxar","reparei","leonard","profundo","dizemos","sabor","abraço","joseph","dizer-nos","bloco","contado","população","cassete","tragédia","bonnie","cometeu","cientista","religião","corações","marie","destruído","civis","planeado","caneta","liam","sobrinho","dama","sagrado","meias","connor","durar","deixares","bandeira","mudaram","falhado","japão","mereces","contudo","feira","direi","itália","adulto","recebido","arquivo","imediato","pastor","apanhá-lo","dêem","cancelar","arranjei","tomo","espantoso","raymond","diz-lhes","genial","earl","sugerir","asneira","níveis","delicioso","reuniões","tchau","restos","produtos","mason","penny","símbolo","voltes","tecido","piorar","estupidez","cobrir","dennis","gatilho","esperas","horário","piano","cerebral","ocorreu","leva-me","lex","selva","academia","luxo","pasta","apoiar","pudesses","nojo","motel","mato","sexuais","furioso","escravos","próximas","tentamos","alteza","sois","atacou","descanso","keith","esperta","decidimos","hã","feridas","doer","pintar","reunir","fraude","olhada","cometi","baseado","perderam","aparelho","agenda","saberia","duche","firma","tina","índios","dá-nos","ricky","bens","conversas","sentiu","recusar","tentaste","assustar","barato","acertar","conselhos","jogadores","perdoar","unhas","rumores","use","escritor","sophie","tubo","conhecida","únicos","espanhol","teddy","fãs","lama","usada","sentimos","feia","nu","respondeu","informar","concordar","praticar","dose","willie","atrasados","passas","vives","poderão","terror","novidade","hércules","contratar","daisy","escrita","entraram","confessar","irem","gostaste","dizê-lo","torna-se","esqueçam","luvas","cheirar","voltado","conte","b.","esperam","iriam","aumento","letra","sacos","julian","convidar","adoram","folha","formação","argumento","congresso","preferido","indústria","travis","trago","tatuagem","termina","apetece","ação","equipe","franceses","lance","inventar","rumo","adorei","lana","possíveis","ramo","cemitério","hill","diana","tanque","bebê","dúzia","devesse","solteiro","tiverem","stress","caçador","poço","sejamos","vi-te","mudado","protocolo","federais","puxa","repara","spencer","anormal","amostras","tirem","amável","deixamos","espíritos","curar","largue","white","decidido","barney","ótima","aparência","chamava","mickey","castle","salta","absoluta","escapou","julho","monsieur","curta","cobarde","progresso","radiação","altos","dólar","pecados","saberá","anthony","presta","usá-lo","receita","arranjo","jonathan","pareça","sentem","reverendo","ficarmos","mereço","deverá","chegarem","ensaio","salada","começámos","riley","prometeu","menti","cachorro","macacos","condução","dás-me","margaret","escada","levar-me","chamar-me","organizar","barcos","desce","it","luto","encontros","actor","olhei","roda","malcolm","olhou","ignorar","dona","vier","sairmos","lewis","sombras","contar-te","aço","solar","façamos","ana","tocou","puderes","acalme-se","leitura","eliminar","maya","sydney","estrutura","canções","williams","palpite","espanha","alcançar","células","chamamos","azuis","advogada","italiano","tais","sentir-me","culpada","adiante","truques","contar-me","conde","letras","perdidos","termo","circo","munições","gloria","favorita","contactos","usamos","tirá-lo","separar","trono","blake","excitante","gabriel","conduz","fígado","almirante","martha","kent","leão","político","ficámos","ficarem","ihe","escolhas","mínima","kenny","zoe","namorar","vozes","bebo","chip","função","suportar","olhando","visual","pintura","desenho","megan","acordada","páginas","meios","liz","selvagens","alfa","sais","nua","rapto","porcos","quaisquer","põe-te","ligações","cuida","causou","miserável","diretor","fazermos","buracos","dividir","cuidados","gado","cheios","saíste","pulmões","acabe","nora","eventos","doenças","complexo","holly","buscá-la","monk","pagam","quiseste","morra","solitário","infantil","pedir-lhe","dobro","acabam","velhas","gravata","valer","sinta","funcionam","ensinou","bastardo","servem","mostrou","elliot","agarra","escolhi","amarelo","agarrar","saem","lindas","simpson","demos","rotina","quarta","berlim","revelar","traduzido","horríveis","laranja","beira","cinzas","falhou","parecida","péssima","ameaças","norman","grátis","crânio","folhas","escala","archie","economia","importar","motores","intenções","mande","deveriam","audição","tapete","arrancar","mitch","senti-me","incomoda","velas","percebem","prática","ficasse","gravidade","mando","consulta","seth","recepção","lobos","esperemos","matéria","verá","descrição","àquele","estúpidos","site","piper","francis","coluna","chamem","ocasião","moedas","inveja","feridos","criminal","enterrado","remédio","estais","cêntimos","esquadrão","acreditei","assassina","banheira","instinto","jean","admito","casino","mudam","samantha","gus","sentados","tigre","bandidos","natalie","estarás","ouves","explorar","encher","estelar","sandy","quinze","estarias","lojas","comunicar","arrumar","clay","ténis","cria","preocupem","victoria","magoado","nelson","lixado","actual","neil","pratos","fraca","alvos","sensores","álibi","aceitou","antigas","máxima","pô-lo","abertura","séria","habitual","torres","pensámos","cenário","canta","walt","ganhaste","ned","global","matar-nos","lógica","digital","sensual","divertida","papelada","andaste","gorda","harper","tarte","christine","mágica","peguei","derrotar","ron","contagem","cresci","química","eleições","rever","rebeldes","bestial","correto","razoável","pesca","ira","sandes","elegante","autópsia","absurdo","negar","ficha","conosco","paguei","voltarmos","chamei","medidas","angel","edith","pt-pt","lane","ponham","marge","man","bombeiros","república","caixão","deixarei","nicole","naquilo","distante","há-de","orelhas","líderes","deu-lhe","cresceu","sintomas","vestígios","fontes","ofensa","parvalhão","cretino","mitchell","dormiste","pergunto","roubei","seguido","médio","metas","traz-me","escolas","oiça","prefere","visse","saias","eli","apuros","entramos","murphy","disparem","green","nuvens","ámen","despachar","wendy","pedro","políticos","envolvida","mochila","doidos","meio-dia","cameron","gritos","profissão","festival","indica","meteu","irias","siga","álbum","gina","stone","vendedor","viúva","vais-te","fatos","vende","parceiros","camarada","informado","realizar","êxito","griffin","maio","trouxe-te","agressão","peru","saíres","patético","telefones","fizermos","dissemos","famosa","mantenham","verifica","honesta","procuram","tirar-te","tracy","custo","capítulo","evan","esquema","estável","perímetro","calar","disposta","detenção","tortura","viesse","aproximar","pretende","viveu","separados","interna","mexe","solteira","stanley","físico","césar","mistura","pudeste","meg","marte","ruim","controla","deixaria","iraque","telefonou","stark","armados","heather","emoção","guiar","carla","diego","pode-se","corram","deitado","criação","contratou","parada","barbara","violento","colecção","leu","chover","serena","juventude","achaste","online","mencionou","escutem","histórico","vigia","apanharam","sapato","objetivo","fechados","quieta","deixá-los","abril","damon","raro","miguel","ligaste","brooke","perdoa-me","leves","recebo","recorde","namorados","decide","coloque","tristeza","ocupados","aprendeu","sentença","soubeste","suja","ingleses","pedir-te","little","cirurgião","palerma","mudaste","ronnie","vestida","navios","ashley","enormes","quero-te","condado","amado","maçã","admira","objecto","outubro","harris","nascido","resulta","sebastian","flash","embaixada","prestar","desenhos","conclusão","procuras","ralph","aterrar","tenda","florida","dana","rocha","falaram","milho","confie","junho","kong","dando","tara","baby","bêbedo","bo","manhattan","sentar-se","votar","graves","meta","surgiu","falsas","mato-te","refém","processar","mantê-lo","mover","amanhecer","vá-se","soubesses","cujo","vendas","comem","perdoe-me","precise","vestidos","àquela","farão","comecem","ellie","invisível","placa","dale","ala","superar","confias","juramento","bife","piedade","drama","kit","fraqueza","piso","entro","shaw","pontapé","ford","seco","escondida","valores","blair","acordou","tonto","warren","hábito","envolver","entraste","hall","caçadores","órgãos","importava","faltar","conflito","invadir","confusa","tubarão","lança","aluno","dará","creme","ouvir-te","custar","destruiu","pescar","kg","queiram","emocional","fruta","sociais","suave","calada","tornado","procurado","fazê-la","julguei","desgraça","muro","kitty","poderás","rebentar","mota","tribo","alterar","infecção","bosque","lido","projeto","padrões","ombros","aquecer","francesa","comité","casou","tumor","chineses","entram","protesto","malucos","tirado","ligada","ann","pesada","chatear","lutas","katherine","dieta","curtis","turner","conheça","ritual","hanna","trouxeram","taça","reis","procurei","atacado","pudermos","esqueceu","fazias","brooklyn","túmulo","medicação","vanessa","preferida","voltam","artes","mísseis","queridos","detido","quereria","ja","ligados","ken","dar-lhes","manny","tramar","holmes","vic","planta","neal","merecem","taxa","mna","star","ajudado","adrian","parei","leal","minas","mcgee","ajudá-los","m.","atmosfera","indivíduo","encomenda","tratamos","cidadão","cabelos","gostarias","seattle","ouvi-lo","troco","mundos","sugere","armada","ruth","allen","canadá","karl","sector","philip","prometer","puseste","mira","diziam","meredith","poupar","sobremesa","russa","justa","caído","isabel","von","cadáveres","bonitos","avaliação","monica","corridas","candidato","ninho","gerir","portátil","japoneses","taco","caminhos","leva-o","sabedoria","musical","us","posições","mostram","clássico","enganada","israel","kirk","a.","dente","método","permitido","vendeu","agrada","medalha","roubaram","bishop","jill","situações","execução","d.","consertar","caverna","neto","quentes","lento","ponho","collins","cal","ex","trauma","viria","recuar","cabe","mijar","colégio","atrair","buck","rápidos","alison","obras","reconhece","lâmina","vaga","comemos","grau","conheço-o","so","elementos","promoção","island","cinquenta","garcia","fabuloso","trair","cristal","serias","arruinar","máfia","fiel","afastado","ficando","fiança","códigos","típico","palmer","erradas","durmo","cópias","cadela","lucro","magnífico","aceder","debbie","christian","tirando","revistas","apetite","despesas","matem","virginia","noticias","demorou","orelha","psicopata","escravo","escuta-me","corra","coloquei","veste","músicas","terminei","chegares","tentes","vamo-nos","nessas","exceto","ecrã","derrubar","agosto","concorda","manual","franklin","fáceis","novembro","proibido","martelo","andares","dupla","terríveis","encontram","miranda","galáxia","generoso","vela","fracos","mandou-me","perigosos","cobre","cowboy","trazê-lo","senso","distrito","finais","audrey","usas","apertar","directa","garrafas","chase","aliados","documento","gps","faço-o","técnico","oscar","tendes","apanhados","garotas","vídeos","colocado","tentam","chinesa","arriscado","matam","watson","entendem","britânico","wyatt","cervejas","onze","fi-lo","examinar","bondade","vivi","duke","trevas","aves","esperado","gene","lindos","explodiu","rob","levem-no","naomi","harrison","queimado","empregos","falsos","reforma","perfume","times","sheldon","brinquedo","preta","calem-se","tiraste","agulha","wallace","programas","espalhar","julgo","costumo","joão","feche","operar","dormiu","liderança","biscoitos","pneus","formar","dirigir","donald","cabrões","tecto","correcta","grato","caleb","chego","apelido","janet","insectos","jenna","cola","cortes","franco","moscovo","roubaste","ausência","guitarra","usá-la","mencionar","patty","arroz","estradas","altas","sentiste","veres","descansa","mentirosa","grey","melissa","valeu","craig","tentava","padrinho","oficina","levamos","fadas","ângulo","batido","vinda","jo","fama","c.","poesia","atingiu","requer","hope","algemas","piratas","frasco","pesadelos","orçamento","blue","kennedy","correm","pudessem","recordar","bagagem","benjamin","mostre","relva","nervos","batman","pro","irritado","colin","esconde","rancho","áreas","oriente","ligar-lhe","jersey","tranquilo","chefes","brancas","festejar","aéreo","baixas","quintal","recomeçar","conduta","noah","supremo","mikey","anderson","cabine","artistas","stefan","provocar","fios","sonhei","fritas","constante","recebeste","marcha","dignidade","levava","vi-a","levante","falares","l.a.","imaginas","benny","importam","levo-te","guerras","cordas","discos","dívidas","xadrez","artigos","março","escudo","hong","descrever","bingo","marcado","competir","nesses","poirot","joelho","virão","encontrem","comeste","belas","ficarão","mia","rita","sequência","viciado","celeiro","saírem","verdes","cortou","havido","horror","rosas","corrigir","profunda","duque","libertado","bebi","promessas","proteção","briga","colina","nicky","reconheço","protegido","radar","vistas","hector","diz-nos","janeiro","bolsos","estou-me","mantém-te","ferimento","khan","media","submarino","enterrar","deixava","buscar-te","hal","jules","assegurar","drogado","sobrinha","compaixão","tremer","ficaremos","aparecem","fogueira","desligado","apanho","burke","april","gravidez","procurava","parva","diane","disparo","tráfico","joan","judy","ansiosa","poema","oposto","praga","matrícula","bênção","obcecado","hmm","enviei","bauer","cúmplice","deixe-o","reduzir","falem","utilizar","whisky","mata-o","dezembro","haviam","abelhas","pátio","parceira","começaste","deixa-nos","urgências","ocidental","boyd","margem","louise","toalha","crane","conforto","apertado","lembraste","modelos","acorde","bolachas","actriz","mata-me","sid","pretendo","santos","doloroso","ácido","sigam-me","cresce","compensar","imagine","curva","comido","estátua","lawrence","fox","sugestão","presas","sotaque","vivas","tess","vendido","tomas","beba","mick","deixando","morgue","disseres","envia","brutal","pensaram","spock","verás","regressou","decerto","tentámos","reclamar","garantia","águia","trevor","começas","parentes","acreditem","objectos","pretos","jen","sonny","my","quietos","cam","preencher","impulso","finn","caí","lanterna","baker","mortais","macho","direto","chegará","ter-se","contém","may","alegre","arrogante","cuja","quisermos","gémeos","mama","helena","ligou-me","euros","beijos","confiante","brincando","mansão","escudos","destruída","ilhas","elefante","clima","prontas","instituto","one","on","produzir","harvard","pilotos","bolos","pacífico","rapazinho","exato","nações","pirata","menores","remover","garanto","dêem-me","japonês","sortudo","espécies","escuto","gota","apanhamos","liderar","falarmos","surpresas","incapaz","macgyver","oxalá","pato","allison","quarenta","lutador","eterna","odiar","saberemos","tira-me","riqueza","aprende","senado","leia","carruagem","batota","solitária","pam","curtir","núcleo","lord","comeces","reed","concordou","chama-me","beckett","análises","excepção","cauda","estariam","murro","internos","autor","amada","colónia","bati","merlin","bandido","gaja","ilusão","conceito","bacon","capacete","gerações","músculos","porter","valioso","diamante","fundação","carson","levará","errados","registado","quinto","wade","balcão","levaste","anunciar","tomado","colher","lucros","outono","dirá","pensão","produtor","lençóis","sócios","seguiu","alívio","respeitar","robô","líquido","haley","safar","ver-nos","prepara","teresa","levá-los","planetas","desconto","tratou","métodos","vadia","soltar","ex-mulher","tubarões","freddy","interno","tentem","perito","graham","duncan","amantes","brennan","avery","isaac","covarde","cicatriz","sentar-me","chávena","debate","construiu","admite","voa","gaveta","lloyd","modos","troy","sue","houston","quadros","ciclo","manhãs","julgas","lavagem","gesto","essencial","juan","promete","colo","atrasar","passando","mude","fôssemos","avança","palmas","coberto","barata","eléctrica","trancada","ares","inferior","sorri","fresca","forno","lindsay","descubra","sons","vacas","ra","repórter","fariam","angie","torneio","mandato","órbita","sentidos","compraste","ida","adequado","tampa","merecia","ganhas","rude","rosie","fecho","aumenta","fracasso","digno","restantes","comércio","miolos","vira-te","leon","ande","desiste","e-mails","desenhar","apreciar","inicial","escócia","depressão","buddy","juntar-se","bell","alimentos","denny","poderosos","costumam","faz-te","perry","sincera","exagerar","português","adams","custou","tarefas","amei","ursos","vingar","irritante","vê-se","nuvem","toquei","elogio","dna","levar-nos","forçar","acusar","fatal","contes","aranha","comboios","long","câmera","mulder","darei","klaus","moderna","escutar","fugido","escândalo","delta","perca","josé","apanhaste","ganham","zack","laser","ciente","gordura","subiu","monroe","tanques","j.","expulso","reagir","pareciam","estejamos","comemorar","canalha","falhas","cindy","dificil","fisher","dentista","mergulho","doyle","reese","actos","suspeitas","microfone","cheques","únicas","gancho","lauren","moça","pensavas","fiona","nâo","moro","possui","galeria","vodka","trate","preferes","hóspedes","beach","dizer-vos","raramente","obrigação","praça","contato","activo","caravana","wells","criei","elemento","ave","vermelhos","punho","espiões","dexter","pagas","ari","ligar-te","east","lutou","lydia","matá-los","acreditou","lesões","retirada","tarado","brilhar","embaixo","perfeição","carrega","recentes","dominar","sacanas","flynn","comuns","love","alec","decidiram","claudia","roman","ouça-me","retrato","pat","deusa","donos","zach","desligue","assine","alturas","apanhada","incríveis","isco","saltou","avenida","tratei","sullivan","esforços","desisto","excitado","mona","moto","cadeiras","gigantes","novato","carmen","batata","noivado","adoras","violar","dica","década","rebelde","fodido","vai-me","hospitais","aceitei","morris","atire","denise","pancada","enfiar","indicam","cagar","fala-me","apresenta","nazis","adormecer","urina","devesses","brandon","ameaçou","índio","assusta","cereais","cheias","almofada","whoa","legado","kurt","fê-lo","tomem","bebeu","farás","winston","testa","gerador","veronica","cale","h.","quisesses","fugiram","valente","loira","vietname","entrado","comes","sofre","casei","campbell","diz-se","aterragem","verem","thompson","tomada","brilho","chata","abri","morrerá","esquisita","salvador","potência","vôo","correntes","rory","empurrar","lápis","elaine","conrad","comédia","parti","lembrança","bates","vagina","fardo","continuou","domínio","ridícula","recusou","grito","carrinho","derrota","sagrada","ilegais","lester","negras","inventou","puseram","rex","sentir-te","impede","sanita","panquecas","respire","bigode","touro","sindicato","está-se","mandaram","volante","exige","brigada","ciências","amber","vindas","chames","reparado","partimos","falecido","age","ceder","caros","imensas","fazíamos","corajosa","começado","queixo","promotor","sintas","drew","tentas","segui","casais","considera","aprovação","e.","salvação","lenço","bud","cano","peguem","omar","sms","violet","pertences","edição","jaula","srª","ofereceu","entras","urgência","austrália","porrada","lembre","chamaste","actuar","otário","pediram","cega","vinhas","jarod","criados","originais","pões","desespero","feminino","encantado","gripe","lembra-me","brody","chamá-lo","ganhamos","existia","ho","fugi","toneladas","sementes","valem","lésbica","amigável","hunter","boy","obrigar","cody","perdoe","aquí","aposentos","abuso","abandonou","separação","mancha","amamos","guião","educado","saltos","ficção","delegado","machado","morremos","oração","visões","comprado","acidentes","fluxo","boxe","camiões","valia","valha-me","boneco","percas","perco","jornada","rochas","cavar","avanço","calibre","resolve","tola","apareça","preços","pelotão","odeio-te","pólvora","reservas","instável","lorque","massagem","contentes","edifícios","deram-me","ameaçar","quantia","artie","ensino","usaste","banana","nalgum","fúria","alugar","colete","terapeuta","susto","protege","balde","remédios","pablo","odiava","ajudem","desculpar","bata","tucker","club","levou-me","ópera","queixas","coreia","chamou-me","feminina","cheguem","seguimos","sanduíche","estúpidas","desejava","ajudante","túneis","inglesa","voltaria","magoa","coisinha","dei-te","sabrina","volume","adiar","matou-o","partidas","falhei","véspera","amoroso","soco","dourado","randall","faça-o","vulgar","acharam","mesas","fada","suite","tiraram","foster","faleceu","décadas","colapso","fazes-me","ter-lhe","talentos","burt","cobras","kane","convidada","desistiu","frágil","executar","voltarem","avisado","mataria","archer","richie","meteste","encerrado","evolução","usaram","cm","fevereiro","stella","regressa","implorar","fechadura","putas","leilão","envelope","avisa-me","aprecio","facas","encarar","becky","guy","herança","parente","passa-me","finch","le","clã","chatice","cadastro","precioso","jazz","dallas","sigam","kansas","brenda","cyrus","aluguer","cobrar","gangue","senta","chandler","dj","suporte","missões","dimensão","júnior","deixasse","tomaste","cleveland","estraguei","relaxe","careca","forense","morri","materiais","saudações","vinham","sheila","gwen","vire","ataca","roubada","couro","jonas","stuart","oiçam","estou-te","veículos","restam","ações","crítica","pegadas","bêbada","cortado","soro","fórmula","finanças","top","dadas","junta","devon","by","fizerem","bay","avaliar","lenny","químicos","vizinha","postal","julga","procure","conforme","pt","surdo","sra","ligue-me","acelerar","máscaras","evidente","atento","eleição","dragões","time","olhas","arranje","ivan","tristes","arco","digam-me","discoteca","convidou","lava","cesto","guardião","romanos","galinhas","nicholas","scotty","temer","quero-o","nucleares","furiosa","gravações","biliões","invés","suporto","cais","policias","desfazer","junior","andem","estragado","ego","cuba","anúncios","procurem","envolve","assinou","rastos","jeffrey","acender","instintos","pesquisar","torno","sábio","alexander","verei","desfile","injusto","recurso","apanhámos","vitais","ouvindo","ajudei","capturar","alicia","coca","romano","aguardar","magoou","mentiste","fugitivo","freddie","tabaco","aproveita","lho","kara","mexicano","solidão","balão","nelas","yang","deu-nos","andrea","buffy","fazenda","ouvem","ruby","texto","painel","apanhei-o","estações","bernie","federação","legais","convés","terminal","caminhada","serviu","carbono","mexam","bang","cartel","cabras","madison","escrevo","elvis","crítico","amam","virou","suba","emboscada","grand","t-shirt","bandas","goa","mantê-la","escura","editor","dezenas","contam","douglas","kitt","casar-se","começando","multa","olha-me","nolan","convenção","gostes","paula","forçado","pulseira","armadura","bruno","acertou","lesão","prendê-lo","lola","bloquear","hunt","mecânico","inclui","castanho","pôr-me","dobrar","adianta","espadas","tirá-la","penas","naturais","chores","vindos","sun","aponta","buscar-me","filosofia","arizona","podre","nikki","encosta","mostre-me","lições","felix","avisei","carroça","entregas","palhaços","trazes","lionel","prometes","dispostos","indiana","sherlock","voltasse","repete","canhão","tentares","massacre","silver","chamados","ooh","atreves","robbie","recordo","ligues","hastings","arranjado","observa","tiras","fechou","barreira","ronda","alguem","legista","inocência","dares","mito","municipal","brasa","sentar-te","circuito","barnes","pierce","donnie","bispo","vapor","estando","óptimas","intenso","aguarde","tonta","leva-a","bennett","técnicas","tambem","grita","lake","sóbrio","funcione","chegando","edgar","escolar","faltava","laços","barão","páscoa","usados","botões","greve","perdes","ajudo-te","segure","gays","milagres","vou-lhe","estás-me","curiosa","baixos","encobrir","directora","levaria","reynolds","esperma","carácter","ficarás","humilde","fins","odeias","míssil","dano","grayson","dixon","cobertor","barra","pazes","espertos","damas","barras","soubemos","queen","alvejado","tê-los","dê-lhe","pneu","causado","poderem","conteúdo","bowling","mandaste","fixes","girl","pedir-me","temporal","sótão","genética","yo","póquer","sobra","ncis","eve","leslie","leio","invulgar","bloqueio","engolir","pertencem","ajudo","clarke","paro","varanda","cortesia","drª","consigas","peyton","cápsula","lobisomem","bush","tartaruga","árabe","políticas","arca","treinado","burns","demasiada","rudy","funções","voltava","adulta","dormia","armar","saul","estádio","rocky","telefona","escondeu","entregou","eficaz","kira","scully","favores","shawn","liguem","missa","sabermos","blá","perdem","parece-se","lenta","salvá-lo","dormes","acabará","ohio","imaginava","joshua","fêmea","fusão","colocá-lo","refeições","decidiste","vais-me","soubessem","bares","gratidão","reparou","turistas","sharon","pierre","caíram","beverly","campainha","votação","that","reparaste","traiu","ordenado","lena","sapo","coitado","morres","saídas","roubados","portões","camas","teorias","aberração","vital","evacuar","quites","maré","bases","connie","mantido","baleado","chuveiro","ultima","stephanie","porteiro","passados","acabas","jon","peggy","reid","alimento","calvin","herdeiro","elite","saindo","quartel","dantes","deixem-no","criador","solto","amendoim","borla","mallory","agradar","raj","habituado","pego","molhado","está-me","julgava","samuel","prémios","alemã","olhares","arnold","poeta","inspetor","pôr-te","pô-la","detalhe","salve","patas","drake","encaixa","costelas","olham","famosos","jedi","sobrou","manteve","granada","saía","all","aceitas","raptado","cooperar","norma","parados","estimação","ato","irlandês","grego","rodney","completar","es","obsessão","deixarem","chad","pendurado","glenn","ansiedade","vejas","shepherd","paizinho","secretas","levada","herr","donde","chef","públicas","joy","vermelhas","ir-se","magoar-te","bond","han","publicar","brasil","toalhas","seios","marcada","avançado","stevens","confessou","limão","suicida","xixi","antonio","raízes","rouba","mandam","seguras","retiro","rara","pertencia","pântano","abordagem","veem","saberes","software","fortaleza","inclusive","teimoso","gang","selo","clyde","austin","apressar","ocupar","schmidt","orfanato","deixo-te","monitor","falemos","desisti","expor","alfred","ajudares","largue-me","vales","irmandade","road","pensares","imunidade","protector","seda","gostasse","básico","salvaste","toquem","pop","voyager","comunista","obedecer","terça","ellis","permanece","largo","orações","admiro","canais","masculino","segue-me","rogers","bernard","gelados","guardado","einstein","morder","activar","ya","colheita","evans","ligar-me","liv","pararam","executivo","ordenou","torta","enviada","cassie","adeusinho","pedidos","inúteis","excesso","tinhamos","rim","borracha","carvão","pilotar","elevado","chen","tao","morro","fechem","né","honrado","mayor","keller","havemos","senha","terrestre","oferece","assinado","prever","irlanda","jared","deixa-os","chamaram","culpados","gentileza","belos","humanas","evacuação","passou-se","trem","bones","fotógrafo","mandy","mosca","precisei","sermão","preocupo","notável","deixará","necessito","policiais","dr","tintas","cardíaca","servidor","faixa","dawn","deviamos","diminuir","jerusalém","abertas","seguir-me","culto","camaradas","baleia","durou","tratava","injecção","roll","limpas","bebes","ovelhas","porno","comprador","woody","kathy","is","finge","sabe-se","overdose","crescido","gostado","tornozelo","nsa","campus","malvado","tomamos","tatuagens","moore","óptimos","hans","salvou-me","dvd","refiro-me","hills","river","pequenino","dorothy","eleanor","manchas","andavam","esperavas","iríamos","chora","perigosas","guarde","unir","delicado","nazi","animado","asneiras","lotaria","enganou","chumbo","pontas","salvei","captura","gajas","surpreso","voltámos","jefferson","valha","marvin","fino","automóvel","falcão","enganados","wow","limpos","auxiliar","wall","churrasco","cd","estudei","madrugada","disse-nos","manga","marijuana","bónus","oz","ligas","longas","abatido","ringue","young","positiva","toco","pilha","coro","vermos","comparar","cuido","warp","queens","pijama","detroit","passar-se","halloween","notar","pastilha","hammond","serpente","aliviar","estreia","raposa","tás","tubos","salas","litros","confirma","deita-te","tímido","encontras","romântica","santuário","acampar","bico","bunker","confirmou","bébé","legítima","declarar","opiniões","erin","fazer-nos","contentor","altar","destinado","insiste","south","necessita","ruído","comparado","cuide","thor","loucas","laço","happy","ervas","sucedido","pague","preciosa","phillip","batalhas","reza","poupa-me","pipocas","avatar","dedicado","laurel","phoenix","atrevas","satanás","primos","garras","tornar-me","amelia","trazem","dormido","ouvi-la","amo-a","cacifo","cortada","percurso","deves-me","vivido","peço-lhe","cruzar","filmagens","digo-vos","sesta","wally","stevie","facebook","lâmpada","verme","gatinho","episódios","ambição","correndo","garotos","iris","judicial","perguntes","sexto","baía","seguintes","world","sino","actores","county","moderno","hugo","mantêm","boatos","tratam","ensaiar","extremo","aborto","trazê-la","magoe","ta","ajudaria","golpes","assumo","netos","morfina","cachorros","falou-me","mates","refúgio","amiguinho","gideon","vendi","eterno","fôlego","actuação","destrói","aluna","trouxemos","reggie","sentires","pacto","larguem","gravado","atacados","ajudou-me","contares","etc","avancem","pensavam","estragos","chegas","cat","apaga","fujam","anual","andavas","tareia","deita","ponhas","cometido","t.","anéis","recebem","rené","cavalaria","cassetes","afirma","pentágono","escolho","mana","entradas","puderem","nenhuns","doeu","baixa-te","summer","dwight","dispare","vera","seguem","comprido","ward","atacaram","kung","ventos","aperto","julgado","joel","esposas","conduzo","mm","governar","tarda","fitz","expedição","diga-lhes","espiar","acredites","bastão","ii","hábitos","fazê-los","kirsten","gorjeta","desfrutar","aventuras","baratas","girar","arrasar","tolice","agressivo","atirado","deprimido","matando","fale-me","uid","cristão","donuts","rodada","deb","tenciono","usem","eleito","tirada","paramos","atreve","manobra","editora","gavin","conter","hóquei","vagabundo","escova","june","exposto","ligaram","baltimore","pesos","profecia","escreva","rígido","abanar","vacina","lareira","neta","queima","ver-vos","veias","aperta","percy","donovan","fantasias","glen","cortinas","falaremos","asa","vazias","teal","cardeal","anton","duros","xena","erica","juízes","trancado","seguindo","valley","radical","salvá-la","começares","câmbio","põe-me","redes","abro","sensato","denunciar","ernie","travar","traseira","variar","tendência","demissão","peço-te","bruto","wes","gray","egipto","torne","investir","passem","senhoria","farmácia","anoitecer","refere","regina","kramer","ache","trágico","ava","vaughn","evelyn","tirar-me","relevante","fechadas","fu","deste-me","serra","aspeto","historial","bluff","ganhámos","hughes","amorosa","veado","foram-se","jessie","entrarem","entenda","carinho","garrett","brinques","pequenina","ir-me","odeiam","murray","surgir","compro","perpétua","cunhado","categoria","tóquio","partiram","círculos","amém","prossiga","deu-te","violada","culpas","insistir","cheiras","virgínia","avós","deixe-a","carolina","sr.ª","podeis","pedindo","param","valerie","tronco","põem","segui-lo","vício","precaução","hamilton","poeira","afectar","arrastar","atlanta","bêbados","fraldas","honestos","cocó","ouvires","prendas","rolo","suor","chantagem","jurar","sandra","começarem","inventei","mergulhar","marilyn","assaltar","diga-nos","segura-te","alf","coelhos","seguidos","arranca","kid","grata","avançada","culpo","telegrama","essência","raptada","levando","caçada","bófia","batalhão","bebemos","pearl","cálculos","circular","marcel","salsicha","facial","venceu","hudson","maldade","receitas","zonas","porão","tornei-me","insistiu","bonecas","latas","apanhe","nó","tornei","lynn","noivos","poção","algodão","fizesses","pedem","pesquisas","maridos","escolta","levantem","desviar","coberta","cristina","deres","dirige","mintas","definição","arranjas","troféu","parece-te","reflexo","ouvia","jura","sloan","suar","aproxima","invenção","cansados","corrupção","jogou","queca","brett","semestre","manter-me","verifique","mecanismo","receberam","deixe-nos","sophia","corrido","recibo","perfeitos","técnicos","sasha","fatia","calções","descanse","mapas","entres","peste","lutamos","incómodo","abraçar","italianos","atum","calculo","deixei-o","ex-marido","vivian","deveres","marcou","deixou-o","previsto","jamal","aparecido","gelada","evidência","atacada","neill","jr","medos","mostro-te","jogado","alinho","barril","sonda","altitude","sepultura","dói-me","parecidos","santidade","antídoto","reagan","iniciais","robot","honrar","confiei","henrique","theo","clubes","capturado","cimento","provou","mole","claque","atentos","banheiro","ocorre","dormindo","eugene","atirem","envie","tira-o","sairá","currículo","cantor","sylvia","naqueles","quebrou","resíduos","vejo-o","tiramos","bacano","extensão","pobreza","contava","exacta","apanha-o","veredicto","cartaz","jan","shirley","corri","prendeu","matamos","sessões","preparem","strip","nasceste","falarei","apodrecer","colorado","mobília","hotéis","moe","fiz-te","colaborar","atentado","del","ética","broadway","adoramos","tocas","cancelado","notei","chegasse","eficiente","autêntico","magoada","prepare","começava","corrupto","telefonei","importe","nikita","mimi","dar-vos","respeita","pertenço","andre","mills","benefício","demoro","està","resgatar","bocados","cabos","fornecer","racista","nasa","homenagem","carregada","revistar","arena","crescem","tratas","crias","sidney","espreitar","desceu","amarela","impedi-lo","miséria","cogumelos","deixámos","amador","profeta","meter-se","custos","ash","religioso","ninja","trazia","simpatia","dawson","reação","refiro","marina","táctica","tanner","contratos","vias","leões","mandem","partidos","jipe","línguas","piscar","pedrado","passará","cuidadoso","expulsar","ezra","demoraste","mentais","sofia","formal","paranóico","gil","prisões","olhava","capela","quebra","remoto","turnos","voltemos","coco","brady","revelou","apetecer","bêbeda","bree","aguarda","retorno","combina","pudemos","cavernas","zombie","shelby","suspenso","tramado","desejas","plasma","cérebros","vire-se","gregory","cócegas","imediata","fulano","leve-me","matares","delicada","dai","nenhumas","choro","solta-me","levados","protegida","perdidas","doentio","mudou-se","detectar","derrotado","sozinhas","entao","fort","públicos","luthor","pedes","gabe","luva","morrendo","pagamos","criaram","price","apanhem","bode","tolos","recusa","secar","abrandar","feijões","nevoeiro","defeito","católica","rata","mercedes","divina","isolado","sentindo","suíça","charme","estavamos","oriental","alpha","spike","we","desligou","brilha","raptou","farda","respondi","acordos","mudo","pedi-lhe","insecto","sólido","violenta","vendem","compre","cú","cãozinho","polly","réu","matty","absoluto","ressaca","pimenta","longos","saberei","estadual","art","pousa","tammy","gostavam","lutam","pope","síndrome","célula","bobo","drive","comia","lutei","planeia","parava","gritou","fuma","violou","vê-las","brien","fichas","esperou","rich","baxter","abe","letal","celular","paradeiro","adopção","francos","cathy","baixe","monty","pode-me","auto","nojenta","flecha","avisa","tornam","irene","foi-me","g.","futura","aguente","flutuar","inicio","dante","hayes","cristãos","depor","dinozzo","combinar","salvar-te","artéria","fenda","deitada","batom","eléctrico","cheryl","bolinhos","imaginem","val","furacão","refere-se","tenho-o","putos","cimo","conte-me","cumpriu","colchão","jacto","trocos","fachada","devo-te","hostil","casco","stu","enviaram","entrares","retirado","generosa","imortal","canhões","convidei","feriado","moscas","golo","mentido","corporal","avisei-te","desafiar","assina","fofo","gestão","sabido","cruzeiro","otto","recomendo","madre","devas","tentarei","gilbert","brinca","fugiste","falência","atleta","discreto","manuel","levantou","nã","dc","parares","expressar","insisto","tacos","ivy","metida","atendo","raiz","ofender","ninguem","montana","feijão","tocava","lida","viaja","chamar-te","fractura","soar","paquistão","consultar","galo","digressão","bota","grades","amo-o","vega","robinson","desenhada","meti","legítimo","mae","portland","percorrer","baseada","sacar","ajudam","possivel","revolta","cintura","precisão","jogamos","marcação","morava","abençoado","flórida","gaita","encerrar","anedota","violentos","chichi","avariado","nobres","lote","baleias","deeks","ganharam","addison","tranquila","rios","perdas","enviados","ruiva","vegetais","pêlo","falasse","domingos","numero","plena","queixar","instalar","unidas","cortina","considero","camioneta","músico","faz-nos","cass","acabares","lateral","raio-x","sao","air","gama","menu","explique","callie","tentarem","servido","projectos","maurice","insinuar","causas","lo","assento","debra","robôs","afecta","ferir","magro","trazer-me","estágio","juíza","your","alá","docinho","sova","procurou","esgoto","eduardo","ajustar","doçura","javier","recorrer","hannibal","ditado","zoológico","grécia","virei","quereis","saberão","day","desmaiou","georgia","pensaria","marc","esmagar","imensos","desvio","fabulosa","powell","asilo","willy","fazer-se","pinturas","mccoy","adequada","stewie","impecável","garantido","riso","rins","agências","ironia","britânica","levares","exigir","picante","idosos","luis","navegar","lizzie","vantagens","simmons","viu-o","processos","explosivo","recolha","oiço","cometa","doris","tornaste","potter","caia","comandar","aplicação","paisagem","paras","pouquinho","passes","chapéus","criminosa","tinha-me","traidores","quentin","comentar","convenceu","cantos","prometido","congelado","elijah","pátria","chegava","repita","forçada","quanta","sugar","condessa","ladra","merecer","peterson","gates","podes-me","joyce","excitada","dee","bebia","enterrada","alcunha","resolvi","estadia","melanie","bem-estar","escuras","químico","precisos","vermes","bombeiro","matas","aspectos","malditas","magoar-me","consumo","nomeado","pisar","despertar","úteis","explico","estupor","arodri","mestres","manipular","point","conhecias","ruínas","chulo","camada","pagos","siga-me","incomum","lori","nalguma","brandy","conheças","jenkins","vilão","rostos","atingida","ms.","organismo","preocupas","esqueço","contos","morrerem","janice","rumor","lorenzo","formigas","pico","semente","vence","mérito","gasto","correios","abrimos","tomaram","sossegado","farsa","fossemos","perdê-lo","crack","lume","mi","achámos","borboleta","cinzento","emprestar","tenso","bradley","latim","vendemos","peg","títulos","gaiola","peruca","reitor","claras","rodar","acabem","assaltos","sérios","tráfego","boris","dão-me","manter-te","deixarmos","melinda","north","berço","clássica","psicólogo","recuperou","laurie","hugh","pan","mandá-lo","callen","estatuto","nadia","morresse","jasper","exausto","wesley","imigração","empurra","doméstica","escutas","símbolos","shh","calmos","crucial","comam","biologia","pano","tomate","judith","maçãs","oposição","cohen","stripper","blusa","dá-te","divino","voltando","fi","stewart","mágicos","insulto","exércitos","carregado","limusina","reservado","pulmão","nocturno","molhada","dê-nos","mack","patroa","atirei","emenda","desça","gostariam","dalton","raptar","regimento","créditos","afastados","gold","entrámos","denver","partiste","faça-me","cera","pontaria","enforcado","viviam","valiosa","calados","cliff","ricardo","christy","abigail","matou-a","case","mexicanos","porreira","tabuleiro","decorrer","vivendo","provocou","belle","afundar","parvoíce","entrarmos","animar","fax","junta-te","zombies","baixem","re","sherman","hodgins","d.c.","jóia","abater","christina","elefantes","desejam","simone","primária","havai","arsenal","aceitável","lixados","piza","boss","transição","bebeste","pudim","dinamite","sabão","saint","fina","arredores","soviética","biológica","ausente","batida","terramoto","religiosa","senadora","peles","precisou","cúpula","lsso","tequila","freira","rezo","deliciosa","avisou","estragou","violino","cynthia","italiana","negativa","ensina","baixem-se","salvos","nozes","roubos","sugeriu","wolf","gostaram","gata","subam","ss","imperial","caminha","irónico","livrar-se","abelha","lendas","libby","canja","avisar-te","congelar","sustentar","bosques","puderam","mandas","monge","legenda","acontecia","labirinto","matava","misturar","lenha","quiseram","bella","gémeas","valentine","nevada","resolveu","ri","banquete","ptpt","isabelle","consultor","exibição","ficarias","velhota","camarão","anão","broche","michigan","chocante","colinas","jogas","esfregar","guardo","servo","comecemos","vicky","apanham","meter-me","salsichas","ajudava","cêntimo","sarilho","lógico","sétimo","enviou-me","ramos","gruta","confesso","esfomeado","polegar","residente","usadas","apercebi","prenderam","irritar","marissa","hipoteca","gibson","quadrante","barbie","saberem","harmonia","saudáveis","executado","pata","vedação","surge","lucky","tocado","prevenir","arterial","bebido","lixem","tac","revela","zoey","be","leituras","juro-te","roosevelt","boné","balões","gin","knight","chupar","padrasto","enigma","pago-te","juntem-se","deixas-me","navegação","crença","luther","rum","falarem","ocupação","naval","cerebrais","concordas","invadiu","leva-nos","matarem","edwards","pomos","bordel","anomalia","cuida-te","darem","regime","damien","tou","cantora","disputa","levasse","chamam-me","aceitamos","roberts","reunidos","camille","danielle","favoritos","turk","conhece-o","gabrielle","liberta","extras","buscas","sadie","antónio","lançado","danças","au","angelo","recebes","aturar","sida","joguei","silas","duvidar","prue","estaca","peitos","atracção","morreres","gases","mato-o","reles","aplicar","becca","abraham","recua","falhados","desmaiar","agitado","durma","bizarro","àqueles","marta","dúzias","jade","contexto","etiqueta","promovido","tirem-no","tesoura","iate","ba","seríamos","armstrong","criativo","agarrou","permitiu","drogada","casar-me","peritos","romeu","chique","mexa-se","consumir","vazios","dirias","afasta","obstáculo","namoro","beija-me","culturas","mover-se","implica","dea","admirar","arranhão","fruto","caem","intruso","ronald","daniels","ginger","boom","treze","perdendo","infectado","donny","aleluia","pontapés","caixote","klingon","encanto","darren","impediu","embarcar","jorge","uses","elsa","correcção","ensinei","acabarmos","esther","gotham","termine","morras","tirem-me","magoes","estudou","foguete","incêndios","distrair","patife","existiu","sushi","saberás","stacy","nega","clayton","dourada","agulhas","agradece","conheço-a","racional","facilitar","uniformes","queimou","discursos","porca","teto","livra-te","chamando","acelera","tornam-se","billie","banks","ajudará","karma","spa","exijo","móveis","queimada","hálito","preparei","gastei","dormimos","frutos","conquista","lembrava","aliado","ovelha","esquilo","preston","orleães","médicas","encontres","escumalha","sabeis","pateta","propor","penteado","precises","ajudasse","crawford","defesas","pagaram","aumentou","go","bastantes","mordeu","horizonte","viajante","passadas","biológico","medir","restaurar","lamber","resolução","poste","brisa","espantosa","saísse","p.","alho","gail","wong","he","cocktail","viste-o","intensa","chang","sentia-me","passarem","gozo","creek","atenções","borda","motim","docas","chelsea","sentiria","news","tomam","contratei","ama-me","pegamos","csi","pinta","andré","tornaram","ofendido","viciada","perigos","senti-lo","ginástica","escavar","cross","rebelião","pretendia","levo-o","nasce","casca","bazar","colocaram","treinados","demorei","memorial","ama-te","hulk","corria","vaso","virado","muralha","revisto","marcy","concorrer","mexeu","sombrio","home","juros","usares","crenças","costeira","parecias","tentação","relógios","carlo","esteban","pesa","briggs","renee","escrava","gerald","ocasiões","tirar-lhe","triplo","placas","dá-lhes","realista","palma","porcarias","paus","correram","square","definir","chester","can","move","suspensão","casaste","datas","foco","camelot","consolo","reformado","chocado","jogam","rodeado","pagar-te","sózinho","trey","gramas","lilly","irritada","excitação","cilada","netflix","concluir","gallagher","falhaste","querendo","bicho","leme","indiano","sinos","ballet","timmy","exausta","perdedor","apollo","tropa","roland","perguntam","preferem","formatura","plantar","sanchez","namoradas","filmagem","jacques","indícios","sutton","mudar-me","agrada-me","achado","músculo","rusty","baterias","decido","yale","crichton","trouxe-me","paulie","preservar","sacerdote","atrai","brincos","esquecia","abortar","faço-te","aceitam","sirva","clinton","bryce","up","hipócrita","frito","ter-nos","camisas","nixon","aurora","garanhão","alteração","regular","ator","derreter","áudio","ajudaste","farol","extinção","pormenor","passar-me","perturbar","frases","amar-te","decoração","bolhas","abusar","acertei","vulcão","tornar-te","cabina","atalho","genes","unido","isqueiro","dormem","repare","what","escalar","subtil","prego","agarrado","pulsos","fuzileiro","espuma","permitem","feias","reconheci","falls","relatos","ouvi-te","tratada","torcer","infinito","noutras","greene","pintor","vaguear","high","músicos","explosões","armadas","zecacurto","mentem","zoo","viesses","barb","tate","vinhos","henderson","expresso","raptor","trá-lo","render","iá","perfeitas","cintos","duelo","sujas","imbecis","tratados","gémea","fibra","malucas","intuição","gangues","assume","mãezinha","apagado","brinco","possuem","instantes","amarrado","disparos","weaver","empire","lyle","ascensão","cegos","pegas","matei-o","travões","tanya","detê-lo","disparado","suspeitar","resolvo","langley","aprendido","levarei","bebem","kenneth","voces","proponho","ligadas","separado","chamaria","lanche","mexer-se","motivação","dramático","satélites","newton","descubram","email","útero","exemplar","falar-lhe","vidente","arbustos","brendan","outrora","fugitivos","assumiu","fenómeno","íntimo","avenue","google","kev","extrair","arco-íris","bloqueado","mentor","animada","historia","trish","padres","brooks","destroços","suborno","trará","lunático","diploma","celas","detonador","trigo","fez-te","presunto","floyd","queimados","side","sookie","morrerão","católico","estatal","rufus","bateste","gravador","aceites","sub","hayley","levarem","punhal","recuem","ajuda-nos","shannon","boato","ser-se","solte","gordos","activa","susie","cova","charuto","desafios","pólo","pensasse","carlton","goku","casacos","deveras","lutadores","darryl","knox","courtney","onu","universal","província","group","leve-o","tomava","admitiu","nativos","planeou","mordomo","salmão","am","terço","móvel","desistas","crowley","sessenta","relâmpago","caluda","torto","sirvo","morde","frutas","abóbora","metes","rap","aprovar","barris","estao","porta-te","patética","descolar","achavas","válvula","trabalhe","curado","provisões","tirares","lynette","registar","burra","rebentou","crocodilo","levou-o","descubro","pagar-lhe","ella","porcento","marion","rival","pulsação","nell","zeus","nus","mistérios","limonada","extrema","magnífica","sigo","combates","vasculhar","pregar","biscoito","treinos","chame-me","leonardo","partilha","revelação","acusada","habituada","fósforos","ocidente","merdoso","negação","ganhe","hetty","dizias","interpol","erik","vierem","parvos","obcecada","ensaios","tesouros","kelso","costumes","serio","dava-me","trocou","tecidos","centavo","spray","rituais","pretendes","árabes","traído","tosse","surf","quadrado","voou","chi","prová-lo","dizerem","ásia","duzentos","falavam","cassidy","holden","proibida","cercado","gostem","ajudes","podiamos","simulação","marquei","confiava","campeões","canyon","prove","tiram","exclusivo","atlântico","vigarista","jj","singh","di","bater-me","mantenho","provoca","lésbicas","mudar-se","gerar","cunhada","lutando","ignorante","post","item","vi-os","quebrado","otis","mandar-me","consta","agiu","kaboom","conheciam","magoei","proveito","adicionar","apaixonar","faríamos","comichão","traje","punição","inquérito","afogar","patricia","walsh","usavam","ricas","larga-a","prefeito","vip","tires","team","gole","holt","brigar","indicar","veria","roberto","factor","mete-te","jurei","pesar","predador","engana","rancor","aquário","esperes","maníaco","garra","lila","lagosta","promover","obrigou","fry","exagerado","gotas","anónimo","jonah","caderno","kat","bender","lançou","ferver","arruinado","florestas","desista","pêlos","costumas","manter-se","exista","mijo","estibordo","oral","matança","ligo-lhe","tribos","atletas","fletcher","lamentar","aparelhos","amou","custe","stanford","atual","bastardos","souberem","críticas","veteranos","musica","drones","loura","livrar-me","clarence","cordeiro","tela","seminário","atraído","virtude","pastilhas","seguidas","sawyer","mamilos","mexicana","pagaste","traga-me","nervosos","iminente","jax","parta","marciais","fizessem","composto","entrava","talentoso","perdermos","senhorio","1ah08","doses","suspensa","incluir","aah","arde","respondo","torturar","encantada","mario","murdock","armamento","bridget","chegados","esforçar","autógrafo","virgil","leais","ty","doca","compramos","cereja","permita","limitado","envio","daphne","cebola","amas-me","ocorrer","respondam","chorou","contem","entregues","madrid","captar","anfitrião","paraste","o.","mangueira","feitiços","coral","consigam","ace","ameaçado","garante","faze-lo","meter-te","antena","pendurar","passares","privados","negado","sobrevive","pacotes","ajudas","skinner","distraído","nat","stargate","atendeu","wu","nash","papagaio","trancar","bronx","derem","marcos","devolve","atlantic","señor","dentada","ouças","masculina","enterro","with","certidão","associado","traços","mostrei","aiden","tímida","larga-o","linhagem","ficasses","condenada","gregos","american","martini","medalhão","entrando","caças","grady","sanguínea","buscá-los","marketing","ranger","design","aspirina","protótipo","livraria","quilo","inspecção","inúmeras","morcego","maston","souberes","kay","habituar","richmond","sujos","dádiva","marchar","deixemos","anónima","mentindo","malandro","imitar","pen","souberam","virmos","tesão","mostarda","descida","emitir","night","fica-te","colômbia","louvado","ignição","ajudinha","tuvok"]'); - -/***/ }) - -}]); \ No newline at end of file diff --git a/cypress/fixtures/v3-client/main.js b/cypress/fixtures/v3-client/main.js deleted file mode 100644 index c62517c6..00000000 --- a/cypress/fixtures/v3-client/main.js +++ /dev/null @@ -1,6576 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "../app/node_modules/immediate/lib/browser.js": -/*!****************************************************!*\ - !*** ../app/node_modules/immediate/lib/browser.js ***! - \****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - -var Mutation = __webpack_require__.g.MutationObserver || __webpack_require__.g.WebKitMutationObserver; - -var scheduleDrain; - -{ - if (Mutation) { - var called = 0; - var observer = new Mutation(nextTick); - var element = __webpack_require__.g.document.createTextNode(''); - observer.observe(element, { - characterData: true - }); - scheduleDrain = function () { - element.data = (called = ++called % 2); - }; - } else if (!__webpack_require__.g.setImmediate && typeof __webpack_require__.g.MessageChannel !== 'undefined') { - var channel = new __webpack_require__.g.MessageChannel(); - channel.port1.onmessage = nextTick; - scheduleDrain = function () { - channel.port2.postMessage(0); - }; - } else if ('document' in __webpack_require__.g && 'onreadystatechange' in __webpack_require__.g.document.createElement('script')) { - scheduleDrain = function () { - - // Create a