pagy 43.4.4 → 43.5.3

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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/apps/calendar.ru +1 -1
  3. data/apps/demo.ru +2 -2
  4. data/apps/enable_rails_page_segment.rb +7 -5
  5. data/apps/keynav+root_key.ru +1 -1
  6. data/apps/keynav.ru +3 -3
  7. data/apps/keyset.ru +3 -3
  8. data/apps/keyset_sequel.ru +2 -2
  9. data/apps/rails.ru +2 -2
  10. data/apps/repro.ru +3 -3
  11. data/config/pagy.rb +9 -18
  12. data/javascripts/pagy.js +25 -19
  13. data/javascripts/pagy.min.js +1 -1
  14. data/javascripts/pagy.mjs +23 -17
  15. data/lib/pagy/classes/calendar/calendar.rb +6 -8
  16. data/lib/pagy/classes/calendar/unit.rb +10 -10
  17. data/lib/pagy/classes/exceptions.rb +3 -3
  18. data/lib/pagy/classes/keyset/adapters/active_record.rb +0 -6
  19. data/lib/pagy/classes/keyset/adapters/sequel.rb +1 -7
  20. data/lib/pagy/classes/keyset/keynav.rb +6 -6
  21. data/lib/pagy/classes/keyset/keyset.rb +7 -8
  22. data/lib/pagy/classes/offset/countless.rb +5 -10
  23. data/lib/pagy/classes/offset/offset.rb +2 -1
  24. data/lib/pagy/classes/offset/search.rb +1 -1
  25. data/lib/pagy/classes/request.rb +4 -1
  26. data/lib/pagy/cli.rb +8 -21
  27. data/lib/pagy/console.rb +2 -0
  28. data/lib/pagy/deprecated.rb +84 -0
  29. data/lib/pagy/modules/abilities/configurable.rb +1 -7
  30. data/lib/pagy/modules/abilities/countable.rb +1 -2
  31. data/lib/pagy/modules/abilities/linkable.rb +6 -5
  32. data/lib/pagy/modules/abilities/rangeable.rb +1 -2
  33. data/lib/pagy/modules/console.rb +1 -1
  34. data/lib/pagy/modules/i18n/i18n.rb +1 -1
  35. data/lib/pagy/modules/searcher.rb +0 -1
  36. data/lib/pagy/next.rb +25 -0
  37. data/lib/pagy/tasks/sync.rb +1 -0
  38. data/lib/pagy/toolbox/helpers/anchor_tags.rb +0 -4
  39. data/lib/pagy/toolbox/helpers/bootstrap/input_nav_js.rb +0 -1
  40. data/lib/pagy/toolbox/helpers/bootstrap/previous_next_html.rb +0 -1
  41. data/lib/pagy/toolbox/helpers/bootstrap/series_nav.rb +0 -1
  42. data/lib/pagy/toolbox/helpers/bootstrap/series_nav_js.rb +0 -1
  43. data/lib/pagy/toolbox/helpers/bulma/input_nav_js.rb +0 -1
  44. data/lib/pagy/toolbox/helpers/bulma/previous_next_html.rb +0 -1
  45. data/lib/pagy/toolbox/helpers/bulma/series_nav.rb +0 -1
  46. data/lib/pagy/toolbox/helpers/bulma/series_nav_js.rb +0 -1
  47. data/lib/pagy/toolbox/helpers/data_hash.rb +1 -1
  48. data/lib/pagy/toolbox/helpers/headers_hash.rb +1 -1
  49. data/lib/pagy/toolbox/helpers/info_tag.rb +2 -2
  50. data/lib/pagy/toolbox/helpers/input_nav_js.rb +0 -1
  51. data/lib/pagy/toolbox/helpers/limit_tag_js.rb +3 -4
  52. data/lib/pagy/toolbox/helpers/loaders.rb +9 -6
  53. data/lib/pagy/toolbox/helpers/page_url.rb +0 -1
  54. data/lib/pagy/toolbox/helpers/series_nav.rb +0 -1
  55. data/lib/pagy/toolbox/helpers/series_nav_js.rb +0 -1
  56. data/lib/pagy/toolbox/helpers/support/a_lambda.rb +2 -3
  57. data/lib/pagy/toolbox/helpers/support/data_pagy_attribute.rb +0 -1
  58. data/lib/pagy/toolbox/helpers/support/nav_aria_label_attribute.rb +0 -2
  59. data/lib/pagy/toolbox/helpers/support/series.rb +2 -2
  60. data/lib/pagy/toolbox/helpers/support/wrap_input_nav_js.rb +1 -3
  61. data/lib/pagy/toolbox/helpers/support/wrap_series_nav.rb +1 -4
  62. data/lib/pagy/toolbox/helpers/support/wrap_series_nav_js.rb +4 -9
  63. data/lib/pagy/toolbox/helpers/urls_hash.rb +0 -1
  64. data/lib/pagy/toolbox/paginators/calendar.rb +1 -1
  65. data/lib/pagy/toolbox/paginators/countish.rb +0 -1
  66. data/lib/pagy/toolbox/paginators/countless.rb +0 -1
  67. data/lib/pagy/toolbox/paginators/elasticsearch_rails.rb +2 -3
  68. data/lib/pagy/toolbox/paginators/keynav_js.rb +0 -2
  69. data/lib/pagy/toolbox/paginators/keyset.rb +0 -1
  70. data/lib/pagy/toolbox/paginators/meilisearch.rb +0 -1
  71. data/lib/pagy/toolbox/paginators/method.rb +1 -1
  72. data/lib/pagy/toolbox/paginators/offset.rb +0 -1
  73. data/lib/pagy/toolbox/paginators/searchkick.rb +0 -1
  74. data/lib/pagy/toolbox/paginators/typesense_rails.rb +0 -1
  75. data/lib/pagy.rb +15 -16
  76. data/locales/hu.yml +24 -0
  77. metadata +6 -4
  78. data/sig/pagy.rbs +0 -315
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7382e1de541c177055f5a1a3d8a4bee843126ecaef99d3d27f31fbc93b032907
4
- data.tar.gz: 992026f46faff00cc9a3d1a415f19e34346c51ae2e99205aebf6f3c7a98af611
3
+ metadata.gz: 1c35aeaffd607e32783708abcf17acfb4f445c3f3bb1299659de9c88282a3820
4
+ data.tar.gz: 670bb45f33ee616706aef872399848484fd989a0eac6b00de3d9af81e5ee9229
5
5
  SHA512:
6
- metadata.gz: eb112b40e74119be57cef404a219c1df3405194c1363d898f2a09c51a5838c29fb3469529cc4148726f9510847c1e52646c92573e5d2e757c202be21069df103
7
- data.tar.gz: 71c026906a31430a71ce54886903578a153236bb4fd42c8450bc02234dcccfb5066f955c9b78eef2c9f154b935000b79728e42edf3612b2ac4c58dd4294fc19b
6
+ metadata.gz: 12c184d91b6a3c17b946de268496920dc807523bde1ee2b945609782b8225638df072f15f08a3bd0f0524b077bfebd629eab53defd5ac4039d978df90000d94b
7
+ data.tar.gz: 8335bdb94801319e03c8d83729b3a240df64942b28d2968dbbb71dfe1a2ea48fe733aab47acf7b1a0897f8e8d0614386c3a562bcd70e5ca558a6333de5d910d6
data/apps/calendar.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.3'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
data/apps/demo.ru CHANGED
@@ -19,7 +19,7 @@
19
19
  # URL
20
20
  # http://127.0.0.1:8000
21
21
 
22
- VERSION = '43.4.4'
22
+ VERSION = '43.5.3'
23
23
 
24
24
  if VERSION != Pagy::VERSION
25
25
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -46,7 +46,7 @@ SECTIONS = { pagy: { css_anchor: 'pagy-css' },
46
46
  require 'sinatra/base'
47
47
 
48
48
  # Pagy init
49
- Pagy::OPTIONS[:client_max_limit] = 100
49
+ Pagy::OPTIONS[:max_limit] = 100
50
50
 
51
51
  # Sinatra application
52
52
  class PagyDemo < Sinatra::Base
@@ -16,16 +16,18 @@
16
16
  # config/routes.rb (example)
17
17
  # get '/comments(/:page)', to: 'comments#index'
18
18
 
19
-
20
- # Use plain Strings tokens instead of Pagy::EscapedValue strings
21
- Pagy.send(:remove_const, :PAGE_TOKEN) ; Pagy::PAGE_TOKEN = '___PAGY_PAGE___'
22
- Pagy.send(:remove_const, :LIMIT_TOKEN) ; Pagy::LIMIT_TOKEN = '___PAGY_LIMIT___'
23
-
24
19
  # Require the pagy sources to override
25
20
  require_relative '../lib/pagy/toolbox/paginators/method'
26
21
  require_relative '../lib/pagy/modules/abilities/linkable'
27
22
 
28
23
  class Pagy
24
+ # Use plain Strings tokens instead of Pagy::EscapedValue strings
25
+ remove_const(:PAGE_TOKEN)
26
+ PAGE_TOKEN = '___PAGY_PAGE___'
27
+
28
+ remove_const(:LIMIT_TOKEN)
29
+ LIMIT_TOKEN = '___PAGY_LIMIT___'
30
+
29
31
  # Switch to the `request.params` to get access to rails-added path parameters
30
32
  module RequestOverride
31
33
  def get_params(request)
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.3'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
data/apps/keynav.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.3'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -53,9 +53,9 @@ class PagyKeynav < Sinatra::Base
53
53
  Time.zone = 'UTC'
54
54
 
55
55
  @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }.freeze
56
- @pagy, @pets = pagy(:keynav_js, Pet.order(@order), limit: 4, client_max_limit: 100)
56
+ @pagy, @pets = pagy(:keynav_js, Pet.order(@order), limit: 4, max_limit: 100)
57
57
  # Support also root_key for replacing url in javascript
58
- # @pagy, @pets = pagy(:keynav_js, Pet.order(@order), limit: 4, client_max_limit: 100, root_key: 'animal')
58
+ # @pagy, @pets = pagy(:keynav_js, Pet.order(@order), limit: 4, max_limit: 100, root_key: 'animal')
59
59
  @ids = @pets.pluck(:id)
60
60
  erb :main
61
61
  end
data/apps/keyset.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.3'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -43,10 +43,10 @@ class PagyKeyset < Sinatra::Base
43
43
  Time.zone = 'UTC'
44
44
 
45
45
  @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }.freeze
46
- @pagy, @pets = pagy(:keyset, Pet.order(@order), limit: 10, client_max_limit: 100)
46
+ @pagy, @pets = pagy(:keyset, Pet.order(@order), limit: 10, max_limit: 100)
47
47
  # @pagy, @pets = pagy(:keyset, Pet.order(@order),
