gooddata 2.1.9-java → 2.1.14-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gdc-ii-config.yaml +1 -1
  3. data/.rubocop.yml +1 -0
  4. data/.travis.yml +1 -3
  5. data/CHANGELOG.md +49 -0
  6. data/Dockerfile +17 -7
  7. data/README.md +17 -0
  8. data/SDK_VERSION +1 -1
  9. data/VERSION +1 -1
  10. data/bin/run_brick.rb +3 -0
  11. data/bin/test_projects_cleanup.rb +6 -2
  12. data/ci/bigquery/pom.xml +54 -0
  13. data/ci/redshift/pom.xml +73 -0
  14. data/ci/snowflake/pom.xml +57 -0
  15. data/dev-gooddata-sso.pub.encrypted +40 -40
  16. data/gdc_fossa_lcm.yaml +2 -0
  17. data/gdc_fossa_ruby_sdk.yaml +4 -0
  18. data/gooddata.gemspec +3 -3
  19. data/k8s/charts/lcm-bricks/Chart.yaml +1 -1
  20. data/k8s/charts/lcm-bricks/templates/prometheus/alertingRules.yaml +22 -12
  21. data/lcm.rake +10 -6
  22. data/lib/gooddata/cloud_resources/bigquery/bigquery_client.rb +86 -0
  23. data/lib/gooddata/cloud_resources/bigquery/drivers/.gitkeepme +0 -0
  24. data/lib/gooddata/cloud_resources/redshift/redshift_client.rb +3 -2
  25. data/lib/gooddata/cloud_resources/snowflake/drivers/.gitkeepme +0 -0
  26. data/lib/gooddata/cloud_resources/snowflake/snowflake_client.rb +84 -0
  27. data/lib/gooddata/helpers/data_helper.rb +1 -1
  28. data/lib/gooddata/helpers/data_source_helpers.rb +47 -0
  29. data/lib/gooddata/helpers/global_helpers_params.rb +2 -2
  30. data/lib/gooddata/lcm/actions/collect_clients.rb +6 -6
  31. data/lib/gooddata/lcm/actions/collect_dynamic_schedule_params.rb +6 -6
  32. data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +2 -1
  33. data/lib/gooddata/lcm/actions/collect_users_brick_users.rb +7 -6
  34. data/lib/gooddata/lcm/actions/migrate_gdc_date_dimension.rb +116 -0
  35. data/lib/gooddata/lcm/actions/set_master_project.rb +76 -0
  36. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +10 -1
  37. data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +2 -2
  38. data/lib/gooddata/lcm/actions/synchronize_users.rb +31 -30
  39. data/lib/gooddata/lcm/lcm2.rb +22 -1
  40. data/lib/gooddata/models/domain.rb +17 -15
  41. data/lib/gooddata/models/from_wire.rb +1 -0
  42. data/lib/gooddata/models/metadata/scheduled_mail.rb +1 -1
  43. data/lib/gooddata/models/process.rb +11 -3
  44. data/lib/gooddata/models/project.rb +118 -29
  45. data/rubydev_public.gpg.encrypted +51 -51
  46. data/rubydev_secret_keys.gpg.encrypted +109 -109
  47. metadata +22 -10
@@ -105,6 +105,7 @@ module GoodData
105
105
  d[:title] = date_dim['dateDimension']['title']
106
106
  d[:urn] = date_dim['dateDimension']['urn']
107
107
  d[:identifier_prefix] = date_dim['dateDimension']['identifierPrefix']
108
+ d[:identifier] = date_dim['dateDimension']['identifier'] if date_dim['dateDimension']['identifier']
108
109
  d[:columns] = parse_bridges(date_dim)
109
110
  end
110
111
  end
@@ -30,7 +30,7 @@ module GoodData
30
30
  :deprecated => 0,
31
31
 
32
32
  # Content When options
33
- :recurrency => '0:0:0:12:0:0',
33
+ :recurrency => '0:0:0:1*12:0:0',
34
34
  :startDate => '2012-06-05',
35
35
  :timeZone => 'America/Los_Angeles',
36
36
 
@@ -118,11 +118,13 @@ module GoodData
118
118
  GoodData.logger.info("Deploying #{path}") if verbose
119
119
 
120
120
  deployed_path = Process.upload_package(path, files_to_exclude, client: client, project: project)
121
+ data_sources = options[:data_sources] || []
121
122
  data = {
122
123
  :process => {
123
124
  :name => deploy_name,
124
125
  :path => "/uploads/#{File.basename(deployed_path)}",
125
- :type => type
126
+ :type => type,
127
+ :dataSources => data_sources
126
128
  }
127
129
  }
128
130
 
@@ -171,10 +173,12 @@ module GoodData
171
173
  verbose = options[:verbose] || false
172
174
  GoodData.logger.info("Deploying #{path}") if verbose
173
175
 
