pagy 7.0.11 → 43.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/apps/calendar.ru +741 -0
  4. data/apps/demo.ru +513 -0
  5. data/apps/enable_rails_page_segment.rb +54 -0
  6. data/apps/index.rb +9 -0
  7. data/apps/keynav+root_key.ru +316 -0
  8. data/apps/keynav.ru +255 -0
  9. data/apps/keyset.ru +219 -0
  10. data/apps/keyset_sequel.ru +212 -0
  11. data/apps/rails.ru +216 -0
  12. data/apps/repro.ru +185 -0
  13. data/bin/pagy +5 -0
  14. data/config/pagy.rb +46 -0
  15. data/javascripts/ai_widget.js +90 -0
  16. data/javascripts/pagy.js +168 -0
  17. data/javascripts/pagy.min.js +2 -0
  18. data/javascripts/pagy.mjs +161 -0
  19. data/javascripts/wand.js +1172 -0
  20. data/lib/pagy/classes/calendar/calendar.rb +101 -0
  21. data/lib/pagy/{calendar → classes/calendar}/day.rb +9 -12
  22. data/lib/pagy/{calendar → classes/calendar}/month.rb +7 -11
  23. data/lib/pagy/{calendar → classes/calendar}/quarter.rb +12 -16
  24. data/lib/pagy/classes/calendar/unit.rb +93 -0
  25. data/lib/pagy/{calendar → classes/calendar}/week.rb +7 -11
  26. data/lib/pagy/{calendar → classes/calendar}/year.rb +9 -9
  27. data/lib/pagy/classes/exceptions.rb +26 -0
  28. data/lib/pagy/classes/keyset/adapters/active_record.rb +50 -0
  29. data/lib/pagy/classes/keyset/adapters/sequel.rb +62 -0
  30. data/lib/pagy/classes/keyset/keynav.rb +85 -0
  31. data/lib/pagy/classes/keyset/keyset.rb +150 -0
  32. data/lib/pagy/classes/offset/countish.rb +17 -0
  33. data/lib/pagy/classes/offset/countless.rb +63 -0
  34. data/lib/pagy/classes/offset/offset.rb +63 -0
  35. data/lib/pagy/classes/offset/search.rb +34 -0
  36. data/lib/pagy/classes/request.rb +48 -0
  37. data/lib/pagy/cli.rb +122 -0
  38. data/lib/pagy/console.rb +5 -20
  39. data/lib/pagy/deprecated.rb +84 -0
  40. data/lib/pagy/modules/abilities/configurable.rb +37 -0
  41. data/lib/pagy/modules/abilities/countable.rb +23 -0
  42. data/lib/pagy/modules/abilities/linkable.rb +72 -0
  43. data/lib/pagy/modules/abilities/rangeable.rb +14 -0
  44. data/lib/pagy/modules/abilities/shiftable.rb +12 -0
  45. data/lib/pagy/modules/b64.rb +35 -0
  46. data/lib/pagy/modules/console.rb +33 -0
  47. data/lib/pagy/modules/i18n/i18n.rb +72 -0
  48. data/lib/pagy/modules/i18n/p11n/arabic.rb +30 -0
  49. data/lib/pagy/modules/i18n/p11n/east_slavic.rb +27 -0
  50. data/lib/pagy/modules/i18n/p11n/one_other.rb +15 -0
  51. data/lib/pagy/modules/i18n/p11n/one_upto_two_other.rb +15 -0
  52. data/lib/pagy/modules/i18n/p11n/other.rb +13 -0
  53. data/lib/pagy/modules/i18n/p11n/polish.rb +27 -0
  54. data/lib/pagy/modules/i18n/p11n/west_slavic.rb +22 -0
  55. data/lib/pagy/modules/i18n/p11n.rb +16 -0
  56. data/lib/pagy/modules/searcher.rb +20 -0
  57. data/lib/pagy/next.rb +25 -0
  58. data/lib/pagy/tasks/sync.rb +20 -0
  59. data/lib/pagy/toolbox/helpers/anchor_tags.rb +21 -0
  60. data/lib/pagy/toolbox/helpers/bootstrap/input_nav_js.rb +28 -0
  61. data/lib/pagy/toolbox/helpers/bootstrap/previous_next_html.rb +19 -0
  62. data/lib/pagy/toolbox/helpers/bootstrap/series_nav.rb +32 -0
  63. data/lib/pagy/toolbox/helpers/bootstrap/series_nav_js.rb +24 -0
  64. data/lib/pagy/toolbox/helpers/bulma/input_nav_js.rb +25 -0
  65. data/lib/pagy/toolbox/helpers/bulma/previous_next_html.rb +20 -0
  66. data/lib/pagy/toolbox/helpers/bulma/series_nav.rb +31 -0
  67. data/lib/pagy/toolbox/helpers/bulma/series_nav_js.rb +23 -0
  68. data/lib/pagy/toolbox/helpers/data_hash.rb +29 -0
  69. data/lib/pagy/toolbox/helpers/headers_hash.rb +30 -0
  70. data/lib/pagy/toolbox/helpers/info_tag.rb +30 -0
  71. data/lib/pagy/toolbox/helpers/input_nav_js.rb +22 -0
  72. data/lib/pagy/toolbox/helpers/limit_tag_js.rb +25 -0
  73. data/lib/pagy/toolbox/helpers/loaders.rb +55 -0
  74. data/lib/pagy/toolbox/helpers/page_url.rb +16 -0
  75. data/lib/pagy/toolbox/helpers/series_nav.rb +30 -0
  76. data/lib/pagy/toolbox/helpers/series_nav_js.rb +20 -0
  77. data/lib/pagy/toolbox/helpers/support/a_lambda.rb +36 -0
  78. data/lib/pagy/toolbox/helpers/support/data_pagy_attribute.rb +19 -0
  79. data/lib/pagy/toolbox/helpers/support/nav_aria_label_attribute.rb +10 -0
  80. data/lib/pagy/toolbox/helpers/support/series.rb +37 -0
  81. data/lib/pagy/toolbox/helpers/support/wrap_input_nav_js.rb +19 -0
  82. data/lib/pagy/toolbox/helpers/support/wrap_series_nav.rb +17 -0
  83. data/lib/pagy/toolbox/helpers/support/wrap_series_nav_js.rb +42 -0
  84. data/lib/pagy/toolbox/helpers/urls_hash.rb +12 -0
  85. data/lib/pagy/toolbox/paginators/calendar.rb +34 -0
  86. data/lib/pagy/toolbox/paginators/countish.rb +38 -0
  87. data/lib/pagy/toolbox/paginators/countless.rb +22 -0
  88. data/lib/pagy/toolbox/paginators/elasticsearch_rails.rb +56 -0
  89. data/lib/pagy/toolbox/paginators/keynav_js.rb +26 -0
  90. data/lib/pagy/toolbox/paginators/keyset.rb +15 -0
  91. data/lib/pagy/toolbox/paginators/meilisearch.rb +34 -0
  92. data/lib/pagy/toolbox/paginators/method.rb +38 -0
  93. data/lib/pagy/toolbox/paginators/offset.rb +24 -0
  94. data/lib/pagy/toolbox/paginators/searchkick.rb +34 -0
  95. data/lib/pagy/toolbox/paginators/typesense_rails.rb +34 -0
  96. data/lib/pagy.rb +67 -131
  97. data/locales/ar.yml +32 -0
  98. data/locales/be.yml +28 -0
  99. data/locales/bg.yml +24 -0
  100. data/locales/bs.yml +28 -0
  101. data/locales/ca.yml +24 -0
  102. data/locales/ckb.yml +20 -0
  103. data/locales/cs.yml +26 -0
  104. data/locales/da.yml +24 -0
  105. data/locales/de.yml +24 -0
  106. data/locales/dz.yml +20 -0
  107. data/locales/en.yml +24 -0
  108. data/{lib/locales → locales}/es.yml +9 -6
  109. data/locales/fr.yml +24 -0
  110. data/locales/hr.yml +28 -0
  111. data/locales/id.yml +20 -0
  112. data/locales/it.yml +24 -0
  113. data/locales/ja.yml +20 -0
  114. data/locales/km.yml +20 -0
  115. data/locales/ko.yml +20 -0
  116. data/locales/nb.yml +24 -0
  117. data/locales/nl.yml +24 -0
  118. data/locales/nn.yml +24 -0
  119. data/locales/pl.yml +28 -0
  120. data/{lib/locales → locales}/pt-BR.yml +10 -7
  121. data/{lib/locales → locales}/pt.yml +10 -7
  122. data/locales/ru.yml +28 -0
  123. data/locales/sk.yml +26 -0
  124. data/locales/sr.yml +28 -0
  125. data/locales/sv-SE.yml +24 -0
  126. data/locales/sv.yml +24 -0
  127. data/locales/sw.yml +28 -0
  128. data/locales/ta.yml +24 -0
  129. data/locales/tr.yml +24 -0
  130. data/locales/uk.yml +28 -0
  131. data/locales/vi.yml +20 -0
  132. data/locales/zh-CN.yml +20 -0
  133. data/locales/zh-HK.yml +20 -0
  134. data/locales/zh-TW.yml +20 -0
  135. data/stylesheets/pagy-tailwind.css +68 -0
  136. data/stylesheets/pagy.css +83 -0
  137. metadata +185 -94
  138. data/lib/config/pagy.rb +0 -258
  139. data/lib/javascripts/pagy-dev.js +0 -112
  140. data/lib/javascripts/pagy-module.js +0 -111
  141. data/lib/javascripts/pagy.js +0 -1
  142. data/lib/locales/ar.yml +0 -30
  143. data/lib/locales/be.yml +0 -25
  144. data/lib/locales/bg.yml +0 -21
  145. data/lib/locales/bs.yml +0 -25
  146. data/lib/locales/ca.yml +0 -23
  147. data/lib/locales/ckb.yml +0 -18
  148. data/lib/locales/cs.yml +0 -23
  149. data/lib/locales/da.yml +0 -23
  150. data/lib/locales/de.yml +0 -21
  151. data/lib/locales/en.yml +0 -21
  152. data/lib/locales/fr.yml +0 -21
  153. data/lib/locales/hr.yml +0 -25
  154. data/lib/locales/id.yml +0 -19
  155. data/lib/locales/it.yml +0 -21
  156. data/lib/locales/ja.yml +0 -19
  157. data/lib/locales/km.yml +0 -19
  158. data/lib/locales/ko.yml +0 -19
  159. data/lib/locales/nb.yml +0 -21
  160. data/lib/locales/nl.yml +0 -21
  161. data/lib/locales/nn.yml +0 -21
  162. data/lib/locales/pl.yml +0 -25
  163. data/lib/locales/ru.yml +0 -27
  164. data/lib/locales/sr.yml +0 -25
  165. data/lib/locales/sv-SE.yml +0 -21
  166. data/lib/locales/sv.yml +0 -21
  167. data/lib/locales/sw.yml +0 -23
  168. data/lib/locales/ta.yml +0 -23
  169. data/lib/locales/tr.yml +0 -19
  170. data/lib/locales/uk.yml +0 -25
  171. data/lib/locales/vi.yml +0 -17
  172. data/lib/locales/zh-CN.yml +0 -19
  173. data/lib/locales/zh-HK.yml +0 -19
  174. data/lib/locales/zh-TW.yml +0 -19
  175. data/lib/pagy/backend.rb +0 -39
  176. data/lib/pagy/calendar/helper.rb +0 -65
  177. data/lib/pagy/calendar.rb +0 -126
  178. data/lib/pagy/countless.rb +0 -37
  179. data/lib/pagy/exceptions.rb +0 -25
  180. data/lib/pagy/extras/arel.rb +0 -36
  181. data/lib/pagy/extras/array.rb +0 -24
  182. data/lib/pagy/extras/bootstrap.rb +0 -108
  183. data/lib/pagy/extras/bulma.rb +0 -105
  184. data/lib/pagy/extras/calendar.rb +0 -53
  185. data/lib/pagy/extras/countless.rb +0 -37
  186. data/lib/pagy/extras/elasticsearch_rails.rb +0 -80
  187. data/lib/pagy/extras/foundation.rb +0 -105
  188. data/lib/pagy/extras/frontend_helpers.rb +0 -67
  189. data/lib/pagy/extras/gearbox.rb +0 -54
  190. data/lib/pagy/extras/headers.rb +0 -53
  191. data/lib/pagy/extras/i18n.rb +0 -26
  192. data/lib/pagy/extras/items.rb +0 -61
  193. data/lib/pagy/extras/jsonapi.rb +0 -79
  194. data/lib/pagy/extras/materialize.rb +0 -96
  195. data/lib/pagy/extras/meilisearch.rb +0 -65
  196. data/lib/pagy/extras/metadata.rb +0 -38
  197. data/lib/pagy/extras/navs.rb +0 -51
  198. data/lib/pagy/extras/overflow.rb +0 -80
  199. data/lib/pagy/extras/searchkick.rb +0 -67
  200. data/lib/pagy/extras/semantic.rb +0 -95
  201. data/lib/pagy/extras/standalone.rb +0 -60
  202. data/lib/pagy/extras/support.rb +0 -40
  203. data/lib/pagy/extras/trim.rb +0 -29
  204. data/lib/pagy/extras/uikit.rb +0 -97
  205. data/lib/pagy/frontend.rb +0 -114
  206. data/lib/pagy/i18n.rb +0 -165
  207. data/lib/pagy/url_helpers.rb +0 -27
  208. data/lib/stylesheets/pagy.css +0 -61
  209. data/lib/stylesheets/pagy.scss +0 -50
  210. data/lib/stylesheets/pagy.tailwind.scss +0 -24
  211. /data/{lib/javascripts/pagy-module.d.ts → javascripts/pagy.d.ts} +0 -0