48
48
  # jsonapi: true, page_key: 'number', limit_key: 'size', # very customized jsonapi
49
- # limit: 10, client_max_limit: 100)
49
+ # limit: 10, max_limit: 100)
50
50
  # response.headers.merge!(@pagy.headers_hash)
51
51
  erb :main
52
52
  end
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.3'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -43,7 +43,7 @@ class PagyKeysetSequel < Sinatra::Base
43
43
  get '/' do
44
44
  @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }.freeze
45
45
  @pagy, @pets = pagy(:keyset, Pet.order(:animal, :name, Sequel.desc(:birthdate), :id),
46
- limit: 10, client_max_limit: 100)
46
+ limit: 10, max_limit: 100)
47
47
  erb :main
48
48
  end
49
49
 
data/apps/rails.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.3'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -102,7 +102,7 @@ class CommentsController < ActionController::Base # :nodoc:
102
102
  include Pagy::Method
103
103
 
104
104
  def index
105
- @pagy, @comments = pagy(:offset, Comment.all, limit: 10, client_max_limit: 100)
105
+ @pagy, @comments = pagy(:offset, Comment.all, limit: 10, max_limit: 100)
106
106
  # Reload the page in the network tab of the Chrome Inspector to check
107
107
  # response.headers.merge!(@pagy.headers_hash)
108
108
  render inline: TEMPLATE
data/apps/repro.ru CHANGED
@@ -16,7 +16,7 @@
16
16
  # URL
17
17
  # http://127.0.0.1:8000
18
18
 
19
- VERSION = '43.4.4'
19
+ VERSION = '43.5.3'
20
20
 
21
21
  if VERSION != Pagy::VERSION
22
22
  Warning.warn("\n>>> WARNING! '#{File.basename(__FILE__)}-#{VERSION}' running with 'pagy-#{Pagy::VERSION}'! <<< \n\n")
@@ -34,7 +34,7 @@ end
34
34
 
35
35
  # Edit this section adding the legacy as needed
36
36
  # Pagy initializer
37
- Pagy::OPTIONS[:client_max_limit] = 100
37
+ Pagy::OPTIONS[:max_limit] = 100
38
38
 
39
39
  # Sinatra setup
40
40
  require 'sinatra/base'
@@ -56,7 +56,7 @@ class PagyRepro < Sinatra::Base
56
56
  get '/' do
57
57
  collection = MockCollection.new
58
58
  @pagy, @records = pagy(collection) # simplest form
59
- # @pagy, @records = pagy(:offset, collection, limit: 7, client_max_limit: 30)
59
+ # @pagy, @records = pagy(:offset, collection, limit: 7, max_limit: 30)
60
60
  # @pagy, @records = pagy(:countish, collection, ttl: 20)
61
61
  # @pagy, @records = pagy(:countless, collection)
62
62
  # @pagy, @records = pagy(Array(1..1000))
data/config/pagy.rb CHANGED
@@ -1,55 +1,46 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Pagy initializer file (43.4.4)
3
+ # Pagy initializer file (43.5.3)
4
4
  # See https://ddnexus.github.io/pagy/toolbox/configuration/initializer/
5
5
 
6
6
 
7
7
  ############ Global Options ################################################################
8
8
  # See https://ddnexus.github.io/pagy/toolbox/configuration/options/ for details.
9
- # Add your global options below. They will be applied globally.
10
- # For example:
9
+ # Examples:
11
10
  #
12
- # Pagy::OPTIONS[:limit] = 10 # Limit the items per page
13
- # Pagy::OPTIONS[:client_max_limit] = 100 # The client is allowed to request a limit up to 100
14
- # Pagy::OPTIONS[:jsonapi] = true # Use JSON:API compliant URLs
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
15
14
 
16
15
  Pagy::OPTIONS.freeze
17
16
 
18
-
19
17
  ############ JS and CSS Resources ##########################################################
20
18
  # See https://ddnexus.github.io/pagy/resources/javascript/
21
- # and https://ddnexus.github.io/pagy/resources/stylesheets/ for more resources and details.
22
- # Copy and keep the resource files synced in the app. For example:
19
+ # and https://ddnexus.github.io/pagy/resources/stylesheets/ for details.
20
+ # Sync example:
23
21
  #
24
22
  # if Rails.env.development?
25
23
  # Pagy.sync(:javascript, Rails.root.join('app/javascript'), 'pagy.mjs')
26
24
  # Pagy.sync(:stylesheet, Rails.root.join('app/stylesheets'), 'pagy.css')
27
25
  # end
28
26
  #
29
- # As an alternative, use this config ONLY for apps with an asset pipeline
27
+ # Pipeline example:
30
28
  #
31
29
  # Rails.application.config.assets.paths << Pagy::ROOT.join(':javascripts')
32
30
  # Rails.application.config.assets.paths << Pagy::ROOT.join(':stylesheets')
33
31
 
34
-
35
32
  ############# Overriding Pagy::I18n Lookup #################################################
36
- # Refer to https://ddnexus.github.io/pagy/resources/i18n/ for details.
37
- # Override the I18n lookup by dropping your custom dictionary in some pagy dir.
33
+ # See https://ddnexus.github.io/pagy/resources/i18n/ for details.
38
34
  # Example for Rails:
39
35
  #
40
36
  # Pagy::I18n.pathnames << Rails.root.join('config/locales/pagy')
41
37
 
42
-
43
38
  ############# I18n Gem Translation #########################################################
44
39
  # See https://ddnexus.github.io/pagy/resources/i18n/ for details.
45
40
  #
46
41
  # Pagy.translate_with_the_slower_i18n_gem!
47
42
 
48
-
49
43
  ############# Calendar Localization for non-en locales ####################################
50
44
  # See https://ddnexus.github.io/pagy/toolbox/paginators/calendar#localization for details.
51
- # Add your desired locales to the list and uncomment the following line to enable them,
52
- # regardless of whether you use the I18n gem for translations or not, whether with
53
- # Rails or not.
54
45
  #
55
46
  # Pagy::Calendar.localize_with_rails_i18n_gem(*your_locales)
data/javascripts/pagy.js CHANGED
@@ -19,20 +19,26 @@ var pagy_default = (() => {
19
19
  }
20
20
  });
21
21
  }
22
- const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => {
23
- e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.render());
24
- }));
22
+ const rjsObserver = new ResizeObserver((entries) => {
23
+ entries.forEach((e) => {
24
+ e.target.querySelectorAll(".series-nav-js").forEach((el) => {
25
+ el.render();
26
+ });
27
+ });
28
+ });
25
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)));
26
30
  const randKey = () => Math.floor(Math.random() * 36 ** 3).toString(36);