176
+ data_sources = options[:data_sources] || []
174
177
  data = {
175
178
  process: {
176
179
  name: deploy_name,
177
180
  path: path,
181
+ dataSources: data_sources,
178
182
  type: 'RUBY'
179
183
  }
180
184
  }
@@ -185,7 +189,7 @@ module GoodData
185
189
  def deploy_component(data, options = { client: GoodData.client, project: GoodData.project })
186
190
  client, project = GoodData.get_client_and_project(options)
187
191
  data = { process: data } unless data[:process]
188
- data[:process] = GoodData::Helpers.symbolize_keys(data[:process]).select { |k| %i[type name component].include? k }
192
+ data[:process] = GoodData::Helpers.symbolize_keys(data[:process]).select { |k| %i[type name component dataSources].include? k }
189
193
  data[:process][:component] = GoodData::Helpers.symbolize_keys(data[:process][:component]).select { |k| %i[name version configLocation config].include? k }
190
194
 
191
195
  save(data, options)
@@ -266,7 +270,7 @@ module GoodData
266
270
  # @option options [String] :name Readable name of the process
267
271
  # @option options [Boolean] :verbose (false) Switch on verbose mode for detailed logging
268
272
  def deploy(path, options = {})
269
- Process.deploy(path, { client: client, process_id: process_id, :project => project, :name => name, :type => type }.merge(options))
273
+ Process.deploy(path, { client: client, process_id: process_id, :project => project, :name => name, :type => type, :data_sources => data_sources }.merge(options))
270
274
  end
271
275
 
272
276
  # Downloads the process from S3 in a zipped form.
@@ -326,6 +330,10 @@ module GoodData
326
330
  process['component']
327
331
  end
328
332
 
333
+ def data_sources
334
+ process['dataSources']
335
+ end
336
+
329
337
  # Determines whether the process is an ADDv2 component.
330
338
  # @return [Bool] True if the process is an ADDv2 component.
331
339
  def add_v2_component?
@@ -261,21 +261,26 @@ module GoodData
261
261
  # @option ads_output_stage_uri Uri of the source output stage. It must be in the same domain as the target project.
262
262
  def transfer_processes(from_project, to_project, options = {})
263
263
  options = GoodData::Helpers.symbolize_keys(options)
264
+ aliases = {}
264
265
  to_project_processes = to_project.processes
265
266
  additional_hidden_params = options[:additional_hidden_params] || {}
266
267
  result = from_project.processes.uniq(&:name).map do |process|
267
- fail "The process name #{process.name} must be unique in transfered project #{to_project}" if to_project_processes.count { |p| p.name == process.name } > 1
268
+ fail "The process name #{process.name} must be unique in transferred project #{to_project}" if to_project_processes.count { |p| p.name == process.name } > 1
268
269
  next if process.type == :dataload || process.add_v2_component?
270
+ collect_process_aliases(process.data, from_project.client, aliases)
269
271
 
270
272
  to_process = to_project_processes.find { |p| p.name == process.name }
271
273
 
274
+ data_sources = GoodData::Helpers.symbolize_keys_recursively!(process.data_sources)
275
+ data_sources = replace_data_source_ids(data_sources, to_project.client, aliases)
272
276
  to_process = if process.path
273
277
  to_process.delete if to_process
274
- GoodData::Process.deploy_from_appstore(process.path, name: process.name, client: to_project.client, project: to_project)
278
+ Process.deploy_from_appstore(process.path, name: process.name, client: to_project.client, project: to_project, data_sources: data_sources)
275
279
  elsif process.component
276
280
  to_process.delete if to_process
277
281
  process_hash = GoodData::Helpers::DeepMergeableHash[GoodData::Helpers.symbolize_keys(process.to_hash)].deep_merge(additional_hidden_params)
278
- GoodData::Process.deploy_component(process_hash, project: to_project, client: to_project.client)
282
+ process_hash = replace_process_data_source_ids(process_hash, to_project.client, aliases)
283
+ Process.deploy_component(process_hash, project: to_project, client: to_project.client)
279
284
  else
280
285
  Dir.mktmpdir('etl_transfer') do |dir|
281
286
  dir = Pathname(dir)
@@ -283,11 +288,10 @@ module GoodData
283
288
  File.open(filename, 'w') do |f|
284
289
  f << process.download
285
290
  end
286
-
287
291
  if to_process
288
- to_process.deploy(filename, type: process.type, name: process.name)
292
+ to_process.deploy(filename, type: process.type, name: process.name, data_sources: data_sources)
289
293
  else
290
- to_project.deploy_process(filename, type: process.type, name: process.name)
294
+ to_project.deploy_process(filename, type: process.type, name: process.name, data_sources: data_sources)
291
295
  end
292
296
  end
293
297
  end
@@ -318,6 +322,56 @@ module GoodData
318
322
  result.compact
319
323
  end
320
324
 