data/apps/repro.ru ADDED
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ # DESCRIPTION
4
+ # Reproduce generic/simple issues
5
+ #
6
+ # DOC
7
+ # https://ddnexus.github.io/pagy/playground/#repro-app
8
+ #
9
+ # BIN HELP
10
+ # pagy -h
11
+ #
12
+ # DEV USAGE
13
+ # pagy clone repro
14
+ # pagy ./repro.ru
15
+ #
16
+ # URL
17
+ # http://127.0.0.1:8000
18
+
19
+ VERSION = '43.5.1'
20
+
21
+ if VERSION != Pagy::VERSION
22
+ Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
23
+ end
24
+ run_from_repo = Pagy::ROOT.join('pagy.gemspec').exist?
25
+
26
+ # Bundle
27
+ require 'bundler/inline'
28
+ gemfile(!run_from_repo) do
29
+ source 'https://rubygems.org'
30
+ gem 'oj'
31
+ gem 'puma'
32
+ gem 'sinatra'
33
+ end
34
+
35
+ # Edit this section adding the legacy as needed
36
+ # Pagy initializer
37
+ Pagy::OPTIONS[:max_limit] = 100
38
+
39
+ # Sinatra setup
40
+ require 'sinatra/base'
41
+ # Sinatra application
42
+ class PagyRepro < Sinatra::Base
43
+ include Pagy::Method
44
+
45
+ get('/javascripts/:file') do
46
+ format = params[:file].split('.').last
47
+ if format == 'js'
48
+ content_type 'application/javascript'
49
+ elsif format == 'map'
50
+ content_type 'application/json'
51
+ end
52
+ send_file Pagy::ROOT.join('javascripts', params[:file])
53
+ end
54
+
55
+ # Edit this action as needed
56
+ get '/' do
57
+ collection = MockCollection.new
58
+ @pagy, @records = pagy(collection) # simplest form
59
+ # @pagy, @records = pagy(:offset, collection, limit: 7, max_limit: 30)
60
+ # @pagy, @records = pagy(:countish, collection, ttl: 20)
61
+ # @pagy, @records = pagy(:countless, collection)
62
+ # @pagy, @records = pagy(Array(1..1000))
63
+ # response.headers.merge!(@pagy.headers_hash)
64
+ erb :main
65
+ end
66
+
67
+ # Views
68
+ template :layout do
69
+ <<~ERB
70
+ <!DOCTYPE html>
71
+ <html lang="en">
72
+ <head>
73
+ <title>Pagy Repro App</title>
74
+ <script src="javascripts/pagy.js"></script>
75
+ <script>
76
+ window.addEventListener("load", Pagy.init);
77
+ </script>
78
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
79
+ <style type="text/css">
80
+ @media screen { html, body {
81
+ font-size: 1rem;
82
+ line-height: 1.2;
83
+ padding: 0;
84
+ margin: 0;
85
+ } }
86
+ body {
87
+ background: white !important;
88
+ margin: 0 !important;
89
+ font-family: sans-serif !important;
90
+ }
91
+ .main-content {
92
+ padding: 1rem 1.5rem 2rem !important;
93
+ }
94
+ .pagy, .pagy-bootstrap, .pagy-bulma {
95
+ padding: .5em;
96
+ margin: .3em 0;
97
+ width: fit-content;
98
+ box-shadow: 5px 5px 10px 0px rgba(0,0,0,0.2);
99
+ }
100
+ /* Quick demo for overriding the element style attribute of certain pagy helpers
101
+ .pagy input[style] {
102
+ width: 5rem !important;
103
+ }
104
+ */
105
+
106
+ /*
107
+ If you want to customize the style,
108
+ please replace the line below with the actual file content
109
+ */
110
+ <%= Pagy::ROOT.join('stylesheets/pagy.css').read %>
111
+ </style>
112
+ </head>
113
+ <body>
114
+ <%= yield %>
115
+ </body>
116
+ </html>
117
+ ERB
118
+ end
119
+
120
+ template :main do
121
+ <<~ERB
122
+ <div class="main-content">
123
+ <h1>Pagy Repro App</h1>
124
+ <p> Self-contained, standalone app usable to easily reproduce any pagy issue.</p>
125
+
126
+ <h2>Versions</h2>
127
+ <ul>
128
+ <li>Ruby: <%= RUBY_VERSION %></li>
129
+ <li>Rack: <%= Rack::RELEASE %></li>
130
+ <li>Sinatra: <%= Sinatra::VERSION %></li>
131
+ <li>Pagy: <%= Pagy::VERSION %></li>
132
+ </ul>
133
+
134
+ <h3>Collection</h3>
135
+ <p id="records">@records: <%= @records.join(',') %></p>
136
+
137
+ <hr>
138
+
139
+ <h4>@pagy.series_nav</h4>
140
+ <%= @pagy.series_nav(id: 'series-nav',
141
+ aria_label: 'Pages nav') %>
142
+
143
+ <h4>@pagy.series_nav_js (responsive)</h4>
144
+ <%= @pagy.series_nav_js(id: 'series-nav-js-responsive',
145
+ aria_label: 'Pages nav_js_responsive',
146
+ steps: { 0 => 5, 500 => 7, 600 => 9, 700 => 11 }) %>
147
+
148
+ <h4>@pagy.input_nav_js</h4>
149
+ <%= @pagy.input_nav_js(id: 'input-nav-js',
150
+ aria_label: 'Pages input_nav_js') %>
151
+
152
+ <h4>@pagy.limit_tag_js</h4>
153
+ <%= @pagy.limit_tag_js(id: 'limit-tag-js') %>
154
+
155
+ <h4>@pagy.info_tag</h4>
156
+ <%= @pagy.info_tag(id: 'pagy-info') %>
157
+ </div>
158
+ ERB
159
+ end
160
+ end
161
+
162
+ # Simple array-based collection that acts as a standard DB collection.
163
+ # Use it as a simple way to get a collection that acts as an AR scope, but without any DB
164
+ # or create an ActiveRecord class or anything else that you need instead
165
+ class MockCollection < Array
166
+ def initialize(arr = Array(1..1000))
167
+ super
168
+ @collection = clone
169
+ end
170
+
171
+ def offset(value)
172
+ @collection = self[value..] || []
173
+ self
174
+ end
175
+
176
+ def limit(value)
177
+ @collection.empty? ? [] : @collection[0, value]
178
+ end
179
+
180
+ def count(*)
181
+ size
182
+ end
183
+ end
184
+
185
+ run PagyRepro
data/bin/pagy ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../lib/pagy/cli'
5
+ Pagy::CLI.new.start
data/config/pagy.rb ADDED
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Pagy initializer file (43.5.1)
4
+ # See https://ddnexus.github.io/pagy/toolbox/configuration/initializer/
5
+
6
+
7
+ ############ Global Options ################################################################
8
+ # See https://ddnexus.github.io/pagy/toolbox/configuration/options/ for details.
9
+ # Examples:
10
+ #
11
+ # Pagy::OPTIONS[:limit] = 10 # Limit the items per page
12
+ # Pagy::OPTIONS[:max_limit] = 100 # The client is allowed to request a limit up to 100
13
+ # Pagy::OPTIONS[:jsonapi] = true # Use JSON:API compliant URLs
14
+
15
+ Pagy::OPTIONS.freeze
16
+
17
+ ############ JS and CSS Resources ##########################################################
18
+ # See https://ddnexus.github.io/pagy/resources/javascript/
19
+ # and https://ddnexus.github.io/pagy/resources/stylesheets/ for details.
20
+ # Sync example:
21
+ #
22
+ # if Rails.env.development?
23
+ # Pagy.sync(:javascript, Rails.root.join('app/javascript'), 'pagy.mjs')
24
+ # Pagy.sync(:stylesheet, Rails.root.join('app/stylesheets'), 'pagy.css')
25
+ # end
26
+ #
27
+ # Pipeline example:
28
+ #
29
+ # Rails.application.config.assets.paths << Pagy::ROOT.join(':javascripts')
30
+ # Rails.application.config.assets.paths << Pagy::ROOT.join(':stylesheets')
31
+
32
+ ############# Overriding Pagy::I18n Lookup #################################################
33
+ # See https://ddnexus.github.io/pagy/resources/i18n/ for details.
34
+ # Example for Rails:
35
+ #
36
+ # Pagy::I18n.pathnames << Rails.root.join('config/locales/pagy')
37
+
38
+ ############# I18n Gem Translation #########################################################
39
+ # See https://ddnexus.github.io/pagy/resources/i18n/ for details.
40
+ #
41
+ # Pagy.translate_with_the_slower_i18n_gem!
42
+
43
+ ############# Calendar Localization for non-en locales ####################################
44
+ # See https://ddnexus.github.io/pagy/toolbox/paginators/calendar#localization for details.
45
+ #
46
+ # Pagy::Calendar.localize_with_rails_i18n_gem(*your_locales)
@@ -0,0 +1,90 @@
1
+ const PagyAIWidget = {
2
+ HOST_ID: 'gurubase-chat-widget-container',
3
+ IMG_SELECTOR: '#chatWindow > div.anteon-header > div > img',
4
+ NAME_SELECTOR: '#chatWindow > div.anteon-header > div > span',
5
+ DESCRIPTION_SELECTOR: '#chatWindow > div.chat-messages > div > p',
6
+ NEW_IMG_SIZE: '40px',
7
+ NEW_NAME: 'Ask Pagy AI',
8
+ NEW_DESCRIPTION: 'Pagy AI uses the latest data in the documentation to answer your questions.',
9
+ ICON_URL: 'https://github.com/ddnexus/pagy/blob/master/assets/images/pagy-the-frog.png?raw=true',
10
+ skipTurbo: true,
11
+
12
+ checkAndEdit: function() {
13
+ const hostElement = document.getElementById(this.HOST_ID);
14
+ if (hostElement && hostElement.shadowRoot) {
15
+ const shadowRoot = hostElement.shadowRoot;
16
+ const img = shadowRoot.querySelector(this.IMG_SELECTOR);
17
+ const name = shadowRoot.querySelector(this.NAME_SELECTOR);
18
+ const description = shadowRoot.querySelector(this.DESCRIPTION_SELECTOR);
19
+
20
+ if (img) {
21
+ img.style.maxWidth = this.NEW_IMG_SIZE;
22
+ img.style.maxHeight = this.NEW_IMG_SIZE;
23
+ }
24
+ if (name) {
25
+ name.textContent = this.NEW_NAME;
26
+ }
27
+ if (description) {
28
+ description.textContent = this.NEW_DESCRIPTION;
29
+ }
30
+ return true;
31
+ }
32
+ return false;
33
+ },
34
+
35
+ attemptEditing: function() {
36
+ if (this.checkAndEdit()) {
37
+ return;
38
+ }
39
+ setTimeout(() => this.attemptEditing(), 200);
40
+ },
41
+
42
+ editChatWidget: function() {
43
+ this.attemptEditing();
44
+ },
45
+
46
+ appendWidgetScript: function() {
47
+ const script = document.createElement('script');
48
+ const hostname = window.location.hostname;
49
+
50
+ switch (hostname) {
51
+ case 'ddnexus.github.io': // remote docs
52
+ script.dataset.widgetId = 'HKtFSPZLGiAXOdBWS4rSAxEkqv8czIbJoQdMEwCqgEc';
53
+ script.dataset.margins = '{"bottom": "1.48rem", "right": "6rem"}';
54
+ break;
55
+ case 'localhost': // local docs
56
+ script.dataset.widgetId = 'djgBhRlpdH8b07oj0Gsaerz69Xfs0FXMuUluyOo2iR4';
57
+ script.dataset.margins = '{"bottom": "1.48rem", "right": "6rem"}';
58
+ break;
59
+ case '127.0.0.1': // apps
60
+ script.dataset.widgetId = '_rXLissYyqe-dJ9vGGGXzmJwavoW0GvuzQPEq5BZjP8';
61
+ break;
62
+ default:
63
+ console.error('Pagy AI - Unknown hostname: ', hostname);
64
+ }
65
+ script.async = true;
66
+ script.src = 'https://widget.gurubase.io/widget.latest.min.js';
67
+ script.id = 'guru-widget-id';
68
+ script.dataset.iconUrl = this.ICON_URL;
69
+ script.dataset.text = 'Pagy AI';
70
+ script.dataset.bgColor = '#1f7a1f';
71
+ script.dataset.lightMode = 'auto';
72
+ script.dataset.tooltipSide = 'bottom';
73
+ document.head.appendChild(script);
74
+ }
75
+ };
76
+
77
+ document.addEventListener('DOMContentLoaded', () => {
78
+ PagyAIWidget.appendWidgetScript();
79
+ PagyAIWidget.editChatWidget();
80
+ });
81
+
82
+ document.addEventListener("turbo:load", () => {
83
+ // skip only the first time (already done by DOMContentLoaded)
84
+ if (PagyAIWidget.skipTurbo) {
85
+ PagyAIWidget.skipTurbo = false;
86
+ } else {
87
+ window.chatWidget = new ChatWidget();
88
+ PagyAIWidget.editChatWidget();
89
+ }
90
+ });
@@ -0,0 +1,168 @@
1
+ // pagy.ts
2
+ var pagy_default = (() => {
3
+ const storageSupport = "sessionStorage" in window && "BroadcastChannel" in window;
4
+ let pagy = "pagy", storage, sync, tabId;
5
+ if (storageSupport) {
6
+ storage = sessionStorage;
7
+ sync = new BroadcastChannel(pagy);
8
+ tabId = Date.now();
9
+ sync.addEventListener("message", (e) => {
10
+ if (e.data.from) {
11
+ const cutoffs = storage.getItem(e.data.key);
12
+ if (cutoffs) {
13
+ sync.postMessage({ to: e.data.from, key: e.data.key, str: cutoffs });
14
+ }
15
+ } else if (e.data.to) {
16
+ if (e.data.to == tabId) {
17
+ storage.setItem(e.data.key, e.data.str);
18
+ }
19
+ }
20
+ });
21
+ }
22
+ const rjsObserver = new ResizeObserver((entries) => {
23
+ entries.forEach((e) => {
24
+ e.target.querySelectorAll(".pagy-rjs").forEach((el) => {
25
+ el.render();
26
+ });
27
+ });
28
+ });
29
+ const B64SafeEncode = (unicode) => btoa(String.fromCharCode(...new TextEncoder().encode(unicode))).replace(/[+/=]/g, (m) => m == "+" ? "-" : m == "/" ? "_" : ""), B64Decode = (base64) => new TextDecoder().decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
30
+ const randKey = () => Math.floor(Math.random() * 36 ** 3).toString(36);
31
+ const augmentKeynav = async (nav, [storageKey, rootKey, pageKey, last, spliceArgs]) => {
32
+ let augmentPage;
33
+ const browserKey = document.cookie.split(/;\s+/).find((row) => row.startsWith(pagy + "="))?.split("=")[1] ?? randKey();
34
+ document.cookie = `${pagy}=${browserKey}`;
35
+ if (storageKey && !(storageKey in storage)) {
36
+ sync.postMessage({ from: tabId, key: storageKey });
37
+ await new Promise((resolve) => setTimeout(() => {
38
+ resolve("");
39
+ }, 100));
40
+ if (!(storageKey in storage)) {
41
+ augmentPage = (page) => `${page}+${String(last)}`;
42
+ }
43
+ }
44
+ if (!augmentPage) {
45
+ if (!storageKey) {
46
+ do {
47
+ storageKey = randKey();
48
+ } while (storageKey in storage);
49
+ }
50
+ const data = storage.getItem(storageKey), cutoffs = data ? JSON.parse(data) : [undefined];
51
+ if (spliceArgs) {
52
+ cutoffs.splice(...spliceArgs);
53
+ storage.setItem(storageKey, JSON.stringify(cutoffs));
54
+ }
55
+ augmentPage = (page) => {
56
+ const pageNum = parseInt(page);
57
+ return B64SafeEncode(JSON.stringify([
58
+ browserKey,
59
+ storageKey,
60
+ pageNum,
61
+ cutoffs.length,
62
+ cutoffs[pageNum - 1],
63
+ cutoffs[pageNum]
64
+ ]));
65
+ };
66
+ }
67
+ const search = rootKey ? `${rootKey}%5B${pageKey}%5D` : pageKey;
68
+ const re = new RegExp(`(?<=\\?.*)(\\b${search}=)(\\d+)`);
69
+ for (const a of nav.querySelectorAll("a[href]")) {
70
+ a.href = a.href.replace(re, (_match, prefix, digit) => `${String(prefix)}${augmentPage(digit)}`);
71
+ }
72
+ return augmentPage;
73
+ };
74
+ const buildNavJs = (nav, [
75
+ [before, anchor, current, gap, after],
76
+ pageToken,
77
+ [widths, series, labels],
78
+ keynavArgs
79
+ ]) => {
80
+ const parent = nav.parentElement;
81
+ let lastWidth = -1;
82
+ (nav.render = () => {
83
+ const index = widths.findIndex((w) => w < parent.clientWidth);
84
+ if (widths[index] === lastWidth) {
85
+ return;
86
+ }
87
+ let html = before;
88
+ series[index].forEach((item, i) => {
89
+ html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? `${String(item)}<`);
90
+ });
91
+ html += after;
92
+ nav.innerHTML = "";
93
+ nav.insertAdjacentHTML("afterbegin", html);
94
+ lastWidth = widths[index];
95
+ if (keynavArgs && storageSupport) {
96
+ augmentKeynav(nav, keynavArgs);
97
+ }
98
+ })();
99
+ if (nav.classList.contains(pagy + "-rjs")) {
100
+ rjsObserver.observe(parent);
101
+ }
102
+ };
103
+ const initInputNavJs = async (nav, [url_token, pageToken, keynavArgs]) => {
104
+ const augment = keynavArgs && storageSupport ? await augmentKeynav(nav, keynavArgs) : (page) => page;
105
+ initInput(nav, (inputValue) => url_token.replace(pageToken, augment(inputValue)));
106
+ };
107
+ const initLimitTagJs = (span, [from, url_token, page_token, limitToken]) => {
108
+ initInput(span, (inputValue) => {
109
+ return url_token.replace(page_token, Math.max(Math.ceil(from / parseInt(inputValue)), 1)).replace(limitToken, inputValue);
110
+ });
111
+ };
112
+ const initInput = (element, getUrl) => {
113
+ const input = element.querySelector("input"), link = element.querySelector("a");
114
+ let initial = input.value;
115
+ const action = () => {
116
+ if (input.value === initial) {
117
+ return;
118
+ }
119
+ const [min, val, max] = [input.min, input.value, input.max].map((n) => parseInt(n) || 0);
120
+ if (val < min || val > max) {
121
+ input.value = initial;
122
+ input.select();
123
+ return;
124
+ }
125
+ initial = input.value;
126
+ link.href = getUrl(input.value);
127
+ link.click();
128
+ };
129
+ input.addEventListener("focus", () => {
130
+ input.select();
131
+ });
132
+ input.addEventListener("focusout", action);
133
+ input.addEventListener("keypress", (e) => {
134
+ if (e.key == "Enter") {
135
+ action();
136
+ }
137
+ });
138
+ };
139
+ return {
140
+ version: "43.5.1",
141
+ init(arg) {
142
+ const target = arg instanceof HTMLElement ? arg : document, elements = target.querySelectorAll("[data-pagy]");
143
+ for (const element of elements) {
144
+ try {
145
+ const [helperId, ...args] = JSON.parse(B64Decode(element.getAttribute("data-pagy")));
146
+ if (helperId == "k") {
147
+ augmentKeynav(element, ...args);
148
+ } else if (helperId == "snj") {
149
+ buildNavJs(element, args);
150
+ } else if (helperId == "inj") {
151
+ initInputNavJs(element, args);
152
+ } else if (helperId == "ltj") {
153
+ initLimitTagJs(element, args);
154
+ }
155
+ } catch (err) {
156
+ console.warn(`Pagy.init: %o
157
+ %s`, element, err);
158
+ }
159
+ }
160
+ }
161
+ };
162
+ })();
163
+
164
+ // pagy-shim.ts
165
+ window.Pagy = pagy_default;
166
+
167
+ //# debugId=688FC1BE541CE72564756E2164756E21
168
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFneS50cyIsICJwYWd5LXNoaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW50ZXJmYWNlIFN5bmNEYXRhIHtcbiAgZnJvbT86IG51bWJlclxuICB0bz8gIDogbnVtYmVyXG4gIGtleSAgOiBzdHJpbmdcbiAgc3RyPyA6IHN0cmluZ1xufVxudHlwZSBJbml0QXJncyA9IFtcImtcIiwgIEtleW5hdkFyZ3NdIHwgICAgICAgICAgLy8gc2VyaWVzX25hdltfanNdIHdpdGgga2V5bmF2IGluc3RhbmNlXG4gICAgICAgICAgICAgICAgW1wic25qXCIsIFNlcmllc05hdkpzQXJnc10gfCAgICAvLyBzZXJpZXNfbmF2X2pzXG4gICAgICAgICAgICAgICAgW1wiaW5qXCIsIElucHV0TmF2SnNBcmdzXSB8ICAgICAvLyBpbnB1dF9uYXZfanNcbiAgICAgICAgICAgICAgICBbXCJsdGpcIiwgTGltaXRUYWdKc0FyZ3NdOyAgICAgIC8vIGxpbWl0X3RhZ19qc1xudHlwZSBBdWdtZW50S2V5bmF2ID0gKG5hdjpIVE1MRWxlbWVudCwga2V5bmF2QXJnczpLZXluYXZBcmdzKSA9PiBQcm9taXNlPCgocGFnZTogc3RyaW5nKSA9PiBzdHJpbmcpPjtcbnR5cGUgS2V5bmF2QXJncyA9IHJlYWRvbmx5IFtzdG9yYWdlS2V5IDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290S2V5ICAgIDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlS2V5ICAgIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgICAgICAgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlQXJncz86IFNwbGljZUFyZ3NdO1xudHlwZSBTcGxpY2VBcmdzID0gcmVhZG9ubHkgW3N0YXJ0ICAgICAgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IG51bWJlciwgICAgIC8vIGl0IHdvdWxkIGJlIG9wdGlvbmFsLCBidXQgdHMgY29tcGxhaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXM6ICAgIEN1dG9mZltdXTtcbnR5cGUgQ3V0b2ZmID0gcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW107XG50eXBlIEF1Z21lbnRlZFBhZ2UgPSBbYnJvd3NlcklkICA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlS2V5IDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZXMgICAgICA6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBwcmlvckN1dG9mZjogQ3V0b2ZmIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlQ3V0b2ZmIDogQ3V0b2ZmIHwgbnVsbF07XG50eXBlIFNlcmllc05hdkpzQXJncyA9IHJlYWRvbmx5IFtOYXZKc1Rva2VucywgcGFnZVRva2VuOiBzdHJpbmcsIE5hdkpzU2VyaWVzLCBLZXluYXZBcmdzP107XG50eXBlIE5hdkpzU2VyaWVzID0gcmVhZG9ubHkgW3dpZHRoczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogKHN0cmluZyB8IG51bWJlcilbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IHN0cmluZ1tdW10gfCBudWxsXTtcbnR5cGUgSW5wdXROYXZKc0FyZ3MgPSByZWFkb25seSBbdXJsVG9rZW46ICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUb2tlbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXluYXZBcmdzP107XG50eXBlIExpbWl0VGFnSnNBcmdzID0gcmVhZG9ubHkgW2Zyb20gICAgICA6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsVG9rZW4gIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVG9rZW4gOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0VG9rZW46IHN0cmluZ107XG50eXBlIE5hdkpzVG9rZW5zID0gcmVhZG9ubHkgW2JlZm9yZSA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcCAgICA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgIDogc3RyaW5nXTtcbmludGVyZmFjZSBOYXZKc0VsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIHJlbmRlcigpOiB2b2lkXG59XG5cbi8vIFRoZSBzeW50YXggdXNlZCBpbiB0aGlzIGZpbGUgaGFzIGJlZW4gY2FyZWZ1bGx5IGNvbXBvc2VkIHRvIG1pbmltaXplXG4vLyB0aGUgcGFneS5taW4uanMgc2l6ZSBhbmQgYXZvaWQgcG9sbHV0aW9uIGluIHRoZSB3aW5kb3cgb2JqZWN0LlxuZXhwb3J0IGRlZmF1bHQgKCgpID0+IHtcbiAgY29uc3Qgc3RvcmFnZVN1cHBvcnQgPSAnc2Vzc2lvblN0b3JhZ2UnIGluIHdpbmRvdyAmJiAnQnJvYWRjYXN0Q2hhbm5lbCcgaW4gd2luZG93O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCBwYWd5ID0gXCJwYWd5XCIsIHN0b3JhZ2U6IFN0b3JhZ2UsIHN5bmM6IEJyb2FkY2FzdENoYW5uZWwsIHRhYklkOiBudW1iZXI7XG4gIGlmIChzdG9yYWdlU3VwcG9ydCkge1xuICAgIHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZTsgLy8gc2hvcnRlbiB0aGUgY29tcGlsZWQgc2l6ZVxuICAgIHN5bmMgICAgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbChwYWd5KTtcbiAgICB0YWJJZCAgID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFN5bmMgdGhlIHNlc3Npb25TdG9yYWdlIGtleXMgZm9yIHRoZSBjdXRvZmZzIG9wZW5lZCBpbiBhIG5ldyB0YWIvd2luZG93XG4gICAgc3luYy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZTpNZXNzYWdlRXZlbnQ8U3luY0RhdGE+KSA9PiB7XG4gICAgICBpZiAoZS5kYXRhLmZyb20pIHsgLy8gcmVxdWVzdCBjdXRvZmZzXG4gICAgICAgIGNvbnN0IGN1dG9mZnMgPSBzdG9yYWdlLmdldEl0ZW0oZS5kYXRhLmtleSk7XG4gICAgICAgIGlmIChjdXRvZmZzKSB7XG4gICAgICAgICAgc3luYy5wb3N0TWVzc2FnZSg8U3luY0RhdGE+e3RvOiBlLmRhdGEuZnJvbSwga2V5OiBlLmRhdGEua2V5LCBzdHI6IGN1dG9mZnN9KTtcbiAgICAgICAgfSAvLyBzZW5kIHJlc3BvbnNlXG4gICAgICB9IGVsc2UgaWYgKGUuZGF0YS50bykgeyAgLy8gcmVjZWl2ZSBjdXRvZmZzXG4gICAgICAgIGlmIChlLmRhdGEudG8gPT0gdGFiSWQpIHtcbiAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oZS5kYXRhLmtleSwgPHN0cmluZz5lLmRhdGEuc3RyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8vIFRoZSBvYnNlcnZlciBpbnN0YW5jZSBmb3IgcmVzcG9uc2l2ZSBuYXZzXG4gIGNvbnN0IHJqc09ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgIGVudHJpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgIGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGw8TmF2SnNFbGVtZW50PihcIi5wYWd5LXJqc1wiKS5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgZWwucmVuZGVyKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLyogRnVsbCBzZXQgb2YgQjY0IGZ1bmN0aW9uc1xuICBjb25zdCBCNjRFbmNvZGUgICAgID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHVuaWNvZGUpKSksXG4gICAgICAgIEI2NFNhZmUgICAgICAgPSAodW5zYWZlOnN0cmluZykgID0+IHVuc2FmZS5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NFNhZmVFbmNvZGUgPSAodW5pY29kZTpzdHJpbmcpID0+IEI2NFNhZmUoQjY0RW5jb2RlKHVuaWNvZGUpKSxcbiAgICAgICAgQjY0RGVjb2RlICAgICA9IChiYXNlNjQ6c3RyaW5nKSAgPT4gKG5ldyBUZXh0RGVjb2RlcigpKS5kZWNvZGUoVWludDhBcnJheS5mcm9tKGF0b2IoYmFzZTY0KSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpKSxcbiAgICAgICAgQjY0VW5zYWZlICAgICA9IChzYWZlOnN0cmluZykgICAgPT4gc2FmZS5yZXBsYWNlKC9bLV9dL2csIChtYXRjaCkgPT4gbWF0Y2ggPT0gXCItXCIgPyBcIitcIiA6IFwiL1wiKSxcbiAgICAgICAgQjY0U2FmZURlY29kZSA9IChiYXNlNjQ6c3RyaW5nKSAgPT4gQjY0RGVjb2RlKEI2NFVuc2FmZShiYXNlNjQpKVxuICAqL1xuICBjb25zdCBCNjRTYWZlRW5jb2RlID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHVuaWNvZGUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGtleTogMyBjaGFycyBtYXgsIGJhc2UtMzYgbnVtYmVyIDwgMzYqKjNcbiAgY29uc3QgcmFuZEtleSA9ICgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2ICoqIDMpLnRvU3RyaW5nKDM2KTtcblxuICAvLyBNYW5hZ2UgdGhlIHBhZ2UgYXVnbWVudGF0aW9uIGZvciBLZXluYXYsIGNhbGxlZCBvbmx5IGlmIHN0b3JhZ2VTdXBwb3J0XG4gIGNvbnN0IGF1Z21lbnRLZXluYXY6IEF1Z21lbnRLZXluYXYgPSBhc3luYyAobmF2LCBbc3RvcmFnZUtleSwgcm9vdEtleSwgcGFnZUtleSwgbGFzdCwgc3BsaWNlQXJnc10pID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYWxpZ24tYXNzaWdubWVudHMvYWxpZ24tYXNzaWdubWVudHNcbiAgICBsZXQgYXVnbWVudFBhZ2U6IChwYWdlOiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBjb25zdCBicm93c2VyS2V5ID0gZG9jdW1lbnQuY29va2llLnNwbGl0KC87XFxzKy8pICAvLyBpdCB3b3JrcyBldmVuIGlmIG1hbGZvcm1lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKChyb3cpID0+IHJvdy5zdGFydHNXaXRoKHBhZ3kgKyBcIj1cIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5zcGxpdChcIj1cIilbMV0gPz8gcmFuZEtleSgpO1xuICAgIGRvY3VtZW50LmNvb2tpZSAgPSBgJHtwYWd5fT0ke2Jyb3dzZXJLZXl9YDsgIC8vIFNtYWxsZXIgLm1pbiBzaXplOiBzZXQgdGhlIGNvb2tpZSB3aXRob3V0IGNoZWNraW5nXG4gICAgaWYgKHN0b3JhZ2VLZXkgJiYgIShzdG9yYWdlS2V5IGluIHN0b3JhZ2UpKSB7XG4gICAgICAvLyBTeW5jIHRoZSBzZXNzaW9uZ1N0b3JhZ2UgZnJvbSBvdGhlciB0YWJzL3dpbmRvd3MgKGUuZy4sIG9wZW4gcGFnZSBpbiB0aGUgbmV3IHRhYi93aW5kb3cpXG4gICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57IGZyb206IHRhYklkLCBrZXk6IHN0b3JhZ2VLZXkgfSk7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgbGlzdGVuZXIgdG8gY29weSB0aGUgY3V0b2ZmcyBpbiB0aGUgY3VycmVudCBzZXNzaW9uU3RvcmFnZVxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nfG51bGw+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHsgcmVzb2x2ZShcIlwiKSB9LCAxMDApKTtcbiAgICAgIGlmICghKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkpIHsgLy8gdGhlIHN0b3JhZ2VLZXkgZGlkbid0IGdldCBjb3BpZWQ6IGZhbGxiYWNrIHRvIGNvdW50bGVzcyBwYWdpbmF0aW9uXG4gICAgICAgIGF1Z21lbnRQYWdlID0gKHBhZ2U6IHN0cmluZykgPT4gYCR7cGFnZX0rJHtTdHJpbmcobGFzdCl9YDsgICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgSWYgaXQgaXMgbm90IGFzc2lnbmVkIGl0IG1lYW5zIGl0IHN1cHBvcnRzIGtleW5hdlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgaWYgKCFhdWdtZW50UGFnZSkgeyAvLyByZWd1bGFyIGtleW5hdiBwYWdpbmF0aW9uXG4gICAgICBpZiAoIXN0b3JhZ2VLZXkpIHsgZG8geyBzdG9yYWdlS2V5ID0gcmFuZEtleSgpIH0gd2hpbGUgKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkgfSAvLyBubyBkdXAga2V5c1xuICAgICAgY29uc3QgZGF0YSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KSxcbiAgICAgICAgICBjdXRvZmZzID0gPEN1dG9mZltdPihkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IFt1bmRlZmluZWRdKTtcbiAgICAgIGlmIChzcGxpY2VBcmdzKSB7XG4gICAgICAgIGN1dG9mZnMuc3BsaWNlKC4uLnNwbGljZUFyZ3MpO1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoY3V0b2ZmcykpO1xuICAgICAgfVxuICAgICAgLy8gQXVnbWVudCBmdW5jdGlvblxuICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTpzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZU51bSA9IHBhcnNlSW50KHBhZ2UpO1xuICAgICAgICByZXR1cm4gQjY0U2FmZUVuY29kZShKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIDxBdWdtZW50ZWRQYWdlPlticm93c2VyS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZzLmxlbmd0aCwgICAgICAgLy8gcGFnZXMvbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bSAtIDFdLCAvLyBwcmlvckN1dG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bV1dKSk7ICAvLyBwYWdlQ3V0b2ZmXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSAocm9vdEtleSkgPyBgJHtyb290S2V5fSU1QiR7cGFnZUtleX0lNURgIDogcGFnZUtleTtcbiAgICBjb25zdCByZSAgICAgPSBuZXcgUmVnRXhwKGAoPzw9XFxcXD8uKikoXFxcXGIke3NlYXJjaH09KShcXFxcZCspYCk7XG4gICAgLy8gQXVnbWVudCB0aGUgcGFnZSBwYXJhbSBvZiBlYWNoIGhyZWZcbiAgICBmb3IgKGNvbnN0IGEgb2YgPE5vZGVMaXN0T2Y8SFRNTEFuY2hvckVsZW1lbnQ+Pjx1bmtub3duPm5hdi5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykpIHtcbiAgICAgIGEuaHJlZiA9IGEuaHJlZi5yZXBsYWNlKHJlLCAoX21hdGNoLCBwcmVmaXgsIGRpZ2l0KTogc3RyaW5nID0+IGAke1N0cmluZyhwcmVmaXgpfSR7YXVnbWVudFBhZ2UoPHN0cmluZz5kaWdpdCl9YCk7XG4gICAgfVxuICAgIC8vIFJldHVybiB0aGUgYXVnbWVudCBmdW5jdGlvbiBmb3IgZnVydGhlciBhdWdtZW50YXRpb24gKGkuZS4sIHVybCB0b2tlbiBpbiBpbnB1dF9uYXZfanMpXG4gICAgcmV0dXJuIGF1Z21lbnRQYWdlO1xuICB9O1xuXG4gIC8vIEJ1aWxkIHRoZSBzZXJpZXNfbmF2X2pzIGhlbHBlclxuICBjb25zdCBidWlsZE5hdkpzID0gKG5hdjpOYXZKc0VsZW1lbnQsIFtbYmVmb3JlLCBhbmNob3IsIGN1cnJlbnQsIGdhcCwgYWZ0ZXJdLCBwYWdlVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRocywgc2VyaWVzLCBsYWJlbHNdLCBrZXluYXZBcmdzXTpTZXJpZXNOYXZKc0FyZ3MpID0+IHtcbiAgICBjb25zdCAgcGFyZW50ID0gPEhUTUxFbGVtZW50Pm5hdi5wYXJlbnRFbGVtZW50O1xuICAgIGxldCBsYXN0V2lkdGggPSAtMTtcbiAgICAobmF2LnJlbmRlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gd2lkdGhzLmZpbmRJbmRleCh3ID0+IHcgPCBwYXJlbnQuY2xpZW50V2lkdGgpO1xuICAgICAgaWYgKHdpZHRoc1tpbmRleF0gPT09IGxhc3RXaWR0aCkgeyByZXR1cm4gfSAvLyBubyBjaGFuZ2U6IGFib3J0XG5cbiAgICAgIGxldCBodG1sID0gYmVmb3JlO1xuICAgICAgc2VyaWVzW2luZGV4XS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIC8vIEF2b2lkIHRoZSBpZiBibG9ja3MgYW5kIGNoYWluIHRoZSByZXN1bHRzIChzaG9ydGVyIHBhZ3kubWluLmpzIGFuZCBlYXNpZXIgcmVhZGluZylcbiAgICAgICAgaHRtbCArPSBpdGVtID09IFwiZ2FwXCIgPyBnYXAgOlxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhlIGl0ZW0gbWF5IGJlIGEgbnVtYmVyLCBidXQgdGhlICdyZXBsYWNlJyBjb252ZXJ0cyBpdCB0byBzdHJpbmcgKHNob3J0ZXIgcGFneS5taW4uanMpXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBpdGVtID09IFwibnVtYmVyXCIgPyBhbmNob3IucmVwbGFjZShwYWdlVG9rZW4sIGl0ZW0pIDogY3VycmVudClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCJMPFwiLCBsYWJlbHM/LltpbmRleF1baV0gPz8gYCR7U3RyaW5nKGl0ZW0pfTxgKTtcbiAgICAgIH0pO1xuICAgICAgaHRtbCAgICAgICAgICs9IGFmdGVyO1xuICAgICAgbmF2LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICBuYXYuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgIGxhc3RXaWR0aCA9IHdpZHRoc1tpbmRleF07XG4gICAgICBpZiAoa2V5bmF2QXJncyAmJiBzdG9yYWdlU3VwcG9ydCkgeyB2b2lkIGF1Z21lbnRLZXluYXYobmF2LCBrZXluYXZBcmdzKSB9XG4gICAgfSkoKTtcbiAgICBpZiAobmF2LmNsYXNzTGlzdC5jb250YWlucyhwYWd5ICsgXCItcmpzXCIpKSB7IHJqc09ic2VydmVyLm9ic2VydmUocGFyZW50KSB9XG4gIH07XG5cbiAgLy8gSW5pdCB0aGUgaW5wdXRfbmF2X2pzIGhlbHBlcnNcbiAgY29uc3QgaW5pdElucHV0TmF2SnMgPSBhc3luYyAobmF2OkhUTUxFbGVtZW50LCBbdXJsX3Rva2VuLCBwYWdlVG9rZW4sIGtleW5hdkFyZ3NdOklucHV0TmF2SnNBcmdzKSA9PiB7XG4gICAgY29uc3QgYXVnbWVudCA9IGtleW5hdkFyZ3MgJiYgc3RvcmFnZVN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBhdWdtZW50S2V5bmF2KG5hdiwga2V5bmF2QXJncylcbiAgICAgICAgICAgICAgICAgICAgOiAocGFnZTogc3RyaW5nKSA9PiBwYWdlO1xuICAgIGluaXRJbnB1dChuYXYsIGlucHV0VmFsdWUgPT4gdXJsX3Rva2VuLnJlcGxhY2UocGFnZVRva2VuLCBhdWdtZW50KGlucHV0VmFsdWUpKSk7XG4gIH07XG5cbiAgLy8gSW5pdCB0aGUgbGltaXRfdGFnX2pzIGhlbHBlclxuICBjb25zdCBpbml0TGltaXRUYWdKcyA9IChzcGFuOkhUTUxTcGFuRWxlbWVudCwgW2Zyb20sIHVybF90b2tlbiwgcGFnZV90b2tlbiwgbGltaXRUb2tlbl06TGltaXRUYWdKc0FyZ3MpID0+IHtcbiAgICBpbml0SW5wdXQoc3BhbiwgaW5wdXRWYWx1ZSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBwYWdlIGlzIGEgbnVtYmVyLCBidXQgdGhlICdyZXBsYWNlJyBjb252ZXJ0cyBpdCB0byBzdHJpbmcgKHNob3J0ZXIgcGFneS5taW4uanMpXG4gICAgICByZXR1cm4gdXJsX3Rva2VuLnJlcGxhY2UocGFnZV90b2tlbiwgTWF0aC5tYXgoTWF0aC5jZWlsKGZyb20gLyBwYXJzZUludChpbnB1dFZhbHVlKSksIDEpKVxuICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGxpbWl0VG9rZW4sIGlucHV0VmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEluaXQgdGhlIGlucHV0IGVsZW1lbnRcbiAgY29uc3QgaW5pdElucHV0ID0gKGVsZW1lbnQ6SFRNTEVsZW1lbnQsIGdldFVybDoodjpzdHJpbmcpID0+IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGlucHV0ICAgPSA8SFRNTElucHV0RWxlbWVudD5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKSxcbiAgICAgICAgICBsaW5rICAgID0gPEhUTUxBbmNob3JFbGVtZW50PmVsZW1lbnQucXVlcnlTZWxlY3RvcihcImFcIik7XG4gICAgbGV0ICAgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgIGNvbnN0IGFjdGlvbiAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSBpbml0aWFsKSB7IHJldHVybiB9ICAvLyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFttaW4sIHZhbCwgbWF4XSA9IFtpbnB1dC5taW4sIGlucHV0LnZhbHVlLCBpbnB1dC5tYXhdLm1hcChuID0+IHBhcnNlSW50KG4pIHx8IDApO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7ICAvLyByZXNldCBpbnZhbGlkL291dC1vZi1yYW5nZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBpbml0aWFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgICA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGdldFVybChpbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoKSA9PiB7IGlucHV0LnNlbGVjdCgpIH0pO1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBhY3Rpb24pO1xuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCBlID0+IHsgaWYgKGUua2V5ID09IFwiRW50ZXJcIikgeyBhY3Rpb24oKSB9IH0pO1xuICB9O1xuXG4gIC8vIFB1YmxpYyBpbnRlcmZhY2VcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBcIjQzLjUuMVwiLFxuXG4gICAgLy8gU2NhbiBmb3IgZWxlbWVudHMgd2l0aCBhIFwiZGF0YS1wYWd5XCIgYXR0cmlidXRlIGFuZCBjYWxsIHRoZWlyIGluaXQgZnVuY3Rpb25zIHdpdGggdGhlIGRlY29kZWQgYXJnc1xuICAgIGluaXQoYXJnPzpIVE1MRWxlbWVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gYXJnIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudCxcbiAgICAgICAgICAgIGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiA8Tm9kZUxpc3RPZjxIVE1MRWxlbWVudD4+ZWxlbWVudHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbaGVscGVySWQsIC4uLmFyZ3NdID0gPEluaXRBcmdzPkpTT04ucGFyc2UoQjY0RGVjb2RlKDxzdHJpbmc+ZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikpKTtcbiAgICAgICAgICBpZiAoaGVscGVySWQgPT0gXCJrXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3ByZWFkIDIgYXJndW1lbnRzLCBub3QgMyBhcyBpdCBjb21wbGFpbnMgYWJvdXRcbiAgICAgICAgICAgIHZvaWQgYXVnbWVudEtleW5hdihlbGVtZW50LCAuLi48S2V5bmF2QXJncz48dW5rbm93bj5hcmdzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlcklkID09IFwic25qXCIpIHtcbiAgICAgICAgICAgIGJ1aWxkTmF2SnMoPE5hdkpzRWxlbWVudD5lbGVtZW50LCA8U2VyaWVzTmF2SnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJpbmpcIikge1xuICAgICAgICAgICAgdm9pZCBpbml0SW5wdXROYXZKcyhlbGVtZW50LCA8SW5wdXROYXZKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJsdGpcIikge1xuICAgICAgICAgICAgaW5pdExpbWl0VGFnSnMoZWxlbWVudCwgPExpbWl0VGFnSnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlbHNlIHsgY29uc29sZS53YXJuKFwiUGFneS5pbml0OiAlb1xcblVua25vd24gaGVscGVySWQgJyVzJ1wiLCBlbGVtZW50LCBoZWxwZXJJZCkgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS53YXJuKFwiUGFneS5pbml0OiAlb1xcbiVzXCIsIGVsZW1lbnQsIGVycikgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn0pKCk7XG4iLAogICAgImltcG9ydCBQYWd5IGZyb20gXCIuL3BhZ3kudHNcIlxud2luZG93LlBhZ3kgPSBQYWd5XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBZ0RBLElBQWdCLHNCQUFNO0FBQUEsRUFDcEIsTUFBTSxpQkFBaUIsb0JBQW9CLFVBQVUsc0JBQXNCO0FBQUEsRUFFM0UsSUFBSSxPQUFPLFFBQVEsU0FBa0IsTUFBd0I7QUFBQSxFQUM3RCxJQUFJLGdCQUFnQjtBQUFBLElBQ2xCLFVBQVU7QUFBQSxJQUNWLE9BQVUsSUFBSSxpQkFBaUIsSUFBSTtBQUFBLElBQ25DLFFBQVUsS0FBSyxJQUFJO0FBQUEsSUFHbkIsS0FB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
@@ -0,0 +1,2 @@
1
+ window.Pagy=(()=>{let B="sessionStorage"in window&&"BroadcastChannel"in window,L="pagy",Z,O,W;if(B)Z=sessionStorage,O=new BroadcastChannel(L),W=Date.now(),O.addEventListener("message",(q)=>{if(q.data.from){let z=Z.getItem(q.data.key);if(z)O.postMessage({to:q.data.from,key:q.data.key,str:z})}else if(q.data.to){if(q.data.to==W)Z.setItem(q.data.key,q.data.str)}});let V=new ResizeObserver((q)=>{q.forEach((z)=>{z.target.querySelectorAll(".pagy-rjs").forEach((C)=>{C.render()})})}),_=(q)=>btoa(String.fromCharCode(...new TextEncoder().encode(q))).replace(/[+/=]/g,(z)=>z=="+"?"-":z=="/"?"_":""),x=(q)=>new TextDecoder().decode(Uint8Array.from(atob(q),(z)=>z.charCodeAt(0))),P=()=>Math.floor(Math.random()*46656).toString(36),J=async(q,[z,C,F,H,G])=>{let Q,X=document.cookie.split(/;\s+/).find((M)=>M.startsWith(L+"="))?.split("=")[1]??P();if(document.cookie=`${L}=${X}`,z&&!(z in Z)){if(O.postMessage({from:W,key:z}),await new Promise((M)=>setTimeout(()=>{M("")},100)),!(z in Z))Q=(M)=>`${M}+${String(H)}`}if(!Q){if(!z)do z=P();while(z in Z);let M=Z.getItem(z),Y=M?JSON.parse(M):[void 0];if(G)Y.splice(...G),Z.setItem(z,JSON.stringify(Y));Q=($)=>{let R=parseInt($);return _(JSON.stringify([X,z,R,Y.length,Y[R-1],Y[R]]))}}let D=C?`${C}%5B${F}%5D`:F,E=new RegExp(`(?<=\\?.*)(\\b${D}=)(\\d+)`);for(let M of q.querySelectorAll("a[href]"))M.href=M.href.replace(E,(Y,$,R)=>`${String($)}${Q(R)}`);return Q},T=(q,[[z,C,F,H,G],Q,[X,D,E],M])=>{let Y=q.parentElement,$=-1;if((q.render=()=>{let R=X.findIndex((j)=>j<Y.clientWidth);if(X[R]===$)return;let U=z;if(D[R].forEach((j,I)=>{U+=j=="gap"?H:(typeof j=="number"?C.replace(Q,j):F).replace("L<",E?.[R][I]??`${String(j)}<`)}),U+=G,q.innerHTML="",q.insertAdjacentHTML("afterbegin",U),$=X[R],M&&B)J(q,M)})(),q.classList.contains(L+"-rjs"))V.observe(Y)},w=async(q,[z,C,F])=>{let H=F&&B?await J(q,F):(G)=>G;S(q,(G)=>z.replace(C,H(G)))},A=(q,[z,C,F,H])=>{S(q,(G)=>{return C.replace(F,Math.max(Math.ceil(z/parseInt(G)),1)).replace(H,G)})},S=(q,z)=>{let C=q.querySelector("input"),F=q.querySelector("a"),H=C.value,G=()=>{if(C.value===H)return;let[Q,X,D]=[C.min,C.value,C.max].map((E)=>parseInt(E)||0);if(X<Q||X>D){C.value=H,C.select();return}H=C.value,F.href=z(C.value),F.click()};C.addEventListener("focus",()=>{C.select()}),C.addEventListener("focusout",G),C.addEventListener("keypress",(Q)=>{if(Q.key=="Enter")G()})};return{version:"43.5.1",init(q){let z=q instanceof HTMLElement?q:document,C=z.querySelectorAll("[data-pagy]");for(let F of C)try{let[H,...G]=JSON.parse(x(F.getAttribute("data-pagy")));if(H=="k")J(F,...G);else if(H=="snj")T(F,G);else if(H=="inj")w(F,G);else if(H=="ltj")A(F,G)}catch(H){console.warn(`Pagy.init: %o
2
+ %s`,F,H)}}}})();