27
31
  const augmentKeynav = async (nav, [storageKey, rootKey, pageKey, last, spliceArgs]) => {
28
32
  let augmentPage;
29
33
  const browserKey = document.cookie.split(/;\s+/).find((row) => row.startsWith(pagy + "="))?.split("=")[1] ?? randKey();
30
- document.cookie = pagy + "=" + browserKey;
34
+ document.cookie = `${pagy}=${browserKey}`;
31
35
  if (storageKey && !(storageKey in storage)) {
32
36
  sync.postMessage({ from: tabId, key: storageKey });
33
- await new Promise((resolve) => setTimeout(() => resolve(""), 100));
37
+ await new Promise((resolve) => setTimeout(() => {
38
+ resolve("");
39
+ }, 100));
34
40
  if (!(storageKey in storage)) {
35
- augmentPage = (page) => page + "+" + last;
41
+ augmentPage = (page) => `${page}+${String(last)}`;
36
42
  }
37
43
  }
38
44
  if (!augmentPage) {
@@ -61,7 +67,7 @@ var pagy_default = (() => {
61
67
  const search = rootKey ? `${rootKey}%5B${pageKey}%5D` : pageKey;
62
68
  const re = new RegExp(`(?<=\\?.*)(\\b${search}=)(\\d+)`);
63
69
  for (const a of nav.querySelectorAll("a[href]")) {
64
- a.href = a.href.replace(re, (_match, prefix, digit) => `${prefix}${augmentPage(digit)}`);
70
+ a.href = a.href.replace(re, (_match, prefix, digit) => `${String(prefix)}${augmentPage(digit)}`);
65
71
  }
66
72
  return augmentPage;
67
73
  };
@@ -71,16 +77,16 @@ var pagy_default = (() => {
71
77
  [widths, series, labels],
72
78
  keynavArgs
73
79
  ]) => {
74
- const parent = nav.parentElement;
75
80
  let lastWidth = -1;
76
- (nav.render = () => {
81
+ const parent = nav.parentElement;
82
+ nav.render = () => {
77
83
  const index = widths.findIndex((w) => w < parent.clientWidth);
78
- if (widths[index] === lastWidth) {
84
+ if (index === -1 || widths[index] === lastWidth) {
79
85
  return;
80
86
  }
81
87
  let html = before;
82
88
  series[index].forEach((item, i) => {
83
- html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? item + "<");
89
+ html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? `${String(item)}<`);
84
90
  });
85
91
  html += after;
86
92
  nav.innerHTML = "";
@@ -89,10 +95,8 @@ var pagy_default = (() => {
89
95
  if (keynavArgs && storageSupport) {
90
96
  augmentKeynav(nav, keynavArgs);
91
97
  }
92
- })();
93
- if (nav.classList.contains(pagy + "-rjs")) {
94
- rjsObserver.observe(parent);
95
- }
98
+ };
99
+ rjsObserver.observe(parent);
96
100
  };
97
101
  const initInputNavJs = async (nav, [url_token, pageToken, keynavArgs]) => {
98
102
  const augment = keynavArgs && storageSupport ? await augmentKeynav(nav, keynavArgs) : (page) => page;
@@ -120,7 +124,9 @@ var pagy_default = (() => {
120
124
  link.href = getUrl(input.value);
121
125
  link.click();
122
126
  };
123
- input.addEventListener("focus", () => input.select());
127
+ input.addEventListener("focus", () => {
128
+ input.select();
129
+ });
124
130
  input.addEventListener("focusout", action);
125
131
  input.addEventListener("keypress", (e) => {
126
132
  if (e.key == "Enter") {
@@ -129,7 +135,7 @@ var pagy_default = (() => {
129
135
  });
130
136
  };
131
137
  return {
132
- version: "43.4.4",
138
+ version: "43.5.3",
133
139
  init(arg) {
134
140
  const target = arg instanceof HTMLElement ? arg : document, elements = target.querySelectorAll("[data-pagy]");
135
141
  for (const element of elements) {
@@ -156,5 +162,5 @@ var pagy_default = (() => {
156
162
  // pagy-shim.ts
157
163
  window.Pagy = pagy_default;
158
164
 
159
- //# debugId=6725138D5BA01DF464756E2164756E21
160
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFneS50cyIsICJwYWd5LXNoaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW50ZXJmYWNlIFN5bmNEYXRhIHtcbiAgZnJvbT86IG51bWJlclxuICB0bz86ICAgbnVtYmVyXG4gIGtleTogICBzdHJpbmdcbiAgc3RyPzogIHN0cmluZ1xufVxudHlwZSBJbml0QXJncyA9IFtcImtcIiwgIEtleW5hdkFyZ3NdIHwgICAgICAgICAgLy8gc2VyaWVzX25hdltfanNdIHdpdGgga2V5bmF2IGluc3RhbmNlXG4gICAgICAgICAgICAgICAgW1wic25qXCIsIFNlcmllc05hdkpzQXJnc10gfCAgICAvLyBzZXJpZXNfbmF2X2pzXG4gICAgICAgICAgICAgICAgW1wiaW5qXCIsIElucHV0TmF2SnNBcmdzXSB8ICAgICAvLyBpbnB1dF9uYXZfanNcbiAgICAgICAgICAgICAgICBbXCJsdGpcIiwgTGltaXRUYWdKc0FyZ3NdICAgICAgIC8vIGxpbWl0X3RhZ19qc1xudHlwZSBBdWdtZW50S2V5bmF2ID0gKG5hdjpIVE1MRWxlbWVudCwga2V5bmF2QXJnczpLZXluYXZBcmdzKSA9PiBQcm9taXNlPCgocGFnZTogc3RyaW5nKSA9PiBzdHJpbmcpPlxudHlwZSBLZXluYXZBcmdzID0gcmVhZG9ubHkgW3N0b3JhZ2VLZXk6ICBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RLZXk6ICAgICBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VLZXk6ICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDogICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VBcmdzPzogU3BsaWNlQXJnc11cbnR5cGUgU3BsaWNlQXJncyA9IHJlYWRvbmx5IFtzdGFydDogICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiBudW1iZXIsICAgICAvLyBpdCB3b3VsZCBiZSBvcHRpb25hbCwgYnV0IHRzIGNvbXBsYWluc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW1zOiAgICBDdXRvZmZbXV1cbnR5cGUgQ3V0b2ZmID0gcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW11cbnR5cGUgQXVnbWVudGVkUGFnZSA9IFticm93c2VySWQ6ICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXk6ICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcjogIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlczogICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgIHByaW9yQ3V0b2ZmOiBDdXRvZmYgfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VDdXRvZmY6ICBDdXRvZmYgfCBudWxsXVxudHlwZSBTZXJpZXNOYXZKc0FyZ3MgPSByZWFkb25seSBbTmF2SnNUb2tlbnMsIHBhZ2VUb2tlbjogc3RyaW5nLCBOYXZKc1NlcmllcywgS2V5bmF2QXJncz9dXG50eXBlIE5hdkpzU2VyaWVzID0gcmVhZG9ubHkgW3dpZHRoczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogKHN0cmluZyB8IG51bWJlcilbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IHN0cmluZ1tdW10gfCBudWxsXVxudHlwZSBJbnB1dE5hdkpzQXJncyA9IHJlYWRvbmx5IFt1cmxUb2tlbjogIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRva2VuOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleW5hdkFyZ3M/XVxudHlwZSBMaW1pdFRhZ0pzQXJncyA9IHJlYWRvbmx5IFtmcm9tOiAgICAgICBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFRva2VuOiAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRva2VuOiAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdFRva2VuOiBzdHJpbmddXG50eXBlIE5hdkpzVG9rZW5zID0gcmVhZG9ubHkgW2JlZm9yZTogIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yOiAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcDogICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6ICAgc3RyaW5nXVxuaW50ZXJmYWNlIE5hdkpzRWxlbWVudCBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgcmVuZGVyKCk6IHZvaWRcbn1cblxuLy8gVGhlIHN5bnRheCB1c2VkIGluIHRoaXMgZmlsZSBoYXMgYmVlbiBjYXJlZnVsbHkgY29tcG9zZWQgdG8gbWluaW1pemVcbi8vIHRoZSBwYWd5Lm1pbi5qcyBzaXplIGFuZCBhdm9pZCBwb2xsdXRpb24gaW4gdGhlIHdpbmRvdyBvYmplY3RcbmV4cG9ydCBkZWZhdWx0ICgoKSA9PiB7XG4gIGNvbnN0IHN0b3JhZ2VTdXBwb3J0ID0gJ3Nlc3Npb25TdG9yYWdlJyBpbiB3aW5kb3cgJiYgJ0Jyb2FkY2FzdENoYW5uZWwnIGluIHdpbmRvdztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQgcGFneSA9IFwicGFneVwiLCBzdG9yYWdlOiBTdG9yYWdlLCBzeW5jOiBCcm9hZGNhc3RDaGFubmVsLCB0YWJJZDogbnVtYmVyO1xuICBpZiAoc3RvcmFnZVN1cHBvcnQpIHtcbiAgICBzdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2U7IC8vIHNob3J0ZW4gdGhlIGNvbXBpbGVkIHNpemVcbiAgICBzeW5jICAgID0gbmV3IEJyb2FkY2FzdENoYW5uZWwocGFneSk7XG4gICAgdGFiSWQgICA9IERhdGUubm93KCk7XG4gICAgLy8gU3luYyB0aGUgc2Vzc2lvblN0b3JhZ2Uga2V5cyBmb3IgdGhlIGN1dG9mZnMgb3BlbmVkIGluIGEgbmV3IHRhYi93aW5kb3dcbiAgICBzeW5jLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChlOk1lc3NhZ2VFdmVudDxTeW5jRGF0YT4pID0+IHtcbiAgICAgIGlmIChlLmRhdGEuZnJvbSkgeyAvLyByZXF1ZXN0IGN1dG9mZnNcbiAgICAgICAgY29uc3QgY3V0b2ZmcyA9IHN0b3JhZ2UuZ2V0SXRlbShlLmRhdGEua2V5KTtcbiAgICAgICAgaWYgKGN1dG9mZnMpIHtcbiAgICAgICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57dG86IGUuZGF0YS5mcm9tLCBrZXk6IGUuZGF0YS5rZXksIHN0cjogY3V0b2Zmc30pO1xuICAgICAgICB9IC8vIHNlbmQgcmVzcG9uc2VcbiAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLnRvKSB7ICAvLyByZWNlaXZlIGN1dG9mZnNcbiAgICAgICAgaWYgKGUuZGF0YS50byA9PSB0YWJJZCkge1xuICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShlLmRhdGEua2V5LCA8c3RyaW5nPmUuZGF0YS5zdHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gVGhlIG9ic2VydmVyIGluc3RhbmNlIGZvciByZXNwb25zaXZlIG5hdnNcbiAgY29uc3QgcmpzT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoXG4gICAgICBlbnRyaWVzID0+IGVudHJpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvckFsbDxOYXZKc0VsZW1lbnQ+KFwiLnBhZ3ktcmpzXCIpLmZvckVhY2goZWwgPT4gZWwucmVuZGVyKCkpO1xuICAgICAgfSkpO1xuXG4gIC8qIEZ1bGwgc2V0IG9mIEI2NCBmdW5jdGlvbnNcbiAgY29uc3QgQjY0RW5jb2RlICAgICA9ICh1bmljb2RlOnN0cmluZykgPT4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh1bmljb2RlKSkpLFxuICAgICAgICBCNjRTYWZlICAgICAgID0gKHVuc2FmZTpzdHJpbmcpICA9PiB1bnNhZmUucmVwbGFjZSgvWysvPV0vZywgKG0pID0+IG0gPT0gXCIrXCIgPyBcIi1cIiA6IG0gPT0gXCIvXCIgPyBcIl9cIiA6IFwiXCIpLFxuICAgICAgICBCNjRTYWZlRW5jb2RlID0gKHVuaWNvZGU6c3RyaW5nKSA9PiBCNjRTYWZlKEI2NEVuY29kZSh1bmljb2RlKSksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSksXG4gICAgICAgIEI2NFVuc2FmZSAgICAgPSAoc2FmZTpzdHJpbmcpICAgID0+IHNhZmUucmVwbGFjZSgvWy1fXS9nLCAobWF0Y2gpID0+IG1hdGNoID09IFwiLVwiID8gXCIrXCIgOiBcIi9cIiksXG4gICAgICAgIEI2NFNhZmVEZWNvZGUgPSAoYmFzZTY0OnN0cmluZykgID0+IEI2NERlY29kZShCNjRVbnNhZmUoYmFzZTY0KSlcbiAgKi9cbiAgY29uc3QgQjY0U2FmZUVuY29kZSA9ICh1bmljb2RlOnN0cmluZykgPT4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh1bmljb2RlKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bKy89XS9nLCAobSkgPT4gbSA9PSBcIitcIiA/IFwiLVwiIDogbSA9PSBcIi9cIiA/IFwiX1wiIDogXCJcIiksXG4gICAgICAgIEI2NERlY29kZSAgICAgPSAoYmFzZTY0OnN0cmluZykgID0+IChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIGMgPT4gYy5jaGFyQ29kZUF0KDApKSk7XG5cbiAgLy8gUmV0dXJuIGEgcmFuZG9tIGtleTogMyBjaGFycyBtYXgsIGJhc2UtMzYgbnVtYmVyIDwgMzYqKjNcbiAgY29uc3QgcmFuZEtleSA9ICgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDM2ICoqIDMpLnRvU3RyaW5nKDM2KTtcblxuICAvLyBNYW5hZ2UgdGhlIHBhZ2UgYXVnbWVudGF0aW9uIGZvciBLZXluYXYsIGNhbGxlZCBvbmx5IGlmIHN0b3JhZ2VTdXBwb3J0XG4gIGNvbnN0IGF1Z21lbnRLZXluYXY6IEF1Z21lbnRLZXluYXYgPSBhc3luYyAobmF2LCBbc3RvcmFnZUtleSwgcm9vdEtleSwgcGFnZUtleSwgbGFzdCwgc3BsaWNlQXJnc10pID0+IHtcbiAgICBsZXQgYXVnbWVudFBhZ2U6KHBhZ2U6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIGNvbnN0IGJyb3dzZXJLZXkgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoLztcXHMrLykgIC8vIGl0IHdvcmtzIGV2ZW4gaWYgbWFsZm9ybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKHJvdykgPT4gcm93LnN0YXJ0c1dpdGgocGFneSArIFwiPVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LnNwbGl0KFwiPVwiKVsxXSA/PyByYW5kS2V5KCk7XG4gICAgZG9jdW1lbnQuY29va2llID0gcGFneSArIFwiPVwiICsgYnJvd3NlcktleTsgIC8vIFNtYWxsZXIgLm1pbiBzaXplOiBzZXQgdGhlIGNvb2tpZSB3aXRob3V0IGNoZWNraW5nXG4gICAgaWYgKHN0b3JhZ2VLZXkgJiYgIShzdG9yYWdlS2V5IGluIHN0b3JhZ2UpKSB7XG4gICAgICAvLyBTeW5jIHRoZSBzZXNzaW9uZ1N0b3JhZ2UgZnJvbSBvdGhlciB0YWJzL3dpbmRvd3MgKGUuZy4sIG9wZW4gcGFnZSBpbiB0aGUgbmV3IHRhYi93aW5kb3cpXG4gICAgICBzeW5jLnBvc3RNZXNzYWdlKDxTeW5jRGF0YT57IGZyb206IHRhYklkLCBrZXk6IHN0b3JhZ2VLZXkgfSk7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgbGlzdGVuZXIgdG8gY29weSB0aGUgY3V0b2ZmcyBpbiB0aGUgY3VycmVudCBzZXNzaW9uU3RvcmFnZVxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nfG51bGw+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoXCJcIiksIDEwMCkpO1xuICAgICAgaWYgKCEoc3RvcmFnZUtleSBpbiBzdG9yYWdlKSkgeyAvLyB0aGUgc3RvcmFnZUtleSBkaWRuJ3QgZ2V0IGNvcGllZDogZmFsbGJhY2sgdG8gY291bnRsZXNzIHBhZ2luYXRpb25cbiAgICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTogc3RyaW5nKSA9PiBwYWdlICsgJysnICsgbGFzdDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJZiBpdCBpcyBub3QgYXNzaWduZWQgaXQgbWVhbnMgaXQgc3VwcG9ydHMga2V5bmF2XG4gICAgaWYgKCFhdWdtZW50UGFnZSkgeyAvLyByZWd1bGFyIGtleW5hdiBwYWdpbmF0aW9uXG4gICAgICBpZiAoIXN0b3JhZ2VLZXkpIHsgZG8geyBzdG9yYWdlS2V5ID0gcmFuZEtleSgpIH0gd2hpbGUgKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkgfSAvLyBubyBkdXAga2V5c1xuICAgICAgY29uc3QgZGF0YSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KSxcbiAgICAgICAgICBjdXRvZmZzID0gPEN1dG9mZltdPihkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IFt1bmRlZmluZWRdKTtcbiAgICAgIGlmIChzcGxpY2VBcmdzKSB7XG4gICAgICAgIGN1dG9mZnMuc3BsaWNlKC4uLnNwbGljZUFyZ3MpO1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoY3V0b2ZmcykpO1xuICAgICAgfVxuICAgICAgLy8gQXVnbWVudCBmdW5jdGlvblxuICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTpzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZU51bSA9IHBhcnNlSW50KHBhZ2UpO1xuICAgICAgICByZXR1cm4gQjY0U2FmZUVuY29kZShKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIDxBdWdtZW50ZWRQYWdlPlticm93c2VyS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZzLmxlbmd0aCwgICAgICAgLy8gcGFnZXMvbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bSAtIDFdLCAvLyBwcmlvckN1dG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnNbcGFnZU51bV1dKSk7ICAvLyBwYWdlQ3V0b2ZmXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSAocm9vdEtleSkgPyBgJHtyb290S2V5fSU1QiR7cGFnZUtleX0lNURgIDogcGFnZUtleTtcbiAgICBjb25zdCByZSAgICAgPSBuZXcgUmVnRXhwKGAoPzw9XFxcXD8uKikoXFxcXGIke3NlYXJjaH09KShcXFxcZCspYCk7XG4gICAgLy8gQXVnbWVudCB0aGUgcGFnZSBwYXJhbSBvZiBlYWNoIGhyZWZcbiAgICBmb3IgKGNvbnN0IGEgb2YgPE5vZGVMaXN0T2Y8SFRNTEFuY2hvckVsZW1lbnQ+Pjx1bmtub3duPm5hdi5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykpIHtcbiAgICAgIGEuaHJlZiA9IGEuaHJlZi5yZXBsYWNlKHJlLCAoX21hdGNoLCBwcmVmaXgsIGRpZ2l0KTogc3RyaW5nID0+IGAke3ByZWZpeH0ke2F1Z21lbnRQYWdlKDxzdHJpbmc+ZGlnaXQpfWApO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGF1Z21lbnQgZnVuY3Rpb24gZm9yIGZ1cnRoZXIgYXVnbWVudGF0aW9uIChpLmUuLCB1cmwgdG9rZW4gaW4gaW5wdXRfbmF2X2pzKVxuICAgIHJldHVybiBhdWdtZW50UGFnZTtcbiAgfTtcblxuICAvLyBCdWlsZCB0aGUgc2VyaWVzX25hdl9qcyBoZWxwZXJcbiAgY29uc3QgYnVpbGROYXZKcyA9IChuYXY6TmF2SnNFbGVtZW50LCBbW2JlZm9yZSwgYW5jaG9yLCBjdXJyZW50LCBnYXAsIGFmdGVyXSwgcGFnZVRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3aWR0aHMsIHNlcmllcywgbGFiZWxzXSwga2V5bmF2QXJnc106U2VyaWVzTmF2SnNBcmdzKSA9PiB7XG4gICAgY29uc3QgIHBhcmVudCA9IDxIVE1MRWxlbWVudD5uYXYucGFyZW50RWxlbWVudDtcbiAgICBsZXQgbGFzdFdpZHRoID0gLTE7XG4gICAgKG5hdi5yZW5kZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHdpZHRocy5maW5kSW5kZXgodyA9PiB3IDwgcGFyZW50LmNsaWVudFdpZHRoKTtcbiAgICAgIGlmICh3aWR0aHNbaW5kZXhdID09PSBsYXN0V2lkdGgpIHsgcmV0dXJuIH0gLy8gbm8gY2hhbmdlOiBhYm9ydFxuXG4gICAgICBsZXQgaHRtbCA9IGJlZm9yZTtcbiAgICAgIHNlcmllc1tpbmRleF0uZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAvLyBBdm9pZCB0aGUgaWYgYmxvY2tzIGFuZCBjaGFpbiB0aGUgcmVzdWx0cyAoc2hvcnRlciBwYWd5Lm1pbi5qcyBhbmQgZWFzaWVyIHJlYWRpbmcpXG4gICAgICAgIGh0bWwgKz0gaXRlbSA9PSBcImdhcFwiID8gZ2FwIDpcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSBpdGVtIG1heSBiZSBhIG51bWJlciwgYnV0IHRoZSAncmVwbGFjZScgY29udmVydHMgaXQgdG8gc3RyaW5nIChzaG9ydGVyIHBhZ3kubWluLmpzKVxuICAgICAgICAgICAgICAgICh0eXBlb2YgaXRlbSA9PSBcIm51bWJlclwiID8gYW5jaG9yLnJlcGxhY2UocGFnZVRva2VuLCBpdGVtKSA6IGN1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiTDxcIiwgbGFiZWxzPy5baW5kZXhdW2ldID8/IGl0ZW0gKyBcIjxcIik7XG4gICAgICB9KTtcbiAgICAgIGh0bWwgICAgICAgICArPSBhZnRlcjtcbiAgICAgIG5hdi5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgbmF2Lmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIiwgaHRtbCk7XG4gICAgICBsYXN0V2lkdGggPSB3aWR0aHNbaW5kZXhdO1xuICAgICAgaWYgKGtleW5hdkFyZ3MgJiYgc3RvcmFnZVN1cHBvcnQpIHsgdm9pZCBhdWdtZW50S2V5bmF2KG5hdiwga2V5bmF2QXJncykgfVxuICAgIH0pKCk7XG4gICAgaWYgKG5hdi5jbGFzc0xpc3QuY29udGFpbnMocGFneSArIFwiLXJqc1wiKSkgeyByanNPYnNlcnZlci5vYnNlcnZlKHBhcmVudCkgfVxuICB9O1xuXG4gIC8vIEluaXQgdGhlIGlucHV0X25hdl9qcyBoZWxwZXJzXG4gIGNvbnN0IGluaXRJbnB1dE5hdkpzID0gYXN5bmMgKG5hdjpIVE1MRWxlbWVudCwgW3VybF90b2tlbiwgcGFnZVRva2VuLCBrZXluYXZBcmdzXTpJbnB1dE5hdkpzQXJncykgPT4ge1xuICAgIGNvbnN0IGF1Z21lbnQgPSBrZXluYXZBcmdzICYmIHN0b3JhZ2VTdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgID8gYXdhaXQgYXVnbWVudEtleW5hdihuYXYsIGtleW5hdkFyZ3MpXG4gICAgICAgICAgICAgICAgICAgIDogKHBhZ2U6IHN0cmluZykgPT4gcGFnZTtcbiAgICBpbml0SW5wdXQobmF2LCBpbnB1dFZhbHVlID0+IHVybF90b2tlbi5yZXBsYWNlKHBhZ2VUb2tlbiwgYXVnbWVudChpbnB1dFZhbHVlKSkpO1xuICB9O1xuXG4gIC8vIEluaXQgdGhlIGxpbWl0X3RhZ19qcyBoZWxwZXJcbiAgY29uc3QgaW5pdExpbWl0VGFnSnMgPSAoc3BhbjpIVE1MU3BhbkVsZW1lbnQsIFtmcm9tLCB1cmxfdG9rZW4sIHBhZ2VfdG9rZW4sIGxpbWl0VG9rZW5dOkxpbWl0VGFnSnNBcmdzKSA9PiB7XG4gICAgaW5pdElucHV0KHNwYW4sIGlucHV0VmFsdWUgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgcGFnZSBpcyBhIG51bWJlciwgYnV0IHRoZSAncmVwbGFjZScgY29udmVydHMgaXQgdG8gc3RyaW5nIChzaG9ydGVyIHBhZ3kubWluLmpzKVxuICAgICAgcmV0dXJuIHVybF90b2tlbi5yZXBsYWNlKHBhZ2VfdG9rZW4sIE1hdGgubWF4KE1hdGguY2VpbChmcm9tIC8gcGFyc2VJbnQoaW5wdXRWYWx1ZSkpLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShsaW1pdFRva2VuLCBpbnB1dFZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gIGNvbnN0IGluaXRJbnB1dCA9IChlbGVtZW50OkhUTUxFbGVtZW50LCBnZXRVcmw6KHY6c3RyaW5nKSA9PiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpbnB1dCAgID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIiksXG4gICAgICAgICAgbGluayAgICA9IDxIVE1MQW5jaG9yRWxlbWVudD5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgIGxldCAgIGluaXRpYWwgPSBpbnB1dC52YWx1ZTtcbiAgICBjb25zdCBhY3Rpb24gID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gaW5pdGlhbCkgeyByZXR1cm4gfSAgLy8gbm90IGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWluLCB2YWwsIG1heF0gPSBbaW5wdXQubWluLCBpbnB1dC52YWx1ZSwgaW5wdXQubWF4XS5tYXAobiA9PiBwYXJzZUludChuKSB8fCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gaW5pdGlhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gZ2V0VXJsKGlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsICgpID0+IGlucHV0LnNlbGVjdCgpKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PSBcIkVudGVyXCIpIHsgYWN0aW9uKCkgfSB9KTtcbiAgfTtcblxuICAvLyBQdWJsaWMgaW50ZXJmYWNlXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogXCI0My40LjRcIixcblxuICAgIC8vIFNjYW4gZm9yIGVsZW1lbnRzIHdpdGggYSBcImRhdGEtcGFneVwiIGF0dHJpYnV0ZSBhbmQgY2FsbCB0aGVpciBpbml0IGZ1bmN0aW9ucyB3aXRoIHRoZSBkZWNvZGVkIGFyZ3NcbiAgICBpbml0KGFyZz86SFRNTEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCAgID0gYXJnIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudCxcbiAgICAgICAgICAgIGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiA8Tm9kZUxpc3RPZjxIVE1MRWxlbWVudD4+ZWxlbWVudHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbaGVscGVySWQsIC4uLmFyZ3NdID0gPEluaXRBcmdzPkpTT04ucGFyc2UoQjY0RGVjb2RlKDxzdHJpbmc+ZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikpKTtcbiAgICAgICAgICBpZiAoaGVscGVySWQgPT0gXCJrXCIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc3ByZWFkIDIgYXJndW1lbnRzLCBub3QgMyBhcyBpdCBjb21wbGFpbnMgYWJvdXRcbiAgICAgICAgICAgIHZvaWQgYXVnbWVudEtleW5hdihlbGVtZW50LCAuLi48S2V5bmF2QXJncz48dW5rbm93bj5hcmdzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlcklkID09IFwic25qXCIpIHtcbiAgICAgICAgICAgIGJ1aWxkTmF2SnMoPE5hdkpzRWxlbWVudD5lbGVtZW50LCA8U2VyaWVzTmF2SnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGVscGVySWQgPT0gXCJpbmpcIikge1xuICAgICAgICAgICAgdm9pZCBpbml0SW5wdXROYXZKcyhlbGVtZW50LCA8SW5wdXROYXZKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWxwZXJJZCA9PSBcImx0alwiKSB7XG4gICAgICAgICAgICBpbml0TGltaXRUYWdKcyhlbGVtZW50LCA8TGltaXRUYWdKc0FyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVsc2UgeyBjb25zb2xlLndhcm4oXCJQYWd5LmluaXQ6ICVvXFxuVW5rbm93biBoZWxwZXJJZCAnJXMnXCIsIGVsZW1lbnQsIGhlbHBlcklkKSB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJQYWd5LmluaXQ6ICVvXFxuJXNcIiwgZWxlbWVudCwgZXJyKSB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufSkoKTtcbiIsCiAgICAiaW1wb3J0IFBhZ3kgZnJvbSBcIi4vcGFneS50c1wiXG53aW5kb3cuUGFneSA9IFBhZ3lcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFnREEsSUFBZ0Isc0JBQU07QUFBQSxFQUNwQixNQUFNLGlCQUFpQixvQkFBb0IsVUFBVSxzQkFBc0I7QUFBQSxFQUUzRSxJQUFJLE9BQU8sUUFBUSxTQUFrQixNQUF3QjtBQUFBLEVBQzdELElBQUksZ0JBQWdCO0FBQUEsSUFDbEIsVUFBVTtBQUFBLElBQ1YsT0FBVSxJQUFJLGlCQUFpQixJQUFJO0FBQUEsSUFDbkMsUUFBVSxLQUFLLElBQUk7QUFBQSxJQUVuQixLQUFLLGlCQUFpQixXQUFXLENBQUMsTUFBNkI7QUFBQSxNQUM3RCxJQUFJLEVBQUUsS0FBSyxNQUFNO0FBQUEsUUFDZixNQUFNLFVBQVUsUUFBUSxRQUFRLEVBQUUsS0FBSyxHQUFHO0FBQUEsUUFDMUMsSUFBSSxTQUFTO0FBQUEsVUFDWCxLQUFLLFlBQXNCLEVBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsS0FBSyxLQUFLLEtBQUssUUFBTyxDQUFDO0FBQUEsUUFDN0U7QUFBQSxNQUNGLEVBQU8sU0FBSSxFQUFFLEtBQUssSUFBSTtBQUFBLFFBQ3BCLElBQUksRUFBRSxLQUFLLE1BQU0sT0FBTztBQUFBLFVBQ3RCLFFB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QUNyQixNQUFNLFNBQVcsZUFBZSxjQUFjLE1BQU0sVUFDOUMsV0FBVyxPQUFPLGlCQUFpQixhQUFhO0FBQUEsTUFDdEQsV0FBVyxXQUFvQyxVQUFVO0FBQUEsUUFDdkQsSUFBSTtBQUFBLFVBQ0YsT0FBTyxhQUFhLFFBQWtCLEtBQUssTUFBTSxVQUFrQixRQUFRLGFBQWEsV0FBVyxDQUFDLENBQUM7QUFBQSxVQUNyRyxJQUFJLFlBQVksS0FBSztBQUFBLFlBRWQsY0FBYyxTQUFTLEdBQXdCLElBQUk7QUFBQSxVQUMxRCxFQUFPLFNBQUksWUFBWSxPQUFPO0FBQUEsWUFDNUIsV0FBeUIsU0FBbUMsSUFBSTtBQUFBLFVBQ2xFLEVBQU8sU0FBSSxZQUFZLE9BQU87QUFBQSxZQUN2QixlQUFlLFNBQWtDLElBQUk7QUFBQSxVQUM1RCxFQUFPLFNBQUksWUFBWSxPQUFPO0FBQUEsWUFDNUIsZUFBZSxTQUFrQyxJQUFJO0FBQUEsVUFDdkQ7QUFBQSxVQUVBLE9BQU8sS0FBSztBQUFBLFVBQUUsUUFBUSxLQUFLO0FBQUEsS0FBcUIsU0FBUyxHQUFHO0FBQUE7QUFBQSxNQUNoRTtBQUFBO0FBQUEsRUFFSjtBQUFBLEdBQ0M7OztBQ3BPSCxPQUFPLE9BQU87IiwKICAiZGVidWdJZCI6ICI2NzI1MTM4RDVCQTAxREY0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
165
+ //# debugId=C51CA3C3B35EC31364756E2164756E21
166
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFneS50cyIsICJwYWd5LXNoaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW50ZXJmYWNlIFN5bmNEYXRhIHtcbiAgZnJvbT86IG51bWJlclxuICB0bz8gIDogbnVtYmVyXG4gIGtleSAgOiBzdHJpbmdcbiAgc3RyPyA6IHN0cmluZ1xufVxudHlwZSBJbml0QXJncyA9IFtcImtcIiwgIEtleW5hdkFyZ3NdIHwgICAgICAgICAgLy8gc2VyaWVzX25hdltfanNdIHdpdGgga2V5bmF2IGluc3RhbmNlXG4gICAgICAgICAgICAgICAgW1wic25qXCIsIFNlcmllc05hdkpzQXJnc10gfCAgICAvLyBzZXJpZXNfbmF2X2pzXG4gICAgICAgICAgICAgICAgW1wiaW5qXCIsIElucHV0TmF2SnNBcmdzXSB8ICAgICAvLyBpbnB1dF9uYXZfanNcbiAgICAgICAgICAgICAgICBbXCJsdGpcIiwgTGltaXRUYWdKc0FyZ3NdOyAgICAgIC8vIGxpbWl0X3RhZ19qc1xudHlwZSBBdWdtZW50S2V5bmF2ID0gKG5hdjpIVE1MRWxlbWVudCwga2V5bmF2QXJnczpLZXluYXZBcmdzKSA9PiBQcm9taXNlPCgocGFnZTogc3RyaW5nKSA9PiBzdHJpbmcpPjtcbnR5cGUgS2V5bmF2QXJncyA9IHJlYWRvbmx5IFtzdG9yYWdlS2V5IDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290S2V5ICAgIDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlS2V5ICAgIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgICAgICAgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlQXJncz86IFNwbGljZUFyZ3NdO1xudHlwZSBTcGxpY2VBcmdzID0gcmVhZG9ubHkgW3N0YXJ0ICAgICAgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IG51bWJlciwgICAgIC8vIGl0IHdvdWxkIGJlIG9wdGlvbmFsLCBidXQgdHMgY29tcGxhaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXM6ICAgIEN1dG9mZltdXTtcbnR5cGUgQ3V0b2ZmID0gcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pW107XG50eXBlIEF1Z21lbnRlZFBhZ2UgPSBbYnJvd3NlcklkICA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlS2V5IDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZXMgICAgICA6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBwcmlvckN1dG9mZjogQ3V0b2ZmIHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlQ3V0b2ZmIDogQ3V0b2ZmIHwgbnVsbF07XG50eXBlIFNlcmllc05hdkpzQXJncyA9IHJlYWRvbmx5IFtOYXZKc1Rva2VucywgcGFnZVRva2VuOiBzdHJpbmcsIE5hdkpzU2VyaWVzLCBLZXluYXZBcmdzP107XG50eXBlIE5hdkpzU2VyaWVzID0gcmVhZG9ubHkgW3dpZHRoczogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllczogKHN0cmluZyB8IG51bWJlcilbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IHN0cmluZ1tdW10gfCBudWxsXTtcbnR5cGUgSW5wdXROYXZKc0FyZ3MgPSByZWFkb25seSBbdXJsVG9rZW46ICBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUb2tlbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXluYXZBcmdzP107XG50eXBlIExpbWl0VGFnSnNBcmdzID0gcmVhZG9ubHkgW2Zyb20gICAgICA6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsVG9rZW4gIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVG9rZW4gOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0VG9rZW46IHN0cmluZ107XG50eXBlIE5hdkpzVG9rZW5zID0gcmVhZG9ubHkgW2JlZm9yZSA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yIDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcCAgICA6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgIDogc3RyaW5nXTtcbmludGVyZmFjZSBOYXZKc0VsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIHJlbmRlcigpOiB2b2lkXG59XG5cbi8vIFRoZSBzeW50YXggdXNlZCBpbiB0aGlzIGZpbGUgaGFzIGJlZW4gY2FyZWZ1bGx5IGNvbXBvc2VkIHRvIG1pbmltaXplXG4vLyB0aGUgcGFneS5taW4uanMgc2l6ZSBhbmQgYXZvaWQgcG9sbHV0aW9uIGluIHRoZSB3aW5kb3cgb2JqZWN0LlxuZXhwb3J0IGRlZmF1bHQgKCgpID0+IHtcbiAgY29uc3Qgc3RvcmFnZVN1cHBvcnQgPSAnc2Vzc2lvblN0b3JhZ2UnIGluIHdpbmRvdyAmJiAnQnJvYWRjYXN0Q2hhbm5lbCcgaW4gd2luZG93O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCBwYWd5ID0gXCJwYWd5XCIsIHN0b3JhZ2U6IFN0b3JhZ2UsIHN5bmM6IEJyb2FkY2FzdENoYW5uZWwsIHRhYklkOiBudW1iZXI7XG4gIGlmIChzdG9yYWdlU3VwcG9ydCkge1xuICAgIHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZTsgLy8gc2hvcnRlbiB0aGUgY29tcGlsZWQgc2l6ZVxuICAgIHN5bmMgICAgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbChwYWd5KTtcbiAgICB0YWJJZCAgID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFN5bmMgdGhlIHNlc3Npb25TdG9yYWdlIGtleXMgZm9yIHRoZSBjdXRvZmZzIG9wZW5lZCBpbiBhIG5ldyB0YWIvd2luZG93XG4gICAgc3luYy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZTpNZXNzYWdlRXZlbnQ8U3luY0RhdGE+KSA9PiB7XG4gICAgICBpZiAoZS5kYXRhLmZyb20pIHsgLy8gcmVxdWVzdCBjdXRvZmZzXG4gICAgICAgIGNvbnN0IGN1dG9mZnMgPSBzdG9yYWdlLmdldEl0ZW0oZS5kYXRhLmtleSk7XG4gICAgICAgIGlmIChjdXRvZmZzKSB7XG4gICAgICAgICAgc3luYy5wb3N0TWVzc2FnZSg8U3luY0RhdGE+e3RvOiBlLmRhdGEuZnJvbSwga2V5OiBlLmRhdGEua2V5LCBzdHI6IGN1dG9mZnN9KTtcbiAgICAgICAgfSAvLyBzZW5kIHJlc3BvbnNlXG4gICAgICB9IGVsc2UgaWYgKGUuZGF0YS50bykgeyAgLy8gcmVjZWl2ZSBjdXRvZmZzXG4gICAgICAgIGlmIChlLmRhdGEudG8gPT0gdGFiSWQpIHtcbiAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oZS5kYXRhLmtleSwgPHN0cmluZz5lLmRhdGEuc3RyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8vIFRoZSBvYnNlcnZlciBpbnN0YW5jZSBmb3IgcmVzcG9uc2l2ZSBuYXZzXG4gIGNvbnN0IHJqc09ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgIGVudHJpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgIGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGw8TmF2SnNFbGVtZW50PihcIi5zZXJpZXMtbmF2LWpzXCIpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICBlbC5yZW5kZXIoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvKiBGdWxsIHNldCBvZiBCNjQgZnVuY3Rpb25zXG4gIGNvbnN0IEI2NEVuY29kZSAgICAgPSAodW5pY29kZTpzdHJpbmcpID0+IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodW5pY29kZSkpKSxcbiAgICAgICAgQjY0U2FmZSAgICAgICA9ICh1bnNhZmU6c3RyaW5nKSAgPT4gdW5zYWZlLnJlcGxhY2UoL1srLz1dL2csIChtKSA9PiBtID09IFwiK1wiID8gXCItXCIgOiBtID09IFwiL1wiID8gXCJfXCIgOiBcIlwiKSxcbiAgICAgICAgQjY0U2FmZUVuY29kZSA9ICh1bmljb2RlOnN0cmluZykgPT4gQjY0U2FmZShCNjRFbmNvZGUodW5pY29kZSkpLFxuICAgICAgICBCNjREZWNvZGUgICAgID0gKGJhc2U2NDpzdHJpbmcpICA9PiAobmV3IFRleHREZWNvZGVyKCkpLmRlY29kZShVaW50OEFycmF5LmZyb20oYXRvYihiYXNlNjQpLCBjID0+IGMuY2hhckNvZGVBdCgwKSkpLFxuICAgICAgICBCNjRVbnNhZmUgICAgID0gKHNhZmU6c3RyaW5nKSAgICA9PiBzYWZlLnJlcGxhY2UoL1stX10vZywgKG1hdGNoKSA9PiBtYXRjaCA9PSBcIi1cIiA/IFwiK1wiIDogXCIvXCIpLFxuICAgICAgICBCNjRTYWZlRGVjb2RlID0gKGJhc2U2NDpzdHJpbmcpICA9PiBCNjREZWNvZGUoQjY0VW5zYWZlKGJhc2U2NCkpXG4gICovXG4gIGNvbnN0IEI2NFNhZmVFbmNvZGUgPSAodW5pY29kZTpzdHJpbmcpID0+IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodW5pY29kZSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1srLz1dL2csIChtKSA9PiBtID09IFwiK1wiID8gXCItXCIgOiBtID09IFwiL1wiID8gXCJfXCIgOiBcIlwiKSxcbiAgICAgICAgQjY0RGVjb2RlICAgICA9IChiYXNlNjQ6c3RyaW5nKSAgPT4gKG5ldyBUZXh0RGVjb2RlcigpKS5kZWNvZGUoVWludDhBcnJheS5mcm9tKGF0b2IoYmFzZTY0KSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpKTtcblxuICAvLyBSZXR1cm4gYSByYW5kb20ga2V5OiAzIGNoYXJzIG1heCwgYmFzZS0zNiBudW1iZXIgPCAzNioqM1xuICBjb25zdCByYW5kS2V5ID0gKCkgPT4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMzYgKiogMykudG9TdHJpbmcoMzYpO1xuXG4gIC8vIE1hbmFnZSB0aGUgcGFnZSBhdWdtZW50YXRpb24gZm9yIEtleW5hdiwgY2FsbGVkIG9ubHkgaWYgc3RvcmFnZVN1cHBvcnRcbiAgY29uc3QgYXVnbWVudEtleW5hdjogQXVnbWVudEtleW5hdiA9IGFzeW5jIChuYXYsIFtzdG9yYWdlS2V5LCByb290S2V5LCBwYWdlS2V5LCBsYXN0LCBzcGxpY2VBcmdzXSkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhbGlnbi1hc3NpZ25tZW50cy9hbGlnbi1hc3NpZ25tZW50c1xuICAgIGxldCBhdWdtZW50UGFnZTogKHBhZ2U6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIGNvbnN0IGJyb3dzZXJLZXkgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoLztcXHMrLykgIC8vIGl0IHdvcmtzIGV2ZW4gaWYgbWFsZm9ybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKHJvdykgPT4gcm93LnN0YXJ0c1dpdGgocGFneSArIFwiPVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LnNwbGl0KFwiPVwiKVsxXSA/PyByYW5kS2V5KCk7XG4gICAgZG9jdW1lbnQuY29va2llICA9IGAke3BhZ3l9PSR7YnJvd3NlcktleX1gOyAgLy8gU21hbGxlciAubWluIHNpemU6IHNldCB0aGUgY29va2llIHdpdGhvdXQgY2hlY2tpbmdcbiAgICBpZiAoc3RvcmFnZUtleSAmJiAhKHN0b3JhZ2VLZXkgaW4gc3RvcmFnZSkpIHtcbiAgICAgIC8vIFN5bmMgdGhlIHNlc3Npb25nU3RvcmFnZSBmcm9tIG90aGVyIHRhYnMvd2luZG93cyAoZS5nLiwgb3BlbiBwYWdlIGluIHRoZSBuZXcgdGFiL3dpbmRvdylcbiAgICAgIHN5bmMucG9zdE1lc3NhZ2UoPFN5bmNEYXRhPnsgZnJvbTogdGFiSWQsIGtleTogc3RvcmFnZUtleSB9KTtcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBsaXN0ZW5lciB0byBjb3B5IHRoZSBjdXRvZmZzIGluIHRoZSBjdXJyZW50IHNlc3Npb25TdG9yYWdlXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmd8bnVsbD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQoKCkgPT4geyByZXNvbHZlKFwiXCIpIH0sIDEwMCkpO1xuICAgICAgaWYgKCEoc3RvcmFnZUtleSBpbiBzdG9yYWdlKSkgeyAvLyB0aGUgc3RvcmFnZUtleSBkaWRuJ3QgZ2V0IGNvcGllZDogZmFsbGJhY2sgdG8gY291bnRsZXNzIHBhZ2luYXRpb25cbiAgICAgICAgYXVnbWVudFBhZ2UgPSAocGFnZTogc3RyaW5nKSA9PiBgJHtwYWdlfSske1N0cmluZyhsYXN0KX1gOyAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJZiBpdCBpcyBub3QgYXNzaWduZWQgaXQgbWVhbnMgaXQgc3VwcG9ydHMga2V5bmF2XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICBpZiAoIWF1Z21lbnRQYWdlKSB7IC8vIHJlZ3VsYXIga2V5bmF2IHBhZ2luYXRpb25cbiAgICAgIGlmICghc3RvcmFnZUtleSkgeyBkbyB7IHN0b3JhZ2VLZXkgPSByYW5kS2V5KCkgfSB3aGlsZSAoc3RvcmFnZUtleSBpbiBzdG9yYWdlKSB9IC8vIG5vIGR1cCBrZXlzXG4gICAgICBjb25zdCBkYXRhID0gc3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXkpLFxuICAgICAgICAgIGN1dG9mZnMgPSA8Q3V0b2ZmW10+KGRhdGEgPyBKU09OLnBhcnNlKGRhdGEpIDogW3VuZGVmaW5lZF0pO1xuICAgICAgaWYgKHNwbGljZUFyZ3MpIHtcbiAgICAgICAgY3V0b2Zmcy5zcGxpY2UoLi4uc3BsaWNlQXJncyk7XG4gICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShjdXRvZmZzKSk7XG4gICAgICB9XG4gICAgICAvLyBBdWdtZW50IGZ1bmN0aW9uXG4gICAgICBhdWdtZW50UGFnZSA9IChwYWdlOnN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBwYWdlTnVtID0gcGFyc2VJbnQocGFnZSk7XG4gICAgICAgIHJldHVybiBCNjRTYWZlRW5jb2RlKEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgPEF1Z21lbnRlZFBhZ2U+W2Jyb3dzZXJLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZnMubGVuZ3RoLCAgICAgICAvLyBwYWdlcy9sYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0b2Zmc1twYWdlTnVtIC0gMV0sIC8vIHByaW9yQ3V0b2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0b2Zmc1twYWdlTnVtXV0pKTsgIC8vIHBhZ2VDdXRvZmZcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaCA9IChyb290S2V5KSA/IGAke3Jvb3RLZXl9JTVCJHtwYWdlS2V5fSU1RGAgOiBwYWdlS2V5O1xuICAgIGNvbnN0IHJlICAgICA9IG5ldyBSZWdFeHAoYCg/PD1cXFxcPy4qKShcXFxcYiR7c2VhcmNofT0pKFxcXFxkKylgKTtcbiAgICAvLyBBdWdtZW50IHRoZSBwYWdlIHBhcmFtIG9mIGVhY2ggaHJlZlxuICAgIGZvciAoY29uc3QgYSBvZiA8Tm9kZUxpc3RPZjxIVE1MQW5jaG9yRWxlbWVudD4+PHVua25vd24+bmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZl0nKSkge1xuICAgICAgYS5ocmVmID0gYS5ocmVmLnJlcGxhY2UocmUsIChfbWF0Y2gsIHByZWZpeCwgZGlnaXQpOiBzdHJpbmcgPT4gYCR7U3RyaW5nKHByZWZpeCl9JHthdWdtZW50UGFnZSg8c3RyaW5nPmRpZ2l0KX1gKTtcbiAgICB9XG4gICAgLy8gUmV0dXJuIHRoZSBhdWdtZW50IGZ1bmN0aW9uIGZvciBmdXJ0aGVyIGF1Z21lbnRhdGlvbiAoaS5lLiwgdXJsIHRva2VuIGluIGlucHV0X25hdl9qcylcbiAgICByZXR1cm4gYXVnbWVudFBhZ2U7XG4gIH07XG5cbiAgLy8gQnVpbGQgdGhlIHNlcmllc19uYXZfanMgaGVscGVyXG4gIGNvbnN0IGJ1aWxkTmF2SnMgPSAobmF2Ok5hdkpzRWxlbWVudCwgW1tiZWZvcmUsIGFuY2hvciwgY3VycmVudCwgZ2FwLCBhZnRlcl0sIHBhZ2VUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhzLCBzZXJpZXMsIGxhYmVsc10sIGtleW5hdkFyZ3NdOlNlcmllc05hdkpzQXJncykgPT4ge1xuICAgIGxldCBsYXN0V2lkdGggPSAtMTtcbiAgICBjb25zdCBwYXJlbnQgID0gPEhUTUxFbGVtZW50Pm5hdi5wYXJlbnRFbGVtZW50O1xuXG4gICAgbmF2LnJlbmRlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gd2lkdGhzLmZpbmRJbmRleCh3ID0+IHcgPCBwYXJlbnQuY2xpZW50V2lkdGgpO1xuICAgICAgaWYgKGluZGV4ID09PSAtMSB8fCB3aWR0aHNbaW5kZXhdID09PSBsYXN0V2lkdGgpIHsgcmV0dXJuIH1cblxuICAgICAgbGV0IGh0bWwgPSBiZWZvcmU7XG4gICAgICBzZXJpZXNbaW5kZXhdLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgLy8gQXZvaWQgdGhlIGlmIGJsb2NrcyBhbmQgY2hhaW4gdGhlIHJlc3VsdHMgKHNob3J0ZXIgcGFneS5taW4uanMgYW5kIGVhc2llciByZWFkaW5nKVxuICAgICAgICBodG1sICs9IGl0ZW0gPT0gXCJnYXBcIiA/IGdhcCA6XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgaXRlbSBtYXkgYmUgYSBudW1iZXIsIGJ1dCB0aGUgJ3JlcGxhY2UnIGNvbnZlcnRzIGl0IHRvIHN0cmluZyAoc2hvcnRlciBwYWd5Lm1pbi5qcylcbiAgICAgICAgICAgICAgICAodHlwZW9mIGl0ZW0gPT0gXCJudW1iZXJcIiA/IGFuY2hvci5yZXBsYWNlKHBhZ2VUb2tlbiwgaXRlbSkgOiBjdXJyZW50KVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIkw8XCIsIGxhYmVscz8uW2luZGV4XVtpXSA/PyBgJHtTdHJpbmcoaXRlbSl9PGApO1xuICAgICAgfSk7XG4gICAgICBodG1sICAgICAgICAgKz0gYWZ0ZXI7XG4gICAgICBuYXYuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIG5hdi5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsIGh0bWwpO1xuICAgICAgbGFzdFdpZHRoID0gd2lkdGhzW2luZGV4XTtcbiAgICAgIGlmIChrZXluYXZBcmdzICYmIHN0b3JhZ2VTdXBwb3J0KSB7IHZvaWQgYXVnbWVudEtleW5hdihuYXYsIGtleW5hdkFyZ3MpIH1cbiAgICB9O1xuXG4gICAgcmpzT2JzZXJ2ZXIub2JzZXJ2ZShwYXJlbnQpO1xuICB9O1xuXG4gIC8vIEluaXQgdGhlIGlucHV0X25hdl9qcyBoZWxwZXJzXG4gIGNvbnN0IGluaXRJbnB1dE5hdkpzID0gYXN5bmMgKG5hdjpIVE1MRWxlbWVudCwgW3VybF90b2tlbiwgcGFnZVRva2VuLCBrZXluYXZBcmdzXTpJbnB1dE5hdkpzQXJncykgPT4ge1xuICAgIGNvbnN0IGF1Z21lbnQgPSBrZXluYXZBcmdzICYmIHN0b3JhZ2VTdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgID8gYXdhaXQgYXVnbWVudEtleW5hdihuYXYsIGtleW5hdkFyZ3MpXG4gICAgICAgICAgICAgICAgICAgIDogKHBhZ2U6IHN0cmluZykgPT4gcGFnZTtcbiAgICBpbml0SW5wdXQobmF2LCBpbnB1dFZhbHVlID0+IHVybF90b2tlbi5yZXBsYWNlKHBhZ2VUb2tlbiwgYXVnbWVudChpbnB1dFZhbHVlKSkpO1xuICB9O1xuXG4gIC8vIEluaXQgdGhlIGxpbWl0X3RhZ19qcyBoZWxwZXJcbiAgY29uc3QgaW5pdExpbWl0VGFnSnMgPSAoc3BhbjpIVE1MU3BhbkVsZW1lbnQsIFtmcm9tLCB1cmxfdG9rZW4sIHBhZ2VfdG9rZW4sIGxpbWl0VG9rZW5dOkxpbWl0VGFnSnNBcmdzKSA9PiB7XG4gICAgaW5pdElucHV0KHNwYW4sIGlucHV0VmFsdWUgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgcGFnZSBpcyBhIG51bWJlciwgYnV0IHRoZSAncmVwbGFjZScgY29udmVydHMgaXQgdG8gc3RyaW5nIChzaG9ydGVyIHBhZ3kubWluLmpzKVxuICAgICAgcmV0dXJuIHVybF90b2tlbi5yZXBsYWNlKHBhZ2VfdG9rZW4sIE1hdGgubWF4KE1hdGguY2VpbChmcm9tIC8gcGFyc2VJbnQoaW5wdXRWYWx1ZSkpLCAxKSlcbiAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShsaW1pdFRva2VuLCBpbnB1dFZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gIGNvbnN0IGluaXRJbnB1dCA9IChlbGVtZW50OkhUTUxFbGVtZW50LCBnZXRVcmw6KHY6c3RyaW5nKSA9PiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpbnB1dCAgID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIiksXG4gICAgICAgICAgbGluayAgICA9IDxIVE1MQW5jaG9yRWxlbWVudD5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgIGxldCAgIGluaXRpYWwgPSBpbnB1dC52YWx1ZTtcbiAgICBjb25zdCBhY3Rpb24gID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gaW5pdGlhbCkgeyByZXR1cm4gfSAgLy8gbm90IGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbWluLCB2YWwsIG1heF0gPSBbaW5wdXQubWluLCBpbnB1dC52YWx1ZSwgaW5wdXQubWF4XS5tYXAobiA9PiBwYXJzZUludChuKSB8fCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gaW5pdGlhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsICAgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBnZXRVcmwoaW5wdXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgKCkgPT4geyBpbnB1dC5zZWxlY3QoKSB9KTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTtcbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PSBcIkVudGVyXCIpIHsgYWN0aW9uKCkgfSB9KTtcbiAgfTtcblxuICAvLyBQdWJsaWMgaW50ZXJmYWNlXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogXCI0My41LjNcIixcblxuICAgIC8vIFNjYW4gZm9yIGVsZW1lbnRzIHdpdGggYSBcImRhdGEtcGFneVwiIGF0dHJpYnV0ZSBhbmQgY2FsbCB0aGVpciBpbml0IGZ1bmN0aW9ucyB3aXRoIHRoZSBkZWNvZGVkIGFyZ3NcbiAgICBpbml0KGFyZz86SFRNTEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGFyZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gYXJnIDogZG9jdW1lbnQsXG4gICAgICAgICAgICBlbGVtZW50cyA9IHRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtcGFneV1cIik7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgPE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+PmVsZW1lbnRzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgW2hlbHBlcklkLCAuLi5hcmdzXSA9IDxJbml0QXJncz5KU09OLnBhcnNlKEI2NERlY29kZSg8c3RyaW5nPmVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1wYWd5XCIpKSk7XG4gICAgICAgICAgaWYgKGhlbHBlcklkID09IFwia1wiKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHNwcmVhZCAyIGFyZ3VtZW50cywgbm90IDMgYXMgaXQgY29tcGxhaW5zIGFib3V0XG4gICAgICAgICAgICB2b2lkIGF1Z21lbnRLZXluYXYoZWxlbWVudCwgLi4uPEtleW5hdkFyZ3M+PHVua25vd24+YXJncyk7XG4gICAgICAgICAgfSBlbHNlIGlmIChoZWxwZXJJZCA9PSBcInNualwiKSB7XG4gICAgICAgICAgICBidWlsZE5hdkpzKDxOYXZKc0VsZW1lbnQ+ZWxlbWVudCwgPFNlcmllc05hdkpzQXJncz48dW5rbm93bj5hcmdzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlcklkID09IFwiaW5qXCIpIHtcbiAgICAgICAgICAgIHZvaWQgaW5pdElucHV0TmF2SnMoZWxlbWVudCwgPElucHV0TmF2SnNBcmdzPjx1bmtub3duPmFyZ3MpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgICAgICB9IGVsc2UgaWYgKGhlbHBlcklkID09IFwibHRqXCIpIHtcbiAgICAgICAgICAgIGluaXRMaW1pdFRhZ0pzKGVsZW1lbnQsIDxMaW1pdFRhZ0pzQXJncz48dW5rbm93bj5hcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZWxzZSB7IGNvbnNvbGUud2FybihcIlBhZ3kuaW5pdDogJW9cXG5Vbmtub3duIGhlbHBlcklkICclcydcIiwgZWxlbWVudCwgaGVscGVySWQpIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7IGNvbnNvbGUud2FybihcIlBhZ3kuaW5pdDogJW9cXG4lc1wiLCBlbGVtZW50LCBlcnIpIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59KSgpO1xuIiwKICAgICJpbXBvcnQgUGFneSBmcm9tIFwiLi9wYWd5LnRzXCJcbndpbmRvdy5QYWd5ID0gUGFneVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQWdEQSxJQUFnQixzQkFBTTtBQUFBLEVBQ3BCLE1BQU0saUJBQWlCLG9CQUFvQixVQUFVLHNCQUFzQjtBQUFBLEVBRTNFLElBQUksT0FBTyxRQUFRLFNBQWtCLE1BQXdCO0FBQUEsRUFDN0QsSUFBSSxnQkFBZ0I7QUFBQSxJQUNsQixVQUFVO0FBQUEsSUFDVixPQUFVLElBQUksaUJBQWlCLElBQUk7QUFBQSxJQUNuQyxRQUFVLEtBQUssSUFBSTtBQUFBLElBR25CLEtBQUssaUJBQWlCLFdBQVcsQ0FBQyxNQUE2QjtBQUFBLE1BQzdELElBQUksRUFBRSxL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
@@ -1,2 +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+"+"+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)=>`${$}${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]??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.4.4",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
1
+ window.Pagy=(()=>{let O="sessionStorage"in window&&"BroadcastChannel"in window,B="pagy",Z,L,W;if(O)Z=sessionStorage,L=new BroadcastChannel(B),W=Date.now(),L.addEventListener("message",(q)=>{if(q.data.from){let z=Z.getItem(q.data.key);if(z)L.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(".series-nav-js").forEach((C)=>{C.render()})})}),_=(q)=>btoa(String.fromCharCode(...new TextEncoder().encode(q))).replace(/[+/=]/g,(z)=>z=="+"?"-":z=="/"?"_":""),T=(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(B+"="))?.split("=")[1]??P();if(document.cookie=`${B}=${X}`,z&&!(z in Z)){if(L.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},x=(q,[[z,C,F,H,G],Q,[X,D,E],M])=>{let Y=-1,$=q.parentElement;q.render=()=>{let R=X.findIndex((j)=>j<$.clientWidth);if(R===-1||X[R]===Y)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),Y=X[R],M&&O)J(q,M)},V.observe($)},w=async(q,[z,C,F])=>{let H=F&&O?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.3",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(T(F.getAttribute("data-pagy")));if(H=="k")J(F,...G);else if(H=="snj")x(F,G);else if(H=="inj")w(F,G);else if(H=="ltj")A(F,G)}catch(H){console.warn(`Pagy.init: %o
2
2
  %s`,F,H)}}}})();
data/javascripts/pagy.mjs CHANGED
@@ -18,20 +18,26 @@ export default (() => {
18
18
  }
19
19
  });
20
20
  }
21
- const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => {
22
- e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.render());
23
- }));
21
+ const rjsObserver = new ResizeObserver((entries) => {
22
+ entries.forEach((e) => {
23
+ e.target.querySelectorAll(".series-nav-js").forEach((el) => {
24
+ el.render();
25
+ });
26
+ });
27
+ });
24
28
  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)));
25
29
  const randKey = () => Math.floor(Math.random() * 36 ** 3).toString(36);
26
30
  const augmentKeynav = async (nav, [storageKey, rootKey, pageKey, last, spliceArgs]) => {
27
31
  let augmentPage;
28
32
  const browserKey = document.cookie.split(/;\s+/).find((row) => row.startsWith(pagy + "="))?.split("=")[1] ?? randKey();
29
- document.cookie = pagy + "=" + browserKey;
33
+ document.cookie = `${pagy}=${browserKey}`;
30
34
  if (storageKey && !(storageKey in storage)) {
31
35
  sync.postMessage({ from: tabId, key: storageKey });
32
- await new Promise((resolve) => setTimeout(() => resolve(""), 100));
36
+ await new Promise((resolve) => setTimeout(() => {
37
+ resolve("");
38
+ }, 100));
33
39
  if (!(storageKey in storage)) {
34
- augmentPage = (page) => page + "+" + last;
40
+ augmentPage = (page) => `${page}+${String(last)}`;
35
41
  }
36
42
  }
37
43
  if (!augmentPage) {
@@ -60,7 +66,7 @@ export default (() => {
60
66
  const search = rootKey ? `${rootKey}%5B${pageKey}%5D` : pageKey;
61
67
  const re = new RegExp(`(?<=\\?.*)(\\b${search}=)(\\d+)`);
62
68
  for (const a of nav.querySelectorAll("a[href]")) {
63
- a.href = a.href.replace(re, (_match, prefix, digit) => `${prefix}${augmentPage(digit)}`);
69
+ a.href = a.href.replace(re, (_match, prefix, digit) => `${String(prefix)}${augmentPage(digit)}`);
64
70
  }
65
71
  return augmentPage;
66
72
  };
@@ -70,16 +76,16 @@ export default (() => {
70
76
  [widths, series, labels],
71
77
  keynavArgs
72
78
  ]) => {
73
- const parent = nav.parentElement;
74
79
  let lastWidth = -1;
75
- (nav.render = () => {
80
+ const parent = nav.parentElement;
81
+ nav.render = () => {
76
82
  const index = widths.findIndex((w) => w < parent.clientWidth);
77
- if (widths[index] === lastWidth) {
83
+ if (index === -1 || widths[index] === lastWidth) {
78
84
  return;
79
85
  }
80
86
  let html = before;
81
87
  series[index].forEach((item, i) => {
82
- html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? item + "<");
88
+ html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? `${String(item)}<`);
83
89
  });
84
90
  html += after;
85
91
  nav.innerHTML = "";
@@ -88,10 +94,8 @@ export default (() => {
88
94
  if (keynavArgs && storageSupport) {
89
95
  augmentKeynav(nav, keynavArgs);
90
96
  }
91
- })();
92
- if (nav.classList.contains(pagy + "-rjs")) {
93
- rjsObserver.observe(parent);
94
- }
97
+ };
98
+ rjsObserver.observe(parent);
95
99
  };
96
100
  const initInputNavJs = async (nav, [url_token, pageToken, keynavArgs]) => {
97
101
  const augment = keynavArgs && storageSupport ? await augmentKeynav(nav, keynavArgs) : (page) => page;
@@ -119,7 +123,9 @@ export default (() => {
119
123
  link.href = getUrl(input.value);
120
124
  link.click();
121
125
  };
122
- input.addEventListener("focus", () => input.select());
126
+ input.addEventListener("focus", () => {
127
+ input.select();
128
+ });
123
129
  input.addEventListener("focusout", action);
124
130
  input.addEventListener("keypress", (e) => {
125
131
  if (e.key == "Enter") {
@@ -128,7 +134,7 @@ export default (() => {
128
134
  });
129
135
  };
130
136
  return {
131
- version: "43.4.4",
137
+ version: "43.5.3",
132
138
  init(arg) {
133
139
  const target = arg instanceof HTMLElement ? arg : document, elements = target.querySelectorAll("[data-pagy]");
134
140
  for (const element of elements) {
@@ -7,8 +7,7 @@ require 'active_support/core_ext/numeric/time'
7
7
  require 'active_support/core_ext/integer/time'
8
8
 
9
9
  class Pagy
10
- # Calendar class
11
- # noinspection RubyMismatchedArgumentType
10
+ # Calendar class, subclass of Hash
12
11
  class Calendar < Hash
13
12
  path = Pathname.new(__dir__)
14
13
  autoload :Unit, path.join('unit')
@@ -22,7 +21,6 @@ class Pagy
22
21
  UNITS = %i[year quarter month week day] # rubocop:disable Style/MutableConstant
23
22
 
24
23
  class << self
25
- # Localize with rails-i18n in any env
26
24
  def localize_with_rails_i18n_gem(*locales)
27
25
  Unit.prepend(Module.new { def localize(...) = ::I18n.localize(...) })
28
26
  # :nocov:
@@ -40,10 +38,10 @@ class Pagy
40
38
  def init(...) = new.send(:init, ...)
41
39
  end
42
40
 
43
- # Return the current time of the smallest time unit shown
41
+ # The current time of the smallest time unit shown
44
42
  def showtime = self[@units.last].from
45
43
 
46
- # Return the url for the calendar (shortest unit) page at time
44
+ # The url for the calendar (shortest unit) page at time
47
45
  def url_at(time, **)
48
46
  page_keys = {}
49
47
 
@@ -69,7 +67,7 @@ class Pagy
69
67
  @params = params
70
68
  @page_key = conf[:offset][:page_key] || DEFAULT[:page_key]
71
69
 
72
- # set all the :page_key options for later deletion
70
+ # Set all the :page_key options for later deletion
73
71
  @units.each { |unit| conf[unit][:page_key] = "#{unit}_#{@page_key}" }
74
72
 
75
73
  calendar = {}
@@ -81,8 +79,8 @@ class Pagy
81
79
  unit_conf[:querify] = ->(up) { up.except!(*params_to_delete.map(&:to_s)) }
82
80
  unit_conf[:period] = unit_object&.send(:active_period) || @period
83
81
  unit_conf[:page] = @params[unit_conf[:page_key]] # requested page
82
+ # Simplecov doesn't need to cover a fail block_given?
84
83
  # :nocov:
85
- # simplecov doesn't need to fail block_given?
86
84
  unit_conf[:counts] = yield(unit, unit_conf[:period]) if block_given?
87
85
  # :nocov:
88
86
  calendar[unit] = unit_object = create(unit, **unit_conf)
@@ -91,7 +89,7 @@ class Pagy
91
89
  [replace(calendar), unit_object.from, unit_object.to]
92
90
  end
93
91
 
94
- # Create a unit subclass instance by using the unit name (internal use)
92
+ # Create an instance of a Unit subclass by using its name (internal use)
95
93
  def create(unit, **)
96
94
  raise InternalError, "unit must be in #{UNITS.inspect}; got #{unit}" unless UNITS.include?(unit)
97
95