325
+ def collect_process_aliases(process_data, client, aliases)
326
+ data_sources = process_data.dig('process', 'dataSources')
327
+ unless data_sources.blank?
328
+ data_sources.map do |data_source|
329
+ get_data_source_alias(data_source['id'], client, aliases)
330
+ end
331
+ end
332
+ component = process_data.dig('process', 'component')
333
+ get_data_source_alias(component['configLocation']['dataSourceConfig']['id'], client, aliases) if component&.dig('configLocation', 'dataSourceConfig')
334
+ aliases
335
+ end
336
+
337
+ def get_data_source_alias(data_source_id, client, aliases)
338
+ unless aliases[data_source_id]
339
+ data_source = GoodData::Helpers.get_data_source_by_id(data_source_id, client)
340
+ if data_source&.dig('dataSource', 'alias')
341
+ aliases[data_source_id] = {
342
+ :type => get_data_source_type(data_source),
343
+ :alias => data_source['dataSource']['alias']
344
+ }
345
+ end
346
+ end
347
+ aliases[data_source_id]
348
+ end
349
+
350
+ def get_data_source_type(data_source_data)
351
+ data_source_data&.dig('dataSource', 'connectionInfo') ? data_source_data['dataSource']['connectionInfo'].first[0].upcase : ""
352
+ end
353
+
354
+ def replace_process_data_source_ids(process_data, client, aliases)
355
+ component = process_data.dig(:process, :component)
356
+ if component&.dig(:configLocation, :dataSourceConfig)
357
+ the_alias = aliases[component[:configLocation][:dataSourceConfig][:id]]
358
+ process_data[:process][:component][:configLocation][:dataSourceConfig][:id] = GoodData::Helpers.verify_data_source_alias(the_alias, client)
359
+ end
360
+ process_data[:process][:dataSources] = replace_data_source_ids(process_data[:process][:dataSources], client, aliases)
361
+ process_data
362
+ end
363
+
364
+ def replace_data_source_ids(data_sources, client, aliases)
365
+ array_data_sources = []
366
+ if data_sources && !data_sources.empty?
367
+ data_sources.map do |data_source|
368
+ new_id = GoodData::Helpers.verify_data_source_alias(aliases[data_source[:id]], client)
369
+ array_data_sources.push(:id => new_id)
370
+ end
371
+ end
372
+ array_data_sources
373
+ end
374
+
321
375
  def transfer_user_groups(from_project, to_project)
322
376
  from_project.user_groups.map do |ug|
323
377
  # migrate groups
@@ -625,6 +679,7 @@ module GoodData
625
679
  def blueprint(options = {})
626
680
  options = { include_ca: true }.merge(options)
627
681
  result = client.get("/gdc/projects/#{pid}/model/view", params: { includeDeprecated: true, includeGrain: true, includeCA: options[:include_ca] })
682
+
628
683
  polling_url = result['asyncTask']['link']['poll']
629
684
  model = client.poll_on_code(polling_url, options)
630
685
  bp = GoodData::Model::FromWire.from_wire(model, options)
@@ -1546,26 +1601,28 @@ module GoodData
1546
1601
  # @return [Array<GoodData::User>] List of users
1547
1602
  def users(opts = {})
1548
1603
  client = client(opts)
1549
- Enumerator.new do |y|
1550
- offset = opts[:offset] || 0
1551
- limit = opts[:limit] || 1_000
1552
- loop do
1553
- tmp = client.get("/gdc/projects/#{pid}/users", params: { offset: offset, limit: limit })
1554
- tmp['users'].each do |user_data|
1555
- user = client.create(GoodData::Membership, user_data, project: self)
1556
-
1557
- if opts[:all]
1558
- y << user
1559
- elsif opts[:disabled]
1560
- y << user if user && user.disabled?
1561
- else
1562
- y << user if user && user.enabled?
1563
- end
1604
+ all_users = []
1605
+ offset = opts[:offset] || 0
1606
+ limit = opts[:limit] || 1_000
1607
+ loop do
1608
+ tmp = client.get("/gdc/projects/#{pid}/users", params: { offset: offset, limit: limit })
1609
+ tmp['users'].each do |user_data|
1610
+ user = client.create(GoodData::Membership, user_data, project: self)
1611
+
1612
+ if opts[:all]
1613
+ all_users << user
1614
+ elsif opts[:disabled]
1615
+ all_users << user if user&.disabled?
1616
+ else
1617
+ all_users << user if user&.enabled?
1564
1618
  end
1565
- break if tmp['users'].count < limit
1566
- offset += limit
1567
1619
  end
1620
+ break if tmp['users'].count < limit
1621
+
1622
+ offset += limit
1568
1623
  end
1624
+
1625
+ all_users
1569
1626
  end
1570
1627
 
1571
1628
  alias_method :members, :users
@@ -1604,14 +1661,19 @@ module GoodData
1604
1661
  def import_users(new_users, options = {})
1605
1662
  role_list = roles
1606
1663
  users_list = users
