diff --git a/README.md b/README.md
index 6a30cca7..44402ca0 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ Donate? Muốn hỗ trợ mình 1 ly cafe <3 [Donate here](https://github.com/Ho
## Change logs - Lịch sử cập nhât
-Verion hiện tại: v1.2
+Verion hiện tại: v1.1v1.2 **v1.3** (27/11/2022)
[Change logs / Lịch sử cập nhật](/md/CHANGELOGS.md)
@@ -27,7 +27,7 @@ Verion hiện tại: v1.2
## Screenshots - Ảnh chụp màn hình
-
+
## Contribute - Đóng góp
diff --git a/_metadata/generated_indexed_rulesets/_ruleset1 b/_metadata/generated_indexed_rulesets/_ruleset1
new file mode 100644
index 00000000..f6d3b65b
Binary files /dev/null and b/_metadata/generated_indexed_rulesets/_ruleset1 differ
diff --git a/assets/screenshots/Screen Shot 2022-11-27 at 22.05.00.png b/assets/screenshots/Screen Shot 2022-11-27 at 22.05.00.png
new file mode 100644
index 00000000..48138d12
Binary files /dev/null and b/assets/screenshots/Screen Shot 2022-11-27 at 22.05.00.png differ
diff --git a/backup/content.js b/backup/content.js
deleted file mode 100644
index 34d53d29..00000000
--- a/backup/content.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// function injectFile(filePath) {
-// var s = document.createElement("script");
-// s.src = chrome.runtime.getURL(filePath);
-// s.onload = function () {
-// this.remove();
-// };
-// (document.head || document.documentElement).appendChild(s);
-// }
diff --git a/empty_script.js b/empty_script.js
index e36a1b85..51b23fef 100644
--- a/empty_script.js
+++ b/empty_script.js
@@ -8,8 +8,15 @@ export default {
en: "",
vi: "",
},
+
+ // Chọn 1 trong 2 cách, xoá cách không dùng:
+
+ // Cách 1: Mở link web trong tab mới, không cần dùng func
+ link: "",
+
+ // Cách 2: Chạy script
blackList: [],
whiteList: [],
-
+ runInExtensionContext: false,
func: function () {},
};
diff --git a/manifest.json b/manifest.json
index b7f9395f..8472550a 100644
--- a/manifest.json
+++ b/manifest.json
@@ -2,7 +2,7 @@
"manifest_version": 3,
"name": "Useful Scripts",
"description": "Scripts that can make your life faster and better",
- "version": "1.2",
+ "version": "1.3",
"icons": {
"16": "./assets/icon16.png",
"32": "./assets/icon32.png",
@@ -16,10 +16,64 @@
"permissions": [
"tabs",
"scripting",
- "storage"
+ "storage",
+ "cookies",
+ "debugger",
+ "declarativeNetRequest",
+ "declarativeNetRequestFeedback",
+ "declarativeNetRequestWithHostAccess"
],
"host_permissions": [
""
],
- "options_page": "./pages/options/options.html"
+ "options_page": "./pages/options/options.html",
+ "content_scripts": [
+ {
+ "matches": [
+ ""
+ ],
+ "js": [
+ "scripts/content-scripts/document_start.js"
+ ],
+ "run_at": "document_start"
+ },
+ {
+ "matches": [
+ ""
+ ],
+ "js": [
+ "scripts/content-scripts/document_idle.js"
+ ],
+ "run_at": "document_idle"
+ },
+ {
+ "matches": [
+ ""
+ ],
+ "js": [
+ "scripts/content-scripts/document_end.js"
+ ],
+ "run_at": "document_end"
+ }
+ ],
+ "web_accessible_resources": [
+ {
+ "resources": [
+ "scripts/content-scripts/*.js",
+ "scripts/content-scripts/*.css"
+ ],
+ "matches": [
+ ""
+ ]
+ }
+ ],
+ "declarative_net_request": {
+ "rule_resources": [
+ {
+ "id": "ruleset_1",
+ "enabled": true,
+ "path": "scripts/net-request-rules/rules.json"
+ }
+ ]
+ }
}
\ No newline at end of file
diff --git a/md/CHANGELOGS.md b/md/CHANGELOGS.md
index dfe8e46a..d764346a 100644
--- a/md/CHANGELOGS.md
+++ b/md/CHANGELOGS.md
@@ -1,26 +1,94 @@
## Change logs
+
+ v1.3 - 27/11/2022
+
+- 28 scripts mới:
+
+ 1. getLinkLuanxt
+ 2. getFavicon
+ 3. download_audio
+ 4. nhaccuatui_downloader
+ 5. zingmp3_downloadMusic
+ 6. zingmp3_oldLayout
+ 7. download_video2
+ 8. download_image
+ 9. fb_checkToken
+ 10. fb_getTokenBussinessLocation
+ 11. fb_getTokenBusinessStudio
+ 12. fb_getTokenCampaigns
+ 13. fb_getTokenLocmai
+ 14. fb_videoDownloader
+ 15. insta_getUserInfo
+ 16. instantgram
+ 17. tiktok_downloadVideo
+ 18. douyin_downloadVideo
+ 19. getAllEmailsInWeb
+ 20. screenshotFullPage
+ 21. webToPDF
+ 22. transfer_sh
+ 23. jsonformatter
+ 24. shortenURL
+ 25. unshorten
+ 26. viewBrowserInfo
+ 27. injectScriptToWebsite
+ 28. visualEvent
+
+- Fix/Update các scripts:
+
+ 1. archiveToday
+ 2. checkWebDie
+ 3. darkModePDF
+ 4. doutube_downloadWatchingVideo
+ 5. doutube_getAllVideoInUserProfile
+ 6. fb_downloadAlbumMedia
+ 7. fb_getAvatarFromUid
+ 8. fb_getTimelineAlbumId
+ 9. fb_getTokenMFacebook
+ 10. fb_getUid
+ 11. googleCache
+ 12. openWaybackUrl
+ 13. search_sharedAccount
+ 14. shortenURL
+ 15. showTheImages
+ 16. textToQRCode
+ 17. viewCookies
+ 18. youtube_downloadVideo
+
+- Fix/Update extension:
+ - **hot tab**: hiển thị tất cả scripts có badge 'hot'
+ - **new tab**: hiển thị tất cả scripts badge 'new'
+ - **open extension in external popup**: Mở extension sang popup window mới, ko bị tắt popup khi chuyển trang
+ - **content-script**: document_start, document_idle, document_end
+ - **useful-scripts-utils**: hỗ trợ dev trong quá trình hack web, tạo script mới :))
+ - **runInExtensionContext**: script chạy trong extension context sẽ có nhiều quyền hơn, khi fetch không bị lỗi cors, truy cập được các quyền dành riêng cho extension, ...
+ - **loading UI**: giao diện loading, dành cho các script runInExtensionContext=true
+
+
+
v1.2 - 08/11/2022
- 9 scripts mới:
- 1. archiveToday
- 2. cssSelectorViewer
- 3. download_video2
- 4. getAllEmailsInWeb
- 5. payWallKiller
- 6. showHiddenFields
- 7. showTheImages
- 8. viewWebMetaInfo
- 9. whois
- 10. youtube nonstop
+
+ 1. archiveToday
+ 2. cssSelectorViewer
+ 3. download_video2
+ 4. getAllEmailsInWeb
+ 5. payWallKiller
+ 6. showHiddenFields
+ 7. showTheImages
+ 8. viewWebMetaInfo
+ 9. whois
+ 10. youtube nonstop
- Fix các scripts:
- 1. perfomanceAnalyzer
- 2. remove cookies
- 3. view cookies
- 4. viewPartialSource
- 5. youtube_downloadVideo
+
+ 1. perfomanceAnalyzer
+ 2. remove cookies
+ 3. view cookies
+ 4. viewPartialSource
+ 5. youtube_downloadVideo
- Fix extension:
- await in lang.js (bug crash on cent browser)
diff --git a/md/LIST_SCRIPTS_EN.md b/md/LIST_SCRIPTS_EN.md
index 07480b2b..f60362bc 100644
--- a/md/LIST_SCRIPTS_EN.md
+++ b/md/LIST_SCRIPTS_EN.md
@@ -1,231 +1,275 @@
-### Search
+### Search
- 1. [What font](/scripts/whatFont.js)
+ 1. [What font](/scripts/whatFont.js): Check font used in webpage
- 2. [Find alternative web](/scripts/similarWeb.js)
+ 2. [Find alternative web](/scripts/similarWeb.js): SimilarWeb - Access behind-the-scenes analytics for every site online
- 3. [Find shared login](/scripts/search_sharedAccount.js)
+ 3. [Find shared login](/scripts/search_sharedAccount.js): Get free shared account on internet
- 4. [View website stack](/scripts/whatWebsiteStack.js)
+ 4. [View website stack](/scripts/whatWebsiteStack.js): Technology that current website is using
- 5. [Who.is](/scripts/whois.js)
+ 5. [Who.is](/scripts/whois.js): Want to find out who owns a domain? Click on this!
- 6. [See web meta info (SEO)](/scripts/viewWebMetaInfo.js)
+ 6. [See web meta info (SEO)](/scripts/viewWebMetaInfo.js): Instantly shows meta information about the current site in an on-page iFrame.
- 7. [Where to find papers/books/pdf/...](/scripts/search_paperWhere.js)
+ 7. [Where to find papers/books/pdf/...](/scripts/search_paperWhere.js): Learn more and more
- 8. [Dowfor - Check web die](/scripts/checkWebDie.js)
+ 8. [Dowfor - Check web die](/scripts/checkWebDie.js): Check web die using downforeveryoneorjustme
- 9. [DownDetector - Check web die](/scripts/downDetector.js)
+ 9. [DownDetector - View report web crash](/scripts/downDetector.js): View web bug reports
- 10. [Open wayback url](/scripts/openWaybackUrl.js)
+ 10. [Open wayback url](/scripts/openWaybackUrl.js): Open wayback url for website
- 11. [Archive the current Page online](/scripts/archiveToday.js)
+ 11. [Archive the current Page online](/scripts/archiveToday.js): Creates an archive of the current page on archive.today.
-### Download
+### Download
- 12. [Download video 2 - use external website](/scripts/download_video2.js)
+ 12. [Get audio/video (luanxt)](/scripts/getLinkLuanxt.js): Support zingmp3 nhaccuatui youtube. Using API from luanxt.com
- 13. [Download video](/scripts/download_video.js)
+ 13. [Download favicon from website](/scripts/getFavicon.js): Get favicon link of current website
- 14. [Image Downloader](/scripts/download_image.js)
+--- Music ---
- 15. [Show all images in new frame](/scripts/showTheImages.js)
+ 14. [Show all audio in website](/scripts/download_audio.js): Will display all audio in website, easy to download/get link.
-### Google
+ 15. [Nhaccuatui music/lyric downloader](/scripts/nhaccuatui_downloader.js): Download the song that be playing in Nhaccuatui
- 16. [Check total indexed pages](/scripts/search_totalIndexedPages.js)
+ 16. [Zingmp3 music dowloader (API)](/scripts/zingmp3_downloadMusic.js): Download music on mp3.zing.vn and zingmp3.vn using zingmp3 API
- 17. [Google site search](/scripts/search_googleSite.js)
+ 17. [Zingmp3 old/new layout](/scripts/zingmp3_oldLayout.js): Toggle UI zingmp3 old/new
- 18. [Google shortcuts](/scripts/googleShortcuts.js)
+--- Videos ---
- 19. [View Google cache of website](/scripts/googleCache.js)
+ 18. [Download video](/scripts/download_video.js): Can be used on almost any website
-### Facebook
+ 19. [Download video 2 - use external website](/scripts/download_video2.js): Download video from youtube, reddit, twitter, vidmax, liveleak, dailymotion, metacafe, ...
+
+--- Photos ---
+
+ 20. [Show all images in new frame](/scripts/showTheImages.js): Will even show hidden images as well as pulling them out of a slider/rotator.
+
+ 21. [Image Downloader](/scripts/download_image.js): Download all images in viewport
+
+### Google
+
+ 22. [Check total indexed pages](/scripts/search_totalIndexedPages.js): Know how many pages of current website is indexed in Google
+
+ 23. [Google site search](/scripts/search_googleSite.js): Search in google while limiting the search result to currently opened webpage.
+
+ 24. [Google shortcuts](/scripts/googleShortcuts.js): Create new google doc/sheet/slide/form/site/keep/calendar
+
+ 25. [View Google cache of website](/scripts/googleCache.js): View blocked website
+
+### Facebook
--- UI ---
- 20. [Toggle light fb newfeed](/scripts/fb_toggleLight.js)
+ 26. [Toggle light fb newfeed](/scripts/fb_toggleLight.js): Hide Navigator bar and complementary bar
--- Access Token ---
- 21. [Get fb token full permission (ffb.vn)](/scripts/fb_getTokenFfb.js)
+ 27. [Check fb access token](/scripts/fb_checkToken.js): Check type, permissions, created date, expired date, ...
+
+ 28. [Get fb token from cookie (ffb.vn)](/scripts/fb_getTokenFfb.js): Post your fb cookie to ffb.vn API
+
+ 29. [Get fb token EAAG (business_locations)](/scripts/fb_getTokenBussinessLocation.js): Get fb token EAAG from business.facebook.com
- 22. [Get fb Token (business.facebook.com)](/scripts/fb_getTokenBusiness.js)
+ 30. [Get fb token EAAc (studio)](/scripts/fb_getTokenBusinessStudio.js): Get facebook access token from business.facebook.com
- 23. [Get fb Token (www.facebook.com)](/scripts/fb_getTokenFacebook.js)
+ 31. [Get fb token EAAB (campaigns)](/scripts/fb_getTokenCampaigns.js): Get fb token EAAG from www.facebook.com campaigns
- 24. [Get fb Token (m.facebook.com)](/scripts/fb_getTokenMFacebook.js)
+ 32. [Get fb token EAAB (instagram)](/scripts/fb_getTokenFacebook.js): Get facebook access token from www.facebook.com
+
+ 33. [Get fb Token (m.facebook.com)](/scripts/fb_getTokenMFacebook.js): Get facebook access token from m.facebook.com
+
+ 34. [Get fb token (locmai)](/scripts/fb_getTokenLocmai.js):
--- Get ID ---
- 25. [Get fb User ID](/scripts/fb_getUid.js)
+ 35. [Get fb User ID](/scripts/fb_getUid.js): Get id of user in current website
+
+ 36. [Get fb Page ID](/scripts/fb_getPageId.js): Get id of page in current website
- 26. [Get fb Page ID](/scripts/fb_getPageId.js)
+ 37. [Get fb Group ID](/scripts/fb_getGroupId.js): Get id of group in current website
- 27. [Get fb Group ID](/scripts/fb_getGroupId.js)
+ 38. [Get fb Album ID](/scripts/fb_getAlbumId.js): Get id of album in current website
- 28. [Get fb Album ID](/scripts/fb_getAlbumId.js)
+ 39. [Get id of fb timeline album](/scripts/fb_getTimelineAlbumId.js): Get timeline album id of page/user in current website
- 29. [Get timeline Album ID of fb page](/scripts/fb_getTimelineAlbumId.js)
+ 40. [Get all fb Video ID](/scripts/fb_getAllVideoId.js): Get id of all video in current website
- 30. [Get all fb Video ID](/scripts/fb_getAllVideoId.js)
+ 41. [Get all fb Album ID](/scripts/fb_getAllAlbumId.js): Get all id of album in current website
- 31. [Get all fb Album ID](/scripts/fb_getAllAlbumId.js)
+ 42. [Get fb User ID from url](/scripts/fb_getUidFromUrl.js): Get id of user from entered url
- 32. [Get fb User ID from url](/scripts/fb_getUidFromUrl.js)
+ 43. [Get all fb User ID from search page](/scripts/fb_getAllUidFromFbSearch.js): Get id of all user from fb search page
- 33. [Get all fb User ID from search page](/scripts/fb_getAllUidFromFbSearch.js)
+ 44. [Get all fb User ID from Friends page](/scripts/fb_getAllUidFromFriendsPage.js): Get id of all user from friends page
- 34. [Get all fb User ID from Friends page](/scripts/fb_getAllUidFromFriendsPage.js)
+ 45. [Get all fb User ID from group](/scripts/fb_getAllUidOfGroupMembers.js): Get id of all user from group members
- 35. [Get all fb User ID from group](/scripts/fb_getAllUidOfGroupMembers.js)
+--- Download ---
+
+ 46. [Facebook - Download video/reel/watch](/scripts/fb_videoDownloader.js): Download facebook video/reel/watch
+
+ 47. [Get avatar from fb user id](/scripts/fb_getAvatarFromUid.js): Get avatar from list user ids
+
+ 48. [Download fb album media links](/scripts/fb_downloadAlbumMedia.js): Download photo/video links from album
+
+### Instagram
+
+ 49. [Get token insta](/scripts/insta_getToken.js): Get instagram access token
+
+ 50. [Get insta user info (uid, avatar, ...)](/scripts/insta_getUserInfo.js): Get uid, avatar, name, ...
--- Download ---
- 36. [Get avatar from fb user id](/scripts/fb_getAvatarFromUid.js)
+ 51. [Instantgram - Download full-size image](/scripts/instantgram.js): Download full-size instagram image in 1 click
- 37. [Get download link of current fb video](/scripts/fb_downloadCurrentVideo.js)
+ 52. [Get all media of insta user](/scripts/insta_getAllUserMedia.js): Get all media of instagram user
- 38. [Download fb album media links](/scripts/fb_downloadAlbumMedia.js)
+ 53. [Get all images in insta newfeed](/scripts/insta_getAllImagesInNewFeed.js): Get all images in newfeed
-### Instagram
+ 54. [Get all images in insta user profile](/scripts/insta_getAllImagesInUserProfile.js): Get all images in user profile
- 39. [Enable download instagram photos/videos](/scripts/insta_enableDownloadImage.js)
+### Youtube
- 40. [Get token insta](/scripts/insta_getToken.js)
+ 55. [Download youtube video (bypass 18+)](/scripts/youtube_downloadVideo.js): Bypass age restriction, without login
- 41. [Get your insta User ID](/scripts/insta_getUid.js)
+ 56. [Picture in Picture](/scripts/pictureInPicture.js): Watch videos in a floating window
- 42. [Get all media of insta user](/scripts/insta_getAllUserMedia.js)
+ 57. [Toggle light youtube](/scripts/youtube_toggleLight.js): Toggle light on/off to focus to youtube video
- 43. [Get all images in insta newfeed](/scripts/insta_getAllImagesInNewFeed.js)
+ 58. [View youtube video dislikes](/scripts/youtube_viewDislikes.js): Know how many dislike does youtube video have
- 44. [Get all images in insta user profile](/scripts/insta_getAllImagesInUserProfile.js)
+ 59. [Youtube nonstop](/scripts/youtube_nonstop.js): Kiss the annoying "Video paused. Continue watching?" confirmation goodbye!
-### Youtube
+ 60. [Youtube popup player](/scripts/youtube_popupPlayer.js): Open current youtube video in new popup player
- 45. [Download youtube video (bypass 18+)](/scripts/youtube_downloadVideo.js)
+### Tiktok
- 46. [Picture in Picture](/scripts/pictureInPicture.js)
+ 61. [Tiktok - Download video (Snaptik)](/scripts/tiktok_downloadVideo.js): Download tiktok video using Snaptik API
- 47. [Toggle light youtube](/scripts/youtube_toggleLight.js)
+ 62. [Douyin - Download videos](/scripts/douyin_downloadVideo.js): Show all downloadable videos in current douyin webpage
- 48. [View youtube video dislikes](/scripts/youtube_viewDislikes.js)
+--- Doutu.be ---
- 49. [Youtube nonstop](/scripts/youtube_nonstop.js)
+ 63. [Enable download all video](/scripts/doutube_enableDownloadVideo.js): Enable download button for all video
- 50. [Youtube popup player](/scripts/youtube_popupPlayer.js)
+ 64. [Download video doutu.be](/scripts/doutube_downloadWatchingVideo.js): Download video doutu.be that you are watching
-### Github
+ 65. [Download doutu.be story](/scripts/doutube_downloadWatchingStory.js): Download story that you are watching
- 51. [Go to first commit](/scripts/github_goToFirstCommit.js)
+ 66. [Get all video from user doutu.be profile](/scripts/doutube_getAllVideoInUserProfile.js): Get all video in doutu.be user profile
- 52. [Open repo in github.dev](/scripts/githubdev.js)
+### Github
- 53. [Open repo in github1s.com](/scripts/github1s.js)
+ 67. [Go to first commit](/scripts/github_goToFirstCommit.js): Go to first commit of github repo
-### Doutu.be
+ 68. [Open repo in github.dev](/scripts/githubdev.js): Open current repo in github.dev
- 54. [Enable download all video](/scripts/doutube_enableDownloadVideo.js)
+ 69. [Open repo in github1s.com](/scripts/github1s.js): Open current repo in github1s.com
- 55. [Download video doutu.be](/scripts/doutube_downloadWatchingVideo.js)
+### Automation
- 56. [Download doutu.be story](/scripts/doutube_downloadWatchingStory.js)
+ 70. [Text to QR Code](/scripts/textToQRCode.js): Convert text to QR Code
- 57. [Get all video from user doutu.be profile](/scripts/doutube_getAllVideoInUserProfile.js)
+ 71. [URL to QR Code](/scripts/webToQRCode.js): Convert current website URL to QR Code
-### PDF
+ 72. [Extract all Emails from website](/scripts/getAllEmailsInWeb.js): Extracts all emails and displays them in a popup iFrame (enable popups!)
- 58. [Darkmode for pdf](/scripts/darkModePDF.js)
+ 73. [Screenshot full webpage](/scripts/screenshotFullPage.js): Taking a screenshot of an entire webpage
- 59. [Web to PDF](/scripts/webToPDF.js)
+ 74. [Web to PDF](/scripts/webToPDF.js): Convert current website to PDF
-### QR Code
+ 75. [Transfer.sh - Share file faster](/scripts/transfer_sh.js): Upload file and get URL to share
- 60. [Text to QR Code](/scripts/textToQRCode.js)
+ 76. [JSON formatter](/scripts/jsonformatter.js): Open web tool for beautify JSON in new tab
- 61. [URL to QR Code](/scripts/webToQRCode.js)
+ 77. [Performance Analyzer](/scripts/performanceAnalyzer.js): Check performance metrics of website
-### Automation
+ 78. [Scroll to very end](/scripts/scrollToVeryEnd.js): Scoll to end, then wait for load data, then scroll again... Mouse click to cancel
- 62. [Extract all Emails from website](/scripts/getAllEmailsInWeb.js)
+### Password
- 63. [Performance Analyzer](/scripts/performanceAnalyzer.js)
+ 79. [Password generator](/scripts/passwordGenerator.js): You only have to remember 1 password
- 64. [Scroll to very end](/scripts/scrollToVeryEnd.js)
+ 80. [Find shared login](/scripts/search_sharedAccount.js): Get free shared account on internet
-### Password
+ 81. [Password field toggle](/scripts/passwordFieldToggle.js): Toggle password field to text field to view hidden password
- 65. [Password generator](/scripts/passwordGenerator.js)
+### Unlock
- 66. [Find shared login](/scripts/search_sharedAccount.js)
+ 82. [Shorten URL](/scripts/shortenURL.js): Support tinyurl, tnyim, cuttly, bitly, j2team, ...
- 67. [Password field toggle](/scripts/passwordFieldToggle.js)
+ 83. [Unshorten link](/scripts/unshorten.js): Get origin URL of shortened url
-### Unlock
+ 84. [View browser information](/scripts/viewBrowserInfo.js): OS name, browser name, version, userAgent, ...
- 68. [Show hidden fields](/scripts/showHiddenFields.js)
+ 85. [Show hidden fields](/scripts/showHiddenFields.js): Reveals hidden fields on a webpage. Find things like tokens, etc
- 69. [View cookies](/scripts/viewCookies.js)
+ 86. [View cookies](/scripts/viewCookies.js): View cookies saved in current website
- 70. [Remove cookies](/scripts/removeCookies.js)
+ 87. [Remove cookies](/scripts/removeCookies.js): Remove cookies from current website
- 71. [Re-Enable text selection](/scripts/enableTextSelection.js)
+ 88. [Re-Enable text selection](/scripts/enableTextSelection.js): Enable text selection for website
- 72. [Re-Enable context menu (right click)](/scripts/reEnableContextMenu.js)
+ 89. [Re-Enable context menu (right click)](/scripts/reEnableContextMenu.js): Enable context menu for website
- 73. [Bypass Paywalls](/scripts/paywallKiller.js)
+ 90. [Inject script to website](/scripts/injectScriptToWebsite.js):
-### Web UI
+ 91. [Bypass Paywalls](/scripts/paywallKiller.js):
- 74. [Toggle edit page](/scripts/toggleEditPage.js)
+### Web UI
- 75. [Scroll by dragging](/scripts/scrollByDrag.js)
+ 92. [Darkmode for pdf](/scripts/darkModePDF.js): Enable/Disable darkmode for PDF
+
+ 93. [Toggle edit page](/scripts/toggleEditPage.js): Edit all text in website
+
+ 94. [Scroll by dragging](/scripts/scrollByDrag.js): Use this will turn the cursor into a scroller and use it again will return it back to normal.
+
+ 95. [Run Stat.js](/scripts/runStatJs.js): Run stat.js in current website
--- View ---
- 76. [View all images in web](/scripts/listAllImagesInWeb.js)
+ 96. [Show all javascript events](/scripts/visualEvent.js): Visual Event - Visually show Javascript events on a page
+
+ 97. [View all images in web](/scripts/listAllImagesInWeb.js): View all images in web
- 77. [View all links](/scripts/viewAllLinks.js)
+ 98. [View all links](/scripts/viewAllLinks.js): Show all links and anchor text of current page.
- 78. [View scripts used](/scripts/viewScriptsUsed.js)
+ 99. [View scripts used](/scripts/viewScriptsUsed.js): View all scripts used in current website
- 79. [View stylesheet used](/scripts/viewStylesUsed.js)
+ 100. [View stylesheet used](/scripts/viewStylesUsed.js): View all stylesheet used in current website
- 80. [CSS selector viewer](/scripts/cssSelectorViewer.js)
+ 101. [CSS selector viewer](/scripts/cssSelectorViewer.js): Inspect css at specific element on the web
- 81. [View source code of selected area](/scripts/viewPartialSource.js)
+ 102. [View source code of selected area](/scripts/viewPartialSource.js): Just select the area and use this bookmarklet
--- Remove ---
- 82. [Remove all colors in web](/scripts/removeColours.js)
+ 103. [Remove all colors in web](/scripts/removeColours.js): Remove all colours in the web
- 83. [Remove stylesheet](/scripts/removeStylesheet.js)
+ 104. [Remove stylesheet](/scripts/removeStylesheet.js): Remove all stylesheet from website
- 84. [Remove images](/scripts/removeImages.js)
+ 105. [Remove images](/scripts/removeImages.js): Remove all images from website
- 85. [Remove bloat (iframe, embed)](/scripts/removeBloat.js)
+ 106. [Remove bloat (iframe, embed)](/scripts/removeBloat.js): Remove iframe, embeds, applets from website
--- Table ---
- 86. [Add sort to table](/scripts/table_addSortTable.js)
+ 107. [Add sort to table](/scripts/table_addSortTable.js): Add sort functions to table
- 87. [Add number columns](/scripts/table_addNumberColumn.js)
+ 108. [Add number columns](/scripts/table_addNumberColumn.js): Add number columns to table
- 88. [Swap rows and columns](/scripts/table_swapRowAndColumn.js)
+ 109. [Swap rows and columns](/scripts/table_swapRowAndColumn.js): Swap rows and columns (transpose)
--- More ---
- 89. [Highlight internal/external link](/scripts/internalOrExternalLink.js)
-
- 90. [Get window size](/scripts/getWindowSize.js)
-
- 91. [Let it snow](/scripts/letItSnow.js)
-
-### More
+ 110. [Highlight internal/external link](/scripts/internalOrExternalLink.js): +Red = Internal_link
++Orange = Currently_opened_link
++Blue = External_link
- 92. [Shorten URL (j2team)](/scripts/shortenURL.js)
+ 111. [Get window size](/scripts/getWindowSize.js): Alerts the width and height in pixels of the inner window.
- 93. [Run Stat.js](/scripts/runStatJs.js)
+ 112. [Let it snow](/scripts/letItSnow.js): Make website like it snowing
\ No newline at end of file
diff --git a/md/LIST_SCRIPTS_VI.md b/md/LIST_SCRIPTS_VI.md
index b9386418..a03a354d 100644
--- a/md/LIST_SCRIPTS_VI.md
+++ b/md/LIST_SCRIPTS_VI.md
@@ -1,231 +1,275 @@
-### Tìm kiếm
+### Tìm kiếm
- 1. [Kiểm tra font chữ](/scripts/whatFont.js)
+ 1. [Kiểm tra font chữ](/scripts/whatFont.js): Kiểm tra xem từng phần tử trong web dùng font chữ gì
- 2. [Tìm trang web tương tự](/scripts/similarWeb.js)
+ 2. [Tìm trang web tương tự](/scripts/similarWeb.js): SimilarWeb - Phân tích chi tiết cho mọi trang web trực tuyến
- 3. [Tìm tài khoản miễn phí](/scripts/search_sharedAccount.js)
+ 3. [Tìm tài khoản miễn phí](/scripts/search_sharedAccount.js): Tìm tài khoản được chia sẻ trên mạng cho trang web hiện tại
- 4. [Web dùng công nghệ gì?](/scripts/whatWebsiteStack.js)
+ 4. [Web dùng công nghệ gì?](/scripts/whatWebsiteStack.js): Xem những công nghệ/thư viện trang web đang dùng
- 5. [Who.is](/scripts/whois.js)
+ 5. [Who.is](/scripts/whois.js): Muốn biết ai đang giữ domain này? Click ngay!
- 6. [Xem thông tin meta của web (SEO)](/scripts/viewWebMetaInfo.js)
+ 6. [Xem thông tin meta của web (SEO)](/scripts/viewWebMetaInfo.js): Xem thông tin meta của website trực tiếp trong trang web
- 7. [Tìm bài báo/sách/pdf/...ở đâu?](/scripts/search_paperWhere.js)
+ 7. [Tìm bài báo/sách/pdf/...ở đâu?](/scripts/search_paperWhere.js): Học, học nữa, học mãi
- 8. [Dowfor - Kiểm tra web die](/scripts/checkWebDie.js)
+ 8. [Dowfor - Kiểm tra web die](/scripts/checkWebDie.js): Dùng bên thứ 3 để kiểm tra xem website có bị die thật không
- 9. [DownDetector - Kiểm tra web die](/scripts/downDetector.js)
+ 9. [DownDetector - Thống kê sự cố web](/scripts/downDetector.js): Xem thống kê các báo cáo về sự cố web
- 10. [Xem wayback url của website](/scripts/openWaybackUrl.js)
+ 10. [Xem wayback url của website](/scripts/openWaybackUrl.js): Giúp xem nội dung website trong quá khứ
- 11. [Lưu trữ online trang hiện tại](/scripts/archiveToday.js)
+ 11. [Lưu trữ online trang hiện tại](/scripts/archiveToday.js): Lưu trang web hiện tại lên archive.today
-### Tải xuống
+### Tải xuống
- 12. [Tải video 2 - dùng web ngoài](/scripts/download_video2.js)
+ 12. [Tải nhạc/video (luanxt)](/scripts/getLinkLuanxt.js): Hỗ trợ zingmp3 nhaccuatui youtube. Sử dụng API của luanxt.com
- 13. [Tải video](/scripts/download_video.js)
+ 13. [Tải favicon của trang web](/scripts/getFavicon.js): Lấy link favicon của trang web
- 14. [Image Downloader - Tải hình ảnh](/scripts/download_image.js)
+--- Nhạc ---
- 15. [Hiển thị mọi hình ảnh trong khung mới](/scripts/showTheImages.js)
+ 14. [Hiển thị mọi audio trong trang web](/scripts/download_audio.js): Hiển thị tất cả tag audio/âm thanh trong trang web, giúp dễ dàng tải xuống/lấy link.
-### Google
+ 15. [Nhaccuatui tải nhạc/lời](/scripts/nhaccuatui_downloader.js): Tải bài nhạc / lời bài hát đang nghe trên Nhaccuatui
- 16. [Xem các pages được google quét](/scripts/search_totalIndexedPages.js)
+ 16. [Zingmp3 tải nhạc (API)](/scripts/zingmp3_downloadMusic.js): Tải nhạc trên mp3.zing.vn và zingmp3.vn thông qua zingmp3 API
- 17. [Tìm kiếm trên trang web này](/scripts/search_googleSite.js)
+ 17. [Zingmp3 giao diện cũ/mới](/scripts/zingmp3_oldLayout.js): Bật/tắt giao diện zingmp3 mới/cũ
- 18. [Google phím tắt](/scripts/googleShortcuts.js)
+--- Video ---
- 19. [Xem Google cache của trang web](/scripts/googleCache.js)
+ 18. [Tải video](/scripts/download_video.js): Dùng được cho gần như tất cả trang web
-### Facebook
+ 19. [Tải video 2 - dùng web ngoài](/scripts/download_video2.js): Tải video từ youtube, reddit, twitter, vidmax, liveleak, dailymotion, metacafe, ...
+
+--- Ảnh ---
+
+ 20. [Hiển thị mọi hình ảnh trong khung mới](/scripts/showTheImages.js): Sẽ thấy đươc ảnh bị ẩn, dễ dàng chuột phải để tải về
+
+ 21. [Image Downloader - Tải hình ảnh](/scripts/download_image.js): Tải tất cả hình ảnh đang thấy trong trang web
+
+### Google
+
+ 22. [Xem các pages được google quét](/scripts/search_totalIndexedPages.js): Biết có bao nhiêu trang con của website hiện tại đã được quét bởi Google
+
+ 23. [Tìm kiếm trên trang web này](/scripts/search_googleSite.js): Sử dụng google site search
+
+ 24. [Google phím tắt](/scripts/googleShortcuts.js): Tạo mới google doc/sheet/slide/form/site/keep/calendar
+
+ 25. [Xem Google cache của trang web](/scripts/googleCache.js): Phù hơp để xem các trang web bị block
+
+### Facebook
--- Giao diện ---
- 20. [Bật/tắt đèn fb newfeed](/scripts/fb_toggleLight.js)
+ 26. [Bật/tắt đèn fb newfeed](/scripts/fb_toggleLight.js): Ẩn giao diện 2 bên newfeed, giúp tập trung vào newfeed
--- Access Token ---
- 21. [Lấy token fb đủ quyền (ffb.vn)](/scripts/fb_getTokenFfb.js)
+ 27. [Kiểm tra fb access token](/scripts/fb_checkToken.js): Kiểm tra loại, quyền, ngày tạo, ngày hết hạn, ...
+
+ 28. [Lấy fb token từ cookie (ffb.vn)](/scripts/fb_getTokenFfb.js): Gửi cookie fb lên API của ffb.vn
+
+ 29. [Lấy fb token EAAG (business_locations)](/scripts/fb_getTokenBussinessLocation.js): Lấy fb token EAAG từ business.facebook.com
- 22. [Lấy fb token (business.facebook.com)](/scripts/fb_getTokenBusiness.js)
+ 30. [Lấy fb token EAAc (studio)](/scripts/fb_getTokenBusinessStudio.js): Lấy facebook access token từ trang business.facebook.com
- 23. [Lấy fb Token (www.facebook.com)](/scripts/fb_getTokenFacebook.js)
+ 31. [Lấy fb token EAAB (campaigns)](/scripts/fb_getTokenCampaigns.js): Lấy fb token EAAG từ www.facebook.com campaigns
- 24. [Lấy fb token (m.facebook.com)](/scripts/fb_getTokenMFacebook.js)
+ 32. [Lấy fb token EAAB (instagram)](/scripts/fb_getTokenFacebook.js): Lấy facebook access token từ trang www.facebook.com
+
+ 33. [Lấy fb token (m.facebook.com)](/scripts/fb_getTokenMFacebook.js): Lấy facebook access token từ trang m.facebook.com
+
+ 34. [Lấy fb token (locmai)](/scripts/fb_getTokenLocmai.js):
--- Lấy ID ---
- 25. [Lấy fb User ID](/scripts/fb_getUid.js)
+ 35. [Lấy fb User ID](/scripts/fb_getUid.js): Lấy id của user trong trang web hiện tại
+
+ 36. [Lấy fb Page ID](/scripts/fb_getPageId.js): Lấy id của page trong trang web hiện tại
- 26. [Lấy fb Page ID](/scripts/fb_getPageId.js)
+ 37. [Lấy fb Group ID](/scripts/fb_getGroupId.js): Lấy id của group trong trang web hiện tại
- 27. [Lấy fb Group ID](/scripts/fb_getGroupId.js)
+ 38. [Lấy fb Album ID](/scripts/fb_getAlbumId.js): Lấy id của album trong trang web hiện tại
- 28. [Lấy fb Album ID](/scripts/fb_getAlbumId.js)
+ 39. [Tìm id của album fb chứa mọi ảnh tải lên](/scripts/fb_getTimelineAlbumId.js): Tìm album chứa tất cả ảnh trên dòng thời gian của page/user hiện tại
- 29. [Tìm timeline album id của fb page](/scripts/fb_getTimelineAlbumId.js)
+ 40. [Tìm tất cả fb video id](/scripts/fb_getAllVideoId.js): Tìm tất cả video id trong trang web
- 30. [Tìm tất cả fb video id](/scripts/fb_getAllVideoId.js)
+ 41. [Lấy tất cả fb album id](/scripts/fb_getAllAlbumId.js): Lấy tất cả album id có trong trang web
- 31. [Lấy tất cả fb album id](/scripts/fb_getAllAlbumId.js)
+ 42. [Lấy fb User ID từ URL](/scripts/fb_getUidFromUrl.js): Lấy id của user từ URL truyền vào
- 32. [Lấy fb User ID từ URL](/scripts/fb_getUidFromUrl.js)
+ 43. [Lấy tất cả fb user ID từ trang tìm kiếm](/scripts/fb_getAllUidFromFbSearch.js): Lấy id của tất cả user từ trang tìm kiếm người dùng
- 33. [Lấy tất cả fb user ID từ trang tìm kiếm](/scripts/fb_getAllUidFromFbSearch.js)
+ 44. [Lấy tất cả fb user id từ danh sách bạn bè](/scripts/fb_getAllUidFromFriendsPage.js): Lấy tất cả user ID từ trang danh sách bạn bè
- 34. [Lấy tất cả fb user id từ danh sách bạn bè](/scripts/fb_getAllUidFromFriendsPage.js)
+ 45. [Lấy tất cả fb user ID từ group](/scripts/fb_getAllUidOfGroupMembers.js): Lấy id của tất cả user từ group
- 35. [Lấy tất cả fb user ID từ group](/scripts/fb_getAllUidOfGroupMembers.js)
+--- Tải xuống ---
+
+ 46. [Facebook - Tải video/reel/watch](/scripts/fb_videoDownloader.js): Tải facebook video/reel/watch
+
+ 47. [Tải avatar từ fb user id](/scripts/fb_getAvatarFromUid.js): Tải danh sách avatar từ danh sách user id
+
+ 48. [Tải link ảnh/video từ album fb](/scripts/fb_downloadAlbumMedia.js): Tải về danh sách link ảnh/video
+
+### Instagram
+
+ 49. [Lấy token insta](/scripts/insta_getToken.js): Lấy instagram access token
+
+ 50. [Lấy insta thông tin user (uid, avatar, ...)](/scripts/insta_getUserInfo.js): Lấy uid, avatar, tên, ...
--- Tải xuống ---
- 36. [Tải avatar từ fb user id](/scripts/fb_getAvatarFromUid.js)
+ 51. [Instantgram - Tải ảnh chất lượng cao](/scripts/instantgram.js): Tải ảnh instagram chất lượng cao bằng 1 click
- 37. [Tải video fb đang xem](/scripts/fb_downloadCurrentVideo.js)
+ 52. [Tải về tất cả media của insta user](/scripts/insta_getAllUserMedia.js): Tải về tất cả ảnh/video của người dùng insta
- 38. [Tải link ảnh/video từ album fb](/scripts/fb_downloadAlbumMedia.js)
+ 53. [Tải về tất cả ảnh insta newfeed](/scripts/insta_getAllImagesInNewFeed.js): Tải về tất cả ảnh đang có trên newfeed
-### Instagram
+ 54. [Tải tất cả ảnh insta user profile](/scripts/insta_getAllImagesInUserProfile.js): Tải tất cả ảnh có trong profile của user bất kỳ
- 39. [Cho phép chuột phải tải ảnh/video instagram](/scripts/insta_enableDownloadImage.js)
+### Youtube
- 40. [Lấy token insta](/scripts/insta_getToken.js)
+ 55. [Tải video youtube (bypass 18+)](/scripts/youtube_downloadVideo.js): Tải cả video giới hạn độ tuổi, không cần đăng nhập
- 41. [Lấy insta user id của bạn](/scripts/insta_getUid.js)
+ 56. [Picture in Picture](/scripts/pictureInPicture.js): Xem video trong cửa sổ nổi
- 42. [Tải về tất cả media của insta user](/scripts/insta_getAllUserMedia.js)
+ 57. [Tắt/Mở đèn youtube](/scripts/youtube_toggleLight.js): Tắt/Mở đèn để tập trung xem video youtube
- 43. [Tải về tất cả ảnh insta newfeed](/scripts/insta_getAllImagesInNewFeed.js)
+ 58. [Xem lượng dislike video youtube](/scripts/youtube_viewDislikes.js): Biết số lượt dislikes (không thích) video youtube
- 44. [Tải tất cả ảnh insta user profile](/scripts/insta_getAllImagesInUserProfile.js)
+ 59. [Youtube nonstop](/scripts/youtube_nonstop.js): Phát youtube không còn bị làm phiền bởi popup 'Video đã tạm dừng. Bạn có muốn xem tiếp?' của youtube.
-### Youtube
+ 60. [Xem youtube trong popup](/scripts/youtube_popupPlayer.js): Xem video youtube hiện tại trong cửa sổ popup mới
- 45. [Tải video youtube (bypass 18+)](/scripts/youtube_downloadVideo.js)
+### Tiktok
- 46. [Picture in Picture](/scripts/pictureInPicture.js)
+ 61. [Tiktok - Tải video (Snaptik)](/scripts/tiktok_downloadVideo.js): Tải tiktok video sử dụng Snaptik API
- 47. [Tắt/Mở đèn youtube](/scripts/youtube_toggleLight.js)
+ 62. [Douyin - Tải videos](/scripts/douyin_downloadVideo.js): Hiển thị mọi video có thể tải trong trang douyin hiện tại
- 48. [Xem lượng dislike video youtube](/scripts/youtube_viewDislikes.js)
+--- Doutu.be ---
- 49. [Youtube nonstop](/scripts/youtube_nonstop.js)
+ 63. [Bật tải mọi video](/scripts/doutube_enableDownloadVideo.js): Bật chức năng download cho mọi video trong trang
- 50. [Xem youtube trong popup](/scripts/youtube_popupPlayer.js)
+ 64. [Tải video doutu.be](/scripts/doutube_downloadWatchingVideo.js): Tải video doutu.be bạn đang xem
-### Github
+ 65. [Tải story doutu.be](/scripts/doutube_downloadWatchingStory.js): Tải story bạn đang xem
- 51. [Đi tới commit đầu tiên](/scripts/github_goToFirstCommit.js)
+ 66. [Tải tất cả video từ doutu.be profile](/scripts/doutube_getAllVideoInUserProfile.js): Tải tất cả video từ profile của user doutu.be bất kỳ
- 52. [Mở repo trong github.dev](/scripts/githubdev.js)
+### Github
- 53. [Mở repo trong github1s.com](/scripts/github1s.js)
+ 67. [Đi tới commit đầu tiên](/scripts/github_goToFirstCommit.js): Đi tới commit đầu tiên của repo github
-### Doutu.be
+ 68. [Mở repo trong github.dev](/scripts/githubdev.js): Mở repo hiện tại trong trang github.dev để xem code
- 54. [Bật tải mọi video](/scripts/doutube_enableDownloadVideo.js)
+ 69. [Mở repo trong github1s.com](/scripts/github1s.js): Mở repo hiện tại trong trang github1s.com để xem code
- 55. [Tải video doutu.be](/scripts/doutube_downloadWatchingVideo.js)
+### Tự động hoá
- 56. [Tải story doutu.be](/scripts/doutube_downloadWatchingStory.js)
+ 70. [Chuyển chữ thành QRCode](/scripts/textToQRCode.js): Nhập vào chữ và nhận về QRCode tương ứng
- 57. [Tải tất cả video từ doutu.be profile](/scripts/doutube_getAllVideoInUserProfile.js)
+ 71. [Lấy QRCode cho web hiện tại](/scripts/webToQRCode.js): Chuyển URL của trang web sang QR Code
-### PDF
+ 72. [Trích xuất mọi emails từ trang web](/scripts/getAllEmailsInWeb.js): Trích xuất tất cả emails trong web và hiện trong popup mới
- 58. [Chế độ tối cho PDF](/scripts/darkModePDF.js)
+ 73. [Chụp ảnh toàn bộ web](/scripts/screenshotFullPage.js): Tạo ảnh chụp màn hình toàn bộ website
- 59. [In web ra PDF](/scripts/webToPDF.js)
+ 74. [In web ra PDF](/scripts/webToPDF.js): Chuyển trang web hiện tại thành PDF
-### QR Code
+ 75. [Transfer.sh - Chia sẻ file nhanh](/scripts/transfer_sh.js): Tải file lên và nhận về link để chia sẻ
- 60. [Chuyển chữ thành QRCode](/scripts/textToQRCode.js)
+ 76. [JSON formatter](/scripts/jsonformatter.js): Mở công cụ làm đẹp JSON trong tab mới
- 61. [Lấy QRCode cho web hiện tại](/scripts/webToQRCode.js)
+ 77. [Phân tích hiệu suất](/scripts/performanceAnalyzer.js): Phân tích hiệu suất website không cần biết code
-### Tự động hoá
+ 78. [Cuộn trang xuống cuối cùng](/scripts/scrollToVeryEnd.js): Cuộn tới khi nào không còn data load thêm nữa (trong 5s) thì thôi. Click chuột để huỷ.
- 62. [Trích xuất mọi emails từ trang web](/scripts/getAllEmailsInWeb.js)
+### Mật khẩu
- 63. [Phân tích hiệu suất](/scripts/performanceAnalyzer.js)
+ 79. [Tạo mật khẩu cho trang web](/scripts/passwordGenerator.js): Bạn chỉ còn cần phải nhớ 1 mật khẩu
- 64. [Cuộn trang xuống cuối cùng](/scripts/scrollToVeryEnd.js)
+ 80. [Tìm tài khoản miễn phí](/scripts/search_sharedAccount.js): Tìm tài khoản được chia sẻ trên mạng cho trang web hiện tại
-### Mật khẩu
+ 81. [Tắt/mở xem mật khẩu bị ẩn](/scripts/passwordFieldToggle.js): Bạn sẽ xem được mật khẩu bị ẩn trong khung đăng nhập
- 65. [Tạo mật khẩu cho trang web](/scripts/passwordGenerator.js)
+### Mở khoá
- 66. [Tìm tài khoản miễn phí](/scripts/search_sharedAccount.js)
+ 82. [Rút gọn link](/scripts/shortenURL.js): Hỗ trợ tinyurl, tnyim, cuttly, bitly, j2team, ...
- 67. [Tắt/mở xem mật khẩu bị ẩn](/scripts/passwordFieldToggle.js)
+ 83. [Giải mã link rút gọn](/scripts/unshorten.js): Lấy link gốc của link rút gọn
-### Mở khoá
+ 84. [Xem thông tin trình duyệt](/scripts/viewBrowserInfo.js): Hệ điều hành, tên trình duyệt, version, userAgent, ...
- 68. [Hiện các thành phần web bị ẩn](/scripts/showHiddenFields.js)
+ 85. [Hiện các thành phần web bị ẩn](/scripts/showHiddenFields.js): Web thường ẩn mốt số thành phần như token, id, form, ...
- 69. [Xem cookies](/scripts/viewCookies.js)
+ 86. [Xem cookies](/scripts/viewCookies.js): Xem cookies được lưu trong website hiện tại
- 70. [Xoá Cookies](/scripts/removeCookies.js)
+ 87. [Xoá Cookies](/scripts/removeCookies.js): Xoá cookies trang hiện tại
- 71. [Bật text selection](/scripts/enableTextSelection.js)
+ 88. [Bật text selection](/scripts/enableTextSelection.js): Dùng cho web nào không cho phép bôi đen văn bản
- 72. [Bật lại menu chuột phải](/scripts/reEnableContextMenu.js)
+ 89. [Bật lại menu chuột phải](/scripts/reEnableContextMenu.js): Dùng cho web nào không cho phép bật menu chuột phải
- 73. [Xem miễn phí trang tin tức trả phí](/scripts/paywallKiller.js)
+ 90. [Nhúng script vào trang web](/scripts/injectScriptToWebsite.js):
-### Giao diện
+ 91. [Xem miễn phí trang tin tức trả phí](/scripts/paywallKiller.js):
- 74. [Bật/tắt chế độ chỉnh sửa website](/scripts/toggleEditPage.js)
+### Giao diện
- 75. [Cuộn web bằng cách kéo thả](/scripts/scrollByDrag.js)
+ 92. [Chế độ tối cho PDF](/scripts/darkModePDF.js): Bật/Tắt chế độ tối cho PDF bạn đang xem
+
+ 93. [Bật/tắt chế độ chỉnh sửa website](/scripts/toggleEditPage.js): Cho phép chỉnh sửa mọi văn bản trong website
+
+ 94. [Cuộn web bằng cách kéo thả](/scripts/scrollByDrag.js): Bấm vào sẽ biến con trỏ thành con lăn và bấm lại nó sẽ đưa con trỏ trở lại bình thường
+
+ 95. [Chạy stats.js](/scripts/runStatJs.js): Tính toán FPS website
--- Xem ---
- 76. [Xem mọi hình ảnh có trong website](/scripts/listAllImagesInWeb.js)
+ 96. [Xem tất cả tất cả javascript events](/scripts/visualEvent.js): Visual Event - Hiển thị tất cả javascript events xuất hiện trong trang web
+
+ 97. [Xem mọi hình ảnh có trong website](/scripts/listAllImagesInWeb.js): Xem danh sách hình ảnh trong tab mới
- 77. [Xem tất cả link](/scripts/viewAllLinks.js)
+ 98. [Xem tất cả link](/scripts/viewAllLinks.js): Liệt kê tất cả đường link có trong website
- 78. [Xem tất cả scripts](/scripts/viewScriptsUsed.js)
+ 99. [Xem tất cả scripts](/scripts/viewScriptsUsed.js): Mở danh sách scripts đươc dùng bởi trang web trong tab mới
- 79. [Xem tất cả stylesheet](/scripts/viewStylesUsed.js)
+ 100. [Xem tất cả stylesheet](/scripts/viewStylesUsed.js): Mở danh sách css được dùng bởi website trong tab mới
- 80. [Trình kiểm tra css cục bộ](/scripts/cssSelectorViewer.js)
+ 101. [Trình kiểm tra css cục bộ](/scripts/cssSelectorViewer.js): Kiểm tra mã css cho thành phần bất kỳ trong trang web
- 81. [Xem mã nguồn của phần bôi đen](/scripts/viewPartialSource.js)
+ 102. [Xem mã nguồn của phần bôi đen](/scripts/viewPartialSource.js): Mở mã nguồn của phần được bôi đen trong tab mới
--- Xoá ---
- 82. [Xoá màu website](/scripts/removeColours.js)
+ 103. [Xoá màu website](/scripts/removeColours.js): Xoá mọi màu có trong website
- 83. [Xoá stylesheet](/scripts/removeStylesheet.js)
+ 104. [Xoá stylesheet](/scripts/removeStylesheet.js): Xem trang web sẽ ra sao khi không có css
- 84. [Xoá mọi hình ảnh](/scripts/removeImages.js)
+ 105. [Xoá mọi hình ảnh](/scripts/removeImages.js): Chỉ để lại văn bản, giúp tập trung hơn
- 85. [Xoá mọi iframe/embed](/scripts/removeBloat.js)
+ 106. [Xoá mọi iframe/embed](/scripts/removeBloat.js): Xoá mọi thứ gây xao nhãng (quảng cáo, web nhúng, ..)
--- Bảng ---
- 86. [Thêm sắp xếp cho bảng](/scripts/table_addSortTable.js)
+ 107. [Thêm sắp xếp cho bảng](/scripts/table_addSortTable.js): Thêm nút chức năng sắp xếp cho từng cột trong table
- 87. [Thêm cột số thứ tự](/scripts/table_addNumberColumn.js)
+ 108. [Thêm cột số thứ tự](/scripts/table_addNumberColumn.js): Thêm cột STT vào bên trái bảng
- 88. [Đổi chỗ hàng và cột](/scripts/table_swapRowAndColumn.js)
+ 109. [Đổi chỗ hàng và cột](/scripts/table_swapRowAndColumn.js): Hàng thành cột và cột thành hàng
--- Khác ---
- 89. [Tô màu cho link](/scripts/internalOrExternalLink.js)
-
- 90. [Lấy kích thước trang web](/scripts/getWindowSize.js)
-
- 91. [Hiệu ứng tuyết rơi](/scripts/letItSnow.js)
-
-### Khác
+ 110. [Tô màu cho link](/scripts/internalOrExternalLink.js): +Đỏ: cùng domain
++Cam: hiện tại
++Xanh: khác domain
- 92. [Rút gọn link (j2team)](/scripts/shortenURL.js)
+ 111. [Lấy kích thước trang web](/scripts/getWindowSize.js): đơn vị pixels
- 93. [Chạy stats.js](/scripts/runStatJs.js)
+ 112. [Hiệu ứng tuyết rơi](/scripts/letItSnow.js): Thêm hiệu ứng tuyết rơi vào trang web
\ No newline at end of file
diff --git a/md/exportScriptsToMd.js b/md/exportScriptsToMd.js
index c6ae1375..a614cf75 100644
--- a/md/exportScriptsToMd.js
+++ b/md/exportScriptsToMd.js
@@ -4,9 +4,7 @@ function generateMd(lang = "vi") {
let index = 1;
let md = tabs
.map((tab) => {
- let _p = document.createElement("p");
- _p.innerHTML = tab.name[lang];
- let title = _p.innerText;
+ let title = tab.name[lang];
let scripts = tab.scripts
?.map((script) => {
@@ -15,7 +13,7 @@ function generateMd(lang = "vi") {
}
return `\n ${index++}. [${script.name[lang]}](/scripts/${
script.id
- }.js)`;
+ }.js): ${script.description[lang]}`;
})
.join("\n");
diff --git a/pages/viewScriptSource/index.html b/pages/viewScriptSource/index.html
index d5d16881..d8dcd31a 100644
--- a/pages/viewScriptSource/index.html
+++ b/pages/viewScriptSource/index.html
@@ -5,13 +5,12 @@
- Document
+ viewsource://useful-scripts
-
+
diff --git a/pages/viewScriptSource/libs/highlight_linenum.js b/pages/viewScriptSource/libs/highlight_linenum.js
new file mode 100644
index 00000000..a5f9f204
--- /dev/null
+++ b/pages/viewScriptSource/libs/highlight_linenum.js
@@ -0,0 +1 @@
+!function(r,o){"use strict";var e,i="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",a=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),a=parseInt(r.dataset.lineNumber);if(o==a)return n;var i,l=t.textContent,s=r.textContent;for(a
+ Hover your mouse over me for a few seconds
+ to see my dynamically bound title!
+
+
+
Now you see me
+
+
+
+
+
+
+
+
+ {{ todo.text }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/scripts/backup/vue-test/index.js b/scripts/backup/vue-test/index.js
new file mode 100644
index 00000000..0e543328
--- /dev/null
+++ b/scripts/backup/vue-test/index.js
@@ -0,0 +1,34 @@
+// Define a new component called todo-item
+Vue.component("todo-item", {
+ props: ["todo"],
+ template: "
{{ todo.text }}
",
+});
+
+var app = new Vue({
+ el: "#app",
+ data: {
+ message: "Hello Vue!",
+ title: "You loaded this page on " + new Date().toLocaleString(),
+ seen: true,
+
+ todos: [
+ { text: "Learn JavaScript" },
+ { text: "Learn Vue" },
+ { text: "Build something awesome" },
+ ],
+
+ groceryList: [
+ { id: 0, text: "Vegetables" },
+ { id: 1, text: "Cheese" },
+ { id: 2, text: "Whatever else humans are supposed to eat" },
+ ],
+ },
+
+ methods: {
+ reverseMessage: function () {
+ this.message = this.message.split("").reverse().join("");
+ },
+ },
+});
+
+document.onclick = () => app.todos.push({ text: "New item " + new Date() });
diff --git a/scripts/backup/vue-test/vue.dev.js b/scripts/backup/vue-test/vue.dev.js
new file mode 100644
index 00000000..04bcb375
--- /dev/null
+++ b/scripts/backup/vue-test/vue.dev.js
@@ -0,0 +1,11894 @@
+/*!
+ * Vue.js v2.7.13
+ * (c) 2014-2022 Evan You
+ * Released under the MIT License.
+ */
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Vue = factory());
+})(this, (function () { 'use strict';
+
+ var emptyObject = Object.freeze({});
+ var isArray = Array.isArray;
+ // These helpers produce better VM code in JS engines due to their
+ // explicitness and function inlining.
+ function isUndef(v) {
+ return v === undefined || v === null;
+ }
+ function isDef(v) {
+ return v !== undefined && v !== null;
+ }
+ function isTrue(v) {
+ return v === true;
+ }
+ function isFalse(v) {
+ return v === false;
+ }
+ /**
+ * Check if value is primitive.
+ */
+ function isPrimitive(value) {
+ return (typeof value === 'string' ||
+ typeof value === 'number' ||
+ // $flow-disable-line
+ typeof value === 'symbol' ||
+ typeof value === 'boolean');
+ }
+ function isFunction(value) {
+ return typeof value === 'function';
+ }
+ /**
+ * Quick object check - this is primarily used to tell
+ * objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+ function isObject(obj) {
+ return obj !== null && typeof obj === 'object';
+ }
+ /**
+ * Get the raw type string of a value, e.g., [object Object].
+ */
+ var _toString = Object.prototype.toString;
+ function toRawType(value) {
+ return _toString.call(value).slice(8, -1);
+ }
+ /**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+ function isPlainObject(obj) {
+ return _toString.call(obj) === '[object Object]';
+ }
+ function isRegExp(v) {
+ return _toString.call(v) === '[object RegExp]';
+ }
+ /**
+ * Check if val is a valid array index.
+ */
+ function isValidArrayIndex(val) {
+ var n = parseFloat(String(val));
+ return n >= 0 && Math.floor(n) === n && isFinite(val);
+ }
+ function isPromise(val) {
+ return (isDef(val) &&
+ typeof val.then === 'function' &&
+ typeof val.catch === 'function');
+ }
+ /**
+ * Convert a value to a string that is actually rendered.
+ */
+ function toString(val) {
+ return val == null
+ ? ''
+ : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
+ ? JSON.stringify(val, null, 2)
+ : String(val);
+ }
+ /**
+ * Convert an input value to a number for persistence.
+ * If the conversion fails, return original string.
+ */
+ function toNumber(val) {
+ var n = parseFloat(val);
+ return isNaN(n) ? val : n;
+ }
+ /**
+ * Make a map and return a function for checking if a key
+ * is in that map.
+ */
+ function makeMap(str, expectsLowerCase) {
+ var map = Object.create(null);
+ var list = str.split(',');
+ for (var i = 0; i < list.length; i++) {
+ map[list[i]] = true;
+ }
+ return expectsLowerCase ? function (val) { return map[val.toLowerCase()]; } : function (val) { return map[val]; };
+ }
+ /**
+ * Check if a tag is a built-in tag.
+ */
+ var isBuiltInTag = makeMap('slot,component', true);
+ /**
+ * Check if an attribute is a reserved attribute.
+ */
+ var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
+ /**
+ * Remove an item from an array.
+ */
+ function remove$2(arr, item) {
+ var len = arr.length;
+ if (len) {
+ // fast path for the only / last item
+ if (item === arr[len - 1]) {
+ arr.length = len - 1;
+ return;
+ }
+ var index = arr.indexOf(item);
+ if (index > -1) {
+ return arr.splice(index, 1);
+ }
+ }
+ }
+ /**
+ * Check whether an object has the property.
+ */
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ function hasOwn(obj, key) {
+ return hasOwnProperty.call(obj, key);
+ }
+ /**
+ * Create a cached version of a pure function.
+ */
+ function cached(fn) {
+ var cache = Object.create(null);
+ return function cachedFn(str) {
+ var hit = cache[str];
+ return hit || (cache[str] = fn(str));
+ };
+ }
+ /**
+ * Camelize a hyphen-delimited string.
+ */
+ var camelizeRE = /-(\w)/g;
+ var camelize = cached(function (str) {
+ return str.replace(camelizeRE, function (_, c) { return (c ? c.toUpperCase() : ''); });
+ });
+ /**
+ * Capitalize a string.
+ */
+ var capitalize = cached(function (str) {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+ });
+ /**
+ * Hyphenate a camelCase string.
+ */
+ var hyphenateRE = /\B([A-Z])/g;
+ var hyphenate = cached(function (str) {
+ return str.replace(hyphenateRE, '-$1').toLowerCase();
+ });
+ /**
+ * Simple bind polyfill for environments that do not support it,
+ * e.g., PhantomJS 1.x. Technically, we don't need this anymore
+ * since native bind is now performant enough in most browsers.
+ * But removing it would mean breaking code that was able to run in
+ * PhantomJS 1.x, so this must be kept for backward compatibility.
+ */
+ /* istanbul ignore next */
+ function polyfillBind(fn, ctx) {
+ function boundFn(a) {
+ var l = arguments.length;
+ return l
+ ? l > 1
+ ? fn.apply(ctx, arguments)
+ : fn.call(ctx, a)
+ : fn.call(ctx);
+ }
+ boundFn._length = fn.length;
+ return boundFn;
+ }
+ function nativeBind(fn, ctx) {
+ return fn.bind(ctx);
+ }
+ // @ts-expect-error bind cannot be `undefined`
+ var bind$1 = Function.prototype.bind ? nativeBind : polyfillBind;
+ /**
+ * Convert an Array-like object to a real Array.
+ */
+ function toArray(list, start) {
+ start = start || 0;
+ var i = list.length - start;
+ var ret = new Array(i);
+ while (i--) {
+ ret[i] = list[i + start];
+ }
+ return ret;
+ }
+ /**
+ * Mix properties into target object.
+ */
+ function extend(to, _from) {
+ for (var key in _from) {
+ to[key] = _from[key];
+ }
+ return to;
+ }
+ /**
+ * Merge an Array of Objects into a single Object.
+ */
+ function toObject(arr) {
+ var res = {};
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i]) {
+ extend(res, arr[i]);
+ }
+ }
+ return res;
+ }
+ /* eslint-disable no-unused-vars */
+ /**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
+ */
+ function noop(a, b, c) { }
+ /**
+ * Always return false.
+ */
+ var no = function (a, b, c) { return false; };
+ /* eslint-enable no-unused-vars */
+ /**
+ * Return the same value.
+ */
+ var identity = function (_) { return _; };
+ /**
+ * Generate a string containing static keys from compiler modules.
+ */
+ function genStaticKeys$1(modules) {
+ return modules
+ .reduce(function (keys, m) {
+ return keys.concat(m.staticKeys || []);
+ }, [])
+ .join(',');
+ }
+ /**
+ * Check if two values are loosely equal - that is,
+ * if they are plain objects, do they have the same shape?
+ */
+ function looseEqual(a, b) {
+ if (a === b)
+ return true;
+ var isObjectA = isObject(a);
+ var isObjectB = isObject(b);
+ if (isObjectA && isObjectB) {
+ try {
+ var isArrayA = Array.isArray(a);
+ var isArrayB = Array.isArray(b);
+ if (isArrayA && isArrayB) {
+ return (a.length === b.length &&
+ a.every(function (e, i) {
+ return looseEqual(e, b[i]);
+ }));
+ }
+ else if (a instanceof Date && b instanceof Date) {
+ return a.getTime() === b.getTime();
+ }
+ else if (!isArrayA && !isArrayB) {
+ var keysA = Object.keys(a);
+ var keysB = Object.keys(b);
+ return (keysA.length === keysB.length &&
+ keysA.every(function (key) {
+ return looseEqual(a[key], b[key]);
+ }));
+ }
+ else {
+ /* istanbul ignore next */
+ return false;
+ }
+ }
+ catch (e) {
+ /* istanbul ignore next */
+ return false;
+ }
+ }
+ else if (!isObjectA && !isObjectB) {
+ return String(a) === String(b);
+ }
+ else {
+ return false;
+ }
+ }
+ /**
+ * Return the first index at which a loosely equal value can be
+ * found in the array (if value is a plain object, the array must
+ * contain an object of the same shape), or -1 if it is not present.
+ */
+ function looseIndexOf(arr, val) {
+ for (var i = 0; i < arr.length; i++) {
+ if (looseEqual(arr[i], val))
+ return i;
+ }
+ return -1;
+ }
+ /**
+ * Ensure a function is called only once.
+ */
+ function once(fn) {
+ var called = false;
+ return function () {
+ if (!called) {
+ called = true;
+ fn.apply(this, arguments);
+ }
+ };
+ }
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is#polyfill
+ function hasChanged(x, y) {
+ if (x === y) {
+ return x === 0 && 1 / x !== 1 / y;
+ }
+ else {
+ return x === x || y === y;
+ }
+ }
+
+ var SSR_ATTR = 'data-server-rendered';
+ var ASSET_TYPES = ['component', 'directive', 'filter'];
+ var LIFECYCLE_HOOKS = [
+ 'beforeCreate',
+ 'created',
+ 'beforeMount',
+ 'mounted',
+ 'beforeUpdate',
+ 'updated',
+ 'beforeDestroy',
+ 'destroyed',
+ 'activated',
+ 'deactivated',
+ 'errorCaptured',
+ 'serverPrefetch',
+ 'renderTracked',
+ 'renderTriggered'
+ ];
+
+ var config = {
+ /**
+ * Option merge strategies (used in core/util/options)
+ */
+ // $flow-disable-line
+ optionMergeStrategies: Object.create(null),
+ /**
+ * Whether to suppress warnings.
+ */
+ silent: false,
+ /**
+ * Show production mode tip message on boot?
+ */
+ productionTip: true,
+ /**
+ * Whether to enable devtools
+ */
+ devtools: true,
+ /**
+ * Whether to record perf
+ */
+ performance: false,
+ /**
+ * Error handler for watcher errors
+ */
+ errorHandler: null,
+ /**
+ * Warn handler for watcher warns
+ */
+ warnHandler: null,
+ /**
+ * Ignore certain custom elements
+ */
+ ignoredElements: [],
+ /**
+ * Custom user key aliases for v-on
+ */
+ // $flow-disable-line
+ keyCodes: Object.create(null),
+ /**
+ * Check if a tag is reserved so that it cannot be registered as a
+ * component. This is platform-dependent and may be overwritten.
+ */
+ isReservedTag: no,
+ /**
+ * Check if an attribute is reserved so that it cannot be used as a component
+ * prop. This is platform-dependent and may be overwritten.
+ */
+ isReservedAttr: no,
+ /**
+ * Check if a tag is an unknown element.
+ * Platform-dependent.
+ */
+ isUnknownElement: no,
+ /**
+ * Get the namespace of an element
+ */
+ getTagNamespace: noop,
+ /**
+ * Parse the real tag name for the specific platform.
+ */
+ parsePlatformTagName: identity,
+ /**
+ * Check if an attribute must be bound using property, e.g. value
+ * Platform-dependent.
+ */
+ mustUseProp: no,
+ /**
+ * Perform updates asynchronously. Intended to be used by Vue Test Utils
+ * This will significantly reduce performance if set to false.
+ */
+ async: true,
+ /**
+ * Exposed for legacy reasons
+ */
+ _lifecycleHooks: LIFECYCLE_HOOKS
+ };
+
+ /**
+ * unicode letters used for parsing html tags, component names and property paths.
+ * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
+ * skipping \u10000-\uEFFFF due to it freezing up PhantomJS
+ */
+ var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
+ /**
+ * Check if a string starts with $ or _
+ */
+ function isReserved(str) {
+ var c = (str + '').charCodeAt(0);
+ return c === 0x24 || c === 0x5f;
+ }
+ /**
+ * Define a property.
+ */
+ function def(obj, key, val, enumerable) {
+ Object.defineProperty(obj, key, {
+ value: val,
+ enumerable: !!enumerable,
+ writable: true,
+ configurable: true
+ });
+ }
+ /**
+ * Parse simple path.
+ */
+ var bailRE = new RegExp("[^".concat(unicodeRegExp.source, ".$_\\d]"));
+ function parsePath(path) {
+ if (bailRE.test(path)) {
+ return;
+ }
+ var segments = path.split('.');
+ return function (obj) {
+ for (var i = 0; i < segments.length; i++) {
+ if (!obj)
+ return;
+ obj = obj[segments[i]];
+ }
+ return obj;
+ };
+ }
+
+ // can we use __proto__?
+ var hasProto = '__proto__' in {};
+ // Browser environment sniffing
+ var inBrowser = typeof window !== 'undefined';
+ var UA = inBrowser && window.navigator.userAgent.toLowerCase();
+ var isIE = UA && /msie|trident/.test(UA);
+ var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
+ var isEdge = UA && UA.indexOf('edge/') > 0;
+ UA && UA.indexOf('android') > 0;
+ var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA);
+ UA && /chrome\/\d+/.test(UA) && !isEdge;
+ UA && /phantomjs/.test(UA);
+ var isFF = UA && UA.match(/firefox\/(\d+)/);
+ // Firefox has a "watch" function on Object.prototype...
+ // @ts-expect-error firebox support
+ var nativeWatch = {}.watch;
+ var supportsPassive = false;
+ if (inBrowser) {
+ try {
+ var opts = {};
+ Object.defineProperty(opts, 'passive', {
+ get: function () {
+ /* istanbul ignore next */
+ supportsPassive = true;
+ }
+ }); // https://github.com/facebook/flow/issues/285
+ window.addEventListener('test-passive', null, opts);
+ }
+ catch (e) { }
+ }
+ // this needs to be lazy-evaled because vue may be required before
+ // vue-server-renderer can set VUE_ENV
+ var _isServer;
+ var isServerRendering = function () {
+ if (_isServer === undefined) {
+ /* istanbul ignore if */
+ if (!inBrowser && typeof global !== 'undefined') {
+ // detect presence of vue-server-renderer and avoid
+ // Webpack shimming the process
+ _isServer =
+ global['process'] && global['process'].env.VUE_ENV === 'server';
+ }
+ else {
+ _isServer = false;
+ }
+ }
+ return _isServer;
+ };
+ // detect devtools
+ var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
+ /* istanbul ignore next */
+ function isNative(Ctor) {
+ return typeof Ctor === 'function' && /native code/.test(Ctor.toString());
+ }
+ var hasSymbol = typeof Symbol !== 'undefined' &&
+ isNative(Symbol) &&
+ typeof Reflect !== 'undefined' &&
+ isNative(Reflect.ownKeys);
+ var _Set; // $flow-disable-line
+ /* istanbul ignore if */ if (typeof Set !== 'undefined' && isNative(Set)) {
+ // use native Set when available.
+ _Set = Set;
+ }
+ else {
+ // a non-standard Set polyfill that only works with primitive keys.
+ _Set = /** @class */ (function () {
+ function Set() {
+ this.set = Object.create(null);
+ }
+ Set.prototype.has = function (key) {
+ return this.set[key] === true;
+ };
+ Set.prototype.add = function (key) {
+ this.set[key] = true;
+ };
+ Set.prototype.clear = function () {
+ this.set = Object.create(null);
+ };
+ return Set;
+ }());
+ }
+
+ var currentInstance = null;
+ /**
+ * This is exposed for compatibility with v3 (e.g. some functions in VueUse
+ * relies on it). Do not use this internally, just use `currentInstance`.
+ *
+ * @internal this function needs manual type declaration because it relies
+ * on previously manually authored types from Vue 2
+ */
+ function getCurrentInstance() {
+ return currentInstance && { proxy: currentInstance };
+ }
+ /**
+ * @internal
+ */
+ function setCurrentInstance(vm) {
+ if (vm === void 0) { vm = null; }
+ if (!vm)
+ currentInstance && currentInstance._scope.off();
+ currentInstance = vm;
+ vm && vm._scope.on();
+ }
+
+ /**
+ * @internal
+ */
+ var VNode = /** @class */ (function () {
+ function VNode(tag, data, children, text, elm, context, componentOptions, asyncFactory) {
+ this.tag = tag;
+ this.data = data;
+ this.children = children;
+ this.text = text;
+ this.elm = elm;
+ this.ns = undefined;
+ this.context = context;
+ this.fnContext = undefined;
+ this.fnOptions = undefined;
+ this.fnScopeId = undefined;
+ this.key = data && data.key;
+ this.componentOptions = componentOptions;
+ this.componentInstance = undefined;
+ this.parent = undefined;
+ this.raw = false;
+ this.isStatic = false;
+ this.isRootInsert = true;
+ this.isComment = false;
+ this.isCloned = false;
+ this.isOnce = false;
+ this.asyncFactory = asyncFactory;
+ this.asyncMeta = undefined;
+ this.isAsyncPlaceholder = false;
+ }
+ Object.defineProperty(VNode.prototype, "child", {
+ // DEPRECATED: alias for componentInstance for backwards compat.
+ /* istanbul ignore next */
+ get: function () {
+ return this.componentInstance;
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return VNode;
+ }());
+ var createEmptyVNode = function (text) {
+ if (text === void 0) { text = ''; }
+ var node = new VNode();
+ node.text = text;
+ node.isComment = true;
+ return node;
+ };
+ function createTextVNode(val) {
+ return new VNode(undefined, undefined, undefined, String(val));
+ }
+ // optimized shallow clone
+ // used for static nodes and slot nodes because they may be reused across
+ // multiple renders, cloning them avoids errors when DOM manipulations rely
+ // on their elm reference.
+ function cloneVNode(vnode) {
+ var cloned = new VNode(vnode.tag, vnode.data,
+ // #7975
+ // clone children array to avoid mutating original in case of cloning
+ // a child.
+ vnode.children && vnode.children.slice(), vnode.text, vnode.elm, vnode.context, vnode.componentOptions, vnode.asyncFactory);
+ cloned.ns = vnode.ns;
+ cloned.isStatic = vnode.isStatic;
+ cloned.key = vnode.key;
+ cloned.isComment = vnode.isComment;
+ cloned.fnContext = vnode.fnContext;
+ cloned.fnOptions = vnode.fnOptions;
+ cloned.fnScopeId = vnode.fnScopeId;
+ cloned.asyncMeta = vnode.asyncMeta;
+ cloned.isCloned = true;
+ return cloned;
+ }
+
+ /* not type checking this file because flow doesn't play well with Proxy */
+ var initProxy;
+ {
+ var allowedGlobals_1 = makeMap('Infinity,undefined,NaN,isFinite,isNaN,' +
+ 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
+ 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,' +
+ 'require' // for Webpack/Browserify
+ );
+ var warnNonPresent_1 = function (target, key) {
+ warn$2("Property or method \"".concat(key, "\" is not defined on the instance but ") +
+ 'referenced during render. Make sure that this property is reactive, ' +
+ 'either in the data option, or for class-based components, by ' +
+ 'initializing the property. ' +
+ 'See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.', target);
+ };
+ var warnReservedPrefix_1 = function (target, key) {
+ warn$2("Property \"".concat(key, "\" must be accessed with \"$data.").concat(key, "\" because ") +
+ 'properties starting with "$" or "_" are not proxied in the Vue instance to ' +
+ 'prevent conflicts with Vue internals. ' +
+ 'See: https://v2.vuejs.org/v2/api/#data', target);
+ };
+ var hasProxy_1 = typeof Proxy !== 'undefined' && isNative(Proxy);
+ if (hasProxy_1) {
+ var isBuiltInModifier_1 = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
+ config.keyCodes = new Proxy(config.keyCodes, {
+ set: function (target, key, value) {
+ if (isBuiltInModifier_1(key)) {
+ warn$2("Avoid overwriting built-in modifier in config.keyCodes: .".concat(key));
+ return false;
+ }
+ else {
+ target[key] = value;
+ return true;
+ }
+ }
+ });
+ }
+ var hasHandler_1 = {
+ has: function (target, key) {
+ var has = key in target;
+ var isAllowed = allowedGlobals_1(key) ||
+ (typeof key === 'string' &&
+ key.charAt(0) === '_' &&
+ !(key in target.$data));
+ if (!has && !isAllowed) {
+ if (key in target.$data)
+ warnReservedPrefix_1(target, key);
+ else
+ warnNonPresent_1(target, key);
+ }
+ return has || !isAllowed;
+ }
+ };
+ var getHandler_1 = {
+ get: function (target, key) {
+ if (typeof key === 'string' && !(key in target)) {
+ if (key in target.$data)
+ warnReservedPrefix_1(target, key);
+ else
+ warnNonPresent_1(target, key);
+ }
+ return target[key];
+ }
+ };
+ initProxy = function initProxy(vm) {
+ if (hasProxy_1) {
+ // determine which proxy handler to use
+ var options = vm.$options;
+ var handlers = options.render && options.render._withStripped ? getHandler_1 : hasHandler_1;
+ vm._renderProxy = new Proxy(vm, handlers);
+ }
+ else {
+ vm._renderProxy = vm;
+ }
+ };
+ }
+
+ /******************************************************************************
+ Copyright (c) Microsoft Corporation.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ PERFORMANCE OF THIS SOFTWARE.
+ ***************************************************************************** */
+
+ var __assign = function() {
+ __assign = Object.assign || function __assign(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+ };
+
+ var uid$2 = 0;
+ var pendingCleanupDeps = [];
+ var cleanupDeps = function () {
+ for (var i = 0; i < pendingCleanupDeps.length; i++) {
+ var dep = pendingCleanupDeps[i];
+ dep.subs = dep.subs.filter(function (s) { return s; });
+ dep._pending = false;
+ }
+ pendingCleanupDeps.length = 0;
+ };
+ /**
+ * A dep is an observable that can have multiple
+ * directives subscribing to it.
+ * @internal
+ */
+ var Dep = /** @class */ (function () {
+ function Dep() {
+ // pending subs cleanup
+ this._pending = false;
+ this.id = uid$2++;
+ this.subs = [];
+ }
+ Dep.prototype.addSub = function (sub) {
+ this.subs.push(sub);
+ };
+ Dep.prototype.removeSub = function (sub) {
+ // #12696 deps with massive amount of subscribers are extremely slow to
+ // clean up in Chromium
+ // to workaround this, we unset the sub for now, and clear them on
+ // next scheduler flush.
+ this.subs[this.subs.indexOf(sub)] = null;
+ if (!this._pending) {
+ this._pending = true;
+ pendingCleanupDeps.push(this);
+ }
+ };
+ Dep.prototype.depend = function (info) {
+ if (Dep.target) {
+ Dep.target.addDep(this);
+ if (info && Dep.target.onTrack) {
+ Dep.target.onTrack(__assign({ effect: Dep.target }, info));
+ }
+ }
+ };
+ Dep.prototype.notify = function (info) {
+ // stabilize the subscriber list first
+ var subs = this.subs.filter(function (s) { return s; });
+ if (!config.async) {
+ // subs aren't sorted in scheduler if not running async
+ // we need to sort them now to make sure they fire in correct
+ // order
+ subs.sort(function (a, b) { return a.id - b.id; });
+ }
+ for (var i = 0, l = subs.length; i < l; i++) {
+ var sub = subs[i];
+ if (info) {
+ sub.onTrigger &&
+ sub.onTrigger(__assign({ effect: subs[i] }, info));
+ }
+ sub.update();
+ }
+ };
+ return Dep;
+ }());
+ // The current target watcher being evaluated.
+ // This is globally unique because only one watcher
+ // can be evaluated at a time.
+ Dep.target = null;
+ var targetStack = [];
+ function pushTarget(target) {
+ targetStack.push(target);
+ Dep.target = target;
+ }
+ function popTarget() {
+ targetStack.pop();
+ Dep.target = targetStack[targetStack.length - 1];
+ }
+
+ /*
+ * not type checking this file because flow doesn't play well with
+ * dynamically accessing methods on Array prototype
+ */
+ var arrayProto = Array.prototype;
+ var arrayMethods = Object.create(arrayProto);
+ var methodsToPatch = [
+ 'push',
+ 'pop',
+ 'shift',
+ 'unshift',
+ 'splice',
+ 'sort',
+ 'reverse'
+ ];
+ /**
+ * Intercept mutating methods and emit events
+ */
+ methodsToPatch.forEach(function (method) {
+ // cache original method
+ var original = arrayProto[method];
+ def(arrayMethods, method, function mutator() {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i] = arguments[_i];
+ }
+ var result = original.apply(this, args);
+ var ob = this.__ob__;
+ var inserted;
+ switch (method) {
+ case 'push':
+ case 'unshift':
+ inserted = args;
+ break;
+ case 'splice':
+ inserted = args.slice(2);
+ break;
+ }
+ if (inserted)
+ ob.observeArray(inserted);
+ // notify change
+ {
+ ob.dep.notify({
+ type: "array mutation" /* TriggerOpTypes.ARRAY_MUTATION */,
+ target: this,
+ key: method
+ });
+ }
+ return result;
+ });
+ });
+
+ var rawMap = new WeakMap();
+ function reactive(target) {
+ makeReactive(target, false);
+ return target;
+ }
+ /**
+ * Return a shallowly-reactive copy of the original object, where only the root
+ * level properties are reactive. It also does not auto-unwrap refs (even at the
+ * root level).
+ */
+ function shallowReactive(target) {
+ makeReactive(target, true);
+ def(target, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, true);
+ return target;
+ }
+ function makeReactive(target, shallow) {
+ // if trying to observe a readonly proxy, return the readonly version.
+ if (!isReadonly(target)) {
+ {
+ if (isArray(target)) {
+ warn$2("Avoid using Array as root value for ".concat(shallow ? "shallowReactive()" : "reactive()", " as it cannot be tracked in watch() or watchEffect(). Use ").concat(shallow ? "shallowRef()" : "ref()", " instead. This is a Vue-2-only limitation."));
+ }
+ var existingOb = target && target.__ob__;
+ if (existingOb && existingOb.shallow !== shallow) {
+ warn$2("Target is already a ".concat(existingOb.shallow ? "" : "non-", "shallow reactive object, and cannot be converted to ").concat(shallow ? "" : "non-", "shallow."));
+ }
+ }
+ var ob = observe(target, shallow, isServerRendering() /* ssr mock reactivity */);
+ if (!ob) {
+ if (target == null || isPrimitive(target)) {
+ warn$2("value cannot be made reactive: ".concat(String(target)));
+ }
+ if (isCollectionType(target)) {
+ warn$2("Vue 2 does not support reactive collection types such as Map or Set.");
+ }
+ }
+ }
+ }
+ function isReactive(value) {
+ if (isReadonly(value)) {
+ return isReactive(value["__v_raw" /* ReactiveFlags.RAW */]);
+ }
+ return !!(value && value.__ob__);
+ }
+ function isShallow(value) {
+ return !!(value && value.__v_isShallow);
+ }
+ function isReadonly(value) {
+ return !!(value && value.__v_isReadonly);
+ }
+ function isProxy(value) {
+ return isReactive(value) || isReadonly(value);
+ }
+ function toRaw(observed) {
+ var raw = observed && observed["__v_raw" /* ReactiveFlags.RAW */];
+ return raw ? toRaw(raw) : observed;
+ }
+ function markRaw(value) {
+ if (isObject(value)) {
+ rawMap.set(value, true);
+ }
+ return value;
+ }
+ /**
+ * @internal
+ */
+ function isCollectionType(value) {
+ var type = toRawType(value);
+ return (type === 'Map' || type === 'WeakMap' || type === 'Set' || type === 'WeakSet');
+ }
+
+ var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
+ var NO_INIITIAL_VALUE = {};
+ /**
+ * In some cases we may want to disable observation inside a component's
+ * update computation.
+ */
+ var shouldObserve = true;
+ function toggleObserving(value) {
+ shouldObserve = value;
+ }
+ // ssr mock dep
+ var mockDep = {
+ notify: noop,
+ depend: noop,
+ addSub: noop,
+ removeSub: noop
+ };
+ /**
+ * Observer class that is attached to each observed
+ * object. Once attached, the observer converts the target
+ * object's property keys into getter/setters that
+ * collect dependencies and dispatch updates.
+ */
+ var Observer = /** @class */ (function () {
+ function Observer(value, shallow, mock) {
+ if (shallow === void 0) { shallow = false; }
+ if (mock === void 0) { mock = false; }
+ this.value = value;
+ this.shallow = shallow;
+ this.mock = mock;
+ // this.value = value
+ this.dep = mock ? mockDep : new Dep();
+ this.vmCount = 0;
+ def(value, '__ob__', this);
+ if (isArray(value)) {
+ if (!mock) {
+ if (hasProto) {
+ value.__proto__ = arrayMethods;
+ /* eslint-enable no-proto */
+ }
+ else {
+ for (var i = 0, l = arrayKeys.length; i < l; i++) {
+ var key = arrayKeys[i];
+ def(value, key, arrayMethods[key]);
+ }
+ }
+ }
+ if (!shallow) {
+ this.observeArray(value);
+ }
+ }
+ else {
+ /**
+ * Walk through all properties and convert them into
+ * getter/setters. This method should only be called when
+ * value type is Object.
+ */
+ var keys = Object.keys(value);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ defineReactive(value, key, NO_INIITIAL_VALUE, undefined, shallow, mock);
+ }
+ }
+ }
+ /**
+ * Observe a list of Array items.
+ */
+ Observer.prototype.observeArray = function (value) {
+ for (var i = 0, l = value.length; i < l; i++) {
+ observe(value[i], false, this.mock);
+ }
+ };
+ return Observer;
+ }());
+ // helpers
+ /**
+ * Attempt to create an observer instance for a value,
+ * returns the new observer if successfully observed,
+ * or the existing observer if the value already has one.
+ */
+ function observe(value, shallow, ssrMockReactivity) {
+ if (value && hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
+ return value.__ob__;
+ }
+ if (shouldObserve &&
+ (ssrMockReactivity || !isServerRendering()) &&
+ (isArray(value) || isPlainObject(value)) &&
+ Object.isExtensible(value) &&
+ !value.__v_skip /* ReactiveFlags.SKIP */ &&
+ !rawMap.has(value) &&
+ !isRef(value) &&
+ !(value instanceof VNode)) {
+ return new Observer(value, shallow, ssrMockReactivity);
+ }
+ }
+ /**
+ * Define a reactive property on an Object.
+ */
+ function defineReactive(obj, key, val, customSetter, shallow, mock) {
+ var dep = new Dep();
+ var property = Object.getOwnPropertyDescriptor(obj, key);
+ if (property && property.configurable === false) {
+ return;
+ }
+ // cater for pre-defined getter/setters
+ var getter = property && property.get;
+ var setter = property && property.set;
+ if ((!getter || setter) &&
+ (val === NO_INIITIAL_VALUE || arguments.length === 2)) {
+ val = obj[key];
+ }
+ var childOb = !shallow && observe(val, false, mock);
+ Object.defineProperty(obj, key, {
+ enumerable: true,
+ configurable: true,
+ get: function reactiveGetter() {
+ var value = getter ? getter.call(obj) : val;
+ if (Dep.target) {
+ {
+ dep.depend({
+ target: obj,
+ type: "get" /* TrackOpTypes.GET */,
+ key: key
+ });
+ }
+ if (childOb) {
+ childOb.dep.depend();
+ if (isArray(value)) {
+ dependArray(value);
+ }
+ }
+ }
+ return isRef(value) && !shallow ? value.value : value;
+ },
+ set: function reactiveSetter(newVal) {
+ var value = getter ? getter.call(obj) : val;
+ if (!hasChanged(value, newVal)) {
+ return;
+ }
+ if (customSetter) {
+ customSetter();
+ }
+ if (setter) {
+ setter.call(obj, newVal);
+ }
+ else if (getter) {
+ // #7981: for accessor properties without setter
+ return;
+ }
+ else if (!shallow && isRef(value) && !isRef(newVal)) {
+ value.value = newVal;
+ return;
+ }
+ else {
+ val = newVal;
+ }
+ childOb = !shallow && observe(newVal, false, mock);
+ {
+ dep.notify({
+ type: "set" /* TriggerOpTypes.SET */,
+ target: obj,
+ key: key,
+ newValue: newVal,
+ oldValue: value
+ });
+ }
+ }
+ });
+ return dep;
+ }
+ function set(target, key, val) {
+ if ((isUndef(target) || isPrimitive(target))) {
+ warn$2("Cannot set reactive property on undefined, null, or primitive value: ".concat(target));
+ }
+ if (isReadonly(target)) {
+ warn$2("Set operation on key \"".concat(key, "\" failed: target is readonly."));
+ return;
+ }
+ var ob = target.__ob__;
+ if (isArray(target) && isValidArrayIndex(key)) {
+ target.length = Math.max(target.length, key);
+ target.splice(key, 1, val);
+ // when mocking for SSR, array methods are not hijacked
+ if (ob && !ob.shallow && ob.mock) {
+ observe(val, false, true);
+ }
+ return val;
+ }
+ if (key in target && !(key in Object.prototype)) {
+ target[key] = val;
+ return val;
+ }
+ if (target._isVue || (ob && ob.vmCount)) {
+ warn$2('Avoid adding reactive properties to a Vue instance or its root $data ' +
+ 'at runtime - declare it upfront in the data option.');
+ return val;
+ }
+ if (!ob) {
+ target[key] = val;
+ return val;
+ }
+ defineReactive(ob.value, key, val, undefined, ob.shallow, ob.mock);
+ {
+ ob.dep.notify({
+ type: "add" /* TriggerOpTypes.ADD */,
+ target: target,
+ key: key,
+ newValue: val,
+ oldValue: undefined
+ });
+ }
+ return val;
+ }
+ function del(target, key) {
+ if ((isUndef(target) || isPrimitive(target))) {
+ warn$2("Cannot delete reactive property on undefined, null, or primitive value: ".concat(target));
+ }
+ if (isArray(target) && isValidArrayIndex(key)) {
+ target.splice(key, 1);
+ return;
+ }
+ var ob = target.__ob__;
+ if (target._isVue || (ob && ob.vmCount)) {
+ warn$2('Avoid deleting properties on a Vue instance or its root $data ' +
+ '- just set it to null.');
+ return;
+ }
+ if (isReadonly(target)) {
+ warn$2("Delete operation on key \"".concat(key, "\" failed: target is readonly."));
+ return;
+ }
+ if (!hasOwn(target, key)) {
+ return;
+ }
+ delete target[key];
+ if (!ob) {
+ return;
+ }
+ {
+ ob.dep.notify({
+ type: "delete" /* TriggerOpTypes.DELETE */,
+ target: target,
+ key: key
+ });
+ }
+ }
+ /**
+ * Collect dependencies on array elements when the array is touched, since
+ * we cannot intercept array element access like property getters.
+ */
+ function dependArray(value) {
+ for (var e = void 0, i = 0, l = value.length; i < l; i++) {
+ e = value[i];
+ if (e && e.__ob__) {
+ e.__ob__.dep.depend();
+ }
+ if (isArray(e)) {
+ dependArray(e);
+ }
+ }
+ }
+
+ /**
+ * @internal
+ */
+ var RefFlag = "__v_isRef";
+ function isRef(r) {
+ return !!(r && r.__v_isRef === true);
+ }
+ function ref$1(value) {
+ return createRef(value, false);
+ }
+ function shallowRef(value) {
+ return createRef(value, true);
+ }
+ function createRef(rawValue, shallow) {
+ if (isRef(rawValue)) {
+ return rawValue;
+ }
+ var ref = {};
+ def(ref, RefFlag, true);
+ def(ref, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, shallow);
+ def(ref, 'dep', defineReactive(ref, 'value', rawValue, null, shallow, isServerRendering()));
+ return ref;
+ }
+ function triggerRef(ref) {
+ if (!ref.dep) {
+ warn$2("received object is not a triggerable ref.");
+ }
+ {
+ ref.dep &&
+ ref.dep.notify({
+ type: "set" /* TriggerOpTypes.SET */,
+ target: ref,
+ key: 'value'
+ });
+ }
+ }
+ function unref(ref) {
+ return isRef(ref) ? ref.value : ref;
+ }
+ function proxyRefs(objectWithRefs) {
+ if (isReactive(objectWithRefs)) {
+ return objectWithRefs;
+ }
+ var proxy = {};
+ var keys = Object.keys(objectWithRefs);
+ for (var i = 0; i < keys.length; i++) {
+ proxyWithRefUnwrap(proxy, objectWithRefs, keys[i]);
+ }
+ return proxy;
+ }
+ function proxyWithRefUnwrap(target, source, key) {
+ Object.defineProperty(target, key, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ var val = source[key];
+ if (isRef(val)) {
+ return val.value;
+ }
+ else {
+ var ob = val && val.__ob__;
+ if (ob)
+ ob.dep.depend();
+ return val;
+ }
+ },
+ set: function (value) {
+ var oldValue = source[key];
+ if (isRef(oldValue) && !isRef(value)) {
+ oldValue.value = value;
+ }
+ else {
+ source[key] = value;
+ }
+ }
+ });
+ }
+ function customRef(factory) {
+ var dep = new Dep();
+ var _a = factory(function () {
+ {
+ dep.depend({
+ target: ref,
+ type: "get" /* TrackOpTypes.GET */,
+ key: 'value'
+ });
+ }
+ }, function () {
+ {
+ dep.notify({
+ target: ref,
+ type: "set" /* TriggerOpTypes.SET */,
+ key: 'value'
+ });
+ }
+ }), get = _a.get, set = _a.set;
+ var ref = {
+ get value() {
+ return get();
+ },
+ set value(newVal) {
+ set(newVal);
+ }
+ };
+ def(ref, RefFlag, true);
+ return ref;
+ }
+ function toRefs(object) {
+ if (!isReactive(object)) {
+ warn$2("toRefs() expects a reactive object but received a plain one.");
+ }
+ var ret = isArray(object) ? new Array(object.length) : {};
+ for (var key in object) {
+ ret[key] = toRef(object, key);
+ }
+ return ret;
+ }
+ function toRef(object, key, defaultValue) {
+ var val = object[key];
+ if (isRef(val)) {
+ return val;
+ }
+ var ref = {
+ get value() {
+ var val = object[key];
+ return val === undefined ? defaultValue : val;
+ },
+ set value(newVal) {
+ object[key] = newVal;
+ }
+ };
+ def(ref, RefFlag, true);
+ return ref;
+ }
+
+ var rawToReadonlyMap = new WeakMap();
+ var rawToShallowReadonlyMap = new WeakMap();
+ function readonly(target) {
+ return createReadonly(target, false);
+ }
+ function createReadonly(target, shallow) {
+ if (!isPlainObject(target)) {
+ {
+ if (isArray(target)) {
+ warn$2("Vue 2 does not support readonly arrays.");
+ }
+ else if (isCollectionType(target)) {
+ warn$2("Vue 2 does not support readonly collection types such as Map or Set.");
+ }
+ else {
+ warn$2("value cannot be made readonly: ".concat(typeof target));
+ }
+ }
+ return target;
+ }
+ // already a readonly object
+ if (isReadonly(target)) {
+ return target;
+ }
+ // already has a readonly proxy
+ var map = shallow ? rawToShallowReadonlyMap : rawToReadonlyMap;
+ var existingProxy = map.get(target);
+ if (existingProxy) {
+ return existingProxy;
+ }
+ var proxy = Object.create(Object.getPrototypeOf(target));
+ map.set(target, proxy);
+ def(proxy, "__v_isReadonly" /* ReactiveFlags.IS_READONLY */, true);
+ def(proxy, "__v_raw" /* ReactiveFlags.RAW */, target);
+ if (isRef(target)) {
+ def(proxy, RefFlag, true);
+ }
+ if (shallow || isShallow(target)) {
+ def(proxy, "__v_isShallow" /* ReactiveFlags.IS_SHALLOW */, true);
+ }
+ var keys = Object.keys(target);
+ for (var i = 0; i < keys.length; i++) {
+ defineReadonlyProperty(proxy, target, keys[i], shallow);
+ }
+ return proxy;
+ }
+ function defineReadonlyProperty(proxy, target, key, shallow) {
+ Object.defineProperty(proxy, key, {
+ enumerable: true,
+ configurable: true,
+ get: function () {
+ var val = target[key];
+ return shallow || !isPlainObject(val) ? val : readonly(val);
+ },
+ set: function () {
+ warn$2("Set operation on key \"".concat(key, "\" failed: target is readonly."));
+ }
+ });
+ }
+ /**
+ * Returns a reactive-copy of the original object, where only the root level
+ * properties are readonly, and does NOT unwrap refs nor recursively convert
+ * returned properties.
+ * This is used for creating the props proxy object for stateful components.
+ */
+ function shallowReadonly(target) {
+ return createReadonly(target, true);
+ }
+
+ function computed(getterOrOptions, debugOptions) {
+ var getter;
+ var setter;
+ var onlyGetter = isFunction(getterOrOptions);
+ if (onlyGetter) {
+ getter = getterOrOptions;
+ setter = function () {
+ warn$2('Write operation failed: computed value is readonly');
+ }
+ ;
+ }
+ else {
+ getter = getterOrOptions.get;
+ setter = getterOrOptions.set;
+ }
+ var watcher = isServerRendering()
+ ? null
+ : new Watcher(currentInstance, getter, noop, { lazy: true });
+ if (watcher && debugOptions) {
+ watcher.onTrack = debugOptions.onTrack;
+ watcher.onTrigger = debugOptions.onTrigger;
+ }
+ var ref = {
+ // some libs rely on the presence effect for checking computed refs
+ // from normal refs, but the implementation doesn't matter
+ effect: watcher,
+ get value() {
+ if (watcher) {
+ if (watcher.dirty) {
+ watcher.evaluate();
+ }
+ if (Dep.target) {
+ if (Dep.target.onTrack) {
+ Dep.target.onTrack({
+ effect: Dep.target,
+ target: ref,
+ type: "get" /* TrackOpTypes.GET */,
+ key: 'value'
+ });
+ }
+ watcher.depend();
+ }
+ return watcher.value;
+ }
+ else {
+ return getter();
+ }
+ },
+ set value(newVal) {
+ setter(newVal);
+ }
+ };
+ def(ref, RefFlag, true);
+ def(ref, "__v_isReadonly" /* ReactiveFlags.IS_READONLY */, onlyGetter);
+ return ref;
+ }
+
+ var mark;
+ var measure;
+ {
+ var perf_1 = inBrowser && window.performance;
+ /* istanbul ignore if */
+ if (perf_1 &&
+ // @ts-ignore
+ perf_1.mark &&
+ // @ts-ignore
+ perf_1.measure &&
+ // @ts-ignore
+ perf_1.clearMarks &&
+ // @ts-ignore
+ perf_1.clearMeasures) {
+ mark = function (tag) { return perf_1.mark(tag); };
+ measure = function (name, startTag, endTag) {
+ perf_1.measure(name, startTag, endTag);
+ perf_1.clearMarks(startTag);
+ perf_1.clearMarks(endTag);
+ // perf.clearMeasures(name)
+ };
+ }
+ }
+
+ var normalizeEvent = cached(function (name) {
+ var passive = name.charAt(0) === '&';
+ name = passive ? name.slice(1) : name;
+ var once = name.charAt(0) === '~'; // Prefixed last, checked first
+ name = once ? name.slice(1) : name;
+ var capture = name.charAt(0) === '!';
+ name = capture ? name.slice(1) : name;
+ return {
+ name: name,
+ once: once,
+ capture: capture,
+ passive: passive
+ };
+ });
+ function createFnInvoker(fns, vm) {
+ function invoker() {
+ var fns = invoker.fns;
+ if (isArray(fns)) {
+ var cloned = fns.slice();
+ for (var i = 0; i < cloned.length; i++) {
+ invokeWithErrorHandling(cloned[i], null, arguments, vm, "v-on handler");
+ }
+ }
+ else {
+ // return handler return value for single handlers
+ return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler");
+ }
+ }
+ invoker.fns = fns;
+ return invoker;
+ }
+ function updateListeners(on, oldOn, add, remove, createOnceHandler, vm) {
+ var name, cur, old, event;
+ for (name in on) {
+ cur = on[name];
+ old = oldOn[name];
+ event = normalizeEvent(name);
+ if (isUndef(cur)) {
+ warn$2("Invalid handler for event \"".concat(event.name, "\": got ") + String(cur), vm);
+ }
+ else if (isUndef(old)) {
+ if (isUndef(cur.fns)) {
+ cur = on[name] = createFnInvoker(cur, vm);
+ }
+ if (isTrue(event.once)) {
+ cur = on[name] = createOnceHandler(event.name, cur, event.capture);
+ }
+ add(event.name, cur, event.capture, event.passive, event.params);
+ }
+ else if (cur !== old) {
+ old.fns = cur;
+ on[name] = old;
+ }
+ }
+ for (name in oldOn) {
+ if (isUndef(on[name])) {
+ event = normalizeEvent(name);
+ remove(event.name, oldOn[name], event.capture);
+ }
+ }
+ }
+
+ function mergeVNodeHook(def, hookKey, hook) {
+ if (def instanceof VNode) {
+ def = def.data.hook || (def.data.hook = {});
+ }
+ var invoker;
+ var oldHook = def[hookKey];
+ function wrappedHook() {
+ hook.apply(this, arguments);
+ // important: remove merged hook to ensure it's called only once
+ // and prevent memory leak
+ remove$2(invoker.fns, wrappedHook);
+ }
+ if (isUndef(oldHook)) {
+ // no existing hook
+ invoker = createFnInvoker([wrappedHook]);
+ }
+ else {
+ /* istanbul ignore if */
+ if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
+ // already a merged invoker
+ invoker = oldHook;
+ invoker.fns.push(wrappedHook);
+ }
+ else {
+ // existing plain hook
+ invoker = createFnInvoker([oldHook, wrappedHook]);
+ }
+ }
+ invoker.merged = true;
+ def[hookKey] = invoker;
+ }
+
+ function extractPropsFromVNodeData(data, Ctor, tag) {
+ // we are only extracting raw values here.
+ // validation and default values are handled in the child
+ // component itself.
+ var propOptions = Ctor.options.props;
+ if (isUndef(propOptions)) {
+ return;
+ }
+ var res = {};
+ var attrs = data.attrs, props = data.props;
+ if (isDef(attrs) || isDef(props)) {
+ for (var key in propOptions) {
+ var altKey = hyphenate(key);
+ {
+ var keyInLowerCase = key.toLowerCase();
+ if (key !== keyInLowerCase && attrs && hasOwn(attrs, keyInLowerCase)) {
+ tip("Prop \"".concat(keyInLowerCase, "\" is passed to component ") +
+ "".concat(formatComponentName(
+ // @ts-expect-error tag is string
+ tag || Ctor), ", but the declared prop name is") +
+ " \"".concat(key, "\". ") +
+ "Note that HTML attributes are case-insensitive and camelCased " +
+ "props need to use their kebab-case equivalents when using in-DOM " +
+ "templates. You should probably use \"".concat(altKey, "\" instead of \"").concat(key, "\"."));
+ }
+ }
+ checkProp(res, props, key, altKey, true) ||
+ checkProp(res, attrs, key, altKey, false);
+ }
+ }
+ return res;
+ }
+ function checkProp(res, hash, key, altKey, preserve) {
+ if (isDef(hash)) {
+ if (hasOwn(hash, key)) {
+ res[key] = hash[key];
+ if (!preserve) {
+ delete hash[key];
+ }
+ return true;
+ }
+ else if (hasOwn(hash, altKey)) {
+ res[key] = hash[altKey];
+ if (!preserve) {
+ delete hash[altKey];
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // The template compiler attempts to minimize the need for normalization by
+ // statically analyzing the template at compile time.
+ //
+ // For plain HTML markup, normalization can be completely skipped because the
+ // generated render function is guaranteed to return Array. There are
+ // two cases where extra normalization is needed:
+ // 1. When the children contains components - because a functional component
+ // may return an Array instead of a single root. In this case, just a simple
+ // normalization is needed - if any child is an Array, we flatten the whole
+ // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
+ // because functional components already normalize their own children.
+ function simpleNormalizeChildren(children) {
+ for (var i = 0; i < children.length; i++) {
+ if (isArray(children[i])) {
+ return Array.prototype.concat.apply([], children);
+ }
+ }
+ return children;
+ }
+ // 2. When the children contains constructs that always generated nested Arrays,
+ // e.g. , , v-for, or when the children is provided by user
+ // with hand-written render functions / JSX. In such cases a full normalization
+ // is needed to cater to all possible types of children values.
+ function normalizeChildren(children) {
+ return isPrimitive(children)
+ ? [createTextVNode(children)]
+ : isArray(children)
+ ? normalizeArrayChildren(children)
+ : undefined;
+ }
+ function isTextNode(node) {
+ return isDef(node) && isDef(node.text) && isFalse(node.isComment);
+ }
+ function normalizeArrayChildren(children, nestedIndex) {
+ var res = [];
+ var i, c, lastIndex, last;
+ for (i = 0; i < children.length; i++) {
+ c = children[i];
+ if (isUndef(c) || typeof c === 'boolean')
+ continue;
+ lastIndex = res.length - 1;
+ last = res[lastIndex];
+ // nested
+ if (isArray(c)) {
+ if (c.length > 0) {
+ c = normalizeArrayChildren(c, "".concat(nestedIndex || '', "_").concat(i));
+ // merge adjacent text nodes
+ if (isTextNode(c[0]) && isTextNode(last)) {
+ res[lastIndex] = createTextVNode(last.text + c[0].text);
+ c.shift();
+ }
+ res.push.apply(res, c);
+ }
+ }
+ else if (isPrimitive(c)) {
+ if (isTextNode(last)) {
+ // merge adjacent text nodes
+ // this is necessary for SSR hydration because text nodes are
+ // essentially merged when rendered to HTML strings
+ res[lastIndex] = createTextVNode(last.text + c);
+ }
+ else if (c !== '') {
+ // convert primitive to vnode
+ res.push(createTextVNode(c));
+ }
+ }
+ else {
+ if (isTextNode(c) && isTextNode(last)) {
+ // merge adjacent text nodes
+ res[lastIndex] = createTextVNode(last.text + c.text);
+ }
+ else {
+ // default key for nested array children (likely generated by v-for)
+ if (isTrue(children._isVList) &&
+ isDef(c.tag) &&
+ isUndef(c.key) &&
+ isDef(nestedIndex)) {
+ c.key = "__vlist".concat(nestedIndex, "_").concat(i, "__");
+ }
+ res.push(c);
+ }
+ }
+ }
+ return res;
+ }
+
+ var SIMPLE_NORMALIZE = 1;
+ var ALWAYS_NORMALIZE = 2;
+ // wrapper function for providing a more flexible interface
+ // without getting yelled at by flow
+ function createElement$1(context, tag, data, children, normalizationType, alwaysNormalize) {
+ if (isArray(data) || isPrimitive(data)) {
+ normalizationType = children;
+ children = data;
+ data = undefined;
+ }
+ if (isTrue(alwaysNormalize)) {
+ normalizationType = ALWAYS_NORMALIZE;
+ }
+ return _createElement(context, tag, data, children, normalizationType);
+ }
+ function _createElement(context, tag, data, children, normalizationType) {
+ if (isDef(data) && isDef(data.__ob__)) {
+ warn$2("Avoid using observed data object as vnode data: ".concat(JSON.stringify(data), "\n") + 'Always create fresh vnode data objects in each render!', context);
+ return createEmptyVNode();
+ }
+ // object syntax in v-bind
+ if (isDef(data) && isDef(data.is)) {
+ tag = data.is;
+ }
+ if (!tag) {
+ // in case of component :is set to falsy value
+ return createEmptyVNode();
+ }
+ // warn against non-primitive key
+ if (isDef(data) && isDef(data.key) && !isPrimitive(data.key)) {
+ warn$2('Avoid using non-primitive value as key, ' +
+ 'use string/number value instead.', context);
+ }
+ // support single function children as default scoped slot
+ if (isArray(children) && isFunction(children[0])) {
+ data = data || {};
+ data.scopedSlots = { default: children[0] };
+ children.length = 0;
+ }
+ if (normalizationType === ALWAYS_NORMALIZE) {
+ children = normalizeChildren(children);
+ }
+ else if (normalizationType === SIMPLE_NORMALIZE) {
+ children = simpleNormalizeChildren(children);
+ }
+ var vnode, ns;
+ if (typeof tag === 'string') {
+ var Ctor = void 0;
+ ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
+ if (config.isReservedTag(tag)) {
+ // platform built-in elements
+ if (isDef(data) &&
+ isDef(data.nativeOn) &&
+ data.tag !== 'component') {
+ warn$2("The .native modifier for v-on is only valid on components but it was used on <".concat(tag, ">."), context);
+ }
+ vnode = new VNode(config.parsePlatformTagName(tag), data, children, undefined, undefined, context);
+ }
+ else if ((!data || !data.pre) &&
+ isDef((Ctor = resolveAsset(context.$options, 'components', tag)))) {
+ // component
+ vnode = createComponent(Ctor, data, context, children, tag);
+ }
+ else {
+ // unknown or unlisted namespaced elements
+ // check at runtime because it may get assigned a namespace when its
+ // parent normalizes children
+ vnode = new VNode(tag, data, children, undefined, undefined, context);
+ }
+ }
+ else {
+ // direct component options / constructor
+ vnode = createComponent(tag, data, context, children);
+ }
+ if (isArray(vnode)) {
+ return vnode;
+ }
+ else if (isDef(vnode)) {
+ if (isDef(ns))
+ applyNS(vnode, ns);
+ if (isDef(data))
+ registerDeepBindings(data);
+ return vnode;
+ }
+ else {
+ return createEmptyVNode();
+ }
+ }
+ function applyNS(vnode, ns, force) {
+ vnode.ns = ns;
+ if (vnode.tag === 'foreignObject') {
+ // use default namespace inside foreignObject
+ ns = undefined;
+ force = true;
+ }
+ if (isDef(vnode.children)) {
+ for (var i = 0, l = vnode.children.length; i < l; i++) {
+ var child = vnode.children[i];
+ if (isDef(child.tag) &&
+ (isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
+ applyNS(child, ns, force);
+ }
+ }
+ }
+ }
+ // ref #5318
+ // necessary to ensure parent re-render when deep bindings like :style and
+ // :class are used on slot nodes
+ function registerDeepBindings(data) {
+ if (isObject(data.style)) {
+ traverse(data.style);
+ }
+ if (isObject(data.class)) {
+ traverse(data.class);
+ }
+ }
+
+ /**
+ * Runtime helper for rendering v-for lists.
+ */
+ function renderList(val, render) {
+ var ret = null, i, l, keys, key;
+ if (isArray(val) || typeof val === 'string') {
+ ret = new Array(val.length);
+ for (i = 0, l = val.length; i < l; i++) {
+ ret[i] = render(val[i], i);
+ }
+ }
+ else if (typeof val === 'number') {
+ ret = new Array(val);
+ for (i = 0; i < val; i++) {
+ ret[i] = render(i + 1, i);
+ }
+ }
+ else if (isObject(val)) {
+ if (hasSymbol && val[Symbol.iterator]) {
+ ret = [];
+ var iterator = val[Symbol.iterator]();
+ var result = iterator.next();
+ while (!result.done) {
+ ret.push(render(result.value, ret.length));
+ result = iterator.next();
+ }
+ }
+ else {
+ keys = Object.keys(val);
+ ret = new Array(keys.length);
+ for (i = 0, l = keys.length; i < l; i++) {
+ key = keys[i];
+ ret[i] = render(val[key], key, i);
+ }
+ }
+ }
+ if (!isDef(ret)) {
+ ret = [];
+ }
+ ret._isVList = true;
+ return ret;
+ }
+
+ /**
+ * Runtime helper for rendering
+ */
+ function renderSlot(name, fallbackRender, props, bindObject) {
+ var scopedSlotFn = this.$scopedSlots[name];
+ var nodes;
+ if (scopedSlotFn) {
+ // scoped slot
+ props = props || {};
+ if (bindObject) {
+ if (!isObject(bindObject)) {
+ warn$2('slot v-bind without argument expects an Object', this);
+ }
+ props = extend(extend({}, bindObject), props);
+ }
+ nodes =
+ scopedSlotFn(props) ||
+ (isFunction(fallbackRender) ? fallbackRender() : fallbackRender);
+ }
+ else {
+ nodes =
+ this.$slots[name] ||
+ (isFunction(fallbackRender) ? fallbackRender() : fallbackRender);
+ }
+ var target = props && props.slot;
+ if (target) {
+ return this.$createElement('template', { slot: target }, nodes);
+ }
+ else {
+ return nodes;
+ }
+ }
+
+ /**
+ * Runtime helper for resolving filters
+ */
+ function resolveFilter(id) {
+ return resolveAsset(this.$options, 'filters', id, true) || identity;
+ }
+
+ function isKeyNotMatch(expect, actual) {
+ if (isArray(expect)) {
+ return expect.indexOf(actual) === -1;
+ }
+ else {
+ return expect !== actual;
+ }
+ }
+ /**
+ * Runtime helper for checking keyCodes from config.
+ * exposed as Vue.prototype._k
+ * passing in eventKeyName as last argument separately for backwards compat
+ */
+ function checkKeyCodes(eventKeyCode, key, builtInKeyCode, eventKeyName, builtInKeyName) {
+ var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
+ if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
+ return isKeyNotMatch(builtInKeyName, eventKeyName);
+ }
+ else if (mappedKeyCode) {
+ return isKeyNotMatch(mappedKeyCode, eventKeyCode);
+ }
+ else if (eventKeyName) {
+ return hyphenate(eventKeyName) !== key;
+ }
+ return eventKeyCode === undefined;
+ }
+
+ /**
+ * Runtime helper for merging v-bind="object" into a VNode's data.
+ */
+ function bindObjectProps(data, tag, value, asProp, isSync) {
+ if (value) {
+ if (!isObject(value)) {
+ warn$2('v-bind without argument expects an Object or Array value', this);
+ }
+ else {
+ if (isArray(value)) {
+ value = toObject(value);
+ }
+ var hash = void 0;
+ var _loop_1 = function (key) {
+ if (key === 'class' || key === 'style' || isReservedAttribute(key)) {
+ hash = data;
+ }
+ else {
+ var type = data.attrs && data.attrs.type;
+ hash =
+ asProp || config.mustUseProp(tag, type, key)
+ ? data.domProps || (data.domProps = {})
+ : data.attrs || (data.attrs = {});
+ }
+ var camelizedKey = camelize(key);
+ var hyphenatedKey = hyphenate(key);
+ if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {
+ hash[key] = value[key];
+ if (isSync) {
+ var on = data.on || (data.on = {});
+ on["update:".concat(key)] = function ($event) {
+ value[key] = $event;
+ };
+ }
+ }
+ };
+ for (var key in value) {
+ _loop_1(key);
+ }
+ }
+ }
+ return data;
+ }
+
+ /**
+ * Runtime helper for rendering static trees.
+ */
+ function renderStatic(index, isInFor) {
+ var cached = this._staticTrees || (this._staticTrees = []);
+ var tree = cached[index];
+ // if has already-rendered static tree and not inside v-for,
+ // we can reuse the same tree.
+ if (tree && !isInFor) {
+ return tree;
+ }
+ // otherwise, render a fresh tree.
+ tree = cached[index] = this.$options.staticRenderFns[index].call(this._renderProxy, this._c, this // for render fns generated for functional component templates
+ );
+ markStatic$1(tree, "__static__".concat(index), false);
+ return tree;
+ }
+ /**
+ * Runtime helper for v-once.
+ * Effectively it means marking the node as static with a unique key.
+ */
+ function markOnce(tree, index, key) {
+ markStatic$1(tree, "__once__".concat(index).concat(key ? "_".concat(key) : ""), true);
+ return tree;
+ }
+ function markStatic$1(tree, key, isOnce) {
+ if (isArray(tree)) {
+ for (var i = 0; i < tree.length; i++) {
+ if (tree[i] && typeof tree[i] !== 'string') {
+ markStaticNode(tree[i], "".concat(key, "_").concat(i), isOnce);
+ }
+ }
+ }
+ else {
+ markStaticNode(tree, key, isOnce);
+ }
+ }
+ function markStaticNode(node, key, isOnce) {
+ node.isStatic = true;
+ node.key = key;
+ node.isOnce = isOnce;
+ }
+
+ function bindObjectListeners(data, value) {
+ if (value) {
+ if (!isPlainObject(value)) {
+ warn$2('v-on without argument expects an Object value', this);
+ }
+ else {
+ var on = (data.on = data.on ? extend({}, data.on) : {});
+ for (var key in value) {
+ var existing = on[key];
+ var ours = value[key];
+ on[key] = existing ? [].concat(existing, ours) : ours;
+ }
+ }
+ }
+ return data;
+ }
+
+ function resolveScopedSlots(fns, res,
+ // the following are added in 2.6
+ hasDynamicKeys, contentHashKey) {
+ res = res || { $stable: !hasDynamicKeys };
+ for (var i = 0; i < fns.length; i++) {
+ var slot = fns[i];
+ if (isArray(slot)) {
+ resolveScopedSlots(slot, res, hasDynamicKeys);
+ }
+ else if (slot) {
+ // marker for reverse proxying v-slot without scope on this.$slots
+ // @ts-expect-error
+ if (slot.proxy) {
+ // @ts-expect-error
+ slot.fn.proxy = true;
+ }
+ res[slot.key] = slot.fn;
+ }
+ }
+ if (contentHashKey) {
+ res.$key = contentHashKey;
+ }
+ return res;
+ }
+
+ // helper to process dynamic keys for dynamic arguments in v-bind and v-on.
+ function bindDynamicKeys(baseObj, values) {
+ for (var i = 0; i < values.length; i += 2) {
+ var key = values[i];
+ if (typeof key === 'string' && key) {
+ baseObj[values[i]] = values[i + 1];
+ }
+ else if (key !== '' && key !== null) {
+ // null is a special value for explicitly removing a binding
+ warn$2("Invalid value for dynamic directive argument (expected string or null): ".concat(key), this);
+ }
+ }
+ return baseObj;
+ }
+ // helper to dynamically append modifier runtime markers to event names.
+ // ensure only append when value is already string, otherwise it will be cast
+ // to string and cause the type check to miss.
+ function prependModifier(value, symbol) {
+ return typeof value === 'string' ? symbol + value : value;
+ }
+
+ function installRenderHelpers(target) {
+ target._o = markOnce;
+ target._n = toNumber;
+ target._s = toString;
+ target._l = renderList;
+ target._t = renderSlot;
+ target._q = looseEqual;
+ target._i = looseIndexOf;
+ target._m = renderStatic;
+ target._f = resolveFilter;
+ target._k = checkKeyCodes;
+ target._b = bindObjectProps;
+ target._v = createTextVNode;
+ target._e = createEmptyVNode;
+ target._u = resolveScopedSlots;
+ target._g = bindObjectListeners;
+ target._d = bindDynamicKeys;
+ target._p = prependModifier;
+ }
+
+ /**
+ * Runtime helper for resolving raw children VNodes into a slot object.
+ */
+ function resolveSlots(children, context) {
+ if (!children || !children.length) {
+ return {};
+ }
+ var slots = {};
+ for (var i = 0, l = children.length; i < l; i++) {
+ var child = children[i];
+ var data = child.data;
+ // remove slot attribute if the node is resolved as a Vue slot node
+ if (data && data.attrs && data.attrs.slot) {
+ delete data.attrs.slot;
+ }
+ // named slots should only be respected if the vnode was rendered in the
+ // same context.
+ if ((child.context === context || child.fnContext === context) &&
+ data &&
+ data.slot != null) {
+ var name_1 = data.slot;
+ var slot = slots[name_1] || (slots[name_1] = []);
+ if (child.tag === 'template') {
+ slot.push.apply(slot, child.children || []);
+ }
+ else {
+ slot.push(child);
+ }
+ }
+ else {
+ (slots.default || (slots.default = [])).push(child);
+ }
+ }
+ // ignore slots that contains only whitespace
+ for (var name_2 in slots) {
+ if (slots[name_2].every(isWhitespace)) {
+ delete slots[name_2];
+ }
+ }
+ return slots;
+ }
+ function isWhitespace(node) {
+ return (node.isComment && !node.asyncFactory) || node.text === ' ';
+ }
+
+ function isAsyncPlaceholder(node) {
+ // @ts-expect-error not really boolean type
+ return node.isComment && node.asyncFactory;
+ }
+
+ function normalizeScopedSlots(ownerVm, scopedSlots, normalSlots, prevScopedSlots) {
+ var res;
+ var hasNormalSlots = Object.keys(normalSlots).length > 0;
+ var isStable = scopedSlots ? !!scopedSlots.$stable : !hasNormalSlots;
+ var key = scopedSlots && scopedSlots.$key;
+ if (!scopedSlots) {
+ res = {};
+ }
+ else if (scopedSlots._normalized) {
+ // fast path 1: child component re-render only, parent did not change
+ return scopedSlots._normalized;
+ }
+ else if (isStable &&
+ prevScopedSlots &&
+ prevScopedSlots !== emptyObject &&
+ key === prevScopedSlots.$key &&
+ !hasNormalSlots &&
+ !prevScopedSlots.$hasNormal) {
+ // fast path 2: stable scoped slots w/ no normal slots to proxy,
+ // only need to normalize once
+ return prevScopedSlots;
+ }
+ else {
+ res = {};
+ for (var key_1 in scopedSlots) {
+ if (scopedSlots[key_1] && key_1[0] !== '$') {
+ res[key_1] = normalizeScopedSlot(ownerVm, normalSlots, key_1, scopedSlots[key_1]);
+ }
+ }
+ }
+ // expose normal slots on scopedSlots
+ for (var key_2 in normalSlots) {
+ if (!(key_2 in res)) {
+ res[key_2] = proxyNormalSlot(normalSlots, key_2);
+ }
+ }
+ // avoriaz seems to mock a non-extensible $scopedSlots object
+ // and when that is passed down this would cause an error
+ if (scopedSlots && Object.isExtensible(scopedSlots)) {
+ scopedSlots._normalized = res;
+ }
+ def(res, '$stable', isStable);
+ def(res, '$key', key);
+ def(res, '$hasNormal', hasNormalSlots);
+ return res;
+ }
+ function normalizeScopedSlot(vm, normalSlots, key, fn) {
+ var normalized = function () {
+ var cur = currentInstance;
+ setCurrentInstance(vm);
+ var res = arguments.length ? fn.apply(null, arguments) : fn({});
+ res =
+ res && typeof res === 'object' && !isArray(res)
+ ? [res] // single vnode
+ : normalizeChildren(res);
+ var vnode = res && res[0];
+ setCurrentInstance(cur);
+ return res &&
+ (!vnode ||
+ (res.length === 1 && vnode.isComment && !isAsyncPlaceholder(vnode))) // #9658, #10391
+ ? undefined
+ : res;
+ };
+ // this is a slot using the new v-slot syntax without scope. although it is
+ // compiled as a scoped slot, render fn users would expect it to be present
+ // on this.$slots because the usage is semantically a normal slot.
+ if (fn.proxy) {
+ Object.defineProperty(normalSlots, key, {
+ get: normalized,
+ enumerable: true,
+ configurable: true
+ });
+ }
+ return normalized;
+ }
+ function proxyNormalSlot(slots, key) {
+ return function () { return slots[key]; };
+ }
+
+ function initSetup(vm) {
+ var options = vm.$options;
+ var setup = options.setup;
+ if (setup) {
+ var ctx = (vm._setupContext = createSetupContext(vm));
+ setCurrentInstance(vm);
+ pushTarget();
+ var setupResult = invokeWithErrorHandling(setup, null, [vm._props || shallowReactive({}), ctx], vm, "setup");
+ popTarget();
+ setCurrentInstance();
+ if (isFunction(setupResult)) {
+ // render function
+ // @ts-ignore
+ options.render = setupResult;
+ }
+ else if (isObject(setupResult)) {
+ // bindings
+ if (setupResult instanceof VNode) {
+ warn$2("setup() should not return VNodes directly - " +
+ "return a render function instead.");
+ }
+ vm._setupState = setupResult;
+ // __sfc indicates compiled bindings from