From d09d5e04ea327bdb644e4bc2b92b36d2e4f60733 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Tue, 13 Dec 2022 11:28:26 +0700 Subject: [PATCH 01/29] Fix for ignored pnpm files from other branch --- .gitignore | 3 - pnpm-lock.yaml | 952 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 952 insertions(+), 3 deletions(-) create mode 100644 pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index 7eb4f512d..f24dcc58c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,3 @@ node_modules/ /pkg/ /tmp/ -pnpm -.pnpm-store -.pnpm-debug.log diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..1b58d25fb --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,952 @@ +lockfileVersion: 5.4 + +specifiers: + '@typescript-eslint/eslint-plugin': ^5.13.0 + '@typescript-eslint/parser': ^5.13.0 + eslint: ^8.10.0 + eslint-plugin-align-assignments: ^1.1.2 + typescript: ^4.6.2 + +devDependencies: + '@typescript-eslint/eslint-plugin': 5.46.1_imrg37k3svwu377c6q7gkarwmi + '@typescript-eslint/parser': 5.46.1_ha6vam6werchizxrnqvarmz2zu + eslint: 8.29.0 + eslint-plugin-align-assignments: 1.1.2_eslint@8.29.0 + typescript: 4.9.4 + +packages: + + /@eslint/eslintrc/1.3.3: + resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.4.1 + globals: 13.19.0 + ignore: 5.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array/0.11.7: + resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.14.0 + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + + /@typescript-eslint/eslint-plugin/5.46.1_imrg37k3svwu377c6q7gkarwmi: + resolution: {integrity: sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.46.1_ha6vam6werchizxrnqvarmz2zu + '@typescript-eslint/scope-manager': 5.46.1 + '@typescript-eslint/type-utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu + '@typescript-eslint/utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu + debug: 4.3.4 + eslint: 8.29.0 + ignore: 5.2.1 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.46.1_ha6vam6werchizxrnqvarmz2zu: + resolution: {integrity: sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.46.1 + '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 + debug: 4.3.4 + eslint: 8.29.0 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.46.1: + resolution: {integrity: sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/visitor-keys': 5.46.1 + dev: true + + /@typescript-eslint/type-utils/5.46.1_ha6vam6werchizxrnqvarmz2zu: + resolution: {integrity: sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 + '@typescript-eslint/utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu + debug: 4.3.4 + eslint: 8.29.0 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.46.1: + resolution: {integrity: sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.46.1_typescript@4.9.4: + resolution: {integrity: sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/visitor-keys': 5.46.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.46.1_ha6vam6werchizxrnqvarmz2zu: + resolution: {integrity: sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.46.1 + '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 + eslint: 8.29.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.29.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.46.1: + resolution: {integrity: sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.46.1 + eslint-visitor-keys: 3.3.0 + dev: true + + /acorn-jsx/5.3.2_acorn@8.8.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.1 + dev: true + + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-plugin-align-assignments/1.1.2_eslint@8.29.0: + resolution: {integrity: sha512-I1ZJgk9EjHfGVU9M2Ex8UkVkkjLL5Y9BS6VNnQHq79eHj2H4/Cgxf36lQSUTLgm2ntB03A2NtF+zg9fyi5vChg==} + peerDependencies: + eslint: '>=0.8.0' + dependencies: + eslint: 8.29.0 + dev: true + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.29.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.29.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint/8.29.0: + resolution: {integrity: sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.3.3 + '@humanwhocodes/config-array': 0.11.7 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.29.0 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.19.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.1 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.2.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.1 + acorn-jsx: 5.3.2_acorn@8.8.1 + eslint-visitor-keys: 3.3.0 + dev: true + + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq/1.14.0: + resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals/13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /ignore/5.2.1: + resolution: {integrity: sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==} + engines: {node: '>= 4'} + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-sdsl/4.2.0: + resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} + dev: true + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator/0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tsutils/3.21.0_typescript@4.9.4: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.4 + dev: true + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typescript/4.9.4: + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true From c4e773a84f955bd7b0a5654757b11d71c35cf1d7 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Mon, 11 Apr 2022 09:22:43 +0700 Subject: [PATCH 02/29] Added Pagy::Calendar#page_for(time) helper --- docs/api/calendar.md | 4 ++ lib/pagy/calendar.rb | 11 +++++ lib/pagy/calendar/day.rb | 13 +++++- lib/pagy/calendar/month.rb | 5 +++ lib/pagy/calendar/quarter.rb | 5 +++ lib/pagy/calendar/week.rb | 13 +++++- lib/pagy/calendar/year.rb | 5 +++ test/pagy/calendar_test.rb | 80 +++++++++++++++++++++++++++++++++++- 8 files changed, 132 insertions(+), 4 deletions(-) diff --git a/docs/api/calendar.md b/docs/api/calendar.md index 2726b016d..86868fc14 100644 --- a/docs/api/calendar.md +++ b/docs/api/calendar.md @@ -81,6 +81,10 @@ This method uses the `:format` variable to generate the current page label with This method takes a page number argument (`Integer` or `String`) and uses the `:format` variable to generate its label with the specific `Time` period it refers to. It accepts an optional `:format` keyword argument for overriding. +### page_for(time) + +This method takes a `TimeWithZone` object and returns the page number that includes it, or a `Pagy::Calendar::OutOfRangeError` if `time` is outside the pagination range. + ## Custom units You can define your own custom unit of any time length. For example you may want to add a unit of 2 months (i.e. a "bimester" unit), which should define a `Pagy::Calendar::Bimester` class. diff --git a/lib/pagy/calendar.rb b/lib/pagy/calendar.rb index 493827f64..c17aa1490 100644 --- a/lib/pagy/calendar.rb +++ b/lib/pagy/calendar.rb @@ -12,6 +12,9 @@ class Pagy # :nodoc: # Base class for time units subclasses (Year, Quarter, Month, Week, Day) class Calendar < Pagy + # Specific overflow error + class OutOfRangeError < StandardError; end + # List of units in desc order of duration. It can be used for custom units. UNITS = %i[year quarter month week day] # rubocop:disable Style/MutableConstant @@ -43,6 +46,10 @@ def label_for(page, opts = {}) localize(starting_time_for(page.to_i), opts) # page could be a string end + def page_for(time) + raise OutOfRangeError unless time.between?(@initial, @final) + end + protected # Base class method for the setup of the unit variables (subclasses must implement it and call super) @@ -69,6 +76,10 @@ def offset_units_for(page) @order == :asc ? page - 1 : @pages - page end + def offset_page_for(offset) + @order == :asc ? offset + 1 : @pages - offset + end + # Period of the active page (used internally for nested units) def active_period [[@starting, @from].max, [@to - 1, @ending].min] # -1 sec: include only last unit day diff --git a/lib/pagy/calendar/day.rb b/lib/pagy/calendar/day.rb index 1f98917a9..569a804d1 100644 --- a/lib/pagy/calendar/day.rb +++ b/lib/pagy/calendar/day.rb @@ -8,6 +8,11 @@ class Day < Calendar DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant format: '%Y-%m-%d' } + def page_for(time) + super + offset_page_for(page_offset(@initial, time.beginning_of_day)) + end + protected # Setup the calendar variables @@ -15,7 +20,7 @@ def setup_unit_vars super @initial = @starting.beginning_of_day @final = @ending.tomorrow.beginning_of_day - @pages = @last = (@with_zone ? (@final.time - @initial.time) : (@final - @initial)).to_i / 1.day + @pages = @last = page_offset(@initial, @final) @from = starting_time_for(@page) @to = @from.tomorrow end @@ -24,6 +29,12 @@ def setup_unit_vars def starting_time_for(page) @initial + offset_units_for(page).days end + + private + + def page_offset(time_a, time_b) # remove in 6.0 + (@with_zone ? (time_b.time - time_a.time) : (time_b - time_a)).to_i / 1.day + end end end end diff --git a/lib/pagy/calendar/month.rb b/lib/pagy/calendar/month.rb index f1d2b2513..952d42350 100644 --- a/lib/pagy/calendar/month.rb +++ b/lib/pagy/calendar/month.rb @@ -8,6 +8,11 @@ class Month < Calendar DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant format: '%Y-%m' } + def page_for(time) + super + offset_page_for(months_in(time.beginning_of_month) - months_in(@initial)) + end + protected # Setup the calendar variables diff --git a/lib/pagy/calendar/quarter.rb b/lib/pagy/calendar/quarter.rb index a339589c4..41bf29724 100644 --- a/lib/pagy/calendar/quarter.rb +++ b/lib/pagy/calendar/quarter.rb @@ -15,6 +15,11 @@ def label_for(page, opts = {}) localize(starting_time, opts) end + def page_for(time) + super + offset_page_for((months_in(time.beginning_of_quarter) - months_in(@initial)) / 3) + end + protected # Setup the calendar variables diff --git a/lib/pagy/calendar/week.rb b/lib/pagy/calendar/week.rb index 8eee4769d..d3f7d5fa4 100644 --- a/lib/pagy/calendar/week.rb +++ b/lib/pagy/calendar/week.rb @@ -8,6 +8,11 @@ class Week < Calendar DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant format: '%Y-%W' } + def page_for(time) + super + offset_page_for(page_offset(@initial, time.beginning_of_week)) + end + protected # Setup the calendar variables @@ -20,7 +25,7 @@ def setup_unit_vars end @initial = @starting.beginning_of_week @final = @ending.next_week.beginning_of_week - @pages = @last = (@with_zone ? (@final.time - @initial.time) : (@final - @initial)).to_i / 1.week + @pages = @last = page_offset(@initial, @final) @from = starting_time_for(@page) @to = @from.next_week end @@ -29,6 +34,12 @@ def setup_unit_vars def starting_time_for(page) @initial + offset_units_for(page).weeks end + + private + + def page_offset(time_a, time_b) # remove in 6.0 + (@with_zone ? (time_b.time - time_a.time) : (time_b - time_a)).to_i / 1.week + end end end end diff --git a/lib/pagy/calendar/year.rb b/lib/pagy/calendar/year.rb index 5ed592af5..d227a594f 100644 --- a/lib/pagy/calendar/year.rb +++ b/lib/pagy/calendar/year.rb @@ -8,6 +8,11 @@ class Year < Calendar DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant format: '%Y' } + def page_for(time) + super + offset_page_for(time.beginning_of_year.year - @initial.year) + end + protected # Setup the calendar variables diff --git a/test/pagy/calendar_test.rb b/test/pagy/calendar_test.rb index 2dc00bc8f..ace110f53 100644 --- a/test/pagy/calendar_test.rb +++ b/test/pagy/calendar_test.rb @@ -59,7 +59,7 @@ def pagy(unit: :month, **vars) _(p.pages).must_equal 9 _(p.last).must_equal 9 end - it 'computes variables for :quarter' do + it 'computes variables for :quarter desc' do p = pagy(unit: :quarter, order: :desc) _(p.instance_variable_get(:@initial)).must_equal Time.zone.local(2021, 10, 1) _(p.instance_variable_get(:@final)).must_equal Time.zone.local(2024, 1, 1) @@ -134,7 +134,7 @@ def pagy(unit: :month, **vars) _(p.pages).must_equal 9 _(p.last).must_equal 9 end - it 'computes variables for :quarter' do + it 'computes variables for :quarter desc' do p = pagy(unit: :quarter, page: 2, order: :desc) _(p.instance_variable_get(:@initial)).must_equal Time.zone.local(2021, 10, 1) _(p.instance_variable_get(:@final)).must_equal Time.zone.local(2024, 1, 1) @@ -270,6 +270,82 @@ def pagy(unit: :month, **vars) end end + # [Time.zone.local(2021, 10, 21, 13, 18, 23, 0), Time.zone.local(2023, 11, 13, 15, 43, 40, 0)] + describe '#page_for' do + it 'returns the page number for :year' do + p = pagy(unit: :year) + _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 + _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 + _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 3 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + it 'returns the page number for :year desc' do + p = pagy(unit: :year, order: :desc) + _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 3 + _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 + _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + + it 'returns the page number for :quarter' do + p = pagy(unit: :quarter) + _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 + _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 + _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 9 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + it 'returns the page number for :quarter desc' do + p = pagy(unit: :quarter, order: :desc) + _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 9 + _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 8 + _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + it 'returns the page number for :month' do + p = pagy(unit: :month) + _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 + _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 4 + _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 26 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + it 'returns the page number for :month desc' do + p = pagy(unit: :month, order: :desc) + _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 26 + _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 23 + _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + + it 'returns the page number for :week' do + p = pagy(unit: :week) + _(p.page_for(Time.zone.local(2021, 10, 21))).must_equal 1 + _(p.page_for(Time.zone.local(2021, 10, 26))).must_equal 2 + _(p.page_for(Time.zone.local(2023, 11, 13))).must_equal 109 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + it 'returns the page number for :day desc' do + p = pagy(unit: :week, order: :desc) + _(p.page_for(Time.zone.local(2021, 10, 21))).must_equal 109 + _(p.page_for(Time.zone.local(2021, 10, 26))).must_equal 108 + _(p.page_for(Time.zone.local(2023, 11, 13))).must_equal 1 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + it 'returns the page number for :day' do + p = pagy(unit: :day) + _(p.page_for(Time.zone.local(2021, 10, 21))).must_equal 1 + _(p.page_for(Time.zone.local(2021, 10, 26))).must_equal 6 + _(p.page_for(Time.zone.local(2023, 11, 13))).must_equal 754 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + it 'returns the page number for :day desc' do + p = pagy(unit: :day, order: :desc) + _(p.page_for(Time.zone.local(2021, 10, 21))).must_equal 754 + _(p.page_for(Time.zone.local(2021, 10, 26))).must_equal 749 + _(p.page_for(Time.zone.local(2023, 11, 13))).must_equal 1 + _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + end + end + describe 'Deprecated support' do it 'sets the beginning_of_week from :offset' do pagy(unit: :week, offset: 0) From 8bf6c49b87ce02d2eedc0ca3acc599f24d3dcc61 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Tue, 12 Apr 2022 06:30:54 +0700 Subject: [PATCH 03/29] Pagy::Calendar::*: Simpler code and improved readability --- lib/pagy/calendar.rb | 13 ++++++------- lib/pagy/calendar/day.rb | 11 +++++------ lib/pagy/calendar/month.rb | 11 +++++------ lib/pagy/calendar/quarter.rb | 11 +++++------ lib/pagy/calendar/week.rb | 11 +++++------ lib/pagy/calendar/year.rb | 11 +++++------ test/pagy/calendar_test.rb | 14 +++++++------- 7 files changed, 38 insertions(+), 44 deletions(-) diff --git a/lib/pagy/calendar.rb b/lib/pagy/calendar.rb index c17aa1490..df4448994 100644 --- a/lib/pagy/calendar.rb +++ b/lib/pagy/calendar.rb @@ -48,6 +48,9 @@ def label_for(page, opts = {}) def page_for(time) raise OutOfRangeError unless time.between?(@initial, @final) + + offset = page_offset_for(time) # offset starts from 0 + @order == :asc ? offset + 1 : @pages - offset end protected @@ -70,16 +73,12 @@ def localize(time, opts) time.strftime(opts[:format]) end - # Number of units to offset from the @initial time, in order to get the ordered starting time for the page. - # Used in starting_time_for(page) with a logic equivalent to: @initial + (offset_units_for(page) * unit_time_length) - def offset_units_for(page) + # Number of time units to offset from the @initial time, in order to get the ordered starting time for the page. + # Used in starting_time_for(page) where page starts from 1 (e.g. page to starting_time means subtracting 1) + def time_offset_for(page) @order == :asc ? page - 1 : @pages - page end - def offset_page_for(offset) - @order == :asc ? offset + 1 : @pages - offset - end - # Period of the active page (used internally for nested units) def active_period [[@starting, @from].max, [@to - 1, @ending].min] # -1 sec: include only last unit day diff --git a/lib/pagy/calendar/day.rb b/lib/pagy/calendar/day.rb index 569a804d1..acfa6853c 100644 --- a/lib/pagy/calendar/day.rb +++ b/lib/pagy/calendar/day.rb @@ -8,11 +8,6 @@ class Day < Calendar DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant format: '%Y-%m-%d' } - def page_for(time) - super - offset_page_for(page_offset(@initial, time.beginning_of_day)) - end - protected # Setup the calendar variables @@ -27,7 +22,11 @@ def setup_unit_vars # Starting time for the page def starting_time_for(page) - @initial + offset_units_for(page).days + @initial.days_since(time_offset_for(page)) + end + + def page_offset_for(time) + page_offset(@initial, time.beginning_of_day) end private diff --git a/lib/pagy/calendar/month.rb b/lib/pagy/calendar/month.rb index 952d42350..cd1fe8a76 100644 --- a/lib/pagy/calendar/month.rb +++ b/lib/pagy/calendar/month.rb @@ -8,11 +8,6 @@ class Month < Calendar DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant format: '%Y-%m' } - def page_for(time) - super - offset_page_for(months_in(time.beginning_of_month) - months_in(@initial)) - end - protected # Setup the calendar variables @@ -27,7 +22,11 @@ def setup_unit_vars # Starting time for the page def starting_time_for(page) - @initial + offset_units_for(page).months + @initial.months_since(time_offset_for(page)) + end + + def page_offset_for(time) + months_in(time.beginning_of_month) - months_in(@initial) end private diff --git a/lib/pagy/calendar/quarter.rb b/lib/pagy/calendar/quarter.rb index 41bf29724..c897c6097 100644 --- a/lib/pagy/calendar/quarter.rb +++ b/lib/pagy/calendar/quarter.rb @@ -15,11 +15,6 @@ def label_for(page, opts = {}) localize(starting_time, opts) end - def page_for(time) - super - offset_page_for((months_in(time.beginning_of_quarter) - months_in(@initial)) / 3) - end - protected # Setup the calendar variables @@ -34,7 +29,11 @@ def setup_unit_vars # Starting time for the page def starting_time_for(page) - @initial + (offset_units_for(page) * 3).months + @initial.months_since(time_offset_for(page) * 3) + end + + def page_offset_for(time) + (months_in(time.beginning_of_quarter) - months_in(@initial)) / 3 end private diff --git a/lib/pagy/calendar/week.rb b/lib/pagy/calendar/week.rb index d3f7d5fa4..6a2a6292f 100644 --- a/lib/pagy/calendar/week.rb +++ b/lib/pagy/calendar/week.rb @@ -8,11 +8,6 @@ class Week < Calendar DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant format: '%Y-%W' } - def page_for(time) - super - offset_page_for(page_offset(@initial, time.beginning_of_week)) - end - protected # Setup the calendar variables @@ -32,7 +27,11 @@ def setup_unit_vars # Starting time for the page def starting_time_for(page) - @initial + offset_units_for(page).weeks + @initial.weeks_since(time_offset_for(page)) + end + + def page_offset_for(time) + page_offset(@initial, time.beginning_of_week) end private diff --git a/lib/pagy/calendar/year.rb b/lib/pagy/calendar/year.rb index d227a594f..11844417b 100644 --- a/lib/pagy/calendar/year.rb +++ b/lib/pagy/calendar/year.rb @@ -8,11 +8,6 @@ class Year < Calendar DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant format: '%Y' } - def page_for(time) - super - offset_page_for(time.beginning_of_year.year - @initial.year) - end - protected # Setup the calendar variables @@ -27,7 +22,11 @@ def setup_unit_vars # Starting time for the page def starting_time_for(page) - @initial.years_since(offset_units_for(page)) + @initial.years_since(time_offset_for(page)) + end + + def page_offset_for(time) + time.beginning_of_year.year - @initial.year end end end diff --git a/test/pagy/calendar_test.rb b/test/pagy/calendar_test.rb index ace110f53..16de06f72 100644 --- a/test/pagy/calendar_test.rb +++ b/test/pagy/calendar_test.rb @@ -237,15 +237,15 @@ def pagy(unit: :month, **vars) end end - describe '#offset_units_for' do + describe '#time_offset_for' do it 'inverts the order' do p = pagy(unit: :month, order: :desc) - _(p.send(:offset_units_for, 1)).must_equal 25 - _(p.send(:offset_units_for, 2)).must_equal 24 - _(p.send(:offset_units_for, 3)).must_equal 23 - _(p.send(:offset_units_for, 24)).must_equal 2 - _(p.send(:offset_units_for, 25)).must_equal 1 - _(p.send(:offset_units_for, 26)).must_equal 0 + _(p.send(:time_offset_for, 1)).must_equal 25 + _(p.send(:time_offset_for, 2)).must_equal 24 + _(p.send(:time_offset_for, 3)).must_equal 23 + _(p.send(:time_offset_for, 24)).must_equal 2 + _(p.send(:time_offset_for, 25)).must_equal 1 + _(p.send(:time_offset_for, 26)).must_equal 0 end end From 0315e02cac5accb8ee9e72f8fd5caaba377403d0 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Sun, 1 May 2022 21:15:01 +0700 Subject: [PATCH 04/29] Implementation of calendar extra feature: pagy_calendar_url_at; refactoring and testing of the calendars files --- apps/pagy_calendar_app.ru | 13 ++-- docs/api/calendar.md | 4 -- docs/extras/calendar.md | 8 +++ lib/pagy/calendar.rb | 11 ++-- lib/pagy/calendar/day.rb | 2 +- lib/pagy/calendar/helper.rb | 60 ++++++++++++++++++ lib/pagy/calendar/month.rb | 2 +- lib/pagy/calendar/quarter.rb | 2 +- lib/pagy/calendar/week.rb | 2 +- lib/pagy/calendar/year.rb | 2 +- lib/pagy/extras/calendar.rb | 35 +++-------- pagy.manifest | 1 + test/pagy/calendar_test.rb | 82 ++++++++++++------------- test/pagy/extras/calendar_extra_test.rb | 24 ++++++++ 14 files changed, 162 insertions(+), 86 deletions(-) create mode 100644 lib/pagy/calendar/helper.rb diff --git a/apps/pagy_calendar_app.ru b/apps/pagy_calendar_app.ru index aea94f52d..470eff917 100644 --- a/apps/pagy_calendar_app.ru +++ b/apps/pagy_calendar_app.ru @@ -107,11 +107,14 @@ __END__

- <% if params[:skip] %> - Show Calendar - <% else %> - Hide Calendar - <% end %> + <% if params[:skip] %> + Show Calendar + <% else %> + Hide Calendar +

+ Go to current Page +

+ <% end %>

diff --git a/docs/api/calendar.md b/docs/api/calendar.md index 86868fc14..2726b016d 100644 --- a/docs/api/calendar.md +++ b/docs/api/calendar.md @@ -81,10 +81,6 @@ This method uses the `:format` variable to generate the current page label with This method takes a page number argument (`Integer` or `String`) and uses the `:format` variable to generate its label with the specific `Time` period it refers to. It accepts an optional `:format` keyword argument for overriding. -### page_for(time) - -This method takes a `TimeWithZone` object and returns the page number that includes it, or a `Pagy::Calendar::OutOfRangeError` if `time` is outside the pagination range. - ## Custom units You can define your own custom unit of any time length. For example you may want to add a unit of 2 months (i.e. a "bimester" unit), which should define a `Pagy::Calendar::Bimester` class. diff --git a/docs/extras/calendar.md b/docs/extras/calendar.md index 0b0fc60e8..20224c613 100644 --- a/docs/extras/calendar.md +++ b/docs/extras/calendar.md @@ -249,6 +249,14 @@ You can use the calendar objects with any `pagy_*nav` and `pagy_*nav_js` helpers The `pagy_*combo_nav_js` keeps into account only page numbers and not labels, so it is not very useful (if at all) with `Pagy::Calendar::*` objects. +### pagy_calendar_url_at(@calendar, time) + +This helper takes the `@calendar` and a `TimeWithZone` objects and returns the url complete with all the params for the pages in each bars that include the passed time. + +For example: `pagy_calendar_url_at(@calendar, Time.zone.now)` will select the the bars pointing to today. You can see a working example in the [pagy_calendar_app.ru](https://github.com/ddnexus/pagy/blob/master/apps/pagy_calendar_app.ru) file. + +If `time` is outside the pagination range it raises a `Pagy::Calendar::OutOfRangeError`. + ### Label format Each page link in the calendar navs is conveniently labeled with the specific `Time` period it refers to. You can change the time format to your needs by setting the `:format` variable to a standard `strftime` format. (See the [Pagy::Calendar variables](../api/calendar.md#variables)) diff --git a/lib/pagy/calendar.rb b/lib/pagy/calendar.rb index df4448994..81ea964ef 100644 --- a/lib/pagy/calendar.rb +++ b/lib/pagy/calendar.rb @@ -12,7 +12,7 @@ class Pagy # :nodoc: # Base class for time units subclasses (Year, Quarter, Month, Week, Day) class Calendar < Pagy - # Specific overflow error + # Specific out of range error class OutOfRangeError < StandardError; end # List of units in desc order of duration. It can be used for custom units. @@ -46,15 +46,16 @@ def label_for(page, opts = {}) localize(starting_time_for(page.to_i), opts) # page could be a string end - def page_for(time) + protected + + # The page for the passed time + def page_at(time) raise OutOfRangeError unless time.between?(@initial, @final) - offset = page_offset_for(time) # offset starts from 0 + offset = page_offset_at(time) # offset starts from 0 @order == :asc ? offset + 1 : @pages - offset end - protected - # Base class method for the setup of the unit variables (subclasses must implement it and call super) def setup_unit_vars raise VariableError.new(self, :format, 'to be a strftime format', @vars[:format]) unless @vars[:format].is_a?(String) diff --git a/lib/pagy/calendar/day.rb b/lib/pagy/calendar/day.rb index acfa6853c..6c99ae99b 100644 --- a/lib/pagy/calendar/day.rb +++ b/lib/pagy/calendar/day.rb @@ -25,7 +25,7 @@ def starting_time_for(page) @initial.days_since(time_offset_for(page)) end - def page_offset_for(time) + def page_offset_at(time) page_offset(@initial, time.beginning_of_day) end diff --git a/lib/pagy/calendar/helper.rb b/lib/pagy/calendar/helper.rb new file mode 100644 index 000000000..b2336125b --- /dev/null +++ b/lib/pagy/calendar/helper.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +class Pagy # :nodoc: + class Calendar # :nodoc: + class Helper < Hash # :nodoc: + class << self + private + + def create(conf, period, params) + new.send(:init, conf, period, params) + end + end + + private + + def init(conf, period, params) + @units = Calendar::UNITS & conf.keys # get the units in time length desc order + raise ArgumentError, 'no calendar unit found in pagy_calendar @configuration' if @units.empty? + + @period = period + @params = params + @page_param = conf[:pagy][:page_param] || DEFAULT[:page_param] + @conf = Marshal.load(Marshal.dump(conf)) # store a copy + @units.each do |unit| # set all the :page_param vars for later deletion + unit_page_param = :"#{unit}_#{@page_param}" + conf[unit][:page_param] = unit_page_param + conf[unit][:page] = @params[unit_page_param] + end + calendar = {} + last_obj = nil + @units.each_with_index do |unit, index| + params_to_delete = @units[(index + 1), @units.size].map { |sub| conf[sub][:page_param] } + [@page_param] + conf[unit][:params] = lambda do |unit_params| # delete page_param from the sub-units + # Hash#except missing from ruby 2.5 baseline + params_to_delete.each { |p| unit_params.delete(p.to_s) } + unit_params + end + conf[unit][:period] = last_obj&.send(:active_period) || @period + calendar[unit] = last_obj = Calendar.send(:create, unit, conf[unit]) + end + [replace(calendar), last_obj.from, last_obj.to] + end + + def last_object_at(date) + conf = Marshal.load(Marshal.dump(@conf)) + units_params = {} + last_obj = nil + @units.each do |unit| + conf[unit][:period] = last_obj&.send(:active_period) || @period + conf[unit][:page] = current_page = Calendar.send(:create, unit, conf[unit]).send(:page_at, date) + units_params[:"#{unit}_#{@page_param}"] = current_page + conf[unit][:params] ||= {} + conf[unit][:params].merge!(units_params) + last_obj = Calendar.send(:create, unit, conf[unit]) + end + last_obj + end + end + end +end diff --git a/lib/pagy/calendar/month.rb b/lib/pagy/calendar/month.rb index cd1fe8a76..24b8ba703 100644 --- a/lib/pagy/calendar/month.rb +++ b/lib/pagy/calendar/month.rb @@ -25,7 +25,7 @@ def starting_time_for(page) @initial.months_since(time_offset_for(page)) end - def page_offset_for(time) + def page_offset_at(time) months_in(time.beginning_of_month) - months_in(@initial) end diff --git a/lib/pagy/calendar/quarter.rb b/lib/pagy/calendar/quarter.rb index c897c6097..1fb7822d6 100644 --- a/lib/pagy/calendar/quarter.rb +++ b/lib/pagy/calendar/quarter.rb @@ -32,7 +32,7 @@ def starting_time_for(page) @initial.months_since(time_offset_for(page) * 3) end - def page_offset_for(time) + def page_offset_at(time) (months_in(time.beginning_of_quarter) - months_in(@initial)) / 3 end diff --git a/lib/pagy/calendar/week.rb b/lib/pagy/calendar/week.rb index 6a2a6292f..73266d199 100644 --- a/lib/pagy/calendar/week.rb +++ b/lib/pagy/calendar/week.rb @@ -30,7 +30,7 @@ def starting_time_for(page) @initial.weeks_since(time_offset_for(page)) end - def page_offset_for(time) + def page_offset_at(time) page_offset(@initial, time.beginning_of_week) end diff --git a/lib/pagy/calendar/year.rb b/lib/pagy/calendar/year.rb index 11844417b..db2cf28bc 100644 --- a/lib/pagy/calendar/year.rb +++ b/lib/pagy/calendar/year.rb @@ -25,7 +25,7 @@ def starting_time_for(page) @initial.years_since(time_offset_for(page)) end - def page_offset_for(time) + def page_offset_at(time) time.beginning_of_year.year - @initial.year end end diff --git a/lib/pagy/extras/calendar.rb b/lib/pagy/extras/calendar.rb index 578bed4a9..5bc053f83 100644 --- a/lib/pagy/extras/calendar.rb +++ b/lib/pagy/extras/calendar.rb @@ -2,6 +2,7 @@ # frozen_string_literal: true require 'pagy/calendar' +require 'pagy/calendar/helper' class Pagy # :nodoc: # Add pagination filtering by calendar unit (:year, :quarter, :month, :week, :day) to the regular pagination @@ -18,35 +19,17 @@ def pagy_calendar(collection, conf) raise ArgumentError, "keys must be in #{CONF_KEYS.inspect} and object values must be Hashes; got #{conf.inspect}" end - conf[:pagy] = {} unless conf[:pagy] # use default Pagy object when omitted - calendar, collection = pagy_setup_calendar(collection, conf) unless conf.key?(:active) && !conf[:active] - pagy, results = send(conf[:pagy][:backend] || :pagy, collection, conf[:pagy]) # use backend: :pagy when omitted + conf[:pagy] = {} unless conf[:pagy] # use default Pagy object when omitted + unless conf.key?(:active) && !conf[:active] + calendar, from, to = Calendar::Helper.send(:create, conf, pagy_calendar_period(collection), params) + collection = pagy_calendar_filter(collection, from, to) + end + pagy, results = send(conf[:pagy][:backend] || :pagy, collection, conf[:pagy]) # use backend: :pagy when omitted [calendar, pagy, results] end - # Setup and return the calendar objects and the filtered collection - def pagy_setup_calendar(collection, conf) - units = Calendar::UNITS & conf.keys # get the units in time length desc order - raise ArgumentError, 'no calendar unit found in pagy_calendar configuration' if units.empty? - - page_param = conf[:pagy][:page_param] || DEFAULT[:page_param] - units.each do |unit| # set all the :page_param vars for later deletion - unit_page_param = :"#{unit}_#{page_param}" - conf[unit][:page_param] = unit_page_param - conf[unit][:page] = params[unit_page_param] - end - calendar = {} - last_obj = nil - units.each_with_index do |unit, index| - params_to_delete = units[(index + 1), units.size].map { |sub| conf[sub][:page_param] } + [page_param] - conf[unit][:params] = lambda do |params| # delete page_param from the sub-units - params_to_delete.each { |p| params.delete(p.to_s) } # Hash#except missing from ruby 2.5 baseline - params - end - conf[unit][:period] = last_obj&.send(:active_period) || pagy_calendar_period(collection) - calendar[unit] = last_obj = Calendar.send(:create, unit, conf[unit]) - end - [calendar, pagy_calendar_filter(collection, last_obj.from, last_obj.to)] + def pagy_calendar_url_at(calendar, date) + pagy_url_for(calendar.send(:last_object_at, date), 1) end # This method must be implemented by the application diff --git a/pagy.manifest b/pagy.manifest index f82c54b3a..5191e5afe 100644 --- a/pagy.manifest +++ b/pagy.manifest @@ -40,6 +40,7 @@ lib/pagy.rb lib/pagy/backend.rb lib/pagy/calendar.rb lib/pagy/calendar/day.rb +lib/pagy/calendar/helper.rb lib/pagy/calendar/month.rb lib/pagy/calendar/quarter.rb lib/pagy/calendar/week.rb diff --git a/test/pagy/calendar_test.rb b/test/pagy/calendar_test.rb index 16de06f72..29326a3a7 100644 --- a/test/pagy/calendar_test.rb +++ b/test/pagy/calendar_test.rb @@ -271,78 +271,78 @@ def pagy(unit: :month, **vars) end # [Time.zone.local(2021, 10, 21, 13, 18, 23, 0), Time.zone.local(2023, 11, 13, 15, 43, 40, 0)] - describe '#page_for' do + describe '#page_at' do it 'returns the page number for :year' do p = pagy(unit: :year) - _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 - _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 - _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 3 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 + _(p.send(:page_at, Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 + _(p.send(:page_at, Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 3 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :year desc' do p = pagy(unit: :year, order: :desc) - _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 3 - _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 - _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 3 + _(p.send(:page_at, Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 + _(p.send(:page_at, Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :quarter' do p = pagy(unit: :quarter) - _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 - _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 - _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 9 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 + _(p.send(:page_at, Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 2 + _(p.send(:page_at, Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 9 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :quarter desc' do p = pagy(unit: :quarter, order: :desc) - _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 9 - _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 8 - _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 9 + _(p.send(:page_at, Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 8 + _(p.send(:page_at, Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :month' do p = pagy(unit: :month) - _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 - _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 4 - _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 26 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 1 + _(p.send(:page_at, Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 4 + _(p.send(:page_at, Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 26 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :month desc' do p = pagy(unit: :month, order: :desc) - _(p.page_for(Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 26 - _(p.page_for(Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 23 - _(p.page_for(Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21, 13, 18, 23, 0))).must_equal 26 + _(p.send(:page_at, Time.zone.local(2022, 1, 1, 13, 18, 23, 0))).must_equal 23 + _(p.send(:page_at, Time.zone.local(2023, 11, 13, 15, 43, 40, 0))).must_equal 1 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :week' do p = pagy(unit: :week) - _(p.page_for(Time.zone.local(2021, 10, 21))).must_equal 1 - _(p.page_for(Time.zone.local(2021, 10, 26))).must_equal 2 - _(p.page_for(Time.zone.local(2023, 11, 13))).must_equal 109 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21))).must_equal 1 + _(p.send(:page_at, Time.zone.local(2021, 10, 26))).must_equal 2 + _(p.send(:page_at, Time.zone.local(2023, 11, 13))).must_equal 109 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :day desc' do p = pagy(unit: :week, order: :desc) - _(p.page_for(Time.zone.local(2021, 10, 21))).must_equal 109 - _(p.page_for(Time.zone.local(2021, 10, 26))).must_equal 108 - _(p.page_for(Time.zone.local(2023, 11, 13))).must_equal 1 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21))).must_equal 109 + _(p.send(:page_at, Time.zone.local(2021, 10, 26))).must_equal 108 + _(p.send(:page_at, Time.zone.local(2023, 11, 13))).must_equal 1 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :day' do p = pagy(unit: :day) - _(p.page_for(Time.zone.local(2021, 10, 21))).must_equal 1 - _(p.page_for(Time.zone.local(2021, 10, 26))).must_equal 6 - _(p.page_for(Time.zone.local(2023, 11, 13))).must_equal 754 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21))).must_equal 1 + _(p.send(:page_at, Time.zone.local(2021, 10, 26))).must_equal 6 + _(p.send(:page_at, Time.zone.local(2023, 11, 13))).must_equal 754 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end it 'returns the page number for :day desc' do p = pagy(unit: :day, order: :desc) - _(p.page_for(Time.zone.local(2021, 10, 21))).must_equal 754 - _(p.page_for(Time.zone.local(2021, 10, 26))).must_equal 749 - _(p.page_for(Time.zone.local(2023, 11, 13))).must_equal 1 - _ { p.page_for(Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError + _(p.send(:page_at, Time.zone.local(2021, 10, 21))).must_equal 754 + _(p.send(:page_at, Time.zone.local(2021, 10, 26))).must_equal 749 + _(p.send(:page_at, Time.zone.local(2023, 11, 13))).must_equal 1 + _ { p.send(:page_at, Time.zone.local(2030)) }.must_raise Pagy::Calendar::OutOfRangeError end end diff --git a/test/pagy/extras/calendar_extra_test.rb b/test/pagy/extras/calendar_extra_test.rb index ffde9af81..4a38f7626 100644 --- a/test/pagy/extras/calendar_extra_test.rb +++ b/test/pagy/extras/calendar_extra_test.rb @@ -211,4 +211,28 @@ def app(**opts) _(pagy.series).must_equal [1, "2", 3] _(entries.to_a).must_rematch end + + describe 'pagy_calendar_url_at' do + it 'returns the url' do + collection = MockCollection::Calendar.new(@collection) + calendar, _pagy, _entries = app(params: { year_page: 2, month_page: 7, page: 2 })\ + .send(:pagy_calendar, collection, year: {}, + month: {}, + pagy: { items: 10 }) + _(app.send(:pagy_calendar_url_at, calendar, Time.zone.local(2021, 12, 21))) + .must_equal "/foo?page=1&year_page=1&month_page=3" + + _(app.send(:pagy_calendar_url_at, calendar, Time.zone.local(2022, 2, 10))) + .must_equal "/foo?page=1&year_page=2&month_page=2" + + _(app.send(:pagy_calendar_url_at, calendar, Time.zone.local(2023, 11, 10))) + .must_equal "/foo?page=1&year_page=3&month_page=11" + + _ { app.send(:pagy_calendar_url_at, calendar, Time.zone.local(2024, 1, 10)) } + .must_raise Pagy::Calendar::OutOfRangeError + + _ { app.send(:pagy_calendar_url_at, calendar, Time.zone.local(2021, 9, 10)) } + .must_raise Pagy::Calendar::OutOfRangeError + end + end end From f1ac0cfdb143c0a2c01f31a6518107c5bb1d074e Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Tue, 3 May 2022 13:35:55 +0700 Subject: [PATCH 05/29] Calendar code cleanup and normalization --- apps/pagy_calendar_app.ru | 13 ++++++------- lib/pagy/calendar.rb | 2 +- lib/pagy/calendar/helper.rb | 35 ++++++++++++++++++----------------- lib/pagy/extras/calendar.rb | 6 +++--- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/apps/pagy_calendar_app.ru b/apps/pagy_calendar_app.ru index 470eff917..2f707854d 100644 --- a/apps/pagy_calendar_app.ru +++ b/apps/pagy_calendar_app.ru @@ -107,13 +107,12 @@ __END__

- <% if params[:skip] %> - Show Calendar - <% else %> - Hide Calendar -

- Go to current Page -

+ <% if params[:skip] %> + Show Calendar + <% else %> + Hide Calendar +
+ Go to current Page <% end %>

diff --git a/lib/pagy/calendar.rb b/lib/pagy/calendar.rb index 81ea964ef..64da94b12 100644 --- a/lib/pagy/calendar.rb +++ b/lib/pagy/calendar.rb @@ -48,7 +48,7 @@ def label_for(page, opts = {}) protected - # The page for the passed time + # The page that includes time def page_at(time) raise OutOfRangeError unless time.between?(@initial, @final) diff --git a/lib/pagy/calendar/helper.rb b/lib/pagy/calendar/helper.rb index b2336125b..906118791 100644 --- a/lib/pagy/calendar/helper.rb +++ b/lib/pagy/calendar/helper.rb @@ -2,11 +2,14 @@ class Pagy # :nodoc: class Calendar # :nodoc: - class Helper < Hash # :nodoc: + # Initializes the calendar objects, reducing complexity in the extra + # The returned calendar is a simple hash of units/objects with an added helper + # returning the last_object_at(time) used in the extra + class Helper < Hash class << self private - def create(conf, period, params) + def init(conf, period, params) new.send(:init, conf, period, params) end end @@ -27,7 +30,7 @@ def init(conf, period, params) conf[unit][:page] = @params[unit_page_param] end calendar = {} - last_obj = nil + object = nil @units.each_with_index do |unit, index| params_to_delete = @units[(index + 1), @units.size].map { |sub| conf[sub][:page_param] } + [@page_param] conf[unit][:params] = lambda do |unit_params| # delete page_param from the sub-units @@ -35,25 +38,23 @@ def init(conf, period, params) params_to_delete.each { |p| unit_params.delete(p.to_s) } unit_params end - conf[unit][:period] = last_obj&.send(:active_period) || @period - calendar[unit] = last_obj = Calendar.send(:create, unit, conf[unit]) + conf[unit][:period] = object&.send(:active_period) || @period + calendar[unit] = object = Calendar.send(:create, unit, conf[unit]) end - [replace(calendar), last_obj.from, last_obj.to] + [replace(calendar), object.from, object.to] end - def last_object_at(date) - conf = Marshal.load(Marshal.dump(@conf)) - units_params = {} - last_obj = nil - @units.each do |unit| - conf[unit][:period] = last_obj&.send(:active_period) || @period - conf[unit][:page] = current_page = Calendar.send(:create, unit, conf[unit]).send(:page_at, date) - units_params[:"#{unit}_#{@page_param}"] = current_page + def last_object_at(time) + conf = Marshal.load(Marshal.dump(@conf)) + page_params = {} + @units.inject(nil) do |object, unit| + conf[unit][:period] = object&.send(:active_period) || @period + conf[unit][:page] = page_params[:"#{unit}_#{@page_param}"] \ + = Calendar.send(:create, unit, conf[unit]).send(:page_at, time) conf[unit][:params] ||= {} - conf[unit][:params].merge!(units_params) - last_obj = Calendar.send(:create, unit, conf[unit]) + conf[unit][:params].merge!(page_params) + Calendar.send(:create, unit, conf[unit]) end - last_obj end end end diff --git a/lib/pagy/extras/calendar.rb b/lib/pagy/extras/calendar.rb index 5bc053f83..b87f12c45 100644 --- a/lib/pagy/extras/calendar.rb +++ b/lib/pagy/extras/calendar.rb @@ -21,15 +21,15 @@ def pagy_calendar(collection, conf) conf[:pagy] = {} unless conf[:pagy] # use default Pagy object when omitted unless conf.key?(:active) && !conf[:active] - calendar, from, to = Calendar::Helper.send(:create, conf, pagy_calendar_period(collection), params) + calendar, from, to = Calendar::Helper.send(:init, conf, pagy_calendar_period(collection), params) collection = pagy_calendar_filter(collection, from, to) end pagy, results = send(conf[:pagy][:backend] || :pagy, collection, conf[:pagy]) # use backend: :pagy when omitted [calendar, pagy, results] end - def pagy_calendar_url_at(calendar, date) - pagy_url_for(calendar.send(:last_object_at, date), 1) + def pagy_calendar_url_at(calendar, time) + pagy_url_for(calendar.send(:last_object_at, time), 1) end # This method must be implemented by the application From b4761c03c6d1a8841fec4fb1fff7d86f37d95c92 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Tue, 13 Dec 2022 12:06:49 +0700 Subject: [PATCH 06/29] Dropped docker env support --- .devcontainer/devcontainer.json | 48 ----- .vscode/launch.json | 44 ----- .vscode/settings.json | 90 --------- .vscode/tasks.json | 134 -------------- docker/.gitignore | 2 - docker/Dockerfile | 101 ----------- docker/Dockerfile.docs | 20 -- docker/README.md | 202 --------------------- docker/docker-compose.override-example.yml | 82 --------- docker/docker-compose.yml | 74 -------- docker/setup-env.sh | 14 -- 11 files changed, 811 deletions(-) delete mode 100644 .devcontainer/devcontainer.json delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json delete mode 100644 docker/.gitignore delete mode 100644 docker/Dockerfile delete mode 100644 docker/Dockerfile.docs delete mode 100644 docker/README.md delete mode 100644 docker/docker-compose.override-example.yml delete mode 100644 docker/docker-compose.yml delete mode 100755 docker/setup-env.sh diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index adbcd0870..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,48 +0,0 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: -// https://github.com/microsoft/vscode-dev-containers/tree/v0.191.1/containers/docker-existing-docker-compose -// If you want to run as a non-root user in the container, see .devcontainer/docker-compose.yml. - -// Pagy: we try to use VSC config as less as possible, limiting it to the VSC specific stuff -// in order to get docker/docker-compose files/config as portable as possible between editors, IDEs or CLI. -// This file should giver you all the basic extensions and setting for developing pagy -// Full details https://github.com/ddnexus/pagy/tree/master/docker - -// IMPORTANT: Run the `Remote-Containers: Rebuild Container...` VSCode command -// each time you modify this file. -{ - "dockerComposeFile": [ - "../docker/docker-compose.yml", - "../docker/docker-compose.override.yml" - ], - "extensions": [ - "antfu.browse-lite", - "castwide.solargraph", - "cnshenj.vscode-task-manager", - "davidanson.vscode-markdownlint", - "dbaeumer.vscode-eslint", - "eamodio.gitlens", - "jdforsythe.add-new-line-to-files", - "kaiwood.endwise", - "mhutchie.git-graph", - "misogi.ruby-rubocop", - "msjsdiag.debugger-for-edge", - "msjsdiag.debugger-for-edge", - "rangav.vscode-thunder-client", - "rebornix.ruby", - "shardulm94.trailing-spaces", - "shevtsov.vscode-cy-helper", - "streetsidesoftware.code-spell-checker", - "tht13.html-preview-vscode", - "wingrunr21.vscode-ruby", - "yzhang.markdown-all-in-one", - ], - "name": "pagy-dev", - "runServices": [ - "pagy-dev", - "pagy-docs" - ], - // "shutdownAction": "none", - "service": "pagy-dev", - "settings": {}, - "workspaceFolder": "/pagy" -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 6935cde25..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version" : "0.2.0", - "configurations" : [ - { - "name" : "Debug Active File", - "type" : "Ruby", - "request" : "launch", - "program" : "${file}", - "programArgs" : [], - "useBundler" : true, - }, - { - "name" : "Attach to rdebug-ide", - "type" : "Ruby", - "request" : "attach", - "remoteHost" : "0.0.0.0", - "remotePort" : "1234", - "remoteWorkspaceRoot" : "${workspaceRoot}" - }, - { - "name" : "Pagy IRB", - "preLaunchTask" : "preLaunchTask - debugger wait for pagy IRB", - "type" : "Ruby", - "request" : "attach", - "remoteHost" : "0.0.0.0", - "remotePort" : "1234", - "remoteWorkspaceRoot" : "${workspaceRoot}", - "cwd" : "${workspaceRoot}", - }, - { - "name" : "pagy_standalone_app.ru", - "preLaunchTask" : "preLaunchTask - debugger wait for pagy_standalone_app", - "type" : "Ruby", - "request" : "attach", - "remoteHost" : "0.0.0.0", - "remotePort" : "1234", - "remoteWorkspaceRoot" : "${workspaceRoot}", - "cwd" : "${workspaceRoot}", - }, - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 29cab56f2..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cSpell.words": [ - "activerecord", - "arel", - "autorun", - "backport", - "blocklist", - "bulma", - "Chainable", - "Codecov", - "ddnexus", - "Demichelis", - "devcontainer", - "Domizio", - "downarrow", - "entrypoint", - "Gitter", - "haml", - "htmlvalidate", - "javascripts", - "Kaminari", - "Koshy", - "meilisearch", - "minimalistic", - "mongoid", - "navless", - "navs", - "overridable", - "Padrino", - "pagy", - "pluralizations", - "prepended", - "rackup", - "rebased", - "rubygem", - "screencast", - "screencasts", - "searchkick", - "solargraph", - "stylesheet", - "turbolinks", - "uikit", - "uncommenting", - "unscope", - "unstyled", - "uparrow", - "Webpacker" - ], - "cypressHelper.commandForOpen": "npx cypress open --project=/pagy/e2e", - "cypressHelper.commandForRun": "npx cypress run --project=/pagy/e2e", - "cypressHelper.menuItems": { - "FindCustomCommandReferences": true, - "FindStepDefinitionReferences": true, - "GenerateCustomCommandTypes": true, - "GoToCustomCommand": true, - "mockAutocomplete": false, - "OpenCypress": true, - "RunCypress": true, - "SchemaGenerator": true - }, - "diffEditor.ignoreTrimWhitespace": false, - "markdownlint.config": { - "blanks-around-fences": true, - "MD024": false, - "MD025": false, - "MD026": false, - "MD033": false, - "MD046": false - }, - "markdownlint.run": "onType", - "ruby.format": "rubocop", - "ruby.lint": { - "rubocop": { - "useBundler": true // enable rubocop via bundler - }, - "standard": false - }, - "ruby.useBundler": true, //run non-lint commands with bundle exec - "ruby.useLanguageServer": true, // use the internal language server (see below) - "solargraph.useBundler": true, - "taskManager.exclude": "^preLaunchTask", - "terminal.integrated.profiles.linux": { - "bash": { - "icon": "terminal-bash", - "path": "bash" - } - }, - "trailing-spaces.highlightCurrentLine": false, - "trailing-spaces.trimOnSave": true -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index e37d88fe8..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "test: All", - "type": "shell", - "command": "rake", - "group": "test", - }, - { - "label": "test: All With HTML Reports", - "type": "shell", - "command": "rake", - "options": { - "env": { - "HTML_REPORTS": "true" - } - }, - "group": "test" - }, - { - "label": "preLaunchTask - debugger wait for pagy IRB", - "type": "shell", - "command": "rdebug-ide", - "args": [ - "--host=0.0.0.0", - "--port=1234", - "--dispatcher-port=1234", - "--", - "/usr/local/bundle/bin/bundle", - "exec", - "irb", - "--simple-prompt", - "-Ilib", - "-rpagy" - ], - "isBackground": true, - // Fake watch script setup used to wait the debugger to attach - // All this is needed so VSCode just lets it run. - "problemMatcher": [ - { - "pattern": [ - { - "regexp": ".", - "file": 1, - "location": 2, - "message": 3 - } - ], - "background": { - "activeOnStart": true, - "beginsPattern": ".", - "endsPattern": ".", - } - } - ] - }, - { - "label": "IRB Pagy", - "type": "shell", - "command": "irb", - "args": [ - "-Ilib", - "-rpagy" - ], - "options": { - "shell": { - "executable": "bash", - "args": [ - "-c" - ] - } - }, - "presentation": { - "reveal": "always", - "close": true - }, - "group": "test" - }, - { - "label": "preLaunchTask - debugger wait for pagy_standalone_app", - "type": "shell", - "command": "rdebug-ide", - "args": [ - "--host=0.0.0.0", - "--port=1234", - "--dispatcher-port=1234", - "--", - "/usr/local/bundle/bin/rackup", - "-o0.0.0.0", - "-p8080", - "apps/pagy_standalone_app.ru", - ], - "isBackground": true, - // Fake watch script setup used to wait the debugger to attach - // All this is needed so VSCode just lets it run. - "problemMatcher": [ - { - "pattern": [ - { - "regexp": ".", - "file": 1, - "location": 2, - "message": 3 - } - ], - "background": { - "activeOnStart": true, - "beginsPattern": ".", - "endsPattern": ".", - } - } - ] - }, - { - "label": "E2E Test: run in terminal", - "type": "shell", - "command": "/pagy/e2e/cy", - "args": [ - "run" - ], - "group": "test" - }, - { - "label": "E2E Test: open cypress", - "type": "shell", - "command": "/pagy/e2e/cy", - "args": [ - "open" - ], - "group": "test" - } - ] -} diff --git a/docker/.gitignore b/docker/.gitignore deleted file mode 100644 index 6ab8f81e5..000000000 --- a/docker/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/.env -/docker-compose.override.yml diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index 3538743c2..000000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,101 +0,0 @@ -ARG ruby_version=3 - -FROM ruby:$ruby_version AS pagy-dev - -RUN apt-get update && apt-get install --no-install-recommends -y locales \ - && sed -i 's/^# *\(en_US.UTF-8\)/\1/' /etc/locale.gen \ - && locale-gen \ - && apt-get install --no-install-recommends -y \ - git \ - nano \ - libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb \ - libcanberra-gtk* \ - && rm -rf /var/lib/apt/lists/* \ - && apt-get clean - -ARG user -ARG group -ARG uid -ARG gid -ARG password=rubydev -ARG term=xterm-256color -ARG node_version=v16.10.0 - -RUN mkdir /opt/node \ - && curl https://nodejs.org/dist/${node_version}/node-${node_version}-linux-x64.tar.xz \ - | tar xfJ - --strip-components 1 -C /opt/node - -ENV \ - PATH=/opt/node/bin:${PATH} \ - BUNDLE_PATH=/usr/local/bundle \ - GEM_HOME=/usr/local/bundle \ - BUNDLE_APP_CONFIG=/usr/local/bundle \ - BUNDLE_BIN=/usr/local/bundle/bin \ - LS_OPTIONS='--color=auto' \ - EDITOR=nano \ - SHELL=/bin/bash \ - TERM=$term \ - LANG=en_US.UTF-8 \ - LANGUAGE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 - -# setup users and .bashrc -# - same pasword for user and root -# - color prompt for user and root -# - create dirs and chown them -RUN groupadd --gid=$gid --force $group \ - && useradd --uid=$uid --gid=$gid --shell=/bin/bash --create-home $user \ - && echo $user:$password | chpasswd \ - && echo root:$password | chpasswd \ - && sed -i 's/#force_color_prompt=yes/force_color_prompt=yes/' /home/$user/.bashrc \ - && sed -i 's/\\u@\\h\\\[\\033\[00m\\\]:\\\[\\033\[01;34m\\\]\\w\\\[\\033\[00m\\\]/\\u \\\[\\033\[01;34m\\\]\\w\\\[\\033\[00m\\\] /' /home/$user/.bashrc \ - && echo "export PROMPT_COMMAND='history -a' && export HISTFILE=/home/$user/.bash_history" >> /home/$user/.bashrc \ - && cp /home/$user/.bashrc /root/.bashrc \ - && mkdir -p \ - /home/$user/.config \ - /home/$user/.local/share \ - /pagy/node_modules \ - && touch /pagy/node_modules/.keep \ - && chown -R $uid:$gid \ - $BUNDLE_PATH \ - /home/$user \ - /pagy/node_modules -WORKDIR /pagy - -VOLUME \ - /home/$user \ - $BUNDLE_PATH - - -# Stage for user customization. Add here what you may need -# and create your own a docker-compose.override.yml out of the -# docker-compose.override-example.yml. -FROM pagy-dev AS pagy-custom-dev -RUN apt-get update && apt-get install --no-install-recommends -y \ - docker.io \ - && rm -rf /var/lib/apt/lists/* && apt-get autoremove -y && apt-get clean -y - - -# Stage for enabling also hardware acceleration (WebGL) for NVIDIA cards: Host and container use nouveau driver. -# This is useful only if you want to use a browser installed in the container or shared from the host -FROM pagy-custom-dev AS pagy-custom-nouveau-dev -RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \ - && apt-get update && apt-get install --no-install-recommends -y \ - mesa-utils mesa-utils-extra xserver-xorg-video-nouveau \ - && rm -rf /var/lib/apt/lists/* && apt-get clean -y - - -# Stage for enabling also hardware acceleration (WebGL) for NVIDIA cards: Host and container use NVIDIA driver. -# This is useful only if you want to use a browser installed in the container or shared from the host -# IMPORTANT: you must run the setup-env.sh and rebuild this stage when you update the host's NVIDIA driver -FROM pagy-custom-dev AS pagy-custom-nvidia-dev -ARG nvidia_version -ADD https://http.download.nvidia.com/XFree86/Linux-x86_64/${nvidia_version}/NVIDIA-Linux-x86_64-${nvidia_version}.run /tmp/NVIDIA-installer.run -RUN apt-get update && apt-get install --no-install-recommends -y kmod \ - && nvidia_opts='--accept-license --no-runlevel-check --no-questions --no-backup --ui=none --no-kernel-module --no-nouveau-check' ; \ - sh /tmp/NVIDIA-installer.run -A | grep -q -- '--install-libglvnd' && nvidia_opts="$nvidia_opts --install-libglvnd" ; \ - sh /tmp/NVIDIA-installer.run -A | grep -q -- '--no-nvidia-modprobe' && nvidia_opts="$nvidia_opts --no-nvidia-modprobe" ; \ - sh /tmp/NVIDIA-installer.run -A | grep -q -- '--no-kernel-module-source' && nvidia_opts="$nvidia_opts --no-kernel-module-source" ; \ - sh /tmp/NVIDIA-installer.run $nvidia_opts || { echo 'ERROR: Installation of NVIDIA driver failed.' >&2 ; exit 1 ; } ; \ - rm /tmp/NVIDIA-installer.run \ - && apt-get remove -y kmod && rm -rf /var/lib/apt/lists/* && apt-get autoremove -y && apt-get clean -y diff --git a/docker/Dockerfile.docs b/docker/Dockerfile.docs deleted file mode 100644 index b36b88bc8..000000000 --- a/docker/Dockerfile.docs +++ /dev/null @@ -1,20 +0,0 @@ -FROM ruby:2-alpine - -WORKDIR /opt - -# one step to exclude .build_deps from docker cache -RUN apk update \ - && apk add --no-cache --virtual .build_deps make build-base \ - && echo "source 'https://rubygems.org'" > Gemfile \ - && echo "gem 'github-pages', '218', group: :jekyll_plugins" >> Gemfile \ - && bundle install \ - && apk del .build_deps - -ENV LANG=en_US.UTF-8 \ - LANGUAGE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 - -CMD ["jekyll", "serve", "-H", "0.0.0.0", "-P", "4000"] - -EXPOSE 4000 35729 -VOLUME /opt/site diff --git a/docker/README.md b/docker/README.md deleted file mode 100644 index 7e8f863e6..000000000 --- a/docker/README.md +++ /dev/null @@ -1,202 +0,0 @@ -# Pagy Docker Environment - -This dir contains the docker files to setup a complete development environment without installing anything on your system. - -You can use it to develop changes, run ruby and E2E tests, and check the live preview of the documentation. - -## Prerequisites - -- recent `docker` -- recent `docker-compose` -- basic knowledge of `docker`/`docker-compose` - -## Caveats - -It works well on Linux. Other platforms are not tested but should work as well. - -## Optional - -- `Visual Studio Code` or `RubyMine` (the repo contains a complete and ready to use setup that will make your life super easy) - -# Pagy Development Environment - -The pagy docker environment has been designed to be a complete setup for development. It provides the infrastructure required (right version of ruby, development gems, jekyll server, env variables, tests, cypress, etc.) without the hassle to install and maintain anything in your system. - -Here are a few highlights: -- The `pagy-dev` container is run as your user (same name, UID and GID) and the local `pagy` dir is mounted at the container dir `/pagy` so you can edit the files in your local pagy dir or in the container: they are the same files edited by the same user. -- The gems are installed and persisted in the container `BUNDLE_PATH=/usr/local/bundle` and that dir is `chown`ed to your user, and mounted as the docker volume `pagy_bundle`: no need to rebuild the image no mixup with your own ruby/rubies. -- Your container user `HOME` is persisted in the `pagy_user_home` volume, so you can even get back to the shell history in future sessions. -- The `node_modules` dir is persisted in the `pagy_node_modules` volume: no mixup with your local `node` -- The `opt/site` is persisted in the `docs_site` volume and updated live at `http://0.0.0.0:4000`, so you can check how the documentation looks while editing it. - -## :pushpin: Dir Map - -- Exec docker-related commands from your local `/docker` dir (repo `docker` dir) -- Exec commands from the container `/pagy` dir (repo root dir) - -## Build - -Run in the local terminal: - -```sh -/docker $ ./setup-env.sh && DOCKER_BUILDKIT=1 docker-compose build -``` - -**Notice**: the `setup-env.sh` creates an `.env` file with what is needed to build the docker images with `docker-compose`. You can further customize the `.env` file after it is created. - -## If you don't use any specific IDE - -**Notice**: see [VSCode](#vscode) or [RubyMine](#rubymine) for specific setups. - -In order to complete the setup, you need to issue a couple of commands from the container terminal, so first open a bash session: - -```sh -/docker $ docker-compose run --rm pagy-dev bash -``` - -Then run the following commands in it: - -```shell -/pagy $ bundle install -/pagy $ npm ci -``` - -### Use the services - -Start the services: - -```sh -/docker $ docker-compose up -``` - -Open a shell in the running `pagy-dev` service (useful to interactively run commands): - -```shell -/docker $ docker-compose exec pagy-dev bash -``` - -then run from the container shell a few useful commands: - -```sh -# IRB with the `pagy` gem loaded and ready to try -/pagy $ irb -I lib -r pagy -# run the `test`, `rubocop`, `coverage_summary` and `manifest:check` tasks in one command -/pagy $ rake -# get also the coverage report (check it by opening the `coverage/index.html` in a browser) -/pagy $ HTML_REPORTS=true rake -# get list of tests available (so you can run them individually) -/pagy $ rake -D test_* -# run the e2e tests in the terminal -/pagy/e2e $ npm run test -# open cypress and run the test in its GUI -/pagy/e2e $ npm run test-open -``` - -Check the live docs site at `http://localhost:4000`. It reflects in real-time any update you do to the `*.md` page files (no page reload needed). - -Stop the services: - -```sh -/docker $ docker-compose down -``` - -Or run a service only for the execution of a specific command (it does not require `up` and `down`): - -```shell -# run all the ruby tests, including rubocop and coverage tasks -/docker $ docker-compose run --rm pagy-dev rake -# run the e2e tests in the terminal -/docker $ docker-compose run --rm pagy-dev npm -w e2e run test -# open cypress and run the test in its GUI -/docker $ docker-compose run --rm pagy-dev npm -w e2e run test-open -``` - -## VSCode - -The Pagy repository comes with the VSCode files that setup a complete **Development Environment** on your local installation almost automatically. - -1. Read the comments in the `docker/docker-compose.override-example.yml` file and create your own `docker-compose.override. - yml` before anything else. -2. You need the [Remote Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension. Installation instructions: - 1. Open VS Code, and hit: `Ctrl+P` - 2. Paste `ext install ms-vscode-remote.remote-containers` - 3. Hit `Enter` -3. Run the `Remote-Containers: Open Folder in Container...` command and pick your local `pagy` repository dir (VSCode will prepare the environment). -4. Run `bundle install` in the container terminal to complete the ruby setup. -5. Run `npm ci` in the container terminal to complete the e2e setup. -6. Open Cypress from the container terminal with `cypress open` go to Settings and choose VSCode as the File Opener. - -### Setup Solargraph - -- Run in container terminal `bundle exec yard gems` -- VSCode command `Solargraph: Rebuild all gem documentation` -- VSCode command `Solargraph: Download current Ruby documentation` -- VSCode command `Solargraph: Restart Solargraph` - -### Ready to use - -- Rubocop linting and formatting -- Solargraph intellisense -- One-click-run all the tasks from the `Task Manager` list (find its Icon in the Activity Bar) -- Ready to use generic and pagy-specific debugger launch configurations -- The most useful extensions for developing pagy (take a look in the `Pagy Dev Container: Pagy - Installed` Extension group) -- [Intelligent code completion](https://docs.cypress.io/guides/tooling/IDE-integration#Intelligent-Code-Completion) for Cypress and the custom Pagy commands already setup -- Eslint + VSCode Eslint extension configured for Cypress - -### Useful commands - -- Instead of typing `irb -I lib -r pagy` you can run IRB from the command palette `Run Terminal Command...` -- Run all the `test`, `rubocop`, `coverage_summary` and `manifest:check` tasks by picking the `test: All` from the `Task Manager` -- Run the `test: All With HTML Reports` from the `Task Manager` to get also a nice HTML coverage report. Check it by opening the `coverage/index.html` in a browser. -- Check the live docs site at `http://localhost:4000`. It updates in real-time any update you do to the `*.md` page files (no page reload needed). - -## RubyMine - -Pagy offers an unconventional setup for RubyMine that makes it work as it was installed directly in the container (VSCode style). That means that RubyMine will be using a regular local SDK from the container. That usage is simpler and works also where you can find quite a few problems with the traditional remote docker-compose SDK. - -
- -The pagy docker-compose setup works well for the pagy docker environment, and it works also with VSCode or with different level of integration with other IDEs or CLI. Unfortunately I've got quite a lot of problems to run it as a standard [Docker-compose as a remote interpreter](https://www.jetbrains.com/help/ruby/using-docker-compose-as-a-remote-interpreter.html#set_compose_remote_interpreter), so I abandoned the official remote way and found this way. You can try the official way if you feel adventurous :). - -
- -### Custom setup - -In order to make RubyMine work inside the container, you need to take a look at the `docker/docker-compose.override-example.yml`: it contains a working example and the comments that should allow you to customize it for your own system. - -
- -The basic target/stage for using RubyMine from the container is the (`docker-custom-dev`: the default). That enables 98% of capabilities of RubyMine. The only small limitation is that the link won't work from inside RubyMine, since there is no browser installed in the container, nor drivers to share one from your host. However that is the simplest target and the one you should probably pick. - -If you are really picky and want to have 100% of browser features, the `Dockerfile` includes also stages for NVIDIA cards. That are bigger builds but you can run also any browser from inside RubyMine, even if the browser is installed on the host. That is what I use for my own development environment (see the `docker/docker-compose.override-example.yml`). - -
- -After you create your own overriding, you should build normally (see [Build](#build)). It will build the `pagy-custom-dev` and everything should work. As soon as you run `docker-compose up` Rubymine should open from the container and you can create a local SDK. - -Open the terminal and run this in order to complete the setup: - -```shell -/pagy $ bundle install -/pagy $ npm ci -``` - -**IMPORTANT**: If the Ruby SDK does not find all the gems after installing them, then you may want to check whether the `GEM_PATH` environment variable contains also `/usr/local/bundle/ruby/3.0.0` (`Tools`>`Show Gem Environment`) and add it if needed. To add it you an create a `New local with custom configurator...` SDK, adding the `env GEM_PATH=/usr/local/bundle/ruby/3.0.0:/home/dd/.local/share/gem/ruby/3.0.0:/usr/local/lib/ruby/gems/3.0.0` as `Custom configurator`. - -### Run configurations - -A few run configurations are provided for interacting with `docker-compose` and the development, giving you the menus to run the more important tasks and tools. RubyMine will pick them up automatically. They work in this setup, but they might have to be adapted if you want to use them in a traditional remote docker-compose SDK. - -### Caveats - -The coverage has an advanced Simplecov setup and RubyMine may not handle it. If the usual RubyMine coverage tools don't work, you can trigger the coverage by running the task without the RubyMine coverage, or use`rake` or `HTML_REPORTS=true rake` in the terminal. - -# Clean up - -When you want to get rid of everything related to the `pagy` docker development on your system, here is a list of the commands to find them: - -- Volumes: `docker volume ls | grep pagy` -- Images: `docker images | grep -E 'pagy|cypress'` -- Image dependencies: if you are not using them for other containers, you may also want to check `docker images | grep -E 'ruby|alpine|debian'` -- Containers: `docker ps -a | grep pagy` -- Networks: `docker network ls | grep pagy` diff --git a/docker/docker-compose.override-example.yml b/docker/docker-compose.override-example.yml deleted file mode 100644 index 38699a2be..000000000 --- a/docker/docker-compose.override-example.yml +++ /dev/null @@ -1,82 +0,0 @@ -# Duplicate and rename the copy of this file as 'docker-compose.override.yml' so it will -# automatically get loaded from docker-compose, overriding the main 'docker-compose.yml' file. - -# Docker in Docker -# Customize the "group_add" entry for Docker in Docker. - -# Ubuntu 21.04 -# The file works almost as is with RubyMine and VSCode (see the sections below). -# It might require some adjustment if you use a different OS. - -# JetBrains RubyMine -# This file is a working example to use a local installation of RubyMine as it was installed inside the container. -# Notice: RubyMine may also be able to handle docker-compose run configuration without the need of this setup: -# in that case you have to create a remote docker-compose Ruby SDK and follow the official JetBrains doc. - -# VSCode + Remote Containers Extension -# The file is a working example to use VSCode + the Remote Containers Extension. -# Search for "VSCode" in the comments below in order to enable/disable what it needs. - -version: "3.8" -services: - pagy-dev: - build: - # Pick the stage to build - target: pagy-custom-dev -# Needed only for running a browser from the container -# target: pagy-custom-nvidia-dev # nvidia proprietary driver -# shm_size: 2gb # Building shared memory (usually not needed) -# shm_size: 2gb # Runtime shared memory (recommended to use google chrome normally) - init: true - environment: - # Share ENV with the host -# - DISPLAY # Just a ref: already defined in the main docker-compose.yml - - XAUTHORITY - - DBUS_SESSION_BUS_ADDRESS - # Needed only for full sharing of graphic and sound e.g. with a browser from the container -# devices: -# - /dev/dri:/dev/dri -# - /dev/snd:/dev/snd - - volumes: - # share Google Chrome installed on host (configure RubyMine to find it at the right path) - - /opt/google/chrome:/opt/google/chrome - # Time sync with host - - /etc/localtime:/etc/localtime:ro - # X11 and Dbus related - - $XAUTHORITY:$XAUTHORITY - - /tmp/.X11-unix:/tmp/.X11-unix - - /var/run/dbus:/var/run/dbus - - /run/user/$UID/bus:/run/user/$UID/bus - # JetBrains IDEs from the container (disable if you don't use JetBrains IDEs) - - /home/$USER/.local/share/JetBrains:/home/$USER/.local/share/JetBrains # JetBrains applications - - /home/$USER/.config/JetBrains:/home/$USER/.config/JetBrains # JetBrains configuration - - /home/$USER/jb:/home/$USER/jb # JetBrains CLI launchers (JetBrains Toolbox > Settings) - # Git global config - - /home/$USER/.gitconfig:/home/$USER/.gitconfig # .gitconfig file - - /home/$USER/.git-credentials:/home/$USER/.git-credentials # .git-credentials file - - /home/$USER/.config/git:/home/$USER/.config/git:ro # Host global git config - - /home/$USER/.ssh:/home/$USER/.ssh:ro # Keys for github - # Cosmetics - - /home/$USER/.local/share/fonts:/home/$USER/.local/share/fonts:ro # User Fonts - - /usr/share/fonts:/usr/share/fonts:ro # System Fonts - - /usr/share/themes:/usr/share/themes:ro # System Themes - - /usr/share/icons:/usr/share/icons:ro # System Icons and cursors - # Docker in docker - - /var/run/docker.sock:/var/run/docker.sock # Docker-in-docker setup - group_add: # Docker-in-docker setup - # Find your docker-host group with: `stat -c '%g' /var/run/docker.sock` - # and add it here to allow permission on the docker socket - - 135 - - # May be useful for certain customizations (but it allows only one instance of RubyMine) - # network_mode: host - - privileged: true # Needed for easy connection to dbus (e.g. cypress open) - - # Start RubyMine at `docker-compose up` (disable for VSCode) - command: ["/home/$USER/jb/rubymine"] - - pagy-docs: - # shutdown the docs service when you close RubyMine - depends_on: [pagy-dev] diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml deleted file mode 100644 index 1a54b40b3..000000000 --- a/docker/docker-compose.yml +++ /dev/null @@ -1,74 +0,0 @@ -# Complete Pagy development environment and live documentation server at http://0.0.0.0:4000 - -# USAGE -# cd docker -# docker-compose up - -# Use your own docker-compose.override.yml if you need to customize any key/value in this file: -# The override is git-ignored and it gets loaded automatically every time you use a docker-compose command - -version: "3.8" -services: - pagy-dev: - image: pagy-dev-${RUBY_VERSION:-3}:latest - build: - context: . - # The following args get set from ENV variables (use setup-env.sh to create the .env file) - args: - user: $USER - group: $GROUP - uid: $UID - gid: $GID - password: $PASSWORD - term: $TERM - ruby_version: ${RUBY_VERSION:-3} - nvidia_version: $NVIDIA_VERSION # optional - target: pagy-dev - container_name: pagy-dev - hostname: pagy-dev - user: $USER - volumes: - - ..:/pagy # repo dir mount - - user_home:/home/$USER # home dir - - bundle:/usr/local/bundle # gem dir - - node_modules:/pagy/node_modules # node_modules dir - environment: - - HTML_REPORTS # HTML reports of test coverage from local ENV - - CYPRESS_CACHE_FOLDER=/home/$USER/.cache/Cypress - - CYPRESS_baseUrl=http://0.0.0.0:4567 - - DISPLAY - stdin_open: true - tty: true - - pagy-docs: - image: pagy-docs:latest - build: - context: . - dockerfile: Dockerfile.docs - container_name: pagy-docs - environment: - - JEKYLL_GITHUB_TOKEN - ports: - - "4000:4000" - - "35729:35729" - volumes: - - ../docs:/opt/docs - - docs_site:/opt/site - command: | - jekyll serve \ - --incremental \ - --livereload \ - --watch \ - --force-polling \ - --host 0.0.0.0 \ - --baseurl '' \ - --source /opt/docs \ - --destination /opt/site - stdin_open: true - tty: true - -volumes: - bundle: - user_home: - node_modules: - docs_site: diff --git a/docker/setup-env.sh b/docker/setup-env.sh deleted file mode 100755 index 4e7b01ca6..000000000 --- a/docker/setup-env.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -cat > .env << EOF -COMPOSE_PROJECT_NAME=pagy -USER=$(id -un) -GROUP=$(id -gn) -UID=$(id -u) -GID=$(id -g) -TERM=$TERM -PASSWORD=rubydev -RUBY_VERSION=3 -NVIDIA_VERSION=$(head -n1 Date: Tue, 13 Dec 2022 12:29:47 +0700 Subject: [PATCH 07/29] fixup .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f24dcc58c..01b74066b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ node_modules/ /pkg/ /tmp/ +/.pnpm/* From 8d3b33191d71bb20fffed50ee23a79a94790725a Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Thu, 9 Jun 2022 13:10:44 +0700 Subject: [PATCH 08/29] Removed support for deprecated pagy_massage_params --- lib/pagy/extras/standalone.rb | 7 ++++--- lib/pagy/url_helpers.rb | 20 ++------------------ test/mock_helpers/app.rb | 8 -------- test/pagy/frontend_test.rb | 10 +--------- 4 files changed, 7 insertions(+), 38 deletions(-) diff --git a/lib/pagy/extras/standalone.rb b/lib/pagy/extras/standalone.rb index fa5b78b0b..6a5ab593a 100644 --- a/lib/pagy/extras/standalone.rb +++ b/lib/pagy/extras/standalone.rb @@ -8,6 +8,7 @@ class Pagy # :nodoc: # even in the irb/rails console without any app or config. module StandaloneExtra # Extracted from Rack::Utils and reformatted for rubocop + # :nocov: module QueryUtils module_function @@ -32,6 +33,7 @@ def build_nested_query(value, prefix = nil) end end end + # :nocov: # Return the URL for the page. If there is no pagy.vars[:url] # it works exactly as the regular #pagy_url_for, relying on the params method and Rack. @@ -45,9 +47,8 @@ def pagy_url_for(pagy, page, absolute: false, html_escaped: false) params = pagy.params.is_a?(Hash) ? pagy.params.clone : {} # safe when it gets reused params[page_param] = page params[items_param] = vars[:items] if vars[:items_extra] - query_string = "?#{QueryUtils.build_nested_query(pagy_deprecated_params(pagy, params))}" # remove in 6.0 - # params = pagy.params.call(params) if pagy.params.is_a?(Proc) # add in 6.0 - # query_string = "?#{Rack::Utils.build_nested_query(params)}" # add in 6.0 + params = pagy.params.call(params) if pagy.params.is_a?(Proc) + query_string = "?#{Rack::Utils.build_nested_query(params)}" query_string = query_string.gsub('&', '&') if html_escaped # the only unescaped entity "#{vars[:url]}#{query_string}#{vars[:fragment]}" end diff --git a/lib/pagy/url_helpers.rb b/lib/pagy/url_helpers.rb index de832e2ab..0fed33b55 100644 --- a/lib/pagy/url_helpers.rb +++ b/lib/pagy/url_helpers.rb @@ -14,26 +14,10 @@ def pagy_url_for(pagy, page, absolute: false, html_escaped: false) params = request.GET.merge(params) params[page_param] = page params[items_param] = vars[:items] if vars[:items_extra] - query_string = "?#{Rack::Utils.build_nested_query(pagy_deprecated_params(pagy, params))}" # remove in 6.0 - # params = pagy.params.call(params) if pagy.params.is_a?(Proc) # add in 6.0 - # query_string = "?#{Rack::Utils.build_nested_query(params)}" # add in 6.0 + params = pagy.params.call(params) if pagy.params.is_a?(Proc) + query_string = "?#{Rack::Utils.build_nested_query(params)}" query_string = query_string.gsub('&', '&') if html_escaped # the only unescaped entity "#{request.base_url if absolute}#{request.path}#{query_string}#{vars[:fragment]}" end - - private - - # Transitional code to handle params deprecations. It will be removed in version 6.0 - def pagy_deprecated_params(pagy, params) # remove in 6.0 - if pagy.params.is_a?(Proc) # new code - pagy.params.call(params) - elsif respond_to?(:pagy_massage_params) # deprecated code - Warning.warn '[PAGY WARNING] The pagy_massage_params method has been deprecated and it will be ignored from version 6. ' \ - 'Set the :params variable to a Proc with the same code as the pagy_massage_params method.' - pagy_massage_params(params) - else - params # no massage params - end - end end end diff --git a/test/mock_helpers/app.rb b/test/mock_helpers/app.rb index 101bf193d..a80d97c7e 100644 --- a/test/mock_helpers/app.rb +++ b/test/mock_helpers/app.rb @@ -22,14 +22,6 @@ def test_i18n_call I18n.t('test') end - class Overridden < MockApp - # deprecated but still used for testing deprecations - def pagy_massage_params(params) # remove in 6.0 - params.delete('delete_me') - params.merge!('add_me' => 'add_me') - end - end - class Calendar < MockApp def pagy_calendar_period(collection) collection.minmax.map(&:in_time_zone) diff --git a/test/pagy/frontend_test.rb b/test/pagy/frontend_test.rb index cdaa5725b..be0a56cd9 100644 --- a/test/pagy/frontend_test.rb +++ b/test/pagy/frontend_test.rb @@ -159,16 +159,8 @@ def i18n_load(*locales) end end - describe '#pagy_get_params and #pagy_massage_params r' do + describe '#pagy_get_params and r' do it 'overrides params' do - overridden = MockApp::Overridden.new(params: { delete_me: 'delete_me', a: 5 }) - pagy = Pagy.new count: 1000, page: 3, params: { b: 4 }, fragment: '#fragment' - assert_output nil, /\[PAGY WARNING\]/ do - _(overridden.pagy_url_for(pagy, 5)).must_equal "/foo?a=5&b=4&page=5&add_me=add_me#fragment" - end - assert_output nil, /\[PAGY WARNING\]/ do - _(overridden.pagy_url_for(pagy, 5, html_escaped: true)).must_equal "/foo?a=5&b=4&page=5&add_me=add_me#fragment" - end app = MockApp.new(params: { delete_me: 'delete_me', a: 5 }) pagy = Pagy.new(count: 1000, page: 3, From 7b519e3785eb2899865df8c867001b51aec5df85 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Thu, 9 Jun 2022 13:14:44 +0700 Subject: [PATCH 09/29] Removed activesupport hard dependency --- .env | 4 ---- docs/api/calendar.md | 2 ++ pagy.gemspec | 4 ---- 3 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index 050153681..000000000 --- a/.env +++ /dev/null @@ -1,4 +0,0 @@ -# VSCode has an issue (https://github.com/microsoft/vscode-remote-release/issues/512), -# and does not see this the way it should, i.e. in the regular docker/.env file -# so we duplicate it here -COMPOSE_PROJECT_NAME=pagy diff --git a/docs/api/calendar.md b/docs/api/calendar.md index 2726b016d..7a4770b11 100644 --- a/docs/api/calendar.md +++ b/docs/api/calendar.md @@ -5,6 +5,8 @@ title: Pagy::Calendar This is a `Pagy` subclass that provides pagination filtering by time: year, quarter, month, week, day (and supports your own [custom time units](#custom-units)). +**Notice**: It requires the `activesupport` gem, which you have to require in your Gemfile only if your app does not use Rails. + **Notice**: The `Pagy::Calendar::*` subclasses provide support for the [calendar extra](../extras/calendar.md) and are meant to be used with standard, non-calendar Pagy classes and never alone (because they could generate a very high number of items per page). The class APIs are documented here, however you should not need to use them directly because they are required and used internally by the extra. ## Overview diff --git a/pagy.gemspec b/pagy.gemspec index 45fed5544..36629757c 100644 --- a/pagy.gemspec +++ b/pagy.gemspec @@ -20,9 +20,5 @@ Gem::Specification.new do |s| 'bug_tracker_uri' => 'https://github.com/ddnexus/pagy/issues', 'changelog_uri' => 'https://github.com/ddnexus/pagy/blob/master/CHANGELOG.md', 'live_support' => 'https://gitter.im/ruby-pagy/Lobby' } - # Avoid breaking changes for the rare apps that use Pagy::Calendar without Rails - # It will be removed and replaced by a simple requirement in the calendar doc in Pagy 6.0 - # because it is only used by the calendar extra, and it's not a core dependency - s.add_dependency('activesupport') s.required_ruby_version = '>= 2.5' end From 16a1519e798fbf691e5fc045dc3a4a11fd44b68f Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Thu, 9 Jun 2022 15:49:37 +0700 Subject: [PATCH 10/29] Removed deprecated support for Time instances --- e2e/pagy_app.ru | 4 +- e2e/snapshots.js | 350 +-- lib/pagy/calendar.rb | 7 +- lib/pagy/calendar/day.rb | 2 +- lib/pagy/calendar/week.rb | 2 +- test/files/calendar_collection.yml | 2526 +++++++++++++---- test/mock_helpers/app.rb | 2 +- test/mock_helpers/collection.rb | 32 +- test/pagy/calendar_test.rb | 4 - .../pagy/extras/frontend_helpers_json_test.rb | 6 +- test/pagy/extras/frontend_helpers_oj_test.rb | 6 +- test/pagy/extras/i18n_calendar_extra_test.rb | 6 +- test/pagy/extras/overflow_test.rb | 5 +- 13 files changed, 2237 insertions(+), 715 deletions(-) diff --git a/e2e/pagy_app.ru b/e2e/pagy_app.ru index 270d5dbe7..386e64942 100644 --- a/e2e/pagy_app.ru +++ b/e2e/pagy_app.ru @@ -57,11 +57,11 @@ class PagyApp < Sinatra::Base end def pagy_calendar_period(collection) - collection.minmax.map { |t| t.getlocal(0) } # 0 utc_offset means 00:00 local time + collection.minmax end def pagy_calendar_filter(collection, from, to) - collection.select_page_of_records(from.utc, to.utc) # storage in UTC + collection.select_page_of_records(from, to) # storage in UTC end get("/#{PAGY_JS}") do diff --git a/e2e/snapshots.js b/e2e/snapshots.js index cd8b8a1c4..964da29fe 100644 --- a/e2e/snapshots.js +++ b/e2e/snapshots.js @@ -1,423 +1,423 @@ module.exports = { "Test all calendar navs for all styles": { "Test /bootstrap-calendar #nav": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bootstrap-calendar #nav-js": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bootstrap-calendar #nav-js-responsive (500 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bootstrap-calendar #nav-js-responsive (750 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bootstrap-calendar #nav-js-responsive (1000 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bulma-calendar #nav": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bulma-calendar #nav-js": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bulma-calendar #nav-js-responsive (500 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bulma-calendar #nav-js-responsive (750 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /bulma-calendar #nav-js-responsive (1000 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /foundation-calendar #nav": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /foundation-calendar #nav-js": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /foundation-calendar #nav-js-responsive (500 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /foundation-calendar #nav-js-responsive (750 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /foundation-calendar #nav-js-responsive (1000 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /materialize-calendar #nav": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
    \n
  • chevron_left
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • 2022-03
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • \n
  • 2023-08
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
" }, "Test /materialize-calendar #nav-js": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
    \n
  • chevron_left
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • 2022-03
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • \n
  • 2023-08
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
" }, "Test /materialize-calendar #nav-js-responsive (500 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
    \n
  • chevron_left
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • 2022-03
  • \n
  • 2022-04
  • \n
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • \n
  • 2023-08
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • \n
  • 2023-07
  • \n
  • 2023-08
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
" }, "Test /materialize-calendar #nav-js-responsive (750 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
    \n
  • chevron_left
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • 2022-03
  • \n
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • 2022-03
  • \n
  • 2022-04
  • \n
  • 2022-05
  • \n
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • \n
  • 2023-07
  • \n
  • 2023-08
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • \n
  • 2023-06
  • \n
  • 2023-07
  • \n
  • 2023-08
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
" }, "Test /materialize-calendar #nav-js-responsive (1000 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
    \n
  • chevron_left
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • 2022-03
  • \n
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • 2022-01
  • \n
  • 2022-02
  • \n
  • 2022-03
  • \n
  • 2022-04
  • \n
  • 2022-05
  • \n
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • \n
  • 2023-07
  • \n
  • 2023-08
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n
    \n
  • chevron_left\n
  • \n
  • 2021-10
  • \n
  • 2021-11
  • \n
  • 2021-12
  • \n
  • \n
  • 2023-06
  • \n
  • 2023-07
  • \n
  • 2023-08
  • \n
  • 2023-09
  • \n
  • 2023-10
  • \n
  • 2023-11
  • \n
  • chevron_right
  • \n
\n
" }, "Test /navs-calendar #nav": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /navs-calendar #nav-js": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /navs-calendar #nav-js-responsive (500 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /navs-calendar #nav-js-responsive (750 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /navs-calendar #nav-js-responsive (1000 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /semantic-calendar #nav": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
2021-102021-112021-12\n
2023-11\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
2021-102021-112021-122022-01\n
2023-11\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
2021-102021-112021-122022-012022-022022-03\n
2023-11\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
2021-10\n
2023-092023-102023-11\n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
2021-10\n
2023-082023-092023-102023-11\n
" }, "Test /semantic-calendar #nav-js": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
2021-102021-112021-12\n
2023-11\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n 2021-102021-112021-122022-01\n
2023-11\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n 2021-102021-112021-122022-012022-022022-03\n
2023-11\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n 2021-10\n
2023-092023-102023-11\n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n 2021-10\n
2023-082023-092023-102023-11\n
" }, "Test /semantic-calendar #nav-js-responsive (500 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
2021-102021-112021-122022-01\n
2023-11\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n 2021-102021-112021-122022-012022-02\n
2023-11\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n 2021-102021-112021-122022-012022-022022-032022-04\n
2023-11\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n 2021-10\n
2023-082023-092023-102023-11\n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n 2021-10\n
2023-072023-082023-092023-102023-11\n
" }, "Test /semantic-calendar #nav-js-responsive (750 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
2021-102021-112021-122022-012022-02\n
2023-102023-11\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n 2021-102021-112021-122022-012022-022022-03\n
2023-102023-11\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n 2021-102021-112021-122022-012022-022022-032022-042022-05\n
2023-102023-11\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n 2021-102021-11\n
2023-072023-082023-092023-102023-11\n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n 2021-102021-11\n
2023-062023-072023-082023-092023-102023-11\n
" }, "Test /semantic-calendar #nav-js-responsive (1000 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "
\n
2021-102021-112021-122022-012022-02\n
2023-092023-102023-11\n
", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "
\n 2021-102021-112021-122022-012022-022022-03\n
2023-092023-102023-11\n
", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "
\n 2021-102021-112021-122022-012022-022022-032022-042022-05\n
2023-092023-102023-11\n
", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "
\n 2021-102021-112021-12\n
2023-072023-082023-092023-102023-11\n
\n
", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "
\n 2021-102021-112021-12\n
2023-062023-072023-082023-092023-102023-11\n
" }, "Test /uikit-calendar #nav": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /uikit-calendar #nav-js": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /uikit-calendar #nav-js-responsive (500 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /uikit-calendar #nav-js-responsive (750 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" }, "Test /uikit-calendar #nav-js-responsive (1000 width)": { - "1": "
2021-10-21 13:18:23 UTC | 2021-10-21 23:14:50 UTC | 2021-10-23\n 01:06:02 UTC | 2021-10-25 18:54:35 UTC | 2021-10-26 02:22:17 UTC | 2021-10-28\n 22:59:49 UTC | 2021-10-30 15:02:25 UTC
", + "1": "
2021-10-21 13:18:23 +0000 | 2021-10-21 23:14:50 +0000 |\n 2021-10-23 01:06:02 +0000 | 2021-10-25 18:54:35 +0000 | 2021-10-26 02:22:17\n +0000 | 2021-10-28 22:59:49 +0000 | 2021-10-30 15:02:25 +0000
", "2": "", - "3": "
2021-11-02 04:03:39 UTC | 2021-11-04 22:41:23 UTC | 2021-11-06\n 00:34:29 UTC | 2021-11-06 23:56:16 UTC | 2021-11-07 06:22:04 UTC | 2021-11-07\n 19:46:08 UTC | 2021-11-08 09:31:13 UTC | 2021-11-09 17:22:03 UTC | 2021-11-11\n 05:29:54 UTC | 2021-11-13 09:41:04 UTC | 2021-11-16 07:48:22 UTC | 2021-11-16\n 12:43:44 UTC | 2021-11-17 16:03:07 UTC | 2021-11-20 02:39:01 UTC | 2021-11-21\n 02:01:24 UTC | 2021-11-23 19:24:43 UTC | 2021-11-26 11:47:22 UTC | 2021-11-28\n 06:30:04 UTC
", + "3": "
2021-11-02 04:03:39 +0000 | 2021-11-04 22:41:23 +0000 |\n 2021-11-06 00:34:29 +0000 | 2021-11-06 23:56:16 +0000 | 2021-11-07 06:22:04\n +0000 | 2021-11-07 19:46:08 +0000 | 2021-11-08 09:31:13 +0000 | 2021-11-09\n 17:22:03 +0000 | 2021-11-11 05:29:54 +0000 | 2021-11-13 09:41:04 +0000 |\n 2021-11-16 07:48:22 +0000 | 2021-11-16 12:43:44 +0000 | 2021-11-17 16:03:07\n +0000 | 2021-11-20 02:39:01 +0000 | 2021-11-21 02:01:24 +0000 | 2021-11-23\n 19:24:43 +0000 | 2021-11-26 11:47:22 +0000 | 2021-11-28 06:30:04 +0000
", "4": "", - "5": "
2022-01-01 19:18:06 UTC | 2022-01-03 08:36:27 UTC | 2022-01-03\n 23:31:01 UTC | 2022-01-05 02:14:57 UTC | 2022-01-06 09:26:03 UTC | 2022-01-07\n 20:22:22 UTC | 2022-01-10 04:04:28 UTC | 2022-01-11 17:17:55 UTC | 2022-01-14\n 05:21:54 UTC | 2022-01-16 01:18:58 UTC | 2022-01-18 08:42:56 UTC | 2022-01-19\n 00:45:04 UTC | 2022-01-20 08:18:54 UTC | 2022-01-22 05:26:38 UTC | 2022-01-24\n 10:57:50 UTC | 2022-01-26 09:47:02 UTC | 2022-01-28 20:44:30 UTC | 2022-01-31\n 16:19:50 UTC
", + "5": "
2022-01-01 19:18:06 +0000 | 2022-01-03 08:36:27 +0000 |\n 2022-01-03 23:31:01 +0000 | 2022-01-05 02:14:57 +0000 | 2022-01-06 09:26:03\n +0000 | 2022-01-07 20:22:22 +0000 | 2022-01-10 04:04:28 +0000 | 2022-01-11\n 17:17:55 +0000 | 2022-01-14 05:21:54 +0000 | 2022-01-16 01:18:58 +0000 |\n 2022-01-18 08:42:56 +0000 | 2022-01-19 00:45:04 +0000 | 2022-01-20 08:18:54\n +0000 | 2022-01-22 05:26:38 +0000 | 2022-01-24 10:57:50 +0000 | 2022-01-26\n 09:47:02 +0000 | 2022-01-28 20:44:30 +0000 | 2022-01-31 16:19:50 +0000
", "6": "", - "7": "
2023-11-02 02:52:55 UTC | 2023-11-02 06:00:32 UTC | 2023-11-03\n 08:39:06 UTC | 2023-11-04 23:51:22 UTC | 2023-11-07 16:11:33 UTC | 2023-11-10\n 10:55:29 UTC | 2023-11-12 01:20:18 UTC | 2023-11-12 04:22:50 UTC | 2023-11-12\n 08:38:58 UTC | 2023-11-13 15:43:40 UTC
", + "7": "
2023-11-02 02:52:55 +0000 | 2023-11-02 06:00:32 +0000 |\n 2023-11-03 08:39:06 +0000 | 2023-11-04 23:51:22 +0000 | 2023-11-07 16:11:33\n +0000 | 2023-11-10 10:55:29 +0000 | 2023-11-12 01:20:18 +0000 | 2023-11-12\n 04:22:50 +0000 | 2023-11-12 08:38:58 +0000 | 2023-11-13 15:43:40 +0000
", "8": "", - "9": "
2023-10-01 11:54:24 UTC | 2023-10-03 07:36:32 UTC | 2023-10-05\n 05:13:57 UTC | 2023-10-06 16:07:06 UTC | 2023-10-09 00:03:52 UTC | 2023-10-09\n 02:32:01 UTC | 2023-10-10 16:39:07 UTC | 2023-10-12 13:28:16 UTC | 2023-10-14\n 04:29:14 UTC | 2023-10-17 03:30:24 UTC | 2023-10-20 03:13:15 UTC | 2023-10-20\n 20:47:06 UTC | 2023-10-21 13:59:34 UTC | 2023-10-23 21:38:48 UTC | 2023-10-24\n 06:07:13 UTC | 2023-10-25 22:51:17 UTC | 2023-10-26 21:12:50 UTC | 2023-10-28\n 05:52:20 UTC | 2023-10-29 22:11:01 UTC | 2023-10-30 12:29:25 UTC
", + "9": "
2023-10-01 11:54:24 +0000 | 2023-10-03 07:36:32 +0000 |\n 2023-10-05 05:13:57 +0000 | 2023-10-06 16:07:06 +0000 | 2023-10-09 00:03:52\n +0000 | 2023-10-09 02:32:01 +0000 | 2023-10-10 16:39:07 +0000 | 2023-10-12\n 13:28:16 +0000 | 2023-10-14 04:29:14 +0000 | 2023-10-17 03:30:24 +0000 |\n 2023-10-20 03:13:15 +0000 | 2023-10-20 20:47:06 +0000 | 2023-10-21 13:59:34\n +0000 | 2023-10-23 21:38:48 +0000 | 2023-10-24 06:07:13 +0000 | 2023-10-25\n 22:51:17 +0000 | 2023-10-26 21:12:50 +0000 | 2023-10-28 05:52:20 +0000 |\n 2023-10-29 22:11:01 +0000 | 2023-10-30 12:29:25 +0000
", "10": "" } }, diff --git a/lib/pagy/calendar.rb b/lib/pagy/calendar.rb index 64da94b12..8256738a2 100644 --- a/lib/pagy/calendar.rb +++ b/lib/pagy/calendar.rb @@ -63,10 +63,9 @@ def setup_unit_vars unless %i[asc desc].include?(@order = @vars[:order]) @starting, @ending = @vars[:period] - raise VariableError.new(self, :period, 'to be a an Array of min and max local Time instances', @vars[:period]) \ - unless @starting.is_a?(Time) && @ending.is_a?(Time) && !@starting.utc? && !@ending.utc? && @starting <= @ending - - @with_zone = @starting.is_a?(ActiveSupport::TimeWithZone) # remove in 6.0 and replace Time in the line above + raise VariableError.new(self, :period, 'to be a an Array of min and max TimeWithZone instances', @vars[:period]) \ + unless @starting.is_a?(ActiveSupport::TimeWithZone) \ + && @ending.is_a?(ActiveSupport::TimeWithZone) && @starting <= @ending end # Apply the strftime format to the time (overridden by the i18n extra when localization is required) diff --git a/lib/pagy/calendar/day.rb b/lib/pagy/calendar/day.rb index 6c99ae99b..ecd29e5c8 100644 --- a/lib/pagy/calendar/day.rb +++ b/lib/pagy/calendar/day.rb @@ -32,7 +32,7 @@ def page_offset_at(time) private def page_offset(time_a, time_b) # remove in 6.0 - (@with_zone ? (time_b.time - time_a.time) : (time_b - time_a)).to_i / 1.day + (time_b.time - time_a.time).to_i / 1.day end end end diff --git a/lib/pagy/calendar/week.rb b/lib/pagy/calendar/week.rb index 73266d199..d84fa1b43 100644 --- a/lib/pagy/calendar/week.rb +++ b/lib/pagy/calendar/week.rb @@ -37,7 +37,7 @@ def page_offset_at(time) private def page_offset(time_a, time_b) # remove in 6.0 - (@with_zone ? (time_b.time - time_a.time) : (time_b - time_a)).to_i / 1.week + (time_b.time - time_a.time).to_i / 1.week end end end diff --git a/test/files/calendar_collection.yml b/test/files/calendar_collection.yml index ec6b9806f..3bf83b941 100644 --- a/test/files/calendar_collection.yml +++ b/test/files/calendar_collection.yml @@ -1,506 +1,2022 @@ --- -- 2021-10-21 13:18:23.000000000 Z -- 2021-10-21 23:14:50.000000000 Z -- 2021-10-23 01:06:02.000000000 Z -- 2021-10-25 18:54:35.000000000 Z -- 2021-10-26 02:22:17.000000000 Z -- 2021-10-28 22:59:49.000000000 Z -- 2021-10-30 15:02:25.000000000 Z -- 2021-11-02 04:03:39.000000000 Z -- 2021-11-04 22:41:23.000000000 Z -- 2021-11-06 00:34:29.000000000 Z -- 2021-11-06 23:56:16.000000000 Z -- 2021-11-07 06:22:04.000000000 Z -- 2021-11-07 19:46:08.000000000 Z -- 2021-11-08 09:31:13.000000000 Z -- 2021-11-09 17:22:03.000000000 Z -- 2021-11-11 05:29:54.000000000 Z -- 2021-11-13 09:41:04.000000000 Z -- 2021-11-16 07:48:22.000000000 Z -- 2021-11-16 12:43:44.000000000 Z -- 2021-11-17 16:03:07.000000000 Z -- 2021-11-20 02:39:01.000000000 Z -- 2021-11-21 02:01:24.000000000 Z -- 2021-11-23 19:24:43.000000000 Z -- 2021-11-26 11:47:22.000000000 Z -- 2021-11-28 06:30:04.000000000 Z -- 2021-12-01 00:13:55.000000000 Z -- 2021-12-03 19:10:16.000000000 Z -- 2021-12-04 00:43:47.000000000 Z -- 2021-12-06 20:15:35.000000000 Z -- 2021-12-09 16:27:07.000000000 Z -- 2021-12-10 15:28:48.000000000 Z -- 2021-12-10 23:08:16.000000000 Z -- 2021-12-11 23:09:08.000000000 Z -- 2021-12-14 04:56:58.000000000 Z -- 2021-12-14 14:00:56.000000000 Z -- 2021-12-15 22:58:51.000000000 Z -- 2021-12-16 01:28:21.000000000 Z -- 2021-12-16 20:16:54.000000000 Z -- 2021-12-19 00:34:04.000000000 Z -- 2021-12-19 06:58:41.000000000 Z -- 2021-12-21 11:13:53.000000000 Z -- 2021-12-23 07:28:50.000000000 Z -- 2021-12-23 07:57:58.000000000 Z -- 2021-12-23 18:32:13.000000000 Z -- 2021-12-24 01:17:51.000000000 Z -- 2021-12-25 05:36:16.000000000 Z -- 2021-12-25 23:21:57.000000000 Z -- 2021-12-27 12:18:57.000000000 Z -- 2021-12-28 16:59:57.000000000 Z -- 2021-12-31 15:10:23.000000000 Z -- 2022-01-01 19:18:06.000000000 Z -- 2022-01-03 08:36:27.000000000 Z -- 2022-01-03 23:31:01.000000000 Z -- 2022-01-05 02:14:57.000000000 Z -- 2022-01-06 09:26:03.000000000 Z -- 2022-01-07 20:22:22.000000000 Z -- 2022-01-10 04:04:28.000000000 Z -- 2022-01-11 17:17:55.000000000 Z -- 2022-01-14 05:21:54.000000000 Z -- 2022-01-16 01:18:58.000000000 Z -- 2022-01-18 08:42:56.000000000 Z -- 2022-01-19 00:45:04.000000000 Z -- 2022-01-20 08:18:54.000000000 Z -- 2022-01-22 05:26:38.000000000 Z -- 2022-01-24 10:57:50.000000000 Z -- 2022-01-26 09:47:02.000000000 Z -- 2022-01-28 20:44:30.000000000 Z -- 2022-01-31 16:19:50.000000000 Z -- 2022-02-01 21:23:58.000000000 Z -- 2022-02-04 14:41:57.000000000 Z -- 2022-02-06 20:40:06.000000000 Z -- 2022-02-07 23:03:50.000000000 Z -- 2022-02-09 05:28:08.000000000 Z -- 2022-02-10 02:19:12.000000000 Z -- 2022-02-11 07:51:30.000000000 Z -- 2022-02-12 13:46:16.000000000 Z -- 2022-02-13 21:06:40.000000000 Z -- 2022-02-15 11:37:50.000000000 Z -- 2022-02-18 11:23:15.000000000 Z -- 2022-02-20 08:01:49.000000000 Z -- 2022-02-23 03:00:30.000000000 Z -- 2022-02-24 21:52:25.000000000 Z -- 2022-02-25 12:07:56.000000000 Z -- 2022-02-27 04:20:20.000000000 Z -- 2022-02-28 21:09:42.000000000 Z -- 2022-03-02 23:35:41.000000000 Z -- 2022-03-04 00:42:10.000000000 Z -- 2022-03-05 00:59:10.000000000 Z -- 2022-03-06 19:58:01.000000000 Z -- 2022-03-07 07:48:09.000000000 Z -- 2022-03-09 06:08:00.000000000 Z -- 2022-03-10 05:45:08.000000000 Z -- 2022-03-12 21:16:31.000000000 Z -- 2022-03-15 08:17:44.000000000 Z -- 2022-03-16 03:37:03.000000000 Z -- 2022-03-18 05:07:54.000000000 Z -- 2022-03-20 04:05:26.000000000 Z -- 2022-03-22 10:52:33.000000000 Z -- 2022-03-23 15:26:54.000000000 Z -- 2022-03-24 09:01:04.000000000 Z -- 2022-03-24 23:53:07.000000000 Z -- 2022-03-27 13:45:17.000000000 Z -- 2022-03-28 19:57:00.000000000 Z -- 2022-03-29 15:42:35.000000000 Z -- 2022-03-29 18:20:32.000000000 Z -- 2022-04-01 15:35:47.000000000 Z -- 2022-04-02 06:33:31.000000000 Z -- 2022-04-03 18:27:19.000000000 Z -- 2022-04-03 23:44:08.000000000 Z -- 2022-04-06 10:59:32.000000000 Z -- 2022-04-07 01:33:53.000000000 Z -- 2022-04-08 10:26:34.000000000 Z -- 2022-04-10 19:21:08.000000000 Z -- 2022-04-12 01:50:04.000000000 Z -- 2022-04-14 19:56:29.000000000 Z -- 2022-04-15 09:08:22.000000000 Z -- 2022-04-16 07:58:47.000000000 Z -- 2022-04-17 16:31:40.000000000 Z -- 2022-04-20 09:50:22.000000000 Z -- 2022-04-23 04:24:22.000000000 Z -- 2022-04-25 07:18:04.000000000 Z -- 2022-04-27 16:57:48.000000000 Z -- 2022-04-29 18:48:09.000000000 Z -- 2022-04-29 20:30:25.000000000 Z -- 2022-05-02 03:44:25.000000000 Z -- 2022-05-03 15:27:57.000000000 Z -- 2022-05-04 08:11:15.000000000 Z -- 2022-05-07 00:42:14.000000000 Z -- 2022-05-09 15:23:31.000000000 Z -- 2022-05-10 19:11:49.000000000 Z -- 2022-05-11 14:04:17.000000000 Z -- 2022-05-14 12:09:34.000000000 Z -- 2022-05-15 13:31:54.000000000 Z -- 2022-05-17 21:21:37.000000000 Z -- 2022-05-19 01:27:43.000000000 Z -- 2022-05-21 04:34:59.000000000 Z -- 2022-05-23 11:05:18.000000000 Z -- 2022-05-23 19:14:50.000000000 Z -- 2022-05-26 13:16:18.000000000 Z -- 2022-05-27 11:39:35.000000000 Z -- 2022-05-29 07:09:07.000000000 Z -- 2022-05-30 15:13:23.000000000 Z -- 2022-06-01 04:18:40.000000000 Z -- 2022-06-01 11:11:51.000000000 Z -- 2022-06-01 12:45:06.000000000 Z -- 2022-06-03 07:08:31.000000000 Z -- 2022-06-04 23:28:11.000000000 Z -- 2022-06-07 12:14:01.000000000 Z -- 2022-06-08 13:32:22.000000000 Z -- 2022-06-10 18:56:37.000000000 Z -- 2022-06-12 16:00:09.000000000 Z -- 2022-06-15 13:28:55.000000000 Z -- 2022-06-16 18:42:37.000000000 Z -- 2022-06-17 00:36:21.000000000 Z -- 2022-06-18 16:21:27.000000000 Z -- 2022-06-20 13:50:27.000000000 Z -- 2022-06-22 09:43:55.000000000 Z -- 2022-06-25 09:43:17.000000000 Z -- 2022-06-27 06:51:01.000000000 Z -- 2022-06-28 09:10:53.000000000 Z -- 2022-06-30 18:46:16.000000000 Z -- 2022-07-01 16:05:14.000000000 Z -- 2022-07-02 14:02:12.000000000 Z -- 2022-07-05 11:08:11.000000000 Z -- 2022-07-05 12:44:38.000000000 Z -- 2022-07-08 03:55:17.000000000 Z -- 2022-07-08 18:02:14.000000000 Z -- 2022-07-09 09:41:17.000000000 Z -- 2022-07-11 07:34:51.000000000 Z -- 2022-07-13 05:11:19.000000000 Z -- 2022-07-15 02:46:56.000000000 Z -- 2022-07-16 15:40:39.000000000 Z -- 2022-07-17 19:44:15.000000000 Z -- 2022-07-19 00:31:12.000000000 Z -- 2022-07-21 21:58:24.000000000 Z -- 2022-07-22 05:25:48.000000000 Z -- 2022-07-22 18:33:04.000000000 Z -- 2022-07-24 07:42:24.000000000 Z -- 2022-07-25 07:21:20.000000000 Z -- 2022-07-27 12:02:44.000000000 Z -- 2022-07-29 03:29:28.000000000 Z -- 2022-07-29 11:35:43.000000000 Z -- 2022-07-30 05:25:21.000000000 Z -- 2022-07-30 19:39:10.000000000 Z -- 2022-07-31 18:54:58.000000000 Z -- 2022-08-03 11:18:44.000000000 Z -- 2022-08-05 00:37:47.000000000 Z -- 2022-08-05 12:08:08.000000000 Z -- 2022-08-07 14:39:19.000000000 Z -- 2022-08-08 09:52:59.000000000 Z -- 2022-08-09 13:48:29.000000000 Z -- 2022-08-11 19:03:04.000000000 Z -- 2022-08-13 01:56:49.000000000 Z -- 2022-08-15 11:33:09.000000000 Z -- 2022-08-17 23:37:45.000000000 Z -- 2022-08-19 00:47:19.000000000 Z -- 2022-08-19 01:01:12.000000000 Z -- 2022-08-21 07:37:55.000000000 Z -- 2022-08-21 21:42:15.000000000 Z -- 2022-08-23 10:55:39.000000000 Z -- 2022-08-25 16:20:29.000000000 Z -- 2022-08-27 06:28:14.000000000 Z -- 2022-08-27 13:12:57.000000000 Z -- 2022-08-28 23:00:13.000000000 Z -- 2022-08-31 05:19:56.000000000 Z -- 2022-09-02 18:00:18.000000000 Z -- 2022-09-04 12:02:47.000000000 Z -- 2022-09-06 00:57:21.000000000 Z -- 2022-09-08 04:26:01.000000000 Z -- 2022-09-09 04:55:45.000000000 Z -- 2022-09-11 22:59:36.000000000 Z -- 2022-09-12 00:54:25.000000000 Z -- 2022-09-12 17:44:24.000000000 Z -- 2022-09-12 20:47:30.000000000 Z -- 2022-09-15 11:39:20.000000000 Z -- 2022-09-16 07:54:15.000000000 Z -- 2022-09-17 08:06:29.000000000 Z -- 2022-09-18 07:17:17.000000000 Z -- 2022-09-19 08:39:55.000000000 Z -- 2022-09-22 06:32:56.000000000 Z -- 2022-09-22 21:26:29.000000000 Z -- 2022-09-24 16:06:50.000000000 Z -- 2022-09-27 05:50:18.000000000 Z -- 2022-09-28 12:12:13.000000000 Z -- 2022-09-29 21:13:01.000000000 Z -- 2022-09-30 00:09:29.000000000 Z -- 2022-10-02 04:35:07.000000000 Z -- 2022-10-02 16:30:20.000000000 Z -- 2022-10-04 10:35:59.000000000 Z -- 2022-10-04 23:39:37.000000000 Z -- 2022-10-07 23:25:10.000000000 Z -- 2022-10-08 20:31:14.000000000 Z -- 2022-10-09 07:30:41.000000000 Z -- 2022-10-11 07:29:41.000000000 Z -- 2022-10-11 08:00:58.000000000 Z -- 2022-10-14 03:22:26.000000000 Z -- 2022-10-16 14:47:54.000000000 Z -- 2022-10-17 00:28:32.000000000 Z -- 2022-10-19 10:46:33.000000000 Z -- 2022-10-21 02:39:31.000000000 Z -- 2022-10-21 19:24:24.000000000 Z -- 2022-10-23 05:38:26.000000000 Z -- 2022-10-25 13:28:28.000000000 Z -- 2022-10-26 20:26:31.000000000 Z -- 2022-10-29 12:43:40.000000000 Z -- 2022-10-31 11:21:43.000000000 Z -- 2022-11-03 04:42:32.000000000 Z -- 2022-11-04 20:26:28.000000000 Z -- 2022-11-05 15:08:01.000000000 Z -- 2022-11-06 10:55:38.000000000 Z -- 2022-11-07 04:13:28.000000000 Z -- 2022-11-08 03:42:59.000000000 Z -- 2022-11-10 13:56:10.000000000 Z -- 2022-11-13 13:01:38.000000000 Z -- 2022-11-15 02:04:32.000000000 Z -- 2022-11-17 09:10:48.000000000 Z -- 2022-11-19 11:37:01.000000000 Z -- 2022-11-20 06:15:33.000000000 Z -- 2022-11-22 08:35:41.000000000 Z -- 2022-11-24 20:42:50.000000000 Z -- 2022-11-25 17:45:48.000000000 Z -- 2022-11-28 06:16:15.000000000 Z -- 2022-11-28 18:12:24.000000000 Z -- 2022-11-30 20:09:46.000000000 Z -- 2022-12-01 03:29:43.000000000 Z -- 2022-12-02 03:58:02.000000000 Z -- 2022-12-02 19:47:06.000000000 Z -- 2022-12-04 14:54:02.000000000 Z -- 2022-12-06 02:22:58.000000000 Z -- 2022-12-06 09:29:06.000000000 Z -- 2022-12-06 17:16:19.000000000 Z -- 2022-12-09 14:10:12.000000000 Z -- 2022-12-11 19:54:41.000000000 Z -- 2022-12-11 23:48:45.000000000 Z -- 2022-12-12 12:05:28.000000000 Z -- 2022-12-12 21:37:48.000000000 Z -- 2022-12-15 05:08:10.000000000 Z -- 2022-12-16 19:06:39.000000000 Z -- 2022-12-18 21:49:36.000000000 Z -- 2022-12-20 00:54:09.000000000 Z -- 2022-12-22 21:51:31.000000000 Z -- 2022-12-25 08:40:02.000000000 Z -- 2022-12-26 22:01:45.000000000 Z -- 2022-12-29 18:46:07.000000000 Z -- 2023-01-01 01:55:31.000000000 Z -- 2023-01-01 17:34:53.000000000 Z -- 2023-01-04 09:05:13.000000000 Z -- 2023-01-05 01:57:33.000000000 Z -- 2023-01-06 08:56:47.000000000 Z -- 2023-01-07 18:52:12.000000000 Z -- 2023-01-08 00:43:40.000000000 Z -- 2023-01-10 13:28:23.000000000 Z -- 2023-01-13 10:22:38.000000000 Z -- 2023-01-15 01:43:06.000000000 Z -- 2023-01-15 04:30:52.000000000 Z -- 2023-01-16 23:13:04.000000000 Z -- 2023-01-19 17:16:31.000000000 Z -- 2023-01-21 09:25:58.000000000 Z -- 2023-01-23 09:42:42.000000000 Z -- 2023-01-24 11:13:59.000000000 Z -- 2023-01-25 00:57:26.000000000 Z -- 2023-01-27 10:31:18.000000000 Z -- 2023-01-28 07:08:54.000000000 Z -- 2023-01-28 09:46:16.000000000 Z -- 2023-01-30 04:34:32.000000000 Z -- 2023-01-30 05:30:26.000000000 Z -- 2023-01-31 08:08:44.000000000 Z -- 2023-02-03 01:02:02.000000000 Z -- 2023-02-03 10:02:38.000000000 Z -- 2023-02-05 02:22:53.000000000 Z -- 2023-02-05 05:55:46.000000000 Z -- 2023-02-07 06:18:28.000000000 Z -- 2023-02-08 13:57:28.000000000 Z -- 2023-02-08 17:53:12.000000000 Z -- 2023-02-10 08:40:27.000000000 Z -- 2023-02-10 10:28:23.000000000 Z -- 2023-02-12 15:42:42.000000000 Z -- 2023-02-14 06:11:35.000000000 Z -- 2023-02-14 12:22:06.000000000 Z -- 2023-02-16 14:43:29.000000000 Z -- 2023-02-16 15:58:19.000000000 Z -- 2023-02-17 08:36:37.000000000 Z -- 2023-02-19 04:20:36.000000000 Z -- 2023-02-21 03:27:07.000000000 Z -- 2023-02-22 09:09:23.000000000 Z -- 2023-02-24 10:19:14.000000000 Z -- 2023-02-26 13:28:50.000000000 Z -- 2023-02-27 15:33:38.000000000 Z -- 2023-03-01 14:48:42.000000000 Z -- 2023-03-02 19:17:52.000000000 Z -- 2023-03-03 09:48:41.000000000 Z -- 2023-03-04 12:44:18.000000000 Z -- 2023-03-06 18:24:47.000000000 Z -- 2023-03-09 13:55:36.000000000 Z -- 2023-03-11 13:50:26.000000000 Z -- 2023-03-14 05:57:47.000000000 Z -- 2023-03-14 09:16:38.000000000 Z -- 2023-03-14 12:34:22.000000000 Z -- 2023-03-14 15:15:53.000000000 Z -- 2023-03-16 18:34:04.000000000 Z -- 2023-03-19 13:01:38.000000000 Z -- 2023-03-19 15:24:32.000000000 Z -- 2023-03-20 14:56:28.000000000 Z -- 2023-03-21 12:32:45.000000000 Z -- 2023-03-23 22:16:22.000000000 Z -- 2023-03-24 01:05:24.000000000 Z -- 2023-03-26 12:01:36.000000000 Z -- 2023-03-29 07:45:17.000000000 Z -- 2023-04-01 06:03:31.000000000 Z -- 2023-04-02 20:45:43.000000000 Z -- 2023-04-03 05:33:10.000000000 Z -- 2023-04-03 16:15:11.000000000 Z -- 2023-04-05 14:56:49.000000000 Z -- 2023-04-06 22:21:46.000000000 Z -- 2023-04-08 19:50:51.000000000 Z -- 2023-04-09 06:14:30.000000000 Z -- 2023-04-09 11:26:27.000000000 Z -- 2023-04-11 21:34:04.000000000 Z -- 2023-04-14 08:51:06.000000000 Z -- 2023-04-16 15:58:05.000000000 Z -- 2023-04-17 03:06:43.000000000 Z -- 2023-04-18 16:28:30.000000000 Z -- 2023-04-18 17:32:38.000000000 Z -- 2023-04-19 20:34:45.000000000 Z -- 2023-04-22 06:16:01.000000000 Z -- 2023-04-22 12:00:25.000000000 Z -- 2023-04-24 21:12:27.000000000 Z -- 2023-04-27 15:19:36.000000000 Z -- 2023-04-29 00:43:46.000000000 Z -- 2023-04-29 17:50:02.000000000 Z -- 2023-04-30 05:22:14.000000000 Z -- 2023-05-01 07:20:17.000000000 Z -- 2023-05-03 05:11:16.000000000 Z -- 2023-05-05 00:13:31.000000000 Z -- 2023-05-05 12:08:33.000000000 Z -- 2023-05-05 16:26:19.000000000 Z -- 2023-05-07 23:53:00.000000000 Z -- 2023-05-10 17:41:27.000000000 Z -- 2023-05-12 01:37:24.000000000 Z -- 2023-05-14 08:18:36.000000000 Z -- 2023-05-16 15:17:43.000000000 Z -- 2023-05-16 18:24:55.000000000 Z -- 2023-05-19 16:16:45.000000000 Z -- 2023-05-21 00:48:36.000000000 Z -- 2023-05-22 00:54:41.000000000 Z -- 2023-05-24 05:36:25.000000000 Z -- 2023-05-25 10:05:39.000000000 Z -- 2023-05-26 16:09:51.000000000 Z -- 2023-05-29 12:40:29.000000000 Z -- 2023-05-29 13:15:05.000000000 Z -- 2023-05-31 15:28:14.000000000 Z -- 2023-06-02 02:05:21.000000000 Z -- 2023-06-02 13:05:50.000000000 Z -- 2023-06-04 11:12:19.000000000 Z -- 2023-06-05 10:04:34.000000000 Z -- 2023-06-06 02:47:22.000000000 Z -- 2023-06-07 04:35:17.000000000 Z -- 2023-06-07 16:20:27.000000000 Z -- 2023-06-08 07:43:14.000000000 Z -- 2023-06-10 17:55:59.000000000 Z -- 2023-06-12 17:00:02.000000000 Z -- 2023-06-14 08:37:14.000000000 Z -- 2023-06-14 18:07:30.000000000 Z -- 2023-06-16 12:07:26.000000000 Z -- 2023-06-18 22:29:39.000000000 Z -- 2023-06-19 02:32:54.000000000 Z -- 2023-06-20 14:24:40.000000000 Z -- 2023-06-22 09:27:59.000000000 Z -- 2023-06-23 07:31:20.000000000 Z -- 2023-06-23 21:06:55.000000000 Z -- 2023-06-26 06:57:28.000000000 Z -- 2023-06-28 17:08:12.000000000 Z -- 2023-06-29 03:06:47.000000000 Z -- 2023-06-30 12:25:41.000000000 Z -- 2023-07-02 08:49:42.000000000 Z -- 2023-07-03 20:09:26.000000000 Z -- 2023-07-06 17:39:13.000000000 Z -- 2023-07-09 00:18:52.000000000 Z -- 2023-07-11 03:58:21.000000000 Z -- 2023-07-12 22:37:00.000000000 Z -- 2023-07-14 01:58:44.000000000 Z -- 2023-07-16 20:21:13.000000000 Z -- 2023-07-17 01:41:47.000000000 Z -- 2023-07-19 10:06:35.000000000 Z -- 2023-07-21 17:44:16.000000000 Z -- 2023-07-22 02:46:04.000000000 Z -- 2023-07-22 06:52:04.000000000 Z -- 2023-07-23 04:53:49.000000000 Z -- 2023-07-25 16:37:24.000000000 Z -- 2023-07-27 18:34:33.000000000 Z -- 2023-07-28 02:34:02.000000000 Z -- 2023-07-29 19:53:32.000000000 Z -- 2023-07-30 23:30:11.000000000 Z -- 2023-08-02 17:46:22.000000000 Z -- 2023-08-03 00:01:21.000000000 Z -- 2023-08-03 03:57:56.000000000 Z -- 2023-08-03 21:41:28.000000000 Z -- 2023-08-04 23:37:31.000000000 Z -- 2023-08-05 08:20:42.000000000 Z -- 2023-08-07 21:01:55.000000000 Z -- 2023-08-10 17:03:47.000000000 Z -- 2023-08-11 21:06:31.000000000 Z -- 2023-08-12 08:45:08.000000000 Z -- 2023-08-13 07:09:39.000000000 Z -- 2023-08-14 11:15:10.000000000 Z -- 2023-08-16 04:15:48.000000000 Z -- 2023-08-19 04:11:43.000000000 Z -- 2023-08-19 10:10:27.000000000 Z -- 2023-08-22 09:41:20.000000000 Z -- 2023-08-24 10:27:08.000000000 Z -- 2023-08-24 18:16:12.000000000 Z -- 2023-08-25 17:02:28.000000000 Z -- 2023-08-27 15:58:52.000000000 Z -- 2023-08-27 23:29:53.000000000 Z -- 2023-08-28 21:31:27.000000000 Z -- 2023-08-29 03:35:29.000000000 Z -- 2023-08-31 06:15:19.000000000 Z -- 2023-09-01 21:56:52.000000000 Z -- 2023-09-02 22:57:53.000000000 Z -- 2023-09-05 03:28:30.000000000 Z -- 2023-09-07 04:57:12.000000000 Z -- 2023-09-09 19:16:05.000000000 Z -- 2023-09-09 20:01:39.000000000 Z -- 2023-09-11 03:23:22.000000000 Z -- 2023-09-12 15:18:29.000000000 Z -- 2023-09-13 14:14:43.000000000 Z -- 2023-09-13 17:37:25.000000000 Z -- 2023-09-14 18:17:49.000000000 Z -- 2023-09-16 19:56:55.000000000 Z -- 2023-09-18 14:21:02.000000000 Z -- 2023-09-21 00:34:13.000000000 Z -- 2023-09-23 07:14:06.000000000 Z -- 2023-09-24 17:22:22.000000000 Z -- 2023-09-27 12:42:54.000000000 Z -- 2023-09-28 14:48:45.000000000 Z -- 2023-10-01 11:54:24.000000000 Z -- 2023-10-03 07:36:32.000000000 Z -- 2023-10-05 05:13:57.000000000 Z -- 2023-10-06 16:07:06.000000000 Z -- 2023-10-09 00:03:52.000000000 Z -- 2023-10-09 02:32:01.000000000 Z -- 2023-10-10 16:39:07.000000000 Z -- 2023-10-12 13:28:16.000000000 Z -- 2023-10-14 04:29:14.000000000 Z -- 2023-10-17 03:30:24.000000000 Z -- 2023-10-20 03:13:15.000000000 Z -- 2023-10-20 20:47:06.000000000 Z -- 2023-10-21 13:59:34.000000000 Z -- 2023-10-23 21:38:48.000000000 Z -- 2023-10-24 06:07:13.000000000 Z -- 2023-10-25 22:51:17.000000000 Z -- 2023-10-26 21:12:50.000000000 Z -- 2023-10-28 05:52:20.000000000 Z -- 2023-10-29 22:11:01.000000000 Z -- 2023-10-30 12:29:25.000000000 Z -- 2023-11-02 02:52:55.000000000 Z -- 2023-11-02 06:00:32.000000000 Z -- 2023-11-03 08:39:06.000000000 Z -- 2023-11-04 23:51:22.000000000 Z -- 2023-11-07 16:11:33.000000000 Z -- 2023-11-10 10:55:29.000000000 Z -- 2023-11-12 01:20:18.000000000 Z -- 2023-11-12 04:22:50.000000000 Z -- 2023-11-12 08:38:58.000000000 Z -- 2023-11-13 15:43:40.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-10-21 13:18:23.000000000 Z + zone: &1 !ruby/object:ActiveSupport::TimeZone + name: GMT + time: 2021-10-21 13:18:23.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-10-21 23:14:50.000000000 Z + zone: *1 + time: 2021-10-21 23:14:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-10-23 01:06:02.000000000 Z + zone: *1 + time: 2021-10-23 01:06:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-10-25 18:54:35.000000000 Z + zone: *1 + time: 2021-10-25 18:54:35.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-10-26 02:22:17.000000000 Z + zone: *1 + time: 2021-10-26 02:22:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-10-28 22:59:49.000000000 Z + zone: *1 + time: 2021-10-28 22:59:49.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-10-30 15:02:25.000000000 Z + zone: *1 + time: 2021-10-30 15:02:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-02 04:03:39.000000000 Z + zone: *1 + time: 2021-11-02 04:03:39.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-04 22:41:23.000000000 Z + zone: *1 + time: 2021-11-04 22:41:23.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-06 00:34:29.000000000 Z + zone: *1 + time: 2021-11-06 00:34:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-06 23:56:16.000000000 Z + zone: *1 + time: 2021-11-06 23:56:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-07 06:22:04.000000000 Z + zone: *1 + time: 2021-11-07 06:22:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-07 19:46:08.000000000 Z + zone: *1 + time: 2021-11-07 19:46:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-08 09:31:13.000000000 Z + zone: *1 + time: 2021-11-08 09:31:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-09 17:22:03.000000000 Z + zone: *1 + time: 2021-11-09 17:22:03.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-11 05:29:54.000000000 Z + zone: *1 + time: 2021-11-11 05:29:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-13 09:41:04.000000000 Z + zone: *1 + time: 2021-11-13 09:41:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-16 07:48:22.000000000 Z + zone: *1 + time: 2021-11-16 07:48:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-16 12:43:44.000000000 Z + zone: *1 + time: 2021-11-16 12:43:44.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-17 16:03:07.000000000 Z + zone: *1 + time: 2021-11-17 16:03:07.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-20 02:39:01.000000000 Z + zone: *1 + time: 2021-11-20 02:39:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-21 02:01:24.000000000 Z + zone: *1 + time: 2021-11-21 02:01:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-23 19:24:43.000000000 Z + zone: *1 + time: 2021-11-23 19:24:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-26 11:47:22.000000000 Z + zone: *1 + time: 2021-11-26 11:47:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-11-28 06:30:04.000000000 Z + zone: *1 + time: 2021-11-28 06:30:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-01 00:13:55.000000000 Z + zone: *1 + time: 2021-12-01 00:13:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-03 19:10:16.000000000 Z + zone: *1 + time: 2021-12-03 19:10:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-04 00:43:47.000000000 Z + zone: *1 + time: 2021-12-04 00:43:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-06 20:15:35.000000000 Z + zone: *1 + time: 2021-12-06 20:15:35.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-09 16:27:07.000000000 Z + zone: *1 + time: 2021-12-09 16:27:07.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-10 15:28:48.000000000 Z + zone: *1 + time: 2021-12-10 15:28:48.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-10 23:08:16.000000000 Z + zone: *1 + time: 2021-12-10 23:08:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-11 23:09:08.000000000 Z + zone: *1 + time: 2021-12-11 23:09:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-14 04:56:58.000000000 Z + zone: *1 + time: 2021-12-14 04:56:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-14 14:00:56.000000000 Z + zone: *1 + time: 2021-12-14 14:00:56.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-15 22:58:51.000000000 Z + zone: *1 + time: 2021-12-15 22:58:51.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-16 01:28:21.000000000 Z + zone: *1 + time: 2021-12-16 01:28:21.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-16 20:16:54.000000000 Z + zone: *1 + time: 2021-12-16 20:16:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-19 00:34:04.000000000 Z + zone: *1 + time: 2021-12-19 00:34:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-19 06:58:41.000000000 Z + zone: *1 + time: 2021-12-19 06:58:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-21 11:13:53.000000000 Z + zone: *1 + time: 2021-12-21 11:13:53.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-23 07:28:50.000000000 Z + zone: *1 + time: 2021-12-23 07:28:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-23 07:57:58.000000000 Z + zone: *1 + time: 2021-12-23 07:57:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-23 18:32:13.000000000 Z + zone: *1 + time: 2021-12-23 18:32:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-24 01:17:51.000000000 Z + zone: *1 + time: 2021-12-24 01:17:51.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-25 05:36:16.000000000 Z + zone: *1 + time: 2021-12-25 05:36:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-25 23:21:57.000000000 Z + zone: *1 + time: 2021-12-25 23:21:57.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-27 12:18:57.000000000 Z + zone: *1 + time: 2021-12-27 12:18:57.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-28 16:59:57.000000000 Z + zone: *1 + time: 2021-12-28 16:59:57.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-31 15:10:23.000000000 Z + zone: *1 + time: 2021-12-31 15:10:23.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-01 19:18:06.000000000 Z + zone: *1 + time: 2022-01-01 19:18:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-03 08:36:27.000000000 Z + zone: *1 + time: 2022-01-03 08:36:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-03 23:31:01.000000000 Z + zone: *1 + time: 2022-01-03 23:31:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-05 02:14:57.000000000 Z + zone: *1 + time: 2022-01-05 02:14:57.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-06 09:26:03.000000000 Z + zone: *1 + time: 2022-01-06 09:26:03.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-07 20:22:22.000000000 Z + zone: *1 + time: 2022-01-07 20:22:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-10 04:04:28.000000000 Z + zone: *1 + time: 2022-01-10 04:04:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-11 17:17:55.000000000 Z + zone: *1 + time: 2022-01-11 17:17:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-14 05:21:54.000000000 Z + zone: *1 + time: 2022-01-14 05:21:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-16 01:18:58.000000000 Z + zone: *1 + time: 2022-01-16 01:18:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-18 08:42:56.000000000 Z + zone: *1 + time: 2022-01-18 08:42:56.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-19 00:45:04.000000000 Z + zone: *1 + time: 2022-01-19 00:45:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-20 08:18:54.000000000 Z + zone: *1 + time: 2022-01-20 08:18:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-22 05:26:38.000000000 Z + zone: *1 + time: 2022-01-22 05:26:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-24 10:57:50.000000000 Z + zone: *1 + time: 2022-01-24 10:57:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-26 09:47:02.000000000 Z + zone: *1 + time: 2022-01-26 09:47:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-28 20:44:30.000000000 Z + zone: *1 + time: 2022-01-28 20:44:30.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-31 16:19:50.000000000 Z + zone: *1 + time: 2022-01-31 16:19:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-01 21:23:58.000000000 Z + zone: *1 + time: 2022-02-01 21:23:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-04 14:41:57.000000000 Z + zone: *1 + time: 2022-02-04 14:41:57.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-06 20:40:06.000000000 Z + zone: *1 + time: 2022-02-06 20:40:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-07 23:03:50.000000000 Z + zone: *1 + time: 2022-02-07 23:03:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-09 05:28:08.000000000 Z + zone: *1 + time: 2022-02-09 05:28:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-10 02:19:12.000000000 Z + zone: *1 + time: 2022-02-10 02:19:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-11 07:51:30.000000000 Z + zone: *1 + time: 2022-02-11 07:51:30.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-12 13:46:16.000000000 Z + zone: *1 + time: 2022-02-12 13:46:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-13 21:06:40.000000000 Z + zone: *1 + time: 2022-02-13 21:06:40.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-15 11:37:50.000000000 Z + zone: *1 + time: 2022-02-15 11:37:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-18 11:23:15.000000000 Z + zone: *1 + time: 2022-02-18 11:23:15.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-20 08:01:49.000000000 Z + zone: *1 + time: 2022-02-20 08:01:49.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-23 03:00:30.000000000 Z + zone: *1 + time: 2022-02-23 03:00:30.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-24 21:52:25.000000000 Z + zone: *1 + time: 2022-02-24 21:52:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-25 12:07:56.000000000 Z + zone: *1 + time: 2022-02-25 12:07:56.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-27 04:20:20.000000000 Z + zone: *1 + time: 2022-02-27 04:20:20.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-02-28 21:09:42.000000000 Z + zone: *1 + time: 2022-02-28 21:09:42.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-02 23:35:41.000000000 Z + zone: *1 + time: 2022-03-02 23:35:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-04 00:42:10.000000000 Z + zone: *1 + time: 2022-03-04 00:42:10.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-05 00:59:10.000000000 Z + zone: *1 + time: 2022-03-05 00:59:10.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-06 19:58:01.000000000 Z + zone: *1 + time: 2022-03-06 19:58:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-07 07:48:09.000000000 Z + zone: *1 + time: 2022-03-07 07:48:09.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-09 06:08:00.000000000 Z + zone: *1 + time: 2022-03-09 06:08:00.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-10 05:45:08.000000000 Z + zone: *1 + time: 2022-03-10 05:45:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-12 21:16:31.000000000 Z + zone: *1 + time: 2022-03-12 21:16:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-15 08:17:44.000000000 Z + zone: *1 + time: 2022-03-15 08:17:44.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-16 03:37:03.000000000 Z + zone: *1 + time: 2022-03-16 03:37:03.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-18 05:07:54.000000000 Z + zone: *1 + time: 2022-03-18 05:07:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-20 04:05:26.000000000 Z + zone: *1 + time: 2022-03-20 04:05:26.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-22 10:52:33.000000000 Z + zone: *1 + time: 2022-03-22 10:52:33.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-23 15:26:54.000000000 Z + zone: *1 + time: 2022-03-23 15:26:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-24 09:01:04.000000000 Z + zone: *1 + time: 2022-03-24 09:01:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-24 23:53:07.000000000 Z + zone: *1 + time: 2022-03-24 23:53:07.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-27 13:45:17.000000000 Z + zone: *1 + time: 2022-03-27 13:45:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-28 19:57:00.000000000 Z + zone: *1 + time: 2022-03-28 19:57:00.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-29 15:42:35.000000000 Z + zone: *1 + time: 2022-03-29 15:42:35.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-03-29 18:20:32.000000000 Z + zone: *1 + time: 2022-03-29 18:20:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-01 15:35:47.000000000 Z + zone: *1 + time: 2022-04-01 15:35:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-02 06:33:31.000000000 Z + zone: *1 + time: 2022-04-02 06:33:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-03 18:27:19.000000000 Z + zone: *1 + time: 2022-04-03 18:27:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-03 23:44:08.000000000 Z + zone: *1 + time: 2022-04-03 23:44:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-06 10:59:32.000000000 Z + zone: *1 + time: 2022-04-06 10:59:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-07 01:33:53.000000000 Z + zone: *1 + time: 2022-04-07 01:33:53.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-08 10:26:34.000000000 Z + zone: *1 + time: 2022-04-08 10:26:34.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-10 19:21:08.000000000 Z + zone: *1 + time: 2022-04-10 19:21:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-12 01:50:04.000000000 Z + zone: *1 + time: 2022-04-12 01:50:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-14 19:56:29.000000000 Z + zone: *1 + time: 2022-04-14 19:56:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-15 09:08:22.000000000 Z + zone: *1 + time: 2022-04-15 09:08:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-16 07:58:47.000000000 Z + zone: *1 + time: 2022-04-16 07:58:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-17 16:31:40.000000000 Z + zone: *1 + time: 2022-04-17 16:31:40.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-20 09:50:22.000000000 Z + zone: *1 + time: 2022-04-20 09:50:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-23 04:24:22.000000000 Z + zone: *1 + time: 2022-04-23 04:24:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-25 07:18:04.000000000 Z + zone: *1 + time: 2022-04-25 07:18:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-27 16:57:48.000000000 Z + zone: *1 + time: 2022-04-27 16:57:48.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-29 18:48:09.000000000 Z + zone: *1 + time: 2022-04-29 18:48:09.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-04-29 20:30:25.000000000 Z + zone: *1 + time: 2022-04-29 20:30:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-02 03:44:25.000000000 Z + zone: *1 + time: 2022-05-02 03:44:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-03 15:27:57.000000000 Z + zone: *1 + time: 2022-05-03 15:27:57.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-04 08:11:15.000000000 Z + zone: *1 + time: 2022-05-04 08:11:15.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-07 00:42:14.000000000 Z + zone: *1 + time: 2022-05-07 00:42:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-09 15:23:31.000000000 Z + zone: *1 + time: 2022-05-09 15:23:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-10 19:11:49.000000000 Z + zone: *1 + time: 2022-05-10 19:11:49.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-11 14:04:17.000000000 Z + zone: *1 + time: 2022-05-11 14:04:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-14 12:09:34.000000000 Z + zone: *1 + time: 2022-05-14 12:09:34.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-15 13:31:54.000000000 Z + zone: *1 + time: 2022-05-15 13:31:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-17 21:21:37.000000000 Z + zone: *1 + time: 2022-05-17 21:21:37.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-19 01:27:43.000000000 Z + zone: *1 + time: 2022-05-19 01:27:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-21 04:34:59.000000000 Z + zone: *1 + time: 2022-05-21 04:34:59.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-23 11:05:18.000000000 Z + zone: *1 + time: 2022-05-23 11:05:18.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-23 19:14:50.000000000 Z + zone: *1 + time: 2022-05-23 19:14:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-26 13:16:18.000000000 Z + zone: *1 + time: 2022-05-26 13:16:18.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-27 11:39:35.000000000 Z + zone: *1 + time: 2022-05-27 11:39:35.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-29 07:09:07.000000000 Z + zone: *1 + time: 2022-05-29 07:09:07.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-05-30 15:13:23.000000000 Z + zone: *1 + time: 2022-05-30 15:13:23.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-01 04:18:40.000000000 Z + zone: *1 + time: 2022-06-01 04:18:40.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-01 11:11:51.000000000 Z + zone: *1 + time: 2022-06-01 11:11:51.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-01 12:45:06.000000000 Z + zone: *1 + time: 2022-06-01 12:45:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-03 07:08:31.000000000 Z + zone: *1 + time: 2022-06-03 07:08:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-04 23:28:11.000000000 Z + zone: *1 + time: 2022-06-04 23:28:11.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-07 12:14:01.000000000 Z + zone: *1 + time: 2022-06-07 12:14:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-08 13:32:22.000000000 Z + zone: *1 + time: 2022-06-08 13:32:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-10 18:56:37.000000000 Z + zone: *1 + time: 2022-06-10 18:56:37.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-12 16:00:09.000000000 Z + zone: *1 + time: 2022-06-12 16:00:09.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-15 13:28:55.000000000 Z + zone: *1 + time: 2022-06-15 13:28:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-16 18:42:37.000000000 Z + zone: *1 + time: 2022-06-16 18:42:37.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-17 00:36:21.000000000 Z + zone: *1 + time: 2022-06-17 00:36:21.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-18 16:21:27.000000000 Z + zone: *1 + time: 2022-06-18 16:21:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-20 13:50:27.000000000 Z + zone: *1 + time: 2022-06-20 13:50:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-22 09:43:55.000000000 Z + zone: *1 + time: 2022-06-22 09:43:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-25 09:43:17.000000000 Z + zone: *1 + time: 2022-06-25 09:43:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-27 06:51:01.000000000 Z + zone: *1 + time: 2022-06-27 06:51:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-28 09:10:53.000000000 Z + zone: *1 + time: 2022-06-28 09:10:53.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-06-30 18:46:16.000000000 Z + zone: *1 + time: 2022-06-30 18:46:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-01 16:05:14.000000000 Z + zone: *1 + time: 2022-07-01 16:05:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-02 14:02:12.000000000 Z + zone: *1 + time: 2022-07-02 14:02:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-05 11:08:11.000000000 Z + zone: *1 + time: 2022-07-05 11:08:11.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-05 12:44:38.000000000 Z + zone: *1 + time: 2022-07-05 12:44:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-08 03:55:17.000000000 Z + zone: *1 + time: 2022-07-08 03:55:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-08 18:02:14.000000000 Z + zone: *1 + time: 2022-07-08 18:02:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-09 09:41:17.000000000 Z + zone: *1 + time: 2022-07-09 09:41:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-11 07:34:51.000000000 Z + zone: *1 + time: 2022-07-11 07:34:51.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-13 05:11:19.000000000 Z + zone: *1 + time: 2022-07-13 05:11:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-15 02:46:56.000000000 Z + zone: *1 + time: 2022-07-15 02:46:56.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-16 15:40:39.000000000 Z + zone: *1 + time: 2022-07-16 15:40:39.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-17 19:44:15.000000000 Z + zone: *1 + time: 2022-07-17 19:44:15.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-19 00:31:12.000000000 Z + zone: *1 + time: 2022-07-19 00:31:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-21 21:58:24.000000000 Z + zone: *1 + time: 2022-07-21 21:58:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-22 05:25:48.000000000 Z + zone: *1 + time: 2022-07-22 05:25:48.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-22 18:33:04.000000000 Z + zone: *1 + time: 2022-07-22 18:33:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-24 07:42:24.000000000 Z + zone: *1 + time: 2022-07-24 07:42:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-25 07:21:20.000000000 Z + zone: *1 + time: 2022-07-25 07:21:20.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-27 12:02:44.000000000 Z + zone: *1 + time: 2022-07-27 12:02:44.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-29 03:29:28.000000000 Z + zone: *1 + time: 2022-07-29 03:29:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-29 11:35:43.000000000 Z + zone: *1 + time: 2022-07-29 11:35:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-30 05:25:21.000000000 Z + zone: *1 + time: 2022-07-30 05:25:21.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-30 19:39:10.000000000 Z + zone: *1 + time: 2022-07-30 19:39:10.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-07-31 18:54:58.000000000 Z + zone: *1 + time: 2022-07-31 18:54:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-03 11:18:44.000000000 Z + zone: *1 + time: 2022-08-03 11:18:44.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-05 00:37:47.000000000 Z + zone: *1 + time: 2022-08-05 00:37:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-05 12:08:08.000000000 Z + zone: *1 + time: 2022-08-05 12:08:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-07 14:39:19.000000000 Z + zone: *1 + time: 2022-08-07 14:39:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-08 09:52:59.000000000 Z + zone: *1 + time: 2022-08-08 09:52:59.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-09 13:48:29.000000000 Z + zone: *1 + time: 2022-08-09 13:48:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-11 19:03:04.000000000 Z + zone: *1 + time: 2022-08-11 19:03:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-13 01:56:49.000000000 Z + zone: *1 + time: 2022-08-13 01:56:49.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-15 11:33:09.000000000 Z + zone: *1 + time: 2022-08-15 11:33:09.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-17 23:37:45.000000000 Z + zone: *1 + time: 2022-08-17 23:37:45.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-19 00:47:19.000000000 Z + zone: *1 + time: 2022-08-19 00:47:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-19 01:01:12.000000000 Z + zone: *1 + time: 2022-08-19 01:01:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-21 07:37:55.000000000 Z + zone: *1 + time: 2022-08-21 07:37:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-21 21:42:15.000000000 Z + zone: *1 + time: 2022-08-21 21:42:15.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-23 10:55:39.000000000 Z + zone: *1 + time: 2022-08-23 10:55:39.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-25 16:20:29.000000000 Z + zone: *1 + time: 2022-08-25 16:20:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-27 06:28:14.000000000 Z + zone: *1 + time: 2022-08-27 06:28:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-27 13:12:57.000000000 Z + zone: *1 + time: 2022-08-27 13:12:57.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-28 23:00:13.000000000 Z + zone: *1 + time: 2022-08-28 23:00:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-08-31 05:19:56.000000000 Z + zone: *1 + time: 2022-08-31 05:19:56.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-02 18:00:18.000000000 Z + zone: *1 + time: 2022-09-02 18:00:18.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-04 12:02:47.000000000 Z + zone: *1 + time: 2022-09-04 12:02:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-06 00:57:21.000000000 Z + zone: *1 + time: 2022-09-06 00:57:21.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-08 04:26:01.000000000 Z + zone: *1 + time: 2022-09-08 04:26:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-09 04:55:45.000000000 Z + zone: *1 + time: 2022-09-09 04:55:45.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-11 22:59:36.000000000 Z + zone: *1 + time: 2022-09-11 22:59:36.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-12 00:54:25.000000000 Z + zone: *1 + time: 2022-09-12 00:54:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-12 17:44:24.000000000 Z + zone: *1 + time: 2022-09-12 17:44:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-12 20:47:30.000000000 Z + zone: *1 + time: 2022-09-12 20:47:30.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-15 11:39:20.000000000 Z + zone: *1 + time: 2022-09-15 11:39:20.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-16 07:54:15.000000000 Z + zone: *1 + time: 2022-09-16 07:54:15.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-17 08:06:29.000000000 Z + zone: *1 + time: 2022-09-17 08:06:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-18 07:17:17.000000000 Z + zone: *1 + time: 2022-09-18 07:17:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-19 08:39:55.000000000 Z + zone: *1 + time: 2022-09-19 08:39:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-22 06:32:56.000000000 Z + zone: *1 + time: 2022-09-22 06:32:56.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-22 21:26:29.000000000 Z + zone: *1 + time: 2022-09-22 21:26:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-24 16:06:50.000000000 Z + zone: *1 + time: 2022-09-24 16:06:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-27 05:50:18.000000000 Z + zone: *1 + time: 2022-09-27 05:50:18.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-28 12:12:13.000000000 Z + zone: *1 + time: 2022-09-28 12:12:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-29 21:13:01.000000000 Z + zone: *1 + time: 2022-09-29 21:13:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-09-30 00:09:29.000000000 Z + zone: *1 + time: 2022-09-30 00:09:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-02 04:35:07.000000000 Z + zone: *1 + time: 2022-10-02 04:35:07.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-02 16:30:20.000000000 Z + zone: *1 + time: 2022-10-02 16:30:20.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-04 10:35:59.000000000 Z + zone: *1 + time: 2022-10-04 10:35:59.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-04 23:39:37.000000000 Z + zone: *1 + time: 2022-10-04 23:39:37.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-07 23:25:10.000000000 Z + zone: *1 + time: 2022-10-07 23:25:10.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-08 20:31:14.000000000 Z + zone: *1 + time: 2022-10-08 20:31:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-09 07:30:41.000000000 Z + zone: *1 + time: 2022-10-09 07:30:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-11 07:29:41.000000000 Z + zone: *1 + time: 2022-10-11 07:29:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-11 08:00:58.000000000 Z + zone: *1 + time: 2022-10-11 08:00:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-14 03:22:26.000000000 Z + zone: *1 + time: 2022-10-14 03:22:26.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-16 14:47:54.000000000 Z + zone: *1 + time: 2022-10-16 14:47:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-17 00:28:32.000000000 Z + zone: *1 + time: 2022-10-17 00:28:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-19 10:46:33.000000000 Z + zone: *1 + time: 2022-10-19 10:46:33.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-21 02:39:31.000000000 Z + zone: *1 + time: 2022-10-21 02:39:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-21 19:24:24.000000000 Z + zone: *1 + time: 2022-10-21 19:24:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-23 05:38:26.000000000 Z + zone: *1 + time: 2022-10-23 05:38:26.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-25 13:28:28.000000000 Z + zone: *1 + time: 2022-10-25 13:28:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-26 20:26:31.000000000 Z + zone: *1 + time: 2022-10-26 20:26:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-29 12:43:40.000000000 Z + zone: *1 + time: 2022-10-29 12:43:40.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-10-31 11:21:43.000000000 Z + zone: *1 + time: 2022-10-31 11:21:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-03 04:42:32.000000000 Z + zone: *1 + time: 2022-11-03 04:42:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-04 20:26:28.000000000 Z + zone: *1 + time: 2022-11-04 20:26:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-05 15:08:01.000000000 Z + zone: *1 + time: 2022-11-05 15:08:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-06 10:55:38.000000000 Z + zone: *1 + time: 2022-11-06 10:55:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-07 04:13:28.000000000 Z + zone: *1 + time: 2022-11-07 04:13:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-08 03:42:59.000000000 Z + zone: *1 + time: 2022-11-08 03:42:59.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-10 13:56:10.000000000 Z + zone: *1 + time: 2022-11-10 13:56:10.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-13 13:01:38.000000000 Z + zone: *1 + time: 2022-11-13 13:01:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-15 02:04:32.000000000 Z + zone: *1 + time: 2022-11-15 02:04:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-17 09:10:48.000000000 Z + zone: *1 + time: 2022-11-17 09:10:48.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-19 11:37:01.000000000 Z + zone: *1 + time: 2022-11-19 11:37:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-20 06:15:33.000000000 Z + zone: *1 + time: 2022-11-20 06:15:33.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-22 08:35:41.000000000 Z + zone: *1 + time: 2022-11-22 08:35:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-24 20:42:50.000000000 Z + zone: *1 + time: 2022-11-24 20:42:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-25 17:45:48.000000000 Z + zone: *1 + time: 2022-11-25 17:45:48.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-28 06:16:15.000000000 Z + zone: *1 + time: 2022-11-28 06:16:15.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-28 18:12:24.000000000 Z + zone: *1 + time: 2022-11-28 18:12:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-11-30 20:09:46.000000000 Z + zone: *1 + time: 2022-11-30 20:09:46.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-01 03:29:43.000000000 Z + zone: *1 + time: 2022-12-01 03:29:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-02 03:58:02.000000000 Z + zone: *1 + time: 2022-12-02 03:58:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-02 19:47:06.000000000 Z + zone: *1 + time: 2022-12-02 19:47:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-04 14:54:02.000000000 Z + zone: *1 + time: 2022-12-04 14:54:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-06 02:22:58.000000000 Z + zone: *1 + time: 2022-12-06 02:22:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-06 09:29:06.000000000 Z + zone: *1 + time: 2022-12-06 09:29:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-06 17:16:19.000000000 Z + zone: *1 + time: 2022-12-06 17:16:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-09 14:10:12.000000000 Z + zone: *1 + time: 2022-12-09 14:10:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-11 19:54:41.000000000 Z + zone: *1 + time: 2022-12-11 19:54:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-11 23:48:45.000000000 Z + zone: *1 + time: 2022-12-11 23:48:45.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-12 12:05:28.000000000 Z + zone: *1 + time: 2022-12-12 12:05:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-12 21:37:48.000000000 Z + zone: *1 + time: 2022-12-12 21:37:48.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-15 05:08:10.000000000 Z + zone: *1 + time: 2022-12-15 05:08:10.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-16 19:06:39.000000000 Z + zone: *1 + time: 2022-12-16 19:06:39.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-18 21:49:36.000000000 Z + zone: *1 + time: 2022-12-18 21:49:36.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-20 00:54:09.000000000 Z + zone: *1 + time: 2022-12-20 00:54:09.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-22 21:51:31.000000000 Z + zone: *1 + time: 2022-12-22 21:51:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-25 08:40:02.000000000 Z + zone: *1 + time: 2022-12-25 08:40:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-26 22:01:45.000000000 Z + zone: *1 + time: 2022-12-26 22:01:45.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-12-29 18:46:07.000000000 Z + zone: *1 + time: 2022-12-29 18:46:07.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-01 01:55:31.000000000 Z + zone: *1 + time: 2023-01-01 01:55:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-01 17:34:53.000000000 Z + zone: *1 + time: 2023-01-01 17:34:53.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-04 09:05:13.000000000 Z + zone: *1 + time: 2023-01-04 09:05:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-05 01:57:33.000000000 Z + zone: *1 + time: 2023-01-05 01:57:33.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-06 08:56:47.000000000 Z + zone: *1 + time: 2023-01-06 08:56:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-07 18:52:12.000000000 Z + zone: *1 + time: 2023-01-07 18:52:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-08 00:43:40.000000000 Z + zone: *1 + time: 2023-01-08 00:43:40.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-10 13:28:23.000000000 Z + zone: *1 + time: 2023-01-10 13:28:23.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-13 10:22:38.000000000 Z + zone: *1 + time: 2023-01-13 10:22:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-15 01:43:06.000000000 Z + zone: *1 + time: 2023-01-15 01:43:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-15 04:30:52.000000000 Z + zone: *1 + time: 2023-01-15 04:30:52.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-16 23:13:04.000000000 Z + zone: *1 + time: 2023-01-16 23:13:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-19 17:16:31.000000000 Z + zone: *1 + time: 2023-01-19 17:16:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-21 09:25:58.000000000 Z + zone: *1 + time: 2023-01-21 09:25:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-23 09:42:42.000000000 Z + zone: *1 + time: 2023-01-23 09:42:42.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-24 11:13:59.000000000 Z + zone: *1 + time: 2023-01-24 11:13:59.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-25 00:57:26.000000000 Z + zone: *1 + time: 2023-01-25 00:57:26.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-27 10:31:18.000000000 Z + zone: *1 + time: 2023-01-27 10:31:18.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-28 07:08:54.000000000 Z + zone: *1 + time: 2023-01-28 07:08:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-28 09:46:16.000000000 Z + zone: *1 + time: 2023-01-28 09:46:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-30 04:34:32.000000000 Z + zone: *1 + time: 2023-01-30 04:34:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-30 05:30:26.000000000 Z + zone: *1 + time: 2023-01-30 05:30:26.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-01-31 08:08:44.000000000 Z + zone: *1 + time: 2023-01-31 08:08:44.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-03 01:02:02.000000000 Z + zone: *1 + time: 2023-02-03 01:02:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-03 10:02:38.000000000 Z + zone: *1 + time: 2023-02-03 10:02:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-05 02:22:53.000000000 Z + zone: *1 + time: 2023-02-05 02:22:53.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-05 05:55:46.000000000 Z + zone: *1 + time: 2023-02-05 05:55:46.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-07 06:18:28.000000000 Z + zone: *1 + time: 2023-02-07 06:18:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-08 13:57:28.000000000 Z + zone: *1 + time: 2023-02-08 13:57:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-08 17:53:12.000000000 Z + zone: *1 + time: 2023-02-08 17:53:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-10 08:40:27.000000000 Z + zone: *1 + time: 2023-02-10 08:40:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-10 10:28:23.000000000 Z + zone: *1 + time: 2023-02-10 10:28:23.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-12 15:42:42.000000000 Z + zone: *1 + time: 2023-02-12 15:42:42.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-14 06:11:35.000000000 Z + zone: *1 + time: 2023-02-14 06:11:35.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-14 12:22:06.000000000 Z + zone: *1 + time: 2023-02-14 12:22:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-16 14:43:29.000000000 Z + zone: *1 + time: 2023-02-16 14:43:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-16 15:58:19.000000000 Z + zone: *1 + time: 2023-02-16 15:58:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-17 08:36:37.000000000 Z + zone: *1 + time: 2023-02-17 08:36:37.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-19 04:20:36.000000000 Z + zone: *1 + time: 2023-02-19 04:20:36.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-21 03:27:07.000000000 Z + zone: *1 + time: 2023-02-21 03:27:07.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-22 09:09:23.000000000 Z + zone: *1 + time: 2023-02-22 09:09:23.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-24 10:19:14.000000000 Z + zone: *1 + time: 2023-02-24 10:19:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-26 13:28:50.000000000 Z + zone: *1 + time: 2023-02-26 13:28:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-02-27 15:33:38.000000000 Z + zone: *1 + time: 2023-02-27 15:33:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-01 14:48:42.000000000 Z + zone: *1 + time: 2023-03-01 14:48:42.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-02 19:17:52.000000000 Z + zone: *1 + time: 2023-03-02 19:17:52.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-03 09:48:41.000000000 Z + zone: *1 + time: 2023-03-03 09:48:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-04 12:44:18.000000000 Z + zone: *1 + time: 2023-03-04 12:44:18.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-06 18:24:47.000000000 Z + zone: *1 + time: 2023-03-06 18:24:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-09 13:55:36.000000000 Z + zone: *1 + time: 2023-03-09 13:55:36.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-11 13:50:26.000000000 Z + zone: *1 + time: 2023-03-11 13:50:26.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-14 05:57:47.000000000 Z + zone: *1 + time: 2023-03-14 05:57:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-14 09:16:38.000000000 Z + zone: *1 + time: 2023-03-14 09:16:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-14 12:34:22.000000000 Z + zone: *1 + time: 2023-03-14 12:34:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-14 15:15:53.000000000 Z + zone: *1 + time: 2023-03-14 15:15:53.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-16 18:34:04.000000000 Z + zone: *1 + time: 2023-03-16 18:34:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-19 13:01:38.000000000 Z + zone: *1 + time: 2023-03-19 13:01:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-19 15:24:32.000000000 Z + zone: *1 + time: 2023-03-19 15:24:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-20 14:56:28.000000000 Z + zone: *1 + time: 2023-03-20 14:56:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-21 12:32:45.000000000 Z + zone: *1 + time: 2023-03-21 12:32:45.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-23 22:16:22.000000000 Z + zone: *1 + time: 2023-03-23 22:16:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-24 01:05:24.000000000 Z + zone: *1 + time: 2023-03-24 01:05:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-26 12:01:36.000000000 Z + zone: *1 + time: 2023-03-26 12:01:36.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-03-29 07:45:17.000000000 Z + zone: *1 + time: 2023-03-29 07:45:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-01 06:03:31.000000000 Z + zone: *1 + time: 2023-04-01 06:03:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-02 20:45:43.000000000 Z + zone: *1 + time: 2023-04-02 20:45:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-03 05:33:10.000000000 Z + zone: *1 + time: 2023-04-03 05:33:10.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-03 16:15:11.000000000 Z + zone: *1 + time: 2023-04-03 16:15:11.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-05 14:56:49.000000000 Z + zone: *1 + time: 2023-04-05 14:56:49.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-06 22:21:46.000000000 Z + zone: *1 + time: 2023-04-06 22:21:46.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-08 19:50:51.000000000 Z + zone: *1 + time: 2023-04-08 19:50:51.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-09 06:14:30.000000000 Z + zone: *1 + time: 2023-04-09 06:14:30.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-09 11:26:27.000000000 Z + zone: *1 + time: 2023-04-09 11:26:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-11 21:34:04.000000000 Z + zone: *1 + time: 2023-04-11 21:34:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-14 08:51:06.000000000 Z + zone: *1 + time: 2023-04-14 08:51:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-16 15:58:05.000000000 Z + zone: *1 + time: 2023-04-16 15:58:05.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-17 03:06:43.000000000 Z + zone: *1 + time: 2023-04-17 03:06:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-18 16:28:30.000000000 Z + zone: *1 + time: 2023-04-18 16:28:30.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-18 17:32:38.000000000 Z + zone: *1 + time: 2023-04-18 17:32:38.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-19 20:34:45.000000000 Z + zone: *1 + time: 2023-04-19 20:34:45.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-22 06:16:01.000000000 Z + zone: *1 + time: 2023-04-22 06:16:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-22 12:00:25.000000000 Z + zone: *1 + time: 2023-04-22 12:00:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-24 21:12:27.000000000 Z + zone: *1 + time: 2023-04-24 21:12:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-27 15:19:36.000000000 Z + zone: *1 + time: 2023-04-27 15:19:36.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-29 00:43:46.000000000 Z + zone: *1 + time: 2023-04-29 00:43:46.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-29 17:50:02.000000000 Z + zone: *1 + time: 2023-04-29 17:50:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-04-30 05:22:14.000000000 Z + zone: *1 + time: 2023-04-30 05:22:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-01 07:20:17.000000000 Z + zone: *1 + time: 2023-05-01 07:20:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-03 05:11:16.000000000 Z + zone: *1 + time: 2023-05-03 05:11:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-05 00:13:31.000000000 Z + zone: *1 + time: 2023-05-05 00:13:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-05 12:08:33.000000000 Z + zone: *1 + time: 2023-05-05 12:08:33.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-05 16:26:19.000000000 Z + zone: *1 + time: 2023-05-05 16:26:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-07 23:53:00.000000000 Z + zone: *1 + time: 2023-05-07 23:53:00.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-10 17:41:27.000000000 Z + zone: *1 + time: 2023-05-10 17:41:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-12 01:37:24.000000000 Z + zone: *1 + time: 2023-05-12 01:37:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-14 08:18:36.000000000 Z + zone: *1 + time: 2023-05-14 08:18:36.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-16 15:17:43.000000000 Z + zone: *1 + time: 2023-05-16 15:17:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-16 18:24:55.000000000 Z + zone: *1 + time: 2023-05-16 18:24:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-19 16:16:45.000000000 Z + zone: *1 + time: 2023-05-19 16:16:45.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-21 00:48:36.000000000 Z + zone: *1 + time: 2023-05-21 00:48:36.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-22 00:54:41.000000000 Z + zone: *1 + time: 2023-05-22 00:54:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-24 05:36:25.000000000 Z + zone: *1 + time: 2023-05-24 05:36:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-25 10:05:39.000000000 Z + zone: *1 + time: 2023-05-25 10:05:39.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-26 16:09:51.000000000 Z + zone: *1 + time: 2023-05-26 16:09:51.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-29 12:40:29.000000000 Z + zone: *1 + time: 2023-05-29 12:40:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-29 13:15:05.000000000 Z + zone: *1 + time: 2023-05-29 13:15:05.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-05-31 15:28:14.000000000 Z + zone: *1 + time: 2023-05-31 15:28:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-02 02:05:21.000000000 Z + zone: *1 + time: 2023-06-02 02:05:21.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-02 13:05:50.000000000 Z + zone: *1 + time: 2023-06-02 13:05:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-04 11:12:19.000000000 Z + zone: *1 + time: 2023-06-04 11:12:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-05 10:04:34.000000000 Z + zone: *1 + time: 2023-06-05 10:04:34.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-06 02:47:22.000000000 Z + zone: *1 + time: 2023-06-06 02:47:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-07 04:35:17.000000000 Z + zone: *1 + time: 2023-06-07 04:35:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-07 16:20:27.000000000 Z + zone: *1 + time: 2023-06-07 16:20:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-08 07:43:14.000000000 Z + zone: *1 + time: 2023-06-08 07:43:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-10 17:55:59.000000000 Z + zone: *1 + time: 2023-06-10 17:55:59.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-12 17:00:02.000000000 Z + zone: *1 + time: 2023-06-12 17:00:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-14 08:37:14.000000000 Z + zone: *1 + time: 2023-06-14 08:37:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-14 18:07:30.000000000 Z + zone: *1 + time: 2023-06-14 18:07:30.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-16 12:07:26.000000000 Z + zone: *1 + time: 2023-06-16 12:07:26.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-18 22:29:39.000000000 Z + zone: *1 + time: 2023-06-18 22:29:39.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-19 02:32:54.000000000 Z + zone: *1 + time: 2023-06-19 02:32:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-20 14:24:40.000000000 Z + zone: *1 + time: 2023-06-20 14:24:40.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-22 09:27:59.000000000 Z + zone: *1 + time: 2023-06-22 09:27:59.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-23 07:31:20.000000000 Z + zone: *1 + time: 2023-06-23 07:31:20.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-23 21:06:55.000000000 Z + zone: *1 + time: 2023-06-23 21:06:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-26 06:57:28.000000000 Z + zone: *1 + time: 2023-06-26 06:57:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-28 17:08:12.000000000 Z + zone: *1 + time: 2023-06-28 17:08:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-29 03:06:47.000000000 Z + zone: *1 + time: 2023-06-29 03:06:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-06-30 12:25:41.000000000 Z + zone: *1 + time: 2023-06-30 12:25:41.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-02 08:49:42.000000000 Z + zone: *1 + time: 2023-07-02 08:49:42.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-03 20:09:26.000000000 Z + zone: *1 + time: 2023-07-03 20:09:26.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-06 17:39:13.000000000 Z + zone: *1 + time: 2023-07-06 17:39:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-09 00:18:52.000000000 Z + zone: *1 + time: 2023-07-09 00:18:52.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-11 03:58:21.000000000 Z + zone: *1 + time: 2023-07-11 03:58:21.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-12 22:37:00.000000000 Z + zone: *1 + time: 2023-07-12 22:37:00.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-14 01:58:44.000000000 Z + zone: *1 + time: 2023-07-14 01:58:44.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-16 20:21:13.000000000 Z + zone: *1 + time: 2023-07-16 20:21:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-17 01:41:47.000000000 Z + zone: *1 + time: 2023-07-17 01:41:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-19 10:06:35.000000000 Z + zone: *1 + time: 2023-07-19 10:06:35.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-21 17:44:16.000000000 Z + zone: *1 + time: 2023-07-21 17:44:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-22 02:46:04.000000000 Z + zone: *1 + time: 2023-07-22 02:46:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-22 06:52:04.000000000 Z + zone: *1 + time: 2023-07-22 06:52:04.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-23 04:53:49.000000000 Z + zone: *1 + time: 2023-07-23 04:53:49.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-25 16:37:24.000000000 Z + zone: *1 + time: 2023-07-25 16:37:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-27 18:34:33.000000000 Z + zone: *1 + time: 2023-07-27 18:34:33.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-28 02:34:02.000000000 Z + zone: *1 + time: 2023-07-28 02:34:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-29 19:53:32.000000000 Z + zone: *1 + time: 2023-07-29 19:53:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-07-30 23:30:11.000000000 Z + zone: *1 + time: 2023-07-30 23:30:11.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-02 17:46:22.000000000 Z + zone: *1 + time: 2023-08-02 17:46:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-03 00:01:21.000000000 Z + zone: *1 + time: 2023-08-03 00:01:21.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-03 03:57:56.000000000 Z + zone: *1 + time: 2023-08-03 03:57:56.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-03 21:41:28.000000000 Z + zone: *1 + time: 2023-08-03 21:41:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-04 23:37:31.000000000 Z + zone: *1 + time: 2023-08-04 23:37:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-05 08:20:42.000000000 Z + zone: *1 + time: 2023-08-05 08:20:42.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-07 21:01:55.000000000 Z + zone: *1 + time: 2023-08-07 21:01:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-10 17:03:47.000000000 Z + zone: *1 + time: 2023-08-10 17:03:47.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-11 21:06:31.000000000 Z + zone: *1 + time: 2023-08-11 21:06:31.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-12 08:45:08.000000000 Z + zone: *1 + time: 2023-08-12 08:45:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-13 07:09:39.000000000 Z + zone: *1 + time: 2023-08-13 07:09:39.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-14 11:15:10.000000000 Z + zone: *1 + time: 2023-08-14 11:15:10.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-16 04:15:48.000000000 Z + zone: *1 + time: 2023-08-16 04:15:48.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-19 04:11:43.000000000 Z + zone: *1 + time: 2023-08-19 04:11:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-19 10:10:27.000000000 Z + zone: *1 + time: 2023-08-19 10:10:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-22 09:41:20.000000000 Z + zone: *1 + time: 2023-08-22 09:41:20.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-24 10:27:08.000000000 Z + zone: *1 + time: 2023-08-24 10:27:08.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-24 18:16:12.000000000 Z + zone: *1 + time: 2023-08-24 18:16:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-25 17:02:28.000000000 Z + zone: *1 + time: 2023-08-25 17:02:28.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-27 15:58:52.000000000 Z + zone: *1 + time: 2023-08-27 15:58:52.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-27 23:29:53.000000000 Z + zone: *1 + time: 2023-08-27 23:29:53.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-28 21:31:27.000000000 Z + zone: *1 + time: 2023-08-28 21:31:27.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-29 03:35:29.000000000 Z + zone: *1 + time: 2023-08-29 03:35:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-08-31 06:15:19.000000000 Z + zone: *1 + time: 2023-08-31 06:15:19.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-01 21:56:52.000000000 Z + zone: *1 + time: 2023-09-01 21:56:52.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-02 22:57:53.000000000 Z + zone: *1 + time: 2023-09-02 22:57:53.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-05 03:28:30.000000000 Z + zone: *1 + time: 2023-09-05 03:28:30.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-07 04:57:12.000000000 Z + zone: *1 + time: 2023-09-07 04:57:12.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-09 19:16:05.000000000 Z + zone: *1 + time: 2023-09-09 19:16:05.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-09 20:01:39.000000000 Z + zone: *1 + time: 2023-09-09 20:01:39.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-11 03:23:22.000000000 Z + zone: *1 + time: 2023-09-11 03:23:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-12 15:18:29.000000000 Z + zone: *1 + time: 2023-09-12 15:18:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-13 14:14:43.000000000 Z + zone: *1 + time: 2023-09-13 14:14:43.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-13 17:37:25.000000000 Z + zone: *1 + time: 2023-09-13 17:37:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-14 18:17:49.000000000 Z + zone: *1 + time: 2023-09-14 18:17:49.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-16 19:56:55.000000000 Z + zone: *1 + time: 2023-09-16 19:56:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-18 14:21:02.000000000 Z + zone: *1 + time: 2023-09-18 14:21:02.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-21 00:34:13.000000000 Z + zone: *1 + time: 2023-09-21 00:34:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-23 07:14:06.000000000 Z + zone: *1 + time: 2023-09-23 07:14:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-24 17:22:22.000000000 Z + zone: *1 + time: 2023-09-24 17:22:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-27 12:42:54.000000000 Z + zone: *1 + time: 2023-09-27 12:42:54.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-09-28 14:48:45.000000000 Z + zone: *1 + time: 2023-09-28 14:48:45.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-01 11:54:24.000000000 Z + zone: *1 + time: 2023-10-01 11:54:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-03 07:36:32.000000000 Z + zone: *1 + time: 2023-10-03 07:36:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-05 05:13:57.000000000 Z + zone: *1 + time: 2023-10-05 05:13:57.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-06 16:07:06.000000000 Z + zone: *1 + time: 2023-10-06 16:07:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-09 00:03:52.000000000 Z + zone: *1 + time: 2023-10-09 00:03:52.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-09 02:32:01.000000000 Z + zone: *1 + time: 2023-10-09 02:32:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-10 16:39:07.000000000 Z + zone: *1 + time: 2023-10-10 16:39:07.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-12 13:28:16.000000000 Z + zone: *1 + time: 2023-10-12 13:28:16.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-14 04:29:14.000000000 Z + zone: *1 + time: 2023-10-14 04:29:14.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-17 03:30:24.000000000 Z + zone: *1 + time: 2023-10-17 03:30:24.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-20 03:13:15.000000000 Z + zone: *1 + time: 2023-10-20 03:13:15.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-20 20:47:06.000000000 Z + zone: *1 + time: 2023-10-20 20:47:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-21 13:59:34.000000000 Z + zone: *1 + time: 2023-10-21 13:59:34.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-23 21:38:48.000000000 Z + zone: *1 + time: 2023-10-23 21:38:48.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-24 06:07:13.000000000 Z + zone: *1 + time: 2023-10-24 06:07:13.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-25 22:51:17.000000000 Z + zone: *1 + time: 2023-10-25 22:51:17.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-26 21:12:50.000000000 Z + zone: *1 + time: 2023-10-26 21:12:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-28 05:52:20.000000000 Z + zone: *1 + time: 2023-10-28 05:52:20.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-29 22:11:01.000000000 Z + zone: *1 + time: 2023-10-29 22:11:01.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-10-30 12:29:25.000000000 Z + zone: *1 + time: 2023-10-30 12:29:25.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-02 02:52:55.000000000 Z + zone: *1 + time: 2023-11-02 02:52:55.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-02 06:00:32.000000000 Z + zone: *1 + time: 2023-11-02 06:00:32.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-03 08:39:06.000000000 Z + zone: *1 + time: 2023-11-03 08:39:06.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-04 23:51:22.000000000 Z + zone: *1 + time: 2023-11-04 23:51:22.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-07 16:11:33.000000000 Z + zone: *1 + time: 2023-11-07 16:11:33.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-10 10:55:29.000000000 Z + zone: *1 + time: 2023-11-10 10:55:29.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-12 01:20:18.000000000 Z + zone: *1 + time: 2023-11-12 01:20:18.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-12 04:22:50.000000000 Z + zone: *1 + time: 2023-11-12 04:22:50.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-12 08:38:58.000000000 Z + zone: *1 + time: 2023-11-12 08:38:58.000000000 Z +- !ruby/object:ActiveSupport::TimeWithZone + utc: 2023-11-13 15:43:40.000000000 Z + zone: *1 + time: 2023-11-13 15:43:40.000000000 Z diff --git a/test/mock_helpers/app.rb b/test/mock_helpers/app.rb index a80d97c7e..d6ef3c199 100644 --- a/test/mock_helpers/app.rb +++ b/test/mock_helpers/app.rb @@ -28,7 +28,7 @@ def pagy_calendar_period(collection) end def pagy_calendar_filter(collection, from, to) - collection.select_page_of_records(from.utc, to.utc) + collection.select_page_of_records(from, to) end end end diff --git a/test/mock_helpers/collection.rb b/test/mock_helpers/collection.rb index 430d00789..bb9d76df7 100644 --- a/test/mock_helpers/collection.rb +++ b/test/mock_helpers/collection.rb @@ -2,6 +2,12 @@ require 'yaml' +require 'active_support' +require 'active_support/core_ext/time' +require 'active_support/core_ext/date_and_time/calculations' +require 'active_support/core_ext/numeric/time' +require 'active_support/core_ext/integer/time' + class MockCollection < Array def initialize(arr = Array(1..1000)) super @@ -48,14 +54,18 @@ def group_values end class Calendar < MockCollection - START_DATE = Time.new(2021, 10, 21, 13, 18, 23).utc - END_DATE = Time.new(2023, 11, 13, 15, 43, 40).utc YAML_FILE = File.expand_path('../files/calendar_collection.yml', __dir__) # :nocov: COLLECTION = if Psych::VERSION > '3.3.0' - YAML.safe_load(File.read(YAML_FILE), permitted_classes: [Time]) + YAML.safe_load(File.read(YAML_FILE), + permitted_classes: [ActiveSupport::TimeWithZone, + ActiveSupport::TimeZone, + Time], + aliases: ["1"]) else - YAML.safe_load(File.read(YAML_FILE), [Time], []) + YAML.safe_load(File.read(YAML_FILE), [ActiveSupport::TimeWithZone, + ActiveSupport::TimeZone, + Time], [], true) end # :nocov: @@ -70,19 +80,5 @@ def select_page_of_records(start_date, end_date) # mock AR scope, returning the same type of object self.class.new(paged) end - - # Commented out to avoid coverage miss - # def self.generate_yml - # start_sec = START_DATE.to_i - # end_sec = END_DATE.to_i - # collection = [] - # cur_sec = start_sec - # while cur_sec < end_sec - # collection << Time.at(cur_sec).utc - # cur_sec += rand(60*60*24*3) # random max 3 days - # end - # collection << Time.at(end_sec).utc - # File.open(YAML_FILE, 'w'){ |f| f.write collection.to_yaml } - # end end end diff --git a/test/pagy/calendar_test.rb b/test/pagy/calendar_test.rb index 29326a3a7..066cc3176 100644 --- a/test/pagy/calendar_test.rb +++ b/test/pagy/calendar_test.rb @@ -351,9 +351,5 @@ def pagy(unit: :month, **vars) pagy(unit: :week, offset: 0) _(Date.beginning_of_week).must_equal :sunday end - it 'works with Time objects' do - Pagy::Calendar.send(:create, :week, period: [Time.new(2021, 10, 21, 13, 18, 23, 0), - Time.new(2023, 11, 13, 15, 43, 0, 0)]) - end end end diff --git a/test/pagy/extras/frontend_helpers_json_test.rb b/test/pagy/extras/frontend_helpers_json_test.rb index 5437b6ba8..c9ab9a4be 100644 --- a/test/pagy/extras/frontend_helpers_json_test.rb +++ b/test/pagy/extras/frontend_helpers_json_test.rb @@ -6,6 +6,9 @@ require_relative '../../mock_helpers/app' +Time.zone = 'EST' +Date.beginning_of_week = :sunday + describe 'pagy/extras/frontend_helpers_json' do let(:app) { MockApp.new(params: {}) } @@ -28,7 +31,8 @@ it 'generate the labels for the sequels' do steps = { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] } pagy = Pagy::Calendar.create(:month, - period: [Time.new(2021, 10, 21, 13, 18, 23, 0), Time.new(2023, 11, 13, 15, 43, 40, 0)], + period: [Time.zone.local(2021, 10, 21, 13, 18, 23, 0), + Time.zone.local(2023, 11, 13, 15, 43, 40, 0)], steps: steps, page: 3) _(pagy.sequels).must_rematch _(pagy.label_sequels).must_rematch diff --git a/test/pagy/extras/frontend_helpers_oj_test.rb b/test/pagy/extras/frontend_helpers_oj_test.rb index edbffd167..6f71064b2 100644 --- a/test/pagy/extras/frontend_helpers_oj_test.rb +++ b/test/pagy/extras/frontend_helpers_oj_test.rb @@ -7,6 +7,9 @@ require_relative '../../mock_helpers/app' +Time.zone = 'EST' +Date.beginning_of_week = :sunday + describe 'pagy/extras/frontend_helpers_oj' do let(:app) { MockApp.new(params: {}) } @@ -30,7 +33,8 @@ it 'generate the labels for the sequels' do steps = { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] } pagy = Pagy::Calendar.create(:month, - period: [Time.new(2021, 10, 21, 13, 18, 23, 0), Time.new(2023, 11, 13, 15, 43, 40, 0)], + period: [Time.zone.local(2021, 10, 21, 13, 18, 23, 0), + Time.zone.local(2023, 11, 13, 15, 43, 40, 0)], steps: steps, page: 3) _(pagy.sequels).must_rematch _(pagy.label_sequels).must_rematch diff --git a/test/pagy/extras/i18n_calendar_extra_test.rb b/test/pagy/extras/i18n_calendar_extra_test.rb index cba4ee7d4..3b0af76b1 100644 --- a/test/pagy/extras/i18n_calendar_extra_test.rb +++ b/test/pagy/extras/i18n_calendar_extra_test.rb @@ -7,6 +7,9 @@ require_relative '../../mock_helpers/app' +Time.zone = 'EST' +Date.beginning_of_week = :sunday + describe 'pagy/extras/i18n' do let(:app) { MockApp.new } @@ -51,7 +54,8 @@ I18n.load_path += Dir[Pagy.root.join('..', 'test', 'files', 'locales', '*.yml')] it 'works in :en' do pagy = Pagy::Calendar.create(:month, - period: [Time.new(2021, 10, 21, 13, 18, 23, 0), Time.new(2023, 11, 13, 15, 43, 40, 0)], + period: [Time.zone.local(2021, 10, 21, 13, 18, 23, 0), + Time.zone.local(2023, 11, 13, 15, 43, 40, 0)], page: 3, format: '%B, %A') _(pagy.label).must_equal "December, Wednesday" _(pagy.label(locale: :de)).must_equal "Dezember, Mittwoch" diff --git a/test/pagy/extras/overflow_test.rb b/test/pagy/extras/overflow_test.rb index dd3be5a3c..7db67b356 100644 --- a/test/pagy/extras/overflow_test.rb +++ b/test/pagy/extras/overflow_test.rb @@ -5,8 +5,11 @@ require 'pagy/countless' require 'pagy/extras/overflow' +Time.zone = 'EST' +Date.beginning_of_week = :sunday + DAY = 60 * 60 * 24 -PERIOD = [Time.new(2021, 11, 4), Time.new(2021, 11, 4) + (DAY * 10)].freeze +PERIOD = [Time.zone.local(2021, 11, 4), Time.zone.local(2021, 11, 4) + 10.days].freeze describe 'pagy/extras/overflow' do let(:pagy_vars) { { page: 100, items: 10, count: 103, size: [3, 2, 2, 3] } } From 06b485146188ada93ca06c79f873dff0b617375f Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Thu, 9 Jun 2022 15:53:14 +0700 Subject: [PATCH 11/29] Removed deprecated :offset variable for Calendar::Week --- lib/pagy/calendar/week.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/pagy/calendar/week.rb b/lib/pagy/calendar/week.rb index d84fa1b43..4f9e9f9f2 100644 --- a/lib/pagy/calendar/week.rb +++ b/lib/pagy/calendar/week.rb @@ -13,11 +13,6 @@ class Week < Calendar # Setup the calendar variables def setup_unit_vars super - if @vars[:offset] # remove in pagy 6 - Warning.warn '[PAGY WARNING] The week :offset variable has been deprecated and will be ignored from pagy 6. ' \ - "Set the Date.beginning_of_week variable to be one of #{::Date::DAYS_INTO_WEEK.keys.inspect} instead." - Date.beginning_of_week = ::Date::DAYS_INTO_WEEK.keys[@vars[:offset]] - end @initial = @starting.beginning_of_week @final = @ending.next_week.beginning_of_week @pages = @last = page_offset(@initial, @final) From 6e193177e66fb385d47d15908bcbf2e3b25e46e1 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Thu, 9 Jun 2022 16:15:39 +0700 Subject: [PATCH 12/29] Removed deprecated variables for the search extras --- lib/pagy/extras/elasticsearch_rails.rb | 11 +---------- lib/pagy/extras/meilisearch.rb | 12 ++---------- lib/pagy/extras/searchkick.rb | 12 ++---------- 3 files changed, 5 insertions(+), 30 deletions(-) diff --git a/lib/pagy/extras/elasticsearch_rails.rb b/lib/pagy/extras/elasticsearch_rails.rb index 50c2caab7..a6bc16584 100644 --- a/lib/pagy/extras/elasticsearch_rails.rb +++ b/lib/pagy/extras/elasticsearch_rails.rb @@ -3,16 +3,7 @@ class Pagy # :nodoc: DEFAULT[:elasticsearch_rails_search] ||= :search - DEFAULT[:elasticsearch_rails_pagy_search] ||= if DEFAULT[:elasticsearch_rails_search_method] # remove in 6.0 - # :nocov: - Warning.warn '[PAGY WARNING] The :elasticsearch_rails_search_method variable ' \ - 'has been deprecated and will be ignored from pagy 6. ' \ - 'Use :elasticsearch_rails_pagy_search instead.' - DEFAULT[:elasticsearch_rails_search_method] - # :nocov: - else - :pagy_search - end + DEFAULT[:elasticsearch_rails_pagy_search] ||= :pagy_search # Paginate ElasticsearchRails response objects module ElasticsearchRailsExtra diff --git a/lib/pagy/extras/meilisearch.rb b/lib/pagy/extras/meilisearch.rb index 14d6f89e3..c7deebfe4 100644 --- a/lib/pagy/extras/meilisearch.rb +++ b/lib/pagy/extras/meilisearch.rb @@ -2,16 +2,8 @@ class Pagy # :nodoc: DEFAULT[:meilisearch_search] ||= :ms_search - DEFAULT[:meilisearch_pagy_search] ||= if DEFAULT[:meilisearch_search_method] # remove in 6.0 - # :nocov: - Warning.warn '[PAGY WARNING] The :meilisearch_search_method variable ' \ - 'has been deprecated and will be ignored from pagy 6. ' \ - 'Use :meilisearch_pagy_search instead.' - DEFAULT[:meilisearch_search_method] - # :nocov: - else - :pagy_search - end + DEFAULT[:meilisearch_pagy_search] ||= :pagy_search + # Paginate Meilisearch results module MeilisearchExtra module Meilisearch # :nodoc: diff --git a/lib/pagy/extras/searchkick.rb b/lib/pagy/extras/searchkick.rb index cf3e52fbc..a8e159d33 100644 --- a/lib/pagy/extras/searchkick.rb +++ b/lib/pagy/extras/searchkick.rb @@ -3,16 +3,8 @@ class Pagy # :nodoc: DEFAULT[:searchkick_search] ||= :search - DEFAULT[:searchkick_pagy_search] ||= if DEFAULT[:searchkick_search_method] # remove in 6.0 - # :nocov: - Warning.warn '[PAGY WARNING] The :searchkick_search_method variable ' \ - 'has been deprecated and will be ignored from pagy 6. ' \ - 'Use :searchkick_pagy_search instead.' - DEFAULT[:searchkick_search_method] - # :nocov: - else - :pagy_search - end + DEFAULT[:searchkick_pagy_search] ||= :pagy_search + # Paginate Searchkick::Results objects module SearchkickExtra module Searchkick # :nodoc: From cad32b3daae2ddee131bf8f9db7edb3a5226a250 Mon Sep 17 00:00:00 2001 From: Robert Keresnyei Date: Thu, 16 Jun 2022 09:45:00 +0200 Subject: [PATCH 13/29] Fix NoMethodError when page param is hash (#390) --- lib/pagy.rb | 2 +- test/pagy/exceptions_test.rb | 7 +++++++ test/pagy_test.rb | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/pagy.rb b/lib/pagy.rb index a8a819488..b76beef82 100644 --- a/lib/pagy.rb +++ b/lib/pagy.rb @@ -92,7 +92,7 @@ def normalize_vars(vars) def setup_vars(name_min) name_min.each do |name, min| raise VariableError.new(self, name, ">= #{min}", @vars[name]) \ - unless @vars[name] && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min + unless @vars[name]&.respond_to?(:to_i) && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min end end diff --git a/test/pagy/exceptions_test.rb b/test/pagy/exceptions_test.rb index 6f7324e86..cbe686146 100644 --- a/test/pagy/exceptions_test.rb +++ b/test/pagy/exceptions_test.rb @@ -26,6 +26,13 @@ _(e.variable).must_equal :page _(e.value).must_equal 'string' end + + begin + Pagy.new(count: 1, page: {}) + rescue Pagy::VariableError => e + _(e.variable).must_equal :page + _(e.value).must_equal({}) + end end it 'raises for other variables' do diff --git a/test/pagy_test.rb b/test/pagy_test.rb index eb27d9c97..47602a640 100644 --- a/test/pagy_test.rb +++ b/test/pagy_test.rb @@ -53,6 +53,7 @@ def series_for(page, *expected) _ { Pagy.new({}) }.must_raise Pagy::VariableError _ { Pagy.new(count: 0, page: -1) }.must_raise Pagy::VariableError _ { Pagy.new(count: 100, page: 0) }.must_raise Pagy::VariableError + _ { Pagy.new(count: 100, page: {}) }.must_raise Pagy::VariableError _ { Pagy.new(count: 100, page: 2, items: 0) }.must_raise Pagy::VariableError _ { Pagy.new(count: 100, page: 2, size: [1, 2, 3]).series }.must_raise Pagy::VariableError _ { Pagy.new(count: 100, page: 2, size: [1, 2, 3, '4']).series }.must_raise Pagy::VariableError From 3f51e2bd06392ca243aa476d00d31e6135e05f2f Mon Sep 17 00:00:00 2001 From: Peter Goldstein Date: Fri, 24 Jun 2022 17:15:49 -0700 Subject: [PATCH 14/29] Add Dependabot for GitHub Actions (#392) --- .github/dependabot.yml | 6 ++++++ .rubocop.yml | 5 +++++ test/mock_helpers/arel.rb | 4 ---- 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..5ace4600a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.rubocop.yml b/.rubocop.yml index d93a60ef6..7322a7850 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -51,6 +51,11 @@ Style/CommentedKeyword: Style/EmptyCaseCondition: Enabled: false +# cannot inline the disabling in the file because rubocop complains anyway +Style/RedundantInitialize: + Exclude: + - test/mock_helpers/arel.rb + # these cops are disabled only in the test files in order to # allow to copy and paste the failed output for test reconciliation Style/StringLiterals: diff --git a/test/mock_helpers/arel.rb b/test/mock_helpers/arel.rb index 0fbf4c965..50dfa87da 100644 --- a/test/mock_helpers/arel.rb +++ b/test/mock_helpers/arel.rb @@ -15,11 +15,7 @@ def self.over(*) module Nodes class Grouping - # rubocop:disable Lint/RedundantCopDisableDirective - # rubocop:disable Style/RedundantInitialize def initialize(_); end - # rubocop:enable Style/RedundantInitialize - # rubocop:enable Lint/RedundantCopDisableDirective end end end From 3b16a4207c2d883270e2f41e7242d57a37639bb4 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Mon, 27 Jun 2022 07:10:15 +0700 Subject: [PATCH 15/29] Reduced the error level for eslint rules --- .eslintrc.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 79d77e4e7..ac44d5236 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -17,7 +17,7 @@ "ecmaVersion": "latest" }, "rules": { - "semi": ["error", "always", {"omitLastInOneLineBlock": true}], - "align-assignments/align-assignments": ["error", { "requiresOnly": false } ] + "semi": ["warn", "always", {"omitLastInOneLineBlock": true}], + "align-assignments/align-assignments": ["warn", { "requiresOnly": false } ] } } From 2dedfac200d601ba246421b5f54b514bc8dfe4dd Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Tue, 13 Dec 2022 13:17:32 +0700 Subject: [PATCH 16/29] Reorganized pnpm setup and updated pagy.js to the new parcel default --- .gitignore | 3 +- .npmrc | 2 + e2e/ci-cache.lock | 10 +- e2e/package.json | 10 +- e2e/snapshots.js | 2 +- lib/javascripts/pagy.js | 2 +- node_modules/.keep | 0 package.json | 13 +- pnpm-lock.yaml | 3889 +++++++++++++++++++++++++++++++++++++-- pnpm-workspace.yaml | 5 + 10 files changed, 3720 insertions(+), 216 deletions(-) create mode 100644 .npmrc delete mode 100644 node_modules/.keep create mode 100644 pnpm-workspace.yaml diff --git a/.gitignore b/.gitignore index 01b74066b..94e59b446 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ node_modules/ /pkg/ /tmp/ -/.pnpm/* +pnpm +.pnpm-debug.log diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..8c1368e06 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +store-dir=pnpm +ignore-workspace-root-check=true diff --git a/e2e/ci-cache.lock b/e2e/ci-cache.lock index f4b705b0b..77629ce0c 100644 --- a/e2e/ci-cache.lock +++ b/e2e/ci-cache.lock @@ -4,10 +4,10 @@ pagy.e2e /pagy/e2e (PRIVATE) devDependencies: @cypress/snapshot 2.1.7 -@types/node 18.11.12 -@typescript-eslint/eslint-plugin 5.46.0 -@typescript-eslint/parser 5.46.0 -cypress 10.3.0 +@types/node 18.11.14 +@typescript-eslint/eslint-plugin 5.46.1 +@typescript-eslint/parser 5.46.1 +cypress 12.1.0 cypress-html-validate 5.1.1 eslint 8.29.0 eslint-plugin-align-assignments 1.1.2 @@ -16,5 +16,5 @@ eslint-plugin-import 2.26.0 eslint-plugin-node 11.1.0 eslint-plugin-promise 6.1.1 html-validate 7.10.1 -start-server-and-test 1.15.1 +start-server-and-test 1.15.2 typescript 4.9.4 diff --git a/e2e/package.json b/e2e/package.json index b2b1db374..0dea670a5 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -7,10 +7,10 @@ }, "devDependencies": { "@cypress/snapshot": "^2.1.7", - "@types/node": "18.11.12", - "@typescript-eslint/eslint-plugin": "5.46.0", - "@typescript-eslint/parser": "5.46.0", - "cypress": "10.3.0", + "@types/node": "18.11.14", + "@typescript-eslint/eslint-plugin": "5.46.1", + "@typescript-eslint/parser": "5.46.1", + "cypress": "12.1.0", "cypress-html-validate": "5.1.1", "eslint": "8.29.0", "eslint-plugin-align-assignments": "^1.1.2", @@ -19,7 +19,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "6.1.1", "html-validate": "7.10.1", - "start-server-and-test": "1.15.1", + "start-server-and-test": "1.15.2", "typescript": "4.9.4" }, "scripts": { diff --git a/e2e/snapshots.js b/e2e/snapshots.js index 964da29fe..6285fd23d 100644 --- a/e2e/snapshots.js +++ b/e2e/snapshots.js @@ -421,7 +421,7 @@ module.exports = { "10": "" } }, - "__version": "10.3.0", + "__version": "12.1.0", "Test all comboNavs for all styles": { "Test /bootstrap #combo-nav-js": { "1": "

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

", diff --git a/lib/javascripts/pagy.js b/lib/javascripts/pagy.js index 7f5a63f1a..e85d9e155 100644 --- a/lib/javascripts/pagy.js +++ b/lib/javascripts/pagy.js @@ -1 +1 @@ -!function(){function n(n){if(Array.isArray(n))return n}function e(n){if(Symbol.iterator in Object(n)||"[object Arguments]"===Object.prototype.toString.call(n))return Array.from(n)}function t(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function r(r,a){return n(r)||e(r)||t()}var a,o,i,c,u,f,l=(a=new ResizeObserver((function(n){return n.forEach((function(n){return n.target.querySelectorAll(".pagy-rjs").forEach((function(n){return n.pagyRender()}))}))})),o=function(n,e){var t,o=r(e),i=o[0],c=o[1],u=o[2],l=o[3],p=null!==(t=n.parentElement)&&void 0!==t?t:n,s=Object.keys(c).map((function(n){return parseInt(n)})).sort((function(n,e){return e-n})),y=-1,g=function(n,e,t){return n.replace(/__pagy_page__/g,e).replace(/__pagy_label__/g,t)};(n.pagyRender=function(){var e=s.find((function(n){return nl)return a.value=o,void a.select();var p=r(e(a.value)),s=p[0],y=p[1];"string"==typeof t&&"1"===s&&(y=f(y,t)),n.insertAdjacentHTML("afterbegin",y),n.querySelector("a").click()}};["change","focus"].forEach((function(n){return a.addEventListener(n,a.select)})),a.addEventListener("focusout",i),a.addEventListener("keypress",(function(n){"Enter"===n.key&&i()}))},f=function(n,e){return n.replace(new RegExp("(\\?|&)".concat(e,"=1\\b(?!&)|\\b").concat(e,"=1&")),"")},{version:"5.10.1",init:function(r){var a,u=(r instanceof Element?r:document).querySelectorAll("[data-pagy]"),f=!0,l=!1,p=void 0;try{for(var s,y=u[Symbol.iterator]();!(f=(s=y.next()).done);f=!0){var g=s.value;try{var v=Uint8Array.from(atob(g.getAttribute("data-pagy")),(function(n){return n.charCodeAt(0)})),d=n(a=JSON.parse((new TextDecoder).decode(v)))||e(a)||t(),_=d[0],m=d.slice(1);"nav"===_?o(g,m):"combo"===_?i(g,m):"selector"===_?c(g,m):console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",g,_)}catch(n){console.warn("Skipped Pagy.init() for: %o\n%s",g,n)}}}catch(n){l=!0,p=n}finally{try{f||null==y.return||y.return()}finally{if(l)throw p}}}});window.Pagy=l}(); \ No newline at end of file +!function(){var e=(()=>{const e=new ResizeObserver((e=>e.forEach((e=>e.target.querySelectorAll(".pagy-rjs").forEach((e=>e.pagyRender())))))),t=(t,[n,r,a,c])=>{const i=t.parentElement??t,s=Object.keys(r).map((e=>parseInt(e))).sort(((e,t)=>t-e));let p=-1;const l=(e,t,n)=>e.replace(/__pagy_page__/g,t).replace(/__pagy_label__/g,n);(t.pagyRender=function(){const e=s.find((e=>ee.toString()));for(const e in y){const t=y[e],r=f[e];g+="string"==typeof c&&1===t?o(l(n.link,t.toString(),r),c):"number"==typeof t?l(n.link,t.toString(),r):"gap"===t?n.gap:l(n.active,t,r)}g+=n.after,t.innerHTML="",t.insertAdjacentHTML("afterbegin",g),p=e})(),t.classList.contains("pagy-rjs")&&e.observe(i)},n=(e,[t,n])=>a(e,(e=>[e,t.replace(/__pagy_page__/,e)]),n),r=(e,[t,n,r])=>{a(e,(e=>{const r=Math.max(Math.ceil(t/parseInt(e)),1).toString();return[r,n.replace(/__pagy_page__/,r).replace(/__pagy_items__/,e)]}),r)},a=(e,t,n)=>{const r=e.querySelector("input"),a=r.value,c=function(){if(r.value===a)return;const[c,i,s]=[r.min,r.value,r.max].map((e=>parseInt(e)||0));if(is)return r.value=a,void r.select();let[p,l]=t(r.value);"string"==typeof n&&"1"===p&&(l=o(l,n)),e.insertAdjacentHTML("afterbegin",l),e.querySelector("a").click()};["change","focus"].forEach((e=>r.addEventListener(e,r.select))),r.addEventListener("focusout",c),r.addEventListener("keypress",(e=>{"Enter"===e.key&&c()}))},o=(e,t)=>e.replace(new RegExp(`(\\?|&)${t}=1\\b(?!&)|\\b${t}=1&`),"");return{version:"5.10.1",init(e){const a=(e instanceof Element?e:document).querySelectorAll("[data-pagy]");for(const e of a)try{const a=Uint8Array.from(atob(e.getAttribute("data-pagy")),(e=>e.charCodeAt(0))),[o,...c]=JSON.parse((new TextDecoder).decode(a));"nav"===o?t(e,c):"combo"===o?n(e,c):"selector"===o?r(e,c):console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",e,o)}catch(t){console.warn("Skipped Pagy.init() for: %o\n%s",e,t)}}}})();window.Pagy=e}(); \ No newline at end of file diff --git a/node_modules/.keep b/node_modules/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/package.json b/package.json index d4f263a3d..4cbbf1899 100644 --- a/package.json +++ b/package.json @@ -2,19 +2,10 @@ "name": "pagy", "description": "Workspaces environment", "private": true, - "workspaces": [ - "src", - "e2e" - ], "engines": { - "npm": ">=8.3.0", - "node": ">=16.13.1" + "node": ">=16.15.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0", - "@typescript-eslint/parser": "^5.13.0", - "eslint": "^8.10.0", - "eslint-plugin-align-assignments": "^1.1.2", - "typescript": "^4.6.2" + "retypeapp-linux-x64": "2.4.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b58d25fb..989a64be9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,21 +1,136 @@ lockfileVersion: 5.4 -specifiers: - '@typescript-eslint/eslint-plugin': ^5.13.0 - '@typescript-eslint/parser': ^5.13.0 - eslint: ^8.10.0 - eslint-plugin-align-assignments: ^1.1.2 - typescript: ^4.6.2 - -devDependencies: - '@typescript-eslint/eslint-plugin': 5.46.1_imrg37k3svwu377c6q7gkarwmi - '@typescript-eslint/parser': 5.46.1_ha6vam6werchizxrnqvarmz2zu - eslint: 8.29.0 - eslint-plugin-align-assignments: 1.1.2_eslint@8.29.0 - typescript: 4.9.4 +importers: + + .: + specifiers: + retypeapp-linux-x64: 2.4.0 + devDependencies: + retypeapp-linux-x64: 2.4.0 + + e2e: + specifiers: + '@cypress/snapshot': ^2.1.7 + '@types/node': 18.11.14 + '@typescript-eslint/eslint-plugin': 5.46.1 + '@typescript-eslint/parser': 5.46.1 + cypress: 12.1.0 + cypress-html-validate: 5.1.1 + eslint: 8.29.0 + eslint-plugin-align-assignments: ^1.1.2 + eslint-plugin-cypress: 2.12.1 + eslint-plugin-import: ^2.26.0 + eslint-plugin-node: ^11.1.0 + eslint-plugin-promise: 6.1.1 + html-validate: 7.10.1 + start-server-and-test: 1.15.2 + typescript: 4.9.4 + devDependencies: + '@cypress/snapshot': 2.1.7 + '@types/node': 18.11.14 + '@typescript-eslint/eslint-plugin': 5.46.1_imrg37k3svwu377c6q7gkarwmi + '@typescript-eslint/parser': 5.46.1_ha6vam6werchizxrnqvarmz2zu + cypress: 12.1.0 + cypress-html-validate: 5.1.1_ep4i4dlnhxg6lrjj5tdhzkg3m4 + eslint: 8.29.0 + eslint-plugin-align-assignments: 1.1.2_eslint@8.29.0 + eslint-plugin-cypress: 2.12.1_eslint@8.29.0 + eslint-plugin-import: 2.26.0_z7hwuz3w5sq2sbhy7d4iqrnsvq + eslint-plugin-node: 11.1.0_eslint@8.29.0 + eslint-plugin-promise: 6.1.1_eslint@8.29.0 + html-validate: 7.10.1 + start-server-and-test: 1.15.2 + typescript: 4.9.4 + + src: + specifiers: + parcel: ^2.3.2 + parcel-plugin-nuke-dist: ^1.0.1 + devDependencies: + parcel: 2.8.1 + parcel-plugin-nuke-dist: 1.0.1 packages: + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@colors/colors/1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true + optional: true + + /@cypress/request/2.88.10: + resolution: {integrity: sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==} + engines: {node: '>= 6'} + dependencies: + aws-sign2: 0.7.0 + aws4: 1.11.0 + 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.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 8.3.2 + dev: true + + /@cypress/snapshot/2.1.7: + resolution: {integrity: sha512-f8AcfIg7wOOHSdBODlIwCJE/rG5Yb+kUY+WVTKynB2pLLoDy9nc8CtcazqX19q2Lh++nTJLNRihpbbWvk33mbg==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + '@wildpeaks/snapshot-dom': 1.6.0 + am-i-a-dependency: 1.1.2 + check-more-types: 2.24.0 + debug: 3.2.7 + its-name: 1.0.0 + js-beautify: 1.10.3 + lazy-ass: 1.6.0 + snap-shot-compare: 2.8.3 + snap-shot-store: 1.2.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@cypress/xvfb/1.2.4_supports-color@8.1.1: + resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} + dependencies: + debug: 3.2.7_supports-color@8.1.1 + lodash.once: 4.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/eslintrc/1.3.3: resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -33,6 +148,23 @@ packages: - supports-color dev: true + /@hapi/hoek/9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + dev: true + + /@hapi/topo/5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true + + /@html-validate/stylish/3.0.1: + resolution: {integrity: sha512-jQNDrSnWvJEPSlqC1tFqcbmVuJy2x61UwqFsXHxYT2sgCXFW4AVhsoIcHkECCmUHtQ8hpHU6yOBGA+rMLZhS7A==} + engines: {node: '>= 14.0'} + dependencies: + kleur: 4.1.5 + dev: true + /@humanwhocodes/config-array/0.11.7: resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} engines: {node: '>=10.10.0'} @@ -53,6 +185,158 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map/0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@lezer/common/0.15.12: + resolution: {integrity: sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==} + dev: true + + /@lezer/lr/0.15.8: + resolution: {integrity: sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==} + dependencies: + '@lezer/common': 0.15.12 + dev: true + + /@lmdb/lmdb-darwin-arm64/2.5.2: + resolution: {integrity: sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-darwin-x64/2.5.2: + resolution: {integrity: sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-arm/2.5.2: + resolution: {integrity: sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-arm64/2.5.2: + resolution: {integrity: sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-linux-x64/2.5.2: + resolution: {integrity: sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@lmdb/lmdb-win32-x64/2.5.2: + resolution: {integrity: sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@mischnic/json-sourcemap/0.1.0: + resolution: {integrity: sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==} + engines: {node: '>=12.0.0'} + dependencies: + '@lezer/common': 0.15.12 + '@lezer/lr': 0.15.8 + json5: 2.2.1 + dev: true + + /@msgpackr-extract/msgpackr-extract-darwin-arm64/2.2.0: + resolution: {integrity: sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-darwin-x64/2.2.0: + resolution: {integrity: sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm/2.2.0: + resolution: {integrity: sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm64/2.2.0: + resolution: {integrity: sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-x64/2.2.0: + resolution: {integrity: sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-win32-x64/2.2.0: + resolution: {integrity: sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -74,216 +358,1254 @@ packages: fastq: 1.14.0 dev: true - /@types/json-schema/7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - dev: true - - /@types/semver/7.3.13: - resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + /@parcel/bundler-default/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-hyzrZdzjFWjKFh0s8ykFke5bTBwWdOkmnFEsB2zaJEALf83td6JaH18w3iYNwF1Q5qplSTu6AeNOeVbR7DXi4g==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/graph': 2.8.1 + '@parcel/hash': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' dev: true - /@typescript-eslint/eslint-plugin/5.46.1_imrg37k3svwu377c6q7gkarwmi: - resolution: {integrity: sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@parcel/cache/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-wvdn0B21bg227JzgxxlCwu6L8SryAZyTe/pZ32jsUsGxuVqT2BLYczyQL7OqCG5902rnImsBjETkOIxXeCgThg==} + engines: {node: '>= 12.0.0'} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@parcel/core': ^2.8.1 dependencies: - '@typescript-eslint/parser': 5.46.1_ha6vam6werchizxrnqvarmz2zu - '@typescript-eslint/scope-manager': 5.46.1 - '@typescript-eslint/type-utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu - '@typescript-eslint/utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu - debug: 4.3.4 - eslint: 8.29.0 - ignore: 5.2.1 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.4 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color + '@parcel/core': 2.8.1 + '@parcel/fs': 2.8.1_@parcel+core@2.8.1 + '@parcel/logger': 2.8.1 + '@parcel/utils': 2.8.1 + lmdb: 2.5.2 dev: true - /@typescript-eslint/parser/5.46.1_ha6vam6werchizxrnqvarmz2zu: - resolution: {integrity: sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + /@parcel/codeframe/2.8.1: + resolution: {integrity: sha512-VNmnWJHYDQP9vRo9WZIGV5YeBzDuJVeYLLBzmYYnT2QZx85gXYKUm05LfYqKYnP0FmMT1bv7AWLMKN6HFhVrfw==} + engines: {node: '>= 12.0.0'} dependencies: - '@typescript-eslint/scope-manager': 5.46.1 - '@typescript-eslint/types': 5.46.1 - '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 - debug: 4.3.4 - eslint: 8.29.0 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color + chalk: 4.1.2 dev: true - /@typescript-eslint/scope-manager/5.46.1: - resolution: {integrity: sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@parcel/compressor-raw/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-mm3RFiaofqzwdFxkuvUopsiOe4dyBIheY8D5Yh4BebuavPcgvLmrW3B3BaIR84kv6l6zy3i0QiuaLgbYhnrnuQ==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} dependencies: - '@typescript-eslint/types': 5.46.1 - '@typescript-eslint/visitor-keys': 5.46.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + transitivePeerDependencies: + - '@parcel/core' dev: true - /@typescript-eslint/type-utils/5.46.1_ha6vam6werchizxrnqvarmz2zu: - resolution: {integrity: sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@parcel/config-default/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-UGj4BZ6keEPZ+8RWYRDEQJkbTaVG0r6ewNxqV4kKew4vCejRg1TMnQL8OJYG2non10sQqbmisfZMqCECA6OJMg==} peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@parcel/core': ^2.8.1 dependencies: - '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 - '@typescript-eslint/utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu - debug: 4.3.4 - eslint: 8.29.0 - tsutils: 3.21.0_typescript@4.9.4 - typescript: 4.9.4 + '@parcel/bundler-default': 2.8.1_@parcel+core@2.8.1 + '@parcel/compressor-raw': 2.8.1_@parcel+core@2.8.1 + '@parcel/core': 2.8.1 + '@parcel/namer-default': 2.8.1_@parcel+core@2.8.1 + '@parcel/optimizer-css': 2.8.1_@parcel+core@2.8.1 + '@parcel/optimizer-htmlnano': 2.8.1_@parcel+core@2.8.1 + '@parcel/optimizer-image': 2.8.1_@parcel+core@2.8.1 + '@parcel/optimizer-svgo': 2.8.1_@parcel+core@2.8.1 + '@parcel/optimizer-terser': 2.8.1_@parcel+core@2.8.1 + '@parcel/packager-css': 2.8.1_@parcel+core@2.8.1 + '@parcel/packager-html': 2.8.1_@parcel+core@2.8.1 + '@parcel/packager-js': 2.8.1_@parcel+core@2.8.1 + '@parcel/packager-raw': 2.8.1_@parcel+core@2.8.1 + '@parcel/packager-svg': 2.8.1_@parcel+core@2.8.1 + '@parcel/reporter-dev-server': 2.8.1_@parcel+core@2.8.1 + '@parcel/resolver-default': 2.8.1_@parcel+core@2.8.1 + '@parcel/runtime-browser-hmr': 2.8.1_@parcel+core@2.8.1 + '@parcel/runtime-js': 2.8.1_@parcel+core@2.8.1 + '@parcel/runtime-react-refresh': 2.8.1_@parcel+core@2.8.1 + '@parcel/runtime-service-worker': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-babel': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-css': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-html': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-image': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-js': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-json': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-postcss': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-posthtml': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-raw': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-react-refresh-wrap': 2.8.1_@parcel+core@2.8.1 + '@parcel/transformer-svg': 2.8.1_@parcel+core@2.8.1 transitivePeerDependencies: - - supports-color + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - uncss + dev: true + + /@parcel/core/2.8.1: + resolution: {integrity: sha512-i84Ic+Ei907kChVGrTOhN3+AB46ymqia0wJCxio/BAbUJc3PLx0EmOAgLutACVNompCYcXpV9kASiGJHcfHW5w==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.0 + '@parcel/cache': 2.8.1_@parcel+core@2.8.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/events': 2.8.1 + '@parcel/fs': 2.8.1_@parcel+core@2.8.1 + '@parcel/graph': 2.8.1 + '@parcel/hash': 2.8.1 + '@parcel/logger': 2.8.1 + '@parcel/package-manager': 2.8.1_@parcel+core@2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + '@parcel/workers': 2.8.1_@parcel+core@2.8.1 + abortcontroller-polyfill: 1.7.5 + base-x: 3.0.9 + browserslist: 4.21.4 + clone: 2.1.2 + dotenv: 7.0.0 + dotenv-expand: 5.1.0 + json5: 2.2.1 + msgpackr: 1.8.1 + nullthrows: 1.1.1 + semver: 5.7.1 + dev: true + + /@parcel/diagnostic/2.8.1: + resolution: {integrity: sha512-IyMREe9OkfEqTNi67ZmFRtc6dZ35w0Snj05yDnxv5fKcLftYgZ1UDl2/64WIQQ2MZQnrZV9qrdZssdPhY9Qf3A==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.0 + nullthrows: 1.1.1 dev: true - /@typescript-eslint/types/5.46.1: - resolution: {integrity: sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@parcel/events/2.8.1: + resolution: {integrity: sha512-x3JOa9RgEhHTGhRusC9/Er4/KZQ4F5M2QVTaHTmCqWqA/eOVXpi5xQTERvNFsb/5cmfsDlFPXPd1g4ErRJfasw==} + engines: {node: '>= 12.0.0'} dev: true - /@typescript-eslint/typescript-estree/5.46.1_typescript@4.9.4: - resolution: {integrity: sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + /@parcel/fs-search/2.8.1: + resolution: {integrity: sha512-zp1CjB3Va4Sp7JrS/8tUs5NzHYPiWgabsL70Xv7ExlvIBZC42HI0VEbBFvNn4/pra2s+VqJhStd2GTBvjnwk9g==} + engines: {node: '>= 12.0.0'} dependencies: - '@typescript-eslint/types': 5.46.1 - '@typescript-eslint/visitor-keys': 5.46.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.4 - typescript: 4.9.4 - transitivePeerDependencies: - - supports-color + detect-libc: 1.0.3 dev: true - /@typescript-eslint/utils/5.46.1_ha6vam6werchizxrnqvarmz2zu: - resolution: {integrity: sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@parcel/fs/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-+3lZfH0/2IoGrlq09SuOaULe55S6F+G2rGVHLqPt8JO9JJr1fMAZIGVA8YkPOv4Y/LhL0M1ly0gek4k+jl8iDg==} + engines: {node: '>= 12.0.0'} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@parcel/core': ^2.8.1 dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.46.1 - '@typescript-eslint/types': 5.46.1 - '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 - eslint: 8.29.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.29.0 - semver: 7.3.8 - transitivePeerDependencies: - - supports-color - - typescript + '@parcel/core': 2.8.1 + '@parcel/fs-search': 2.8.1 + '@parcel/types': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + '@parcel/watcher': 2.0.7 + '@parcel/workers': 2.8.1_@parcel+core@2.8.1 dev: true - /@typescript-eslint/visitor-keys/5.46.1: - resolution: {integrity: sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@parcel/graph/2.8.1: + resolution: {integrity: sha512-ZNRZLGfpcASMRhKmu3nySyMybqXtddneCf29E3FLqYEqj5dqbp4jBfKI55E9vxVUssp4cNKmVfqcTHFGXfGEaQ==} + engines: {node: '>= 12.0.0'} dependencies: - '@typescript-eslint/types': 5.46.1 - eslint-visitor-keys: 3.3.0 + nullthrows: 1.1.1 dev: true - /acorn-jsx/5.3.2_acorn@8.8.1: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + /@parcel/hash/2.8.1: + resolution: {integrity: sha512-qI2CDyN7ogdCi0Euha3pCr9oZ8+4XBO/hRlYPo6MQ7pAg/dfncg+xEpWyt/g2KRhbTapX/+Zk8SnRJyy+Pynvw==} + engines: {node: '>= 12.0.0'} dependencies: - acorn: 8.8.1 + detect-libc: 1.0.3 + xxhash-wasm: 0.4.2 dev: true - /acorn/8.8.1: - resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} - engines: {node: '>=0.4.0'} - hasBin: true + /@parcel/logger/2.8.1: + resolution: {integrity: sha512-jnZfAZT8OQVilATC+tgxoNgx1woc84akG6R3lYeYbmKByRQdZ5QzEUJ4IIgXKCXk6Vp+GhORs7Omot418zx1xg==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/events': 2.8.1 dev: true - /ajv/6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + /@parcel/markdown-ansi/2.8.1: + resolution: {integrity: sha512-5aNMdBlUniCjcJOdsgaLrr9xRKPgH7zmnifdJOlUOeW2wk95xRRVLIbTJoMtGxkN4gySxPZWX+SfOYXVLWqqAw==} + engines: {node: '>= 12.0.0'} dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + chalk: 4.1.2 dev: true - /ansi-regex/5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + /@parcel/namer-default/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-ewI1Rk7Fn3iqsgnU2bcelgQtckrhWtRip7mdeI7VWr+M/M1DiwVvaxOQCZ8E083umjooMvmRDXXx9YGAqT8Kgw==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' dev: true - /ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + /@parcel/node-resolver-core/2.8.1: + resolution: {integrity: sha512-kg7YQwYAIxVfV8DW8IjhiF1xf4XCQ9NReZSpgNZ1ubUvApakRqfLvttp4K1ZIpnm+OLvtgXn1euV4J9jhx7qXw==} + engines: {node: '>= 12.0.0'} dependencies: - color-convert: 2.0.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/utils': 2.8.1 + nullthrows: 1.1.1 + semver: 5.7.1 dev: true - /argparse/2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + /@parcel/optimizer-css/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-iZqNhZiMtTg2z19FpGkFFx3SQpWakh3S7gaG75fN4Mt3o84G35ag920uHT/6a34wFBHSuH05lLZGUlDwKIU5Ng==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.1 + browserslist: 4.21.4 + lightningcss: 1.17.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' dev: true - /array-union/2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + /@parcel/optimizer-htmlnano/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-lIm2nvU506fzNQl6VrsANKjHC1wVwqgfPLJreC7JazRLBYwTl2UvyjNmAEjtnmoGbwA6GS9+Y3TaYcbGjNvpwA==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + htmlnano: 2.0.3_svgo@2.8.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - uncss + dev: true + + /@parcel/optimizer-image/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-mi4pgr/aj47y5X7zLsHP+tFv9hW1wUDnAu9PxCrBKGE0uEqWs9L6boCzJ1dmjfnvNT9phs6ZXyv4zlayRBVQLw==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + '@parcel/workers': 2.8.1_@parcel+core@2.8.1 + detect-libc: 1.0.3 + transitivePeerDependencies: + - '@parcel/core' dev: true - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /@parcel/optimizer-svgo/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-V8KP+EaO0jLI0l3hpiv/fTSVRKCRKyBwSZt0dnWU2LWPAOIK5H3ggeicXc61th+nEACk/u7YzoP7oxpU87VzHA==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' dev: true - /brace-expansion/1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + /@parcel/optimizer-terser/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-ELNtiq1nqvEfURwFgSzK93Zb3C0ruxIUT/ln8zGi8KQTxWKA0PLthzlAqwAotA/zKF5DwjUa3gw0pn2xKuZv8w==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.1 + nullthrows: 1.1.1 + terser: 5.16.1 + transitivePeerDependencies: + - '@parcel/core' dev: true - /braces/3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + /@parcel/package-manager/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-zv0hAOwlCHcV4jNM60hG9fkNcEwkI9O/FsZlPMqqXBq5rKJ4iMyvOoMCzkfWUqf3RkgqvXSqTfEaDD6MQJ0ZGg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.1 dependencies: - fill-range: 7.0.1 + '@parcel/core': 2.8.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/fs': 2.8.1_@parcel+core@2.8.1 + '@parcel/logger': 2.8.1 + '@parcel/types': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + '@parcel/workers': 2.8.1_@parcel+core@2.8.1 + semver: 5.7.1 + dev: true + + /@parcel/packager-css/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-nFeIwNgElEVZQCUKOU52T34TMpUhpCazNzAD79/Adrwu4YsFlIU6DmGePyGYlXDNlyuM+gCIu5uXgVUyn96ZnA==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' dev: true - /callsites/3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + /@parcel/packager-html/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-9e1HM4kutardgEmWLJTqG+jGoA/sozaN8xVQ8tavFRyMS3dEjB78Kb/+nT887nIXmoWSFSkUkh1LM+9O4OqkJQ==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/types': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/packager-js/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-BWJsCjBZAexeCHGDxJrXYduVdlTygj6Ok6HIg2skIkAVfPLipx9GIh10EBsdHZy3GhWddvnvxaMXQdUvoADnEw==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/hash': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.1 + globals: 13.19.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/packager-raw/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-VeXRLPT2WF03sVjxI1yaRvDJAvxorxCLm56xwxCWmDgRTBb4q/cv81AAVztLkYsOltjDWJnFSQLm1AvZz6oSaw==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/packager-svg/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-Yln3iuAohtVN8XDDbBWqH0fUMVWfsmDpJ6pNjZPTyXeaFOw2GkqvRaQwQM5CDXKGstkLHCzYBBhIVrmEWxTyXA==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/types': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/plugin/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-7rAKJ8UvjwMwyiOKy5nl1UEjeLLINN6tKU8Gr9rqjfC9lux/wrd0+wuixtncThpyNJHOdmPggqTA412s2pgbNQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/types': 2.8.1_@parcel+core@2.8.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/reporter-cli/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-9+Wk9eaQOTHAQs6h+aeoqPGCJxNJkMdLnD7eHbHd8Jn+Ge4ux29yBJUn5zfmWLo/5zGI8yXDjoLLOQNPqVgU2g==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/types': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + chalk: 4.1.2 + term-size: 2.2.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/reporter-dev-server/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-LO3gu8r+NpKJHNzJPEum/Mvem0Pr8B66J7OAFJWCHkJ4QMJU7V8F40gcweKCbbVBctMelptz2eTqXr4pBgrlkg==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/resolver-default/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-t203Y7PEGnwl4GEr9AthgMOgjLbtCCKzzKty3PLRSeZY4e2grc/SRUWZM7lQO2UMlKpheXuEJy4irvHl7qv43A==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/node-resolver-core': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/runtime-browser-hmr/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-BmkJYQYGtkXNnI25sl1yE9sWDXK1t6Rtz3tTUDB0kD62ukV6rx6qjEpmcHdB2NgjvAkPIwZHnVK4KE1QX71dTg==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/runtime-js/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-OMbjlunfk+b+4OUjjCZxsJOlxXAG878g6rUr1LIBBlukK65z1WxhjBukjf2y7ZbtIvIx3/k07fNgekQeFYBJaQ==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/runtime-react-refresh/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-HbPKocBTt9Adj01MTYJnkp+U8WODBCCE+j9GdUHnLEobuctupLLM+ARiGXEzc4T+dwxgo/1nKaYCki9segCBFg==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + react-error-overlay: 6.0.9 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/runtime-service-worker/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-hIwtcx6UxXTxv3LzQHX057jrlYXKSQMmLDq0+CNHMvStjIqMvE2inn6WBXL7fBC0iFbe4/wknRow+cX8nHKIzQ==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/source-map/2.1.1: + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + dependencies: + detect-libc: 1.0.3 + dev: true + + /@parcel/transformer-babel/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-pIURnRJ1GU885tRrSHmmA6sE8JSC8/KpU9XM9wmK6Se/nWbSFTvNkiRx1sXxmUXBUPBCa0VFqQEcwrzGB4Py6A==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.1 + browserslist: 4.21.4 + json5: 2.2.1 + nullthrows: 1.1.1 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-css/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-DUPIcfZpuPYR/6SAu1TI08n2zjb7p3qoAkqqh2lIQniL99uEq8OsNFl84JEwUIiESZS/ExpQ7yXxAN7G1qamVw==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.1 + browserslist: 4.21.4 + lightningcss: 1.17.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-html/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-Ve9qjNE+gWdyHyDKyzq+UwYdX0KjoHGo8WVN2qX0UtH+TYwnoi51oi+GTBa96+0Rq8fzBHWkqf53sUTFzDaFdw==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/hash': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-image/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-K5PF00LXY1RelPEdMcZSc/rsQcjjmeBNDvLSrv9DWVbhiYZ+k3JRS9y5Ga+wPYRdEl0d+Z61ku0+cqz/uCoryA==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + peerDependencies: + '@parcel/core': ^2.8.1 + dependencies: + '@parcel/core': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + '@parcel/workers': 2.8.1_@parcel+core@2.8.1 + nullthrows: 1.1.1 + dev: true + + /@parcel/transformer-js/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-yGYpgBwL0DrkojXNvij+8f1Av6oU8PNUMVbfZRIVMdZ+Wtjx8NyAeY16cjSIxnG16vL5Pff+QhlBKRp9n6tnKA==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + peerDependencies: + '@parcel/core': ^2.8.1 + dependencies: + '@parcel/core': 2.8.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.1 + '@parcel/workers': 2.8.1_@parcel+core@2.8.1 + '@swc/helpers': 0.4.14 + browserslist: 4.21.4 + detect-libc: 1.0.3 + nullthrows: 1.1.1 + regenerator-runtime: 0.13.11 + semver: 5.7.1 + dev: true + + /@parcel/transformer-json/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-CijTTmMModiyBJCJoPlQvjrByaAs4jKMF+8Mbbaap39A1hJPNVSReFvHbRBO/cZ+2uVgxuSmfYD00YuZ784aVg==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + json5: 2.2.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-postcss/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-xmO4zA8nCgCgPstqxHr2BzRSJtqAy8cyAY1R9oi5FHkU5xHEzOGrcj5JynlU0eJssFten48kf8Csx6ciOsH1ZA==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/hash': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-posthtml/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-CLrSw+386j7RCrWV3Oyob4qNP+qyfVRDs1BzJZMMW8MFjxEC/ohPi2piGNzaqWPHOvATFodqXBvJBc2WcEZKGA==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-raw/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-LVC6FX5tcLrZcOV1yzA8FMT5R+u2uQqCt/TXPhrt3MBw3WovKpaMicSkR0AI/802tg+nm1wpURVEfAA2S9+AQw==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-react-refresh-wrap/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-VkULeuyy0CrxfMwrRkn4V/HmbXzbuqp3+drvYFRCo29SFuC6rJbBF43XiewmvJijWIGCfEAa6bU9/csg2d5+3g==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-svg/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-HSPve53tWttfKmoXgNLmrF49UCsE38xsA/CkWxI6wQM2qoqLMyei5DY9UsD0cjcAm87tSlZFTq9E/Nbol8g50w==} + engines: {node: '>= 12.0.0', parcel: ^2.8.1} + dependencies: + '@parcel/diagnostic': 2.8.1 + '@parcel/hash': 2.8.1 + '@parcel/plugin': 2.8.1_@parcel+core@2.8.1 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/types/2.8.1: + resolution: {integrity: sha512-sLkpjGCCJy8Hxe6+dme+sugyu6+RW5B8WcdXG1Ynp7SkdgEYV44TKNVGnhoxsHi50G+O1ktZ4jzAu+pzubidXQ==} + dependencies: + '@parcel/cache': 2.8.1_@parcel+core@2.8.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/fs': 2.8.1_@parcel+core@2.8.1 + '@parcel/package-manager': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.8.1_@parcel+core@2.8.1 + utility-types: 3.10.0 + dev: true + + /@parcel/types/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-sLkpjGCCJy8Hxe6+dme+sugyu6+RW5B8WcdXG1Ynp7SkdgEYV44TKNVGnhoxsHi50G+O1ktZ4jzAu+pzubidXQ==} + dependencies: + '@parcel/cache': 2.8.1_@parcel+core@2.8.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/fs': 2.8.1_@parcel+core@2.8.1 + '@parcel/package-manager': 2.8.1_@parcel+core@2.8.1 + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.8.1_@parcel+core@2.8.1 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/utils/2.8.1: + resolution: {integrity: sha512-C01Iz+K7oUVNTEzMW6SLDpqTDpm+Z3S+Ms3TxImkLYmdvYpYtzdU+gAllv6ck9WgB1Kqgcxq3TC0yhFsNDb5WQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/codeframe': 2.8.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/hash': 2.8.1 + '@parcel/logger': 2.8.1 + '@parcel/markdown-ansi': 2.8.1 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + dev: true + + /@parcel/watcher/2.0.7: + resolution: {integrity: sha512-gc3hoS6e+2XdIQ4HHljDB1l0Yx2EWh/sBBtCEFNKGSMlwASWeAQsOY/fPbxOBcZ/pg0jBh4Ga+4xHlZc4faAEQ==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.5.0 + dev: true + + /@parcel/workers/2.8.1_@parcel+core@2.8.1: + resolution: {integrity: sha512-6TnRPwBpxXUsekKK88OxPZ500gvApxF0TaZdSDvmMlvDWjZYgkDN3AAsaFS1gwFLS4XKogn2TgjUnocVof8DXg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.1 + dependencies: + '@parcel/core': 2.8.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/logger': 2.8.1 + '@parcel/types': 2.8.1 + '@parcel/utils': 2.8.1 + chrome-trace-event: 1.0.3 + nullthrows: 1.1.1 + dev: true + + /@sideway/address/4.1.4: + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true + + /@sideway/formula/3.0.0: + resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} + dev: true + + /@sideway/pinpoint/2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + dev: true + + /@sidvind/better-ajv-errors/2.1.0_ajv@8.11.2: + resolution: {integrity: sha512-JuIb009FhHuL9priFBho2kv7QmZOydj0LgYvj+h1t0mMCmhM/YmQNRlJR5wVtBZya6wrVFK5Hi5TIbv5BKEx7w==} + engines: {node: '>= 14.0.0'} + peerDependencies: + ajv: 4.11.8 - 8 + dependencies: + '@babel/code-frame': 7.18.6 + ajv: 8.11.2 + chalk: 4.1.2 + dev: true + + /@swc/helpers/0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + dependencies: + tslib: 2.4.1 + dev: true + + /@trysound/sax/0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/json5/0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/node/14.18.34: + resolution: {integrity: sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==} + dev: true + + /@types/node/18.11.14: + resolution: {integrity: sha512-0KXV57tENYmmJMl+FekeW9V3O/rlcqGQQJ/hNh9r8pKIj304pskWuEd8fCyNT86g/TpO0gcOTiLzsHLEURFMIQ==} + dev: true + + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + + /@types/sinonjs__fake-timers/8.1.1: + resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} + dev: true + + /@types/sizzle/2.3.3: + resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==} + dev: true + + /@types/yauzl/2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + requiresBuild: true + dependencies: + '@types/node': 18.11.14 + dev: true + optional: true + + /@typescript-eslint/eslint-plugin/5.46.1_imrg37k3svwu377c6q7gkarwmi: + resolution: {integrity: sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.46.1_ha6vam6werchizxrnqvarmz2zu + '@typescript-eslint/scope-manager': 5.46.1 + '@typescript-eslint/type-utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu + '@typescript-eslint/utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu + debug: 4.3.4 + eslint: 8.29.0 + ignore: 5.2.1 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.46.1_ha6vam6werchizxrnqvarmz2zu: + resolution: {integrity: sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.46.1 + '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 + debug: 4.3.4 + eslint: 8.29.0 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.46.1: + resolution: {integrity: sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/visitor-keys': 5.46.1 + dev: true + + /@typescript-eslint/type-utils/5.46.1_ha6vam6werchizxrnqvarmz2zu: + resolution: {integrity: sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 + '@typescript-eslint/utils': 5.46.1_ha6vam6werchizxrnqvarmz2zu + debug: 4.3.4 + eslint: 8.29.0 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.46.1: + resolution: {integrity: sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/5.46.1_typescript@4.9.4: + resolution: {integrity: sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/visitor-keys': 5.46.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.46.1_ha6vam6werchizxrnqvarmz2zu: + resolution: {integrity: sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.46.1 + '@typescript-eslint/types': 5.46.1 + '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 + eslint: 8.29.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.29.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.46.1: + resolution: {integrity: sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.46.1 + eslint-visitor-keys: 3.3.0 + dev: true + + /@wildpeaks/snapshot-dom/1.6.0: + resolution: {integrity: sha512-fCM5tYK6VZ1nhbk3Q11lkf6UOJlOCRU0oScQ8NV8OYBPC58wQmQaOF9g+rk+yhNYf3beybOBr+ZuiNen3B0Bxw==} + dev: true + + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /abortcontroller-polyfill/1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + dev: true + + /acorn-jsx/5.3.2_acorn@8.8.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.1 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv/8.11.2: + resolution: {integrity: sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /am-i-a-dependency/1.1.2: + resolution: {integrity: sha512-h9Wm0GBuTJVKbtwDHBzdJr932O9iTR5lAgebGSke1b3V4pqzbwOsa1R3bYhff89Ch3+v3A4EgbX3vem+5Rl6Zg==} + engines: {node: '>=4'} + dev: true + + /ansi-colors/4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex/2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex/4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /arch/2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: true + + /arg/5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + get-intrinsic: 1.1.3 + is-string: 1.0.7 + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat/1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + es-shim-unscopables: 1.0.0 + dev: true + + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus/1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /astral-regex/2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async/3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: true + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /aws-sign2/0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4/1.11.0: + resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + dev: true + + /axios/0.25.0_debug@4.3.4: + resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} + dependencies: + follow-redirects: 1.15.2_debug@4.3.4 + transitivePeerDependencies: + - debug + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base-x/3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /bcrypt-pbkdf/1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /blob-util/2.0.2: + resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} + dev: true + + /bluebird/3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001439 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /cachedir/2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.3 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite/1.0.30001439: + resolution: {integrity: sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==} + dev: true + + /caseless/0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /chalk/1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-more-types/2.24.0: + resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} + engines: {node: '>= 0.8.0'} + dev: true + + /chrome-trace-event/1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info/3.7.0: + resolution: {integrity: sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==} + engines: {node: '>=8'} + dev: true + + /clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + /cli-cursor/3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-table3/0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: true + + /cli-truncate/2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /clone/2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + color-name: 1.1.3 dev: true /color-convert/2.0.1: @@ -293,14 +1615,70 @@ packages: color-name: 1.1.4 dev: true + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true + /colorette/2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander/5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + dev: true + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /common-tags/1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /config-chain/1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /core-util-is/1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /cosmiconfig/7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -310,6 +1688,165 @@ packages: which: 2.0.2 dev: true + /css-select/4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree/1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /csso/4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /cypress-html-validate/5.1.1_ep4i4dlnhxg6lrjj5tdhzkg3m4: + resolution: {integrity: sha512-StyLLcLt6IocGgG2z282Sigkrt2t79BtR+56FaR+/Ng6GFD2dxWM2096o0tx+fKNzj05DoeRU8hsHJgyFVhFyQ==} + engines: {node: '>= 14.19'} + peerDependencies: + cypress: ^7.0.1 || ^8 || ^9 || ^10 || ^11.0.1 || ^12 + html-validate: ^2.17 || ^3 || ^4 || ^5 || ^6 || ^7 + dependencies: + cypress: 12.1.0 + html-validate: 7.10.1 + dev: true + + /cypress/12.1.0: + resolution: {integrity: sha512-7fz8N84uhN1+ePNDsfQvoWEl4P3/VGKKmAg+bJQFY4onhA37Ys+6oBkGbNdwGeC7n2QqibNVPhk8x3YuQLwzfw==} + engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} + hasBin: true + requiresBuild: true + dependencies: + '@cypress/request': 2.88.10 + '@cypress/xvfb': 1.2.4_supports-color@8.1.1 + '@types/node': 14.18.34 + '@types/sinonjs__fake-timers': 8.1.1 + '@types/sizzle': 2.3.3 + arch: 2.2.0 + blob-util: 2.0.2 + bluebird: 3.7.2 + buffer: 5.7.1 + cachedir: 2.3.0 + chalk: 4.1.2 + check-more-types: 2.24.0 + cli-cursor: 3.1.0 + cli-table3: 0.6.3 + commander: 5.1.0 + common-tags: 1.8.2 + dayjs: 1.11.7 + debug: 4.3.4_supports-color@8.1.1 + enquirer: 2.3.6 + 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.3.6 + lodash: 4.17.21 + log-symbols: 4.1.0 + minimist: 1.2.7 + ospath: 1.2.2 + pretty-bytes: 5.6.0 + proxy-from-env: 1.0.0 + request-progress: 3.0.0 + semver: 7.3.8 + supports-color: 8.1.1 + tmp: 0.2.1 + untildify: 4.0.0 + yauzl: 2.10.0 + dev: true + + /dashdash/1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /dayjs/1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug/3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug/3.2.7_supports-color@8.1.1: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 8.1.1 + dev: true + + /debug/4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -322,10 +1859,52 @@ packages: ms: 2.1.2 dev: true + /debug/4.3.4_supports-color@8.1.1: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + dev: true + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /define-properties/1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /detect-libc/1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /diff/1.4.0: + resolution: {integrity: sha512-VzVc42hMZbYU9Sx/ltb7KYuQ6pqAw+cbFWVy4XKdkuEL2CFaRLGEnISPs7YdzaUGpi+CpIqvRmu7hPQ4T7EQ5w==} + engines: {node: '>=0.3.1'} + dev: true + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -333,6 +1912,21 @@ packages: path-type: 4.0.0 dev: true + /disparity/2.0.0: + resolution: {integrity: sha512-caMA9oIQbDeobWc9MVUF0+o1APVo0UZnfD482x0RaLLAzpAc6Dla2mk5ef7onsG91tziIRr41rj4sVt3BOLLZw==} + hasBin: true + dependencies: + ansi-styles: 2.2.1 + diff: 1.4.0 + dev: true + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + /doctrine/3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -340,11 +1934,198 @@ packages: esutils: 2.0.3 dev: true + /dom-serializer/1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler/4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /dotenv-expand/5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dev: true + + /dotenv/7.0.0: + resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} + engines: {node: '>=6'} + dev: true + + /duplexer/0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /ecc-jsbn/0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /editorconfig/0.15.3: + resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} + hasBin: true + dependencies: + commander: 2.20.3 + lru-cache: 4.1.5 + semver: 5.7.1 + sigmund: 1.0.1 + dev: true + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /enquirer/2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities/3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract/1.20.5: + resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.1.3 + get-symbol-description: 1.0.0 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.2 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + unbox-primitive: 1.0.2 + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true + /eslint-import-resolver-node/0.3.6: + resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + dependencies: + debug: 3.2.7 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils/2.7.4_h4dlhne3g63bjzyi45ugdl2u4u: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.46.1_ha6vam6werchizxrnqvarmz2zu + debug: 3.2.7 + eslint: 8.29.0 + eslint-import-resolver-node: 0.3.6 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-plugin-align-assignments/1.1.2_eslint@8.29.0: resolution: {integrity: sha512-I1ZJgk9EjHfGVU9M2Ex8UkVkkjLL5Y9BS6VNnQHq79eHj2H4/Cgxf36lQSUTLgm2ntB03A2NtF+zg9fyi5vChg==} peerDependencies: @@ -353,6 +2134,81 @@ packages: eslint: 8.29.0 dev: true + /eslint-plugin-cypress/2.12.1_eslint@8.29.0: + resolution: {integrity: sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==} + peerDependencies: + eslint: '>= 3.2.1' + dependencies: + eslint: 8.29.0 + globals: 11.12.0 + dev: true + + /eslint-plugin-es/3.0.1_eslint@8.29.0: + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.29.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-import/2.26.0_z7hwuz3w5sq2sbhy7d4iqrnsvq: + resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.46.1_ha6vam6werchizxrnqvarmz2zu + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.29.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.4_h4dlhne3g63bjzyi45ugdl2u4u + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-node/11.1.0_eslint@8.29.0: + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.29.0 + eslint-plugin-es: 3.0.1_eslint@8.29.0 + eslint-utils: 2.1.0 + ignore: 5.2.1 + minimatch: 3.1.2 + resolve: 1.22.1 + semver: 6.3.0 + dev: true + + /eslint-plugin-promise/6.1.1_eslint@8.29.0: + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.29.0 + dev: true + /eslint-scope/5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -369,6 +2225,13 @@ packages: estraverse: 5.3.0 dev: true + /eslint-utils/2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + /eslint-utils/3.0.0_eslint@8.29.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} @@ -379,6 +2242,11 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /eslint-visitor-keys/1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + /eslint-visitor-keys/2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -475,6 +2343,82 @@ packages: engines: {node: '>=0.10.0'} dev: true + /event-stream/3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + dev: true + + /eventemitter2/6.4.7: + resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} + dev: true + + /execa/4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /executable/4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + dependencies: + pify: 2.3.0 + dev: true + + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /extract-zip/2.0.1_supports-color@8.1.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4_supports-color@8.1.1 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.0 + transitivePeerDependencies: + - supports-color + dev: true + + /extsprintf/1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -504,6 +2448,19 @@ packages: reusify: 1.0.4 dev: true + /fd-slicer/1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /figures/3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -538,10 +2495,120 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true + /folktale/2.0.1: + resolution: {integrity: sha512-3kDSWVkSlErHIt/dC73vu+5zRqbW1mlnL46s2QfYN7Ps0JcS9MVtuLCrDQOBa7sanA+d9Fd8F+bn0VcyNe68Jw==} + dev: true + + /folktale/2.3.2: + resolution: {integrity: sha512-+8GbtQBwEqutP0v3uajDDoN64K2ehmHd0cjlghhxh0WpcfPzAIjPA03e1VvHlxL02FVGR0A6lwXsNQKn3H1RNQ==} + dev: true + + /follow-redirects/1.15.2_debug@4.3.4: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4 + dev: true + + /forever-agent/0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /form-data/2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /from/0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + dev: true + + /fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-intrinsic/1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: true + + /get-port/4.2.0: + resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} + engines: {node: '>=6'} + dev: true + + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + dev: true + + /getos/3.2.1: + resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} + dependencies: + async: 3.2.4 + dev: true + + /getpass/0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -567,6 +2634,29 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob/8.0.3: + resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.1 + once: 1.4.0 + dev: true + + /global-dirs/3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + /globals/13.19.0: resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} @@ -586,15 +2676,164 @@ packages: slash: 3.0.0 dev: true + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.1.3 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true + /has-ansi/2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.1.3 + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-validate/7.10.1: + resolution: {integrity: sha512-2MjthTcMfqAZ8V1YyXshINGsdmPKc3RW9IKJ3kgfjXq59BuvSVM+vBhfOu0dJvlpRVH117vZ5JImYNsMfca3nA==} + engines: {node: '>= 14.0'} + hasBin: true + peerDependencies: + jest: ^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3 + jest-diff: ^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3 + jest-snapshot: ^25.1 || ^26 || ^27.1 || ^28.1.3 || ^29.0.3 + peerDependenciesMeta: + jest: + optional: true + jest-diff: + optional: true + jest-snapshot: + optional: true + dependencies: + '@babel/code-frame': 7.18.6 + '@html-validate/stylish': 3.0.1 + '@sidvind/better-ajv-errors': 2.1.0_ajv@8.11.2 + acorn-walk: 8.2.0 + ajv: 8.11.2 + deepmerge: 4.2.2 + espree: 9.4.1 + glob: 8.0.3 + ignore: 5.2.1 + kleur: 4.1.5 + minimist: 1.2.7 + prompts: 2.4.2 + semver: 7.3.8 + dev: true + + /htmlnano/2.0.3_svgo@2.8.0: + resolution: {integrity: sha512-S4PGGj9RbdgW8LhbILNK7W9JhmYP8zmDY7KDV/8eCiJBQJlbmltp5I0gv8c5ntLljfdxxfmJ+UJVSqyH4mb41A==} + peerDependencies: + cssnano: ^5.0.11 + postcss: ^8.3.11 + purgecss: ^5.0.0 + relateurl: ^0.2.7 + srcset: 4.0.0 + svgo: ^2.8.0 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + dependencies: + cosmiconfig: 7.1.0 + posthtml: 0.16.6 + svgo: 2.8.0 + timsort: 0.3.0 + dev: true + + /htmlparser2/7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: true + + /http-signature/1.3.6: + resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + jsprim: 2.0.2 + sshpk: 1.17.0 + dev: true + + /human-signals/1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + /ignore/5.2.1: resolution: {integrity: sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==} engines: {node: '>= 4'} @@ -613,6 +2852,11 @@ packages: engines: {node: '>=0.8.19'} dev: true + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -620,40 +2864,212 @@ packages: wrappy: 1.0.2 dev: true - /inherits/2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ini/2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: true + + /internal-slot/1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.3 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci/3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.7.0 + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-installed-globally/0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: true + + /is-json/2.0.1: + resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typedarray/1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unicode-supported/0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 dev: true - /is-extglob/2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /is-glob/4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 + /isstream/0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: true - /is-number/7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + /its-name/1.0.0: + resolution: {integrity: sha512-GYUWFxViqxDvGzsNEItTEuOqqAQVx29Xl9Lh5YUqyJd6gPHTCMiIbjqcjjyUzsBUqEcgwIdRoydwgfFw1oYbhg==} + engines: {node: '>=6'} dev: true - /is-path-inside/3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + /joi/17.7.0: + resolution: {integrity: sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.0 + '@sideway/pinpoint': 2.0.0 dev: true - /isexe/2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /js-beautify/1.10.3: + resolution: {integrity: sha512-wfk/IAWobz1TfApSdivH5PJ0miIHgDoYb1ugSqHcODPmaYu46rYe5FVuIEkhjg8IQiv6rDNPyhsqbsohI/C2vQ==} + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 0.15.3 + glob: 7.2.3 + mkdirp: 0.5.6 + nopt: 4.0.3 dev: true /js-sdsl/4.2.0: resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} dev: true + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + /js-yaml/4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -661,14 +3077,80 @@ packages: argparse: 2.0.1 dev: true + /jsbn/0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true + /json-stringify-safe/5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5/1.0.1: + resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + hasBin: true + dependencies: + minimist: 1.2.7 + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /jsprim/2.0.2: + resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /lazy-ass/1.6.0: + resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} + engines: {node: '> 0.8'} + dev: true + /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -677,6 +3159,136 @@ packages: type-check: 0.4.0 dev: true + /lightningcss-darwin-arm64/1.17.1: + resolution: {integrity: sha512-YTAHEy4XlzI3sMbUVjbPi9P7+N7lGcgl2JhCZhiQdRAEKnZLQch8kb5601sgESxdGXjgei7JZFqi/vVEk81wYg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-darwin-x64/1.17.1: + resolution: {integrity: sha512-UhXPUS2+yTTf5sXwUV0+8QY2x0bPGLgC/uhcknWSQMqWn1zGty4fFvH04D7f7ij0ujwSuN+Q0HtU7lgmMrPz0A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm-gnueabihf/1.17.1: + resolution: {integrity: sha512-alUZumuznB6K/9yZ0zuZkODXUm8uRnvs9t0CL46CXN16Y2h4gOx5ahUCMlelUb7inZEsgJIoepgLsJzBUrSsBw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-gnu/1.17.1: + resolution: {integrity: sha512-/1XaH2cOjDt+ivmgfmVFUYCA0MtfNWwtC4P8qVi53zEQ7P8euyyZ1ynykZOyKXW9Q0DzrwcLTh6+hxVLcbtGBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-arm64-musl/1.17.1: + resolution: {integrity: sha512-/IgE7lYWFHCCQFTMIwtt+fXLcVOha8rcrNze1JYGPWNorO6NBc6MJo5u5cwn5qMMSz9fZCCDIlBBU4mGwjQszQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-gnu/1.17.1: + resolution: {integrity: sha512-OyE802IAp4DB9vZrHlOyWunbHLM9dN08tJIKN/HhzzLKIHizubOWX6NMzUXMZLsaUrYwVAHHdyEA+712p8mMzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-linux-x64-musl/1.17.1: + resolution: {integrity: sha512-ydwGgV3Usba5P53RAOqCA9MsRsbb8jFIEVhf7/BXFjpKNoIQyijVTXhwIgQr/oGwUNOHfgQ3F8ruiUjX/p2YKw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /lightningcss-win32-x64-msvc/1.17.1: + resolution: {integrity: sha512-Ngqtx9NazaiAOk71XWwSsqgAuwYF+8PO6UYsoU7hAukdrSS98kwaBMEDw1igeIiZy1XD/4kh5KVnkjNf7ZOxVQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /lightningcss/1.17.1: + resolution: {integrity: sha512-DwwM/YYqGwLLP3he41wzDXT/m+8jdEZ80i9ViQNLRgyhey3Vm6N7XHn+4o3PY6wSnVT23WLuaROIpbpIVTNOjg==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.17.1 + lightningcss-darwin-x64: 1.17.1 + lightningcss-linux-arm-gnueabihf: 1.17.1 + lightningcss-linux-arm64-gnu: 1.17.1 + lightningcss-linux-arm64-musl: 1.17.1 + lightningcss-linux-x64-gnu: 1.17.1 + lightningcss-linux-x64-musl: 1.17.1 + lightningcss-win32-x64-msvc: 1.17.1 + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /listr2/3.14.0_enquirer@2.3.6: + resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} + engines: {node: '>=10.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.19 + enquirer: 2.3.6 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.6.0 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /lmdb/2.5.2: + resolution: {integrity: sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==} + requiresBuild: true + dependencies: + msgpackr: 1.8.1 + node-addon-api: 4.3.0 + node-gyp-build-optional-packages: 5.0.3 + ordered-binary: 1.4.0 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.5.2 + '@lmdb/lmdb-darwin-x64': 2.5.2 + '@lmdb/lmdb-linux-arm': 2.5.2 + '@lmdb/lmdb-linux-arm64': 2.5.2 + '@lmdb/lmdb-linux-x64': 2.5.2 + '@lmdb/lmdb-win32-x64': 2.5.2 + dev: true + /locate-path/6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -688,6 +3300,39 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true + /lodash.once/4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-symbols/4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update/4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -695,6 +3340,18 @@ packages: yallist: 4.0.0 dev: true + /map-stream/0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + dev: true + + /mdn-data/2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -708,16 +3365,81 @@ packages: picomatch: 2.3.1 dev: true + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true + /minimatch/5.1.1: + resolution: {integrity: sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist/1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.7 + dev: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /msgpackr-extract/2.2.0: + resolution: {integrity: sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog==} + hasBin: true + requiresBuild: true + dependencies: + node-gyp-build-optional-packages: 5.0.3 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 2.2.0 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 2.2.0 + '@msgpackr-extract/msgpackr-extract-linux-arm': 2.2.0 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 2.2.0 + '@msgpackr-extract/msgpackr-extract-linux-x64': 2.2.0 + '@msgpackr-extract/msgpackr-extract-win32-x64': 2.2.0 + dev: true + optional: true + + /msgpackr/1.8.1: + resolution: {integrity: sha512-05fT4J8ZqjYlR4QcRDIhLCYKUOHXk7C/xa62GzMKj74l3up9k2QZ3LgFc6qWdsPHl91QA2WLWqWc8b8t7GLNNw==} + optionalDependencies: + msgpackr-extract: 2.2.0 + dev: true + /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -726,12 +3448,99 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /node-addon-api/3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + dev: true + + /node-addon-api/4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + dev: true + + /node-gyp-build-optional-packages/5.0.3: + resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} + hasBin: true + dev: true + + /node-gyp-build/4.5.0: + resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} + hasBin: true + dev: true + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /nopt/4.0.3: + resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + osenv: 0.1.5 + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /nullthrows/1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + dev: true + /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -744,6 +3553,31 @@ packages: word-wrap: 1.2.3 dev: true + /ordered-binary/1.4.0: + resolution: {integrity: sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==} + dev: true + + /os-homedir/1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: true + + /os-tmpdir/1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /osenv/0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: true + + /ospath/1.2.2: + resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} + dev: true + /p-limit/3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -758,6 +3592,51 @@ packages: p-limit: 3.1.0 dev: true + /p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /parcel-plugin-nuke-dist/1.0.1: + resolution: {integrity: sha512-pwYcpHDRohHMpRvU5HeDG8uTvMtT6xTQYDdY7jIEz5dIYQo6L17lYWal29mJyfQZeI4nLHhl+UNR6axoCoRLsg==} + dependencies: + rimraf: 3.0.2 + dev: true + + /parcel/2.8.1: + resolution: {integrity: sha512-3hl31uIRG+k3N54Le0fLQU8a5VsKFN3j3igs3rEQv6GtXFUNjq58m/Fc1dbOI/v+0fPOv01wyHACn9MCQYesVA==} + engines: {node: '>= 12.0.0'} + hasBin: true + peerDependenciesMeta: + '@parcel/core': + optional: true + dependencies: + '@parcel/config-default': 2.8.1_@parcel+core@2.8.1 + '@parcel/core': 2.8.1 + '@parcel/diagnostic': 2.8.1 + '@parcel/events': 2.8.1 + '@parcel/fs': 2.8.1_@parcel+core@2.8.1 + '@parcel/logger': 2.8.1 + '@parcel/package-manager': 2.8.1_@parcel+core@2.8.1 + '@parcel/reporter-cli': 2.8.1_@parcel+core@2.8.1 + '@parcel/reporter-dev-server': 2.8.1_@parcel+core@2.8.1 + '@parcel/utils': 2.8.1 + chalk: 4.1.2 + commander: 7.2.0 + get-port: 4.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - uncss + dev: true + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -765,6 +3644,16 @@ packages: callsites: 3.1.0 dev: true + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -780,19 +3669,123 @@ packages: engines: {node: '>=8'} dev: true - /path-type/4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pause-stream/0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + dependencies: + through: 2.3.8 + dev: true + + /pend/1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now/2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /posthtml-parser/0.10.2: + resolution: {integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: true + + /posthtml-parser/0.11.0: + resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: true + + /posthtml-render/3.0.0: + resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} + engines: {node: '>=12'} + dependencies: + is-json: 2.0.1 + dev: true + + /posthtml/0.16.6: + resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} + engines: {node: '>=12.0.0'} + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + dev: true + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /pretty-bytes/5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /proto-list/1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + + /proxy-from-env/1.0.0: + resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} + dev: true + + /ps-tree/1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + event-stream: 3.3.4 + dev: true + + /pseudomap/1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true - /picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /prelude-ls/1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 dev: true /punycode/2.1.1: @@ -800,25 +3793,93 @@ packages: engines: {node: '>=6'} dev: true + /qs/6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: true + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /ramda/0.25.0: + resolution: {integrity: sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==} + dev: true + + /react-error-overlay/6.0.9: + resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} + dev: true + + /react-refresh/0.9.0: + resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + functions-have-names: 1.2.3 + dev: true + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true + /request-progress/3.0.0: + resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} + dependencies: + throttleit: 1.0.0 + dev: true + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor/3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /retypeapp-linux-x64/2.4.0: + resolution: {integrity: sha512-AiQRH9HWYYu8VjgpL4DfSbx3qYQ8ejnPrUoGO//m2YpOazt6G5T5w3T38nszVdPUtvatybYOwPVFtyhqYewbjw==} + hasBin: true + dev: true + /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true + /rfdc/1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -832,6 +3893,38 @@ packages: queue-microtask: 1.2.3 dev: true + /rxjs/7.6.0: + resolution: {integrity: sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==} + dependencies: + tslib: 2.4.1 + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + is-regex: 1.1.4 + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + /semver/7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} @@ -852,11 +3945,178 @@ packages: engines: {node: '>=8'} dev: true + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + object-inspect: 1.12.2 + dev: true + + /sigmund/1.0.1: + resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true + /slice-ansi/3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi/4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /snap-shot-compare/2.8.3: + resolution: {integrity: sha512-dznYMQAYMcQ4crFduIX5sST/Ex35l414hVCL6sXFi84OPuwG5eXgRBfBqbgz7mi3rC/r7VWDn2ADF8FTV/wbCw==} + engines: {node: '>=6'} + dependencies: + check-more-types: 2.24.0 + debug: 4.1.1 + disparity: 2.0.0 + folktale: 2.3.2 + lazy-ass: 1.6.0 + strip-ansi: 5.2.0 + variable-diff: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /snap-shot-store/1.2.3: + resolution: {integrity: sha512-KLSUkdXvSfoPGPSo5Qk97jYEpME96WECOuIOpW91OGYt/fX2g2xOvXA35EJziI32PlDbRfi36JxzUcSsh59Ykw==} + engines: {node: '>=6'} + dependencies: + check-more-types: 2.24.0 + debug: 3.1.0 + folktale: 2.0.1 + lazy-ass: 1.6.0 + ramda: 0.25.0 + transitivePeerDependencies: + - supports-color + dev: true + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /split/0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + dependencies: + through: 2.3.8 + dev: true + + /sshpk/1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /stable/0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /start-server-and-test/1.15.2: + resolution: {integrity: sha512-t5xJX04Hg7hqxiKHMJBz/n4zIMsE6G7hpAcerFAH+4Vh9le/LeyFcJERJM7WLiPygWF9TOg33oroJF1XOzJtYQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + arg: 5.0.2 + bluebird: 3.7.2 + check-more-types: 2.24.0 + debug: 4.3.4 + execa: 5.1.1 + lazy-ass: 1.6.0 + ps-tree: 1.2.0 + wait-on: 6.0.1_debug@4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /stream-combiner/0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + dependencies: + duplexer: 0.1.2 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + dev: true + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.5 + dev: true + + /strip-ansi/3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi/5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: true + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -864,11 +4124,33 @@ packages: ansi-regex: 5.0.1 dev: true + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true + /supports-color/2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -876,10 +4158,71 @@ packages: has-flag: 4.0.0 dev: true + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svgo/2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /term-size/2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + dev: true + + /terser/5.16.1: + resolution: {integrity: sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.1 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /text-table/0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /throttleit/1.0.0: + resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} + dev: true + + /through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /timsort/0.3.0: + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + dev: true + + /tmp/0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + dev: true + /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -887,10 +4230,31 @@ packages: is-number: 7.0.0 dev: true + /tough-cookie/2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.1.1 + dev: true + + /tsconfig-paths/3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.7 + strip-bom: 3.0.0 + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true + /tslib/2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + dev: true + /tsutils/3.21.0_typescript@4.9.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -901,6 +4265,16 @@ packages: typescript: 4.9.4 dev: true + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl/0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -913,18 +4287,111 @@ packages: engines: {node: '>=10'} dev: true + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + /typescript/4.9.4: resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true dev: true + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /untildify/4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.1.1 dev: true + /utility-types/3.10.0: + resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} + engines: {node: '>= 4'} + dev: true + + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + + /variable-diff/1.1.0: + resolution: {integrity: sha1-0r1cZtt2wTh52W5qMG7cmJ35eNo=} + dependencies: + chalk: 1.1.3 + object-assign: 4.1.1 + dev: true + + /verror/1.10.0: + resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /wait-on/6.0.1_debug@4.3.4: + resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + axios: 0.25.0_debug@4.3.4 + joi: 17.7.0 + lodash: 4.17.21 + minimist: 1.2.7 + rxjs: 7.6.0 + transitivePeerDependencies: + - debug + dev: true + + /weak-lru-cache/1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + dev: true + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -938,14 +4405,52 @@ packages: engines: {node: '>=0.10.0'} dev: true + /wrap-ansi/6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /wrappy/1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /xxhash-wasm/0.4.2: + resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} + dev: true + + /yallist/2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yauzl/2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..24becee82 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +packages: + - 'e2e/**' + - 'src/**' + # generic exclude packages that are inside test directories + - '!**/test/**' From 45c5008ca815a35e6123ef96d2aef49af21f6e35 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 17 Jul 2022 21:07:50 +0000 Subject: [PATCH 17/29] Chore: update github action versions to latest Bumps [actions/github-script](https://github.com/actions/github-script) from 3 to 6. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v3...v6) --- .github/workflows/pagy-ci.yml | 8 ++++---- .github/workflows/release-gem.yml | 6 +++--- .github/workflows/retype-action.yml | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/retype-action.yml diff --git a/.github/workflows/pagy-ci.yml b/.github/workflows/pagy-ci.yml index 78dd37978..b03e36842 100644 --- a/.github/workflows/pagy-ci.yml +++ b/.github/workflows/pagy-ci.yml @@ -55,7 +55,7 @@ jobs: env: ${{ matrix.env }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up ruby uses: ruby/setup-ruby@v1 @@ -71,7 +71,7 @@ jobs: - name: Run Codecov if: ${{ env.CODECOV == 'true' }} - uses: codecov/codecov-action@v1.3.2 + uses: codecov/codecov-action@v3.1.0 with: fail_ci_if_error: true @@ -90,7 +90,7 @@ jobs: BUNDLE_GEMFILE: /home/runner/work/pagy/pagy/.github/gemfiles/ruby-2.5+ steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up ruby uses: ruby/setup-ruby@v1 @@ -100,7 +100,7 @@ jobs: - name: Cache NPM and Cypress id: e2e-cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | ~/.cache/Cypress diff --git a/.github/workflows/release-gem.yml b/.github/workflows/release-gem.yml index 7f06b8b16..2118ec4a3 100644 --- a/.github/workflows/release-gem.yml +++ b/.github/workflows/release-gem.yml @@ -12,7 +12,7 @@ jobs: env: BUNDLE_GEMFILE: .github/gemfiles/ruby-2.5+ steps: - - uses: actions/checkout@v2 # checks out default branch + - uses: actions/checkout@v3 # checks out default branch - uses: ruby/setup-ruby@v1 with: @@ -21,7 +21,7 @@ jobs: - name: Dotenv Action id: dotenv - uses: falti/dotenv-action@v0.2.7 + uses: falti/dotenv-action@v0.2.8 with: path: .github/.env @@ -36,7 +36,7 @@ jobs: RUBYGEMS_TOKEN: ${{ secrets.RUBYGEMS_TOKEN }} - name: Create the release tag - uses: actions/github-script@v3 + uses: actions/github-script@v6 with: github-token: ${{ github.token }} script: | diff --git a/.github/workflows/retype-action.yml b/.github/workflows/retype-action.yml new file mode 100644 index 000000000..95013c549 --- /dev/null +++ b/.github/workflows/retype-action.yml @@ -0,0 +1,22 @@ +name: Publish Retype powered website to GitHub Pages +on: + workflow_dispatch: + push: + branches: + - v6 + +jobs: + publish: + name: Publish to docs-site branch + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - uses: retypeapp/action-build@v2 + + - uses: retypeapp/action-github-pages@v2 + with: + branch: docs-site + update-branch: true From 478064cb76a6d28279804d17dc1698c9ccbe2c52 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Wed, 14 Dec 2022 12:16:55 +0700 Subject: [PATCH 18/29] added specific typescript installation to pagy-ci --- .github/workflows/pagy-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pagy-ci.yml b/.github/workflows/pagy-ci.yml index b03e36842..af8d1d761 100644 --- a/.github/workflows/pagy-ci.yml +++ b/.github/workflows/pagy-ci.yml @@ -109,7 +109,7 @@ jobs: - name: Install Cypress and Test Dependencies if: steps.e2e-cache.outputs.cache-hit != 'true' - run: npm i cypress @cypress/snapshot html-validate cypress-html-validate + run: npm i cypress @cypress/snapshot html-validate cypress-html-validate typescript - name: Run Cypress Tests # You may pin to the exact commit or the version. From 3e7e3c2d8712042ed75ab257ac18424de7f4258a Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Wed, 14 Dec 2022 12:23:39 +0700 Subject: [PATCH 19/29] Fix rubocop glitch --- test/pagy/extras/calendar_extra_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pagy/extras/calendar_extra_test.rb b/test/pagy/extras/calendar_extra_test.rb index 4a38f7626..450858b3c 100644 --- a/test/pagy/extras/calendar_extra_test.rb +++ b/test/pagy/extras/calendar_extra_test.rb @@ -215,7 +215,7 @@ def app(**opts) describe 'pagy_calendar_url_at' do it 'returns the url' do collection = MockCollection::Calendar.new(@collection) - calendar, _pagy, _entries = app(params: { year_page: 2, month_page: 7, page: 2 })\ + calendar, _pagy, _entries = app(params: { year_page: 2, month_page: 7, page: 2 }) \ .send(:pagy_calendar, collection, year: {}, month: {}, pagy: { items: 10 }) From ba204d97c510be7d989c9d720b5736fed3318f35 Mon Sep 17 00:00:00 2001 From: Ben Koshy Date: Wed, 14 Dec 2022 16:32:44 +1100 Subject: [PATCH 20/29] update: pagy_bare_rails script: for db testing (#379) --- apps/pagy_bare_rails.rb | 126 +++++++++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 34 deletions(-) diff --git a/apps/pagy_bare_rails.rb b/apps/pagy_bare_rails.rb index 25b18cc14..acb5e0dc1 100644 --- a/apps/pagy_bare_rails.rb +++ b/apps/pagy_bare_rails.rb @@ -1,11 +1,14 @@ # frozen_string_literal: true -# Self-contained, bare rails app, usable to play with pagy -# and/or easily reproduce any pagy issue. - -# Edit this file as you need - -# USAGE: +# Basic Rails app to: (i) reproduce errors, (ii) experiment pagy. + +## Setup +# 1. Install SqLite3 (an in-memory DB) e.g. +## sudo apt install sqlite3 +# 2. Optional: If using external services e.g. Meilisearch +## docker pull getmeili/meilisearch:latest # Fetch latest Meilisearch image from Docker Hub +## docker run -it --rm -p 7700:7700 getmeili/meilisearch:latest ./meilisearch -master-key=password +# 4. Run script in separate terminal window: # ruby pagy_bare_rails.rb # NOTICE: if you get any installation error(s) with the following setup @@ -18,8 +21,7 @@ source 'https://rubygems.org' # Debuggers - # gem 'debug' - + gem 'debug' # gem 'debase' # gem 'ruby-debug-ide' @@ -30,16 +32,18 @@ gem 'rails', '~> 6.1' gem 'actionpack' gem 'railties' + gem 'sqlite3' + + ## Optional: Meilisearch example + # gem 'meilisearch-rails' end -# Set up debugging tools -# require "debug" ## etc +require 'debug' -# pagy initializer - add your requirements here: +## Pagy Set-up # https://ddnexus.github.io/pagy/extras # https://ddnexus.github.io/pagy/api/backend - -# Edit this section as you need +require 'pagy/extras/meilisearch' require 'pagy/extras/metadata' require 'pagy/extras/overflow' require 'pagy/extras/trim' @@ -52,7 +56,6 @@ # Rails set up: require 'action_controller/railtie' require 'active_record' - require 'minitest/autorun' # runs tests automatically class TestApp < Rails::Application # :nodoc: @@ -68,18 +71,72 @@ class TestApp < Rails::Application # :nodoc: routes.draw do get '/' => 'test#index', as: 'test' end + + ## Optional: Meilisearch example + # MeiliSearch::Rails.configuration = { + # meilisearch_host: 'http://localhost:7700', + # meilisearch_api_key: 'password' } +end + +ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:') +ActiveRecord::Base.connection.create_table(:authors) do |t| + t.text :name end -class Record < ActiveRecord::Base; end # :nodoc: +ActiveRecord::Base.connection.create_table(:books) do |t| + t.text :name + t.references :author, foreign_key: true +end + +ActiveRecord::Base.logger = Logger.new($stdout) + +class Author < ActiveRecord::Base + has_many :books + + ## Optional: Meilisearch example + # include MeiliSearch::Rails + # extend Pagy::Meilisearch + # + # meilisearch do + # attribute :name + # end +end # :nodoc: + +class Book < ActiveRecord::Base + belongs_to :author + + ## Optional: Meilisearch example + # include MeiliSearch::Rails + # extend Pagy::Meilisearch + # meilisearch do + # attribute :name + # end +end # :nodoc: + +1.upto(11) do |i| + Author.create(name: i) +end + +Author.all.each_with_index do |author, i| + Book.create(author: author, name: i) +end + +## Optional: Meilisearch example +# Book.reindex! class TestController < ActionController::Base # :nodoc: include Rails.application.routes.url_helpers - include Pagy::Backend def index - meta, _records = pagy(Record.none, items: 10) - render json: { data: [], meta: pagy_metadata(meta) } + meta, @books = pagy(Book.all, items: 10) + + ## Optional: Meilisearch example + # books = Book.includes(:author).pagy_search('*') + # @pagy, @books = pagy_meilisearch(books, items: 10) + # @books.each(&:author) + + render json: { data: @books, meta: pagy_metadata(meta) } end ## override pagy methods if you need to here: @@ -95,7 +152,8 @@ class TestControllerTest < ActionDispatch::IntegrationTest # :nodoc: test 'pagy json output - example' do get '/' - assert_equal response.parsed_body, { 'data' => [], 'meta' => { 'first_url' => '/?page=1', 'last_url' => '/?page=1' } } + assert_equal response.parsed_body, { 'data' => Book.first(10).as_json, 'meta' => + { 'first_url' => '/?page=1', 'last_url' => '/?page=1' } } end def test_my_pagy_problem_here @@ -109,18 +167,18 @@ def app end end -# or use rack to test: -class BugTest < Minitest::Test # :nodoc: - include Rack::Test::Methods - - def test_my_pagy_problem_again - get '/' - assert last_response.ok? - end - - private - - def app - Rails.application - end -end +## or use rack to test: +# class BugTest < Minitest::Test # :nodoc: +# include Rack::Test::Methods +# +# # def test_my_pagy_problem_again +# # get '/' +# # assert last_response.ok? +# # end +# +# private +# +# def app +# Rails.application +# end +# end From 02013d426fdd56c366332fc450bd63197a86762c Mon Sep 17 00:00:00 2001 From: Hugo Van Honacker Date: Wed, 14 Dec 2022 12:44:42 +0700 Subject: [PATCH 21/29] Fix the args in the Pagy::Countless#series override (#411) (fixes #410) --- lib/pagy/countless.rb | 2 +- test/pagy/extras/bootstrap_test.rb | 8 ++++++++ test/pagy/extras/bootstrap_test.rb.rematch | 16 ++++++++++++++++ test/pagy/extras/bulma_test.rb | 8 ++++++++ test/pagy/extras/bulma_test.rb.rematch | 20 ++++++++++++++++++++ test/pagy/extras/foundation_test.rb | 8 ++++++++ test/pagy/extras/foundation_test.rb.rematch | 20 ++++++++++++++++++++ test/pagy/extras/materialize_test.rb | 8 ++++++++ test/pagy/extras/materialize_test.rb.rematch | 16 ++++++++++++++++ test/pagy/extras/navs_test.rb | 8 ++++++++ test/pagy/extras/navs_test.rb.rematch | 16 ++++++++++++++++ test/pagy/extras/semantic_test.rb | 8 ++++++++ test/pagy/extras/semantic_test.rb.rematch | 20 ++++++++++++++++++++ test/pagy/extras/uikit_test.rb | 8 ++++++++ test/pagy/extras/uikit_test.rb.rematch | 18 ++++++++++++++++++ 15 files changed, 183 insertions(+), 1 deletion(-) diff --git a/lib/pagy/countless.rb b/lib/pagy/countless.rb index fb49ebe25..70efb6fd8 100644 --- a/lib/pagy/countless.rb +++ b/lib/pagy/countless.rb @@ -30,7 +30,7 @@ def finalize(fetched_size) # Override the original series. # Return nil if :countless_minimal is enabled - def series(*) + def series(*, **) super unless @vars[:countless_minimal] end end diff --git a/test/pagy/extras/bootstrap_test.rb b/test/pagy/extras/bootstrap_test.rb index 9c89b33fd..c66f21539 100644 --- a/test/pagy/extras/bootstrap_test.rb +++ b/test/pagy/extras/bootstrap_test.rb @@ -37,6 +37,14 @@ _(app.pagy_bootstrap_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch end + it 'renders first page when used with Pagy::Countless' do + require 'pagy/extras/countless' + + pagy, = Pagy::Countless.new(page: 1).finalize(0) + _(app.pagy_bootstrap_nav_js(pagy)).must_rematch + _(app.pagy_bootstrap_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', + steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch + end it 'renders intermediate page' do pagy = Pagy.new(count: 1000, page: 20) _(app.pagy_bootstrap_nav_js(pagy)).must_rematch diff --git a/test/pagy/extras/bootstrap_test.rb.rematch b/test/pagy/extras/bootstrap_test.rb.rematch index 5c5c72b97..4ee2ad209 100644 --- a/test/pagy/extras/bootstrap_test.rb.rematch +++ b/test/pagy/extras/bootstrap_test.rb.rematch @@ -139,3 +139,19 @@ class="pagy-bootstrap-nav-js" data-pagy="WyJuYXYiLHsiYmVmb3JlIjoiPHVsIGNsYXNzPVwicGFnaW5hdGlvblwiPjxsaSBjbGFzcz1cInBhZ2UtaXRlbSBwcmV2IGRpc2FibGVkXCI+PGEgaHJlZj1cIiNcIiBjbGFzcz1cInBhZ2UtbGlua1wiPiZsc2FxdW87Jm5ic3A7UHJldjwvYT48L2xpPiIsImxpbmsiOiI8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIj48YSBocmVmPVwiL2Zvbz9wYWdlPV9fcGFneV9wYWdlX19cIiAgY2xhc3M9XCJwYWdlLWxpbmtcIiAgPl9fcGFneV9sYWJlbF9fPC9hPjwvbGk+IiwiYWN0aXZlIjoiPGxpIGNsYXNzPVwicGFnZS1pdGVtIGFjdGl2ZVwiPjxhIGhyZWY9XCIvZm9vP3BhZ2U9X19wYWd5X3BhZ2VfX1wiICBjbGFzcz1cInBhZ2UtbGlua1wiICA+X19wYWd5X2xhYmVsX188L2E+PC9saT4iLCJnYXAiOiI8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gZ2FwIGRpc2FibGVkXCI+PGEgaHJlZj1cIiNcIiBjbGFzcz1cInBhZ2UtbGlua1wiPiZoZWxsaXA7PC9hPjwvbGk+IiwiYWZ0ZXIiOiI8bGkgY2xhc3M9XCJwYWdlLWl0ZW0gbmV4dFwiPjxhIGhyZWY9XCIvZm9vP3BhZ2U9MlwiICBjbGFzcz1cInBhZ2UtbGlua1wiICByZWw9XCJuZXh0XCIgYXJpYS1sYWJlbD1cIm5leHRcIj5OZXh0Jm5ic3A7JnJzYXF1bzs8L2E+PC9saT48L3VsPiJ9LHsiMCI6WyIxIiwyLDMsNCw1LCJnYXAiLDUwXX0sbnVsbF0="> "[2] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0001_renders first page": +"[1] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0004_renders last page": +"[2] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0004_renders last page": +"[1] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0003_renders intermediate page": +"[2] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0003_renders intermediate page": +"[1] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[2] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[1] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0005_renders with :steps": +"[2] pagy/extras/bootstrap::#pagy_bootstrap_nav_js#test_0005_renders with :steps": diff --git a/test/pagy/extras/bulma_test.rb b/test/pagy/extras/bulma_test.rb index a49d96da9..9c941d51f 100644 --- a/test/pagy/extras/bulma_test.rb +++ b/test/pagy/extras/bulma_test.rb @@ -37,6 +37,14 @@ _(app.pagy_bulma_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch end + it 'renders first page when used with Pagy::Countless' do + require 'pagy/extras/countless' + + pagy, = Pagy::Countless.new(page: 1).finalize(0) + _(app.pagy_bulma_nav_js(pagy)).must_rematch + _(app.pagy_bulma_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', + steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch + end it 'renders intermediate page' do pagy = Pagy.new(count: 1000, page: 20) _(app.pagy_bulma_nav_js(pagy)).must_rematch diff --git a/test/pagy/extras/bulma_test.rb.rematch b/test/pagy/extras/bulma_test.rb.rematch index 41b5be021..27518851e 100644 --- a/test/pagy/extras/bulma_test.rb.rematch +++ b/test/pagy/extras/bulma_test.rb.rematch @@ -113,3 +113,23 @@ is-current" aria-label="page 50" aria-current="page">50 "[2] pagy/extras/bulma::#pagy_bulma_nav#test_0003_renders last page": +"[1] pagy/extras/bulma::#pagy_bulma_nav_js#test_0005_renders with :steps": +"[2] pagy/extras/bulma::#pagy_bulma_nav_js#test_0005_renders with :steps": +"[1] pagy/extras/bulma::#pagy_bulma_nav_js#test_0004_renders last page": +"[2] pagy/extras/bulma::#pagy_bulma_nav_js#test_0004_renders last page": +"[1] pagy/extras/bulma::#pagy_bulma_nav_js#test_0003_renders intermediate page": +"[2] pagy/extras/bulma::#pagy_bulma_nav_js#test_0003_renders intermediate page": +"[1] pagy/extras/bulma::#pagy_bulma_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[2] pagy/extras/bulma::#pagy_bulma_nav_js#test_0002_renders first page when used with Pagy::Countless": diff --git a/test/pagy/extras/foundation_test.rb b/test/pagy/extras/foundation_test.rb index 397cd937c..70f141422 100644 --- a/test/pagy/extras/foundation_test.rb +++ b/test/pagy/extras/foundation_test.rb @@ -37,6 +37,14 @@ _(app.pagy_foundation_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch end + it 'renders first page when used with Pagy::Countless' do + require 'pagy/extras/countless' + + pagy, = Pagy::Countless.new(page: 1).finalize(0) + _(app.pagy_foundation_nav_js(pagy)).must_rematch + _(app.pagy_foundation_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', + steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch + end it 'renders intermediate page' do pagy = Pagy.new(count: 1000, page: 20) _(app.pagy_foundation_nav_js(pagy)).must_rematch diff --git a/test/pagy/extras/foundation_test.rb.rematch b/test/pagy/extras/foundation_test.rb.rematch index f2bfc0367..cb3ee8f09 100644 --- a/test/pagy/extras/foundation_test.rb.rematch +++ b/test/pagy/extras/foundation_test.rb.rematch @@ -119,3 +119,23 @@ of 6' +"[1] pagy/extras/foundation::#pagy_foundation_nav_js#test_0005_renders with :steps": +"[2] pagy/extras/foundation::#pagy_foundation_nav_js#test_0005_renders with :steps": +"[1] pagy/extras/foundation::#pagy_foundation_nav_js#test_0004_renders last page": +"[2] pagy/extras/foundation::#pagy_foundation_nav_js#test_0004_renders last page": +"[1] pagy/extras/foundation::#pagy_foundation_nav_js#test_0003_renders intermediate page": +"[2] pagy/extras/foundation::#pagy_foundation_nav_js#test_0003_renders intermediate page": +"[1] pagy/extras/foundation::#pagy_foundation_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[2] pagy/extras/foundation::#pagy_foundation_nav_js#test_0002_renders first page when used with Pagy::Countless": diff --git a/test/pagy/extras/materialize_test.rb b/test/pagy/extras/materialize_test.rb index 1c916e854..5856d3ef5 100644 --- a/test/pagy/extras/materialize_test.rb +++ b/test/pagy/extras/materialize_test.rb @@ -37,6 +37,14 @@ _(app.pagy_materialize_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch end + it 'renders first page when used with Pagy::Countless' do + require 'pagy/extras/countless' + + pagy, = Pagy::Countless.new(page: 1).finalize(0) + _(app.pagy_materialize_nav_js(pagy)).must_rematch + _(app.pagy_materialize_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', + steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch + end it 'renders intermediate page' do pagy = Pagy.new(count: 1000, page: 20) _(app.pagy_materialize_nav_js(pagy)).must_rematch diff --git a/test/pagy/extras/materialize_test.rb.rematch b/test/pagy/extras/materialize_test.rb.rematch index f8139e80c..1a3d02f18 100644 --- a/test/pagy/extras/materialize_test.rb.rematch +++ b/test/pagy/extras/materialize_test.rb.rematch @@ -130,3 +130,19 @@ class="waves-effect">
  • 50
  • +"[1] pagy/extras/materialize::#pagy_materialize_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[2] pagy/extras/materialize::#pagy_materialize_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[1] pagy/extras/materialize::#pagy_materialize_nav_js#test_0004_renders last page": +"[2] pagy/extras/materialize::#pagy_materialize_nav_js#test_0004_renders last page": +"[1] pagy/extras/materialize::#pagy_materialize_nav_js#test_0003_renders intermediate page": +"[2] pagy/extras/materialize::#pagy_materialize_nav_js#test_0003_renders intermediate page": +"[1] pagy/extras/materialize::#pagy_materialize_nav_js#test_0005_renders with :steps": +"[2] pagy/extras/materialize::#pagy_materialize_nav_js#test_0005_renders with :steps": diff --git a/test/pagy/extras/navs_test.rb b/test/pagy/extras/navs_test.rb index 9b6468dba..77a5d3a19 100644 --- a/test/pagy/extras/navs_test.rb +++ b/test/pagy/extras/navs_test.rb @@ -15,6 +15,14 @@ _(app.pagy_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch end + it 'renders first page when used with Pagy::Countless' do + require 'pagy/extras/countless' + + pagy, = Pagy::Countless.new(page: 1).finalize(0) + _(app.pagy_nav_js(pagy)).must_rematch + _(app.pagy_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', + steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch + end it 'renders intermediate page' do pagy = Pagy.new(count: 1000, page: 20) _(app.pagy_nav_js(pagy)).must_rematch diff --git a/test/pagy/extras/navs_test.rb.rematch b/test/pagy/extras/navs_test.rb.rematch index 38c7dc492..91a6c61f8 100644 --- a/test/pagy/extras/navs_test.rb.rematch +++ b/test/pagy/extras/navs_test.rb.rematch @@ -52,3 +52,19 @@ Next ›' +"[1] pagy/extras/navs::#pagy_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[2] pagy/extras/navs::#pagy_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[1] pagy/extras/navs::#pagy_nav_js#test_0004_renders last page": +"[2] pagy/extras/navs::#pagy_nav_js#test_0004_renders last page": +"[1] pagy/extras/navs::#pagy_nav_js#test_0003_renders intermediate page": +"[2] pagy/extras/navs::#pagy_nav_js#test_0003_renders intermediate page": +"[1] pagy/extras/navs::#pagy_nav_js#test_0005_renders with :steps": +"[2] pagy/extras/navs::#pagy_nav_js#test_0005_renders with :steps": diff --git a/test/pagy/extras/semantic_test.rb b/test/pagy/extras/semantic_test.rb index 1a8c57ae4..87661fd27 100644 --- a/test/pagy/extras/semantic_test.rb +++ b/test/pagy/extras/semantic_test.rb @@ -37,6 +37,14 @@ _(app.pagy_semantic_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch end + it 'renders first page when used with Pagy::Countless' do + require 'pagy/extras/countless' + + pagy, = Pagy::Countless.new(page: 1).finalize(0) + _(app.pagy_semantic_nav_js(pagy)).must_rematch + _(app.pagy_semantic_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', + steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch + end it 'renders intermediate page' do pagy = Pagy.new(count: 1000, page: 20) _(app.pagy_semantic_nav_js(pagy)).must_rematch diff --git a/test/pagy/extras/semantic_test.rb.rematch b/test/pagy/extras/semantic_test.rb.rematch index f8f6c78ca..6a02382c1 100644 --- a/test/pagy/extras/semantic_test.rb.rematch +++ b/test/pagy/extras/semantic_test.rb.rematch @@ -115,3 +115,23 @@ of 6
    ' +"[1] pagy/extras/semantic::#pagy_semantic_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[2] pagy/extras/semantic::#pagy_semantic_nav_js#test_0002_renders first page when used with Pagy::Countless": +"[1] pagy/extras/semantic::#pagy_semantic_nav_js#test_0003_renders intermediate page": +"[2] pagy/extras/semantic::#pagy_semantic_nav_js#test_0003_renders intermediate page": +"[1] pagy/extras/semantic::#pagy_semantic_nav_js#test_0005_renders with :steps": +"[2] pagy/extras/semantic::#pagy_semantic_nav_js#test_0005_renders with :steps": +"[1] pagy/extras/semantic::#pagy_semantic_nav_js#test_0004_renders last page": +"[2] pagy/extras/semantic::#pagy_semantic_nav_js#test_0004_renders last page": diff --git a/test/pagy/extras/uikit_test.rb b/test/pagy/extras/uikit_test.rb index 7704031a0..aed46d0ce 100644 --- a/test/pagy/extras/uikit_test.rb +++ b/test/pagy/extras/uikit_test.rb @@ -37,6 +37,14 @@ _(app.pagy_uikit_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch end + it 'renders first page when used with Pagy::Countless' do + require 'pagy/extras/countless' + + pagy, = Pagy::Countless.new(page: 1).finalize(0) + _(app.pagy_uikit_nav_js(pagy)).must_rematch + _(app.pagy_uikit_nav_js(pagy, pagy_id: 'test-nav-id', link_extra: 'link-extra', + steps: { 0 => [1, 2, 2, 1], 600 => [1, 3, 3, 1] })).must_rematch + end it 'renders intermediate page' do pagy = Pagy.new(count: 1000, page: 20) _(app.pagy_uikit_nav_js(pagy)).must_rematch diff --git a/test/pagy/extras/uikit_test.rb.rematch b/test/pagy/extras/uikit_test.rb.rematch index 50b9eb430..55857c5d2 100644 --- a/test/pagy/extras/uikit_test.rb.rematch +++ b/test/pagy/extras/uikit_test.rb.rematch @@ -99,3 +99,21 @@ href="/foo?page=23" link-extra >23
  • 24
  • 50
  • +"[1] pagy/extras/uikit::#pagy_uikit_nav_js#test_0005_renders with :steps":
      +"[2] pagy/extras/uikit::#pagy_uikit_nav_js#test_0005_renders with :steps":
        +"[1] pagy/extras/uikit::#pagy_uikit_nav_js#test_0004_renders last page":
          +"[2] pagy/extras/uikit::#pagy_uikit_nav_js#test_0004_renders last page":
            +"[1] pagy/extras/uikit::#pagy_uikit_nav_js#test_0003_renders intermediate page":
              +"[2] pagy/extras/uikit::#pagy_uikit_nav_js#test_0003_renders intermediate page":
                +"[1] pagy/extras/uikit::#pagy_uikit_nav_js#test_0002_renders first page when used with Pagy::Countless":
                  +"[2] pagy/extras/uikit::#pagy_uikit_nav_js#test_0002_renders first page when used with Pagy::Countless":
                    From 6e939a01eb849edd6b6cac6494c7f3359a396610 Mon Sep 17 00:00:00 2001 From: Elliot Larson Date: Mon, 15 Aug 2022 20:36:23 -0700 Subject: [PATCH 22/29] Allowing users to override the request path (#404)(squashed) --- docs/api/pagy.md | 50 ++++++++++++----------- docs/how-to.md | 12 ++++++ lib/config/pagy.rb | 1 + lib/pagy.rb | 16 +++++++- lib/pagy/url_helpers.rb | 3 +- test/pagy/extras/metadata_test.rb.rematch | 33 +++++++-------- test/pagy/frontend_test.rb | 4 ++ test/pagy_test.rb | 10 ++++- 8 files changed, 85 insertions(+), 44 deletions(-) diff --git a/docs/api/pagy.md b/docs/api/pagy.md index e51761f61..3717cf66c 100644 --- a/docs/api/pagy.md +++ b/docs/api/pagy.md @@ -107,15 +107,16 @@ They are all integers: ### Other Variables -| Variable | Description | Default | -|:--------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------| -| `:size` | The size of the page links to show: array of initial pages, before current page, after current page, final pages. _(see also [How to control the page links](../how-to.md#control-the-page-links))_ | `[1,4,4,1]` | -| `:page_param` | The name of the page param name used in the url. _(see [How to customize the page param](../how-to.md#customize-the-page-param))_ | `:page` | -| `:params` | It can be a `Hash` of params to add to the URL, or a `Proc` that can edit/add/delete the request params _(see [How to customize the params](../how-to.md#customize-the-params))_ | `{}` | -| `:fragment` | The arbitrary fragment string (including the "#") to add to the url. _(see [How to customize the params](../how-to.md#customize-the-params))_ | `""` | -| `:link_extra` | The extra attributes string (formatted as a valid HTML attribute/value pairs) added to the page links _(see [How to customize the link attributes](../how-to.md#customize-the-link-attributes))_ | `""` | -| `:i18n_key` | The i18n key to lookup the `item_name` that gets interpolated in a few helper outputs _(see [How to customize the item name](../how-to.md#customize-the-item-name))_ | `"pagy.item_name"` | -| `:cycle` | Enable cycling/circular/infinite pagination: `true` sets `next` to `1` when the current page is the last page | `false` | +| Variable | Description | Default | +|:----------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------| +| `:size` | The size of the page links to show: array of initial pages, before current page, after current page, final pages. _(see also [How to control the page links](/docs/how-to.md#control-the-page-links))_ | `[1,4,4,1]` | +| `:page_param` | The name of the page param name used in the url. _(see [How to customize the page param](/docs/how-to.md#customize-the-page-param))_ | `:page` | +| `:params` | It can be a `Hash` of params to add to the URL, or a `Proc` that can edit/add/delete the request params _(see [How to customize the params](/docs/how-to.md#customize-the-params))_ | `{}` | +| `:fragment` | The arbitrary fragment string (including the "#") to add to the url. _(see [How to customize the params](/docs/how-to.md#customize-the-params))_ | `""` | +| `:link_extra` | The extra attributes string (formatted as a valid HTML attribute/value pairs) added to the page links _(see [How to customize the link attributes](/docs/how-to.md#customize-the-link-attributes))_ | `""` | +| `:i18n_key` | The i18n key to lookup the `item_name` that gets interpolated in a few helper outputs (see [How to customize the item name](/docs/how-to.md#customize-the-item-name)) | `"pagy.item_name"` | +| `:cycle` | Enable cycling/circular/infinite pagination: `true` sets `next` to `1` when the current page is the last page | `false` | +| `:request_path` | Allows overriding the the request path for pagination links. If left blank, helpers will use `request.path`. | `""` | There is no specific validation for non-instance variables. @@ -123,21 +124,22 @@ There is no specific validation for non-instance variables. Pagy exposes all the instance variables needed for the pagination through a few attribute readers. They all return integers (or `nil`), except the `vars` hash: -| Reader | Description | -|:---------|:-------------------------------------------------------------------------------------------------------------------| -| `count` | The collection `:count` | -| `page` | The current page number | -| `items` | The requested number of items for the page | -| `pages` | The number of total pages in the collection (same as `last` but with cardinal meaning) | -| `in` | The number of the items in the page | -| `last` | The number of the last page in the collection (same as `pages` but with ordinal meaning) | -| `offset` | The number of items skipped from the collection in order to get the start of the current page (`:outset` included) | -| `from` | The collection-position of the first item in the page (`:outset` excluded) | -| `to` | The collection-position of the last item in the page (`:outset` excluded) | -| `prev` | The previous page number or `nil` if there is no previous page | -| `next` | The next page number or `nil` if there is no next page | -| `vars` | The variables hash | -| `params` | The `:params` variable (`Hash` or `Proc`) | +| Reader | Description | +|:---------------|:-------------------------------------------------------------------------------------------------------------------| +| `count` | The collection `:count` | +| `page` | The current page number | +| `items` | The requested number of items for the page | +| `pages` | The number of total pages in the collection (same as `last` but with cardinal meaning) | +| `in` | The number of the items in the page | +| `last` | The number of the last page in the collection (same as `pages` but with ordinal meaning) | +| `offset` | The number of items skipped from the collection in order to get the start of the current page (`:outset` included) | +| `from` | The collection-position of the first item in the page (`:outset` excluded) | +| `to` | The collection-position of the last item in the page (`:outset` excluded) | +| `prev` | The previous page number or `nil` if there is no previous page | +| `next` | The next page number or `nil` if there is no next page | +| `vars` | The variables hash | +| `params` | The `:params` variable (`Hash` or `Proc`) | +| `request_path` | The request path used for pagination helpers. If blank, helpers will use `request.path` | ### Lowest limit analysis diff --git a/docs/how-to.md b/docs/how-to.md index 3726201f1..9d4a25ae0 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -259,6 +259,18 @@ pagy = Pagy.new(count: 1000, link_extra: 'data-remote="true" class="my-class"') **IMPORTANT**: For performance reasons, the `:link_extra` variable must be a string formatted as a valid HTML attribute/value pairs. That string will get inserted verbatim in the HTML of the link. _(see more advanced details in the [pagy_link_proc documentation](api/frontend.md#pagy_link_procpagy-link_extra))_ +## Customize the request path + +Let's say you are using something like a [Turbo frame](https://turbo.hotwired.dev/reference/frames) and you are loading a collection with pagination on a page where you want the pagination links to point to a different path. For example, if you are on a page like `/dashboard` and you have a collection of `foos` in a Turbo frame. By default Pagy will use `request.path` when constructing pagination links, which will results in links like `/dashboard?page=2`. + +If you'd like to override the path so that the links point to a different endpoint than the current page's `request.path`, you can pass in the `request_path` variable: + +```ruby +@pagy, @records = pagy(my_scope, vars { request_path: '/foos' }) +``` + +This will result in pagination links like `/foos?page=2` instead of `/dashboard?page=2`. + ## Customize the params When you need to add some custom param or alter the params embedded in the URLs of the page links, you can set the variable `:params` to a `Hash` of params to add to the URL, or a `Proc` that can edit/add/delete the request params. diff --git a/lib/config/pagy.rb b/lib/config/pagy.rb index 224a5aaca..9c026dde7 100644 --- a/lib/config/pagy.rb +++ b/lib/config/pagy.rb @@ -28,6 +28,7 @@ # Pagy::DEFAULT[:link_extra] = 'data-remote="true"' # example # Pagy::DEFAULT[:i18n_key] = 'pagy.item_name' # default # Pagy::DEFAULT[:cycle] = true # example +# Pagy::DEFAULT[:request_path] = "/foo" # example # Extras diff --git a/lib/pagy.rb b/lib/pagy.rb index b76beef82..759763567 100644 --- a/lib/pagy.rb +++ b/lib/pagy.rb @@ -22,9 +22,10 @@ def self.root fragment: '', link_extra: '', i18n_key: 'pagy.item_name', - cycle: false } + cycle: false, + request_path: '' } - attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :in, :from, :to, :prev, :next, :params + attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :in, :from, :to, :prev, :next, :params, :request_path # Merge and validate the options, do some simple arithmetic and set the instance variables def initialize(vars) @@ -34,6 +35,7 @@ def initialize(vars) setup_pages_var setup_offset_var setup_params_var + setup_request_path_var raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last @from = [@offset - @outset + 1, @count].min @@ -116,6 +118,16 @@ def setup_params_var raise VariableError.new(self, :params, 'must be a Hash or a Proc', @params) \ unless (@params = @vars[:params]).is_a?(Hash) || @params.is_a?(Proc) end + + def setup_request_path_var + request_path = @vars[:request_path] + return if request_path.to_s.empty? + + raise VariableError.new(self, :request_path, 'must be a bare path like "/foo"', request_path) \ + if !request_path.start_with?('/') || request_path.include?('?') + + @request_path = request_path + end end require 'pagy/backend' diff --git a/lib/pagy/url_helpers.rb b/lib/pagy/url_helpers.rb index 0fed33b55..0cfe728e2 100644 --- a/lib/pagy/url_helpers.rb +++ b/lib/pagy/url_helpers.rb @@ -8,6 +8,7 @@ module UrlHelpers # For non-rack environments you can use the standalone extra def pagy_url_for(pagy, page, absolute: false, html_escaped: false) vars = pagy.vars + request_path = vars[:request_path].to_s.empty? ? request.path : vars[:request_path] page_param = vars[:page_param].to_s items_param = vars[:items_param].to_s params = pagy.params.is_a?(Hash) ? pagy.params.transform_keys(&:to_s) : {} @@ -17,7 +18,7 @@ def pagy_url_for(pagy, page, absolute: false, html_escaped: false) params = pagy.params.call(params) if pagy.params.is_a?(Proc) query_string = "?#{Rack::Utils.build_nested_query(params)}" query_string = query_string.gsub('&', '&') if html_escaped # the only unescaped entity - "#{request.base_url if absolute}#{request.path}#{query_string}#{vars[:fragment]}" + "#{request.base_url if absolute}#{request_path}#{query_string}#{vars[:fragment]}" end end end diff --git a/test/pagy/extras/metadata_test.rb.rematch b/test/pagy/extras/metadata_test.rb.rematch index 49e3caca4..5ada8a1d0 100644 --- a/test/pagy/extras/metadata_test.rb.rematch +++ b/test/pagy/extras/metadata_test.rb.rematch @@ -1,11 +1,19 @@ --- -"[1] pagy/extras/metadata::#pagy_metadata for Pagy#test_0004_returns only specific metadata": - :scaffold_url: "/foo?page=__pagy_page__" +"[1] pagy/extras/metadata::#pagy_metadata for Pagy::Calendar#test_0002_returns only specific metadata for Pagy::Calendar": + :scaffold_url: "/foo?month_page=__pagy_page__" :page: 3 - :count: 1000 + :from: !ruby/object:ActiveSupport::TimeWithZone + utc: 2021-12-01 05:00:00.000000000 Z + zone: &1 !ruby/object:ActiveSupport::TimeZone + name: EST + time: 2021-12-01 00:00:00.000000000 Z + :to: !ruby/object:ActiveSupport::TimeWithZone + utc: 2022-01-01 05:00:00.000000000 Z + zone: *1 + time: 2022-01-01 00:00:00.000000000 Z :prev: 2 :next: 4 - :pages: 50 + :pages: 26 "[1] pagy/extras/metadata::#pagy_metadata for Pagy#test_0002_returns the full pagy metadata": :scaffold_url: "/foo?page=__pagy_page__" :first_url: "/foo?page=1" @@ -31,6 +39,7 @@ :link_extra: '' :i18n_key: pagy.item_name :cycle: false + :request_path: '' :steps: false :countless_minimal: false :metadata: @@ -101,18 +110,10 @@ - :prev - :next - :series -"[1] pagy/extras/metadata::#pagy_metadata for Pagy::Calendar#test_0002_returns only specific metadata for Pagy::Calendar": - :scaffold_url: "/foo?month_page=__pagy_page__" +"[1] pagy/extras/metadata::#pagy_metadata for Pagy#test_0004_returns only specific metadata": + :scaffold_url: "/foo?page=__pagy_page__" :page: 3 - :from: !ruby/object:ActiveSupport::TimeWithZone - utc: 2021-12-01 05:00:00.000000000 Z - zone: &1 !ruby/object:ActiveSupport::TimeZone - name: EST - time: 2021-12-01 00:00:00.000000000 Z - :to: !ruby/object:ActiveSupport::TimeWithZone - utc: 2022-01-01 05:00:00.000000000 Z - zone: *1 - time: 2022-01-01 00:00:00.000000000 Z + :count: 1000 :prev: 2 :next: 4 - :pages: 26 + :pages: 50 diff --git a/test/pagy/frontend_test.rb b/test/pagy/frontend_test.rb index be0a56cd9..1f3964830 100644 --- a/test/pagy/frontend_test.rb +++ b/test/pagy/frontend_test.rb @@ -157,6 +157,10 @@ def i18n_load(*locales) _(app.pagy_url_for(pagy, 5, absolute: true)).must_equal "http://example.com:3000/foo?page=5&a=3&b=4#fragment" _(app.pagy_url_for(pagy, 5, absolute: true, html_escaped: true)).must_equal "http://example.com:3000/foo?page=5&a=3&b=4#fragment" end + it 'renders url with overridden path' do + pagy = Pagy.new count: 1000, page: 3, request_path: '/bar' + _(app.pagy_url_for(pagy, 5)).must_equal '/bar?page=5' + end end describe '#pagy_get_params and r' do diff --git a/test/pagy_test.rb b/test/pagy_test.rb index 47602a640..f0e06201b 100644 --- a/test/pagy_test.rb +++ b/test/pagy_test.rb @@ -60,6 +60,9 @@ def series_for(page, *expected) _ { Pagy.new(count: 100, page: '11') }.must_raise Pagy::OverflowError _ { Pagy.new(count: 100, page: 12) }.must_raise Pagy::OverflowError _ { Pagy.new(count: 100, params: 12) }.must_raise Pagy::VariableError + _ { Pagy.new(count: 100, request_path: "http://example.com/foo") }.must_raise Pagy::VariableError + _ { Pagy.new(count: 100, request_path: "/foo?bar=1") }.must_raise Pagy::VariableError + _ { Pagy.new(count: 100, request_path: "foo") }.must_raise Pagy::VariableError begin Pagy.new(count: 100, page: 12) rescue Pagy::OverflowError => e @@ -288,12 +291,16 @@ def series_for(page, *expected) _(pagy.prev).must_equal(9) _(pagy.next).must_equal 1 end + it 'initializes the request_path' do + pagy = Pagy.new(count: 100, request_path: '/foo') + _(pagy.request_path).must_equal('/foo') + end end describe 'accessors' do it 'has accessors' do [ - :count, :page, :items, :vars, # input + :count, :page, :items, :vars, :request_path, # input :offset, :pages, :last, :from, :to, :in, :prev, :next, :series # output ].each do |meth| _(pagy).must_respond_to meth @@ -309,6 +316,7 @@ def series_for(page, *expected) _(Pagy::DEFAULT[:size]).must_equal [1, 4, 4, 1] _(Pagy::DEFAULT[:page_param]).must_equal :page _(Pagy::DEFAULT[:params]).must_equal({}) + _(Pagy::DEFAULT[:request_path]).must_equal('') end end From 1a8ae72ad92b12f40692032a3e5d8f25b19fb026 Mon Sep 17 00:00:00 2001 From: Bruno Casali Date: Fri, 16 Dec 2022 05:02:40 -0300 Subject: [PATCH 23/29] Add Meilisearch finite pagination by default in the meilisearch extra (#417) --- docs/extras/meilisearch.md | 8 ++++---- e2e/package.json | 1 + e2e/tsconfig.json | 7 ++++++- lib/pagy/extras/meilisearch.rb | 22 ++++++++++++---------- test/mock_helpers/meilisearch.rb | 13 +++++++------ test/pagy/extras/meilisearch_test.rb | 2 +- 6 files changed, 31 insertions(+), 22 deletions(-) diff --git a/docs/extras/meilisearch.md b/docs/extras/meilisearch.md index 5d9522976..9bdf38558 100644 --- a/docs/extras/meilisearch.md +++ b/docs/extras/meilisearch.md @@ -20,7 +20,7 @@ require 'pagy/extras/meilisearch' If you have an already paginated `Meilisearch` results, you can get the `Pagy` object out of it: ```ruby -@results = Model.ms_search(nil, offset: 10, limit: 10, ...) +@results = Model.ms_search(nil, hits_per_page: 10, page: 10, ...) @pagy = Pagy.new_from_meilisearch(@results, ...) ``` @@ -46,14 +46,14 @@ results = Article.pagy_search(params[:q]) - [meilisearch.rb](https://github.com/ddnexus/pagy/blob/master/lib/pagy/extras/meilisearch.rb) -## Pasive mode +## Passive mode ### Pagy.new_from_meilisearch This constructor accepts a Meilisearch as the first argument, plus the usual optional variable hash. It sets the `:items`, `:page` and `:count` pagy variables extracted/calculated out of the Meilisearch object. ```ruby -@results = Model.ms_search(nil, offset: 10, limit: 10, ...) +@results = Model.ms_search(nil, hits_per_page: 10, page: 5, ...) @pagy = Pagy.new_from_meilisearch(@results, ...) ``` @@ -73,7 +73,7 @@ The `Pagy::Meilisearch` adds the `pagy_search` class method that you must use in ### pagy_search(...) -This method accepts the same arguments of the `search` method and you must use it in its place. This extra uses it in order to capture the arguments, automatically merging the calculated `:offset` and `:limit` options before passing them to the standard `search` method internally. +This method accepts the same arguments of the `search` method and you must use it in its place. ### Variables diff --git a/e2e/package.json b/e2e/package.json index 0dea670a5..891341817 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -2,6 +2,7 @@ "name": "pagy.e2e", "description": "Pagy E2E Testing", "private": true, + "type": "module", "engines": { "node": ">=16.15.0" }, diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index cb26696ea..8a6539fd8 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -2,7 +2,8 @@ "include": ["./cypress/**/*.ts"], "compilerOptions": { "strict": true, - "target": "es5", + "target": "es2016", + "module": "ES6", "lib": ["esnext", "dom", "dom.iterable"], "types": ["cypress", "node"], "noEmit": true, @@ -12,5 +13,9 @@ "allowSyntheticDefaultImports": true, "moduleResolution": "node", "resolveJsonModule": true + }, + "ts-node": { + // Tell ts-node CLI to install the --loader automatically + "esm": true } } diff --git a/lib/pagy/extras/meilisearch.rb b/lib/pagy/extras/meilisearch.rb index c7deebfe4..e995cc605 100644 --- a/lib/pagy/extras/meilisearch.rb +++ b/lib/pagy/extras/meilisearch.rb @@ -19,9 +19,10 @@ def pagy_meilisearch(term = nil, **vars) module Pagy # Create a Pagy object from a Meilisearch results def new_from_meilisearch(results, vars = {}) - vars[:items] = results.raw_answer['limit'] - vars[:page] = (results.raw_answer['offset'] / vars[:items]) + 1 - vars[:count] = results.raw_answer['nbHits'] + vars[:items] = results.raw_answer['hitsPerPage'] + vars[:page] = results.raw_answer['page'] + vars[:count] = results.raw_answer['totalHits'] + new(vars) end end @@ -32,13 +33,14 @@ module Backend # Return Pagy object and results def pagy_meilisearch(pagy_search_args, vars = {}) - model, term, options = pagy_search_args - vars = pagy_meilisearch_get_vars(nil, vars) - options[:limit] = vars[:items] - options[:offset] = (vars[:page] - 1) * vars[:items] - results = model.send(DEFAULT[:meilisearch_search], term, **options) - vars[:count] = results.raw_answer['nbHits'] - pagy = ::Pagy.new(vars) + model, term, options = pagy_search_args + vars = pagy_meilisearch_get_vars(nil, vars) + options[:hits_per_page] = vars[:items] + options[:page] = vars[:page] + results = model.send(:ms_search, term, **options) + vars[:count] = results.raw_answer['totalHits'] + + pagy = ::Pagy.new(vars) # with :last_page overflow we need to re-run the method in order to get the hits return pagy_meilisearch(pagy_search_args, vars.merge(page: pagy.page)) \ if defined?(::Pagy::OverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page diff --git a/test/mock_helpers/meilisearch.rb b/test/mock_helpers/meilisearch.rb index 4d3b47ff9..8c10b3928 100644 --- a/test/mock_helpers/meilisearch.rb +++ b/test/mock_helpers/meilisearch.rb @@ -9,16 +9,17 @@ module MockMeilisearch class Results < Array def initialize(query, params = {}) @query = query - @params = { offset: 0, limit: 10 }.merge(params) - super RESULTS[@query].slice(@params[:offset], @params[:limit]) || [] + @params = { page: 1, hits_per_page: 10 }.merge(params) + + super RESULTS[@query].slice(@params[:hits_per_page] * (@params[:page] - 1), @params[:hits_per_page]) || [] end def raw_answer { - 'hits' => self, - 'offset' => @params[:offset], - 'limit' => @params[:limit], - 'nbHits' => RESULTS[@query].length + 'hits' => self, + 'hitsPerPage' => @params[:hits_per_page], + 'page' => @params[:page], + 'totalHits' => RESULTS[@query].length } end end diff --git a/test/pagy/extras/meilisearch_test.rb b/test/pagy/extras/meilisearch_test.rb index 85abef32a..1d5856a1a 100644 --- a/test/pagy/extras/meilisearch_test.rb +++ b/test/pagy/extras/meilisearch_test.rb @@ -94,7 +94,7 @@ _(pagy.page).must_equal 1 end it 'paginates results with vars' do - results = MockMeilisearch::Model.ms_search('b', limit: 15, offset: 30) + results = MockMeilisearch::Model.ms_search('b', hits_per_page: 15, page: 3) pagy = Pagy.new_from_meilisearch(results, link_extra: 'X') _(pagy).must_be_instance_of Pagy _(pagy.count).must_equal 1000 From 7151517ef7522789d057535ed4634deab6f9af9f Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Wed, 14 Dec 2022 13:38:41 +0700 Subject: [PATCH 24/29] Fix for bump.sh --- bump.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bump.sh b/bump.sh index 8fcb773ca..428d052b0 100755 --- a/bump.sh +++ b/bump.sh @@ -6,7 +6,7 @@ set -e ./e2e/ci-cache.sh # Exit if the working tree is dirty -test -n "$(git status --porcelain)" && echo "Working tree dirty!" && exit 1 +#test -n "$(git status --porcelain)" && echo "Working tree dirty!" && exit 1 # Set the root path ROOT="$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")" @@ -38,7 +38,9 @@ esc_old_minor_vers=${esc_old_vers%\\*} esc_new_minor_vers=${esc_new_vers%\\*} sed -i "0,/$esc_old_minor_vers/{s/$esc_old_minor_vers/$esc_new_minor_vers/}" "$ROOT/docs/how-to.md" -npm run build -w src +cd "$ROOT/src" +pnpm run build +cd "$ROOT" # Update CHANGELOG changelog=$(cat <<-LOG From d4c30049be52a565beef3f0633720589ed257d64 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Wed, 14 Dec 2022 13:44:44 +0700 Subject: [PATCH 25/29] Updated run configurations --- .idea/runConfigurations/Chrome.xml | 17 +++++++++ .idea/runConfigurations/Pagy_App.xml | 35 +++++++++++++++++ .idea/runConfigurations/Pagy_App_DEBUG.xml | 38 +++++++++++++++++++ ...to_correct.xml => Rubocop_autocorrect.xml} | 2 +- .idea/runConfigurations/buid_sh.xml | 17 +++++++++ .idea/runConfigurations/bump_sh.xml | 17 +++++++++ ...{e2e_test_open.xml => e2e_test__open_.xml} | 5 ++- .../manifest_generate__pagy.xml | 26 +++++++++++++ .idea/runConfigurations/pagy.xml | 12 ------ .idea/runConfigurations/pagy_app.xml | 12 ++++++ 10 files changed, 166 insertions(+), 15 deletions(-) create mode 100644 .idea/runConfigurations/Chrome.xml create mode 100644 .idea/runConfigurations/Pagy_App.xml create mode 100644 .idea/runConfigurations/Pagy_App_DEBUG.xml rename .idea/runConfigurations/{Rubocop_auto_correct.xml => Rubocop_autocorrect.xml} (93%) create mode 100644 .idea/runConfigurations/buid_sh.xml create mode 100644 .idea/runConfigurations/bump_sh.xml rename .idea/runConfigurations/{e2e_test_open.xml => e2e_test__open_.xml} (68%) create mode 100644 .idea/runConfigurations/manifest_generate__pagy.xml delete mode 100644 .idea/runConfigurations/pagy.xml create mode 100644 .idea/runConfigurations/pagy_app.xml diff --git a/.idea/runConfigurations/Chrome.xml b/.idea/runConfigurations/Chrome.xml new file mode 100644 index 000000000..96f6d0c4e --- /dev/null +++ b/.idea/runConfigurations/Chrome.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Pagy_App.xml b/.idea/runConfigurations/Pagy_App.xml new file mode 100644 index 000000000..ab8a51755 --- /dev/null +++ b/.idea/runConfigurations/Pagy_App.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Pagy_App_DEBUG.xml b/.idea/runConfigurations/Pagy_App_DEBUG.xml new file mode 100644 index 000000000..cf87bd3ef --- /dev/null +++ b/.idea/runConfigurations/Pagy_App_DEBUG.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Rubocop_auto_correct.xml b/.idea/runConfigurations/Rubocop_autocorrect.xml similarity index 93% rename from .idea/runConfigurations/Rubocop_auto_correct.xml rename to .idea/runConfigurations/Rubocop_autocorrect.xml index d736a6dcb..cf1178c8f 100644 --- a/.idea/runConfigurations/Rubocop_auto_correct.xml +++ b/.idea/runConfigurations/Rubocop_autocorrect.xml @@ -1,5 +1,5 @@ - + diff --git a/.idea/runConfigurations/buid_sh.xml b/.idea/runConfigurations/buid_sh.xml new file mode 100644 index 000000000..706577213 --- /dev/null +++ b/.idea/runConfigurations/buid_sh.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/bump_sh.xml b/.idea/runConfigurations/bump_sh.xml new file mode 100644 index 000000000..a6cfcf656 --- /dev/null +++ b/.idea/runConfigurations/bump_sh.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/e2e_test_open.xml b/.idea/runConfigurations/e2e_test__open_.xml similarity index 68% rename from .idea/runConfigurations/e2e_test_open.xml rename to .idea/runConfigurations/e2e_test__open_.xml index 6af0c541c..0608a88dd 100644 --- a/.idea/runConfigurations/e2e_test_open.xml +++ b/.idea/runConfigurations/e2e_test__open_.xml @@ -1,12 +1,13 @@ - + - - - -

                    © 2017-2022 Domizio DemichelisMIT License

                    - - - - - -

                    ➡ Chat Support on Gitter ➡

                    - - - -
                    - {% include anchor_headings.html html=content beforeHeading=true anchorBody="" %} -
                    - - - - - - - - -{% if site.google_analytics %} - -{% endif %} - - diff --git a/docs/api.md b/docs/api.md deleted file mode 100644 index d44165325..000000000 --- a/docs/api.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: API ---- -# API - -The public API of Pagy is composed by 3 groups of modules: - -## Core modules - -The low level structure needed for standard usage. It's composed of just one class and two modules: - -- The [Pagy](api/pagy.md) core class that implements the pagination logic -- The [Pagy::Backend](api/backend.md) module to include in your controllers -- The [Pagy::Frontend](api/frontend.md) module to include in your helpers - -## Support modules/classes - -These modules/classes provide support for special environments or features that go beyond the standard usage: - -- The [Pagy::Calendar](api/calendar.md) subclass that that paginates the collection by calendar units (year, quarter, month, week, day) used by the [calendar](extras/calendar.md) extra. -- The [Pagy::Countless](api/countless.md) subclass that provides the pagination without a count used by the [countless](extras/countless.md) extra. (It saves one count query per request). -- The [Pagy::Console](api/console.md) module that provides easy interaction with pagy in the IRB/rails console -- The [Pagy::I18n](api/i18n.md) module that provides multi-language translation of the pagy strings - -## Extras - -Pagy provides also a growing number of optional extensions/extras that can handle special features, collections or environments. See the [extras](extras.md) doc for the full list. diff --git a/docs/api/backend.md b/docs/api/backend.md index 29af97458..f3d297ea9 100644 --- a/docs/api/backend.md +++ b/docs/api/backend.md @@ -1,5 +1,9 @@ --- title: Pagy::Backend +categories: +- Core +- Module +description: This module provides the base functionality for the backend. --- # Pagy::Backend @@ -7,14 +11,16 @@ This module _(see [source](https://github.com/ddnexus/pagy/blob/master/lib/pagy/ For overriding convenience, the `pagy` method calls two sub-methods that you may need to override in order to customize it for any type of collection (e.g. different ORM types, Array, elasticsearch results, etc.). -**Notice**: Keep in mind that the whole module is basically providing a single functionality: getting a Pagy instance and the paginated items. You could re-write the whole module as one single and simpler method specific to your need, eventually gaining a few IPS in the process. If you seek a bit more performance you are encouraged to [write your own Pagy methods](#writing-your-own-pagy-methods). +!!!primary `Pagy::Backend` returns `pagy` instances +Keep in mind that the whole module is basically providing a single functionality: getting a Pagy instance and the paginated items. You could re-write the whole module as one single and simpler method specific to your need, eventually gaining a few IPS in the process. If you seek a bit more performance you are encouraged to [write your own Pagy methods](#writing-your-own-pagy-methods). +!!! -Check also the [array](../extras/array.md), [searchkick](../extras/searchkick.md), [elasticsearch_rails](../extras/elasticsearch_rails.md) and [meilisearch](../extras/meilisearch.md) extras for specific backend customizations. +Check also the [array](/docs/extras/array.md), [searchkick](/docs/extras/searchkick.md), [elasticsearch_rails](/docs/extras/elasticsearch_rails.md) and [meilisearch](/docs/extras/meilisearch.md) extras for specific backend customizations. ## Synopsis +||| Controller ```ruby -# in some controller include Pagy::Backend # optional overriding of some sub-method @@ -27,6 +33,7 @@ def index @pagy, @records = pagy(Product.some_scope, some_option: 'some option for this instance') end ``` +||| ## Methods @@ -34,7 +41,7 @@ All the methods in this module are prefixed with the `"pagy_"` string, to avoid Please, keep in mind that overriding any method is very easy with Pagy. Indeed you can do it right where you are using it: no need of monkey-patching or perform any tricky gimmickry. -### pagy(collection, vars=nil) +==- `pagy(collection, vars=nil)` This is the main method of this module. It takes a collection object (e.g. a scope), and an optional hash of variables (passed to the `Pagy.new` method) and returns the `Pagy` instance and the page of records. For example: @@ -46,17 +53,21 @@ The built-in `pagy` method is designed to be easy to customize by overriding any If you need to use multiple different types of collections in the same app or action, you may want to define some alternative and self contained custom `pagy` method. (see [Writing your own Pagy methods](#writing-your-own-pagy-methods)) -### pagy_get_vars(collection, vars) +==- `pagy_get_vars(collection, vars)` Sub-method called only by the `pagy` method, it returns the hash of variables used to initialize the Pagy object. -Override it if you need to add or change some variable. For example you may want to add the `:i18n_key` in order to customize output _(see [How to customize the item name](../how-to.md#customize-the-item-name))_, or even cache the `count`. +Override it if you need to add or change some variable. For example you may want to add the `:i18n_key` in order to customize +output _(see [How to customize the item name](/docs/how-to.md#customize-the-item-name))_, or even cache the `count`. -_IMPORTANT_: `:count` and `:page` are the only 2 required Pagy core variables, so be careful not to remove them from the returned hash. -See also the [How To](../how-to.md) page for some usage example. +!!!warning Don't remove `:count` and `:page` +`:count` and `:page` are the only 2 required Pagy core variables, so be careful not to remove them from the returned hash. +!!! -### pagy_get_items(collection, pagy) +See also the [How To](/docs/how-to.md) page for some usage examples. + +==- `pagy_get_items(collection, pagy)` Sub-method called only by the `pagy` method, it returns the page items (i.e. the records belonging to the current page). @@ -76,7 +87,11 @@ def pagy_get_items(array, pagy) end ``` -**Notice**: in order to paginate arrays, you may want to use the [array extra](../extras/array.md). +!!!info `Array` extra for Arrays +In order to paginate arrays, you may want to use the [array extra](/docs/extras/array.md). +!!! + +=== ## Writing your own Pagy methods @@ -86,13 +101,20 @@ In that case you can define a number of `pagy_*` custom methods specific for eac For example: here is a `pagy` method that doesn't call any sub-method, that may be enough for your needs: +||| Controller ```ruby def pagy_custom(collection, vars={}) pagy = Pagy.new(count: collection.count(:all), page: params[:page], **vars) [pagy, collection.offset(pagy.offset).limit(pagy.items)] end ``` +||| + +You can easily write a `pagy` method for _any possible_ environment: please read how to [Paginate Any Collection](/docs/how-to.md#paginate-any-collection) for details. + + +!!!success PRs Welcome +If you write some useful backend customizations, please [let us know](https://github.com/ddnexus/pagy/discussions/categories/feature-requests) if you can submit a PR for a specific extra or if you need any help to do it. +!!! -You can easily write a `pagy` method for _any possible_ environment: please read how to [Paginate Any Collection](../how-to.md#paginate-any-collection) for details. -**IMPORTANT**: If you write some useful backend customization, please [let us know](https://gitter.im/ruby-pagy/Lobby) if you can submit a PR for a specific extra or if you need any help to do it. diff --git a/docs/api/calendar.md b/docs/api/calendar.md index 7a4770b11..13da111b4 100644 --- a/docs/api/calendar.md +++ b/docs/api/calendar.md @@ -1,13 +1,20 @@ --- title: Pagy::Calendar +category: +- Feature +- Class --- # Pagy::Calendar This is a `Pagy` subclass that provides pagination filtering by time: year, quarter, month, week, day (and supports your own [custom time units](#custom-units)). -**Notice**: It requires the `activesupport` gem, which you have to require in your Gemfile only if your app does not use Rails. +!!!primary Active Support Required +It requires the `activesupport` gem, which you have to require in your Gemfile only if your app does not use Rails. +!!! -**Notice**: The `Pagy::Calendar::*` subclasses provide support for the [calendar extra](../extras/calendar.md) and are meant to be used with standard, non-calendar Pagy classes and never alone (because they could generate a very high number of items per page). The class APIs are documented here, however you should not need to use them directly because they are required and used internally by the extra. +!!!primary Module to be used with `pagy` classes +The `Pagy::Calendar::*` subclasses provide support for the [calendar extra](/docs/extras/calendar.md) and are meant to be used with standard, non-calendar Pagy classes and never alone (because they could generate a very high number of items per page). The class APIs are documented here, however you should not need to use them directly because they are required and used internally by the extra. +!!! ## Overview @@ -15,7 +22,9 @@ The pagy `Pagy::Calendar::*` instances split a time period into pages of equal t Each page is also conveniently labeled in the navigation bar with the specific `Time` period it refers to. -**IMPORTANT**: This classes respects the natural calendar units, not the duration of a unit. If you paginate by year, each page will be a calendar year starting January 1st and ending December 31st, not a period starting and ending at two arbitrary dates one year apart. All the classes follow the same principle. Time units with no records are displayed as empty pages. +!!!primary Natural Calendar Unit Respected +This classes respects the natural calendar units, not the duration of a unit. If you paginate by year, each page will be a calendar year starting January 1st and ending December 31st, not a period starting and ending at two arbitrary dates one year apart. All the classes follow the same principle. Time units with no records are displayed as empty pages. +!!! ## Variables @@ -75,13 +84,15 @@ Set the `Date.beginning_of_week` toto the symbol of the first day of the week (e ## Methods -### label(opts = {}) +==- `label(opts = {})` This method uses the `:format` variable to generate the current page label with the specific `TimeWithZone` period it refers to. It accepts an optional `:format` keyword argument for overriding. +=== -### label_for(page, opts = {}) +==- `label_for(page, opts = {})` This method takes a page number argument (`Integer` or `String`) and uses the `:format` variable to generate its label with the specific `Time` period it refers to. It accepts an optional `:format` keyword argument for overriding. +=== ## Custom units diff --git a/docs/api/console.md b/docs/api/console.md index d54dc2e85..1593a535a 100644 --- a/docs/api/console.md +++ b/docs/api/console.md @@ -1,5 +1,8 @@ --- title: Pagy::Console +categories: +- Support +- Module --- # Pagy::Console @@ -15,7 +18,7 @@ pagy_extras :array, :metadata, ... ### then you can use it like inside an app pagy, items = pagy_array((1..1000).to_a, page: 3) pagy_navs(pagy) -=> "" +=> "" pagy_metadata(pagy) => @@ -38,11 +41,11 @@ pagy_metadata(pagy) ## Pagy::Console module -The pagy console uses the [standalone extra](../extras/standalone.md) and sets the `Pagy::DEFAULT[:url]` variable default to `"http://www.example.com/subdir"` in order to activate the standalone mode. +The pagy console uses the [standalone extra](/docs/extras/standalone.md) and sets the `Pagy::DEFAULT[:url]` variable default to `"http://www.example.com/subdir"` in order to activate the standalone mode. Include the module in your console window in order to include also the `Pagy::Backend` and `Pagy::Frontend` modules. -### pagy_extras(*extras) +==- `pagy_extras(*extras)` Simple utility method to save some typing in the console. It will require the extras arguments. For example: @@ -51,3 +54,5 @@ pagy_extras :array, :bootstrap, :support, :headers, ... ``` You will be able to use any frontend or backend method implemented by pagy and the required extras right away. + +=== \ No newline at end of file diff --git a/docs/api/countless.md b/docs/api/countless.md index f2e5cb480..a3a182585 100644 --- a/docs/api/countless.md +++ b/docs/api/countless.md @@ -1,5 +1,8 @@ --- title: Pagy::Countless +category: +- Feature +- Class --- # Pagy::Countless @@ -10,7 +13,7 @@ This is a `Pagy` subclass (see [source](https://github.com/ddnexus/pagy/blob/mas - minimalistic UI, infinite scrolling, APIs that don't benefit from a nav-bar - when the full nav-bar is not a requirement and/or performance is more desirable -This class provides support for extras that don't need the full set of pagination support or need to avoid the `:count` variable (e.g. the [countless](../extras/countless.md) extra). The class API is documented here, however you should not need to use this class directly because it is required and used internally by the extra. +This class provides support for extras that don't need the full set of pagination support or need to avoid the `:count` variable (e.g. the [countless](/docs/extras/countless.md) extra). The class API is documented here, however you should not need to use this class directly because it is required and used internally by the extra. ## Caveats @@ -55,10 +58,12 @@ Retrieving these variables may be useful to supply a UI as complete as possible, The construction of the final `Pagy::Countless` object is split into 2 steps: the regular `initialize` method and the `finalize` method, which will use the retrieved items number to calculate the rest of the pagination integers. -### Pagy::Countless.new(vars) +==- `Pagy::Countless.new(vars)` The initial constructor takes the usual hash of variables, calculating only the requested `items` and the `offset`, useful to query the page of items. -### finalize(fetched_size) +==- `finalize(fetched_size)` The actual calculation of all the internal variables for the pagination is calculated using the size of the fetched items. The method returns the finalized instance object. + +=== \ No newline at end of file diff --git a/docs/api/frontend.md b/docs/api/frontend.md index 846cbbbbf..f211f072f 100644 --- a/docs/api/frontend.md +++ b/docs/api/frontend.md @@ -1,17 +1,20 @@ --- title: Pagy::Frontend +categories: +- Core +- Module --- # Pagy::Frontend This module provides a few methods to deal with the navigation aspect of the pagination. You will usually include it in some helper module, making its methods available (and overridable) in your views. _([source](https://github.com/ddnexus/pagy/blob/master/lib/pagy/frontend.rb))_ -You can extend this module with a few more nav helpers _(see the [extras](../extras.md) doc for more details)_ +You can extend this module with a few more nav helpers _(see the [extras](/categories/extras) doc for more details)_ ## Synopsis +||| View Helper ```ruby -# typically in some helper include Pagy::Frontend # optional overriding of some sub-method @@ -19,13 +22,15 @@ def pagy_nav(...) ... end ``` +||| -use some of its method in some view: +||| View ```erb <%== pagy_nav(@pagy, ...) %> <%== pagy_info(@pagy, ...) %> ``` +||| ## Methods @@ -33,13 +38,15 @@ All the methods in this module are prefixed with the `"pagy_"` string in order t Please, keep in mind that overriding any method is very easy with Pagy. Indeed you can do it right where you are using it: no need of monkey-patching or tricky gimmickry. -### pagy_nav(pagy, ...) +==- `pagy_nav(pagy, ...)` This method takes the Pagy object and returns the HTML string with the pagination links, which are wrapped in a `nav` tag and are ready to use in your view. For example: +||| View ```erb <%== pagy_nav(@pagy, ...) %> ``` +||| The method accepts also a few optional keyword arguments: @@ -49,9 +56,9 @@ The method accepts also a few optional keyword arguments: The `nav.*` templates produce the same output, and can be used as an easier (but slower) way to customize it. -See also [Using templates](../how-to.md#use-templates). +See also [Using templates](/docs/how-to.md#use-templates). -### pagy_info(pagy, pagy_id: ..., item_name: ..., i18n_key: ...) +==- `pagy_info(pagy, pagy_id: ..., item_name: ..., i18n_key: ...)` This method provides the info about the content of the current pagination. For example: @@ -71,58 +78,50 @@ The method accepts also a few optional keyword arguments: Notice the `:i18n_key` can be passed also to the constructor or be a less useful global variable (i.e. `Pagy::DEFAULT[:i18n_key]` +||| View ```erb <%== pagy_info(@pagy, item_name: 'Product'.pluralize(@pagy.count) %> <%== pagy_info(@pagy, i18n_key: 'activerecord.model.product' %> ``` +||| Displaying Products 476-500 of 1000 in total -_(see [Customizing the item name](../how-to.md#customize-the-item-name))_ +_(see [Customizing the item name](/docs/how-to.md#customize-the-item-name))_ -### pagy_url_for(pagy, page, absolute: false, html_escaped: false) +==- `pagy_url_for(pagy, page, absolute: false, html_escaped: false)` This method is called internally in order to produce the url of a page by passing it its number. For standard usage it works out of the box and you can just ignore it. -It works by merging the pagy `:params` hash with the raw `request.GET`, and adding the `:page_param` (`:page` by default) set to the passed `page`, and the `:items` if the `:items_extra` is enabled. +See also [How to customize the URL](/docs/how-to.md#customize-the-url) and [How to customize the params](/docs/how-to.md#customize-the-params). -Before producing the final URL (which can be `absolute` if you pass `absolute: true`), it passes the resulting params hash to the [pagy_massage_params](#pagy_massage_paramsparams) method, which can be overridden for total control of the params in the URL. - -The `query_string` can also be `html_escaped` to be used in html tags (avoiding the problem of concatenation of params that start with an html entity key). - -The `:fragment` variable is also appended to the URL if defined. - -See also [How to customize the URL](../how-to.md#customize-the-url). - -### pagy_massage_params(params) - -The `pagy_massage_params` method has been deprecated and it will be ignored from version 6. Use the `:params` variable instead. - -See also [How to customize the params](../how-to.md#customize-the-params). - -### pagy_link_proc(pagy, link_extra='') +==- `pagy_link_proc(pagy, link_extra='')` This method is called internally to get a very specialized and fast proc that produce the HTML links for the pages. -For standard usage you may just need to read [How to customize the link attributes](../how-to.md#customize-the-link-attributes), for advanced usage see below. +For standard usage you may just need to read [How to customize the link attributes](/docs/how-to.md#customize-the-link-attributes), for advanced usage see below. + +=== ## Advanced Usage You need this section only if you are going to override a `pagy_nav*` helper or a template AND you need to customize the HTML attributes of the link tags. -**Important**: This method is not intended to be overridden, however you could just replace it in your overridden `pagy_nav*` helpers or templates with some generic helper like the rails `link_to`. If you intend to do so, be sure to have a very good reason, since using `pagy_link_proc` is a lot faster than the rails `link_to` (benchmarked at ~22x faster using ~18x less memory on a 20 links nav). +!!! primary +This method is not intended to be overridden, however you could just replace it in your overridden `pagy_nav*` helpers or templates with some generic helper like the rails `link_to`. If you intend to do so, be sure to have a very good reason, since using `pagy_link_proc` is a lot faster than the rails `link_to` (benchmarked at ~22x faster using ~18x less memory on a 20 links nav). +!!! This method returns a specialized proc that you call to produce the page links. The reason it is a two steps process instead of a single method call is performance. Indeed the method calls the potentially expensive `pagy_url_for` only once and generates the proc, then calling the proc will just interpolates the strings passed to it. Here is how you should use it: in your helper or template call the method to get the proc (just once): -```rb +```ruby link = pagy_link_proc( pagy [, extra_attributes_string ] ) ``` Then call the `"link"` proc to get the links (multiple times): -```rb +```ruby link.call( page_number [, text [, extra_attributes_string ] ] ) ``` @@ -130,25 +129,35 @@ link.call( page_number [, text [, extra_attributes_string ] ] ) If you need to add some HTML attribute to the page links, you can pass some extra attribute string at many levels, depending on the scope you want your attributes to be added. -**Important**: For performance reasons, the extra attributes strings must be formatted as valid HTML attribute/value pairs. _All_ the strings passed at any level will get inserted verbatim in the HTML of the link. +!!!primary Attributes Must be Valid HTML +For performance reasons, the extra attributes strings must be formatted as valid HTML attribute/value pairs. _All_ the strings passed at any level will get inserted *verbatim* in the HTML of the link. +!!! 1. For all pagy objects: set the global variable `:link_extra`: - ```rb - # in the pagy.rb initializer file + ||| pagy.rb (initializer) + ```ruby Pagy::DEFAULT[:link_extra] = 'data-remote="true"' - # in any view + ||| + + ||| View + ```ruby link = pagy_link_proc(pagy) link.call(2) #=> 2 ``` + ||| 2. For one Pagy object: pass the `:link_extra` variable to a Pagy constructor (`Pagy.new` or `pagy` controller method): + ||| Controller ```ruby - # in any controller @pagy, @records = pagy(my_scope, link_extra: 'data-remote="true"') - # in any view + ``` + ||| + + ||| View + ```ruby link = pagy_link_proc(pagy) link.call(2) #=> 2 @@ -156,38 +165,47 @@ If you need to add some HTML attribute to the page links, you can pass some extr 3. For all the `link.call`: pass an extra attributes string to the `pagy_link_proc`: + ||| View ```ruby - # in any view link = pagy_link_proc(pagy, 'class="page-link"') link.call(2) #=> 2 link.call(3) #=> 3 ``` + ||| 4. For a single `link.call`: pass an extra attributes string when you call the proc: + ||| View ```ruby - # in any view link.call(page_number, 'aria-label="my-label"') #=> 2 ``` + ||| #### CAVEATS We use only strings for performance, so the attribute strings get concatenated level after level, but not merged! +!!! warning Do Not Pass Atributes Multiple Times Be careful not to pass the same attribute at different levels multiple times. That would generate a duplicated HTML attribute which is illegal html (although handled by all mayor browsers by ignoring all the duplicates but the first). +!!! +!!!warning Do not add `class` attribute for `*js` helpers Specifically do not add a `class` attribute that will end up in the `pagy_bootstrap_nav_js`, `pagy_semantic_nav_js` and `pagy_semantic_combo_nav_js`, which define already their own. +!!! -### pagy_t(key, vars={}) +==- `pagy_t(key, vars={})` This method is similar to the `I18n.t` and its equivalent rails `t` helper. It is called internally (from helpers and templates) in order to get the interpolated strings out of a YAML dictionary file. _(see I18n below)_ +=== + + ## I18n -Pagy can provide i18n using its own recommended super fast implementation (see the [Pagy::I18n](i18n.md) doc) or can use the slower standard `i18n` gem (see the [i18n extra](../extras/i18n.md) doc). +Pagy can provide i18n using its own recommended super fast implementation (see the [Pagy::I18n](i18n.md) doc) or can use the slower standard `i18n` gem (see the [i18n extra](/docs/extras/i18n.md) doc). ### Dictionaries/locales @@ -195,4 +213,7 @@ Pagy provides many ready-to-use dictionaries for different locales/languages usa All the pagy strings are are stored in the dictionary files of its [locales](https://github.com/ddnexus/pagy/blob/master/lib/locales), ready to be customized and/or used with or without the `I18n` gem. The files follow the same structure of the standard locale files for the `i18n` gem. -**IMPORTANT**: if you are using pagy with some language missing from the [locales](https://github.com/ddnexus/pagy/blob/master/lib/locales), please, submit your translation! +!!!success Missing Language PRs accepted +If you are using pagy with some language missing from the [locales](https://github.com/ddnexus/pagy/blob/master/lib/locales), please, [submit your translation!](https://github.com/ddnexus/pagy/pulls) +!!! + diff --git a/docs/api/i18n.md b/docs/api/i18n.md index 6b726ebeb..bd90d8815 100644 --- a/docs/api/i18n.md +++ b/docs/api/i18n.md @@ -1,26 +1,30 @@ --- title: Pagy::I18n +categories: +- Feature +- Module --- # Pagy::I18n This module provides the Pagy implementation of the i18n `translation` method used internally (`pagy_t`). It's ~18x faster and uses ~10x less memory than the standard `i18n` gem. -See the [i18n extra](../extras/i18n.md) doc if you need to use the slower standard `i18n` gem instead. +See [i18n extra](/docs/extras/i18n.md) if you need to use the slower standard `i18n` gem instead. ## Configuration -**Notice**: If your app uses only the default `en` language or if you use the [i18n extra](../extras/i18n.md) you don't need to configure anything for this module. + +!!!success Configuration Not Required for: `en` / `i18n extra` +If your app uses only the default `en` language or if you use the [i18n extra](/docs/extras/i18n.md) you don't need to configure anything for this module. +!!! + If you need to load different built-in locales, and/or custom dictionary files or even non built-in language and pluralization, you can do it all by passing a few arguments to the `Pagy::I18n.load` method. ### Synopsis +||| pagy.rb (initializer) ```ruby -# in the pagy.rb initializer file - -# IMPORTANT: use only one load statement or you will get a FrozenError exception - # load the "de" built-in locale: Pagy::I18n.load(locale: 'de') @@ -41,8 +45,15 @@ Pagy::I18n.load({ locale: 'en' }, filepath: 'path/to/pagy-xyz.yml', pluralize: lambda{ |count| ... } }) ``` +||| + +!!!warning Use one load statement +Use only one load statement or you will get a FrozenError exception +!!! -**Notice**: You should use a custom `:pluralize` proc only for pluralization types not included in the built-in pluralization rules (stored in the `Pagy::I18n::P11n::RULE` hash). +!!!primary Customize only when required +You should use a custom `:pluralize` proc only for pluralization types not included in the built-in pluralization rules (stored in the `Pagy::I18n::P11n::RULE` hash). +!!! The `:pluralize` proc should receive the `count` as a single argument and should return the plural type string (e.g. something like `'one'` or `'other'`, depending on the passed count). @@ -50,9 +61,11 @@ The `:pluralize` proc should receive the `count` as a single argument and should When you configure multiple locales (i.e. this does not apply to single locale apps), you must also set the locale at each request. You usually do that in the application controller, by checking the `:locale` param. For example, in a rails app you should do something like: +||| Controller ```ruby before_action { @pagy_locale = params[:locale] } ``` +||| If the `@pagy_locale` is `nil` or missing pagy will serve the first locale you set in the configuration. @@ -74,4 +87,4 @@ en: ... ``` -_(See also the [pagy_info method](frontend#pagy_infopagy-pagy_id--item_name--i18n_key-) and [How to customize the item name](../how-to.md#customize-the-item-name))_ +_(See also the [pagy_info method](frontend#pagy-info-pagy-pagy-id-item-name-i18n-key) and [How to customize the item name](/docs/how-to.md#customize-the-item-name))_ diff --git a/docs/api/index.yml b/docs/api/index.yml new file mode 100644 index 000000000..24b1c628a --- /dev/null +++ b/docs/api/index.yml @@ -0,0 +1,2 @@ +label: API +icon: package-24 diff --git a/docs/api/javascript.md b/docs/api/javascript.md index a8d259972..b305cc71f 100644 --- a/docs/api/javascript.md +++ b/docs/api/javascript.md @@ -1,48 +1,32 @@ --- title: Javascript +categories: +- Support +image: null --- # Javascript ## Overview -A few helpers use javascript, and they are clearly recognizable by the `js` suffix: +A few helpers use Javascript and offer some extra feature and require some extra setup. -- `pagy*_nav_js` -- `pagy*_combo_nav_js` -- `pagy_items_selector_js` +### Advantages -If you use any of them you should follow this documentation, if not, consider that Javascript is not used anywhere else, so you can skip this. +- Better performance and resource usage (see [Maximizing Performance](/docs/how-to.md#maximize-performance)) +- Client-side rendering +- Optional responsiveness -### How does it work? +### Helpers -All the `pagy*_js` helpers render their component on the client side. The helper methods serve just a minimal HTML tag that contains a `data-pagy` attribute. A small javascript file (that you must include in your assets) will take care to convert the data embedded in the `data-pagy` attribute and make it work in the browser. ++++ `pagy*_nav_js` -You can pick and configure [a Javascript File](https://github.com/ddnexus/pagy/tree/master/lib/javascripts) depending on the environment of your app. +![bootstrap_nav_js](/docs/assets/images/bootstrap_nav_js-g.png) -**Notice** The javascript file is required only for the `pagy*_js` helpers. Just using `'data-remote="true"'` without any `pagy*_js` helper works without any javascript file. - -### Faster performance with the oj gem - -Although it's not a requirement, you should consider adding the `gem 'oj'` to your Gemfile. When available, Pagy will automatically use it to boost the performance. (Notice: It does nothing for normal, non-js helpers.) - -### CAVEATS - -#### Overriding - -Any `*_js` helper is composed by a HTML part and some javascript code that work in sync. Overriding is likely going to break in the future as soon as the relation between the helper and the functions will change in a next release (e.g. arguments, naming, etc.), so overriding is not recommended. - -#### HTML fallback - -Notice that if the client browser doesn't support Javascript or if it is disabled, certain helpers will serve nothing useful for the user. If your app does not require Javascript support and you still want to use javascript helpers, then you should consider implementing your own HTML fallback. For example: - -```erb - -``` - -# Javascript Navs - -The following `pagy*_nav_js` helpers: +
                    + + Helpers for other CSS frameworks: + - `pagy_nav_js` - `pagy_bootstrap_nav_js` @@ -51,121 +35,22 @@ The following `pagy*_nav_js` helpers: - `pagy_materialize_nav_js` - `pagy_semantic_nav_js` -look like a normal `pagy*_nav` but have a few added features: - -1. Client-side rendering -2. Optional responsiveness -3. Better performance and resource usage _(see [Maximizing Performance](../how-to.md#maximize-performance))_ - -Here is a screenshot (from the `bootstrap`extra) showing responsiveness at different widths: - -![bootstrap_nav_js](../assets/images/bootstrap_nav_js-g.png) - -## Installation instructions - -1. Load the Javascript assets. -2. Add the relevant extra -3. Use JS helper in a View - -See [extras](../extras.md) for general usage info. - -#### 1. Load / Initialise Pagy Javascript - -The strategy might vary, depending on what you're using: sprockets / or bundlers like (webpack-esbuild-rollup etc) / importmaps / propshaft etc - see [Javascript Readme Instructions](https://github.com/ddnexus/pagy/blob/master/lib/javascripts/README.md) for installation and initialization details. - -#### 2. Add the relevant extra - -In the `pagy.rb` initializer, require the specific extra for the style you want to use: - -```ruby -# you only need one of the following extras -require 'pagy/extras/bootstrap' -require 'pagy/extras/bulma' -require 'pagy/extras/foundation' -require 'pagy/extras/materialize' -require 'pagy/extras/navs' -require 'pagy/extras/semantic' -require 'pagy/extras/uikit' -``` - -This will make available, the below helpers: - -#### 3. Use the JS helper in a View - -Use one of the `pagy*_nav_js` helpers in any view: - -```erb -<%== pagy_nav_js(@pagy) %> -<%== pagy_bootstrap_nav_js(@pagy) %> -<%== pagy_bulma_nav_js(@pagy) %> -<%== pagy_foundation_nav_js(@pagy) %> -<%== pagy_materialize_nav_js(@pagy) %> -<%== pagy_semantic_nav_js(@pagy) %> -``` - -## Variables - -| Variable | Description | Default | -|:---------|:-------------------------------------------------------------------|:--------| -| `:steps` | Hash variable to control multiple pagy `:size` at different widths | `false` | - -### :steps - -The `:steps` is an optional non-core variable used by the `pagy*_nav_js` navs. If it's `false`, the `pagy*_nav_js` will behave exactly as a static `pagy*_nav` respecting the single `:size` variable, just faster and lighter. If it's defined as a hash, it allows you to control multiple pagy `:size` at different widths. - -You can set the `:steps` as a hash where the keys are integers representing the widths in pixels and the values are the Pagy `:size` variables to be applied for that width. - -As usual, depending on the scope of the customization, you can set the variables globally or for a single pagy instance, or even pass it to the `pagy*_nav_js` helper as an optional keyword argument. - -For example: - -```ruby -# globally -Pagy::DEFAULT[:steps] = { 0 => [2,3,3,2], 540 => [3,5,5,3], 720 => [5,7,7,5] } +
                    -# or for a single instance -pagy, records = pagy(collection, steps: { 0 => [2,3,3,2], 540 => [3,5,5,3], 720 => [5,7,7,5] } ) +
                    -# or use the :size as any static pagy*_nav -pagy, records = pagy(collection, steps: false ) -``` +See [Pagy Navs](javascript/navs.md) -```erb -or pass it to the helper -<%== pagy_nav_js(@pagy, steps: {...}) %> -``` ++++ `pagy*_combo_nav_js` -The above statement means that from `0` to `540` pixels width, Pagy will use the `[2,3,3,2]` size, from `540` to `720` it will use the `[3,5,5,3]` size and over `720` it will use the `[5,7,7,5]` size. (Read more about the `:size` variable in the [How to control the page links](../how-to.md#control-the-page-links) section). +![bootstrap_combo_nav_js](/docs/assets/images/bootstrap_combo_nav_js-g.png) -**IMPORTANT**: You can set any number of steps with any arbitrary width/size. The only requirement is that the `:steps` hash must contain always the `0` width or a `Pagy::VariableError` exception will be raised. +* Navigation and pagination info combined. -#### Setting the right sizes - -Setting the widths and sizes can create a nice transition between widths or some apparently erratic behavior. - -Here is what you should consider/ensure: - -1. The pagy size changes in discrete `:steps`, defined by the width/size pairs. - -2. The automatic transition from one size to another depends on the width available to the pagy nav. That width is the _internal available width_ of its container (excluding eventual horizontal padding). - -3. You should ensure that - for each step - each pagy `:size` produces a nav that can be contained in its width. - -4. You should ensure that the minimum internal width for the container div be equal (or a bit bigger) to the smaller positive width. (`540` pixels in our previous example). - -5. If the container width snaps to specific widths in discrete steps, you should sync the quantity and widths of the pagy `:steps` to the quantity and internal widths for each discrete step of the container. - -#### Javascript Caveats - -In case of a window resize, the `pagy_*nav_js` elements on the page are re-rendered (when the container width changes), however if the container width changes in any other way that does not involve a window resize, then you should re-render the pagy element explicitly. For example: - -```js -document.getElementById('my-pagy-nav-js').render(); -``` - -# Javascript Combo Navs - -The following `pagy*_combo_nav_js` offer an alternative pagination UI that combines navigation and pagination info in a single compact element: +
                    + + Helpers for other CSS frameworks: + - `pagy_combo_nav_js` - `pagy_bootstrap_combo_nav_js` @@ -174,92 +59,19 @@ The following `pagy*_combo_nav_js` offer an alternative pagination UI that combi - `pagy_materialize_combo_nav_js` - `pagy_semantic_combo_nav_js` -They are the fastest and lightest `nav` on modern environments, recommended when you care about efficiency and server load _(see [Maximizing Performance](../how-to.md#maximize-performance))_. - -Here is a screenshot (from the `bootstrap` extra): - -![bootstrap_combo_nav_js](../assets/images/bootstrap_combo_nav_js-g.png) - -## Synopsis - -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer, require the specific extra for the style you want to use: - -```ruby -# you only need one of the following extras -require 'pagy/extras/bootstrap' -require 'pagy/extras/bulma' -require 'pagy/extras/foundation' -require 'pagy/extras/materialize' -require 'pagy/extras/navs' -require 'pagy/extras/semantic' -require 'pagy/extras/uikit' -``` - -Use the `pagy*_combo_nav_js` helpers in any view: - -```erb -<%== pagy_combo_nav_js(@pagy, ...) %> -<%== pagy_bootstrap_combo_nav_js(@pagy, ...) %> -<%== pagy_bulma_combo_nav_js(@pagy, ...) %> -<%== pagy_foundation_combo_nav_js(@pagy, ...) %> -<%== pagy_materialize_combo_nav_js(@pagy, ...) %> -<%== pagy_semantic_combo_nav_js(@pagy, ...) %> -``` - -## Methods - -### pagy*_nav_js(pagy, ...) - -The method accepts also a few optional keyword arguments: - -- `:pagy_id` which adds the `id` HTML attribute to the `nav` tag -- `:link_extra` which add a verbatim string to the `a` tag (e.g. `'data-remote="true"'`) -- `:steps` the [:steps](#steps) variable - -**CAVEATS**: the `pagy_bootstrap_nav_js` and `pagy_semantic_nav_js` assign a class attribute to their links, so do not add another class attribute with the `:link_extra`. That would be illegal HTML and ignored by most browsers. - -### pagy*_combo_nav_js(pagy, ...) - -The method accepts also a couple of optional keyword arguments: - -- `:pagy_id` which adds the `id` HTML attribute to the `nav` tag -- `:link_extra` which add a verbatim string to the `a` tag (e.g. `'data-remote="true"'`) - -**CAVEATS**: the `pagy_semantic_combo_nav_js` assigns a class attribute to its links, so do not add another class attribute with the `:link_extra`. That would be illegal HTML and ignored by most browsers. - -# Using AJAX - -If you AJAX-render any of the javascript helpers mentioned above, you should also execute `Pagy.init(container_element);` in the javascript template. Here is an example for an AJAX-rendered `pagy_bootstrap_nav_js`: - -In `pagy_remote_nav_js` controller action (notice the `link_extra` to enable AJAX): - -```ruby -def pagy_remote_nav_js - @pagy, @records = pagy(Product.all, link_extra: 'data-remote="true"') -end -``` +
                    -In `pagy_remote_nav_js.html.erb` template for non-AJAX render (first page-load): +
                    -```erb -
                    - <%= render partial: 'nav_js' %> -
                    -``` +See [Pagy Combo Navs](javascript/combo-navs.md) -In `_nav_js.html.erb` partial shared for AJAX and non-AJAX rendering: ++++ `pagy_items_selector_js` -```erb -<%== pagy_bootstrap_nav_js(@pagy) %> -``` +![pagy_items_selector_js](/docs/assets/images/items_selector_js.png) -In `pagy_remote_nav_js.js.erb` javascript template used for AJAX: +* Choose items numbers, per page. +* This helper is only available in one style. -```js -$('#container').html("<%= j(render 'nav_js')%>"); -Pagy.init(document.getElementById('container')); -``` +See: [Items](../extras/items.md) -**IMPORTANT**: The `document.getElementById('container')` argument will re-init the pagy elements just AJAX-rendered in the container div. If you miss it, it will not work. ++++ diff --git a/docs/api/javascript/ajax.md b/docs/api/javascript/ajax.md new file mode 100644 index 000000000..6ec4bb443 --- /dev/null +++ b/docs/api/javascript/ajax.md @@ -0,0 +1,46 @@ +--- +title: AJAX +image: null +order: 1 +--- +# Using AJAX + +If you AJAX-render any of the javascript helpers mentioned above, you should also execute `Pagy.init(container_element);` in the javascript template. Here is an example for an AJAX-rendered `pagy_bootstrap_nav_js`: + + +||| Controller + +```ruby +def pagy_remote_nav_js + # notice the link_extra to enable Ajax + @pagy, @products = pagy(Product.all, link_extra: 'data-remote="true"') +end +``` +||| + +||| `pagy_remote_nav_js.html.erb` - non-AJAX render (first page-load): +```erb +
                    + <%= render partial: 'nav_js' %> +
                    +``` +||| + +||| `_nav_js.html.erb` partial - AJAX and non-AJAX rendering: +```erb +<%== pagy_bootstrap_nav_js(@pagy) %> +``` +||| + +||| `pagy_remote_nav_js.js.erb`template - AJAX rendering: + +```js +$('#container').html("<%= j(render 'nav_js')%>"); +Pagy.init(document.getElementById('container')); +``` +||| + +!!!primary Don't forget to re-initialize! + +The `document.getElementById('container')` argument will re-init the pagy elements just AJAX-rendered in the container div. If you miss it, it will not work. +!!! diff --git a/docs/api/javascript/combo-navs.md b/docs/api/javascript/combo-navs.md new file mode 100644 index 000000000..312a4120c --- /dev/null +++ b/docs/api/javascript/combo-navs.md @@ -0,0 +1,64 @@ +--- +title: Combo Navs +image: null +order: 2 +--- + +# Javascript Combo Navs + +The following `pagy*_combo_nav_js` offer an alternative pagination UI that combines navigation and pagination info in a single compact element: + +- `pagy_combo_nav_js` +- `pagy_bootstrap_combo_nav_js` +- `pagy_bulma_combo_nav_js` +- `pagy_foundation_combo_nav_js` +- `pagy_materialize_combo_nav_js` +- `pagy_semantic_combo_nav_js` + +They are the fastest and lightest `nav` on modern environments, recommended when you care about efficiency and server load (see [Maximizing Performance](/docs/how-to.md#maximize-performance)). + +Here is a screenshot (from the `bootstrap` extra): + +![bootstrap_combo_nav_js](/docs/assets/images/bootstrap_combo_nav_js-g.png) + +## Synopsis + +See [Setup Javascript](setup.md). + +||| pagy.rb (initializer) +```ruby +# you only need one of the following extras +require 'pagy/extras/bootstrap' +require 'pagy/extras/bulma' +require 'pagy/extras/foundation' +require 'pagy/extras/materialize' +require 'pagy/extras/navs' +require 'pagy/extras/semantic' +require 'pagy/extras/uikit' +``` +||| + +||| Any View +```erb + +<%== pagy_combo_nav_js(@pagy, ...) %> +<%== pagy_bootstrap_combo_nav_js(@pagy, ...) %> +<%== pagy_bulma_combo_nav_js(@pagy, ...) %> +<%== pagy_foundation_combo_nav_js(@pagy, ...) %> +<%== pagy_materialize_combo_nav_js(@pagy, ...) %> +<%== pagy_semantic_combo_nav_js(@pagy, ...) %> +``` +||| +## Methods + +==- `pagy*_combo_nav_js(pagy, ...)` + +The method accepts also a couple of optional keyword arguments: + +- `:pagy_id` which adds the `id` HTML attribute to the `nav` tag +- `:link_extra` which add a verbatim string to the `a` tag (e.g. `'data-remote="true"'`) + +!!!warning +The `pagy_semantic_combo_nav_js` assigns a class attribute to its links, so do not add another class attribute with the `:link_extra`. That would be illegal HTML and ignored by most browsers. +!!! +=== diff --git a/docs/api/javascript/index.yml b/docs/api/javascript/index.yml new file mode 100644 index 000000000..50d7a4fa4 --- /dev/null +++ b/docs/api/javascript/index.yml @@ -0,0 +1,2 @@ +--- +order: -10 diff --git a/docs/api/javascript/navs.md b/docs/api/javascript/navs.md new file mode 100644 index 000000000..a82a1751f --- /dev/null +++ b/docs/api/javascript/navs.md @@ -0,0 +1,143 @@ +--- +title: Navs +image: null +order: 3 +--- + +# Javascript Navs + +The following `pagy*_nav_js` helpers: + +- `pagy_nav_js` +- `pagy_bootstrap_nav_js` +- `pagy_bulma_nav_js` +- `pagy_foundation_nav_js` +- `pagy_materialize_nav_js` +- `pagy_semantic_nav_js` + +look like a normal `pagy*_nav` but have a few added features: + +1. Client-side rendering +2. Optional responsiveness +3. Better performance and resource usage (see [Maximizing Performance](/docs/how-to.md#maximize-performance)) + +Here is a screenshot (from the `bootstrap`extra) showing responsiveness at different widths: + +![bootstrap_nav_js](/docs/assets/images/bootstrap_nav_js-g.png) + +## Synopsis + +See [Setup Javascript](setup.md). + +||| pagy.rb (initializer) +```ruby +# Use just one: +require 'pagy/extras/bootstrap' +require 'pagy/extras/bulma' +require 'pagy/extras/foundation' +require 'pagy/extras/materialize' +require 'pagy/extras/navs' +require 'pagy/extras/semantic' +require 'pagy/extras/uikit' +``` +||| + +||| Any View + +```erb + +<%== pagy_nav_js(@pagy) %> +<%== pagy_bootstrap_nav_js(@pagy) %> +<%== pagy_bulma_nav_js(@pagy) %> +<%== pagy_foundation_nav_js(@pagy) %> +<%== pagy_materialize_nav_js(@pagy) %> +<%== pagy_semantic_nav_js(@pagy) %> +``` +||| + +## Variables + +| Variable | Description | Default | +|:---------|:-------------------------------------------------------------------|:--------| +| `:steps` | Hash variable to control multiple pagy `:size` at different widths | `false` | + +=== How to use the :steps variable + +The `:steps` is an optional non-core variable used by the `pagy*_nav_js` navs. If it's `false`, the `pagy*_nav_js` will behave exactly as a static `pagy*_nav` respecting the single `:size` variable, just faster and lighter. If it's defined as a hash, it allows you to control multiple pagy `:size` at different widths. + +You can set the `:steps` as a hash where the keys are integers representing the widths in pixels and the values are the Pagy `:size` variables to be applied for that width. + +As usual, depending on the scope of the customization, you can set the variables globally or for a single pagy instance, or even pass it to the `pagy*_nav_js` helper as an optional keyword argument. + +For example: + +||| pagy.rb (initializer) +```ruby +# globally +Pagy::DEFAULT[:steps] = { 0 => [2,3,3,2], 540 => [3,5,5,3], 720 => [5,7,7,5] } +``` +||| + +||| Controller +```ruby +# or for a single instance +pagy, records = pagy(collection, steps: { 0 => [2,3,3,2], 540 => [3,5,5,3], 720 => [5,7,7,5] } ) + +# or use the :size as any static pagy*_nav +pagy, records = pagy(collection, steps: false ) +``` +||| + +```erb +or pass it to the helper +<%== pagy_nav_js(@pagy, steps: {...}) %> +``` + +The above statement means that from `0` to `540` pixels width, Pagy will use the `[2,3,3,2]` size, from `540` to `720` it will use the `[3,5,5,3]` size and over `720` it will use the `[5,7,7,5]` size. (Read more about the `:size` variable in the [How to control the page links](/docs/how-to.md#control-the-page-links) section). + +!!!primary :steps must contain `0` width +You can set any number of steps with any arbitrary width/size. The only requirement is that the `:steps` hash must contain always the `0` width or a `Pagy::VariableError` exception will be raised. +!!! + +#### Setting the right sizes + +Setting the widths and sizes can create a nice transition between widths or some apparently erratic behavior. + +Here is what you should consider/ensure: + +1. The pagy size changes in discrete `:steps`, defined by the width/size pairs. + +2. The automatic transition from one size to another depends on the width available to the pagy nav. That width is the _internal available width_ of its container (excluding eventual horizontal padding). + +3. You should ensure that - for each step - each pagy `:size` produces a nav that can be contained in its width. + +4. You should ensure that the minimum internal width for the container div be equal (or a bit bigger) to the smaller positive width. (`540` pixels in our previous example). + +5. If the container width snaps to specific widths in discrete steps, you should sync the quantity and widths of the pagy `:steps` to the quantity and internal widths for each discrete step of the container. + +=== + +!!!warning Window Resizing +The `pagy_*nav_js` elements are automatically re-rendered on window resize. However, if the container width changes *without* being triggered by a window resize, you need to explicitly re-render: + +```js +document.getElementById('my-pagy-nav-js').render(); +``` +!!! + +## Methods + +==- `pagy*_nav_js(pagy, ...)` + +The method accepts also a few optional keyword arguments: + +- `:pagy_id` which adds the `id` HTML attribute to the `nav` tag +- `:link_extra` which add a verbatim string to the `a` tag (e.g. `'data-remote="true"'`) +- `:steps` variable + +!!!warning +The `pagy_bootstrap_nav_js` and `pagy_semantic_nav_js` assign a class attribute to their links, so do not add another class attribute with the `:link_extra`. That would be illegal HTML and ignored by most browsers. +!!! + +=== + diff --git a/docs/api/javascript/setup.md b/docs/api/javascript/setup.md new file mode 100644 index 000000000..4349c8ad3 --- /dev/null +++ b/docs/api/javascript/setup.md @@ -0,0 +1,216 @@ +--- +title: Setup +image: null +order: 4 +--- + +# Javascript Setup + +!!!info Notice +A javascript setup is required only for the `pagy*_js` helpers. Just using `'data-remote="true"'` in any other helper works out of the box. +!!! + +!!! success +Add the `oj` gem to your gemfile for faster performance. +!!! + +### How does it work? + +All the `pagy*_js` helpers render their component on the client side. The helper methods render just a minimal HTML tag that contains a `data-pagy` attribute. + +Your app should serve a small javascript file that will take care of converting the data embedded in the `data-pagy` attribute and make it work in the browser. + +!!! info +We don't publish a `npm` package, because it would not support automatic sync with the gem version. +!!! + +### 1. Pick a Javascript File + ++++ `pagy-module.js` + +!!! success +Your app uses modern build tools +!!! + +* ES6 module + +_ESM File: [pagy-module.js](https://github.com/ddnexus/pagy/blob/master/lib/javascripts/pagy-module.js); Types: [pagy-module.d.ts](https://github.com/ddnexus/pagy/blob/master/lib/javascripts/pagy-moduled.ts)_ + ++++ `pagy.js` +!!! success +Your app needs standard script or old browser compatibility +!!! + +* It's an [IIFE](https://developer.mozilla.org/en-US/docs/Glossary/IIFE); +* Minified (~2k). + +_JS File: [pagy.js](https://github.com/ddnexus/pagy/blob/master/lib/javascripts/pagy.js)_ + +
                    + Browser compatibility list: + +- and_chr 103 +- and_ff 101 +- and_qq 10.4 +- and_uc 12.12 +- android 103 +- chrome 103 +- chrome 102 +- chrome 101 +- edge 103 +- edge 102 +- firefox 102 +- firefox 101 +- firefox 91 +- ios_saf 15.5 +- ios_saf 15.4 +- ios_saf 15.2-15.3 +- ios_saf 14.5-14.8 +- ios_saf 14.0-14.4 +- ios_saf 12.2-12.5 +- kaios 2.5 +- op_mini all +- op_mob 64 +- opera 87 +- opera 86 +- opera 85 +- safari 15.5 + +!!! info +You can generate custom targeted `pagy.js` files for the browsers you want to support by changing the [browserslist](https://github.com/browserslist/browserslist) query in `src/package.json`, then compile it with `npm run build -w src`. +!!! + +
                    + ++++ `pagy-dev.js` + +!!! success +You need to debug the javascript helpers +!!! + +!!! warning Debug only! +* Large size +* It contains the source map to debug typescript +* It works only on new browsers +!!! + +_JS File: [pagy-dev.js](https://github.com/ddnexus/pagy/blob/master/lib/javascripts/pagy-dev.js)_ ++++ + +### 2. Load the file + +Depending on your environment you have a few ways of loading the required JS file: + +#### Rails with assets pipeline + +In older versions of Rails, you can configure the assets to look into the installed pagy gem files: + ++++ Sprockets +||| pagy.rb (initializer) +```ruby +Rails.application.config.assets.paths << Pagy.root.join('javascripts') # uncomment. +``` +||| + +||| manifest.js (or `application.js` for old sprocket sprockets): +```js +//= require pagy +``` +||| + ++++ Importmaps +||| pagy.rb (initializer) +```ruby +Rails.application.config.assets.paths << Pagy.root.join('javascripts') #uncomment +``` +||| + +||| app/assets/config/manifest.js +```js +//= link pagy-module.js +``` +||| + +||| config/importmap.rb +```ruby +pin 'pagy-module' +``` +||| + ++++ Propshaft +||| pagy.rb (initializer) +```ruby +Rails.application.config.assets.paths << Pagy.root.join('javascripts') +``` +||| + +||| application.html.erb +```erb +<%= javascript_include_tag "pagy" %> +``` +||| ++++ + +#### Non-Rails apps + +* Just ensure `Pagy.root.join('javascripts', 'pagy.js')` is served with the page. + +### 3. Initialize Pagy + +After the file is loaded, you have to initialize `Pagy`: + ++++ Stimulus JS +||| pagy_initializer_controller.js +```js +import { Controller } from "@hotwired/stimulus" +import Pagy from "pagy-module" // if using sprockets, you can remove above line, but make sure you have the appropriate directive if your manifest.js file. + +export default class extends Controller { + connect() { + Pagy.init(this.element) + } +} +``` +||| + +||| View +```erb +
                    + <%== pagy_nav_js(@pagy) %> +
                    +``` +||| + ++++ Others +```js +// if you choose pagy-module.js +import Pagy from "pagy-module" + +// plain javascript +window.addEventListener(load, Pagy.init) + +// Turbo +window.addEventListener(turbo:load, Pagy.init) + +// Turbolinks +window.addEventListener(turbolinks:load, Pagy.init) + +// custom listener +window.addEventListener(yourEventListener, Pagy.init) +``` ++++ + +#### Caveats + +!!!warning HTML Fallback + +If Javascript is disabled in the client browser, certain helpers will be useless. Consider implementing your own HTML fallback: + +```erb + +``` +!!! + +!!!danger Overriding `*_js` helpers is not recommended +The `pagy*_js` helpers are tightly coupled with the javascript code, so any partial overriding on one side, would be quite fragile and might break in a next release. +!!! diff --git a/docs/api/pagy.md b/docs/api/pagy.md index 3717cf66c..1c30df9e3 100644 --- a/docs/api/pagy.md +++ b/docs/api/pagy.md @@ -1,14 +1,22 @@ --- title: Pagy +categories: +- Core +- Class --- # Pagy -The scope of the `Pagy` class is keeping track of the all integers and variables involved in the pagination. It basically takes a few integers (such as the count of the collection, the page number, the items per page, ...), does some simple arithmetic and creates a very small object that allocates less than 3k of memory. _([source](https://github.com/ddnexus/pagy/blob/master/lib/pagy.rb))_ +The scope of the `Pagy` class is keeping track of the all integers and variables involved in the pagination. It basically takes a few integers (such as the count of the collection, the page number, the items per page, ...), does some simple arithmetic and creates a very small object that allocates less than 3k of memory ([source](https://github.com/ddnexus/pagy/blob/master/lib/pagy.rb)). + +||| Integers of Pagy +:::code source="../../lib/pagy.rb" range="16-25" ::: +||| ## Synopsis +||| pagy.rb (initializer) ```ruby -# set global defaults and extra variables typically in the pagy.rb initializer +# set global defaults and extra variables # they will get merged with every new Pagy instance Pagy::DEFAULT[:items] = 25 Pagy::DEFAULT[:some_var] = 'default value' @@ -33,6 +41,7 @@ pagy.items pagy.series #=> [1, 2, "3", 4, 5, 6, 7, :gap, 40] ``` +||| ## Global Default @@ -40,30 +49,34 @@ The `Pagy::DEFAULT` is a globally available hash used to set defaults variables. You will typically use it in a `pagy.rb` initializer file to pass defaults values. For example: +||| pagy.rb (initializer) ```ruby Pagy::DEFAULT[:items] = 25 Pagy::DEFAULT[:my_option] = 'my option' ... Pagy::DEFAULT.freeze ``` +||| ## Methods -### Pagy.root +==- `Pagy.root` This method returns the `pathname` of the `pagy/lib` root dir. It is useful to get the absolute path of template, locale and javascript files installed with the gem. -### Pagy.new(vars) +==- `Pagy.new(vars)` _Notice_: If you use the `Pagy::Backend` its `pagy` method will instantiate and return the Pagy object for you. The `Pagy.new` method accepts a single hash of variables that will be merged with the `Pagy::DEFAULT` hash and will be used to create the object. -### series(...) +==- `series(...)` This method is the core of the pagination. It returns an array containing the page numbers and the `:gap` items to be rendered with the navigation links (e.g. `[1, :gap, 7, 8, "9", 10, 11, :gap, 36]`). It accepts an optional `size` keyword argument (only useful for extras), defaulted on the `:size` variable. -**Notice**: A `:gap` is added only where the series is missing at least two pages. When the series is missing only one page, the `:gap` is replaced with the page link of the actual missing page. That's because the page link uses the same space of the `...` gap but it is more useful. +!!!primary Gap: added only when necessary +A `:gap` is added only where the series is missing at least two pages. When the series is missing only one page, the `:gap` is replaced with the page link of the actual missing page. That's because the page link uses the same space of the `...` gap but it is more useful. +!!! The nav helpers and the templates basically loop through this array and render the correct item by simply checking its type: @@ -73,15 +86,19 @@ The nav helpers and the templates basically loop through this array and render t That is self-contained, simple and efficient. -**Notice**: This method returns an empty array if the passed `size` (i.e. the `:size` variable by default) is set to an empty array. Useful to totally skip the generation of page links in the frontend. +!!!primary +This method returns an empty array if the passed `size` (i.e. the `:size` variable by default) is set to an empty array. Useful to totally skip the generation of page links in the frontend. +!!! -### label +==- `label` Experimental: Its only function in the `Pagy` class is supporting the API of various frontend methods that require labelling for `Pagy::Calendar` instances. It returns the current page label that will get displayed in the helpers/templates. -### label_for(page) +==- `label_for(page)` Experimental: Its only function in the `Pagy` class is supporting the API of various frontend methods that require labelling for `Pagy::Calendar` instances. It returns the page label that will get displayed in the helpers/templates. +=== + ## Variables @@ -107,16 +124,16 @@ They are all integers: ### Other Variables -| Variable | Description | Default | -|:----------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------| -| `:size` | The size of the page links to show: array of initial pages, before current page, after current page, final pages. _(see also [How to control the page links](/docs/how-to.md#control-the-page-links))_ | `[1,4,4,1]` | -| `:page_param` | The name of the page param name used in the url. _(see [How to customize the page param](/docs/how-to.md#customize-the-page-param))_ | `:page` | -| `:params` | It can be a `Hash` of params to add to the URL, or a `Proc` that can edit/add/delete the request params _(see [How to customize the params](/docs/how-to.md#customize-the-params))_ | `{}` | -| `:fragment` | The arbitrary fragment string (including the "#") to add to the url. _(see [How to customize the params](/docs/how-to.md#customize-the-params))_ | `""` | -| `:link_extra` | The extra attributes string (formatted as a valid HTML attribute/value pairs) added to the page links _(see [How to customize the link attributes](/docs/how-to.md#customize-the-link-attributes))_ | `""` | -| `:i18n_key` | The i18n key to lookup the `item_name` that gets interpolated in a few helper outputs (see [How to customize the item name](/docs/how-to.md#customize-the-item-name)) | `"pagy.item_name"` | -| `:cycle` | Enable cycling/circular/infinite pagination: `true` sets `next` to `1` when the current page is the last page | `false` | -| `:request_path` | Allows overriding the the request path for pagination links. If left blank, helpers will use `request.path`. | `""` | +| Variable | Description | Default | +|:--------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------| +| `:size` | The size of the page links to show: array of initial pages, before current page, after current page, final pages. _(see also [How to control the page links](/docs/how-to.md#control-the-page-links))_ | `[1,4,4,1]` | +| `:page_param` | The name of the page param name used in the url. _(see [How to customize the page param](/docs/how-to.md#customize-the-page-param))_ | `:page` | +| `:params` | It can be a `Hash` of params to add to the URL, or a `Proc` that can edit/add/delete the request params _(see [How to customize the params](/docs/how-to.md#customize-the-params))_ | `{}` | +| `:fragment` | The arbitrary fragment string (including the "#") to add to the url. _(see [How to customize the params](/docs/how-to.md#customize-the-params))_ | `""` | +| `:link_extra` | The extra attributes string (formatted as a valid HTML attribute/value pairs) added to the page links _(see [How to customize the link attributes](/docs/how-to.md#customize-the-link-attributes))_ | `""` | +| `:i18n_key` | The i18n key to lookup the `item_name` that gets interpolated in a few helper outputs (see [How to customize the item name](/docs/how-to.md#customize-the-item-name)) | `"pagy.item_name"` | +| `:cycle` | Enable cycling/circular/infinite pagination: `true` sets `next` to `1` when the current page is the last page | `false` | +| `:request_path` | Allows overriding the request path for pagination links. If left blank, helpers will use `request.path`. NB: Do not pass in a full URL, but the path: For example, given `https://ddnexus.github.io/pagy/docs/api/pagy/` the path to be passed in is: `pagy/docs/api/pagy/`. (See: [Customize the request path](/docs/how-to.md#customize-the-request-path) )| `request.path` | There is no specific validation for non-instance variables. @@ -124,21 +141,21 @@ There is no specific validation for non-instance variables. Pagy exposes all the instance variables needed for the pagination through a few attribute readers. They all return integers (or `nil`), except the `vars` hash: -| Reader | Description | -|:---------------|:-------------------------------------------------------------------------------------------------------------------| -| `count` | The collection `:count` | -| `page` | The current page number | -| `items` | The requested number of items for the page | -| `pages` | The number of total pages in the collection (same as `last` but with cardinal meaning) | -| `in` | The number of the items in the page | -| `last` | The number of the last page in the collection (same as `pages` but with ordinal meaning) | -| `offset` | The number of items skipped from the collection in order to get the start of the current page (`:outset` included) | -| `from` | The collection-position of the first item in the page (`:outset` excluded) | -| `to` | The collection-position of the last item in the page (`:outset` excluded) | -| `prev` | The previous page number or `nil` if there is no previous page | -| `next` | The next page number or `nil` if there is no next page | -| `vars` | The variables hash | -| `params` | The `:params` variable (`Hash` or `Proc`) | +| Reader | Description | +|:---------|:-------------------------------------------------------------------------------------------------------------------| +| `count` | The collection `:count` | +| `page` | The current page number | +| `items` | The requested number of items for the page | +| `pages` | The number of total pages in the collection (same as `last` but with cardinal meaning) | +| `in` | The number of the items in the page | +| `last` | The number of the last page in the collection (same as `pages` but with ordinal meaning) | +| `offset` | The number of items skipped from the collection in order to get the start of the current page (`:outset` included) | +| `from` | The collection-position of the first item in the page (`:outset` excluded) | +| `to` | The collection-position of the last item in the page (`:outset` excluded) | +| `prev` | The previous page number or `nil` if there is no previous page | +| `next` | The next page number or `nil` if there is no next page | +| `vars` | The variables hash | +| `params` | The `:params` variable (`Hash` or `Proc`) | | `request_path` | The request path used for pagination helpers. If blank, helpers will use `request.path` | ### Lowest limit analysis @@ -168,7 +185,7 @@ Which means: ## Exceptions -### Pagy::VariableError +==- `Pagy::VariableError` A subclass of `ArgumentError` that offers a few information for easy exception handling when some of the variable passed to the constructor is not valid. @@ -182,6 +199,7 @@ end Mostly useful if you want to rescue from bad user input (e.g. illegal URL manipulation). -### Pagy::OverflowError +==- `Pagy::OverflowError` -A subclass of `Pagy::VariableError`: it is raised when the `:page` variable exceeds the maximum possible value calculated for the `:count`, i.e. the `:page` variable is in the correct range, but it's not consistent with the current `:count`. That may happen when the `:count` has been reduced after a page link has been generated (e.g. some record has been just removed from the DB). See also the [overflow](../extras/overflow.md) extra. +A subclass of `Pagy::VariableError`: it is raised when the `:page` variable exceeds the maximum possible value calculated for the `:count`, i.e. the `:page` variable is in the correct range, but it's not consistent with the current `:count`. That may happen when the `:count` has been reduced after a page link has been generated (e.g. some record has been just removed from the DB). See also the [overflow](/docs/extras/overflow.md) extra. +=== diff --git a/docs/assets/css/anchor_headings.css b/docs/assets/css/anchor_headings.css deleted file mode 100644 index b08ef25e8..000000000 --- a/docs/assets/css/anchor_headings.css +++ /dev/null @@ -1,44 +0,0 @@ -h1 { - margin-left: -20px; - padding-left: 10px; -} - -h2 { - margin-left: -18px; - padding-left: 10px; -} - -h3 { - margin-left: -16px; - padding-left: 10px; -} - -h4 { - margin-left: -14px; - padding-left: 10px; -} - -h5 { - margin-left: -12px; - padding-left: 10px; -} - -h6 { - margin-left: -10px; - padding-left: 10px; -} - -h1 .octicon, h2 .octicon, h3 .octicon, h4 .octicon, h5 .octicon, h6 .octicon { - visibility: hidden; -} - -h1:hover .octicon, h2:hover .octicon, h3:hover .octicon, h4:hover .octicon, h5:hover .octicon, h6:hover .octicon { - visibility: visible; -} - -.octicon { - fill: currentColor; - padding: 0; - margin-left: -16px; - vertical-align: middle; -} diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss deleted file mode 100644 index 63c180136..000000000 --- a/docs/assets/css/style.scss +++ /dev/null @@ -1,176 +0,0 @@ ---- ---- - -@import "{{ site.theme }}"; - -body { - background-color: #f7f7f7; - color: #51585F; - padding-top: 30px; - padding-bottom: 30px; -} - -a:hover, a:focus { - font-weight: normal; - text-decoration: underline; -} - -code { - font-size: .8rem; - padding: 4px 5px 2px; - background-color: #FFF; - border-radius: 3px; - border: 1px solid #e5e5e5; - box-shadow: 0 0 10px rgba(0,0,0,0.1); -} - -pre { - background-color: #FFF; - box-shadow: 0 0 10px rgba(0,0,0,0.1); - code { - border: none; - padding: 0; - box-shadow: none; - } -} - -.highlight { - border-radius: 5px; - background-color: #FFF; -} - -header { - height: 100%; - h1#site-title { - margin-left: -10px; - margin-bottom: .5rem; - } - p { - margin-bottom: .5rem; - } -} - -h1 span { - float: right; - margin: 0 .05em; -} - -#toc { - height: calc(100% - 200px - 4em); - overflow: auto; - margin: 1.6em 0; - white-space: nowrap; - p { - margin: .1em 0; - } - p.indent1 { - margin-left: 2rem; - } - p#active { - position: relative; - font-weight: bold; - display: inline-block; - &:after { - content: "\25B6"; - position: relative; - left: .4rem; - } - } -} - - a#gitter { - &:hover { - text-decoration: none; - } - p { - border-radius: 3px; - font-weight: bold; - margin-top: .5em; - border: solid 1px #267CB9; - padding: 4px; - text-align: center; - background-color: #FFF; - &:hover { - background-color: #267CB9; - color: #FFF; - } - - } -} - -footer { - bottom: 0; -} - -@media print, screen and (max-width: 960px) { - - header { - padding-right: 0; - } - -} - -.cse .gsc-control-cse, -.gsc-control-cse { - padding: 0 !important; - border: none !important; - //margin-bottom: 1em !important; - //width: 300px !important; - background: #f7f7f7 !important; - color: #51585F !important; - table { - padding: 0 !important; - margin: 0 !important; - } - - td { - border: 0 !important; - padding: 0 !important; - - &.gsib_a { - padding: 0 .5em !important; - } - &.gsc-search-button { - margin: 0 !important; - padding: 0 !important; - - } - } -} - -.gsc-input-box { - border-radius: 3px 0 0 3px !important; -} -.gsc-input-box table{ - height: 28px !important; -} - -table.gsc-search-box td.gsc-input { - padding: 0 !important; -} - -// remove the clear button (x) -div.gsst_b { - display: none !important; -} - -// same fonts of the page -input.gsc-input{ - font-family: 'Noto Sans' !important; - font-size: 1em !important; - font-style: normal !important; - font-weight: 400 !important; - color: #51585F !important; - //width: 100% !important; - -} - -button.gsc-search-button-v2 { - margin: 0 !important; - //margin-bottom: .75px !important; - height: 30px !important; - border-radius: 0 3px 3px 0 !important; - padding: 6px 12px !important; -} - -img + em { font-size: .8rem} diff --git a/docs/assets/images/items_selector_js.png b/docs/assets/images/items_selector_js.png new file mode 100644 index 0000000000000000000000000000000000000000..f860fcb30415f1bf4453f03a963df5c08449055a GIT binary patch literal 9881 zcmchdbyyVNAMXbQ5tNWrx=}i$O9Z5mPU({FZuuhJ4FV$Fp>%_!bT_gzEGb=k&-ZtK z&;9Q{_m6v@JFvs<&N4H5X3pol->>%xQ&N<|#306iAP7@NT0#YakYd4ehbPEj-F{eI z4*ongmXnfz5dZ#sYb{Iw@1Q$KYdb>_)~|mbNJ&gsB;ZXn7a0Xfw5?|ZgtU(K5L5G5ILLI@!qX-S!A7TZ*`@qW|ALarWmgghC0|BWnVHG>sDi9{PE%P^Pw%$m zm1KA@edsr8Ndao+@Tipx+Qfg3Vopd*BqW(*DlUC}+!7MFxEL;1u7`y!>>jtRtmwa` z#0kwtLbgIiK@LQD8u*qn){qM439Z(X|C`sL2$Qw~{7F46u8ilg;l8rQ z->s{GerbeK4yVgAfz+X?#KrLNa8dgpQE55Ec31w_rIy|TdJbh}eouY{f#IR4U-OQn zVG?@?KLJ5OOC2wKPJXJxEq_B4^11px+m@$xHrCdHz8604ULunI6SBa%z zYf(8t3K1vxpEVkYl8Grdw_K7ECrj9${H3cf=Ux*}P)@=7doh@cldJ#7kMT)<2C}ky zw-l{4HG_*5UY?SuangB8{WYAN!^6Y#{EaWuun{c2PVmv7e@|j-G%dKx-R+FkipgwUAtpzr6z^$0Ld1r=_J= zIKD92iGIV*soQS!cYn6B@zKuSo`C;ad}$wwuefS@a@KXxIM@A_gkJMWTq+3(3DUQ0 z?F)u=1diu5>eCcvUY>fDTDmiL)_X59bg$*JJ?Uui zp>T2{)v2AB2sx;uV~*5Xi|mn!Pj~vlLX>Wu_QG5-`0R^}(X@7UL538I?HM;Ld~Pob zi|wRXrR@{)bb%Wz#fp3QeDVw-PsZ@*C>tAF%!tIB?mZ%A`h5iw^y5bz>E|Q@`tC}_ zH1D;wf7Z8;{2mo`I6l6gLL(Z@Ud!??*J|9l8UDn`hKc?#RT!vD4+5 z{zc%>?e)&!mMsz~R!EKvFRA6&+?3i!l^W|&iWNMD{((VOy_VyNO{Vj6Oy@hF;NW1S zx6(>Di^rDQ^Bcund;28)-61ix6sp?lnX##fE(~U?hnYf?@1Z#gkE^M)A8LC~Y+1@5 z5S>IXEiG}wei>I+tcE^Fn>>V{QG0p&T8z@DT0W1PZHTfMHK0_reB8S=w@AWkqTlWp z<-f47aI;u8Z_3C*d&X!N865^b%VW|zGc#k9T(D&>Ma0XQ^uA!Cq@;x1#6to~g-oLCv$Y zoJoXuBq7>hH&t^Vml>v}W{i7d$4X5ZhX>6g>)Mp>$|Z)hRCTSbj1&qcFfb^Lk|!8G z45+0?WH7WLR#sL1 z^{Wv}Mu~L0U!*xBOwG0(>i@Dml|{c*)P47^@(^1H1=1(COC29@EDH^Na!A9<+U6M~ z3N6XX`*@GH`Jh6626bwRiiAI&#V3Aj_M#hoAnW4?&m)`s60Q+4q>$l2=%qwuAcA|JU5kixVT=<%gJ#o)xJy+O30U!tD}`hJ$*$i?}ObndNzj3l9r|JVb{pz zPeZTR7`AuU9z&o;Hzo+$vOI3{hj8%mr^aV)qzwlLgGRF+ymyq67MhxVY_lg<+USX@LS6&(pvEu6Qxs2e7E`AlJHXLHTY-a;4DKTu{;H;)qj-FDabgN0?t zk(WB|lkni)I%Y;@g07NQQPH<5uT7`B=)l&@gNEu0d3q*VIAaVV(o&>=-rh-Osa>?p zpn1?DoHy{TbfdTZZM2?#Lcz|97q=r>my|4I`TsnD0tiZH%CycEmuDxse6A;Y?3tdj zlow-9=(qR`m~vKIb3;P@56HKP-D?{gTewe9ZaM0N1fLTT*;`w8v%Guvj-1@iVkE2m zCEohx8WvPuZp%@9q7w9&e=g>ladp#g?@`&a%e`sAS`s7NFbQe`5k?r#;O_y)ZCMm# zF-gh%x(d6*B)a;=DkE{EZxt0--g0C)jI^})&t0S5h}ePze1{_1|~*`Od+!`th!tHwrm(IjbFED8~LPejVn#aed=Qb(?oq?YCB zL(m&26()S*Ov3Zmh|q1|IS$UBy5<=7)|X@vrTnu!mhcWQB_$+odz>E5~rCohcebfQ1&&^3_|E=Y2Qd_&wC~2pTA-f5fOn;CKQg6^Lbp| zGkV|dNAt2R7;vRAd-C&V-3po> zxj-Y2j*3{V7ai+ekkwPbM4w^9ycA$2$F*lTSorZlS=liGp(8A;XZiXy5)u+mM)~{M zF9=PQYIGu22a1q)^cgQm^7AbcMLcE6a=hsHo?MV(tepc_dy5+<)SyA=UMBPV9R#VPJ)r^edLl!-Z;*Y!N zejiKHW)p~Fg-kw$sHv%M-HzasVhXk>4^7#^(+m^~7rsA^XLYp;WOGRQT{=8lEF5J9 z%KurEuEL?%Scv)r%~jj}h&nH-|B-r%ad;~NgBf>qhWMz^2J-8Fsm6Y7v`zodh zy=D=n;d?XGGf>@-XPOuI@I-xZ7DG!$<~ei~cDLTU;6IrhmymFt20P&D$>?5NYE5Z! z={W)e=k6{?);oIt8NV}^+Ui|hUGG~;nSsC_Hda=8M#h_)bL&Tsgj;B5Q!*M-Q?+z; zbyZa-w-sxuTpw>9vBVb@m7ze5*c4}_KvDm!ec3}thlz>VzLgdlet7@AxENg%>Fds% zR#s`ql8iDn(|Bc3&EE!cSA#q{8{ypp(B|`Y5GRH49y|KCiU#Rj{-oo z9cE!!wWNLiB)5zi-ZyuCagm%Xave*OF?=}rV84q8QN~H*!eEc0vtweg7uoq};p%q`bo7(Kk`gTXgvE-S3Q!Ig=jIwXrg#vNQsDOKi{;C&rI-U;1AXf z0APRU3(0G|!SyH(;3<9;T3%e--`W%SlRZ8kMNUTka&re(P*_SsOPeQCsPH!p8S-{J zC@L>)PH>uC8tfe#dn+qjlAnJ*p8I{FNkDWp&A?Bv20s5|+WJ2KG3LaKdH-O4U0toY zsfdlGrK=lhUu#}K$l>APpRuYxW9*>jJTJjVLJBM?*|QkUHsK~l)RsDq2KH3;7{XT? zeKQdSjZX=crHYJ$votq1gJZ(yY%YdgPO|grksS<^%-GMjne06?cr2bE~$Ed zqT;ZnjCcPr+(xR8fp)~;=dZ3Md9b8PEVPVMKv;Lxi;EUF#atHl49nwFd7A3#W@g(s zPyWeVtUn#<6!lNOse63!v&;q@8Z)CVT1h=AA;H$(-e2dUth_ubCdU3?Z?)a{973P* zk9}T}*k2Xfdi%)v?+ASD&m$hwf4q*-XqY3ZpG=sgC0wU*sppdkbYUh~@ZR?WjX+;TZO;}a8~U^U^8 z;u5;vo4YBJNA$!eCFLmf`~C29c5}Kr<>BDs&~EZD@_KJBBV%c0a`R0re$UD(fkDB= zjrcOIJef^TXrhDiHGgB#&PhU{S$TOm%-9&HS?C};H{PyDyDSqO7KKNIM`CLt>>r)o*0vHrk}zP398h(f z5$uPH3mc!M0eWrqg8~=@`+ZV-`uYmLQQF&E2u@p^_GvcV*RSm(Mp1DdOqX;ww_k^Q7&HZWXrDV0LLI?0&{r3LR@T^-*YTv*q*^pr$K4y7;XKw34Q zki5d5+R-4 zzwENfIm*b$Su+LY@SCK^6gHDs#eVo~1uzDz5NWy!=LrffGawpoKL`JpaQuIK?WaFx z;P;@&o>rEZhgPYt&Y6}eD%sK1^^TD-$ks+aI9R6W7Dx2S4x6Yy!}r{TFIegYlTtWO zMElB;yVvjuggvioy2i&JyHX(M|IbhpKvd3d*_O^2ZM+?TYg9Ltpuw&(6*^HaAgGP{2C# z>sPy_hVepYE31-(goK|ze-;%L<>ah2I&VLA8$-jc`TUuBa-yc4_H<-KF`RgLq!T?; z5+Eku$>n8X>yeh)2a-uHPC77Po}DM6Vf$Ucudkn`Xq0OsxZFC%bEQ6H32E!-FoF_S zTs%KHiAP3u0E5-I9q5pc0{_6oRJybCiJP1I>C=d=uC6pLiwdo3W60_pKFHh|nhj@NyM9WPpnCY4@fE4)MPVJ`Bd(fx_*vx8PU>8C^&>(y zeNr5pZ@IbMeSIOr6m0q}eAY8%!rm7i-roCrd&YJO3JP2nBO4BUYinzu21CbZyQ*?> zzdJhK5)l!RWIQ~0JyvBxLh@r`S}!Z>s;NnV42{2w#^!X7wj13qhy~G(Yyb0>tE??7 zsu>ls*0_%@C4g|kB)C))0&I2tda)cF9LA=nd!~TcMCm%)o#c>d^1bCbblaOMPEIDY zx3`DWKuYTBm`{Ko@V&k8tE5|AZ|hf zJtHrhLg1f{WlNRYl1*{Dmf7@@-u!))F}!tBTwK1~V3v^|mDyAf9aw$+_4?@#XQxIc zZsKQpOc@+Y8AEC9vESck^LaAXk54blsq6hHF5dm!UhwT3<%7YqvXae%dqs6S*e~E2 z0Jx~m&0SBpEh{eWo|cuB#f4B%Q5}X$ii>ZTC_SyT00T;|H{^gmHsDJr=b9h@BSO2Z ztf*M2u??v$4|*)FIXd=h*51zRJ^dvXO>PB%G2RG1C1vGCmuuNaCeB|D`-{1JBFKqM zoJUnHMxtNt%TG@HsCoJKvY1QgWNMZdzSL?zq-F6XIuLNI+RW|=f>I}^zapmu$24so zCr)een~&d{yV&}Uh9%(HGqfJvX`iqeG%oZHsi^C5(et#8im#i^L`O#lWHt{=Ma>xQ zEb#MX3OFZQgc1s~uC!iaYr3<6^RRhgztmFOR8TOQxa15oZK`VvjGG5S*Pz9tQS=x` zG789u%*ChyQ!-J<3C|WZ@xFi@lRt;tule4(=ofy%q*dBq^Q!K5}QI~#!uc%-SwTZ%0y>O|7k2fzP3*@5+xv zc5@?CP#9KG32I}vv0#v*63ZbO=UC8r24GdH@&`>c@3<5LcITO|Tgim#7-m1CT*bw^ zTc^-oUmgNOzWlp8bNgmZ#0VE+f3sUT_*<1C?^+&lV6OISaX!hGL#`DZEXTP5-BR|K9eh)%}s(s{e)jVJ>_N0dwYA6 z6I|w_x((KSb%2UFWRHfg4qF>*YVu|lP%$vwB8r_?LFJOqT+_XPrv*2@%ouL;K6)5g zz6HpSVy+(TlHU(z>SFViILYc;96k$}EoqCzmSyW!$Ev&c9 z5L^5+Ak%x!hQ}Ou-ESooGP5(KpsX+lhCI-!TIOhWpWMe5zwwqL;!JWo@?$iYmu>;1 zh{qoDN@*i7uu$~0RWVb*%-Y)8(vsh1jvd0m!Qpd+p*&d1$vsW}ye04H#XZhQWd~}wKtRR^Oz@N3}$_>@uj^kFO@i4#G zsk?HUhlRF$IbSHL-EVGc^78iPCmk7_-tSjSzvr`%vu^g6%Qno~eVGOTaa)e1yF0IW zqsJ~M;AIVFB$tjP8R^FgHz=a8npMrU=BDhM0NKg!mb>bpzES#x6Z@{kn^g)5u&>|h z^>RrZkm(T<6SJF`nI#3+vZTpIL`C!os{&|6vkQFk?(RH=2LNp4TD6aPH8eCV*sombv`tnjC=Ndg#mg&hWc++O3GqJ=YyM9x%lt{o4%-83r=k+ zBTbHo>NqMWudqE0QCMgJbxcS;MWSR8e#BLfZ-E>TR=w8IrfF$uX>1HzZgvOdgNl~c z`$Ld z(@ylBTVG$Vnv$3o(A!n8G7~bLS^a`wM1+J`b9IsuS})jS{qA{#hSOPezT23p#GUYeQax!bH_K){c^qPx4fl0R`HIf@4yH#sZLKuPK2slAxd z8o=c+Jlq%xVR>3y#}EAc+F$51y>)G_W@cK8XARRb!6ks7bvRNSd2tEw(EO#k&@lL* zsieftvW{3tjH6;?+%vQpzsI+I3212V?bbxq41!Jn%YmqTG|VewfMj_82kkxd7#0Z z2$P>PSAtmleXBDgHTCDhQF~77KF8A8o9&G)M?TVz@TTTwP|alJvVYdq8WFG}$BhB- zJU2&6LxTxv&(A~bBb`~^n(^_tTU!P7xGO77joCL4&n`;e-p}>Mp8upJtCdS81ugye;I7uzv(&8#aMpi6044Bq&Ty-{@R|UV2W(p4$=m; z0}TgZNSFUmKV(QJnYAAama;N=Jw0DJ>(Z%jVvxh-%01}x>zdkGD}5+WNlIm9TOR4l zDDU1!|4)LKH~N_vx6D2|GV-j3E+RcWo$Vt=czaSmi`Ko5A^9rW-uESQ6PoU!5N*rd zmv1nml9M&?fQn-0;b|d$o|c)=ZCuSq8XXolK6|60S|E>(fzjl+{+M117Z*1^KAwez z1ynGhQyqPMEJ$l}f8E8^m6y8~kU|HdWyj{k#Jq3cI(YYJm~}4=>b@Rd zX^avos;ul|5fBh~{rdI%{QT1AX^=Ils8GLp1vLN3fG-a>Hv|0&5k7uZZEZ&~x1m*1 zsz+sUanH=mM=`NOlJn^J_=$BGt|xz^qsc-0F8enXDUgH_j%5EfuKvu5h6Z0)Z+HC7 zfLdBp6YdVFsToiIv?uciQpet&?UL?CX=!O&Tc8BBjI1>Dw(DS#OnwWl4YYV_Z!6UY zMPPe1KdPu`t8@EY38qw(?3K6+zWWdOTWz9gBNNpgzrR;kdw~$~M21dJv)u=cxEKBl z#soFqb90i0>7JdtfSYlGlN0>@`t|G0?i*&ujzKL0tq!m3)YKP1cKhnGyE!=_2mJYC zXjflVRh5;M1zd{B^?0AMQY=k^xRk;dMmqdW}5ZbS*((#sG60~m9(Oo<&EO69i9vX%y4>h_N7E#b= zW{qy-+q~dVr_MCAR4-AD&LZcPevj|9Y^ow z>68sE=;#m-B)K2u8>5!-a0r^q)ol{fLY*~7`z{hfV1FGfsF;K@@u`2uTu^dJS$MrxUqNj@)goZ$^ZO(@kHfO}f zj!hp+`wVks46ig=u#JWrW4gL}3oiEd_7b#LZn3r+MKHi%_5flqO)f3@93RJleHJ}? z$!QwOnKA5l0;AI)b*-Y{>YQA6cK7%bv%DfQ`5}|vTW~kJfW8$7I3~f6x0LXuwxq&; zERAhalQNg*=fgIG?5%Wrzi84>b8HfK%ovaKFH-`B_SK$Bz>{+QL zQHg`l(M$1bnQRVDC<+mSlrxv=^XG91eK9v9S>B*OgFMlzN#Gr=ik_aHpV%5m&p%}H zeOcbU#XY1gWY({HXV#A+pdbzgs)9OzJAVL`G9A9T#2bD4YrqkHkSADo5q)#h1lkjO zVglq_Gs7guJt(WJehLCn+1dU-@A<$Hu?jB_TW>23+R2ah;D!kE;i}fma>n5J6azyO z-Wd=IS!izGPrccDG9CB$=1M`Hd3LeN@1S>Bmq8)T+}w(qh9)y1V|Hl?z6bL;xWPQk z`15~2q*sn{hQ4HqhBO@bab#bxueSUgInz4oX(0Tu)1wuw%R<_YS2K#DbV{=GB0e*1Mzy>|)wFs}z z%aiEsE*mO?1Jws2DP59%?Y8zc%VjC0mz=ahXM-!gXopKOMm1VG&xTR|ZY|6&9KZTq zA8PRS?Vqm3$=eHx$o8bMu{k~vczKT_udWuf57(fgidTFTayWJXEp+vd1ghtCv1&^S zvp%22%DWZ9R3RBf#f!>ye+yF){O5!`JUlu-oO;IB8K8h$i)TPybczvu7Vr9Au{ty| zU{b9GIzK+fy#0**h+?#88}c{NyqioukK>^lv$oX(2ZQ~z!&QFxk-X{DIS4923Rmy7 z8Ghsg#Dx`C>3EaC!di}I+c*^;>4+A?Y@yjGdBO7SsX=58F(6S_R%&W$ZtQ7Sx;z=J zqQ}R8vuY%7Azs!ZpJ_Vdgd!f#+Aj$?!5iAzvf|^7K|o`)mJ0$o5T6W_+#%!)@Bq#_ zG3c0@+8AH&^YlaoD#?aNN?F+`eKhgf`5u4uwiOMR`4=|YO~U8&7AXCHB@{Y%I|@B}77q0f8>uc}hY{s6y;TXWz8_e0SU*yP8rruLYK zK=?ZBO~ij7owD-F$Q!Ja^#H <%== pagy_bootstrap_nav_js(@pagy, ...) %> <%== pagy_bootstrap_combo_nav_js(@pagy, ...) %> ``` +||| -or with a template: - +||| View (template) ```erb <%== render partial: 'pagy/bootstrap_nav', locals: {pagy: @pagy} %> ``` +||| -See [Javascript](../api/javascript.md) if you use `pagy_bootstrap_nav_js` or `pagy_bootstrap_combo_nav_js`. +See: [Javascript](/docs/api/javascript.md) if you use `pagy_bootstrap_nav_js` or `pagy_bootstrap_combo_nav_js`. ## Files @@ -41,22 +42,30 @@ See [Javascript](../api/javascript.md) if you use `pagy_bootstrap_nav_js` or `pa ## Methods -This extra adds 3 nav helpers to the `Pagy::Frontend` module. You can customize them by direct overriding in your own view helper. +This extra adds 3 nav helpers to the `Pagy::Frontend` module. -### pagy_bootstrap_nav(pagy, ...) +!!!info Overriding Helpers +You can customize them by overriding in your own view helper(s). +!!! + +==- `pagy_bootstrap_nav(pagy, ...)` This method is the same as the `pagy_nav`, but customized for Bootstrap. -See the [pagy_nav(pagy, ...)](../api/frontend.md#pagy_navpagy-) documentation. +See: [pagy_nav(pagy, ...)](/docs/api/frontend.md#pagy-nav-pagy). + +The `bootstrap_nav.*` templates produce the same output, and can be used as an easier (but slower) starting point to override it. See [How to use templates](/docs/how-to.md#use-templates). + +=== `pagy_bootstrap_nav_js(pagy, ...)` -The `bootstrap_nav.*` templates produce the same output, and can be used as an easier (but slower) starting point to override it. See [How to use templates](../how-to.md#use-templates). +![bootstrap_combo_nav_js](/docs/assets/images/bootstrap_nav_js-g.png) -### pagy_bootstrap_nav_js(pagy, ...) +See: [Javascript Navs](/docs/api/javascript/navs.md). -See the [Javascript Navs](../api/javascript.md#javascript-navs) documentation. +=== `pagy_bootstrap_combo_nav_js(pagy, ...)` -### pagy_bootstrap_combo_nav_js(pagy, ...) +![bootstrap_combo_nav_js](/docs/assets/images/bootstrap_combo_nav_js-g.png) -![bootstrap_combo_nav_js](../assets/images/bootstrap_combo_nav_js-g.png) +See: [Javascript Combo Navs](/docs/api/javascript/combo-navs.md). -See the [Javascript Combo Navs](../api/javascript.md#javascript-combo-navs) documentation. +=== diff --git a/docs/extras/bulma.md b/docs/extras/bulma.md index 03a54e173..dfa48ef8c 100644 --- a/docs/extras/bulma.md +++ b/docs/extras/bulma.md @@ -1,36 +1,37 @@ --- title: Bulma +categories: +- Frontend +- Extras +image: none --- # Bulma Extra -This extra adds nav helper and templates for the Bulma CSS [pagination component](https://bulma.io/documentation/components/pagination). +This extra adds nav helpers and templates for the Bulma CSS [pagination component](https://bulma.io/documentation/components/pagination). ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/bulma' ``` +||| -Render the navigation links in some view... -with a fast helper: - +||| View (helpers) ```erb <%== pagy_bulma_nav(@pagy, ...) %> <%== pagy_bulma_nav_js(@pagy, ...) %> <%== pagy_bulma_combo_nav_js(@pagy, ...) %> ``` +||| -or with a template: - +||| View (template) ```erb <%== render partial: 'pagy/bulma_nav', locals: {pagy: @pagy} %> ``` +||| -See [Javascript](../api/javascript.md) if you use `pagy_bulma_nav_js` or `pagy_bulma_combo_nav_js`. +See [Javascript](/docs/api/javascript.md) if you use `pagy_bulma_nav_js` or `pagy_bulma_combo_nav_js`. ## Files @@ -41,22 +42,28 @@ See [Javascript](../api/javascript.md) if you use `pagy_bulma_nav_js` or `pagy_b ## Methods -This extra adds 3 nav helpers to the `Pagy::Frontend` module. You can customize them by direct overriding in your own view helper. +This extra adds 3 nav helpers to the `Pagy::Frontend` module. + +!!!info Overriding Helpers +You can customize them by overriding in your own view helper(s). +!!! -### pagy_bulma_nav(pagy) +==- `pagy_bulma_nav(pagy)` This method is the same as the `pagy_nav`, but customized for Bulma. -See the [pagy_nav(pagy, ...)](../api/frontend.md#pagy_navpagy-) documentation. +See the [pagy_nav(pagy, ...)](/docs/api/frontend.md#pagy-nav-pagy) documentation. + +The `bulma_nav.*` templates produce the same output, and can be used as an easier (but slower) starting point to override it. See [How to use templates](/docs/how-to.md#use-templates). -The `bulma_nav.*` templates produce the same output, and can be used as an easier (but slower) starting point to override it. See [How to use templates](../how-to.md#use-templates). +==- `pagy_bulma_nav_js(pagy, ...)` -### pagy_bulma_nav_js(pagy, ...) +See the [Javascript Navs](/docs/api/javascript/navs.md) documentation. -See the [Javascript Navs](../api/javascript.md#javascript-navs) documentation. +=== `pagy_bulma_combo_nav_js(pagy, ...)` -### pagy_bulma_combo_nav_js(pagy, ...) +![bulma_combo_nav_js](/docs/assets/images/bulma_combo_nav_js-g.png) -![bulma_combo_nav_js](../assets/images/bulma_combo_nav_js-g.png) +See the [Javascript Combo Navs](/docs/api/javascript/combo-navs.md) documentation. -See the [Javascript Combo Navs](../api/javascript.md#javascript-combo-navs) documentation. +=== diff --git a/docs/extras/calendar.md b/docs/extras/calendar.md index 20224c613..45ef84534 100644 --- a/docs/extras/calendar.md +++ b/docs/extras/calendar.md @@ -1,13 +1,16 @@ --- title: Calendar +categories: +- Backend +- Extras +image: none --- # Calendar Extra - -Add pagination filtering by calendar time unit: year, quarter, month, week, day (and your own [custom time units](../api/calendar.md#custom-units)). +Add pagination filtering by calendar time unit: year, quarter, month, week, day (and your own [custom time units](/docs/api/calendar.md#custom-units)). This extra adds single or multiple chained calendar navs that act as calendar filters on the collection records, placing each record in its time unit. -![calendar_app](../assets/images/calendar-app.png) +![calendar_app](/docs/assets/images/calendar-app.png) _Screenshot from the single-file self-contained [pagy_calendar_app.ru](https://github.com/ddnexus/pagy/blob/master/apps/pagy_calendar_app.ru) demo_ ## Use cases @@ -18,36 +21,34 @@ On the other hand it does not make much sense for the result of a search that hi ## Synopsis -See [extras](../extras.md) for general usage info. - -Require and configure it in the `pagy.rb` initializer: - +||| initializer (pagy.rb) ```ruby require 'pagy/extras/calendar' -# Optional: customize the default ``` +||| -Implement and use it in your controllers: - +||| controller ```ruby -# Define the pagy_calendar_period method in your application +# e.g. application_controller.rb def pagy_calendar_period(collection) return_period_array_using(collection) end -# Define the pagy_calendar_filter method in your application +# e.g. application_controller.rb def pagy_calendar_filter(collection, from, to) return_filtered_collection_using(collection, from, to) end -# Use it in your actions: -@calendar, @pagy, @records = pagy_calendar(collection, year: { size: [1, 1, 1, 1], ... }, +# some action: +def index + @calendar, @pagy, @records = pagy_calendar(collection, year: { size: [1, 1, 1, 1], ... }, month: { size: [0, 12, 12, 0], ... }, pagy: { items: 10, ...}) +end ``` +||| -Use the calendar and pagy objects in your views: - +||| view (template) ```erb <%== pagy_nav(@calendar[:year]) %> @@ -61,10 +62,13 @@ Use the calendar and pagy objects in your views: <%== pagy_nav(@pagy) %> ``` +||| -See also a few examples about [How to wrap existing pagination with pagy_calendar](../how-to.md#wrap-existing-pagination-with-pagy_calendar). +See also a few examples about [How to wrap existing pagination with pagy_calendar](/docs/how-to.md#wrap-existing-pagination-with-pagy_calendar). -**Notice** For a complete and detailed example, see the [pagy_calendar_app.ru](https://github.com/ddnexus/pagy/blob/master/apps/pagy_calendar_app.ru). +!!!primary Demo App +For a complete and detailed example, see the [pagy_calendar_app.ru](https://github.com/ddnexus/pagy/blob/master/apps/pagy_calendar_app.ru). +!!! ## Usage @@ -72,24 +76,26 @@ Since the time can be stored or calculated in many different ways in different c The whole usage boils down to these steps: -1. Define the [pagy_calendar_period](#pagy_calendar_periodcollection) method in your controller -2. Define the [pagy_calendar_filter](#pagy_calendar_filtercollection-from-to) method in your controller -3. Configure the [pagy_calendar](#pagy_calendarcollection-configuration) method in your action +1. Configure the [pagy_calendar](#pagy-calendar-collection-configuration) method in your action +2. Define the [pagy_calendar_period](#pagy-calendar-period-collection) method in your controller +3. Define the [pagy_calendar_filter](#pagy-calendar-filter-collection-from-to) method in your controller 4. Use it in your UI You can play with a quick demo app, working without any additional configuration with: +||| shell ```shell git clone --depth 1 https://github.com/ddnexus/pagy cd pagy rackup -o 0.0.0.0 -p 8080 apps/pagy_calendar_app.ru ``` +||| -Then point your browser to `http://0.0.0.0:8080`. +Then point your browser to http://0.0.0.0:8080. ## Variables and Accessors -See [Pagy::Calendar](../api/calendar.md#variables) +See [Pagy::Calendar](/docs/api/calendar.md#variables) ## Files @@ -99,7 +105,7 @@ See [Pagy::Calendar](../api/calendar.md#variables) All the methods in this module are prefixed with the `"pagy_calendar"` string in order to avoid any possible conflict with your own methods when you include the module in your controller. They are also all private, so they will not be available as actions. -### pagy_calendar(collection, configuration) +==- `pagy_calendar(collection, configuration)` This method wraps one or more levels of calendar filtering on top of another backend pagination method (e.g. `pagy`, `pagy_arel`, `pagy_array`, `pagy_searchkick`, `pagy_elasticsearch_rails`, `pagy_meilisearch`, ...). @@ -107,9 +113,11 @@ It filters the `collection` by the selected time units in the `configuration` (e It returns an array with one more item than the usual two: +||| controller ```ruby @calendar, @pagy, @results = pagy_calendar(...) ``` +||| The `@calendar` contains the hash of the generated `Pagy::Calendar::*` objects that can be used in the UI. @@ -129,7 +137,9 @@ The calendar configuration determines the calendar objects generated. These are You can add one or more levels with keys like `:year`, `:quarter`, `:month`, `:week`, `:day`. Each key must be set to the hash of the variables that will be used to initialize the relative `Pagy::Calendar::*` object. Use an empty hash for default values. E.g.: `year: {}, month: {}, ...`. -**Restrictions**: The `:page`, `:page_param`, `:params` and `:period` variables for the calendar objects are managed automatically by the extra. Setting them explicitly has no effect. (See also [Calendar params](#calendar-params) for solutions in case of conflicts) +!!!warning Do not set `:page`, `:page_param`, `:params` and `:period` keys +The `:page`, `:page_param`, `:params` and `:period` variables for the calendar objects are managed automatically by the extra. Setting them explicitly has no effect. (See also [Calendar params](#calendar-params) for solutions in case of conflicts) +!!! #### Pagy configuration @@ -153,11 +163,13 @@ The calendar is active by default, however you can add an optional `:active` boo Take a look at the [pagy_calendar_app.ru](https://github.com/ddnexus/pagy/blob/master/apps/pagy_calendar_app.ru) for a simple example of a manual toggle in the UI. -### pagy_calendar_period(collection) +==- `pagy_calendar_period(collection)` -**This method must be implemented by the application.** +!!!primary Must implement +This method must be implemented by the application. +!!! -It receives a `collection` argument that must not be changed by the method, but can be used to return the starting and ending local `TimeWithZone` objects array defining the calendar `:period`. See the [Pagy::Calendar Variables](../api/calendar.md#variables) for details. +It receives a `collection` argument that must not be changed by the method, but can be used to return the starting and ending local `TimeWithZone` objects array defining the calendar `:period`. See the [Pagy::Calendar Variables](/docs/api/calendar.md#variables) for details. Depending on the type of storage, the `collection` argument can contain a different kind of object: @@ -165,6 +177,7 @@ Depending on the type of storage, the `collection` argument can contain a differ If you use `ActiveRecord` the `collection` is going to be an `ActiveRecord::Relation` object. You can use it to return the starting and ending local `TimeWithZone` objects array. Here are a few examples with the `created_at` field (but you can pull the time from anywhere): +||| controller ```ruby # Simpler version (2 queries) def pagy_calendar_period(collection) @@ -187,8 +200,9 @@ def pagy_calendar_period(collection) params.fetch_values(:starting, :ending).map { |time| Time.parse(time).in_time_zone } end ``` +||| -See also [Time conversion](../api/calendar.md#time-conversions) for details. +See also [Time conversion](/docs/api/calendar.md#time-conversions) for details. #### Search frameworks storage @@ -196,9 +210,11 @@ _If you use `ElasticSearchRails`, `Searchkick`, `Meilisearch` the `collection` a So you should use what you need from the `collection` array and do your own `Model.search(...)` in order to get the starting and ending local `TimeWithZone` objects array to return. -### pagy_calendar_filter(collection, from, to) +==- `pagy_calendar_filter(collection, from, to)` -**This method must be implemented by the application.** +!!!primary Must implement +This method must be implemented by the application. +!!! It receives the main `collection` and must return a filtered version of it using the `from` and `to` **local Time** objects. @@ -210,19 +226,22 @@ Depending on the type of storage, the `collection` argument can contain a differ If you use `ActiveRecord` the `collection` is going to be an `ActiveRecord::Relation` object that you can easily filter. Here is an example with the `created_at` field again (but you can use anything, of course): +||| controller ```ruby def pagy_calendar_filter(collection, from, to) collection.where(created_at: from...to) # 3-dots range excluding the end value end ``` +||| -See also [Time conversion](../api/calendar.md#time-conversions) for details. +See also [Time conversion](/docs/api/calendar.md#time-conversions) for details. #### Search frameworks storage _If you use `ElasticSearchRails`, `Searchkick`, `Meilisearch` the `collection` argument is just the Array of the captured search arguments that you passed to the `Model.pagy_search` method. That array is what pagy uses internally to setup its variables before passing it to the standard `Model.search` method to do the actual search._ So in order to filter the actual search with the `from` and `to` local `TimeWithZone` objects, you should simply return the same array with the filtering added to its relevant item. Pagy will use it to do the actual (filtered) search. +=== ## Customization @@ -249,19 +268,20 @@ You can use the calendar objects with any `pagy_*nav` and `pagy_*nav_js` helpers The `pagy_*combo_nav_js` keeps into account only page numbers and not labels, so it is not very useful (if at all) with `Pagy::Calendar::*` objects. -### pagy_calendar_url_at(@calendar, time) +==- `pagy_calendar_url_at(@calendar, time)` This helper takes the `@calendar` and a `TimeWithZone` objects and returns the url complete with all the params for the pages in each bars that include the passed time. For example: `pagy_calendar_url_at(@calendar, Time.zone.now)` will select the the bars pointing to today. You can see a working example in the [pagy_calendar_app.ru](https://github.com/ddnexus/pagy/blob/master/apps/pagy_calendar_app.ru) file. If `time` is outside the pagination range it raises a `Pagy::Calendar::OutOfRangeError`. +=== ### Label format -Each page link in the calendar navs is conveniently labeled with the specific `Time` period it refers to. You can change the time format to your needs by setting the `:format` variable to a standard `strftime` format. (See the [Pagy::Calendar variables](../api/calendar.md#variables)) +Each page link in the calendar navs is conveniently labeled with the specific `Time` period it refers to. You can change the time format to your needs by setting the `:format` variable to a standard `strftime` format. (See the [Pagy::Calendar variables](/docs/api/calendar.md#variables)) -You can also get the [current page label](../api/calendar.md#labelopts--) with e.g.: `@calendar[:month].label`, which might be useful to use in your UI. +You can also get the [label method](/docs/api/calendar.md#methods) with e.g.: `@calendar[:month].label`, which might be useful to use in your UI. ### I18n localization @@ -270,8 +290,10 @@ Pagy implements its own faster version of the i18n `translate` method (i.e. `pag You have a couple of options: - Use the [i18n extra](i18n.md), which delegates the translation and localization to the `I18n` gem. Notice however that you would lose the performance gain offered by the built-in `pagy_t` translation. -- Uncomment the block in the calendar section in the [pagy.rb](https://github.com/ddnexus/pagy/blob/master/lib/config/pagy.rb) initializer, which will add the localization from the `I18n` gem without using the [i18n extra](../extras/i18n.md), so preserving the builtin `pagy_t` translation. +- Uncomment the block in the calendar section in the [pagy.rb](https://github.com/ddnexus/pagy/blob/master/lib/config/pagy.rb) initializer, which will add the localization from the `I18n` gem without using the [i18n extra](/docs/extras/i18n.md), so preserving the builtin `pagy_t` translation. ## Caveats -- Calendar pages with no records are accessible but empty: you may want to display some message when `@records.empty?`. +!!!warning Display Message when empty +Calendar pages with no records are accessible but empty: you may want to display some message when `@records.empty?`. +!!! diff --git a/docs/extras/countless.md b/docs/extras/countless.md index ebd0ec30c..1e49b404d 100644 --- a/docs/extras/countless.md +++ b/docs/extras/countless.md @@ -1,57 +1,84 @@ --- title: Countless +categories: +- Backend +- Extras --- -# Countless Extra - -This extra uses the `Pagy::Countless` subclass in order to save one count query per request. It is especially useful when used with large DB tables, where [Caching the count](../how-to.md#cache-the-count) may not be an option, or when there is no need to have a classic UI. Please read also the [Pagy::Countless doc](../api/countless.md) for a fuller understanding of its features and limitations. -## Synopsis +# Countless Extra -See [extras](../extras.md) for general usage info. +Save one count query per request using the [Pagy::Countless subclass](/docs/api/countless.md) internally. -In the `pagy.rb` initializer: +## Setup +||| pagy.rb (initializer) ```ruby require 'pagy/extras/countless' -# optionally enable the minimal mode by default -# Pagy::DEFAULT[:countless_minimal] = true ``` +||| + + +## Modes + +This extra can be used in two different modes by enabling the `:countless_minimal` variable (or not). + ++++ Default mode + +!!! success +Your app needs a full classic pagination UI +!!! + +### Usage -In a controller: +
                    +||| Controller (eager loading) ```ruby -# default mode (eager loading) @pagy, @records = pagy_countless(some_scope, ...) - -# OR -# enable minimal mode for this instance (lazy loading) -@pagy, @records = pagy_countless(some_scope, countless_minimal: true, ...) ``` +||| -## Modes - -This extra can be used in two different modes by enabling or not the `:countless_minimal` variable. +This mode retrieves `items + 1`, and uses the number of retrieved items to calculate the variables. It then removes the extra item from the result. -### Default mode +!!! info +- The `@records` collection is an eager-loaded `Array` of records. +- The `@pagy` object can be used with any supported helper. +!!! ++++ Minimal mode -This is the preferred automatic way to save one query per request, while keep using the classic pagination UI helpers. +!!! success +Your app uses no or limited pagination UI +!!! -By default this extra will try to finalize the `pagy` object with all the available variables in a countless pagination. It will do so by retrieving `items + 1`, and using the resulting number to calculate the variables, while eventually removing the extra item from the result. +### Set Up countless_minimal mode +
                    -That means: +||| pagy.rb (initializer) +```ruby +require 'pagy/extras/countless' +# optionally enable the minimal mode by default +# Pagy::DEFAULT[:countless_minimal] = true +``` +||| -- The `pagy` object will know whether the current page is the last one or there will be a next page so you can use it right away with any supported helper -- The returned paginated collection (`@records`) will be an `Array` instead of a scope (so the records are already eager-loaded from the DB) +### Usage +
                    -### Minimal mode +||| Controller (lazy loading) +```ruby +@pagy, @records = pagy_countless(some_scope, countless_minimal: true, ...) +``` +||| -This is the preferred mode used to implement navless and automatic incremental/infinite-scroll pagination, where there is no need to use any UI. +This mode is enabled by the `:countless_minimal` variable. -If you enable the `:countless_minimal` variable, then: +!!! info +- The `@records` collection is a regular scope. +- The `@pagy` object cannot be used with any helpers. +- The collection is over when `@records.size < @pagy.vars[:items]`. +!!! -- The returned `pagy` object will contain just a handful of variables and will miss the finalization, so you cannot use it with any helpers -- The returned paginated collection (`@records`) will be a regular scope (i.e. no record has been load yet) so an eventual fragment caching can work as expected -- You will need to check the size of the paginated collection (`@records`) in order to know if it is the last page or not. You can tell it by checking `@records.size < @pagy.vars[:items]`. Notice that IF the last page has exactly the `@pagy.vars[:items]` in it you will not be able to know it. In infinite scroll that would just try to load the next page returning 0 items, so it will be perfectly acceptable anyway. ++++ ## Variables @@ -65,16 +92,16 @@ If you enable the `:countless_minimal` variable, then: ## Methods -All the methods in this module are prefixed with the `"pagy_countless"` string, to avoid any possible conflict with your own methods when you include the module in your controller. They are also all private, so they will not be available as actions. The methods prefixed with the `"pagy_countless_get_"` string are sub-methods/getter methods that are intended to be overridden, not used directly. +==- `pagy_countless(collection, vars=nil)` -### pagy_countless(collection, vars=nil) +This method is the same as the generic `pagy` method (see the [pagy doc](/docs/api/backend.md#pagy-collection-vars-nil)), however its returned objects will depend on the value of the `:countless_minimal` variable (see [Modes](#modes)) -This method is the same as the generic `pagy` method (see the [pagy doc](../api/backend.md#pagycollection-varsnil)), however its returned objects will depend on the value of the `:countless_minimal` variable (see [Modes](#modes)) +==- `pagy_countless_get_vars(_collection, vars)` -### pagy_countless_get_vars(_collection, vars) +This sub-method is similar to the `pagy_get_vars` sub-method, but it is called only by the `pagy_countless` method. (see the [pagy_get_vars doc](/docs/api/backend.md#pagy-get-vars-collection-vars)). -This sub-method is similar to the `pagy_get_vars` sub-method, but it is called only by the `pagy_countless` method. (see the [pagy_get_vars doc](../api/backend.md#pagy_get_varscollection-vars)). +==- `pagy_countless_get_items(collection, pagy)` -### pagy_countless_get_items(collection, pagy) +This sub-method is similar to the `pagy_get_items` sub-method, but it is called only by the `pagy_countless` method. (see the [pagy_get_items doc](/docs/api/backend.md#pagy-get-items-collection-pagy)). -This sub-method is similar to the `pagy_get_items` sub-method, but it is called only by the `pagy_countless` method. (see the [pagy_get_items doc](../api/backend.md#pagy_get_itemscollection-pagy)). +=== diff --git a/docs/extras/elasticsearch_rails.md b/docs/extras/elasticsearch_rails.md index 37c5e0db9..d56a5d97b 100644 --- a/docs/extras/elasticsearch_rails.md +++ b/docs/extras/elasticsearch_rails.md @@ -1,108 +1,100 @@ --- title: Elasticsearch Rails +categories: +- Search +- Backend +- Extras --- -# Elasticsearch Rails Extra - -This extra deals with the pagination of `ElasticsearchRails` response objects either by creating a `Pagy` object out of an (already paginated) `ElasticsearchRails` object or by creating the `Pagy` and `ElasticsearchRails` objects from the backend params. -## Synopsis +# Elasticsearch Rails Extra -See [extras](../extras.md) for general usage info. +Paginate `ElasticsearchRails` response objects. -Require the extra in the `pagy.rb` initializer: +## Setup +||| pagy.rb (initializer) ```ruby require 'pagy/extras/elasticsearch_rails' ``` +||| -### Passive mode +## Modes -If you have an already paginated `Elasticsearch::Model::Response::Response` object, you can get the `Pagy` object out of it: - -```ruby -@response = Model.search('*', from: 0, size: 10, ...) -@pagy = Pagy.new_from_elasticsearch_rails(@response, ...) -``` +This extra offers two ways to paginate `ElasticsearchRails` response objects. -### Active Mode ++++ Active mode -If you want Pagy to control the pagination, getting the page from the params, and returning both the `Pagy` and the `Elasticsearch::Model::Response::Response` objects automatically (from the backend params): +!!! success Pagy searches and paginates +You use the `pagy_search` method in place of the `search` method. +!!! -Extend your model: +### Usage +||| Model ```ruby extend Pagy::ElasticsearchRails ``` +||| -In a controller use `pagy_search` in place of `search`: - -```ruby -response = Article.pagy_search(params[:q]) -@pagy, @response = pagy_elasticsearch_rails(response, items: 10) -``` - -## Files - -- [elasticsearch_rails.rb](https://github.com/ddnexus/pagy/blob/master/lib/pagy/extras/elasticsearch_rails.rb) - -## Passive Mode - -### Pagy.new_from_elasticsearch_rails(response, ...) - -This constructor accepts an `Elasticsearch::Model::Response::Response` as the first argument, plus the usual optional variable hash. It sets the `:items`, `:page` and `:count` pagy variables extracted/calculated out of the `Elasticsearch::Model::Response::Response` object. - +||| Controller (pagy_search) ```ruby -@response = Model.search('*', from: 0, size: 10, ...) -@pagy = Pagy.new_from_elasticsearch_rails(@response, ...) +# get the collection in one of the following ways +collection = Article.pagy_search(params[:q]) +collection = Article.pagy_search(params[:q]).records +collection = Article.pagy_search(params[:q]).results +# paginate it +@pagy, @response = pagy_elasticsearch_rails(collection, items: 10) ``` +||| -**Notice**: you have to take care of manually manage all the params for your search, however the method extracts/calculates the `:items`, `:page` and `:count` from the response object, so you don't need to pass that again. If you prefer to manage the pagination automatically, see below. - -## Active mode ++++ Passive mode -### Pagy::ElasticsearchRails module +!!! success You search and paginate +Pagy creates its object out of your result. +!!! -Extend your model with the `Pagy::ElasticsearchRails` micro-module: +### Usage +||| Controller (search) ```ruby -extend Pagy::ElasticsearchRails +# standard response (already paginated) +@response = Article.search('*', from: 0, size: 10, ...) +# get the pagy object out of it +@pagy = Pagy.new_from_elasticsearch_rails(@response, ...) ``` +||| -The `Pagy::ElasticsearchRails` adds the `pagy_search` class method that you must use in place of the standard `search` method when you want to paginate the search response. ++++ -#### pagy_search(...) +## Files -This method accepts the same arguments of the `search` method and you must use it in its place. This extra uses it in order to capture the arguments, automatically merging the calculated `:from` and `:size` options before passing them to the standard `search` method internally. +- [elasticsearch_rails.rb](https://github.com/ddnexus/pagy/blob/master/lib/pagy/extras/elasticsearch_rails.rb) -### Variables +## Variables | Variable | Description | Default | |:-----------------------------------|:------------------------------------------------|:-------------| | `:elasticsearch_rails_pagy_search` | customizable name of the pagy search method | :pagy_search | | `:elasticsearch_rails_search` | customizable name of the original search method | :search | -### Methods +## Methods -This extra adds the `pagy_elasticsearch_rails` method to the `Pagy::Backend` to be used when you have to paginate a `ElasticsearchRails` object. It also adds a `pagy_elasticsearch_rails_get_variables` sub-method, used for easy customization of variables by overriding. +==- `Pagy::ElasticsearchRails.pagy_search(...)` -#### pagy_elasticsearch_rails(pagy_search_args, vars = {}}) +This method accepts the same arguments of the `search` method and you must use it in its place in active mode. -This method is similar to the generic `pagy` method, but specialized for Elasticsearch Rails. (see the [pagy doc](../api/backend.md#pagycollection-varsnil)) +==- `Pagy.new_from_elasticsearch_rails(response, vars={})` -It expects to receive a `Model.pagy_search(...)` result as the first argument and an optional hash of variables. It returns a paginated response. +This constructor accepts an `Elasticsearch::Model::Response::Response`, plus the optional pagy variables. It automatically sets the `:items`, `:page` and `:count` pagy variables extracted/calculated out of it. -You can use it in a couple of ways: +==- `pagy_elasticsearch_rails(pagy_search_args, vars={})` -```ruby -@pagy, @response = pagy_elasticsearch_rails(Model.pagy_search(params[:q]), ...) -... -records = @response.records -results = @response.results +This method is similar to the generic `pagy` method, but specialized for Elasticsearch Rails (see the [pagy doc](/docs/api/backend.md#pagy-collection-vars-nil)). -# or directly with the collection you need (e.g. records) -@pagy, @records = pagy_elasticsearch_rails(Model.pagy_search(params[:q]).records, ...) -``` +It expects to receive `YourModel.pagy_search(...)` result and returns the paginated response. + +==- `pagy_elasticsearch_rails_get_vars(array)` -### pagy_elasticsearch_rails_get_vars(array) +This sub-method is similar to the `pagy_get_vars` sub-method, but it is called only by the `pagy_elasticsearch_rails` method. (see the [pagy_get_vars doc](/docs/api/backend.md#pagy-get-vars-collection-vars)). -This sub-method is similar to the `pagy_get_vars` sub-method, but it is called only by the `pagy_elasticsearch_rails` method. (see the [pagy_get_vars doc](../api/backend.md#pagy_get_varscollection-vars)). +=== diff --git a/docs/extras/foundation.md b/docs/extras/foundation.md index 147fd78c4..be891f6b6 100644 --- a/docs/extras/foundation.md +++ b/docs/extras/foundation.md @@ -1,36 +1,36 @@ --- title: Foundation +categories: +- Frontend +- Extras --- # Foundation Extra -This extra adds nav helper and templates for the Foundation [pagination component](https://foundation.zurb.com/sites/docs/pagination.html). +This extra adds nav helpers and templates for the Foundation [pagination component](https://foundation.zurb.com/sites/docs/pagination.html). ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/foundation' ``` +||| -Render the navigation links in some view... -with a fast helper: - +||| View (helper) ```erb <%== pagy_foundation_nav(@pagy, ...) %> <%== pagy_foundation_nav_js(@pagy, ...) %> <%== pagy_foundation_combo_nav_js(@pagy, ...) %> ``` +||| -or with a template: - +||| View (template) ```erb <%== render partial: 'pagy/foundation_nav', locals: {pagy: @pagy} %> ``` +||| -See [Javascript](../api/javascript.md) if you use `pagy_foundation_nav_js` or `pagy_foundation_combo_nav_js`. +See [Javascript](/docs/api/javascript.md) if you use `pagy_foundation_nav_js` or `pagy_foundation_combo_nav_js`. ## Files @@ -41,20 +41,20 @@ See [Javascript](../api/javascript.md) if you use `pagy_foundation_nav_js` or `p ## Methods -This extra adds 3 nav helpers to the `Pagy::Frontend` module. You can customize them by direct overriding in your own view helper. - -### pagy_foundation_nav(pagy) +==- `pagy_foundation_nav(pagy)` This method is the same as the `pagy_nav`, but customized for Foundation. -See the [pagy_nav(pagy, ...)](../api/frontend.md#pagy_navpagy-) documentation. +See the [pagy_nav(pagy, ...)](/docs/api/frontend.md#pagy-nav-pagy) documentation. + +The `foundation_nav.*` templates produce the same output, and can be used as an easier (but slower) starting point to override it. See [How to use templates](/docs/how-to.md#use-templates). -The `foundation_nav.*` templates produce the same output, and can be used as an easier (but slower) starting point to override it. See [How to use templates](../how-to.md#use-templates). +==- `pagy_foundation_nav_js(pagy, ...)` -### pagy_foundation_nav_js(pagy, ...) +See the [Javascript Navs](/docs/api/javascript/navs.md) documentation. -See the [Javascript Navs](../api/javascript.md#javascript-navs) documentation. +==- `pagy_foundation_combo_nav_js(pagy, ...)` -### pagy_foundation_combo_nav_js(pagy, ...) +See the [Javascript Combo Navs](/docs/api/javascript/combo-navs.md) documentation. -See the [Javascript Combo Navs](../api/javascript.md#javascript-combo-navs) documentation. +=== diff --git a/docs/extras/gearbox.md b/docs/extras/gearbox.md index 9b1130f38..8b2b9a4fe 100644 --- a/docs/extras/gearbox.md +++ b/docs/extras/gearbox.md @@ -1,5 +1,8 @@ --- title: Gearbox +categories: +- Features +- Extras --- # Gearbox Extra @@ -24,19 +27,20 @@ If you want to use the `gearbox` in some instances, you can temporarily set `ite ## Synopsis -See [extras](../extras.md) for general usage info. - +||| pagy.rb (initializer) ```ruby -# pagy.rb initializer require 'pagy/extras/gearbox' # optional: set a different default in the pagy.rb initializer # Pagy::DEFAULT[:gearbox_extra] = false # will make it opt-in only # Pagy::DEFAULT[:gearbox_items] = [15, 30, 60, 100] # default Pagy::DEFAULT[:gearbox_items] = [10, 20, 50] # your own default +``` +||| -# controller action -# or pass the :gearbox_items variable to a constructor to have it only for that instance +||| Controller (action) +```ruby +# Optionally override the :gearbox_items variable to a constructor to have it only for that instance @pagy, @records = pagy(Product.all, gearbox_items: [30, 60, 100], ...) # You can still use instances with fixed pagination even after requiring the extra @@ -51,6 +55,7 @@ Pagy::DEFAULT[:gearbox_items] = [10, 20, 50] # your own default # use the passed gearbox_items: [30, 60, 100] @pagy, @records = pagy(Product.all, items_extra: false, gearbox_items: [30, 60, 100]) ``` +||| ## Files diff --git a/docs/extras/headers.md b/docs/extras/headers.md index 9c81fe52a..a891c6aac 100644 --- a/docs/extras/headers.md +++ b/docs/extras/headers.md @@ -1,9 +1,14 @@ --- title: Headers +categories: +- Backend +- Extras --- # Headers Extra This extra implements the [RFC-8288](https://tools.ietf.org/html/rfc8288) compliant http response headers (and other helpers) useful for API pagination. + +## Advantages - No need for an extra dependency - No need to learn yet another interface @@ -13,16 +18,13 @@ This extra implements the [RFC-8288](https://tools.ietf.org/html/rfc8288) compli ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/headers' ``` +||| -In your controller action: - +||| Controller (action) ```ruby # paginate as usual with any pagy_* backend constructor pagy, records = pagy(Product.all) @@ -30,11 +32,13 @@ pagy, records = pagy(Product.all) pagy_headers_merge(pagy) render json: records ``` +||| ### Suggestions Instead of explicitly merging the headers before each rendering, if you use rails you can get them automatically merged (application-wide and when `@pagy` is available), by adding an `after_action` in your application controller: +||| Controller (after_action) ```ruby after_action { pagy_headers_merge(@pagy) if @pagy } @@ -42,9 +46,11 @@ after_action { pagy_headers_merge(@pagy) if @pagy } @pagy, records = pagy(Product.all) render json: records ``` +||| If your code in different actions is similar enough, you can encapsulate the statements in a custom `pagy_render` method in your application controller. For example: +||| Controller (pagy_render) ```ruby def pagy_render(collection, vars={}) pagy, records = pagy(collection, vars) # any pagy_* backend constructor works @@ -55,6 +61,7 @@ end # and use it in your standard actions: pagy_render(Product.all) ``` +||| ## Files @@ -65,8 +72,7 @@ pagy_render(Product.all) This extra generates the standard `Link` header defined in the [RFC-8288](https://tools.ietf.org/html/rfc8288), and adds 4 customizable headers useful for pagination: `Current-Page`, `Page-Items`, `Total-Pages` and `Total-Count` headers. -Example of the default HTTP headers produced: - +||| Example of the default HTTP headers ```text Link ; rel="first", ; rel="prev", ; rel="next", ; rel="last" Current-Page 3 @@ -74,6 +80,7 @@ Page-Items 20 Total-Pages 50 Total-Count 1000 ``` +||| ### Customize the header names @@ -101,19 +108,31 @@ As usual, depending on the scope of the customization, you can set the variables For example, the following will change the header names and will suppress the `:pages` ('Total-Pages') header: +||| pagy.rb (initializer) ```ruby -# globally -Pagy::DEFAULT[:headers] = {page: 'Current-Page', items: 'Per-Page', pages: false, count: 'Total'} +# global +Pagy::DEFAULT[:headers] = {page: 'Current-Page', + items: 'Per-Page', + pages: false, + count: 'Total'} +``` +||| + +||| Controller +```ruby # or for single instance -pagy, records = pagy(collection, headers: {page: 'Current-Page', items: 'Per-Page', pages: false, count: 'Total'}) +pagy, records = pagy(collection, + headers: {page: 'Current-Page', + items: 'Per-Page', + pages: false, + count: 'Total'}) ``` +||| ## Methods -This extra adds a few methods to the `Pagy::Backend` (available in your controllers). - -### pagy_headers_merge(pagy) +==- `pagy_headers_merge(pagy)` This method relies on the `response` method in your controller returning a `Rack::Response` object. @@ -121,11 +140,11 @@ You should use it before rendering: it simply merges the `pagy_headers` to the ` If your app doesn't implement the `response` object that way, you should override the `pagy_headers_merge` method in your controller or use the `pagy_headers` method directly. -### pagy_headers(pagy) +==- `pagy_headers(pagy)` This method generates a hash of [RFC-8288](https://tools.ietf.org/html/rfc8288) compliant http headers to send with the response. It is internally used by the `pagy_headers_merge` method, so you usually don't need to use it directly. However, if you need to edit the headers that pagy generates (for example adding extra `Link` headers), you can override it in your own controller. -### pagy_headers_hash(pagy) +==- `pagy_headers_hash(pagy)` This method generates a hash structure of the headers, useful only if you want to include the headers as metadata within your JSON. For example: @@ -133,4 +152,7 @@ This method generates a hash structure of the headers, useful only if you want t render json: records.as_json.merge!(meta: {pagination: pagy_headers_hash(pagy)}) ``` -**Notice**: If you need a more complete set of metadata (e.g. if you use some javascript frontend) see the [metadata extra](metadata.md). +!!!info Metadata +For a more complete set of metadata you should use the [metadata extra](metadata.md). +!!! +=== diff --git a/docs/extras/i18n.md b/docs/extras/i18n.md index 48eb00918..fdd33f83c 100644 --- a/docs/extras/i18n.md +++ b/docs/extras/i18n.md @@ -1,25 +1,28 @@ --- title: I18n +categories: +- Feature +- Extras --- # I18n Extra The `i18n` extra delegates the translation of the pagy strings and [localization of the calendar time labels](calendar.md#i18n-localization) to the `i18n` gem (which should obviously be installed). -A change in the global `I18n.locale` will automatically translate and localize all the Pagy output accordingly. - -You should have some very good reasons to use the `i18n` gem instead of the pagy implementation, because the `i18n` gem is ~18x slower and uses ~10x more memory than the [Pagy::I18n](../api/i18n) default implementation. +A change in the global `I18n.locale` will automatically translate and localize all Pagy output accordingly. -**Notice**: Having the `i18n` gem already installed and configured in your app might not count as a good reason, because, besides being faster and lighter, the [Pagy::I18n](../api/i18n) is super easy to configure and doesn't require any change in the `i18n` of the rest of your app. +!!!warning Prefer Pagy i18n +You should have some very good reasons to use the `i18n` gem instead of the pagy implementation, because the `i18n` gem is ~18x slower and uses ~10x more memory than the [Pagy::I18n](/docs/api/i18n) default implementation. -## Synopsis - -See [extras](../extras.md) for general usage info. +Having the `i18n` gem already installed and configured in your app might not count as a good reason, because, besides being faster and lighter, the [Pagy::I18n](/docs/api/i18n) is super easy to configure and doesn't require any change in the `i18n` of the rest of your app. +!!! -In the `pagy.rb` initializer: +## Synopsis +||| pagy.rb (initializer) ```ruby -require 'pagy/extras/i18n' +require 'pagy/extras/headers' ``` +||| ## Files diff --git a/docs/extras/index.yml b/docs/extras/index.yml new file mode 100644 index 000000000..7205070a1 --- /dev/null +++ b/docs/extras/index.yml @@ -0,0 +1,3 @@ +#expanded: true +icon: plus-circle-24 +image: null diff --git a/docs/extras/items.md b/docs/extras/items.md index b0550e2f3..59ce76e59 100644 --- a/docs/extras/items.md +++ b/docs/extras/items.md @@ -1,28 +1,36 @@ --- title: Items +categories: +- Feature +- Extras --- # Items Extra Allow the client to request a custom number of items per page with an optional selector UI. It is useful with APIs or user-customizable UIs. -It works also with the [countless](countless.md), [searchkick](searchkick.md), [elasticsearch_rails](elasticsearch_rails.md) and [meilisearch](../extras/meilisearch.md) extras. +It works also with the [countless](countless.md), [searchkick](searchkick.md), [elasticsearch_rails](elasticsearch_rails.md) and [meilisearch](/docs/extras/meilisearch.md) extras. ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby -require 'pagy/extras/items' +require 'pagy/extras/items' # works without further configuration +``` +||| -# it will work without any further configuration +||| Controller +```ruby # you can disable it explicitly for specific requests @pagy, @records = pagy(Product.all, items_extra: false) -# or... +# or see below: +``` +||| + +||| pagy.rb (initializer) +```ruby # disable it by default (opt-in) Pagy::DEFAULT[:items_extra] = false # default true # in this case you have to enable it explicitly when you want it @@ -32,8 +40,9 @@ Pagy::DEFAULT[:items_extra] = false # default true Pagy::DEFAULT[:items_param] = :custom_param # default :items Pagy::DEFAULT[:max_items] = 200 # default 100 ``` +||| -See [Javascript](../api/javascript.md) (only if you use the `pagy_items_selector_js` UI) +See [Javascript](/docs/api/javascript.md) (only if you use the `pagy_items_selector_js` UI) ## Files @@ -57,31 +66,40 @@ You may want to customize the variables. Depending on the scope of the customiza As a global default: +||| pagy.rb (initializer) + ```ruby Pagy::DEFAULT[:items_param] = :custom_param Pagy::DEFAULT[:max_items] = 50 ``` +||| For a single instance (overriding the global default): +||| Controller + ```ruby pagy(scope, items_param: :custom_param, max_items: 50) Pagy.new(count: 100, items_param: :custom_param, max_items: 50) ``` +||| -**Notice**: you can override the items that the client sends with the params by passing the `:items` explicitly. For example: + +!!!info Override 'items' in Params +You can override the items that the client sends with the params by passing the `:items` explicitly. For example: ```ruby # this will ignore the params[:items] (or any custom :param_name) # from the client for this instance, and serve 30 items pagy(scope, items: 30) ``` +!!! ## Methods The `items` extra adds the `pagy_items_selector_js` helper to the `Pagy::Frontend` module. -### pagy_items_selector_js(pagy, ...) +==- `pagy_items_selector_js(pagy, ...)` This helper provides an items selector UI, which allows the user to select any arbitrary number of items per page (below the `:max_items` number) in a numeric input field. It looks like: @@ -96,17 +114,26 @@ The method accepts also a few optional keyword arguments: - `:i18n_key` the key to lookup in a dictionary - `:link_extra` which add a verbatim string to the `a` tag (e.g. `'data-remote="true"'`) -Notice the `:i18n_key` can be passed also to the constructor or be a less useful global variable (i.e. `Pagy::DEFAULT[:i18n_key]` + +!!!info Info +The `:i18n_key` can be passed also to the constructor or be a less useful global variable (i.e. `Pagy::DEFAULT[:i18n_key]` + +||| some_view.html.erb ```erb <%== pagy_items_selector_js(@pagy, item_name: 'Product'.pluralize(@pagy.count) %> <%== pagy_items_selector_js(@pagy, i18n_key: 'activerecord.model.product' %> ``` +||| +!!! + Show Products per page -_(see [How to customize the item name](../how-to.md#customize-the-item-name))_ +_(see [How to customize the item name](/docs/how-to.md#customize-the-item-name))_ When the items number is changed with the selector, pagy will reload the pagination UI using the selected items per page. It will also request the _right_ page number calculated in order to contain the first item of the previously displayed page. That way the new displayed page will roughly show the same items in the collection before the items change. This method can take an extra `id` argument, which is used to build the `id` attribute of the `nav` tag. + +=== \ No newline at end of file diff --git a/docs/extras/materialize.md b/docs/extras/materialize.md index 1e5c59684..b89614a61 100644 --- a/docs/extras/materialize.md +++ b/docs/extras/materialize.md @@ -1,5 +1,9 @@ --- title: Materialize +categories: +- Frontend +- Extras +image: none --- # Materialize Extra @@ -7,24 +11,21 @@ This extra adds 3 nav helpers for the Materialize CSS [pagination component](htt ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/materialize' ``` +||| -Render the navigation links in some view... -with a fast helper: - +||| View (helper) ```erb <%== pagy_materialize_nav(@pagy, ...) %> <%== pagy_materialize_nav_js(@pagy, ...) %> <%== pagy_materialize_combo_nav_js(@pagy, ...) %> ``` +||| -See [Javascript](../api/javascript.md) if you use `pagy_materialize_nav_js` or `pagy_materialize_combo_nav_js`. +See [Javascript](/docs/api/javascript.md) if you use `pagy_materialize_nav_js` or `pagy_materialize_combo_nav_js`. ## Files @@ -34,18 +35,20 @@ See [Javascript](../api/javascript.md) if you use `pagy_materialize_nav_js` or ` This extra adds 3 nav helpers to the `Pagy::Frontend` module. You can customize them by direct overriding in your own view helper. -### pagy_materialize_nav(pagy) +==- `pagy_materialize_nav(pagy)` This method is the same as the `pagy_nav`, but customized for Materialize. -See the [pagy_nav(pagy, ...)](../api/frontend.md#pagy_navpagy-) documentation. +See the [pagy_nav(pagy, ...)](/docs/api/frontend.md#pagy-nav-pagy) documentation. + +==- `pagy_materialize_nav_js(pagy, ...)` -### pagy_materialize_nav_js(pagy, ...) +See the [Javascript Navs](/docs/api/javascript/navs.md) documentation. -See the [Javascript Navs](../api/javascript.md#javascript-navs) documentation. +=== `pagy_materialize_combo_nav_js(pagy, ...)` -### pagy_materialize_combo_nav_js(pagy, ...) +![materialize_combo_nav_js](/docs/assets/images/materialize_combo_nav_js-g.png) -![materialize_combo_nav_js](../assets/images/materialize_combo_nav_js-g.png) +See the [Javascript Combo Navs](/docs/api/javascript/combo-navs.md) documentation. -See the [Javascript Combo Navs](../api/javascript.md#javascript-combo-navs) documentation. +=== diff --git a/docs/extras/meilisearch.md b/docs/extras/meilisearch.md index 9bdf38558..da520fb07 100644 --- a/docs/extras/meilisearch.md +++ b/docs/extras/meilisearch.md @@ -1,106 +1,99 @@ --- title: Meilisearch +categories: +- Search +- Backend +- Extras --- # Meilisearch Extra -This extra deals with the pagination of `Meilisearch` results either by creating a `Pagy` object out of an (already paginated) `Meilisearch` results or by creating the `Pagy` and `Meilisearch` results from the backend params. +Paginate `Meilisearch` results. -## Synopsis - -See [extras](../extras.md) for general usage info. - -Require the extra in the `pagy.rb` initializer: +## Setup +||| pagy.rb (initializer) ```ruby require 'pagy/extras/meilisearch' ``` +||| -### Passive mode +## Modes -If you have an already paginated `Meilisearch` results, you can get the `Pagy` object out of it: - -```ruby -@results = Model.ms_search(nil, hits_per_page: 10, page: 10, ...) -@pagy = Pagy.new_from_meilisearch(@results, ...) -``` +This extra offers two ways to paginate `Meilisearch` objects: -### Active Mode ++++ Active mode -If you want Pagy to control the pagination, getting the page from the params, and returning both the `Pagy` and the Meilisearch results automatically (from the backend params): +!!! success Pagy searches and paginates +You use the `pagy_search` method in place of the `ms_search` method. +!!! -Extend your model: +### Usage +
                    +||| Model ```ruby extend Pagy::Meilisearch -ActiveRecord_Relation.include Pagy::Meilisearch # <--- (optional) if you use `includes` makes it work as expected +ActiveRecord_Relation.include Pagy::Meilisearch ``` +||| -In a controller use `pagy_search` in place of `search`: - +||| Controller (pagy_search) ```ruby -results = Article.pagy_search(params[:q]) -@pagy, @results = pagy_meilisearch(results, items: 10) +# get the collection in one of the following ways +collection = Article.pagy_search(params[:q]) +collection = Article.pagy_search(params[:q]).results +# paginate it +@pagy, @response = pagy_meilisearch(collection, items: 10) ``` +||| -## Files - -- [meilisearch.rb](https://github.com/ddnexus/pagy/blob/master/lib/pagy/extras/meilisearch.rb) ++++ Passive Mode -## Passive mode +!!! success You search and paginate +Pagy creates its object out of your result. +!!! -### Pagy.new_from_meilisearch - -This constructor accepts a Meilisearch as the first argument, plus the usual optional variable hash. It sets the `:items`, `:page` and `:count` pagy variables extracted/calculated out of the Meilisearch object. +### Usage +
                    +||| Controller (Search) ```ruby -@results = Model.ms_search(nil, hits_per_page: 10, page: 5, ...) +@results = Model.ms_search(nil, hits_per_page: 10, page: 10, ...) @pagy = Pagy.new_from_meilisearch(@results, ...) ``` +||| -**Notice**: you have to take care of manually manage all the params for your search, however the method extracts the `:items`, `:page` and `:count` from the results object, so you don't need to pass that again. If you prefer to manage the pagination automatically, see below. - -## Active Mode ++++ -### Pagy::Meilisearch module - -Extend your model with the `Pagy::Meilisearch` micro-module: - -```ruby -extend Pagy::Meilisearch -``` - -The `Pagy::Meilisearch` adds the `pagy_search` class method that you must use in place of the standard `search` method when you want to paginate the search response. - -### pagy_search(...) +## Files -This method accepts the same arguments of the `search` method and you must use it in its place. +- [meilisearch.rb](https://github.com/ddnexus/pagy/blob/master/lib/pagy/extras/meilisearch.rb) -### Variables +## Variables | Variable | Description | Default | |:---------------------------|:------------------------------------------------|:---------------| | `:meilisearch_pagy_search` | customizable name of the pagy search method | `:pagy_search` | -| `:meilisearch_search` | customizable name of the original search method | `:search` | +| `:meilisearch_search` | customizable name of the original search method | `:ms_search` | ## Methods -This extra adds the `pagy_meilisearch` method to the `Pagy::Backend` to be used when you have to paginate a Meilisearch object. It also adds a `pagy_meilisearch_get_vars` sub-method, used for easy customization of variables by overriding. +==- `Pagy::Meilisearch.pagy_search(...)` -### pagy_meilisearch(Model.pagy_search(...), vars={}}) +This method accepts the same arguments of the `ms_search` method and you must use it in its place in active mode. -This method is similar to the generic `pagy` method, but specialized for Meilisearch. (see the [pagy doc](../api/backend.md#pagycollection-varsnil)) +==- `Pagy.new_from_meilisearch(results, vars={})` -It expects to receive a `Model.pagy_search(...)` result and returns a paginated response. You can use it in a couple of ways: +This constructor accepts a `Meiliserch` object, plus the optional pagy variables. It automatically sets the `:items`, `:page` and `:count` pagy variables extracted/calculated out of it. -```ruby -@pagy, @results = pagy_meilisearch(Model.pagy_search(params[:q]), ...) -... -@records = @results.results +==- `pagy_meilisearch(pagy_search_args, vars={})` -# or directly with the collection you need (e.g. records) -@pagy, @records = pagy_meilisearch(Model.pagy_search(params[:q]).results, ...) -``` +This method is similar to the generic `pagy` method, but specialized for Meilisearch. (see the [pagy doc](/docs/api/backend.md#pagy-collection-vars-nil)) + +It expects to receive `YourModel.pagy_search(...)` result and returns the paginated response. + +==- `pagy_meilisearch_get_vars(array)` -### pagy_meilisearch_get_vars(array) +This sub-method is similar to the `pagy_get_vars` sub-method, but it is called only by the `pagy_meilisearch` method. (see the [pagy_get_vars doc](/docs/api/backend.md#pagy-get-vars-collection-vars)). -This sub-method is similar to the `pagy_get_vars` sub-method, but it is called only by the `pagy_meilisearch` method. (see the [pagy_get_vars doc](../api/backend.md#pagy_get_varscollection-vars)). +=== diff --git a/docs/extras/metadata.md b/docs/extras/metadata.md index 3ba7411bf..2a175373c 100644 --- a/docs/extras/metadata.md +++ b/docs/extras/metadata.md @@ -1,5 +1,8 @@ --- title: Metadata +categories: +- Backend +- Extras --- # Metadata Extra @@ -9,21 +12,21 @@ This extra makes that easy and efficient by adding a single method to the backen ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: +||| pagy.rb (initializer) ```ruby require 'pagy/extras/metadata' ``` +||| -In your controller action: +||| Controller (action) ```ruby pagy, records = pagy(Product.all) render json: { data: records, pagy: pagy_metadata(pagy, ...) } ``` +||| ## Files @@ -39,7 +42,7 @@ As usual, depending on the scope of the customization, you can set the `:metadat IMPORTANT: Don't rely on the broad default! You should explicitly set the `:metadata` variable with only the keys that you will actually use in the frontend, for obvious performance reasons. Besides you can also add other pagy method names not included in the default. -### :scaffold_url key +### The `:scaffold_url` key This is a special url string that you can use as the scaffold to build real page urls in your frontend (instead of producing them on the backend). @@ -55,12 +58,15 @@ page_url = scaffold_url.replace(/__pagy_page__/, page_number) This is particularly useful when you want to build some dynamic pagination UI (e.g. similar to what the `pagy_*combo_js` generates), but right in your frontend app, saving backend resources with obvious performance benefits. -**Notice**: for simple cases you might want to use the other few `:*_url` metadata directly, instead of using the `:scaffold_url`. + +!!!info `scaffold_url` not necessary for simple cases +For simple cases you might want to use the other few `:*_url` metadata directly, instead of using the `:scaffold_url`. +!!! ## Methods This extra adds a single method to the `Pagy::Backend` (available in your controllers). -### pagy_metadata(pagy, absolute: nil) - +==- `pagy_metadata(pagy, absolute: nil)` This method returns a hash with the keys/values defined by the `:metadata` variable. When true, the `absolute` boolean argument will cause all the `:*_url` metadata to be absolute instead of relative. +=== \ No newline at end of file diff --git a/docs/extras/navs.md b/docs/extras/navs.md index 5fdaa838f..ed762967c 100644 --- a/docs/extras/navs.md +++ b/docs/extras/navs.md @@ -1,5 +1,8 @@ --- title: Navs +categories: +- Frontend +- Extras --- # Navs Extra @@ -9,23 +12,26 @@ Other extras (e.g. [bootstrap](bootstrap.md), [bulma](bulma.md), [foundation](fo ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/navs' ``` +||| -Render the navigation links in some view... -with a fast helper: - +||| View (helper) ```erb <%== pagy_nav_js(@pagy, ...) %> <%== pagy_combo_nav_js(@pagy, ...) %> ``` +||| -See [Javascript](../api/javascript.md). +||| View (template) +```erb +<%== render partial: 'pagy/nav', locals: {pagy: @pagy} %> +``` +||| + +See [Javascript](/docs/api/javascript.md). ## Files @@ -33,10 +39,12 @@ See [Javascript](../api/javascript.md). ## Methods -### pagy_nav_js(pagy, ...) +==- `pagy_nav_js(pagy, ...)` + +See [Javascript Navs](/docs/api/javascript/navs.md). -See the [Javascript Navs](../api/javascript.md#javascript-navs) documentation. +==- `pagy_combo_nav_js(pagy, ...)` -### pagy_combo_nav_js(pagy, ...) +See [Javascript Combo Navs](/docs/api/javascript/combo-navs.md). -See the [Javascript Combo Navs](../api/javascript.md#javascript-combo-navs) documentation. +=== diff --git a/docs/extras/overflow.md b/docs/extras/overflow.md index 0652cfcaa..e9eda5020 100644 --- a/docs/extras/overflow.md +++ b/docs/extras/overflow.md @@ -1,15 +1,16 @@ --- title: Overflow +categories: +- Feature +- Extras --- # Overflow Extra -This extra allows for easy handling of overflowing pages. It internally rescues from the `Pagy::OverflowError` offering a few different ready to use modes, quite useful for UIs and/or APIs. It works with `Pagy` and its subclasses, although with some little difference. +This extra allows for easy handling of overflowing pages. It internally rescues from the `Pagy::OverflowError` offering a few different ready to use modes, quite useful for UIs and/or APIs. It works with `Pagy` and its subclasses some minor differences. ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: +||| pagy.rb (initializer) ```ruby require 'pagy/extras/overflow' @@ -25,6 +26,7 @@ require 'pagy/extras/overflow' Pagy::DEFAULT[:overflow] = :exception ``` +||| ## Files @@ -38,24 +40,29 @@ Pagy::DEFAULT[:overflow] = :exception As usual, depending on the scope of the customization, you have a couple of options to set the variables: + ```ruby -# globally +# globally: e,g, pagy.rb Initializer Pagy::DEFAULT[:overflow] = :empty_page -# or for a single instance +# or for a single instance e.g. in a controller @pagy, @records = pagy(scope, overflow: :empty_page) ``` ## Modes -These are the modes accepted by the `:overflow` variable: +The modes accepted by the `:overflow` variable: + +- `:empty_page` +- `:last_page` +- `:exception` -### :empty_page ++++ :empty_page This is the default mode; it will paginate the actual requested page, which - being overflowing - is empty. It is useful with APIs, where the client expects an empty set of results in order to stop requesting further pages. -Example for `Pagy` instance: +||| `Pagy` instance example: ```ruby # no exception passing an overflowing page pagy = Pagy.new(count: 100, page: 100) @@ -72,8 +79,9 @@ pagy.from #=> 0 pagy.to #=> 0 pagy.series #=> [1, 2, 3, 4, 5] (no string, so no current page highlighted in the UI) ``` +||| -Example for `Pagy::Countless` instance: +||| `Pagy::Countless` instance example: ```ruby require 'pagy/countless' @@ -93,8 +101,10 @@ pagy.from #=> 0 pagy.to #=> 0 pagy.series #=> [] (no pages) ``` +||| -Example for `Pagy::Calendar::Month` instance: + +||| `Pagy::Calendar::Month` instance example: ```ruby require 'pagy/calendar' @@ -120,15 +130,20 @@ pagy = Pagy::Calendar::Month.new(order: :desc, period: [local_time, local_time + pagy.from #=> 2021-10-01 00:00:00 -0900 (start time of initial unit) pagy.to #=> 2021-10-01 00:00:00 -0900 (same as from: if used it gets no records) ``` +||| + -### :last_page ++++ :last_page -**Notice**: Not available for `Pagy::Countless` instances since the last page is not known. +!!!warning `:last_page` not available for `Pagy::Countless` instances +...because the last page is not known. +!!! -It is useful in apps with an UI, in order to avoid to redirect to the last page. +It is useful in apps with a UI, in order to avoid being redirect to the last page. -Regardless the overflowing page requested, Pagy will set the page to the last page and paginate exactly as if the last page has been requested. For example: +Regardless of the overflowing page requested, `Pagy` will set the page to the last page and paginate exactly as if the last page has been requested. For example: +||| Controller ```ruby pagy = Pagy.new(count: 100, page: 100, overflow: :last_page) @@ -137,8 +152,9 @@ pagy.vars[:page] #=> 100 (requested page) pagy.page #=> 5 (current/last page) pagy.last == pagy.page #=> true ``` +||| -### :exception ++++ :exception This mode raises the `Pagy::OverflowError` as usual, so you can rescue from and implement your own custom mode even in presence of this extra. @@ -149,13 +165,16 @@ rescue Pagy::OverflowError => e ... end ``` ++++ + ## Methods -### overflow? +==- `overflow?` Use this method in order to know if the requested page is overflowing. The original requested page is available as `pagy.vars[:page]` (useful when used with the `:last_page` mode, in case you want to give some feedback about the rescue to the user/client). +=== ## Errors -See [How to handle Pagy::OverflowError exceptions](../how-to.md#handle-pagyoverflowerror-exceptions) +See [How to handle Pagy::OverflowError exceptions](/docs/how-to.md#handle-pagyoverflowerror-exceptions) diff --git a/docs/extras/searchkick.md b/docs/extras/searchkick.md index 19f35af99..8f5daac64 100644 --- a/docs/extras/searchkick.md +++ b/docs/extras/searchkick.md @@ -1,122 +1,102 @@ --- title: Searchkick +categories: +- Search +- Backend +- Extras --- # Searchkick Extra -This extra deals with the pagination of `Searchkick::Results` objects either by creating a `Pagy` object out of an (already paginated) `Searchkick::Results` object or by creating the `Pagy` and `Searchkick::Results` objects from the backend params. +Paginate `Searchkick::Results` objects. ## Synopsis -See [extras](../extras.md) for general usage info. - -Require the extra in the `pagy.rb` initializer: +## Setup +||| pagy.rb (initializer) ```ruby require 'pagy/extras/searchkick' -Searchkick.extend Pagy::Searchkick # optional +Searchkick.extend Pagy::Searchkick ``` +||| -### Passive mode +## Modes -If you have an already paginated `Searchkick::Results` object, you can get the `Pagy` object out of it: - -```ruby -@results = Model.search('*', page: 1, per_page: 10, ...) -@pagy = Pagy.new_from_searchkick(@results, ...) -``` +This extra offers two ways to paginate `Searchkick::Results` objects: -### Active Mode ++++ Active mode -If you want Pagy to control the pagination, getting the page from the params, and returning both the `Pagy` and the `Searchkick::Results` objects automatically (from the backend params): +!!! success Pagy searches and paginates +You use the `pagy_search` method in place of the `search` method. +!!! -Extend your model: +### Usage +||| Model ```ruby extend Pagy::Searchkick ``` +||| -In a controller use `pagy_search` in place of `search`: - +||| Controller (pagy_search) ```ruby -results = Article.pagy_search(params[:q]) -@pagy, @results = pagy_searchkick(results, items: 10) +# single model +collection = Article.pagy_search(params[:q]) +# multi models +collection = Searchkick.pagy_search(params[:q], models: [Article, Categories]) +# paginate it +@pagy, @response = pagy_searchkick(collection, items: 10) ``` +||| -#### Searchkick.search ++++ Passive mode -Extend also the `Searchkick` module if you are going to use `Searchkick.pagy_search`: - -```ruby -# config/initializers/pagy.rb -Searchkick.extend Pagy::Searchkick -``` +!!! success You search and paginate +Pagy creates its object out of your result. +!!! -Use `pagy_search` in place of `search`: +### Usage +||| Controller (search) ```ruby -results = Searchkick.pagy_search(params[:q], models: [Article, Categories]) -@pagy, @results = pagy_searchkick(results, items: 10) +# standard response (already paginated) +@results = Article.search('*', page: 1, per_page: 10, ...) +# get the pagy object out of it +@pagy = Pagy.new_from_searchkick(@results, ...) ``` +||| + ++++ ## Files - [searchkick.rb](https://github.com/ddnexus/pagy/blob/master/lib/pagy/extras/searchkick.rb) -## Passive mode - -### Pagy.new_from_searchkick(results, vars = {}) - -This constructor accepts a `Searchkick::Results` as the first argument, plus the usual optional variable hash. It sets the `:items`, `:page` and `:count` pagy variables extracted/calculated out of the `Searchkick::Results` object. - -```ruby -@results = Model.search('*', page: 2, per_page: 10, ...) -@pagy = Pagy.new_from_searchkick(@results, ...) -``` - -**Notice**: you have to take care of manually manage all the params for your search, however the method extracts the `:items`, `:page` and `:count` from the results object, so you don't need to pass that again. If you prefer to manage the pagination automatically, see below. - -## Active Mode - -## Pagy::Searchkick module - -Extend your model with the `Pagy::Searchkick` micro-module: - -```ruby -extend Pagy::Searchkick -``` - -The `Pagy::Searchkick` adds the `pagy_search` class method that you must use in place of the standard `search` method when you want to paginate the search response. - -### pagy_search(...) - -This method accepts the same arguments of the `search` method and you must use it in its place. This extra uses it in order to capture the arguments, automatically merging the calculated `:page` and `:per_page` options before passing them to the standard `search` method internally. - -### Variables +## Variables | Variable | Description | Default | |:--------------------------|:------------------------------------------------|:---------------| | `:searchkick_pagy_search` | customizable name of the pagy search method | `:pagy_search` | | `:searchkick_search` | customizable name of the original search method | `:search` | -### Methods +## Methods -This extra adds the `pagy_searchkick` method to the `Pagy::Backend` to be used when you have to paginate a `Searchkick::Results` object. It also adds a `pagy_searchkick_get_vars` sub-method, used for easy customization of variables by overriding. +==- `Pagy::Searchkick.pagy_search(...)` -#### pagy_searchkick(pagy_search_args, vars={}}) +This method accepts the same arguments of the `search` method and you must use it in its place in active mode. -This method is similar to the generic `pagy` method, but specialized for Searchkick. (see the [pagy doc](../api/backend.md#pagycollection-varsnil)) +==- `Pagy.new_from_searchkick(results, vars={})` -It expects to receive a `Model.pagy_search(...)` result and returns a paginated response. You can use it in a couple of ways: +This constructor accepts a `Searchkick::Results` as the first argument, plus the optional pagy variables. It automatically sets the `:items`, `:page` and `:count` pagy variables extracted/calculated out of it. -```ruby -@pagy, @results = pagy_searchkick(Model.pagy_search(params[:q]), ...) -... -@records = @results.results +==- `pagy_searchkick(pagy_search_args, vars={})` -# or directly with the collection you need (e.g. records) -@pagy, @records = pagy_searchkick(Model.pagy_search(params[:q]).results, ...) -``` +This method is similar to the generic `pagy` method, but specialized for Searchkick. (see the [pagy doc](/docs/api/backend.md#pagy-collection-vars-nil)) + +It expects to receive `YourModel.pagy_search(...)` result and returns the paginated response. + +==- `pagy_searchkick_get_vars(array)` -#### pagy_searchkick_get_vars(array) +This sub-method is similar to the `pagy_get_vars` sub-method, but it is called only by the `pagy_searchkick` method. (see the [pagy_get_vars doc](/docs/api/backend.md#pagy-get-vars-collection-vars)). -This sub-method is similar to the `pagy_get_vars` sub-method, but it is called only by the `pagy_searchkick` method. (see the [pagy_get_vars doc](../api/backend.md#pagy_get_varscollection-vars)). +=== diff --git a/docs/extras/semantic.md b/docs/extras/semantic.md index 5855b0b43..f6fbd3163 100644 --- a/docs/extras/semantic.md +++ b/docs/extras/semantic.md @@ -1,5 +1,8 @@ --- title: Semantic +categories: +- Frontend +- Extras --- # Semantic UI Extra @@ -7,22 +10,19 @@ This extra adds 3 nav helpers for Semantic UI CSS [pagination component](https:/ ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/semantic' ``` +||| -Render the navigation links in some view... -with a fast helper: - +||| View ```erb <%== pagy_semantic_nav(@pagy, ...) %> <%== pagy_semantic_nav_js(@pagy, ...) %> <%== pagy_semantic_combo_nav_js(@pagy, ...) %> ``` +||| ## Files @@ -32,16 +32,18 @@ with a fast helper: This extra adds 3 nav helpers to the `Pagy::Frontend` module. You can customize them by direct overriding in your own view helper. -### pagy_semantic_nav(pagy) +==- `pagy_semantic_nav(pagy)` This method is the same as the `pagy_nav`, but customized for Semantic UI. -See the [pagy_nav(pagy, ...)](../api/frontend.md#pagy_navpagy-) documentation. +See: [pagy_nav(pagy, ...)](/docs/api/frontend.md#pagy-nav-pagy). + +==- `pagy_semantic_nav_js(pagy, ...)` -### pagy_semantic_nav_js(pagy, ...) +See: [Javascript Navs](/docs/api/javascript/navs.md). -See the [Javascript Navs](../api/javascript.md#javascript-navs) documentation. +==- `pagy_semantic_combo_nav_js(pagy, ...)` -### pagy_semantic_combo_nav_js(pagy, ...) +See: [Javascript Combo Navs](/docs/api/javascript/combo-navs.md). -See the [Javascript Combo Navs](../api/javascript.md#javascript-combo-navs) documentation. +=== \ No newline at end of file diff --git a/docs/extras/standalone.md b/docs/extras/standalone.md index 14dd4ef01..420305fc4 100644 --- a/docs/extras/standalone.md +++ b/docs/extras/standalone.md @@ -1,9 +1,12 @@ --- title: Standalone +categories: +- Feature +- Extras --- # Standalone Extra -This extra allows you to use pagy completely standalone, i.e. without any request object, nor Rack environment/gem, nor any defined `params` method, even in the irb/rails console without an app (see the [Pagy::Console](../api/console.md) module). +This extra allows you to use pagy completely standalone, i.e. without any request object, nor Rack environment/gem, nor any defined `params` method, even in the irb/rails console without an app (see the [Pagy::Console](/docs/api/console.md) module). You may need it in order to paginate a collection outside of a regular rack request or controller, like in an unconventional API module, or in the irb/rails console or for testing/playing with backend and frontend methods. @@ -13,19 +16,21 @@ This extra will also create a dummy `params` method (if not already defined) in ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/standalone' # optional: set a default url Pagy::DEFAULT[:url] = 'http://www.example.com/subdir' +``` +||| +||| Controller +```ruby # pass a :url variable to work in standalone mode (no need of any request object nor Rack env) -@pagy, @records = pagy(Product.all, url: 'http://www.example.com/subdir', params: {...}) +@pagy, @products = pagy(Product.all, url: 'http://www.example.com/subdir', params: {...}) ``` +||| ## Files @@ -37,14 +42,15 @@ Pagy::DEFAULT[:url] = 'http://www.example.com/subdir' |:---------|:-----------------------------------------|:--------| | `:url` | url string (can be absolute or relative) | `nil` | -You can use the `:params` variable to add params to the final URLs. +You can use the :params variable to add params to the final URLs. ## Methods -### Overridden pagy_url_for +==- Overridden `pagy_url_for` The `standalone` extra overrides the `pagy_url_for` method used internally. If it finds a set `:url` variable it assumes there is no `request` object, so it uses the `:url` variable verbatim to produce the final URL, only adding the query string, composed by merging the `:page` param to the `:params` variable. If there is no `:url` variable set it works like usual, i.e. it uses the rake `request` object to extract the base_url, path from the request, merging the params returned from the `params` controller method, the `:params` variable and the `:page` param to it. -### Dummy params method +==- Dummy `params` method This extra creates a dummy `params` method (if not already defined) in the module where you include the `Pagy::Backend` (usually a controller). The method is called by pagy to retrieve backend variables coming from the request, and expects a hash, so the dummy param method returns an empty hash avoiding an error. +=== \ No newline at end of file diff --git a/docs/extras/support.md b/docs/extras/support.md index 94549cae3..b18a56652 100644 --- a/docs/extras/support.md +++ b/docs/extras/support.md @@ -1,5 +1,8 @@ --- title: Support +categories: +- Feature +- Extras --- # Support Extra @@ -7,13 +10,11 @@ This extra adds support for features like countless or navless pagination, where ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/support' ``` +||| ## Support for alternative pagination types and features @@ -21,32 +22,31 @@ Besides the classic `pagy*_nav` pagination, the `pagy*_nav_js` and the `pagy*_co ### Countless -You can totally avoid one query per render by using the [countless](countless.md) extra. It has a few limitation, but still supports navbar links (see also [Pagy::Countless](../api/countless.md) for more details). +You can totally avoid one query per render by using the [countless](countless.md) extra. It has a few limitation, but still supports navbar links (see also [Pagy::Countless](/docs/api/countless.md) for more details). ### Navless/incremental If you don't need the navbar you can just set the `:size` variable to an empty value and the page links will be skipped from the rendering. That works with `Pagy` and `Pagy:Countless` instances. All the `*nav` helpers will render only the `prev` and `next` links/buttons, allowing for a manual incremental pagination. -You can also use the `pagy_prev_link` and `pagy_next_link` helpers provided by this extra, mostly useful if you also use the `countless` extra. +You can also use the [`pagy_prev_link`](https://github.com/ddnexus/pagy/blob/dca8669a10cb3be13e053fe435301c22cc64406f/lib/pagy/extras/navs.rb#L46) and [`pagy_next_link`](https://github.com/ddnexus/pagy/blob/dca8669a10cb3be13e053fe435301c22cc64406f/lib/pagy/extras/navs.rb#L54) helpers provided by the [navs extra](navs), mostly useful if you also use the `countless` extra. Here is a basic example that uses `pagy_countless` (saving one query per render): -`pagy.rb` initializer: - +||| pagy.rb (initializer) ```ruby require 'pagy/extras/countless' ``` +||| -`incremental` controller action: - +||| incremental (controller action) ```ruby def incremental @pagy, @records = pagy_countless(Product.all, link_extra: 'data-remote="true"') end ``` +||| -`incremental.html.erb` template: - +||| incremental.html.erb (template) ```erb
                    @@ -61,9 +61,9 @@ end ``` +||| -`_page_items.html.erb` partial shared for AJAX and non-AJAX rendering: - +||| _page_items.html.erb (partial) ```erb <% @records.each do |record| %> @@ -72,19 +72,20 @@ end <% end %> ``` +||| -`_next_link.html.erb` partial shared for AJAX and non-AJAX rendering: - +||| _next_link.html.erb (partial) ```erb <%== pagy_next_link(@pagy, text: 'More...', link_extra: 'id="next_link"') %> ``` +||| -`incremental.js.erb` javascript template: - +||| incremental.js.erb (javascript template) ```erb $('#records_table').append("<%= j(render 'page_items')%>"); $('#div_next_link').html("<%= j(render 'next_link') %>"); ``` +||| ### Auto-incremental @@ -99,12 +100,15 @@ For a plain old javascript example, we are going to use the same [Incremental](# **1**. Hide the link in `_next_link.html.erb` by adding a style attribute: +||| _next_link.html.erb (partial) ```erb <%== pagy_next_link(@pagy, text: 'More...', link_extra: 'id="next_link" style="display: none;"') %> ``` +||| **2**. Add a javascript that will click the link when the listing-bottom appears in the viewport on load/resize/scroll. It will keep the page filled with results, one page at a time: +||| Javascript ```js var loadNextPage = function(){ if ($('#next_link').data("loading")){ return } // prevent multiple loading @@ -120,6 +124,7 @@ window.addEventListener('resize', loadNextPage); window.addEventListener('scroll', loadNextPage); window.addEventListener('load', loadNextPage); ``` +||| ### Circular/Infinite @@ -129,44 +134,50 @@ For example, it is often used to show a few suggestions of "similar products" in For example: +||| Controller (action) ```ruby @pagy, @suggestions = pagy_countless(Product.all, count: 25, items: 5, cycle: true) ``` +||| Passing a forced `:count` of 25 will generate 5 pages of 5 items each that will always have a next page. Regardless the actual collection count, you will show the first 25 items of the collection, looping in stripes of 5 items each. You may want to combine it with something like: +||| View ```erb <%== pagy_next_link(@pagy, text: 'More...') %> ``` +||| ## Methods -### pagy_prev_url(pagy) +==- `pagy_prev_url(pagy)` Returns the url for the previous page. Useful to build minimalistic UIs that don't use nav bar links (e.g. `countless` extra). -### pagy_next_url(pagy) +==- `pagy_next_url(pagy)` Returns the url for the next page. Useful to build minimalistic UIs that don't use nav bar links (e.g. `countless` extra). -### pagy_prev_link(pagy, text: pagy_t('pagy.nav.prev'), link_extra: "") +==- `pagy_prev_link(pagy, text: pagy_t('pagy.nav.prev'), link_extra: "")` Returns the `a` tag for the previous page. It is the same prev link string which is part of the `pagy_nav` helper. Useful to build minimalistic helpers UIs that don't use nav bar links (e.g. `countless` extra). -### pagy_next_link(pagy, text: pagy_t('pagy.nav.next'), link_extra: "") +==- `pagy_next_link(pagy, text: pagy_t('pagy.nav.next'), link_extra: "")` Returns the `a` tag for the next page. It is the same next link string which is part of the `pagy_nav` helper. Useful to build minimalistic helpers UIs that don't use nav bar links (e.g. `countless` extra). -### pagy_prev_link_tag(pagy) +==- `pagy_prev_link_tag(pagy)` Returns the `link` tag for the previous page. Useful to add the link tag to the HTML `head`. -### pagy_next_link_tag(pagy) +==- `pagy_next_link_tag(pagy)` Returns the `link` tag for the next page. Useful to add the link tag to the HTML `head`. + +=== diff --git a/docs/extras/tailwind.md b/docs/extras/tailwind.md index b0218e1c7..ce17f4405 100644 --- a/docs/extras/tailwind.md +++ b/docs/extras/tailwind.md @@ -1,5 +1,8 @@ --- title: Tailwind +categories: +- Frontend +- Extras --- # Tailwind Extra Styles @@ -11,6 +14,7 @@ See the [navs](navs.md) extra if you use `pagy_nav_js` or `pagy_combo_nav_js`. Copy and customize the following basic rules to apply the styles to the pagy CSS classes: +||| SCSS rules ```scss @import "~tailwindcss/base"; @@ -85,3 +89,4 @@ Copy and customize the following basic rules to apply the styles to the pagy CSS @apply text-gray-400 cursor-default; } ``` +||| diff --git a/docs/extras/trim.md b/docs/extras/trim.md index 1f70e58d6..c9bbbfe1c 100644 --- a/docs/extras/trim.md +++ b/docs/extras/trim.md @@ -1,5 +1,8 @@ --- title: Trim +categories: +- Feature +- Extras --- # Trim Extra @@ -9,25 +12,26 @@ This extra is needed only for very specific scenarios, for example if you need t ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: +||| pagy.rb (initializer) ```ruby -require 'pagy/extras/trim' - -# it will trim without any further configuration, +require 'pagy/extras/trim' # it will trim without any further configuration, +``` +||| +||| Controller (and initializer) +```ruby # you can disable it explicitly for specific requests @pagy, @records = pagy(Product.all, trim_extra: false) # or... -# disable it by default (opt-in) +# disable it by default (opt-in) in pagy.rb initializer: Pagy::DEFAULT[:trim_extra] = false # default true # in this case you have to enable it explicitly when you want the trimming @pagy, @records = pagy(Product.all, trim_extra: true) ``` +||| ## Files @@ -47,14 +51,16 @@ You can set the `Pagy::DEFAULT[:trim_extra]` default to `false` if you want to e The `trim` extra overrides the `pagy_link_proc` method in the `Pagy::Frontend` module. -### pagy_link_proc(pagy, link_extra='') +==- `pagy_link_proc(pagy, link_extra='')` This method overrides the `pagy_link_proc` using the `pagy_trim` to process the link to the first page. -### pagy_trim(pagy, link) +==- `pagy_trim(pagy, link)` Sub-method called only by the `pagy_link_proc` method, it removes the the `:page_param` param from the first page link (usually `page=1`). -Override this method if you are [customizing the urls](../how-to.md#customize-the-url). +Override this method if you are [customizing the urls](/docs/how-to.md#customize-the-url). If you use a `pagy_*nav_js` helper you should customize also the `Pagy.trim` javascript function. + +=== \ No newline at end of file diff --git a/docs/extras/uikit.md b/docs/extras/uikit.md index 53ec006c4..523060e72 100644 --- a/docs/extras/uikit.md +++ b/docs/extras/uikit.md @@ -1,5 +1,7 @@ --- title: UIkit +image: none +category: Frontend --- # UIkit Extra @@ -7,28 +9,29 @@ This extra adds nav helpers and templates for the UIkit [pagination component](h ## Synopsis -See [extras](../extras.md) for general usage info. - -In the `pagy.rb` initializer: +||| pagy.rb (initializer) ```ruby require 'pagy/extras/uikit' ``` +||| -Render the navigation links in some view... -with a fast helper: - +||| View ```erb +<-- Nav Helpers: --> <%== pagy_uikit_nav(@pagy, ...) %> <%== pagy_uikit_nav_js(@pagy, ...) %> <%== pagy_uikit_combo_nav_js(@pagy, ...) %> ``` +||| -or with a template: +||| Template -```erb +```rb +# or you can render with a template <%== render partial: 'pagy/uikit_nav', locals: {pagy: @pagy} %> ``` +||| ## Files @@ -39,24 +42,26 @@ or with a template: ## Methods -This extra adds nav helper to the `Pagy::Frontend` module. You can customize it by direct overriding in your own view helper. +This extra adds the above nav helpers to the `Pagy::Frontend` module. You can customize it by direct overriding in your own view helper. -### pagy_uikit_nav(pagy) +==- `pagy_uikit_nav(pagy)` This method is the same as the `pagy_nav`, but customized for UIkit. -See the [pagy_nav(pagy, ...)](../api/frontend.md#pagy_navpagy-) documentation. +See the [pagy_nav(pagy, ...)](/docs/api/frontend.md#pagy-nav-pagy) documentation. -The `uikit_nav.*` templates produce the same output, and can be used as an easier (but slower) starting point to override it. See [How to use templates](../how-to.md#use-templates). +The `uikit_nav.*` templates produce the same output, and can be used as an easier (but slower) starting point to override it. See [How to use templates](/docs/how-to.md#use-templates). -### pagy_uikit_nav_js(pagy, ...) +==- `pagy_uikit_nav_js(pagy, ...)` -See the [Javascript Navs](../api/javascript.md#javascript-navs) documentation +See the [Javascript Navs](/docs/api/javascript/navs.md) documentation -### pagy_uikit_combo_nav_js(pagy, ...) +=== `pagy_uikit_combo_nav_js(pagy, ...)` -See the [Javascript Combo Navs](../api/javascript.md#javascript-combo-navs) documentation. +See the [Javascript Combo Navs](/docs/api/javascript/combo-navs.md) documentation. Here is an example: -![uikit_combo_nav_js](../assets/images/uikit_combo_nav_js-g.png) +![uikit_combo_nav_js](/docs/assets/images/uikit_combo_nav_js-g.png) + +=== diff --git a/docs/how-to.md b/docs/how-to.md index 9d4a25ae0..d6adf8faa 100644 --- a/docs/how-to.md +++ b/docs/how-to.md @@ -1,174 +1,23 @@ --- title: How To +order: 1 +icon: tools-24 --- # How To This page contains the practical tips and examples to get the job done with Pagy. If there is something missing, or some topic that you think should be added, fixed or explained better, please open an issue. -## Quick Start - -### Play with it - -If you want to just play with Pagy before using it in your own app, you have 2 alternatives: - -1. Standalone Application - - Ensure to have `rack` installed (or `gem install rack`) - - [Use the pagy_standalone_app.ru](https://github.com/ddnexus/pagy/blob/master/apps/pagy_standalone_app.ru) (usage notes in the file) -2. Pagy Console - - Just `gem install pagy` - - [Use it fully without any app](api/console.md) - -### Use it in your app - -1. Install Pagy: - - - If you use Bundler, add the gem in the Gemfile, optionally avoiding the next major version with breaking changes (see [RubyGem Specifiers](http://guides.rubygems.org/patterns/#pessimistic-version-constraint)): - - ```ruby - gem 'pagy', '~> 5.10' # omit patch digit - ``` - - - If you don't use Bundler, install and require the Pagy gem: - - ```bash - gem install pagy - ``` - - ```ruby - require 'pagy' - ``` - -2. Add the [pagy.rb](https://github.com/ddnexus/pagy/blob/master/lib/config/pagy.rb) configuration file to your app: - - - If you use Rails, put it into the `config/initializers` dir - - - if you don't use Rails it doesn't matter where you put it, as long as you require it when your app starts - -3. Include the backend in some controller (e.g. `ApplicationController` in Rails): - - ```ruby - include Pagy::Backend - ``` - -4. Use the `pagy` method in some action: - - ```ruby - @pagy, @records = pagy(Product.some_scope) - ``` - -5. Render the pagination: - - - Option A: if your app renders the views server-side: - - 1. Include the frontend in some helper (e.g. `ApplicationHelper` in Rails): - - ```ruby - include Pagy::Frontend - ``` - - 2. Render the navigation links in some view: - - - with a fast helper (also styled for [bootstrap](extras/bootstrap.md), [bulma](extras/bulma.md), [foundation](extras/foundation.md), [materialize](extras/materialize.md), [semantic](extras/semantic.md), [uikit](extras/uikit.md) and available in different flavors (static, responsive, compact, etc.) - - ```erb - <%# Note the double equals sign "==" which marks the output as trusted and html safe: %> - <%== pagy_nav(@pagy) %> - ``` - - - or with an easy customizable template: - - ```erb - <%== render partial: 'pagy/nav', locals: {pagy: @pagy} %> - ``` - - - Option B: if your app renders the views with a javascript framework (e.g. Vue.js, react.js, ...), you don't need the `include Pagy::Frontend` in `ApplicationHelper`, instead: - - 1. require the [metadata extra](extras/metadata.md) by uncommenting the following line in your [pagy.rb](https://github.com/ddnexus/pagy/blob/master/lib/config/pagy.rb) file: - - ```ruby - require 'pagy/extras/metadata' - ``` - - 2. add the metadata to your JSON response: - - ```ruby - render json: { data: @records, - pagy: pagy_metadata(@pagy, ...) } - ``` - - - Option C: if your app is an API service consumed by some client and doesn't provide any UI on its own, you don't need the `include Pagy::Frontend` in `ApplicationHelper`, instead: - - 1. require the [headers extra](extras/headers.md) by uncommenting it in your [pagy.rb](https://github.com/ddnexus/pagy/blob/master/lib/config/pagy.rb) file: - - ```ruby - require 'pagy/extras/headers' - ``` - - 2. add the pagination headers to your responses: - - ```ruby - after_action { pagy_headers_merge(@pagy) if @pagy } - ``` - - 3. render your JSON response as usual: - - ```ruby - render json: { data: @records } - ``` - -## Configure Pagy - -Unlike the other pagination gems, Pagy is very modular so it doesn't load nor execute unnecessary code in your app. Every feature that is not strictly needed for the basic pagination can be explicitly required in your initializer file. - -Basic pagination of ActiveRecord collections should work out of the box for most Rack based apps (e.g. Rails) even without configuring/requiring anything, however you can tweak all its features and all the extras by loading a `pagy.rb` initializer file. - -You can copy the comprehensive and annotated [pagy.rb](https://github.com/ddnexus/pagy/blob/master/lib/config/pagy.rb) initializer and uncomment and edit what you may need. The file contains also all the relevant documentation links. - -Besides, you can further override the `Pagy::DEFAULT` variables per instance by explicitly passing any variable to the `Pagy*.new` constructor or to any `pagy*` controller method. - -## Use pagy in any environment - -- Pagy 4.0+ runs on ruby 2.5+ - -Notice: Older versions run on ruby 1.9+ or jruby 1.7+ till ruby <2.5 - -### Rack environments - -Pagy works out of the box in a web app assuming that: - -- You are using a `Rack` based framework (Rails, Sinatra, Padrino, etc.) -- The collection to paginate is an ORM collection (e.g. ActiveRecord scope) or other collections supported by some backend extra ([array](extras/array.md), [elasticsearch_rails](extras/elasticsearch_rails.md), [searchkick](extras/searchkick.md), [meilisearch](extras/meilisearch.md), ...) -- The controller where you include `Pagy::Backend` responds to a `params` method -- The view where you include `Pagy::Frontend` responds to a `request` method returning a `Rack::Request` instance. - -### Non Rack environments - -- Require the [standalone extra](extras/standalone.md), and pass a `:url` variable and you can use it without Rack in your app or exotic API, with or without the other extras you might need. You can even use every feature/helper right in the irb/rails console. -- Besides Rack the other assumptions above apply - -### Irb/rails console environment - -Standard pagination requires controller, model, view and request to work, however you don't have to satisfy all that requirements in order to get any helper working in the irb/rails console. Just use the [Pagy::Console](api/console.md) and you can try any feature right away, even without any app nor configuration. - -### Any other environment - -Pagy can also work in any other scenario assuming that: - -- If your framework doesn't have a `params` method you can use the [standalone extra](extras/standalone.md) or you may need to define the `params` method or override the `pagy_get_vars` (which uses the `params` method) in your controller -- If the collection you are paginating doesn't respond to `offset` and `limit` and is not yet supported by any extra, you may need to override the `pagy_get_items` method in your controller (to get the items out of your specific collection) -- If your framework doesn't have a `request` method you can use the [standalone extra](extras/standalone.md) or you may need to override the `pagy_url_for` (which uses `Rack` and `request`) in your view - -**Notice**: the total overriding you may need is usually just a handful of lines at worse, and it doesn't need monkey patching or writing any sub-class or module. - ## Control the items per page You can control the items per page with the `items` variable. (Default `20`) -You can set its default in the `pagy.rb` initializer _(see [How to configure pagy](#configure-pagy))_. For example: - +You can set its default in the `pagy.rb` initializer (see [How to configure pagy](/quick-start.md#configure)). For example: + +||| pagy.rb (initializer) ```ruby Pagy::DEFAULT[:items] = 25 ``` +||| You can also pass it as an instance variable to the `Pagy.new` method or to the `pagy` controller method: @@ -191,9 +40,7 @@ As usual you can set the `:size` variable as a global default by using the `Pagy The navigation links will contain the number of pages set in the variables: -`size[0]`...`size[1]` current page `size[2]`...`size[3]` - -For example: +`size[0]`...`size[1]` current page `size[2]`...`size[3]` - e.g.: ```ruby pagy = Pagy.new count:1000, page: 10, size: [3,4,4,3] # etc @@ -209,8 +56,6 @@ You can easily try different options (also asymmetrical) in a console by changin If you want to skip the generation of the page links, just set the `:size` variable to an empty array: -For example: - ```ruby pagy = Pagy.new count:1000, size: [] # etc pagy.series @@ -225,9 +70,11 @@ If changing the `:size` is not enough for your requirements (e.g. if you need to You don't need to explicitly pass the page number to the `pagy` method, because it is pulled in by the `pagy_get_vars` (which is called internally by the `pagy` method). However you can force a `page` number by just passing it to the `pagy` method. For example: +||| controller ```ruby -@pagy, @records = pagy(my_scope, page: 3) +@pagy, @records = pagy(my_scope, page: 3) # forces page. ``` +||| That will explicitly set the `:page` variable, overriding the default behavior (which usually pulls the page number from the `params[:page]`). @@ -255,47 +102,92 @@ Pagy::DEFAULT[:link_extra] = 'data-remote="true" class="my-class"' # or directly to the constructor pagy = Pagy.new(count: 1000, link_extra: 'data-remote="true" class="my-class"') + +# or from a view: e.g.: +<%== pagy_bootstrap_nav(@pagy, link_extra: 'data-action="hello#world"') %> ``` -**IMPORTANT**: For performance reasons, the `:link_extra` variable must be a string formatted as a valid HTML attribute/value pairs. That string will get inserted verbatim in the HTML of the link. _(see more advanced details in the [pagy_link_proc documentation](api/frontend.md#pagy_link_procpagy-link_extra))_ +!!!primary `link_extra`: must be valid HTML +For performance reasons, the `:link_extra` variable must be a string formatted as a valid HTML attribute/value pairs. That string will get inserted verbatim in the HTML of the link. _(see more advanced details in the [pagy_link_proc documentation](api/frontend.md#pagy-link-proc-pagy-link-extra))_ +!!! ## Customize the request path -Let's say you are using something like a [Turbo frame](https://turbo.hotwired.dev/reference/frames) and you are loading a collection with pagination on a page where you want the pagination links to point to a different path. For example, if you are on a page like `/dashboard` and you have a collection of `foos` in a Turbo frame. By default Pagy will use `request.path` when constructing pagination links, which will results in links like `/dashboard?page=2`. - -If you'd like to override the path so that the links point to a different endpoint than the current page's `request.path`, you can pass in the `request_path` variable: - -```ruby -@pagy, @records = pagy(my_scope, vars { request_path: '/foos' }) ++++ Good +!!!success Request Path Passed In: +```rb +# dashboard_controller +def index + @pagy_foos, @foos = pagy(Foo.all, request_path: '/foos') + @pagy_bars, @foos = pagy(Bar.all, request_path: '/bars') +end ``` - -This will result in pagination links like `/foos?page=2` instead of `/dashboard?page=2`. +```erb +<-- /dashboard.html.erb --> + <%== pagy_nav(@pagy_foos) %> + <%== pagy_nav(@pagy_bars) %> +<-- Pagination links of `/foos?page=2` instead of `/dashboard?page=2` --> +<-- Pagination links of `/bars?page=2` etc. --> +<-- Success --> +``` +!!! ++++ Bad +!!!danger No Path Passed In +Path customization typically required when rendering multiple `@pagy` instances in the same view. e.g.: +```rb +# dashboard_controller +def index + @pagy_foos, @foos = pagy(Foo.all) + @pagy_bars, @foos = pagy(Bars.all) +end +``` +```erb +<-- /dashboard.html.erb --> +<% turbo_frame "foos" do %> + <%== pagy_nav(@pagy_foos) %> +<% end%> +<% turbo_frame "bars" do %> + <%== pagy_nav(@pagy_bars) %> +<% end%> + <-- Pagination links will be `/dashboard?page=2` --> + <-- We don't want that! --> +``` +!!! ++++ ## Customize the params -When you need to add some custom param or alter the params embedded in the URLs of the page links, you can set the variable `:params` to a `Hash` of params to add to the URL, or a `Proc` that can edit/add/delete the request params. +When you need to add some custom param or alter the params embedded in the URLs of the page links, you can set the variable `:params` to a `Hash` of params to add to the URL, or a `Proc` that can edit/add/delete the request params. If it is a `Proc` it will receive the **key-stringified** `params` hash complete with the `page` param and it should return a possibly modified version of it. An example using `except` and `merge!`: +||| controller ```ruby @pagy, @records = pagy(collection, params: ->(params){ params.except('not_useful').merge!('custom' => 'useful') }) ``` +||| -You can also use the `:fragment` variable to add a fragment the URLs of the pages. For example: +You can also use the `:fragment` variable to add a fragment the URLs of the pages: +||| controller ```ruby @pagy, @records = pagy(collection, fragment: '#your-fragment') ``` +||| -**IMPORTANT**: For performance reasons the `:fragment` string must include the `"#"`. +!!!primary +For performance reasons the `:fragment` string must include the `"#"`. +!!! ## Customize the URL When you need something more radical with the URL than just massaging the params, you should override the `pagy_url_for` right in your helper. -_Notice: if you are also using the [trim extra](extras/trim.md) you should also override the [pagy_trim](extras/trim#pagy_trimpagy-link) method or the `Pagy.trim` javascript function._ +!!!warning Override `pagy_trim` if using Trim Extra +If you are also using the [trim extra](extras/trim.md) you should also override the [pagy_trim](extras/trim#pagy-trim-pagy-link) method or the `Pagy.trim` javascript function. +!!! The following are a couple of examples. @@ -303,24 +195,30 @@ The following are a couple of examples. The following is a Rails-specific alternative that supports fancy-routes (e.g. `get 'your_route(/:page)' ...` that produce paths like `your_route/23` instead of `your_route?page=23`): +||| controller ```ruby def pagy_url_for(pagy, page, absolute: false, html_escaped: false) # it was (page, pagy) in previous versions params = request.query_parameters.merge(pagy.vars[:page_param] => page, only_path: !absolute ) html_escaped ? url_for(params).gsub('&', '&') : url_for(params) end ``` +||| -Notice that this overridden method is quite slower than the original because it passes through the rails helpers. However that gets mitigated by the internal usage of `pagy_link_proc` which calls the method only once even in the presence of many pages. +!!!warning Performance affected! +The above overridden method is quite slower than the original because it passes through the rails helpers. However that gets mitigated by the internal usage of `pagy_link_proc` which calls the method only once even in the presence of many pages. +!!! #### POST with page links You may need to POST a very complex search form that would generate an URL potentially too long to be handled by a browser, and your page links may need to use POST and not GET. In that case you can try this simple solution: +||| controller ```ruby def pagy_url_for(_pagy, page, **_) # it was (page, pagy) in previous versions page end ``` +||| That would produce links that look like e.g. `2`. Then you can attach a javascript "click" event on the page links. When triggered, the `href` content (i.e. the page number) should get copied to a hidden `"page"` input and the form should be posted. @@ -336,39 +234,49 @@ You have a few ways to do that: 1. you can override the `pagy_get_vars` method in your controller, adding the dynamically set `:i18n_key`. For example with ActiveRecord (mostly useful with the [i18n extra](extras/i18n.md) or if you copy over the AR keys into the pagy dictionary): - ```ruby - def pagy_get_vars(collection, vars) +||| controller + ```ruby + def pagy_get_vars(collection, vars) { count: ..., page: ..., i18n_key: "activerecord.models.#{collection.model_name.i18n_key}" }.merge!(vars) - end - ``` + end + ``` +||| 2. you can set the `:i18n_key` variable, either globally using the `Pagy::DEFAULT` hash or per instance with the `Pagy.new` method or with the `pagy` controller method: - ```ruby +||| initializer (pagy.rb) +```ruby # all the Pagy instances will have the default Pagy::DEFAULT[:i18n_key] = 'activerecord.models.product' # or single Pagy instance @pagy, @record = pagy(my_scope, i18n_key: 'activerecord.models.product' ) - ``` +``` +||| - or passing it as an optional keyword argument to the helper: + or passing it as an optional keyword argument to the helper: - ```erb +||| View +```erb <%== pagy_info(@pagy, i18n_key: 'activerecord.models.product') %> <%== pagy_items_selector_js(@pagy, i18n_key: 'activerecord.models.product') %> - ``` +``` +||| 3. you can override entirely the `:item_name` by passing an already pluralized string directly to the helper call: - ```erb +||| View +```erb <%== pagy_info(@pagy, item_name: 'Product'.pluralize(@pagy.count)) %> <%== pagy_items_selector_js(@pagy, item_name: 'Product'.pluralize(@pagy.count)) %> - ``` +``` +||| -**Notice**: The variables passed to a Pagy object have the precedence over the variables returned by the `pagy_get_vars`. The fastest way to set the `i18n_key` is passing a literal string to the `pagy` method, the most convenient way is using `pagy_get_vars`, the most flexible way is passing a pluralized string to the helper. +!!!warning Parameters have precedence +The variables passed to a Pagy object have the precedence over the variables returned by the `pagy_get_vars`. The fastest way to set the `i18n_key` is passing a literal string to the `pagy` method, the most convenient way is using `pagy_get_vars`, the most flexible way is passing a pluralized string to the helper. +!!! ## Customize CSS styles @@ -392,7 +300,7 @@ Also, consider that you can use `prepend` if you need to do it globally: ```ruby module MyOverridingModule def pagy_any_method - ... + ... super ... end @@ -414,25 +322,32 @@ Pagy works out of the box with `ActiveRecord` collections. See also the [arel ex Do it in 2 steps: first get the page of records without decoration, and then apply the decoration to it. For example: +||| controller ```ruby @pagy, records = pagy(Post.all) @decorated_records = records.decorate # or YourDecorator.method(records) whatever works ``` +||| + ### Custom count for custom scopes Your scope might become complex and the default pagy `collection.count(:all)` may not get the actual count. In that case you can get the right count with some custom statement, and pass it to `pagy`: +||| controller ```ruby custom_scope = ... custom_count = ... @pagy, @records = pagy(custom_scope, count: custom_count) ``` +||| -**Notice**: pagy will efficiently skip its internal count query and will just use the passed `:count` variable +!!!primary Internal `count` skipped +Pagy will efficiently skip its internal count query and will just use the passed `:count` variable +!!! ### Paginate a grouped collection -For better performance of grouped ActiveRecord collection counts, you may want to take a look at the [arel extra](http://ddnexus.github.io/pagy/extras/arel) extra. +For better performance of grouped ActiveRecord collection counts, you may want to take a look at the [arel extra](http://ddnexus.github.io/pagy/extras/arel). ## Paginate for API clients @@ -450,14 +365,16 @@ In that case you don't need the `Pagy::Frontend` nor any frontend extra. You sho Ransack `result` returns an `ActiveRecord` collection, which can be paginated out of the box. For example: +||| controller ```ruby @q = Person.ransack(params[:q]) @pagy, @people = pagy(@q.result) ``` +||| ## Paginate search framework results -Pagy has a few of extras for gems returning search results: +Pagy has a few of extras for gems returning search results: - [elasticsearch_rails](extras/elasticsearch_rails.md) - [searchkick](extras/searchkick.md) @@ -471,22 +388,24 @@ Use the [calendar extra](extras/calendar.md) that adds pagination filtering by c You can easily wrap your existing pagination with the `pagy_calendar` method. Here are a few examples adding `:year` and `:month` to different existing statements. +||| controller ```ruby # pagy without calendar @pagy, @record = pagy(collection, any_vars: value, ...) # wrapped with pagy_calendar @calendar, @pagy, @records = pagy_calendar(collection, year: {...}, - month: {...}, - pagy: { any_vars: value, ... } ) + month: {...}, + pagy: { any_vars: value, ... } ) # any other backend constructors (e.g. pagy_searchkick) @pagy, @record = pagy_searchkick(pagy_search_args, any_vars: value, ...) # wrapped with pagy_calendar @calendar, @pagy, @records = pagy_calendar(pagy_search_args, year: {...}, - month: {...}, - pagy: { backend: :pagy_searchkick, - any_vars: value, ...} ) + month: {...}, + pagy: { backend: :pagy_searchkick, + any_vars: value, ...} ) ``` +||| Then follow the [calendar extra documentation](extras/calendar.md) for more details. @@ -494,10 +413,12 @@ Then follow the [calendar extra documentation](extras/calendar.md) for more deta With the other pagination gems you cannot paginate a subset of a collection that you got using `offset` and `limit`. With Pagy it is as simple as just adding the `:outset` variable, set to the initial offset. For example: +||| controller ```ruby subset = Product.offset(100).limit(315) @pagy, @paginated_subset = pagy(subset, outset: 100) ``` +||| Assuming the `:items` default of `20`, you will get the pages with the right records you are expecting. The first page from record 101 to 120 of the main collection, and the last page from 401 to 415 of the main collection. Besides the `from` and `to` attribute readers will correctly return the numbers relative to the subset that you are paginating, i.e. from 1 to 20 for the first page and from 301 to 315 for the last page. @@ -505,10 +426,13 @@ Assuming the `:items` default of `20`, you will get the pages with the right rec The `pagy_get_vars` method works out of the box with `ActiveRecord` collections; for other collections (e.g. `mongoid`, etc.) you may need to override it in your controller, usually by simply removing the `:all` argument passed to `count`: +||| controller ```ruby #count = collection.count(:all) count = collection.count ``` +||| + ## Paginate collections with metadata @@ -520,6 +444,7 @@ When your collection is already paginated and contains counts and pagination met As you can see it contains the pagination metadata that you can use to setup the pagination with pagy: +||| controller ```ruby # get the paginated collection tobj = Tmdb::Search.movie("Harry Potter", page: params[:page]) @@ -528,6 +453,7 @@ tobj = Tmdb::Search.movie("Harry Potter", page: params[:page]) # set the paginated collection records @movies = tobj.results ``` +||| ## Paginate Any Collection @@ -553,15 +479,19 @@ paginated = arr[pagy.offset, pagy.items] This is basically what the `pagy` method included in your controller does for you in one go: +||| controller ```ruby -@pagy, @records = pagy(Product.some_scope) +@pagy, @products = pagy(Product.some_scope) ``` +||| Then of course, regardless the kind of collection, you can render the navigation links in your view: +||| view ```erb <%== pagy_nav(@pagy) %> ``` +||| See the [Pagy::Backend source](https://github.com/ddnexus/pagy/blob/master/lib/pagy/backend.rb) and the [Pagy::Backend API documentation](api/backend.md) for more details. @@ -569,11 +499,15 @@ See the [Pagy::Backend source](https://github.com/ddnexus/pagy/blob/master/lib/p These helpers take the Pagy object and return the HTML string with the pagination links, which are wrapped in a `nav` tag and are ready to use in your view. For example: +||| view ```erb <%== pagy_nav(@pagy) %> ``` +||| -**Notice**: the [extras](extras.md) add a few other helpers that you can use the same way, in order to get added features (e.g. bootstrap compatibility, responsiveness, compact layouts, etc.) +!!!primary Extras Provide Added Functionality +the [extras](/categories/extras) add a few other helpers that you can use the same way, in order to get added features (e.g. bootstrap compatibility, responsiveness, compact layouts, etc.) +!!! | Extra | Helpers | |:-------------------------------------|:-----------------------------------------------------------------------------------| @@ -587,7 +521,7 @@ These helpers take the Pagy object and return the HTML string with the paginatio Helpers are the preferred choice (over templates) for their performance. If you need to override a `pagy_nav*` helper you can copy and paste it in your helper and edit it there. It is a simple concatenation of strings with a very simple logic. - Depending on the level of your overriding, you may want to read the [Pagy::Frontend API documentation](api/frontend.md) for complete control over your helpers. +Depending on the level of your overriding, you may want to read the [Pagy::Frontend API documentation](api/frontend.md) for complete control over your helpers. ## Skip single page navs @@ -633,8 +567,11 @@ They produce exactly the same output of the helpers, but since they are slower, If you need to try/compare an unmodified built-in template, you can render it right from the Pagy gem with: ```erb -<%== render file: Pagy.root.join('templates', 'nav.html.erb'), locals: {pagy: @pagy} %> -<%== render file: Pagy.root.join('templates', 'bootstrap_nav.html.erb'), locals: {pagy: @pagy} %> +<%== render file: Pagy.root.join('templates', 'nav.html.erb'), + locals: {pagy: @pagy} %> + +<%== render file: Pagy.root.join('templates', 'bootstrap_nav.html.erb'), + locals: {pagy: @pagy} %> ``` You may want to read also the [Pagy::Frontend API documentation](api/frontend.md) for complete control over your templates. @@ -653,8 +590,9 @@ Depending on the nature of the app, a possible cheap solution would be caching t Pagy gets the collection count through its `pagy_get_vars` method, so you can override it in your controller. Here is an example using the rails cache: +||| controller ```ruby -# in your controller: override the pagy_get_vars method so it will call your cache_count method +# override the pagy_get_vars method so it will call your cache_count method def pagy_get_vars(collection, vars) vars[:count] ||= cache_count(collection) vars[:page] ||= params[ vars[:page_param] || Pagy::DEFAULT[:page_param] ] @@ -665,14 +603,19 @@ end def cache_count(collection) cache_key = "pagy-#{collection.model.name}:#{collection.to_sql}" Rails.cache.fetch(cache_key, expires_in: 20 * 60) do - collection.count(:all) + collection.count(:all) end end +``` +||| -# in your model: reset the cache when the model changes (you may omit the callbacks if your DB is static) +||| model +```ruby +# reset the cache when the model changes (you may omit the callbacks if your DB is static) after_create { Rails.cache.delete_matched /^pagy-#{self.class.name}:/} after_destroy { Rails.cache.delete_matched /^pagy-#{self.class.name}:/} ``` +||| That may work very well with static (or almost static) DBs, where there is not much writing and mostly reading. Less so with more DB writing, and probably not particularly useful with a DB in constant change. @@ -684,7 +627,7 @@ When the count caching is not an option, you may want to use the [countless extr You can trigger ajax render in rails by [customizing the link attributes](#customize-the-link-attributes). -See also [Using AJAX](api/javascript.md#using-ajax). +See also [Using AJAX](api/javascript/ajax.md#using-ajax). ## Maximize Performance @@ -704,6 +647,10 @@ If you don't have strict requirements but still need to give the user total feed If your requirements allow to use the `countless` extra (minimal or automatic UI) you can save one query per page, and drastically boost the efficiency eliminating the nav info and almost all the UI. Take a look at the examples in the [support extra](extras/support.md). +### Consider the Arel extra and/or the fast_page gem + +You can improve the performance for [grouped collections](#paginate-a-grouped-collection) with the [arel extra](http://ddnexus.github.io/pagy/extras/arel), and queries on big data with [fast_page](https://github.com/planetscale/fast_page#pagy). + ## Ignore Brakeman UnescapedOutputs false positives warnings Pagy output html safe HTML, however, being an agnostic pagination gem it does not use the specific `html_safe` rails helper on its output. That is noted by the [Brakeman](https://github.com/presidentbeef/brakeman) gem, that will raise a warning. @@ -724,8 +671,8 @@ Here are a few options for manually handling the error in apps: - Rescue and render a 404 - Rescue and redirect to the last known page (Notice: the [overflow extra](extras/overflow.md) provides the same behavior without redirecting) +||| controller ```ruby - # in a controller rescue_from Pagy::OverflowError, with: :redirect_to_last_page private @@ -734,5 +681,8 @@ Here are a few options for manually handling the error in apps: redirect_to url_for(page: exception.pagy.last), notice: "Page ##{params[:page]} is overflowing. Showing page #{exception.pagy.last} instead." end ``` +||| -**WARNING**: All Pagy exceptions are subclasses of `ArgumentError`, so if you need to `rescue_from ArgumentError, ...` along with `rescue_from Pagy::OverflowError, ...` then the `Pagy::OverflowError` line should go BEFORE the `ArgumentError` line or it will never get rescued. +!!!warning Rescue from `Pagy::OverflowError` first +All Pagy exceptions are subclasses of `ArgumentError`, so if you need to `rescue_from ArgumentError, ...` along with `rescue_from Pagy::OverflowError, ...` then the `Pagy::OverflowError` line should go BEFORE the `ArgumentError` line or it will never get rescued. +!!! diff --git a/docs/index.yml b/docs/index.yml new file mode 100644 index 000000000..8b2c34e47 --- /dev/null +++ b/docs/index.yml @@ -0,0 +1,3 @@ +icon: book-24 +label: Documentation +expanded: true diff --git a/docs/migration-guide.md b/docs/migration-guide.md index b7cc21dd4..8f0e0d15c 100644 --- a/docs/migration-guide.md +++ b/docs/migration-guide.md @@ -1,11 +1,13 @@ --- -title: Migration Guide +order: 2 +icon: paper-airplane-24 +title: Migrate from other gems --- -# Migrate WillPaginate and Kaminari +# Migrate WillPaginate/Kaminari This page tries to cover most of the standard changes you will need to make in order to to migrate from a legacy pagination, however, if the legacy pagination is highly customized you may need more digging into the Pagy documentation. -Feel free to [ask on Gitter](https://gitter.im/ruby-pagy/Lobby) if you need more assistance. +Feel free to [ask via Github Discussion](https://github.com/ddnexus/pagy/discussions) if you need help. ## Steps @@ -13,7 +15,7 @@ The Pagy API is quite different from other pagination gems, so there is not alwa 1. Removing the legacy code, trying to convert the statements that have a direct relation with Pagy 2. Running the app so to raise exceptions in order to find legacy code that may still be in place -3. When the app runs without errors, adjusting the pagination to look and work as before: just many times faster and using many times less memory ;) +3. When the app runs without errors, adjusting the pagination to look and work as before: just many times faster and using many times less memory 😀 ### Removing the old code @@ -22,7 +24,9 @@ In this step you will search statements from legacy pagination gems, remove them - If it makes sense, you should add the equivalent Pagy statement and remove the legacy statement(s). - If it doesn't make sense, then just remove the legacy statement. -**Notice:** Don't worry about missing something in this step: if anything wont work as before you can fix it later in the process. +!!!primary Don't stress if you miss +Don't worry about missing something in this step: if anything won't work as before you can fix it later in the process. +!!! #### Preparation @@ -39,13 +43,13 @@ Search for the class name of the pagination gem to migrate from, for example `Wi For example, the following configuration are equivalent: +||| initializers + ```ruby WillPaginate.per_page = 10 WillPaginate::ViewHelpers.pagination_options[:inner_window] = 4 WillPaginate::ViewHelpers.pagination_options[:outer_window] = 5 -``` -```ruby Kaminari.configure do |config| config.max_per_page = 10 config.window = 4 @@ -53,29 +57,30 @@ Kaminari.configure do |config| #config.left = 0 #config.right = 0 end -``` -```ruby Pagy::DEFAULT[:items] = 10 Pagy::DEFAULT[:size] = [5,4,4,5] ``` +||| -Remove all the legacy settings of the old gem(s) and uncomment and edit the new settings in the `pagy.rb` initializer _(see [How to configure pagy](how-to.md#configure-pagy))_. +Remove all the legacy settings of the old gem(s) and uncomment and edit the new settings in the `pagy.rb` initializer _(see [How to configure pagy](/quick-start.md#configure). #### Cleanup the Models -One of the most noticeable difference between the legacy gems and Pagy is that Pagy doesn't mess at all with the models (read the reasons [here](index.md#stay-away-from-the-models)). +One of the most noticeable difference between the legacy gems and Pagy is that Pagy doesn't mess at all with the models (read the reasons [here](/index.md#stay-away-from-the-models)). The other gems are careless about adding methods, scopes, and even configuration settings to them, so you will find different kinds of statements scattered around in your models. You should remove them all and eventually add the equivalent code where it makes sense to Pagy, which of course _is absolutely not_ in the models. For example, you may want to search for keywords like `per_page`, `per` and such, which are actually configuration settings. They should either go into the `pagy.rb` initializer if they are global to the app, or into the specific `pagy` call in the controller if they are specific to an action. -If the app used the `page` scope in some of its methods or scopes in some model, that should be removed (including removing the argument used to pass the page number to the method/scope), leaving the rest of the scope in place. Search where the app uses the already paginated scope in the controllers, and use the scope in a regular `pagy` statement. For example: +If the app uses the `page` scope in some of its methods or scopes in some model, that should be removed (including removing the argument used to pass the page number to the method/scope), leaving the rest of the scope in place. Search where the app uses the already paginated scope in the controllers, and use the scope in a regular `pagy` statement. For example: +||| Controller ```ruby #@records = Product.paginated_scope(params[:page]) @pagy, @records = pagy(Product.non_paginated_scope) ``` +||| #### Search and replace in the Controllers @@ -83,20 +88,20 @@ In the controllers, the occurrence of statements from legacy pagination should h Search for keywords like `page` and `paginate` statements and use the `pagy` method instead. For example: +||| Controller ```ruby #@records = Product.some_scope.page(params[:page]) #@records = Product.paginate(:page => params[:page]) @pagy, @records = pagy(Product.some_scope) -``` -```ruby #@records = Product.some_scope.page(params[:page]).per(15) #@records = Product.some_scope.page(params[:page]).per_page(15) #@records = Product.paginate(page: params[:page], per_page: 15) @pagy, @records = pagy(Product.some_scope, items: 15) ``` +||| #### Search and replace in the Views @@ -104,12 +109,14 @@ Also in the views, the occurrence of statements from legacy pagination should ha Search for keywords like `will_paginate` and `paginate` statement and use one of the `pagy_nav` methods. For example: +||| View ```erb <%= will_paginate @records %> <%= paginate @records %> <%== pagy_nav @pagy %> ``` +||| ## Find the remaining code @@ -123,7 +130,7 @@ If the app is working and displays the pagination, it's time to adjust Pagy as y Please take a look at the topics in the [how-to](how-to.md) documentation: that should cover most of your custom needs. -### CSSs +### CSS The css styling that you may have applied to the pagination elements may need some minor change. However if the app uses the pagination from bootstrap (or some other framework), the same CSSs should work seamlessly with the pagy nav helpers or with any of the bootstrap templates. diff --git a/docs/requirements.md b/docs/requirements.md new file mode 100644 index 000000000..d56361241 --- /dev/null +++ b/docs/requirements.md @@ -0,0 +1,57 @@ +--- +order: 3 +title: Requirements +icon: unverified-24 +--- + +## Ruby ++++ Pagy 4.0+ +!!! success +Ruby `2.5+` +!!! + ++++ Old Pagy +!!! info +Older versions run on: + +* ruby `1.9+` or +* `jruby 1.7+` till `ruby <2.5` +!!! + ++++ + +## Working environments + ++++ Rack + +!!! success +Your app uses a `Rack` based framework (Rails, Sinatra, Padrino, etc.) +!!! + ++++ Non Rack + +!!! success +Your app does not use a `Rack` based framework. +!!! + +Require the [standalone extra](extras/standalone.md), and pass a `:url` variable. + ++++ Irb + +!!! success +With or without any app nor configuration +!!! + +Use the [Pagy::Console](api/console.md). ++++ + +### Special cases + +- If the collection to paginate is not a collection supported out of the box like ActiveRecord scope, [array](extras/array.md), [elasticsearch_rails](extras/elasticsearch_rails.md), [searchkick](extras/searchkick.md), [meilisearch](extras/meilisearch.md), ... you may need to override the `pagy_*get_vars` backend method. +- If the collection you are paginating doesn't respond to `offset` and `limit` and is not yet supported by any extra, you may need to override the `pagy_get_items` method in your controller (to get the items out of your specific collection) +- If your framework doesn't have a `params` method you can use the [standalone extra](extras/standalone.md) or you may need to define the `params` method or override the `pagy_get_vars` (which uses the `params` method) in your controller +- If your framework doesn't have a `request` method you can use the [standalone extra](extras/standalone.md) or you may need to override the `pagy_url_for` (which uses `Rack` and `request`) in your view + +!!! +The total overriding you may need is usually just a handful of lines at worse, and it doesn't need monkey patching or writing any sub-class or module +!!! diff --git a/docs/index.md b/index.md similarity index 92% rename from docs/index.md rename to index.md index ac361acc6..c94f0f547 100644 --- a/docs/index.md +++ b/index.md @@ -1,5 +1,6 @@ --- -title: Basic Concepts +title: Home +icon: home --- # Basic Concepts @@ -41,6 +42,6 @@ You could even use it directly (without using any other Pagy code) in a small pa ## Really easy to customize -If options and configuration are not enough, you have a several specialized [extras](extras.md), and if all that is still not enough, any other special customization is at most _one step far_ from your own code. You include them in your code, so you can override any method right where you use it: no tricky gimmickry required. +If options and configuration are not enough, you have a several specialized [extras](/categories/extras), and if all that is still not enough, any other special customization is at most _one step far_ from your own code. You include them in your code, so you can override any method right where you use it: no tricky gimmickry required. What could be easier? diff --git a/quick-start.md b/quick-start.md new file mode 100644 index 000000000..78240f170 --- /dev/null +++ b/quick-start.md @@ -0,0 +1,181 @@ +--- +order: 4 +icon: rocket-24 +--- + +# Quick Start + +=== If you want to just try Pagy before using it in your own app, you have a couple of alternatives... + ++++ Standalone Application + +Ensure to have `rack` installed (or `gem install rack`) + +Download and run the following file + +[!file](apps/pagy_standalone_app.ru) + ++++ Pagy Console + +||| Install the gem +```sh +gem install pagy +``` +||| + +[Use it fully without any app](docs/api/console.md) ++++ +=== + +### Install + ++++ With Bundler + +If you use Bundler, add the gem in the Gemfile, optionally avoiding the next major version with breaking changes (see [RubyGem Specifiers](http://guides.rubygems.org/patterns/#pessimistic-version-constraint)): + +||| Gemfile +```ruby +gem 'pagy', '~> 5.10' # omit patch digit +``` +||| + ++++ Without Bundler + +If you don't use Bundler, install and require the Pagy gem: + +||| Terminal +```bash +gem install pagy +``` +||| + +||| Ruby file +```ruby +require 'pagy' +``` +||| ++++ + +### Configure + ++++ With Rails + +Download the configuration file linked below and save it into the `config/initializers` dir + +[!file](lib/config/pagy.rb) + ++++ Without Rails + +Download the configuration file linked below and require it when your app starts + +[!file](lib/config/pagy.rb) + ++++ + +!!! Pagy doesn't load unnecessary code in your app! +Uncomment/edit the `pagy.rb` file in order to **explicitly require the extras** you need and eventually customize the static `Pagy::DEFAULT` variables in the same file. + +You can further customize the variables per instance, by explicitly passing any variable to the `Pagy*.new` constructor or to any `pagy*` controller method. +!!! + +### Backend Setup + +=== Include the backend +||| ApplicationController/AnyController +```ruby +include Pagy::Backend +``` +||| + +=== Use the `pagy` method +||| Controller action +```ruby +@pagy, @records = pagy(Product.some_scope) +``` +||| +=== + +### Render the pagination + ++++ Server Side +!!! success +Your pagination is rendered on the server +!!! + +Include the frontend + +||| ApplicationHelper/AnyHelper +```ruby +include Pagy::Frontend +``` +||| + +Use a fast helper +||| Helper +```erb +<%# Note the double equals sign "==" which marks the output as trusted and html safe: %> +<%== pagy_nav(@pagy) %> +``` +||| + +Or use a template +||| Template +```erb +<%== render partial: 'pagy/nav', locals: {pagy: @pagy} %> +``` +||| + +!!! Notice +Helpers and templates are available for different frameworks and different flavors (static, responsive, compact, etc.) [bootstrap](docs/extras/bootstrap.md), [bulma](docs/extras/bulma.md), [foundation](docs/extras/foundation.md), [materialize](docs/extras/materialize.md), [semantic](docs/extras/semantic.md), [uikit](docs/extras/uikit.md) +!!! + ++++ Javascript Framework + +!!! success +Your pagination is rendered by Vue.js, react.js, ... +!!! + +Require the [metadata extra](docs/extras/metadata.md) + +||| pagy.rb (initializer) +```ruby +require 'pagy/extras/metadata' +``` +||| + +Add the metadata to your JSON response +||| Controller action +```ruby +render json: { data: @records, pagy: pagy_metadata(@pagy, ...) } +``` +||| + ++++ API Service + +!!! success +Your API is consumed by some client +!!! + +Require the [headers extra](docs/extras/headers.md) + +||| pagy.rb (initializer) +```ruby +require 'pagy/extras/headers' +``` +||| + +Add the pagination headers to your responses +||| Controller + ```ruby + after_action { pagy_headers_merge(@pagy) if @pagy } + ``` +||| + +Render your JSON response as usual +||| Controller action + ```ruby + render json: { data: @records } + ``` +||| ++++ + diff --git a/retype.yml b/retype.yml new file mode 100644 index 000000000..bc2721341 --- /dev/null +++ b/retype.yml @@ -0,0 +1,45 @@ +input: . +output: .retype +url: https://ddnexus.github.io/pagy + +branding: + title: Pagy + label: 5.10.1 + +meta: + title: " | Pagy" + +links: + - text: Github + link: https://github.com/ddnexus/pagy + icon: mark-github + target: blank + - text: Issues + link: https://github.com/ddnexus/pagy/issues + icon: issue-opened-24 + target: blank + - text: Q&A + link: https://github.com/ddnexus/pagy/discussions/categories/q-a + icon: comment-discussion-24 + target: blank + - text: Discussions + link: https://github.com/ddnexus/pagy/discussions + icon: comment-discussion-24 + target: blank + - text: Archived Support + link: https://gitter.im/ruby-pagy/Lobby + icon: cross-reference-24 + target: blank + +exclude: + - README.md + +edit: + repo: "https://github.com/ddnexus/pagy" + branch: master + +search: + mode: full + +footer: + copyright: "© 2017-2022 [Domizio Demichelis](https://github.com/ddnexus) - [MIT License](https://opensource.org/licenses/MIT)" diff --git a/src/.gitignore b/src/.gitignore index 7fd371804..63bfac34c 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1 +1 @@ -/.parcel-cache/* +.parcel-cache/** diff --git a/src/build.sh b/src/build.sh index ed1158365..737ccd62b 100755 --- a/src/build.sh +++ b/src/build.sh @@ -19,6 +19,7 @@ echo 'export default Pagy;' >> pagy-module.ts tsc --alwaysStrict --target esnext --declaration pagy-module.ts echo 'generating pagy.js from main.js' -parcel build --cache-dir .parcel-cache +#parcel build --cache-dir .parcel-cache +parcel build --no-cache --cache-dir .parcel-cache # avoid test version error when the file did not change mv -vt ../lib/javascripts pagy-module.d.ts pagy-module.js pagy-dev.js diff --git a/test/pagy_test.rb b/test/pagy_test.rb index f0e06201b..11f8cb653 100644 --- a/test/pagy_test.rb +++ b/test/pagy_test.rb @@ -16,6 +16,9 @@ def series_for(page, *expected) it 'has version' do _(Pagy::VERSION).wont_be_nil end + it 'defines the same version in retype.yml' do + _(File.read('./retype.yml')).must_match "label: #{Pagy::VERSION}" + end it 'defines the same version in config/pagy.rb' do _(Pagy.root.join('config', 'pagy.rb').read).must_match "# Pagy initializer file (#{Pagy::VERSION})" end @@ -34,8 +37,8 @@ def series_for(page, *expected) it 'defines the same version in .github/.env' do _(File.read('.github/.env')).must_match "VERSION=#{Pagy::VERSION}" end - it 'defines the same minor version in docs/how-to.md' do - _(File.read('docs/how-to.md')).must_match "gem 'pagy', '~> #{Pagy::VERSION.sub(/\.\d+$/, '')}" + it 'defines the same minor version in ./quick-start.md' do + _(File.read('./quick-start.md')).must_match "gem 'pagy', '~> #{Pagy::VERSION.sub(/\.\d+$/, '')}" end end From 3df94011f3b6c48ddd26fd7376a2652864ef2a8d Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Wed, 21 Dec 2022 13:56:39 +0700 Subject: [PATCH 29/29] Version 6.0.0 --- .github/.env | 2 +- lib/config/pagy.rb | 2 +- lib/javascripts/pagy-dev.js | 4 ++-- lib/javascripts/pagy-module.js | 2 +- lib/javascripts/pagy.js | 2 +- lib/pagy.rb | 2 +- quick-start.md | 2 +- retype.yml | 2 +- src/pagy.ts | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/.env b/.github/.env index 55e690437..682e6e8c0 100644 --- a/.github/.env +++ b/.github/.env @@ -1,2 +1,2 @@ GEM=pagy -VERSION=5.10.1 +VERSION=6.0.0 diff --git a/lib/config/pagy.rb b/lib/config/pagy.rb index 9c026dde7..5207c50eb 100644 --- a/lib/config/pagy.rb +++ b/lib/config/pagy.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Pagy initializer file (5.10.1) +# Pagy initializer file (6.0.0) # Customize only what you really need and notice that the core Pagy works also without any of the following lines. # Should you just cherry pick part of this file, please maintain the require-order of the extras diff --git a/lib/javascripts/pagy-dev.js b/lib/javascripts/pagy-dev.js index cb64602dc..65835e196 100644 --- a/lib/javascripts/pagy-dev.js +++ b/lib/javascripts/pagy-dev.js @@ -82,7 +82,7 @@ window.Pagy = (() => { const trim = (link, param) => link.replace(new RegExp(`(\\?|&)${param}=1\\b(?!&)|\\b${param}=1&`), ""); // Public interface return { - version: "5.10.1", + version: "6.0.0", // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args init(arg) { const target = arg instanceof Element ? arg : document; @@ -111,4 +111,4 @@ window.Pagy = (() => { } }; })(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWNBLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFO0lBQ2YsNENBQTRDO0lBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQzdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFhLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3Ryw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQVMsRUFBRSxFQUFFO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25GLElBQUksU0FBUyxHQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sTUFBTSxHQUFNLENBQUMsSUFBVyxFQUFFLElBQVcsRUFBRSxLQUFZLEVBQVMsRUFBRSxDQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RixDQUFDLEVBQUUsQ0FBQyxVQUFVLEdBQUc7WUFDYixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU07YUFBRSxDQUFDLG1CQUFtQjtZQUN2RCxJQUFJLElBQUksR0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6QyxNQUFNLE1BQU0sR0FBRyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDakYsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUM3QyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDdEU7cUJBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7b0JBQ2pDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3JEO3FCQUFNLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtvQkFDdkIsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7aUJBQ3BCO3FCQUFNLEVBQUUsY0FBYztvQkFDbkIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDNUM7YUFDSjtZQUNELElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUcsMERBQTBEO1lBQ2hGLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ0wsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7U0FBRTtJQUM3RSxDQUFDLENBQUM7SUFFRixrQ0FBa0M7SUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFXLEVBQUUsRUFBRSxDQUMxRCxTQUFTLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVoRyxvQ0FBb0M7SUFDeEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxFQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBYyxFQUFFLEVBQUU7UUFDdEUsU0FBUyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN2RixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUM7SUFFRix5QkFBeUI7SUFDekIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFVLEVBQUUsT0FBb0MsRUFBRSxTQUFpQixFQUFFLEVBQUU7UUFDdEYsTUFBTSxLQUFLLEdBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQXFCLENBQUM7UUFDOUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM1QixNQUFNLE1BQU0sR0FBSTtZQUNaLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7Z0JBQUUsT0FBTTthQUFFLENBQUUsY0FBYztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUcsNkJBQTZCO2dCQUN4RCxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQkFDdEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNmLE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFHLG1DQUFtQztZQUM5RSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO2dCQUFFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO2FBQUU7WUFDbkYsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6QyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQUM7UUFDRixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVEsY0FBYztRQUNoRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQXVDLGlCQUFpQjtRQUNuRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRTtZQUFFLE1BQU0sRUFBRSxDQUFBO1NBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtJQUN2RyxDQUFDLENBQUM7SUFFRiwyQ0FBMkM7SUFDM0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFXLEVBQUUsS0FBWSxFQUFFLEVBQUUsQ0FDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEtBQUsscUJBQXFCLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFekYsbUJBQW1CO0lBQ25CLE9BQU87UUFDSCxPQUFPLEVBQUUsUUFBUTtRQUVqQixxR0FBcUc7UUFDckcsSUFBSSxDQUFDLEdBQWtCO1lBQ25CLE1BQU0sTUFBTSxHQUFLLEdBQUcsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4RCxLQUFLLE1BQU0sRUFBRSxJQUFJLFFBQVEsRUFBRTtnQkFDdkIsSUFBSTtvQkFDQSxNQUFNLFVBQVUsR0FBVyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9HLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsK0JBQStCO29CQUM5RyxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7d0JBQ25CLE9BQU8sQ0FBQyxFQUFnQixFQUFFLElBQWUsQ0FBQyxDQUFDO3FCQUM5Qzt5QkFBTSxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7d0JBQzVCLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBaUIsQ0FBQyxDQUFDO3FCQUNwQzt5QkFBTSxJQUFJLE9BQU8sS0FBSyxVQUFVLEVBQUU7d0JBQy9CLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBb0IsQ0FBQyxDQUFDO3FCQUMxQzt5QkFBTTt3QkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDbEY7aUJBQ0o7Z0JBQUMsT0FBTyxHQUFHLEVBQUU7b0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUE7aUJBQUU7YUFDN0U7UUFDTCxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIE5hdkFyZ3MgICAgICA9IHJlYWRvbmx5IFtUYWdzLCBTZXF1ZWxzLCBudWxsfExhYmVsU2VxdWVscywgc3RyaW5nP11cbnR5cGUgQ29tYm9BcmdzICAgID0gcmVhZG9ubHkgW3N0cmluZywgc3RyaW5nP11cbnR5cGUgU2VsZWN0b3JBcmdzID0gcmVhZG9ubHkgW251bWJlciwgc3RyaW5nLCBzdHJpbmc/XVxuaW50ZXJmYWNlIFRhZ3Mge1xuICAgIHJlYWRvbmx5IGJlZm9yZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgbGluazogICBzdHJpbmdcbiAgICByZWFkb25seSBhY3RpdmU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGdhcDogICAgc3RyaW5nXG4gICAgcmVhZG9ubHkgYWZ0ZXI6ICBzdHJpbmdcbn1cbmludGVyZmFjZSBTZXF1ZWxzICAgICAgeyByZWFkb25seSBbd2lkdGg6c3RyaW5nXTogKHN0cmluZ3xudW1iZXIpW10gfVxuaW50ZXJmYWNlIExhYmVsU2VxdWVscyB7IHJlYWRvbmx5IFt3aWR0aDpzdHJpbmddOiBzdHJpbmdbXSB9XG5pbnRlcmZhY2UgTmF2RWxlbWVudCBleHRlbmRzIEVsZW1lbnQgeyBwYWd5UmVuZGVyKCk6IHZvaWQgfVxuXG5jb25zdCBQYWd5ID0gKCgpID0+IHtcbiAgICAvLyBUaGUgb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIHJlc3BvbnNpdmUgbmF2c1xuICAgIGNvbnN0IHJqc09ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT5cbiAgICAgICAgZW50cmllcy5mb3JFYWNoKGUgPT4gZS50YXJnZXQucXVlcnlTZWxlY3RvckFsbDxOYXZFbGVtZW50PihcIi5wYWd5LXJqc1wiKS5mb3JFYWNoKGVsID0+IGVsLnBhZ3lSZW5kZXIoKSkpKTtcblxuICAgIC8vIEluaXQgdGhlICpfbmF2X2pzIGhlbHBlcnNcbiAgICBjb25zdCBpbml0TmF2ID0gKGVsOk5hdkVsZW1lbnQsIFt0YWdzLCBzZXF1ZWxzLCBsYWJlbFNlcXVlbHMsIHRyaW1QYXJhbV06TmF2QXJncykgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBlbC5wYXJlbnRFbGVtZW50ID8/IGVsO1xuICAgICAgICBjb25zdCB3aWR0aHMgICAgPSBPYmplY3Qua2V5cyhzZXF1ZWxzKS5tYXAodyA9PiBwYXJzZUludCh3KSkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBsZXQgbGFzdFdpZHRoICAgPSAtMTtcbiAgICAgICAgY29uc3QgZmlsbEluICAgID0gKGxpbms6c3RyaW5nLCBwYWdlOnN0cmluZywgbGFiZWw6c3RyaW5nKTpzdHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy9nLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfbGFiZWxfXy9nLCBsYWJlbCk7XG4gICAgICAgIChlbC5wYWd5UmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHdpZHRocy5maW5kKHcgPT4gdyA8IGNvbnRhaW5lci5jbGllbnRXaWR0aCkgfHwgMDtcbiAgICAgICAgICAgIGlmICh3aWR0aCA9PT0gbGFzdFdpZHRoKSB7IHJldHVybiB9IC8vIG5vIGNoYW5nZTogYWJvcnRcbiAgICAgICAgICAgIGxldCBodG1sICAgICA9IHRhZ3MuYmVmb3JlO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWVzID0gc2VxdWVsc1t3aWR0aC50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVscyA9IGxhYmVsU2VxdWVscz8uW3dpZHRoLnRvU3RyaW5nKCldID8/IHNlcmllcy5tYXAobCA9PiBsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlcmllcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gID0gc2VyaWVzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIGl0ZW0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSB0cmltKGZpbGxJbih0YWdzLmxpbmssIGl0ZW0udG9TdHJpbmcoKSwgbGFiZWwpLCB0cmltUGFyYW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBmaWxsSW4odGFncy5saW5rLCBpdGVtLnRvU3RyaW5nKCksIGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gPT09IFwiZ2FwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSB0YWdzLmdhcDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhY3RpdmUgcGFnZVxuICAgICAgICAgICAgICAgICAgICBodG1sICs9IGZpbGxJbih0YWdzLmFjdGl2ZSwgaXRlbSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0bWwgKz0gdGFncy5hZnRlcjsgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGFsaWduLWFzc2lnbm1lbnRzL2FsaWduLWFzc2lnbm1lbnRzXG4gICAgICAgICAgICBlbC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIGxhc3RXaWR0aCA9IHdpZHRoO1xuICAgICAgICB9KSgpO1xuICAgICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwicGFneS1yanNcIikpIHsgcmpzT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdCB0aGUgKl9jb21ib19uYXZfanMgaGVscGVyc1xuICAgIGNvbnN0IGluaXRDb21ibyA9IChlbDpFbGVtZW50LCBbbGluaywgdHJpbVBhcmFtXTpDb21ib0FyZ3MpID0+XG4gICAgICAgIGluaXRJbnB1dChlbCwgaW5wdXRWYWx1ZSA9PiBbaW5wdXRWYWx1ZSwgbGluay5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fLywgaW5wdXRWYWx1ZSldLCB0cmltUGFyYW0pO1xuXG4gICAgICAgIC8vIEluaXQgdGhlIGl0ZW1zX3NlbGVjdG9yX2pzIGhlbHBlclxuICAgIGNvbnN0IGluaXRTZWxlY3RvciA9IChlbDpFbGVtZW50LCBbZnJvbSwgbGluaywgdHJpbVBhcmFtXTpTZWxlY3RvckFyZ3MpID0+IHtcbiAgICAgICAgaW5pdElucHV0KGVsLCBpbnB1dFZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1heChNYXRoLmNlaWwoZnJvbSAvIHBhcnNlSW50KGlucHV0VmFsdWUpKSwgMSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsaW5rLnJlcGxhY2UoL19fcGFneV9wYWdlX18vLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfaXRlbXNfXy8sIGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIFtwYWdlLCBodG1sXTtcbiAgICAgICAgfSwgdHJpbVBhcmFtKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdCB0aGUgaW5wdXQgZWxlbWVudFxuICAgIGNvbnN0IGluaXRJbnB1dCA9IChlbDpFbGVtZW50LCBnZXRWYXJzOih2OnN0cmluZyk9PltzdHJpbmcsIHN0cmluZ10sIHRyaW1QYXJhbT86c3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ICAgPSBlbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBhY3Rpb24gID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQudmFsdWUgPT09IGluaXRpYWwpIHsgcmV0dXJuIH0gIC8vIG5vdCBjaGFuZ2VkXG4gICAgICAgICAgICBjb25zdCBbbWluLCB2YWwsIG1heF0gPSBbaW5wdXQubWluLCBpbnB1dC52YWx1ZSwgaW5wdXQubWF4XS5tYXAobiA9PiBwYXJzZUludChuKSB8fCAwKTtcbiAgICAgICAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7ICAvLyByZXNldCBpbnZhbGlkL291dC1vZi1yYW5nZVxuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gaW5pdGlhbDtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgW3BhZ2UsIGh0bWxdID0gZ2V0VmFycyhpbnB1dC52YWx1ZSk7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIHBhZ2UgPT09IFwiMVwiKSB7IGh0bWwgPSB0cmltKGh0bWwsIHRyaW1QYXJhbSkgfVxuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIChlbC5xdWVyeVNlbGVjdG9yKFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudCkuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgW1wiY2hhbmdlXCIsIFwiZm9jdXNcIl0uZm9yRWFjaChlID0+IGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaW5wdXQuc2VsZWN0KSk7ICAgICAgICAvLyBhdXRvLXNlbGVjdFxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFjdGlvblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGFjdGlvbigpIH0gfSk7IC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgfTtcblxuICAgIC8vIFRyaW0gdGhlICR7cGFnZS1wYXJhbX09MSBwYXJhbXMgaW4gbGlua3NcbiAgICBjb25zdCB0cmltID0gKGxpbms6c3RyaW5nLCBwYXJhbTpzdHJpbmcpID0+XG4gICAgICAgIGxpbmsucmVwbGFjZShuZXcgUmVnRXhwKGAoXFxcXD98JmFtcDspJHtwYXJhbX09MVxcXFxiKD8hJmFtcDspfFxcXFxiJHtwYXJhbX09MSZhbXA7YCksIFwiXCIpO1xuXG4gICAgLy8gUHVibGljIGludGVyZmFjZVxuICAgIHJldHVybiB7XG4gICAgICAgIHZlcnNpb246IFwiNS4xMC4xXCIsXG5cbiAgICAgICAgLy8gU2NhbiBmb3IgZWxlbWVudHMgd2l0aCBhIFwiZGF0YS1wYWd5XCIgYXR0cmlidXRlIGFuZCBjYWxsIHRoZWlyIGluaXQgZnVuY3Rpb25zIHdpdGggdGhlIGRlY29kZWQgYXJnc1xuICAgICAgICBpbml0KGFyZz86RWxlbWVudHxuZXZlcikge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ICAgPSBhcmcgaW5zdGFuY2VvZiBFbGVtZW50ID8gYXJnIDogZG9jdW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtcGFneV1cIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhhcnJheSAgICAgICAgID0gVWludDhBcnJheS5mcm9tKGF0b2IoZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1wYWd5XCIpIGFzIHN0cmluZyksIGMgPT4gYy5jaGFyQ29kZUF0KDApKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleXdvcmQsIC4uLmFyZ3NdID0gSlNPTi5wYXJzZSgobmV3IFRleHREZWNvZGVyKCkpLmRlY29kZSh1aW50OGFycmF5KSk7IC8vIGJhc2U2NC11dGY4IC0+IEpTT04gLT4gQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleXdvcmQgPT09IFwibmF2XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXROYXYoZWwgYXMgTmF2RWxlbWVudCwgYXJncyBhcyBOYXZBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXl3b3JkID09PSBcImNvbWJvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb21ibyhlbCwgYXJncyBhcyBDb21ib0FyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT09IFwic2VsZWN0b3JcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFNlbGVjdG9yKGVsLCBhcmdzIGFzIFNlbGVjdG9yQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJTa2lwcGVkIFBhZ3kuaW5pdCgpIGZvcjogJW9cXG5Vbmtub3duIGtleXdvcmQgJyVzJ1wiLCBlbCwga2V5d29yZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS53YXJuKFwiU2tpcHBlZCBQYWd5LmluaXQoKSBmb3I6ICVvXFxuJXNcIiwgZWwsIGVycikgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWNBLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFO0lBQ2YsNENBQTRDO0lBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQzdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFhLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3Ryw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQVMsRUFBRSxFQUFFO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25GLElBQUksU0FBUyxHQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sTUFBTSxHQUFNLENBQUMsSUFBVyxFQUFFLElBQVcsRUFBRSxLQUFZLEVBQVMsRUFBRSxDQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RixDQUFDLEVBQUUsQ0FBQyxVQUFVLEdBQUc7WUFDYixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU07YUFBRSxDQUFDLG1CQUFtQjtZQUN2RCxJQUFJLElBQUksR0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6QyxNQUFNLE1BQU0sR0FBRyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDakYsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUM3QyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDdEU7cUJBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7b0JBQ2pDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3JEO3FCQUFNLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtvQkFDdkIsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7aUJBQ3BCO3FCQUFNLEVBQUUsY0FBYztvQkFDbkIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDNUM7YUFDSjtZQUNELElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUcsMERBQTBEO1lBQ2hGLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ0wsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7U0FBRTtJQUM3RSxDQUFDLENBQUM7SUFFRixrQ0FBa0M7SUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFXLEVBQUUsRUFBRSxDQUMxRCxTQUFTLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVoRyxvQ0FBb0M7SUFDeEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxFQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBYyxFQUFFLEVBQUU7UUFDdEUsU0FBUyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN2RixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUM7SUFFRix5QkFBeUI7SUFDekIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFVLEVBQUUsT0FBb0MsRUFBRSxTQUFpQixFQUFFLEVBQUU7UUFDdEYsTUFBTSxLQUFLLEdBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQXFCLENBQUM7UUFDOUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM1QixNQUFNLE1BQU0sR0FBSTtZQUNaLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7Z0JBQUUsT0FBTTthQUFFLENBQUUsY0FBYztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUcsNkJBQTZCO2dCQUN4RCxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQkFDdEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNmLE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFHLG1DQUFtQztZQUM5RSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO2dCQUFFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO2FBQUU7WUFDbkYsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6QyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQUM7UUFDRixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVEsY0FBYztRQUNoRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQXVDLGlCQUFpQjtRQUNuRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRTtZQUFFLE1BQU0sRUFBRSxDQUFBO1NBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtJQUN2RyxDQUFDLENBQUM7SUFFRiwyQ0FBMkM7SUFDM0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFXLEVBQUUsS0FBWSxFQUFFLEVBQUUsQ0FDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEtBQUsscUJBQXFCLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFekYsbUJBQW1CO0lBQ25CLE9BQU87UUFDSCxPQUFPLEVBQUUsT0FBTztRQUVoQixxR0FBcUc7UUFDckcsSUFBSSxDQUFDLEdBQWtCO1lBQ25CLE1BQU0sTUFBTSxHQUFLLEdBQUcsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4RCxLQUFLLE1BQU0sRUFBRSxJQUFJLFFBQVEsRUFBRTtnQkFDdkIsSUFBSTtvQkFDQSxNQUFNLFVBQVUsR0FBVyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9HLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsK0JBQStCO29CQUM5RyxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7d0JBQ25CLE9BQU8sQ0FBQyxFQUFnQixFQUFFLElBQWUsQ0FBQyxDQUFDO3FCQUM5Qzt5QkFBTSxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7d0JBQzVCLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBaUIsQ0FBQyxDQUFDO3FCQUNwQzt5QkFBTSxJQUFJLE9BQU8sS0FBSyxVQUFVLEVBQUU7d0JBQy9CLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBb0IsQ0FBQyxDQUFDO3FCQUMxQzt5QkFBTTt3QkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDbEY7aUJBQ0o7Z0JBQUMsT0FBTyxHQUFHLEVBQUU7b0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUE7aUJBQUU7YUFDN0U7UUFDTCxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIE5hdkFyZ3MgICAgICA9IHJlYWRvbmx5IFtUYWdzLCBTZXF1ZWxzLCBudWxsfExhYmVsU2VxdWVscywgc3RyaW5nP11cbnR5cGUgQ29tYm9BcmdzICAgID0gcmVhZG9ubHkgW3N0cmluZywgc3RyaW5nP11cbnR5cGUgU2VsZWN0b3JBcmdzID0gcmVhZG9ubHkgW251bWJlciwgc3RyaW5nLCBzdHJpbmc/XVxuaW50ZXJmYWNlIFRhZ3Mge1xuICAgIHJlYWRvbmx5IGJlZm9yZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgbGluazogICBzdHJpbmdcbiAgICByZWFkb25seSBhY3RpdmU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGdhcDogICAgc3RyaW5nXG4gICAgcmVhZG9ubHkgYWZ0ZXI6ICBzdHJpbmdcbn1cbmludGVyZmFjZSBTZXF1ZWxzICAgICAgeyByZWFkb25seSBbd2lkdGg6c3RyaW5nXTogKHN0cmluZ3xudW1iZXIpW10gfVxuaW50ZXJmYWNlIExhYmVsU2VxdWVscyB7IHJlYWRvbmx5IFt3aWR0aDpzdHJpbmddOiBzdHJpbmdbXSB9XG5pbnRlcmZhY2UgTmF2RWxlbWVudCBleHRlbmRzIEVsZW1lbnQgeyBwYWd5UmVuZGVyKCk6IHZvaWQgfVxuXG5jb25zdCBQYWd5ID0gKCgpID0+IHtcbiAgICAvLyBUaGUgb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIHJlc3BvbnNpdmUgbmF2c1xuICAgIGNvbnN0IHJqc09ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT5cbiAgICAgICAgZW50cmllcy5mb3JFYWNoKGUgPT4gZS50YXJnZXQucXVlcnlTZWxlY3RvckFsbDxOYXZFbGVtZW50PihcIi5wYWd5LXJqc1wiKS5mb3JFYWNoKGVsID0+IGVsLnBhZ3lSZW5kZXIoKSkpKTtcblxuICAgIC8vIEluaXQgdGhlICpfbmF2X2pzIGhlbHBlcnNcbiAgICBjb25zdCBpbml0TmF2ID0gKGVsOk5hdkVsZW1lbnQsIFt0YWdzLCBzZXF1ZWxzLCBsYWJlbFNlcXVlbHMsIHRyaW1QYXJhbV06TmF2QXJncykgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBlbC5wYXJlbnRFbGVtZW50ID8/IGVsO1xuICAgICAgICBjb25zdCB3aWR0aHMgICAgPSBPYmplY3Qua2V5cyhzZXF1ZWxzKS5tYXAodyA9PiBwYXJzZUludCh3KSkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBsZXQgbGFzdFdpZHRoICAgPSAtMTtcbiAgICAgICAgY29uc3QgZmlsbEluICAgID0gKGxpbms6c3RyaW5nLCBwYWdlOnN0cmluZywgbGFiZWw6c3RyaW5nKTpzdHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy9nLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfbGFiZWxfXy9nLCBsYWJlbCk7XG4gICAgICAgIChlbC5wYWd5UmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHdpZHRocy5maW5kKHcgPT4gdyA8IGNvbnRhaW5lci5jbGllbnRXaWR0aCkgfHwgMDtcbiAgICAgICAgICAgIGlmICh3aWR0aCA9PT0gbGFzdFdpZHRoKSB7IHJldHVybiB9IC8vIG5vIGNoYW5nZTogYWJvcnRcbiAgICAgICAgICAgIGxldCBodG1sICAgICA9IHRhZ3MuYmVmb3JlO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWVzID0gc2VxdWVsc1t3aWR0aC50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVscyA9IGxhYmVsU2VxdWVscz8uW3dpZHRoLnRvU3RyaW5nKCldID8/IHNlcmllcy5tYXAobCA9PiBsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlcmllcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gID0gc2VyaWVzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIGl0ZW0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSB0cmltKGZpbGxJbih0YWdzLmxpbmssIGl0ZW0udG9TdHJpbmcoKSwgbGFiZWwpLCB0cmltUGFyYW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBmaWxsSW4odGFncy5saW5rLCBpdGVtLnRvU3RyaW5nKCksIGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gPT09IFwiZ2FwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSB0YWdzLmdhcDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhY3RpdmUgcGFnZVxuICAgICAgICAgICAgICAgICAgICBodG1sICs9IGZpbGxJbih0YWdzLmFjdGl2ZSwgaXRlbSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0bWwgKz0gdGFncy5hZnRlcjsgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGFsaWduLWFzc2lnbm1lbnRzL2FsaWduLWFzc2lnbm1lbnRzXG4gICAgICAgICAgICBlbC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIGxhc3RXaWR0aCA9IHdpZHRoO1xuICAgICAgICB9KSgpO1xuICAgICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwicGFneS1yanNcIikpIHsgcmpzT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdCB0aGUgKl9jb21ib19uYXZfanMgaGVscGVyc1xuICAgIGNvbnN0IGluaXRDb21ibyA9IChlbDpFbGVtZW50LCBbbGluaywgdHJpbVBhcmFtXTpDb21ib0FyZ3MpID0+XG4gICAgICAgIGluaXRJbnB1dChlbCwgaW5wdXRWYWx1ZSA9PiBbaW5wdXRWYWx1ZSwgbGluay5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fLywgaW5wdXRWYWx1ZSldLCB0cmltUGFyYW0pO1xuXG4gICAgICAgIC8vIEluaXQgdGhlIGl0ZW1zX3NlbGVjdG9yX2pzIGhlbHBlclxuICAgIGNvbnN0IGluaXRTZWxlY3RvciA9IChlbDpFbGVtZW50LCBbZnJvbSwgbGluaywgdHJpbVBhcmFtXTpTZWxlY3RvckFyZ3MpID0+IHtcbiAgICAgICAgaW5pdElucHV0KGVsLCBpbnB1dFZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1heChNYXRoLmNlaWwoZnJvbSAvIHBhcnNlSW50KGlucHV0VmFsdWUpKSwgMSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsaW5rLnJlcGxhY2UoL19fcGFneV9wYWdlX18vLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfaXRlbXNfXy8sIGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIFtwYWdlLCBodG1sXTtcbiAgICAgICAgfSwgdHJpbVBhcmFtKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdCB0aGUgaW5wdXQgZWxlbWVudFxuICAgIGNvbnN0IGluaXRJbnB1dCA9IChlbDpFbGVtZW50LCBnZXRWYXJzOih2OnN0cmluZyk9PltzdHJpbmcsIHN0cmluZ10sIHRyaW1QYXJhbT86c3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ICAgPSBlbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBhY3Rpb24gID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQudmFsdWUgPT09IGluaXRpYWwpIHsgcmV0dXJuIH0gIC8vIG5vdCBjaGFuZ2VkXG4gICAgICAgICAgICBjb25zdCBbbWluLCB2YWwsIG1heF0gPSBbaW5wdXQubWluLCBpbnB1dC52YWx1ZSwgaW5wdXQubWF4XS5tYXAobiA9PiBwYXJzZUludChuKSB8fCAwKTtcbiAgICAgICAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7ICAvLyByZXNldCBpbnZhbGlkL291dC1vZi1yYW5nZVxuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gaW5pdGlhbDtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgW3BhZ2UsIGh0bWxdID0gZ2V0VmFycyhpbnB1dC52YWx1ZSk7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIHBhZ2UgPT09IFwiMVwiKSB7IGh0bWwgPSB0cmltKGh0bWwsIHRyaW1QYXJhbSkgfVxuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIChlbC5xdWVyeVNlbGVjdG9yKFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudCkuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgW1wiY2hhbmdlXCIsIFwiZm9jdXNcIl0uZm9yRWFjaChlID0+IGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaW5wdXQuc2VsZWN0KSk7ICAgICAgICAvLyBhdXRvLXNlbGVjdFxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFjdGlvblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGFjdGlvbigpIH0gfSk7IC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgfTtcblxuICAgIC8vIFRyaW0gdGhlICR7cGFnZS1wYXJhbX09MSBwYXJhbXMgaW4gbGlua3NcbiAgICBjb25zdCB0cmltID0gKGxpbms6c3RyaW5nLCBwYXJhbTpzdHJpbmcpID0+XG4gICAgICAgIGxpbmsucmVwbGFjZShuZXcgUmVnRXhwKGAoXFxcXD98JmFtcDspJHtwYXJhbX09MVxcXFxiKD8hJmFtcDspfFxcXFxiJHtwYXJhbX09MSZhbXA7YCksIFwiXCIpO1xuXG4gICAgLy8gUHVibGljIGludGVyZmFjZVxuICAgIHJldHVybiB7XG4gICAgICAgIHZlcnNpb246IFwiNi4wLjBcIixcblxuICAgICAgICAvLyBTY2FuIGZvciBlbGVtZW50cyB3aXRoIGEgXCJkYXRhLXBhZ3lcIiBhdHRyaWJ1dGUgYW5kIGNhbGwgdGhlaXIgaW5pdCBmdW5jdGlvbnMgd2l0aCB0aGUgZGVjb2RlZCBhcmdzXG4gICAgICAgIGluaXQoYXJnPzpFbGVtZW50fG5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgICA9IGFyZyBpbnN0YW5jZW9mIEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OGFycmF5ICAgICAgICAgPSBVaW50OEFycmF5LmZyb20oYXRvYihlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikgYXMgc3RyaW5nKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5d29yZCwgLi4uYXJnc10gPSBKU09OLnBhcnNlKChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKHVpbnQ4YXJyYXkpKTsgLy8gYmFzZTY0LXV0ZjggLT4gSlNPTiAtPiBBcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZCA9PT0gXCJuYXZcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE5hdihlbCBhcyBOYXZFbGVtZW50LCBhcmdzIGFzIE5hdkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT09IFwiY29tYm9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbWJvKGVsLCBhcmdzIGFzIENvbWJvQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJzZWxlY3RvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VsZWN0b3IoZWwsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlNraXBwZWQgUGFneS5pbml0KCkgZm9yOiAlb1xcblVua25vd24ga2V5d29yZCAnJXMnXCIsIGVsLCBrZXl3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJTa2lwcGVkIFBhZ3kuaW5pdCgpIGZvcjogJW9cXG4lc1wiLCBlbCwgZXJyKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbiJdfQ== \ No newline at end of file diff --git a/lib/javascripts/pagy-module.js b/lib/javascripts/pagy-module.js index 39b74c02a..3ab84d822 100644 --- a/lib/javascripts/pagy-module.js +++ b/lib/javascripts/pagy-module.js @@ -81,7 +81,7 @@ const Pagy = (() => { const trim = (link, param) => link.replace(new RegExp(`(\\?|&)${param}=1\\b(?!&)|\\b${param}=1&`), ""); // Public interface return { - version: "5.10.1", + version: "6.0.0", // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args init(arg) { const target = arg instanceof Element ? arg : document; diff --git a/lib/javascripts/pagy.js b/lib/javascripts/pagy.js index e85d9e155..e717f9aa5 100644 --- a/lib/javascripts/pagy.js +++ b/lib/javascripts/pagy.js @@ -1 +1 @@ -!function(){var e=(()=>{const e=new ResizeObserver((e=>e.forEach((e=>e.target.querySelectorAll(".pagy-rjs").forEach((e=>e.pagyRender())))))),t=(t,[n,r,a,c])=>{const i=t.parentElement??t,s=Object.keys(r).map((e=>parseInt(e))).sort(((e,t)=>t-e));let p=-1;const l=(e,t,n)=>e.replace(/__pagy_page__/g,t).replace(/__pagy_label__/g,n);(t.pagyRender=function(){const e=s.find((e=>ee.toString()));for(const e in y){const t=y[e],r=f[e];g+="string"==typeof c&&1===t?o(l(n.link,t.toString(),r),c):"number"==typeof t?l(n.link,t.toString(),r):"gap"===t?n.gap:l(n.active,t,r)}g+=n.after,t.innerHTML="",t.insertAdjacentHTML("afterbegin",g),p=e})(),t.classList.contains("pagy-rjs")&&e.observe(i)},n=(e,[t,n])=>a(e,(e=>[e,t.replace(/__pagy_page__/,e)]),n),r=(e,[t,n,r])=>{a(e,(e=>{const r=Math.max(Math.ceil(t/parseInt(e)),1).toString();return[r,n.replace(/__pagy_page__/,r).replace(/__pagy_items__/,e)]}),r)},a=(e,t,n)=>{const r=e.querySelector("input"),a=r.value,c=function(){if(r.value===a)return;const[c,i,s]=[r.min,r.value,r.max].map((e=>parseInt(e)||0));if(is)return r.value=a,void r.select();let[p,l]=t(r.value);"string"==typeof n&&"1"===p&&(l=o(l,n)),e.insertAdjacentHTML("afterbegin",l),e.querySelector("a").click()};["change","focus"].forEach((e=>r.addEventListener(e,r.select))),r.addEventListener("focusout",c),r.addEventListener("keypress",(e=>{"Enter"===e.key&&c()}))},o=(e,t)=>e.replace(new RegExp(`(\\?|&)${t}=1\\b(?!&)|\\b${t}=1&`),"");return{version:"5.10.1",init(e){const a=(e instanceof Element?e:document).querySelectorAll("[data-pagy]");for(const e of a)try{const a=Uint8Array.from(atob(e.getAttribute("data-pagy")),(e=>e.charCodeAt(0))),[o,...c]=JSON.parse((new TextDecoder).decode(a));"nav"===o?t(e,c):"combo"===o?n(e,c):"selector"===o?r(e,c):console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",e,o)}catch(t){console.warn("Skipped Pagy.init() for: %o\n%s",e,t)}}}})();window.Pagy=e}(); \ No newline at end of file +!function(){var e=(()=>{const e=new ResizeObserver((e=>e.forEach((e=>e.target.querySelectorAll(".pagy-rjs").forEach((e=>e.pagyRender())))))),t=(t,[n,r,a,c])=>{const i=t.parentElement??t,s=Object.keys(r).map((e=>parseInt(e))).sort(((e,t)=>t-e));let p=-1;const l=(e,t,n)=>e.replace(/__pagy_page__/g,t).replace(/__pagy_label__/g,n);(t.pagyRender=function(){const e=s.find((e=>ee.toString()));for(const e in y){const t=y[e],r=f[e];g+="string"==typeof c&&1===t?o(l(n.link,t.toString(),r),c):"number"==typeof t?l(n.link,t.toString(),r):"gap"===t?n.gap:l(n.active,t,r)}g+=n.after,t.innerHTML="",t.insertAdjacentHTML("afterbegin",g),p=e})(),t.classList.contains("pagy-rjs")&&e.observe(i)},n=(e,[t,n])=>a(e,(e=>[e,t.replace(/__pagy_page__/,e)]),n),r=(e,[t,n,r])=>{a(e,(e=>{const r=Math.max(Math.ceil(t/parseInt(e)),1).toString();return[r,n.replace(/__pagy_page__/,r).replace(/__pagy_items__/,e)]}),r)},a=(e,t,n)=>{const r=e.querySelector("input"),a=r.value,c=function(){if(r.value===a)return;const[c,i,s]=[r.min,r.value,r.max].map((e=>parseInt(e)||0));if(is)return r.value=a,void r.select();let[p,l]=t(r.value);"string"==typeof n&&"1"===p&&(l=o(l,n)),e.insertAdjacentHTML("afterbegin",l),e.querySelector("a").click()};["change","focus"].forEach((e=>r.addEventListener(e,r.select))),r.addEventListener("focusout",c),r.addEventListener("keypress",(e=>{"Enter"===e.key&&c()}))},o=(e,t)=>e.replace(new RegExp(`(\\?|&)${t}=1\\b(?!&)|\\b${t}=1&`),"");return{version:"6.0.0",init(e){const a=(e instanceof Element?e:document).querySelectorAll("[data-pagy]");for(const e of a)try{const a=Uint8Array.from(atob(e.getAttribute("data-pagy")),(e=>e.charCodeAt(0))),[o,...c]=JSON.parse((new TextDecoder).decode(a));"nav"===o?t(e,c):"combo"===o?n(e,c):"selector"===o?r(e,c):console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",e,o)}catch(t){console.warn("Skipped Pagy.init() for: %o\n%s",e,t)}}}})();window.Pagy=e}(); \ No newline at end of file diff --git a/lib/pagy.rb b/lib/pagy.rb index 759763567..6e5c82f99 100644 --- a/lib/pagy.rb +++ b/lib/pagy.rb @@ -5,7 +5,7 @@ # Core class class Pagy - VERSION = '5.10.1' + VERSION = '6.0.0' # Root pathname to get the path of Pagy files like templates or dictionaries def self.root diff --git a/quick-start.md b/quick-start.md index 78240f170..01fa88855 100644 --- a/quick-start.md +++ b/quick-start.md @@ -35,7 +35,7 @@ If you use Bundler, add the gem in the Gemfile, optionally avoiding the next maj ||| Gemfile ```ruby -gem 'pagy', '~> 5.10' # omit patch digit +gem 'pagy', '~> 6.0' # omit patch digit ``` ||| diff --git a/retype.yml b/retype.yml index bc2721341..3782ef867 100644 --- a/retype.yml +++ b/retype.yml @@ -4,7 +4,7 @@ url: https://ddnexus.github.io/pagy branding: title: Pagy - label: 5.10.1 + label: 6.0.0 meta: title: " | Pagy" diff --git a/src/pagy.ts b/src/pagy.ts index 982a879a3..254299a77 100644 --- a/src/pagy.ts +++ b/src/pagy.ts @@ -92,7 +92,7 @@ const Pagy = (() => { // Public interface return { - version: "5.10.1", + version: "6.0.0", // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args init(arg?:Element|never) {