1607
- new_users = new_users.map { |x| ((x.is_a?(Hash) && x[:user] && x[:user].to_hash.merge(role: x[:role])) || x.to_hash).tap { |u| u[:login].downcase! } }
1608
1664
 
1609
1665
  GoodData.logger.warn("Importing users to project (#{pid})")
1666
+ new_users = new_users.map { |x| ((x.is_a?(Hash) && x[:user] && x[:user].to_hash.merge(role: x[:role])) || x.to_hash).tap { |u| u[:login].downcase! } }
1667
+ # First check that if groups are provided we have them set up
1668
+ user_groups_cache, change_groups = check_groups(new_users.map(&:to_hash).flat_map { |u| u[:user_group] || [] }.uniq, options[:user_groups_cache], options)
1610
1669
 
1611
- whitelisted_new_users, whitelisted_users = whitelist_users(new_users.map(&:to_hash), users_list, options[:whitelists])
1670
+ unless change_groups.empty?
1671
+ new_users.each do |user|
1672
+ user[:user_group].map! { |e| change_groups[e].nil? ? e : change_groups[e] }
1673
+ end
1674
+ end
1612
1675
 
1613
- # First check that if groups are provided we have them set up
1614
- user_groups_cache = check_groups(new_users.map(&:to_hash).flat_map { |u| u[:user_group] || [] }.uniq, options[:user_groups_cache], options)
1676
+ whitelisted_new_users, whitelisted_users = whitelist_users(new_users.map(&:to_hash), users_list, options[:whitelists])
1615
1677
 
1616
1678
  # conform the role on list of new users so we can diff them with the users coming from the project
1617
1679
  diffable_new_with_default_role = whitelisted_new_users.map do |u|
@@ -1758,7 +1820,20 @@ module GoodData
1758
1820
  def check_groups(specified_groups, user_groups_cache = nil, options = {})
1759
1821
  current_user_groups = user_groups if user_groups_cache.nil? || user_groups_cache.empty?
1760
1822
  groups = current_user_groups.map(&:name)
1761
- missing_groups = specified_groups - groups
1823
+ missing_groups = []
1824
+ change_groups = {}
1825
+ specified_groups.each do |group|
1826
+ found_group = groups.find { |name| name.casecmp(group).zero? }
1827
+ if found_group.nil?
1828
+ missing_groups << group
1829
+ else
1830
+ # Change groups when they have similar group name with difference of case sensitivity
1831
+ if found_group != group
1832
+ change_groups[group] = found_group
1833
+ GoodData.logger.warn("Group with name #{group} is existed in project with name #{found_group}.")
1834
+ end
1835
+ end
1836
+ end
1762
1837
  if options[:create_non_existing_user_groups]
1763
1838
  missing_groups.each do |g|
1764
1839
  GoodData.logger.info("Creating group #{g}")
@@ -1771,7 +1846,7 @@ module GoodData
1771
1846
  "#{groups.join(',')} and you asked for #{missing_groups.join(',')}"
1772
1847
  end
1773
1848
  end
1774
- current_user_groups
1849
+ [current_user_groups, change_groups]
1775
1850
  end
1776
1851
 
1777
1852
  # Update user
@@ -1902,6 +1977,20 @@ module GoodData
1902
1977
  [user, roles]
1903
1978
  end
1904
1979
 
1980
+ def upgrade_custom_v2(message, options = {})
1981
+ uri = "/gdc/md/#{pid}/datedimension/upgrade"
1982
+ poll_result = client&.post(uri, message)
1983
+
1984
+ return poll_result['wTaskStatus']['status'] if poll_result['wTaskStatus'] && poll_result['wTaskStatus']['status']
1985
+
1986
+ polling_uri = poll_result['asyncTask']['link']['poll']
1987
+ result = client&.poll_on_response(polling_uri, options) do |body|
1988
+ body && body['wTaskStatus'] && body['wTaskStatus']['status'] == 'RUNNING'
1989
+ end
1990
+
1991
+ result['wTaskStatus']['status'] == 'OK' ? 'OK' : 'FAIL'
1992
+ end
1993
+
1905
1994
  def add
1906
1995
  @add ||= GoodData::AutomatedDataDistribution.new(self)
1907
1996
  @add
