gam7 7.27.2__py3-none-any.whl → 7.27.4__py3-none-any.whl

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.

Potentially problematic release.


This version of gam7 might be problematic. Click here for more details.

gam/__init__.py CHANGED
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
25
25
  """
26
26
 
27
27
  __author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
28
- __version__ = '7.27.02'
28
+ __version__ = '7.27.04'
29
29
  __license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
30
30
 
31
31
  #pylint: disable=wrong-import-position
@@ -26776,14 +26776,14 @@ def getChatSpaceParameters(myarg, body, typeChoicesMap, updateMask):
26776
26776
 
26777
26777
  CHAT_MEMBER_ROLE_MAP = {
26778
26778
  'member': 'ROLE_MEMBER',
26779
- 'manager': 'ROLE_MANAGER',
26780
- 'owner': 'ROLE_OWNER',
26779
+ 'manager': 'ROLE_ASSISTANT_MANAGER',
26780
+ 'owner': 'ROLE_MANAGER',
26781
26781
  }
26782
26782
 
26783
26783
  CHAT_ROLE_ENTITY_TYPE_MAP = {
26784
26784
  'ROLE_MEMBER': Ent.CHAT_MEMBER_USER,
26785
- 'ROLE_MANAGER': Ent.CHAT_MANAGER_USER,
26786
- 'ROLE_OWNER': Ent.CHAT_OWNER_USER,
26785
+ 'ROLE_ASSISTANT_MANAGER': Ent.CHAT_MANAGER_USER,
26786
+ 'ROLE_MANAGER': Ent.CHAT_OWNER_USER,
26787
26787
  }
26788
26788
 
26789
26789
  CHAT_MEMBER_TYPE_MAP = {
@@ -26917,7 +26917,8 @@ CHAT_UPDATE_SPACE_TYPE_MAP = {
26917
26917
  }
26918
26918
 
26919
26919
  CHAT_SPACE_ROLE_PERMISSIONS_MAP = {
26920
- 'managers': 'managersAllowed',
26920
+ 'owners': 'managersAllowed',
26921
+ 'managers': 'assistantManagersAllowed',
26921
26922
  'members': 'membersAllowed',
26922
26923
  }
26923
26924
 
@@ -26937,13 +26938,13 @@ CHAT_UPDATE_SPACE_PERMISSIONS_MAP = {
26937
26938
  # [type space]
26938
26939
  # [description <String>] [guidelines|rules <String>]
26939
26940
  # [history <Boolean>])
26940
- # managemembersandgroups managers|members
26941
- # modifyspacedetails managers|members
26942
- # togglehistory managers|members
26943
- # useatmentionall managers|members
26944
- # manageapps managers|members
26945
- # managewebhooks managers|members
26946
- # replymessages managers|members
26941
+ # [managemembersandgroups owners|managers|members]
26942
+ # [modifyspacedetails owners|managers|members]
26943
+ # [togglehistory owners|managers|members]
26944
+ # [useatmentionall owners|managers|members]
26945
+ # [manageapps owners|managers|members]
26946
+ # [managewebhooks owners|managers|members]
26947
+ 2# [replymessages owners|managers|members]
26947
26948
  # [formatjson]
26948
26949
  def updateChatSpace(users):
26949
26950
  FJQC = FormatJSONQuoteChar()
@@ -26961,9 +26962,13 @@ def updateChatSpace(users):
26961
26962
  body.setdefault('permissionSettings', {})
26962
26963
  permissionSetting = CHAT_UPDATE_SPACE_PERMISSIONS_MAP[myarg]
26963
26964
  role = getChoice(CHAT_SPACE_ROLE_PERMISSIONS_MAP, mapChoice=True)
26964
- body['permissionSettings'][permissionSetting] = {'managersAllowed': True}
26965
+ body['permissionSettings'][permissionSetting] = {}
26966
+ body['permissionSettings'][permissionSetting][role] = True
26965
26967
  if role == 'membersAllowed':
26966
- body['permissionSettings'][permissionSetting].update({'membersAllowed': True})
26968
+ body['permissionSettings'][permissionSetting]['assistantManagersAllowed'] = True
26969
+ body['permissionSettings'][permissionSetting]['managersAllowed'] = True
26970
+ elif role == 'assistantManagersAllowed':
26971
+ body['permissionSettings'][permissionSetting]['managersAllowed'] = True
26967
26972
  updateMask.add(f'permissionSettings.{permissionSetting}')
26968
26973
  else:
26969
26974
  FJQC.GetFormatJSON(myarg)
@@ -27337,12 +27342,12 @@ def getGroupMemberID(cd, group, groupList):
27337
27342
  groupList.append(convertEmailAddressToUID(group, cd, emailType='group'))
27338
27343
 
27339
27344
  # gam <UserTypeEntity> create chatmember <ChatSpace>
27340
- # [type human|bot] [role member|manager]
27345
+ # [type human|bot] [role member|manager|owner]
27341
27346
  # (user <UserItem>)* (members <UserTypeEntity>)*
27342
27347
  # (group <GroupItem>)* (groups <GroupEntity>)*
27343
27348
  # [formatjson|returnidonly]
27344
27349
  # gam <UserItem> create chatmember asadmin <ChatSpace>
27345
- # [type human|bot] [role member|manager]
27350
+ # [type human|bot] [role member|manager|owner]
27346
27351
  # (user <UserItem>)* (members <UserTypeEntity>)*
27347
27352
  # (group <GroupItem>)* (groups <GroupEntity>)*
27348
27353
  # [formatjson|returnidonly]
@@ -27471,16 +27476,16 @@ def _deleteChatMembers(chat, kvList, jcount, memberNames, i, count, kwargsUAA):
27471
27476
  # gam <UserItem> remove chatmember asadmin
27472
27477
  # members <ChatMemberList>
27473
27478
  # gam <UserTypeEntity> update chatmember <ChatSpace>
27474
- # role member|manager
27479
+ # role member|manager|owner
27475
27480
  # ((user <UserItem>)|(members <UserTypeEntity>))+
27476
27481
  # gam <UserTypeEntity> modify chatmember
27477
- # role member|manager
27482
+ # role member|manager|owner
27478
27483
  # members <ChatMemberList>
27479
27484
  # gam <UserItem> update chatmember asadmin<ChatSpace>
27480
- # role member|manager
27485
+ # role member|manager|owner
27481
27486
  # ((user <UserItem>)|(members <UserTypeEntity>))+
27482
27487
  # gam <UserItem> modify chatmember asadmin
27483
- # role member|manager
27488
+ # role member|manager|owner
27484
27489
  # members <ChatMemberList>
27485
27490
  def deleteUpdateChatMember(users):
27486
27491
  cd = buildGAPIObject(API.DIRECTORY)
@@ -27574,7 +27579,7 @@ def deleteUpdateChatMember(users):
27574
27579
  CHAT_SYNC_PREVIEW_TITLES = ['space', 'member', 'role', 'action', 'message']
27575
27580
 
27576
27581
  # gam <UserTypeEntity> sync chatmembers [asadmin] <ChatSpace>
27577
- # [role member|manager] [type human|bot]
27582
+ # [role member|manager|owner] [type human|bot]
27578
27583
  # [addonly|removeonly]
27579
27584
  # [preview [actioncsv]]
27580
27585
  # (users <UserTypeEntity>)* (groups <GroupEntity>)*
@@ -44231,6 +44236,28 @@ USER_JSON_SKIP_FIELDS = ['agreedToTerms', 'aliases', 'creationTime', 'customerId
44231
44236
 
44232
44237
  ALLOW_EMPTY_CUSTOM_TYPE = 'allowEmptyCustomType'
44233
44238
 
44239
+ def getNotifyArguments(myarg, notify, userNotification):
44240
+ if myarg == 'notify':
44241
+ if userNotification:
44242
+ notify['recipients'].extend(getNormalizedEmailAddressEntity(shlexSplit=True, noLower=True))
44243
+ else: #delegateNotificatiomn
44244
+ notify['notify'] = getBoolean()
44245
+ elif myarg == 'subject':
44246
+ notify['subject'] = getString(Cmd.OB_STRING)
44247
+ elif myarg in SORF_MSG_FILE_ARGUMENTS:
44248
+ notify['message'], notify['charset'], notify['html'] = getStringOrFile(myarg)
44249
+ elif myarg == 'html':
44250
+ notify['html'] = getBoolean()
44251
+ elif myarg == 'from':
44252
+ notify['from'] = getString(Cmd.OB_EMAIL_ADDRESS)
44253
+ elif myarg == 'mailbox':
44254
+ notify['mailbox'] = getString(Cmd.OB_EMAIL_ADDRESS)
44255
+ elif myarg == 'replyto':
44256
+ notify['replyto'] = getString(Cmd.OB_EMAIL_ADDRESS)
44257
+ else:
44258
+ return False
44259
+ return True
44260
+
44234
44261
  def getUserAttributes(cd, updateCmd, noUid=False):
44235
44262
  def getKeywordAttribute(keywords, attrdict, **opts):
44236
44263
  if Cmd.ArgumentsRemaining():
@@ -44346,22 +44373,10 @@ def getUserAttributes(cd, updateCmd, noUid=False):
44346
44373
  resolveConflictAccount = True
44347
44374
  while Cmd.ArgumentsRemaining():
44348
44375
  myarg = getArgument()
44349
- if myarg == 'notify':
44350
- notify['recipients'].extend(getNormalizedEmailAddressEntity(shlexSplit=True, noLower=True))
44376
+ if getNotifyArguments(myarg, notify, True):
44377
+ pass
44351
44378
  elif myarg == 'notifyrecoveryemail':
44352
44379
  parameters['notifyRecoveryEmail'] = True
44353
- elif myarg == 'subject':
44354
- notify['subject'] = getString(Cmd.OB_STRING)
44355
- elif myarg in SORF_MSG_FILE_ARGUMENTS:
44356
- notify['message'], notify['charset'], notify['html'] = getStringOrFile(myarg)
44357
- elif myarg == 'html':
44358
- notify['html'] = getBoolean()
44359
- elif myarg == 'from':
44360
- notify['from'] = getString(Cmd.OB_EMAIL_ADDRESS)
44361
- elif myarg == 'replyto':
44362
- notify['replyto'] = getString(Cmd.OB_EMAIL_ADDRESS)
44363
- elif myarg == 'mailbox':
44364
- notify['mailbox'] = getString(Cmd.OB_EMAIL_ADDRESS)
44365
44380
  elif PwdOpts.ProcessArgument(myarg, notify, notFoundBody):
44366
44381
  pass
44367
44382
  elif _getTagReplacement(myarg, tagReplacements, True):
@@ -44767,12 +44782,12 @@ def createUserAddAliases(cd, user, aliasList, i, count):
44767
44782
  # [license <SKUID> [product|productid <ProductID>]]
44768
44783
  # [[notify <EmailAddressList>] [notifyrecoveryemail]
44769
44784
  # [subject <String>]
44770
- # [notifypassword <String>]
44771
- # [from <EmailAaddress>]
44785
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
44772
44786
  # [replyto <EmailAaddress>]
44773
- # [<NotifyMessageContent>]
44774
- # (replace <Tag> <UserReplacement>)*
44775
- # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44787
+ # [notifypassword <String>]
44788
+ # [<NotifyMessageContent>] [html [<Boolean>]]
44789
+ # (replace <Tag> <UserReplacement>)*
44790
+ # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44776
44791
  # [logpassword <FileName>] [ignorenullpassword]
44777
44792
  # [addnumericsuffixonduplicate <Number>]
44778
44793
  def doCreateUser():
@@ -44871,12 +44886,12 @@ def verifyUserPrimaryEmail(cd, user, createIfNotFound, i, count):
44871
44886
  # [alias|aliases <EmailAddressList>]
44872
44887
  # [[notify <EmailAddressList>] [notifyrecoveryemail]
44873
44888
  # [subject <String>]
44874
- # [notifypassword <String>]
44875
- # [from <EmailAaddress>]
44889
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
44876
44890
  # [replyto <EmailAaddress>]
44877
- # [<NotifyMessageContent>
44891
+ # [<NotifyMessageContent> [html [<Boolean>]]
44878
44892
  # (replace <Tag> <UserReplacement>)*
44879
44893
  # (replaceregex <REMatchPattern> <RESubstitution> <Tag> <UserReplacement>)*]
44894
+ # [notifypassword <String>]]
44880
44895
  # [notifyonupdate [<Boolean>]]
44881
44896
  # [logpassword <FileName>] [ignorenullpassword]
44882
44897
  def updateUsers(entityList):
@@ -73918,14 +73933,58 @@ def printShowMessages(users):
73918
73933
  def printShowThreads(users):
73919
73934
  printShowMessagesThreads(users, Ent.THREAD)
73920
73935
 
73936
+ def sendCreateDelegateNotification(user, delegate, basenotify, i=0, count=0, msgFrom=None):
73937
+ # Substitute for #user#, #delegate#
73938
+ def _substituteForPattern(field, pattern, value):
73939
+ if field.find('#') == -1:
73940
+ return field
73941
+ return field.replace(pattern, value)
73942
+
73943
+ def _makeSubstitutions(field):
73944
+ notify[field] = _substituteForPattern(notify[field], '#user#', user)
73945
+ notify[field] = _substituteForPattern(notify[field], '#delegate#', delegate)
73946
+
73947
+ notify = basenotify.copy()
73948
+ if not notify['subject']:
73949
+ notify['subject'] = Msg.CREATE_DELEGATE_NOTIFY_SUBJECT
73950
+ _makeSubstitutions('subject')
73951
+ if not notify['message']:
73952
+ notify['message'] = Msg.CREATE_DELEGATE_NOTIFY_MESSAGE
73953
+ elif notify['html']:
73954
+ notify['message'] = notify['message'].replace('\r', '').replace('\\n', '<br/>')
73955
+ else:
73956
+ notify['message'] = notify['message'].replace('\r', '').replace('\\n', '\n')
73957
+ _makeSubstitutions('message')
73958
+ if 'from' in notify:
73959
+ msgFrom = notify['from']
73960
+ msgReplyTo = notify.get('replyto', None)
73961
+ mailBox = notify.get('mailbox', None)
73962
+ send_email(notify['subject'], notify['message'], delegate, i, count,
73963
+ msgFrom=msgFrom, msgReplyTo=msgReplyTo, html=notify['html'], charset=notify['charset'], mailBox=mailBox)
73964
+
73921
73965
  # gam <UserTypeEntity> create delegate|delegates [convertalias] <UserEntity>
73966
+ # [notify [<Boolean>]
73967
+ # [subject <String>]
73968
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
73969
+ # [replyto <EmailAaddress>]
73970
+ # [<NotifyMessageContent>] [html [<Boolean>]]
73971
+ # ]
73922
73972
  # gam <UserTypeEntity> delete delegate|delegates [convertalias] <UserEntity>
73923
73973
  def processDelegates(users):
73924
73974
  cd = buildGAPIObject(API.DIRECTORY)
73925
- function = 'delete' if Act.Get() == Act.DELETE else 'create'
73975
+ createCmd = Act.Get() != Act.DELETE
73926
73976
  aliasAllowed = not checkArgumentPresent(['convertalias'])
73927
73977
  delegateEntity = getUserObjectEntity(Cmd.OB_USER_ENTITY, Ent.DELEGATE)
73928
- checkForExtraneousArguments()
73978
+ notify = {'notify': False, 'subject': '', 'message': '', 'html': False, 'charset': UTF8}
73979
+ if createCmd:
73980
+ while Cmd.ArgumentsRemaining():
73981
+ myarg = getArgument()
73982
+ if getNotifyArguments(myarg, notify, False):
73983
+ pass
73984
+ else:
73985
+ unknownArgumentExit()
73986
+ else:
73987
+ checkForExtraneousArguments()
73929
73988
  i, count, users = getEntityArgument(users)
73930
73989
  for user in users:
73931
73990
  i += 1
@@ -73937,25 +73996,37 @@ def processDelegates(users):
73937
73996
  for delegate in delegates:
73938
73997
  j += 1
73939
73998
  delegateEmail = convertUIDtoEmailAddress(delegate, cd=cd, emailTypes=['user', 'group'], aliasAllowed=aliasAllowed)
73999
+ kvList = [Ent.USER, user, Ent.DELEGATE, delegateEmail]
73940
74000
  try:
73941
- if function == 'create':
73942
- callGAPI(gmail.users().settings().delegates(), function,
74001
+ if createCmd:
74002
+ callGAPI(gmail.users().settings().delegates(), 'create',
73943
74003
  throwReasons=GAPI.GMAIL_THROW_REASONS+[GAPI.ALREADY_EXISTS, GAPI.FAILED_PRECONDITION, GAPI.INVALID,
73944
74004
  GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
73945
74005
  userId='me', body={'delegateEmail': delegateEmail})
74006
+ entityActionPerformed(kvList, j, jcount)
74007
+ if notify['notify']:
74008
+ Ind.Increment()
74009
+ sendCreateDelegateNotification(user, delegateEmail, notify, j, jcount)
74010
+ Ind.Decrement()
73946
74011
  else:
73947
- callGAPI(gmail.users().settings().delegates(), function,
74012
+ callGAPI(gmail.users().settings().delegates(), 'delete',
73948
74013
  throwReasons=GAPI.GMAIL_THROW_REASONS+[GAPI.NOT_FOUND, GAPI.INVALID_INPUT, GAPI.PERMISSION_DENIED],
73949
74014
  userId='me', delegateEmail=delegateEmail)
73950
- entityActionPerformed([Ent.USER, user, Ent.DELEGATE, delegateEmail], j, jcount)
74015
+ entityActionPerformed(kvList, j, jcount)
73951
74016
  except (GAPI.alreadyExists, GAPI.failedPrecondition, GAPI.invalid,
73952
74017
  GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
73953
- entityActionFailedWarning([Ent.USER, user, Ent.DELEGATE, delegateEmail], str(e), j, jcount)
74018
+ entityActionFailedWarning(kvList, str(e), j, jcount)
73954
74019
  except GAPI.serviceNotAvailable:
73955
74020
  userGmailServiceNotEnabledWarning(user, i, count)
73956
74021
  Ind.Decrement()
73957
74022
 
73958
74023
  # gam <UserTypeEntity> delegate to [convertalias] <UserEntity>
74024
+ # [notify [<Boolean>]
74025
+ # [subject <String>]
74026
+ # [from <EmailAaddress>] [mailbox <EmailAddress>]
74027
+ # [replyto <EmailAaddress>]
74028
+ # [<NotifyMessageContent>] [html [<Boolean>]]
74029
+ # ]
73959
74030
  def delegateTo(users):
73960
74031
  checkArgumentPresent('to', required=True)
73961
74032
  processDelegates(users)
gam/gamlib/glmsgs.py CHANGED
@@ -224,6 +224,8 @@ COUNT_N_EXCEEDS_MAX_TO_PROCESS_M = 'Count {0} exceeds maximum to {1} {2}'
224
224
  CORRUPT_FILE = 'Corrupt file'
225
225
  COULD_NOT_FIND_ANY_YUBIKEY = 'Could not find any YubiKey\n'
226
226
  COULD_NOT_FIND_YUBIKEY_WITH_SERIAL = 'Could not find YubiKey with serial number {0}\n'
227
+ CREATE_DELEGATE_NOTIFY_MESSAGE = '#user# has granted you #delegate# access to read, delete and send mail on their behalf.'
228
+ CREATE_DELEGATE_NOTIFY_SUBJECT = '#user# mail delegation to #delegate#'
227
229
  CREATE_USER_NOTIFY_MESSAGE = 'Hello #givenname# #familyname#,\n\nYou have a new account at #domain#\nAccount details:\nUsername: #user#\nPassword: #password#\nStart using your new account by signing in at\nhttps://www.google.com/accounts/AccountChooser?Email=#user#&continue=https://workspace.google.com/dashboard\n'
228
230
  CREATE_USER_NOTIFY_SUBJECT = 'Welcome to #domain#'
229
231
  CSV_DATA_ALREADY_SAVED = 'CSV data already saved'
@@ -516,7 +518,7 @@ To set up Google Chat for your current project, please go to:
516
518
 
517
519
  and follow the instructions at:
518
520
 
519
- https://github.com/GAM-team/GAM/wiki/Chat-Bot#set-up-a-chat-bot
521
+ https://github.com/GAM-team/GAM/wiki/Chat-Bot-Setup-Use#set-up-a-chat-bot
520
522
 
521
523
  You'll use projects/{1}/topics/no-topic in Connection settings Cloud Pub/Sub Topic Name
522
524
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.27.2
3
+ Version: 7.27.4
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,4 +1,4 @@
1
- gam/__init__.py,sha256=EnUSCJAWtV0XmDfyv9xGnFy-aorEW7h6vw8zGpxR_5g,3626766
1
+ gam/__init__.py,sha256=ezWRtUli0pIMM9dMgTN_FzHCzS5NalnUjOQRio_zJmo,3629588
2
2
  gam/__main__.py,sha256=VwEYS7a9vYQPbT6iLduMOoVUJ6p4R-HZgerZQmM1NpE,1307
3
3
  gam/cacerts.pem,sha256=DUsVo2XlFYwfkhe3gnxa-Km4Z4noz74hSApXwTT-nQE,44344
4
4
  gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
@@ -30,7 +30,7 @@ gam/gamlib/glgapi.py,sha256=pdBbwNtnCwFWxJGaP-_3hdTjSNoOCJF2yo76WdQOi1k,40426
30
30
  gam/gamlib/glgdata.py,sha256=weRppttWm6uRyqtBoGPKoHiNZ2h28nhfUV4J_mbCszY,2707
31
31
  gam/gamlib/glglobals.py,sha256=U1eCXHOkWAtwVXG8-0HL4ZzQP0YcbeFlhJxbOa_x1QI,9804
32
32
  gam/gamlib/glindent.py,sha256=RfBa2LDfLIqPLL5vMfC689TCVmqn8xf-qulSzkiatrc,1228
33
- gam/gamlib/glmsgs.py,sha256=ODq-KS3jhXH5DB5DEo6eCX1DHhy4OGv_jeQjiLVPOHM,34049
33
+ gam/gamlib/glmsgs.py,sha256=TkLg6p8o9elVIbe_4Kq0hac6qSM-qoIMuQvXoEn4Q_c,34254
34
34
  gam/gamlib/glskus.py,sha256=29vlBLBJCL4u9GawCt3eNeZq9HQG3hGFZk9-EainNng,15384
35
35
  gam/gamlib/gluprop.py,sha256=IyPLCyvn7-NHTUenM71YPQPXRZXx6CB5q-GtJ-FYd1c,11461
36
36
  gam/gamlib/glverlibs.py,sha256=mDphdXVN_dJlGUVGuLqOEA3yHBNBeqRV4DRoTX7Wl7A,982
@@ -47,8 +47,8 @@ gam/gdata/apps/audit/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrK
47
47
  gam/gdata/apps/audit/service.py,sha256=Z1eueThcNeVUMWP1DRWc_DGHrJCiJI8W_xj6L-cqu-Q,9658
48
48
  gam/gdata/apps/contacts/__init__.py,sha256=Um6zgIkiahZns7yAEuC3pxHSMD8iciZ_EoynSLoYPfU,30463
49
49
  gam/gdata/apps/contacts/service.py,sha256=5lNb-Ii1Gyek6ePFji3kyoYtCBc8CuJTwagx2BL2o14,15684
50
- gam7-7.27.2.dist-info/METADATA,sha256=Bi9nZmwHkfkhYgAivixqTujoA2nZIbM8pSWz9W2yFy4,3093
51
- gam7-7.27.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
- gam7-7.27.2.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
- gam7-7.27.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
- gam7-7.27.2.dist-info/RECORD,,
50
+ gam7-7.27.4.dist-info/METADATA,sha256=xxXl0dxVoU3Qr_D_k38_AeeyLfP0smoiVPSFbIcSpzs,3093
51
+ gam7-7.27.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
+ gam7-7.27.4.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
53
+ gam7-7.27.4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
+ gam7-7.27.4.dist-info/RECORD,,
File without changes