@@ -1,51 +1,51 @@
1
- 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
- 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
- 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
- 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
- 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
- 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
- pVJC7ecS9LhO1I8L3cxSIBUW0UM8paoXy4XCvxeLtClGhU3gHCfHR9BE19D8
8
- 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
- x34ROjvgTRrHCTgGnzgof3OU/3dAIUohy6LYUhbFauxVLoekhEM3GsmEPP0D
10
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ThGBgynWNuVy6w4pTyku+RSztrV3JCTmWtNJwsmyGIE3fISC/xMQOtLIiBrJ
28
- n9Lhofa/coVkK2Ff5KoIPaU7kZ+67whLI0kD/2gV+NA1y0tiM4kEqw2IDaOX
29
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- +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
- bi1yTPovLT0HUYb5sRxuk/QV5YuoGy04bHoT5+beohnM5UjsKVIZsJ4XYqNM
40
- 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
- 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
- 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
- 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
- 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
- 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
- pnx62Eqe+NjshYyOGn56NW/u9nDyd6jrP+JTuQvx9QB5wU/Uc71Ac+d94v8I
47
- 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
- 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
- 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
- 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
- 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
@@ -1,109 +1,109 @@
1
- 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
- HuyYiXqhmXaI8+wfeMKX5KDGkawe1BE0WIdQ4mUifYSjB/Ub9zcvLsYANEZH
3
- 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
- cPKoh2R3/dyoq3N9hAxgy/CWgO5apYmK27k7zZWNuaLAV/Tghng8Hghn8jdH
5
- 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
- pe1MssCPAiajGpLWGl8h6+IwfZn7zjxdithqg+tkYJU6/xbPYVyBUaT9Eybn
7
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- f8lbnZxb7eTtEzLlQhu09BFxVYXdhJpRREYGbkLoMQpfs5aJrhpBLFGVTL4E
33
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- e6pd/+jX4oww0ZBKw0koEWECQb8TOMohZMwaFDPsujbfjXBylDIaeGmK9k4r
63
- ERMccmXZpHRe4ZFggCVBr7FyrddxEQnHOiMB86F8GBuFHeGhcu8XcrsJUMN9
64
- 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
- oiTFVlqow5CyHJIZNma6y6O8Q5fFilmU9i9B8NLbWVP23MeskuLCJN+jqROH
66
- 81k2Fjn8iNovpJ+RBwBthB6QKq13PAjVzngUvenEeTrwjEMBgEr41Y6NbVTh
67
- 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
- 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
- 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
- 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
- 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
- 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
- pTgcvnpQTMtpaMCb9nNg01uAqYuMq5gnXY4aPMq8/00k7cC4LL3zxOYh4I2q
74
- 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
- pF2lxGiZRrRJPOfc+37jNf9/vbMeBRi7iQv38BJUHCU3kxVb1Jl3VUeH+UUG
76
- UW/ESXjdTj6nkqlcqjAf3GpL16fjHlDC24c2iZCn0krM6y6qDkqfrtT1KLl3
77
- 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
- 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
- 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
- 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
- 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
- XS2ZcLAFaXme8wt7bnpWt80gjWdZsZe4wtnpj3YDS2rfgm2NNeDKYVJ1LcHO
83
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- aq1MfkaFyzOrHUtDbt/q7C+wNaRMl9tTcd944PEi8y4lV/d9f0k0JWEha8vK
95
- VPO+RMB/G/7lVsV+DzH/ey2GsDNlylHVfNapb66odd96nVBI3eWQeDy8kxbX
96
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
109
- 2Tt1yw==
1
+ TWYVbd9+V9bB8iGLKtbrOr1g7K+dH4j92VxvqwUUmXCXuIOAlYGPHB+1yzvA
2
+ KRH0a+ta8f8hmjYwEL1jYXVumH7NRNozMJm40TExkVMp75SegYYUD+p4bIQZ
3
+ dZI14e/454bK6DlvvX9h2uAQunPYlGToPYpogxhbcUa2urJi6ColQGCA7CtN
4
+ Jqs18sgRJ25FvrC8YqsiGsdNxun4c+7xyjybyVzHUdwuu0vNy9G7IB5HeSnc
5
+ iNZJxFQWITe3QOUNrxXZYuTnzEnwoq6orDDh+zp9X3I4vQYEsSjCB3KgyQvO
6
+ K4NXHAjSu/DuvrTNa1M+OVnZBjy8ymT7W4wO3EiFJyClVmgbjZJCWPrwmLXF
7
+ BSch0I0oy74rRr9pDM99IHlu/+ncYcyzuH5RhfhkM+JF1LVm9eFuAobaQCAR
8
+ 1nQ5o4M2c4mclz20LW1g7yopWK6jXw691NkqN6TN563pIw/6Z8uSw9XSi1Az
9
+ umwxjt3FeOHtNwt7iSIvJIjMqA/sri3+W1C0JmCwsWWnoczN7CYr+WyDC5om
10
+ tIaiw0PG0bqqKo+6l5vHbjh7pFYOOu+5v+croMh1gvkyMfznjpXLPkyeGIsL
11
+ 6rOZaF0hgG1aE/zupD95/ytnP7KEMH5PPIKRZQADZdaBkWvJrXBYCSBFd7n8
12
+ 2hpk5JJHUm9I9rTJHmngP1lGdvr6qCE6dckfvEKnQ5uW5hUUxEpdv58TCRPE
13
+ /cuPtT7Of4IBGAbYos0wnRIzXTTUjlhVsl4g+MpGEnKOmAkejoG6cqDiDzMX
14
+ aRqODWdhYvnjD0708uYgoLB9HBpTt+fAVztB11umC/u90XxS2LDhJLR4XXc7
15
+ kMApNb+LW1jB4S7msfqPRZ9h77f1oAxxY7ptCILr+bvF13kfHUCRMJZtgcqI
16
+ gEDw17trIQ1PjcbGYEAoSu77HjrooCD5MeytNLyVZe7WlGE5ZvJNuKxkjfX6
17
+ kbZIeioGgQ1+JUvg34wE6rmgX7O8wBYAv3BL7V27plhsroIiR+hu/LC7t1rP
18
+ eCfRQgZc9PyiKekp/n5RDr0TKbSSsEHuQRrfLq7kX4+DWMoDVJjbf8013JJO
19
+ a5O0irqsyw1E2XfeazrPN3Ba8Be8YaQ36zpCoFiOOkTBq4TbsjER2FNw2P54
20
+ Fvcyo5T69FH1fs3xpB67xtKXKtuMe967tUqzCgeXmpkh9Z+lmqPoE6mRRxGA
21
+ 9XyIbk88lOZQinMH4rivbnPnm5BlsdcvNZ58jTrxGvQKZUY9c5r2A61re2D6
22
+ zATT20F4I10IPoyh3+YdcqvybCXCnYiOqsU3UDX/LqfRSdl2dwj601g9YnXP
23
+ uURNyz36y3VQvY8F30RvPApXQ4RRMCKhw9Q6x+4Kwqd98F65EOxZBKTTfBcM
24
+ rRhXnwiRtCJjNhEbYiHJvRtV1+fsEcpEP2MsN08glGQ7idwrnvA4BmSxcGLi
25
+ 6oYLSQGmgxLoEpxMnJ2JFg9vKDrI2Jrsti7OW3az30dEt8TwzwSjXNBlmBzn
26
+ U7WtQmWrPvwi7709Y3rbztzE2GDGX2bTSS/nXNmFQlb5vwxMjkyHCh9gbTTn
27
+ Ozy8xrUzJr2R7RoOcvkWtVdUOINl1+O/DWcyxWML1L6BBokE4YW0zKl5ZKPo
28
+ 4FzhSfLXivSmT6WMBFp12KliDHhUK11bOSxeaSsxf+Db9cL0nu5bPWPNHUuB
29
+ tXR4XX34we4ocJDYOGZhw93h/BIyRtNbodBRAx72J+PBtC6J4N2vBmyEOsa0
30
+ yvuVhdA1BPRzREJV7zyKH77PGq731aUv+DdZvoN6HEoqko52gIPIBZue+NBl
31
+ g6SdpLpnvjk0P/HSGhWtYPsj5u2UhXqEDdS3f92aGi23qey9nSsD5ccGEYeN
32
+ WdxGove8HYXZ53p+lTS32IG8PHFqGJ3m6IFppn2FkOCIiXLfWKNIckECZgWC
33
+ VKMtTz2JuG+qgrPBF5V8J7/XT+mQ+Sa5sk8BL5FdG5wpi67DHFajAmoUu7UH
34
+ ekTgR2JSJvYseH2imt9F+n0ML8hdUdl8KlRs7CdPU97N6X+pz67tzSxA6jo5
35
+ lbE3Sx6pESbymHpZ/fcOvaX6anWnPZeCrmUPP5OsMEaxF8Wy8JVtm4atCDV1
36
+ 1q1BC6yPzJcACq0Ot+OgXzuGnvILdu1NiwRn1oUBxENWZmqY9nGSCuPZUTMS
37
+ zt7SSE3TeU/9JI0kvl1+sseM73SY/Ci1/h1hc7zgKSMjB/g/kwSMjiO5M6Aw
38
+ xF6uRjxzmjjRz45h0fVIvRTyIlGs/6ODcPfFmdkl9oT2m8Bypn8dYXBaXPks
39
+ CJT9gNdoaBZQUvZtPS3XLk0vZa7AtXjhnQ+2xfq5ijcMAKiphR+FfVUXQctQ
40
+ ttkZ8eHx03t0CYxRpIbacxX484H2kmE8vTkfe10BUw7AYlR6XAWdQb65J7vP
41
+ cWvnK+SKT8uuCDI22pqzlb21kPOqz6d9Bik8Kl1pX3a96ORXuS4ea1OjLiGm
42
+ h7HeYAfni6PalmR3yJ3c9gnqBkqhRgp0zz0PZ7bHxuCHCiQGU7VNekvK6TaL
43
+ ZcZsIpBr++s9s3g/m9KvLWVVFRo5U4bgiz06HLKHpYvd71w9TjKMdSqxZuPc
44
+ XWgHzjPsjYff8a9LFv1W5WFOvqIYruhAfs5d92v/hrrLGMY+MXmv23NC+4pL
45
+ 6jNUicdQt8+McJo2JoU4nm8AY206uK5iTlwiMSMxEbJeq4HUhzYZCmC5cLMJ
46
+ OHx1rXWxfPu35Qxfs/oXUkXr+zyBGbk6URvkApOifbhdQDQjJBgXzHr5Ye4R
47
+ 0b3r1SfKo9fL5JIgzvh7fipe0Stn2aUZmZRhEY/KEXGYDnkuSVs7a7ooMKwb
48
+ fCxUxsetuo9Hjf2SWn/tbvKFFpMel9B8BcqAnVed66lXCPxebwuI7frJ7KXg
49
+ 3M7eMhxDnF9ZKK79mMH4IoD0ayGpOq4Zqkxcea+IDCUlA+bzLgXDg3n9BlQS
50
+ Eyh+EUX4ZuWdWD/w71jLM62COnRo2RkVhdriBATUuJdehwD5vXhrhqns8+hm
51
+ nBNwnvNIluIuGU37UtNqq82r+PkTgPPbCHFjhqLcI7zAAb0o2l8hvOpWQ7sQ
52
+ RrIdpQUxSFhHNS/AZaNRQuI98KlsI09l2VPZdPtdt9cksbOpEsRWNo2C0CnC
53
+ qy1F+Rv3T5LaZQHxj96HyEHwgSGriJ4kWZ1T/O+qw51y9F+FkZgg5S+SXGfE
54
+ jBOhr8EzK9QXPB5xvEoD1pQ+g+hVmnu8S+37OB4jMfz9dI+4ulW8TzBxGtXq
55
+ RRaB1NpSKSHt3bJykNV+dGEAWa2menpN60DYcoUHgCwVP1zMujDafmVUVuzz
56
+ 1ghi0NXVCUMrziNubb0eDZJK0pYGW/8e+0aN58b/Z2NGubk4J0emlDwYX0GZ
57
+ GyK4rXXD7bv9bv+Urc9qJJy3M3CCKxVwkqQT5xTj2FHHPX/NcAtRdqTPI5/V
58
+ 2TVHLuRlmVebswGGHKVZxLFpBNpkoz1MgL75DtVgN/OcLyCMyheZ2mmcEu7h
59
+ aoZltaN4SCwmre4HzIoP1q0W3GhuZExEbIiwBEA7kCwOsk1Ri3sOGRdWUv/z
60
+ r6/HGE03SwjY6WsMCm9BNNa3PJfTgg12b0bIrEDHW5142iqJrO7u1/dSH89F
61
+ suOkxkQkWueQukrIYdpYfDcYmmK+96imikyPXfX8QcrfVn9DFOAsYEYP8Wtk
62
+ X2gMUg5R3H1V0PCZ/KQyDkwk5cYgffeZs22PE0NcA74DoeU+kHhrdS34b7Tm
63
+ SGHwbAWhMGqDKkGU0/ln4nEG/ic6meKQyYzolbJXA9DltGgnOPaRo8bW6VR2
64
+ 2q1qBuj1RMK/AJlDbxvGJemuiG9+yi8t6kj9VCksZvlVdl9TifsoV5LioKmz
65
+ JM6+1CM250MxbF2v+X6c7Y7EP3SnPP/iNn+fBJmO0sqPfx5vBWtR9/fzUcbx
66
+ eFTd2QMF2awo89No8qcv9sFONmbuL5AdjJ8MwlLO3s+C9I1NVHCAOwK1SeHP
67
+ roZJbgyaX/Thjxotxp+FxzltUqGSW/aG4J8OaFSQywSBHKCmNGfYaAlHRpot
68
+ fT8cpXZRJt2vBnyPtGqnLiy2kV/7BbetcAtD+hkseRKYTY6oBMuZKoErsLJi
69
+ X7tKehTw6Frl1ctvAIGk/Om0nbYMAGc71t7Q8BqDZQj3XK6GR2shMUjlxf28
70
+ A0b4s+iGecniGAicL/plMVNLcVvuoRaQJ9OZq0EKhnFDkVFnV/0D/HXQ36EQ
71
+ bAgvac3HhQ3ccuDe153Lq8oYLhuMa04UE2rbYBpUDZJeUAH9EVtnJms8SWJL
72
+ AafuOZxY4sFvKePsPUqogv2J/sNVdj1XQ4WtVWdR05YNYlAoDbhDo9cqJ2Tb
73
+ 3rUgnt4/lsWp7t6XafH8y0QaNR6w2T/0pb+WomaPG5QD8P7iyvFwSdPtDbPr
74
+ aVLSCX2gpJGYXxOxsA285BU45VhVYv8hafpr+wGOT+h9f+WRQtMyIHmEO1GQ
75
+ EXJXgK36F04DCgg8pyIPrUMRbEdm8inYrI4FzaINOjwi9ExhRisn6OG0jKpK
76
+ I28hbC2EVSq+/Mf6WCRReh8I0Ug5bodMYb/Ci3qJ7l6T0O4REF7gKp9a+zJJ
77
+ WkBuoO4TAi1GtjOZ6EBxNuCg48f0O2UcL0SfQGaOvRgOO/fcGgmJcPMrD4YE
78
+ 4H6OaqwoqBuh5V9o4gWu3W8chNXB80lN7bLZsrUJWWbSFWV0KEEhx5CHAOR2
79
+ yxsw+asqsaOGIXm4Xm0P2D3ZICt+GnWWtPv0vcrBoyJmCCgnin/DPnRvkh+r
80
+ P8OnrxDqWdu1kn0uJvXJKDn0hfbL3feE/SgdboUp73gGlwyh8ZeBB2SLc4O6
81
+ LFwO9dJKb9ubaSNTozXiEWwqJJLPgUQiyaYIz8WONxS7SlM6FHDU0aI/xuPR
82
+ FjFiBq3kh1AQ05Cq8f794Aqt9Rk0CnPsPsbr6yW0WicSk96D5M8E9jcTyYW7
83
+ i2ZWO8KLCJ9EqSBy4+XRfsjPRl8dK1twP9ka6C3c5raZ5Uf7mjxgcNtBoQTu
84
+ Br75NsC0G9ZFrGzkwspidQbT5WnH9AbZOH+vyGD7GbzccrgH09yuc5FkorGe
85
+ QGzrJrd+dL605MVXXY47vNMpc4U9Wi4cMg9wbiY/MUE0/Ua1i7gVlbpdQC2O
86
+ BZOhpj4ZP7NNtXYqKuCjnb5L7dnaniOP+Lfl7mYQyI/6d3g4oAIx4LakvgiK
87
+ ZRgJ6gbljblhJmbl8hWsjmFWE3WbT2OUVNVEHt4RcydOmyfj+gcJ82cqnKtb
88
+ WPSkaynz9NgU9QMO9dHAhTec1WWYOBlKONm4Did2KR90PGQ4hycUURjyL93C
89
+ u9cOWqxbewmR4JTH2VRSf0NBOqiSACy6TrsjnKVjeT2wKkD37uMQ8Czz9Pb+
90
+ 6YoUb8obFoQhipiVWArZnEgNZULm90XrgjrLVaDnnAb6nnwnVbFic2HJnVbc
91
+ jp4lKnkkAzEDbxdBHL4IpUBKyvCszxdM61IQVxOgUW87QyAZL2sBGR7Au51m
92
+ rjkgfKycPoYoc/p9VSEz+wG5mmm3fFcToCNt4iMDg4kLy31AjGotkBxriXgs
93
+ Dhy++DbU4hgUwQGdy0+e9dMx+DZMhLi0AHLg4Jyf7fQiyNrCIv5F+sbhuS9m
94
+ WQtgUGakqyZPXcg784XJqk8ggOjSu+EMtumrrZrcmpyTrMfquqFPwj0W/Irq
95
+ qGLs8iCIFOGXXd+7vvdk2FOK/i914/i9DD1qTzY4tK34X5iAgNmVhAkmNYCo
96
+ kFA7/bbIUmiZcFCUtvYAO6t/umatEUM+SB00xnxb6hTZyEqX9vvFbnFJTij6
97
+ /eqnCE1UZpdCcr54ptvJvWMrZVwVbduxFCPeoRHuK2e2TSI7Gi9pqWCuZysd
98
+ JSXCgl/5zL3rIXHq9kAIKNRpjbWYhFJq/K0X+KFo7rqU7WZAMjqSjKR5ft4A
99
+ Nf9aqX7+/yDwqCl4b4rhBjqg0OBpGqDvFq7nmUEOuZfOftdcFVulvfOddUMj
100
+ qGhLUV9GTG8qf7HuFmtx77WXlWmBmlhqNp2O1Q3rJ+f9Yv5ssYWJmvlDGvdC
101
+ fvya7lmf+0m61rIB9HdZO2gghjl0CbQ+djJaIJnfd35z2O8ON7uRFpQWGKJB
102
+ V0+MbJ9HuMdzEF+SykTZ2DmKZFREOW+8jBJ+9wQEk1lutjexxuGBFL6SM0Fb
103
+ Xgp7EAuoEiBO9AYux+2BEz7ZhMh0uQeUmVDmmTbjXP4yE6EP+taD5CDi7fmC
104
+ BfAb8a35zmwuz7RmKJ/yx+VBKPI+MmGTHfGzVkBvLy5kL/xXR7UMVs1GFxrI
105
+ 8qK6bUqE5gk77xuNGLYWpVn2H6ohrEnGQZpgQzeOy3YxrAXtWKg1KPlVLFxL
106
+ CVxBjkESJF9nMyuTiZShZY39c3J+yIKbkIS1dQewZWbyHu/QfXd8jjgaspVd
107
+ WP0TGtgm6qvyjH2SIdBUOH7oMQcZqDfvn444Rn6CkONnIPR2jduQ06cxuEkP
108
+ G+WK9s5CW/QFNZuyz8XIrv7s29r414jlpk2+vJNjWM95c0gHsCJ8BlSzNdXD
109
+ 3pSK3Q==