Download Dialog
artur <[email protected]> Sun, 04 Apr 2010 23:29:05 +0200
| Newsgroups | gmane.network.freenet.frost.devel |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------020005070500060907010304
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Hi,
I found some time to do some more coding,.. here are the results:
When adding a new downloads from a post (keys or attachments) a dialog
will open, where the items can be attributed (currently download dir and
priority). This dialog also states if the file has already been
downloaded (download tracking) or if a file with the same name already
exists in the download target directory.
This patch also enables the tracking from which post / board a download
was originated. Combined with a new setting (when enabled) the download
directory will default to a subdirectory of the default download
directory with the board name. If the target download directory does not
already exist, it will be created.
I attach the langres.properties file, too, because it is not part of the
patch.
(Can someone remove the octetstream property of this file? Since it is
no longer needed for svn...)
The patch is against the new trunk...
Cheers
artur
--------------020005070500060907010304
Content-Type: text/plain;
name="langres.properties"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="langres.properties"
AboutBox.label.openSourceProject=Open Source Project (GPL license)
AboutBox.label.version=Version
AboutBox.text.development=Development:
AboutBox.text.miscCodeContributions=Misc code contributions:
AboutBox.text.splashScreenLogo=Splash Screen Logo:
AboutBox.text.systemTrayExecutables=System Tray Executables:
AboutBox.text.translationSupport=Translation Support:
AboutBox.text.windowsInstaller=Windows Installer:
AboutBox.title=About
AddNewDownloadsDialog.title=Add new Files to download list
AddNewDownloadsDialog.button.changeDownloadDir=Change download target directory
AddNewDownloadsDialog.button.removeDownload=Remove
AddNewDownloadsDialog.changeDirDialog.title=Change target Directory
AddNewDownloadsDialog.table.name=Name
AddNewDownloadsDialog.table.key=Key
AddNewDownloadsDialog.table.priority=Priority
AddNewDownloadsDialog.table.downloadDir=Download Directory
AddNewDownloadsDialog.table.comment=Comment
AddNewDownloadsDialog.table.alreadyDownloaded=File downloaded previously
AddNewDownloadsDialog.table.alreadyDownloadedName=File with same name downloaded previously
AddNewDownloadsDialog.table.alreadyExists=File already exists in Download Directory
AltEdit.errorDialog.couldNotCreateMessageFile=Could not create message file for alternate editor
AltEdit.errorDialog.couldNotStartEditorUsingCommand=Could not start alternate editor using command
AltEdit.errorDialog.invalidReturnedMessageFile=The message file returned by the alternate editor is invalid.
AltEdit.errorDialog.missingPlaceholder=Configured alternate editor line must contain a '%f' as placeholder for the filename.
AltEdit.errorDialog.noAlternateEditorConfigured=No alternate editor configured.
AltEdit.errorDialogs.title=Error
AltEdit.markerLine.subject=*--- Subject line (changeable) ---*
AltEdit.markerLine.text=*--- Enter your text after this line ---*
AltEdit.textFileMessage.1=>>> This is a Frost alternate editor message file. <<<
AltEdit.textFileMessage.2=>>> You can edit the subject and add text at the end of the file. <<<
AltEdit.textFileMessage.3=>>> Don't change or delete the marker lines! <<<
Board.boardState.invalid=(INVALID, no public key, but private!)
Board.boardState.publicBoard=public board
Board.boardState.readAccess=read access
Board.boardState.writeAccess=write access
BoardInfoFrame.button.close=Close
BoardInfoFrame.button.update=Update view
BoardInfoFrame.button.updateAllBoards=Update all boards
BoardInfoFrame.button.updateSelectedBoard=Update selected boards
BoardInfoFrame.button.removeSelectedBoards=Remove selected boards
BoardInfoFrame.label.boards=Boards
BoardInfoFrame.label.messages=Messages
BoardInfoFrame.popupMenu.copyInfoToClipboard=Copy information to clipboard
BoardInfoFrame.table.board=Board
BoardInfoFrame.table.messages=Messages
BoardInfoFrame.table.messagesToday=Today
BoardInfoFrame.table.messagesFlagged=Flagged
BoardInfoFrame.table.messagesStarred=Starred
BoardInfoFrame.table.messagesUnread=Unread
BoardInfoFrame.table.lastMsgDate=Last Msg
BoardInfoFrame.table.state=State
BoardInfoFrame.title=Board information window
BoardsChooser.title=Choose boards
BoardSettings.button.generateNewKeypair=Generate new keypair
BoardSettings.generateKeyPairErrorDialog.title=Warning
BoardSettings.label.description=Description:
BoardSettings.label.enableAutomaticBoardUpdate=Enable automatic board update
BoardSettings.label.hideBadMessages=Hide messages flagged BAD
BoardSettings.label.hideCheckMessages=Hide messages flagged CHECK
BoardSettings.label.hideObserveMessages=Hide messages flagged OBSERVE
BoardSettings.label.hideUnsignedMessages=Hide unsigned messages
BoardSettings.label.maximumMessageDisplay=Number of days to display
BoardSettings.label.maximumMessageDownload=Number of days to download backwards
BoardSettings.label.no=No
BoardSettings.label.overrideDefaultSettings=Override default settings
BoardSettings.label.privateKey=Private key
BoardSettings.label.publicBoard=Public board
BoardSettings.label.publicKey=Public key
BoardSettings.label.secureBoard=Secure board
BoardSettings.label.setTo=Set to
BoardSettings.label.storeSentMessages=Save sent messages
BoardSettings.label.useDefault=Use default
BoardSettings.label.yes=Yes
BoardSettings.label.hideMessageCountDisplay=Hide messages from identities with fewer than X received messages (0 disables)
BoardSettings.looseKeysWarningDialog.body=If you set this board as public, you will lose its keys. Are you sure you want to do that?
BoardSettings.looseKeysWarningDialog.title=Set Board as Public?
BoardSettings.text.keyNotAvailable=Not available
BoardSettings.title.boardSettings=Settings for board
BoardSettings.title.folderSettings=Settings for all boards in folder
BoardTree.duplicateNewBoardNameError.body=You already have a board with name ''{0}''!\nPlease choose a new name.
BoardTree.duplicateNewBoardNameError.title=Duplicate board name
BoardTree.newFolderDialog.body=Please enter a name for the new folder
BoardTree.newFolderDialog.defaultName=newFolder
BoardTree.newFolderDialog.title=New Folder Name
BoardTree.overWriteBoardConfirmation.body=You already have a board with name ''{0}''!\nDo you really want to overwrite it?\n(This will not delete messages)
BoardTree.overWriteBoardConfirmation.title=Overwrite existing board
BoardTree.popupmenu.addNewBoard=Add new board
BoardTree.popupmenu.addNewFolder=Add new folder
BoardTree.popupmenu.board=board
BoardTree.popupmenu.Board=Board
BoardTree.popupmenu.configureSelectedBoard=Configure selected board
BoardTree.popupmenu.configureSelectedFolder=Configure selected folder
BoardTree.popupmenu.cut=Cut
BoardTree.popupmenu.Folder=Folder
BoardTree.popupmenu.folder=folder
BoardTree.popupmenu.markAllMessagesRead=Mark ALL messages read
BoardTree.popupmenu.paste=Paste
BoardTree.popupmenu.refresh=Refresh
BoardTree.popupmenu.remove=Remove
BoardTree.popupmenu.renameFolder=Rename folder
BoardTree.popupmenu.searchMessages=Search this board
BoardTree.popupmenu.sendMessage=Send message
BoardTree.popupmenu.sortFolder=Sort folder
BoardTree.removeBoardConfirmation.body=Do you really want to delete board ''{0}'' ? All messages in this board will be deleted too.
BoardTree.removeBoardConfirmation.title=Remove board ''{0}''
BoardTree.removeFolderConfirmation.body=Do you really want to delete folder ''{0}'' ?\nNOTE: Removing it will also remove all boards, folders and messages inside this folder!
BoardTree.removeFolderConfirmation.title=Remove folder ''{0}''
Common.browse=Browse
Common.cancel=Cancel
Common.copy=Copy
Common.copyToClipBoard.copyExtendedInfo=Copy extended info
Common.copyToClipBoard.copyKeysWithFilenames=Copy keys with filenames
Common.copyToClipBoard.extendedInfo.bytes=Bytes:
Common.copyToClipBoard.extendedInfo.file=File :
Common.copyToClipBoard.extendedInfo.key=Key :
Common.copyToClipBoard.extendedInfo.keyNotAvailableYet=Key not available yet
Common.copyToClipBoard=Copy to clipboard
Common.cut=Cut
Common.details=Details
Common.exit=Exit
Common.ignoreMessagesOfThisType=Ignore such messages
Common.ok=Ok
Common.paste=Paste
Common.priority.changePriority=Change priority
Common.priority.priority0=0 (maximum)
Common.priority.priority1=1
Common.priority.priority2=2
Common.priority.priority3=3 (recommended)
Common.priority.priority4=4
Common.priority.priority5=5
Common.priority.priority6=6 (pause)
Common.properties=Properties
Common.suppressConfirmationCheckbox=Show this dialog the next time
Core.init.NodeNotRunningBody=Make sure your node is running and that you have configured Freenet correctly.\nNevertheless, to allow you to read messages, Frost will startup now.\nPlease note that automatic board updates were disabled (Menu 'News')!\nDon't get confused by some error messages ;)\n
Core.init.NodeNotRunningTitle=Error - could not establish a connection to freenet node.
Core.init.TestnetWarningBody=Your freenet node runs in TESTNET mode, no anonymity is provided!
Core.init.TestnetWarningTitle=Freenet node in TESTNET mode
Core.init.UnsupportedFreenetVersionBody=Freenet version is not supported
Core.init.UnsupportedFreenetVersionTitle=Freenet version is not supported
Core.init.FileSharingEnabledBody=Filesharing is enabled. It is vulnerable to spamming and disabling it is highly recommended.\nLeaving it enabled will gradually increase the time it takes to start up Frost (due to filelist.dbs being flooded with junk) and increase both resource and bandwidth usage.\n\nIf you choose to disable it, you should exit Frost and remove filelist.dbs to free up some disk space and decrease startup times.
Core.init.FileSharingEnabledTitle=Filesharing enabled
Core.loadIdentities.ChooseName=Choose an identity name, it doesn't have to be unique\n
Core.loadIdentities.InvalidNameBody=The name is invalid, please choose another name.
Core.loadIdentities.InvalidNameTitle=Invalid identity name
DialogWithDetails.button.less=Less
DialogWithDetails.button.more=More
DownloadPane.fileTable.blocks=Blocks
DownloadPane.fileTable.enabled=Enabled
DownloadPane.fileTable.filename=Filename
DownloadPane.fileTable.isDDA.tooltip=Indicates if the file is stored by the node to the target file.
DownloadPane.fileTable.isDDA=DDA
DownloadPane.fileTable.key=Key
DownloadPane.fileTable.downloadDir=Download directory
DownloadPane.fileTable.lastReceived=Last seen
DownloadPane.fileTable.lastUploaded=Last uploaded
DownloadPane.fileTable.popupmenu.enableDownloads.disableAllDownloads=Disable all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.disableSelectedDownloads=Disable selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads.enableAllDownloads=Enable all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.enableSelectedDownloads=Enable selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads.invertEnabledStateForAllDownloads=Invert enabled state for all downloads
DownloadPane.fileTable.popupmenu.enableDownloads.invertEnabledStateForSelectedDownloads=Invert enabled state for selected downloads
DownloadPane.fileTable.popupmenu.enableDownloads=Enable downloads
DownloadPane.fileTable.popupmenu.remove.removeSelectedDownloads=Remove selected downloads
DownloadPane.fileTable.popupmenu.remove=Remove
DownloadPane.fileTable.popupmenu.removeFromGlobalQueue=Remove from global queue
DownloadPane.fileTable.popupmenu.restartSelectedDownloads=Restart selected downloads
DownloadPane.fileTable.popupmenu.retrieveDirectExternalDownloads=Retrieve direct external downloads into download directory
DownloadPane.fileTable.popupmenu.startSelectedDownloadsNow=Start selected downloads immediately
DownloadPane.fileTable.popupmenu.useThisDownloadDir=Use this download directory
DownloadPane.fileTable.popupmenu.jumpToAssociatedMessage=View associated message
DownloadPane.fileTable.priority=Priority
DownloadPane.fileTable.requested.tooltip=If an icon is shown then this file was requested in the last 24 hours by us or someone else.
DownloadPane.fileTable.requested=File requested
DownloadPane.fileTable.shared.tooltip=An icon indicates a shared file.
DownloadPane.fileTable.shared=Shared file
DownloadPane.fileTable.size=Size
DownloadPane.fileTable.state=State
DownloadPane.fileTable.states.decodingSegment=Decoding segment
DownloadPane.fileTable.states.done=Done
DownloadPane.fileTable.states.downloading=Downloading
DownloadPane.fileTable.states.failed=Failed
DownloadPane.fileTable.states.trying=Trying
DownloadPane.fileTable.states.unknown=Unknown
DownloadPane.fileTable.states.waiting=Waiting
DownloadPane.fileTable.tries=Tries
DownloadPane.invalidKeyDialog.body=Invalid freenet key: {0}
DownloadPane.invalidKeyDialog.title=Invalid key
DownloadPane.alreadyTrackedDialog.title=Key already downloaded
DownloadPane.alreadyTrackedDialog.body=The key has already been downloaded previously:\n{0}\n\nDo you want to download it again?
DownloadPane.removeFinishedDownloads=Remove finished
DownloadPane.showExternalGlobalQueueItems=Show global queue
DownloadPane.toolbar.tooltip.activateDownloading=Activate downloading
DownloadPane.toolbar.tooltip.addKeys=Quickload: enter or paste keys to download, separated by a semicolon ; or one key per line
DownloadPane.toolbar.tooltip.pasteKeys=Add keys from clipboard
DownloadPane.toolbar.tooltip.downloadPrefix=Filename prefix
DownloadPane.toolbar.tooltip.downloadDir=Default download directory for keys added through the quickload text field
DownloadPane.toolbar.tooltip.applyDownloadPrefix=Set download filename prefix for selected files
DownloadPane.toolbar.tooltip.selectDownloadDir=Browse for download directory
DownloadPane.toolbar.tooltip.createDownloadDir=Create directory
DownloadPane.toolbar.tooltip.applyDownloadDir=Set download directory for selected files
DownloadPane.toolbar.tooltip.pauseDownloading=Pause downloading
DownloadPane.toolbar.waiting=Waiting
DownloadPane.toolbar.label.downloadQuickload=Quickload
DownloadPane.toolbar.label.downloadPrefix=Prefix
DownloadPane.toolbar.label.downloadDir=Directory
DownloadPane.toolbar.downloadDirMenu.setDownloadDirTo=Set to...
FileAttachmentUploadThread.fileNotFoundError.text=The message that is currently send (maybe a send retry on next startup of Frost)\ncontains a file attachment that does not longer exist, or it is a 0 byte file!\n\nThe send of the message was aborted and the message file was deleted\nto prevent another upload try on next startup of Frost.\nFile: {0}
FileAttachmentUploadThread.fileNotFoundError.title=Unrecoverable error
FileListFileDetailsDialog.button.close=Close
FileListFileDetailsDialog.popupmenu.searchFilesOfOwner=Search for files of owner
FileListFileDetailsDialog.table.comment=Comment
FileListFileDetailsDialog.table.filename=Filename
FileListFileDetailsDialog.table.key=Key
FileListFileDetailsDialog.table.keywords=Keywords
FileListFileDetailsDialog.table.lastReceived=Last seen
FileListFileDetailsDialog.table.lastUploaded=Last upload
FileListFileDetailsDialog.table.owner=Owner
FileListFileDetailsDialog.table.rating=Rating
FileListFileDetailsDialog.table.state.never=Never
FileListFileDetailsDialog.table.state.unknown=Unknown
FileListFileDetailsDialog.table.trustState=Trust state
FileListFileDetailsDialog.title=File details
FirstStartupDialog.welcomeText.label=<html><br><font size="+2"><center><b>Welcome to Frost!</b></center></font><br><br>Frost will now connect to a Freenet 0.7 node.<br>By default Frost connects to a node on localhost<br>using the standard FCP2 darknet port: 127.0.0.1:9481</html>
FirstStartupDialog.overrideFcpHost.label=Override Freenet FCP host:port
FirstStartupDialog.title=Frost first startup
Frost.lockFileFound=This indicates that another Frost instance is already running in this directory.\nRunning Frost concurrently will cause data loss.\nIf you are REALLY SURE that Frost is not already running, delete the lockfile:\n
IdentitiesBrowser.button.cleanup.tooltip=Delete all identities without messages or files
IdentitiesBrowser.button.cleanup=Cleanup
IdentitiesBrowser.button.close=Close
IdentitiesBrowser.button.delete.tooltip.multiple=Delete selected identities
IdentitiesBrowser.button.delete.tooltip.single=Delete selected identity
IdentitiesBrowser.button.delete=Delete
IdentitiesBrowser.button.export=Export
IdentitiesBrowser.button.import=Import
IdentitiesBrowser.cleanupDialog.deleteIdentities.body=Cleanup will delete {0} unused identities.
IdentitiesBrowser.cleanupDialog.deleteIdentities.title=Cleanup identities
IdentitiesBrowser.cleanupDialog.nothingToDelete.body=There are no deletable identities.
IdentitiesBrowser.cleanupDialog.nothingToDelete.title=Cleanup identities
IdentitiesBrowser.deleteDialog.body=Delete {0} selected identities?
IdentitiesBrowser.deleteDialog.title=Delete identities
IdentitiesBrowser.exportIdentitiesConfirmXmlFileOverwrite.body=Overwite XML file ''{0}'' ?
IdentitiesBrowser.exportIdentitiesConfirmXmlFileOverwrite.title=Confirm overwrite
IdentitiesBrowser.identitiesExported.body=Exported {0} identities.
IdentitiesBrowser.identitiesExported.title=Identities exported
IdentitiesBrowser.identitiesExportFailed.body=Identities export failed.
IdentitiesBrowser.identitiesExportFailed.title=Export failed
IdentitiesBrowser.identitiesImported.body=<html>Imported {0} identities, skipped {1} duplicate identities.<br>You need to close and reopen this dialog to see the imported identities.</html>
IdentitiesBrowser.identitiesImported.title=Identities imported
IdentitiesBrowser.identitiesTable.files=Files
IdentitiesBrowser.identitiesTable.lastSeen=Last seen
IdentitiesBrowser.identitiesTable.messages=Messages
IdentitiesBrowser.identitiesTable.name=Name
IdentitiesBrowser.identitiesTable.receivedMessages=Received messages
IdentitiesBrowser.identitiesTable.state=State
IdentitiesBrowser.label.filter=Filter
IdentitiesBrowser.label.lookup=Lookup
IdentitiesBrowser.noIdentityToExport.body=No identities to export found.\nOnly GOOD, OBSERVE or BAD identities can be exported.
IdentitiesBrowser.noIdentityToExport.title=No identities to export
IdentitiesBrowser.noIdentityToImport.body=No identities to import found in XML file.
IdentitiesBrowser.noIdentityToImport.title=No identities found
IdentitiesBrowser.popupmenu.copyUniqueName=Copy unique name
IdentitiesBrowser.popupmenu.copyUniqueNameAndPublicKey=Copy unique name and public key
IdentitiesBrowser.popupmenu.exportSelectedIdentities=Export selected identities
IdentitiesBrowser.progressDialog.body=Retrieving identity information from database
IdentitiesBrowser.progressDialog.title=Retrieving identity information
IdentitiesBrowser.title=Identities Browser ({0} identities)
KnownBoardsFrame.boardsExported.body=Exported {0} known boards to XML file ''{1}''.
KnownBoardsFrame.boardsExported.title=Boards exported
KnownBoardsFrame.boardsImported.body=Loaded {0} boards from XML file ''{1}'', {2} new boards added to list.
KnownBoardsFrame.boardsImported.title=Boards imported
KnownBoardsFrame.button.actions=Actions
KnownBoardsFrame.button.addBoards=Add selected board(s)
KnownBoardsFrame.button.addBoardsToFolder=Add selected board(s) to folder
KnownBoardsFrame.button.close=Close
KnownBoardsFrame.button.export=Export
KnownBoardsFrame.button.hideBoard=Hide board name
KnownBoardsFrame.button.import=Import
KnownBoardsFrame.button.removeBoard=Remove selected board(s)
KnownBoardsFrame.button.unhideBoard=Unhide board name
KnownBoardsFrame.exportFailed.body=Export to XML file failed! Disk full?
KnownBoardsFrame.exportFailed.title=Export failed
KnownBoardsFrame.label.filter=Filter
KnownBoardsFrame.label.lookup=Lookup
KnownBoardsFrame.noBoardsImported.body=No boards found in XML file.
KnownBoardsFrame.noBoardsImported.title=No boards imported
KnownBoardsFrame.table.boardName=Boardname
KnownBoardsFrame.table.description=Description
KnownBoardsFrame.table.privateKey=Private key
KnownBoardsFrame.table.publicKey=Public key
KnownBoardsFrame.title=List of known boards
KnownBoardsFrame.tooltip.showHidden=Show hidden boards
MainFrame.dialog.renameFolder=Please enter the new name
MainFrame.menu.file.statistics=Statistics
MainFrame.menu.file=File
MainFrame.menu.help.aboutFrost=About
MainFrame.menu.help.help=Help
MainFrame.menu.help.showMemoryMonitor=Show memory monitor
MainFrame.menu.help=Help
MainFrame.menu.language.bulgarian=Bulgarian
MainFrame.menu.language.danish=Danish
MainFrame.menu.language.default=Default
MainFrame.menu.language.dutch=Dutch
MainFrame.menu.language.english=English
MainFrame.menu.language.esperanto=Esperanto
MainFrame.menu.language.french=French
MainFrame.menu.language.german=German
MainFrame.menu.language.italian=Italian
MainFrame.menu.language.japanese=Japanese
MainFrame.menu.language.polish=Polish
MainFrame.menu.language.russian=Russian
MainFrame.menu.language.spanish=Spanish
MainFrame.menu.language.swedish=Swedish
MainFrame.menu.language=Language
MainFrame.menu.news.automaticBoardUpdate=Automatic board update
MainFrame.menu.news.displayBoardInformationWindow=Display board information window
MainFrame.menu.news.displayBoardUpdateInformationMenuItem=Display board update informations
MainFrame.menu.news.displayKnownBoards=Display known boards
MainFrame.menu.news.searchMessages=Search messages
MainFrame.menu.news=News
MainFrame.menu.options.manageIdentities=Manage identities
MainFrame.menu.options.manageLocalIdentities=Manage own identities
MainFrame.menu.options.preferences=Preferences
MainFrame.menu.options=Options
MainFrame.menu.plugins.translateFrost=Translate Frost into another language
MainFrame.menu.plugins=Plugins
MainFrame.openCreateMessageWindows.body=Some create message windows are still open.\nDo you want to exit anyway?
MainFrame.openCreateMessageWindows.title=Discard messages
MainFrame.runningUploadsWarning.body=Some messages are still being uploaded.\nDo you want to exit anyway?
MainFrame.runningUploadsWarning.title=Uploads underway
MainFrame.statusBar.downloading=Downloading
MainFrame.statusBar.file=file
MainFrame.statusBar.fileListDownloadQueueSize=FLQ
MainFrame.statusBar.files=files
MainFrame.statusBar.selectedBoard=Selected board
MainFrame.statusBar.TOFDO=TOFDO
MainFrame.statusBar.TOFUP=TOFUP
MainFrame.statusBar.tooltip.fileListDownloadQueueSize=<html>Number of enqueued file lists to download.<br>Once all file lists are downloaded the file search finds the most current files.</html>
MainFrame.statusBar.uploading=Uploading
MainFrame.tabbedPane.downloads=Downloads
MainFrame.tabbedPane.freetalk=Freetalk
MainFrame.tabbedPane.news=News
MainFrame.tabbedPane.search=Search files
MainFrame.tabbedPane.sharing=My shared files
MainFrame.tabbedPane.uploads=Uploads
MainFrame.toolbar.tooltip.boardInformationWindow=Board Information Window
MainFrame.toolbar.tooltip.configureBoard=Configure board
MainFrame.toolbar.tooltip.displayListOfKnownBoards=Display list of known boards
MainFrame.toolbar.tooltip.minimizeToSystemTray=Minimize to System Tray
MainFrame.toolbar.tooltip.newBoard=New board
MainFrame.toolbar.tooltip.newFolder=New folder
MainFrame.toolbar.tooltip.removeBoard=Remove board
MainFrame.toolbar.tooltip.renameFolder=Rename folder
MainFrame.toolbar.tooltip.searchMessages=Search messages
MainFrameStatusBar.tooltip.tofdn=<html>Updating boards: {0}<br>Board update threads: {1}</html>
MainFrameStatusBar.tooltip.tofup=<html>Uploading messages: {0}<br>Waiting messages: {1}<br>Waiting attachments: {2}</html>
ManageLocalIdentities.button.close=Close
ManageLocalIdentities.button.createNewIdentity=Create Identity
ManageLocalIdentities.button.deleteIdentity=Delete Identity
ManageLocalIdentities.button.editSignature=Edit signature
ManageLocalIdentities.button.exportXml=Export into XML file
ManageLocalIdentities.button.importIdentity=Import from ''identities.xml''
ManageLocalIdentities.button.importXml=Import from XML file
ManageLocalIdentities.cannotDeleteLastIdentity.body=The last existing identity can not be deleted.
ManageLocalIdentities.cannotDeleteLastIdentity.title=Cannot delete last identity
ManageLocalIdentities.deleteIdentitiesSharedFilesConfirmation.body=The identity ''{0}'' shares {1} files which will be removed. Proceed?
ManageLocalIdentities.deleteIdentitiesSharedFilesConfirmation.title=Shared files for identity
ManageLocalIdentities.deleteIdentityConfirmation.body=Do you really want to delete the identity ''{0}''?
ManageLocalIdentities.deleteIdentityConfirmation.title=Confirm identity delete
ManageLocalIdentities.duplicateIdentity.body=Imported identity ''{0}'' is already in list.
ManageLocalIdentities.duplicateIdentity.title=Duplicate identity
ManageLocalIdentities.duplicateLocalIdentity.body=Imported identity ''{0}'' is already in list.
ManageLocalIdentities.duplicateLocalIdentity.title=Duplicate identity
ManageLocalIdentities.exportIdentitiesConfirmXmlFileOverwrite.body=Overwite XML file ''{0}'' ?
ManageLocalIdentities.exportIdentitiesConfirmXmlFileOverwrite.title=Confirm overwrite
ManageLocalIdentities.identitiesExported.body=Exported {0} identities.
ManageLocalIdentities.identitiesExported.title=Identities exported
ManageLocalIdentities.identitiesExportFailed.body=Identities export failed.
ManageLocalIdentities.identitiesExportFailed.title=Export failed
ManageLocalIdentities.identityImported.body=Imported identity ''{0}''.
ManageLocalIdentities.identityImported.title=Identity imported
ManageLocalidentities.listLabel=Own Identities
ManageLocalIdentities.localIdentitiesImported.body=Imported {0} identities.
ManageLocalIdentities.localIdentitiesImported.title=Identities imported
ManageLocalIdentities.noIdentityToImport.body=No identity to import found.
ManageLocalIdentities.noIdentityToImport.title=No identity found
ManageLocalIdentities.noLocalIdentityToImport.body=No identities to import found in XML file.
ManageLocalIdentities.noLocalIdentityToImport.title=No identities found
ManageLocalIdentities.privateKeyExportWarning.body=The private keys of your identities will be contained in the XML file!\nHandle this file carefully.
ManageLocalIdentities.privateKeyExportWarning.title=Private key warning
ManageLocalIdentities.title=Manage own identities
ManageLocalIdentitiesSignatureDialog.title=Edit signature for identity ''{0}''
MessageFrame.attachBoard.sendPrivateKeyConfirmationDialog.body=You have the private key to board ''{0}''. Are you sure you want it attached?\nIf you choose NO, only the public key will be attached.
MessageFrame.attachBoard.sendPrivateKeyConfirmationDialog.title=Include private board key?
MessageFrame.attachmentTables.popupmenu.remove=Remove
MessageFrame.board=Board
MessageFrame.boardAttachmentTable.boardname=Boardname
MessageFrame.boardAttachmentTable.description=Description
MessageFrame.boardAttachmentTable.privateKey=Private key
MessageFrame.boardAttachmentTable.publicKey=Public key
MessageFrame.createMessage.title=Create message
MessageFrame.defaultSubjectWarning.text=Do you want to enter a subject?
MessageFrame.defaultSubjectWarning.title=No subject specified!
MessageFrame.discardMessage.text=Do you want to discard your unsent message?
MessageFrame.discardMessage.title=Discard message
MessageFrame.encryptErrorNoRecipient.body=Can't encrypt the message, no recipient choosed!
MessageFrame.encryptErrorNoRecipient.title=Encrypt error
MessageFrame.fileAttachmentTable.filename=Filename
MessageFrame.fileAttachmentTable.size=Size
MessageFrame.fileChooser.title=Choose file(s) / directory(s) to attach
MessageFrame.from=From
MessageFrame.noContentError.text=You must enter new content below the separator line!
MessageFrame.noContentError.title=No new message content!
MessageFrame.noSenderError.text=You must enter a sender name!
MessageFrame.noSenderError.title=No 'From' specified!
MessageFrame.noSubjectError.text=You must enter a subject!
MessageFrame.noSubjectError.title=No subject specified!
MessageFrame.subject=Subject
MessageFrame.textTooLargeError.text=The text of the message is too large ({0} characters, {1} allowed)!
MessageFrame.textTooLargeError.title=Message text is too large!
MessageFrame.toolbar.encryptFor=Encrypt for
MessageFrame.toolbar.tooltip.addBoardAttachments=Add Board(s)
MessageFrame.toolbar.tooltip.addFileAttachments=Add attachment(s)
MessageFrame.toolbar.tooltip.chooseSmiley=Insert smiley
MessageFrame.toolbar.tooltip.sendMessage=Send message
MessagePane.boardAttachmentTable.accessRights=Access rights
MessagePane.boardAttachmentTable.boardName=Board name
MessagePane.boardAttachmentTable.description=Description
MessagePane.boardAttachmentTable.popupmenu.addBoards=Add Board(s)
MessagePane.boardAttachmentTable.popupmenu.addBoardsToFolder=Add Board(s) to folder
MessagePane.boardAttachmentTable.popupmenu.addBoardsToKnownBoards=Add board(s) to list of known boards
MessagePane.defaultText.noBoardSelected=Select a board to view its content.
MessagePane.defaultText.noMessageSelected=Select a message to view its content.
MessagePane.defaultText.welcomeMessage=Please read this!\n\nTo use Frost, you first need to select a topic from the board information window. You can open this window with the i-button above. You can send messages and files to people using the same board. It will probably take some time until the first boards show up (press the update button).
MessagePane.fileAttachmentTable.filename=Filename
MessagePane.fileAttachmentTable.key=Key
MessagePane.fileAttachmentTable.popupmenu.downloadAttachments=Download attachment(s)
MessagePane.fileAttachmentTable.popupmenu.downloadSelectedAttachment=Download selected attachment
MessagePane.fileAttachmentTable.size=Size
MessagePane.hyperlink.popupmenu.copyAllFileKeysToClipboard=Copy all file keys to clipboard
MessagePane.hyperlink.popupmenu.copyFileKeyToClipboard=Copy file key to clipboard
MessagePane.hyperlink.popupmenu.copyFreesiteLinkToClipboard=Copy freesite link to clipboard
MessagePane.hyperlink.popupmenu.copyKeyToClipboard=Copy key to clipboard
MessagePane.hyperlink.popupmenu.downloadAllFileKeys=Download all file keys
MessagePane.hyperlink.popupmenu.downloadFileKey=Download file key
MessagePane.messageTable.date=Date
MessagePane.messageTable.from=From
MessagePane.messageTable.index=Index
MessagePane.messageTable.popupmenu.collapseAll=Collapse all
MessagePane.messageTable.popupmenu.collapseThread=Collapse thread
MessagePane.messageTable.popupmenu.deleteMessage=Delete message
MessagePane.messageTable.popupmenu.expandAll=Expand all
MessagePane.messageTable.popupmenu.expandThread=Expand thread
MessagePane.messageTable.popupmenu.markAllMessagesRead=Mark ALL messages read
MessagePane.messageTable.popupmenu.markMessageUnread=Mark message unread
MessagePane.messageTable.popupmenu.markSelectedMessagesReadItem=Mark selected messages read
MessagePane.messageTable.popupmenu.markSelectedMessagesUnreadItem=Mark selected messages unread
MessagePane.messageTable.popupmenu.markThreadRead=Mark message thread read
MessagePane.messageTable.popupmenu.setToBad=Mark user BAD
MessagePane.messageTable.popupmenu.setToCheck=Mark user CHECK
MessagePane.messageTable.popupmenu.setToGood=Mark user GOOD
MessagePane.messageTable.popupmenu.setToObserve=Mark user OBSERVE
MessagePane.messageTable.popupmenu.undeleteMessage=Undelete message
MessagePane.messageTable.sig=Sig
MessagePane.messageTable.subject=Subject
MessagePane.messageText.popupmenu.copy=Copy
MessagePane.messageText.popupmenu.saveMessageToDisk=Save message to disk
MessagePane.messageText.saveDialog.title=Save message to disk
MessagePane.messageText.downloadPrefixDialog.title=Filename prefix
MessagePane.messageText.popupmenu.downloadKeysTo=Download keys to...
MessagePane.messageText.popupmenu.browse=Browse...
MessagePane.messageText.downloadPrefixDialog.body=Enter text to prefix filenames with, or leave empty for no prefix
MessagePane.missingBoardError.text=Can't reply, the target board ''{0}'' is not in your boardlist.
MessagePane.missingBoardError.title=Error
MessagePane.missingLocalIdentityError.text=Can't reply encrypted, your identity ''{0}'' that received the original message is missing!
MessagePane.missingLocalIdentityError.title=Error
MessagePane.subjectText.popupmenu.copySubjectText=Copy subject
MessagePane.toolbar.labelAllMessageCount=Msg
MessagePane.toolbar.labelNewMessageCount=New
MessagePane.toolbar.tooltip.isSigned=This message will be sent signed
MessagePane.toolbar.tooltip.isUnsigned=This message will be sent anonymously
MessagePane.toolbar.tooltip.newMessage=New message
MessagePane.toolbar.tooltip.nextUnreadMessage=Next unread message
MessagePane.toolbar.tooltip.reply=Reply
MessagePane.toolbar.tooltip.saveMessage=Save message
MessagePane.toolbar.tooltip.setToBad=Mark user BAD
MessagePane.toolbar.tooltip.setToCheck=Mark user CHECK
MessagePane.toolbar.tooltip.setToGood=Mark user GOOD
MessagePane.toolbar.tooltip.setToObserve=Mark user OBSERVE
MessagePane.toolbar.tooltip.toggleShowHyperlinks=Toggle show keys as hyperlinks
MessagePane.toolbar.tooltip.toggleShowSmileys=Toggle show smileys
MessagePane.toolbar.tooltip.toggleShowThreads=Toggle show message threads
MessagePane.toolbar.tooltip.toggleShowUnreadOnly=Show only unread messages
MessagePane.toolbar.tooltip.toggleShowFlaggedOnly=Show only flagged messages
MessagePane.toolbar.tooltip.toggleShowStarredOnly=Show only starred messages
MessagePane.toolbar.tooltip.update=Update
MessagePane.unknownRecipientError.text=Can't reply encrypted, recipients ''{0}'' public key is missing!
MessagePane.unknownRecipientError.title=Error
MessageUploader.messageToLargeError.text=<html>The data you want to upload is too large (''{0}''), ''{1}'' is allowed.<br>This should never happen, please report this to a Frost developer!</html>
MessageUploader.messageToLargeError.title=Message is too large
MessageUploadFailedDialog.body=Frost was not able to upload your message.
MessageUploadFailedDialog.option.discardMessage=Discard message
MessageUploadFailedDialog.option.retry=Retry
MessageUploadFailedDialog.option.retryOnNextStartup=Retry on next startup
MessageUploadFailedDialog.title=Upload of message failed
MessageWindow.board=Board
MessageWindow.date=Date
MessageWindow.from=From
MessageWindow.subject=Subject
MessageWindow.to=To
MessageWindow.tooltip.reply=Reply
NewBoardDialog.add=Add Board
NewBoardDialog.description=Description (Optional). Do not put private information here:
NewBoardDialog.details=Please enter the details of the new board:
NewBoardDialog.name=Name:
NewBoardDialog.title=Add a new board
Options.boardTree=Board Tree
Options.common.days=days
Options.common.minutes=minutes
Options.common.off=Off
Options.common.on=On
Options.display.boardTree=Board Tree
Options.display.choose=Choose
Options.display.confirmMarkAllMsgsRead=Show confirmation dialog for 'Mark all messages read'
Options.display.enableAntialiasingForMessageBody=Enable antialiasing for message body
Options.display.enableMultilineSelectionsInMessageTable=Enable multiline selections in message table
Options.display.fileList=File List
Options.display.fontChooser.bold=Bold
Options.display.fontChooser.boldItalic=Bold Italic
Options.display.fontChooser.italic=Italic
Options.display.fontChooser.plain=Plain
Options.display.fontChooser.sample=Sample
Options.display.fontChooser.title=Choose a Font
Options.display.fonts=Fonts
Options.display.indicateLowReceivedMessages=Indicate low received messages for identities
Options.display.indicateLowReceivedMessagesCountLightRed=Maximum messages for LIGHTRED indicator
Options.display.indicateLowReceivedMessagesCountRed=Maximum messages for RED indicator
Options.display.messageBody=Message Body
Options.display.messageList=Message List
Options.display.preventBoardtreeReordering=Prevent board tree reordering
Options.display.refreshList=Refresh List
Options.display.saveSortStates=Save information about sorted table columns
Options.display.showBoardtreeFlaggedStarredIndicators=Show flagged/starred indicators in board tree
Options.display.showBoardUpdateCount=Show board update count for session in board tree
Options.display.showCollapsedThreads=Show collapsed message threads (default is expanded)
Options.display.expandRootChildren=Expand all replies (only root thread is collapsed)
Options.display.expandUnreadThreads=Expand unread threads
Options.display.doubleClickShowsMessage=Double clicking a message shows it in a new window
Options.display.showColoredRows=Show colored rows in tables
Options.display.showHorizontalScrollbarInMessageTable=Show horizontal scrollbar in message table
Options.display.showTooltipWithBoardDescriptionInBoardTree=Show tooltip with board description in board tree
Options.display.sortThreadRootMsgsAscending=Sort message thread root messages ascending (oldest topmost)
Options.display=Display
Options.downloads.downloadDirectory=Download directory
Options.downloads.downloadPriority=Download priority
Options.downloads.enforceFrostPriorityFileDownload=Enforce Frosts priority setting (reset external changes)
Options.downloads.filechooser.title=Select download directory
Options.downloads.logDownloads=Log successful downloads to ''localdata/Frost-Downloads.log''
Options.downloads.maximumNumberOfRetries=Maximum number of retries
Options.downloads.numberOfSimultaneousDownloads=Number of simultaneous downloads
Options.downloads.waittimeAfterEachTry=Waittime after each try
Options.downloads=Downloads
Options.downloads.trackDownloads=Warn if a file has already been downloaded previously
Options.downloads.downloadExec=Execute program on completion
Options.downloads.useBoardnameDownloadSubfolder=Save files in subfolder with name of the board
Options.expiration.archiveExpiredMessages=Archive expired messages
Options.expiration.cleanupIntervalDays=Cleanup interval
Options.expiration.cleanupNextStartup=Cleanup during next startup
Options.expiration.deleteExpiredMessages=Delete expired messages from keypool
Options.expiration.keepExpiredMessages=Keep expired messages in keypool
Options.expiration.keepFlaggedAndStarredMessages=Don't expire flagged and starred messages
Options.expiration.keepUnreadMessages=Don't expire unread messages
Options.expiration.numberOfDaysBeforeMessageExpires=Number of days before a message expires
Options.expiration.offlineFilesMaxDaysOld=Remove files from an owner after days not seen
Options.expiration.removeOfflineFilesWithKey=Also delete files from an owner when the file has a CHK key
Options.expiration=Expiration
Options.junk.hideJunkMessages=Hide JUNK messages
Options.junk.invalidSubsequentMessagesThreshold=Subsequent invalid messages threshold
Options.junk.markJunkIdentityBad=Mark identity that sent JUNK as BAD (if their current trust state is CHECK)
Options.junk.stopBoardUpdatesWhenDosed=Stop a board update when board is target of a DoS attack
Options.junk=Junk
Options.messages=Messages
Options.miscellaneous.automaticSavingInterval=Automatic saving interval
Options.miscellaneous.autoSaveLocalIdentities=Automatically backup own identities
Options.miscellaneous.compactStoragesDuringNextStartup=Compact storages during next startup
Options.miscellaneous.disableSplashscreen=Disable splashscreen
Options.miscellaneous.enableLogging=Enable logging
Options.miscellaneous.freenetFcpNode=Freenet node you have FCP access to (node:port)
Options.miscellaneous.logFileSizeLimit=Log files size limit (in KB)
Options.miscellaneous.loggingLevel=Logging level
Options.miscellaneous.logLevel.high=High
Options.miscellaneous.logLevel.low=Low
Options.miscellaneous.logLevel.medium=Medium
Options.miscellaneous.logLevel.veryHigh=Very high
Options.miscellaneous.logLevel.veryLow=Very low
Options.miscellaneous.minimizeToSystray=Always minimize to SysTray
Options.miscellaneous.showSysTrayIcon=Show SysTray icon
Options.miscellaneous.useDDA.tooltip=If enabled Frost tests if direct disk access is possible for a node
Options.miscellaneous.useDDA=Use direct disk access if possible
Options.miscellaneous.useEditorForWritingMessages=Use editor for writing messages
Options.miscellaneous.usePersistence=Use persistence and global queue for uploads and downloads
Options.miscellaneous=Miscellaneous
Options.news.1.alwaysDownloadBackload.tooltip=<html>Enabled: each board update downloads the configured days backwards<br>Disabled: the full backward download of X days is only done every 12 hours</html>
Options.news.1.alwaysDownloadBackload=Always download all days backward
Options.news.1.messageBase=Message base
Options.news.1.messageDownloadPriority=Message download priority
Options.news.1.messageUploadPriority=Message upload priority
Options.news.1.numberOfDaysToDisplay=Number of days to display
Options.news.1.numberOfDaysToDownloadBackwards=Number of days to download backwards
Options.news.1.storeSentMessages=Save sent messages
Options.news.1.useOneConnectionForMessages=Use a single connection for message transfers (requires restart of Frost)
Options.news.2.blockMessagesWithBody=Block messages with body containing (separate by ';' )
Options.news.2.blockMessagesWithSubject=Block messages with subject containing (separate by ';' )
Options.news.2.blockMessagesWithTheseBoards=Block messages with these attached boards (separate by ';' )
Options.news.2.dontAddBoardsFromTrustStates=Don't add boards to known boards list from users with trust states
Options.news.2.hideMessagesWithTrustStates=Hide messages with trust states
Options.news.2.hideMessageCount=Hide messages from identities with fewer than X received messages (0 disables)
Options.news.2.hideMessageCountExcludePrivate=Always show private messages
Options.news.2.trustState.bad=Bad
Options.news.2.trustState.check=Check
Options.news.2.trustState.none=None (unsigned)
Options.news.2.trustState.observe=Observe
Options.news.3.acceptSignatureFormatV1=Accept old signature format (disable for spam prevention)
Options.news.3.automaticBoardUpdate=Automatic board update
Options.news.3.backgroundColorIfUpdatingBoardIsNotSelected=Background color if updating board is not selected
Options.news.3.backgroundColorIfUpdatingBoardIsSelected=Background color if updating board is selected
Options.news.3.choose=Choose
Options.news.3.color=Color
Options.news.3.colorChooserDialog.title.chooseUpdatingColorOfSelectedBoards=Choose updating color of SELECTED boards
Options.news.3.colorChooserDialog.title.chooseUpdatingColorOfUnselectedBoards=Choose updating color of NON-SELECTED boards
Options.news.3.dontHandleOwnMessagesAsNew=Don't show received messages from ME as new
Options.news.3.dontShowOwnMessagesAsMe=Don't show own messages as ME
Options.news.3.minimumUpdateInterval=Minimum update interval of a board
Options.news.3.numberOfConcurrentlyUpdatingBoards=Number of concurrently updating boards
Options.news.3.showBoardUpdateVisualization=Show board update visualization
Options.news.3.showDeletedMessages=Show deleted messages
Options.news.3.silentlyRetryFailedMessages=Silently retry failed message uploads
Options.news=News
Options.search.archiveExtension=Archive Extension
Options.search.audioExtension=Audio Extension
Options.search.disableFilesharing=Disable filesharing
Options.search.documentExtension=Document Extension
Options.search.executableExtension=Executable Extension
Options.search.imageExtension=Image Extension
Options.search.maximumSearchResults=Maximum search results
Options.search.rememberSharedFileDownloaded=Remember if a shared file was downloaded
Options.search.resetHiddenFiles=Reset hidden files status
Options.search.videoExtension=Video Extension
Options.search.confirmResetHiddenFiles.title=Show all hidden files again?
Options.search.confirmResetHiddenFiles.body=Do you really want to reset the hidden state of the search files?
Options.search=Search
Options.title=Options
Options.uploads.enforceFrostPriorityFileUpload=Enforce Frosts priority setting (reset external changes)
Options.uploads.logUploads=Log manually added successful uploads to ''localdata/Frost-Uploads.log''
Options.uploads.maximumNumberOfRetries=Maximum number of retries
Options.uploads.numberOfSimultaneousUploads=Number of simultaneous uploads
Options.uploads.uploadPriority=Upload priority
Options.uploads.waittimeAfterEachTry=Waittime after each try
Options.uploads=Uploads
Options.uploads.removeNotExistingFiles=Periodically check for and remove non-existent/changed files in upload table
Options.uploads.uploadExec=Execute program on completion
Saver.AutoTask.message=Frost found an error while saving a resource and it will close itself.
Saver.AutoTask.title=Problem found.
SearchMessages.archive.searchInKeypoolAndArchive=Search in keypool and archive
SearchMessages.archive.searchOnlyInArchive=Search only in archive
SearchMessages.archive.searchOnlyInKeypool=Search only in keypool
SearchMessages.archive=Archive
SearchMessages.attachments.messageMustContainBoardAttachments=Message must contain board attachments
SearchMessages.attachments.messageMustContainFileAttachments=Message must contain file attachments
SearchMessages.attachments=Attachments
SearchMessages.boards.chooseBoards=Choose boards
SearchMessages.boards.searchFollowingBoards=Search following boards
SearchMessages.boards.searchInDisplayedBoards=Search in displayed boards
SearchMessages.boards=Boards
SearchMessages.button.close=Close
SearchMessages.button.help=Help
SearchMessages.button.openMessage=Open message
SearchMessages.button.search=Search
SearchMessages.button.stopSearch=Stop search
SearchMessages.date.searchAllDates=Search all dates
SearchMessages.date.searchBetweenDates=Search between dates
SearchMessages.date.searchInMessagesThatWouldBeDisplayed=Search in messages that would be displayed
SearchMessages.date.searchNumberOfDaysBackward=Search number of days backward
SearchMessages.date.to=to
SearchMessages.date=Date
SearchMessages.errorDialog.stopSearchBeforeClose=Please stop the search before closing the window.
SearchMessages.errorDialogs.invalidStartOrEndDate=Invalid start date or end date specified.
SearchMessages.errorDialogs.noBoardsChosen=No boards to search into were chosen.
SearchMessages.errorDialogs.noBoardsToChoose=There are no boards that could be choosed.
SearchMessages.errorDialogs.noTrustStateSelected=No trust state is selected.
SearchMessages.errorDialogs.startDateIsAfterEndDate=Start date is after end date.
SearchMessages.errorDialogs.title=Error
SearchMessages.label.results=Results
SearchMessages.label.searchResult=Search result
SearchMessages.resultTable.board=Board
SearchMessages.resultTable.date=Date
SearchMessages.resultTable.from=From
SearchMessages.resultTable.index=Index
SearchMessages.resultTable.sig=Sig
SearchMessages.resultTable.subject=Subject
SearchMessages.search.content=Content
SearchMessages.search.searchFlaggedMessagesOnly=Flagged messages
SearchMessages.search.searchPrivateMessagesOnly=Private messages
SearchMessages.search.searchRepliedMessagesOnly=Replied messages
SearchMessages.search.searchStarredMessagesOnly=Starred messages
SearchMessages.search.sender=Sender
SearchMessages.search.subject=Subject
SearchMessages.search.tooltip.caseSensitiv=Check to enable case sensitive search
SearchMessages.search=Search
SearchMessages.title=Search messages
SearchMessages.trustState.bad=Bad
SearchMessages.trustState.check=Check
SearchMessages.trustState.good=Good
SearchMessages.trustState.none=None (unsigned)
SearchMessages.trustState.observe=Observe
SearchMessages.trustState.searchAllMessages=Search all messages, no matter which trust state is set
SearchMessages.trustState.searchInMessagesThatWouldBeDisplayed=Search in messages that would be displayed
SearchMessages.trustState.searchOnlyInMessagesWithFollowingTrustState=Search only in messages with following trust state
SearchMessages.trustState.tampered=Tampered
SearchMessages.trustState=Trust state
SearchPane.fileTypes.allFiles=All files
SearchPane.fileTypes.archives=Archives
SearchPane.fileTypes.audio=Audio
SearchPane.fileTypes.documents=Documents
SearchPane.fileTypes.executables=Executables
SearchPane.fileTypes.images=Images
SearchPane.fileTypes.video=Video
SearchPane.resultTable.comment=Comment
SearchPane.resultTable.filename=Filename
SearchPane.resultTable.keywords=Keywords
SearchPane.resultTable.lastReceived=Last seen
SearchPane.resultTable.lastUploaded=Last uploaded
SearchPane.resultTable.popupmenu.downloadAllKeys=Download all keys
SearchPane.resultTable.popupmenu.downloadSelectedKeys=Download selected keys
SearchPane.resultTable.popupmenu.hideSelectedKeys=Hide selected keys
SearchPane.resultTable.rating=Rating
SearchPane.resultTable.size=Size
SearchPane.resultTable.sources.tooltip=<html>Sources for this file. An icon indicates that multiple owners provided additional informations.<br>Doubleclick in this column to show the details.</html>
SearchPane.resultTable.sources=Sources
SearchPane.resultTable.state=State
SearchPane.resultTable.states.downloaded=Downloaded
SearchPane.resultTable.states.downloading=Downloading
SearchPane.resultTable.states.offline=Offline
SearchPane.resultTable.states.sharing=Sharing
SearchPane.toolbar.comment=Comment
SearchPane.toolbar.keywords=Keywords
SearchPane.toolbar.name=Name
SearchPane.toolbar.owner=Owner
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedBad=Hide files from people marked BAD
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedCheck=Hide files from people marked CHECK
SearchPane.toolbar.searchOptions.hideFilesFromPeopleMarkedObserve=Hide files from people marked OBSERVE
SearchPane.toolbar.searchOptions.hideFilesWithoutChk=Hide files without CHK key
SearchPane.toolbar.searchOptionsButton=Options
SearchPane.toolbar.tooltip.clear=Clear textfields
SearchPane.toolbar.tooltip.search=Search
SearchPane.toolbar.tooltip.toggleMode=Toggle between simple and advanced search mode
SentMessages.confirmDeleteMessagesDialog.text=Do you want to permanently delete the {0} selected sent messages?
SentMessages.confirmDeleteMessagesDialog.title=Confirm delete
SentMessages.confirmDeleteOneMessageDialog.text=Do you want to permanently delete the selected sent message?
SentMessages.confirmDeleteOneMessageDialog.title=Confirm delete
SentMessages.folderName=Sent
SentMessages.label=Sent messages
SentMessages.table.board=Board
SentMessages.table.date=Date
SentMessages.table.from=From
SentMessages.table.popup.deleteMessage=Delete
SentMessages.table.subject=Subject
SentMessages.table.to=To
SharedFilesOwnerDialog.askForIdentity=Choose the owner identity for the new shared files
SharedFilesOwnerDialog.askIfToReplace=If file with same checksum does already exist
SharedFilesOwnerDialog.ignoreNewFile=Ignore the new file
SharedFilesOwnerDialog.replaceExistingFilePath=Set the file path to the path of the new file (owner is NOT changed!)
SharedFilesOwnerDialog.title=Choose an owner for the upload files
SharedFilesPane.filechooser.title=Select files to share
SharedFilesPane.fileTable.comment=Comment
SharedFilesPane.fileTable.filename=Filename
SharedFilesPane.fileTable.key=Key
SharedFilesPane.fileTable.keywords=Keywords
SharedFilesPane.fileTable.lastRequest=Last Request
SharedFilesPane.fileTable.lastShared=Last shared
SharedFilesPane.fileTable.lastUpload=Last upload
SharedFilesPane.fileTable.owner=Owner
SharedFilesPane.fileTable.path=Path
SharedFilesPane.fileTable.popupmenu.removeSelectedFiles=Remove selected files
SharedFilesPane.fileTable.popupmenu.uploadSelectedFiles=Upload selected files
SharedFilesPane.fileTable.rating=Rating
SharedFilesPane.fileTable.requestCount=Requests
SharedFilesPane.fileTable.size=Size
SharedFilesPane.fileTable.state.never=Never
SharedFilesPane.fileTable.state.unknown=Unknown
SharedFilesPane.fileTable.uploadCount=Uploads
SharedFilesPane.sizeChangedErrorDialog.text=The size of the choosed file is not the same as the size of the shared file.
SharedFilesPane.sizeChangedErrorDialog.title=Invalid file
SharedFilesPane.toolbar.files=Files
SharedFilesPane.toolbar.tooltip.browse=Add files to share
SmileyChooserDialog.title=Choose a smiley
Splashscreen.message.1=Initializing Mainframe..
Splashscreen.message.2=Leaving the gun..
Splashscreen.message.3=Taking the cannoli..
Splashscreen.message.4=Following the white rabbit..
Splashscreen.message.5=Engage!
StartupMessage.sharedFile.sharedFileLastModifiedChanged.text=<html>Shared file is invalid, remove or reshare the file.<br>Last modified date of shared file changed: {0}</html>
StartupMessage.sharedFile.sharedFileLastModifiedChanged.title=Invalid shared file
StartupMessage.sharedFile.sharedFileNotFound.text=<html>Shared file could not be located, remove or reshare the file.<br>Shared file not found: {0}</html>
StartupMessage.sharedFile.sharedFileNotFound.title=Invalid shared file
StartupMessage.sharedFile.sharedFileSizeChanged.text=<html>Shared file is invalid, remove or reshare the file.<br>Size of shared file changed: {0}</html>
StartupMessage.sharedFile.sharedFileSizeChanged.title=Invalid shared file
StartupMessage.uploadFile.boardsWithObsoleteKeysFound.text=<html>The board ''{0}'' has set an invalid public key whose encryption is not longer supported.<br>Remove the board or set a new public key.</html>
StartupMessage.uploadFile.boardsWithObsoleteKeysFound.title=Board has invalid public key
StartupMessage.uploadFile.uploadFileNotFound.text=<html>Upload file is invalid and was removed.<br>Upload file not found: {0}</html>
StartupMessage.uploadFile.uploadFileNotFound.title=Invalid upload file
StartupMessage.uploadFile.uploadFileSizeChanged.text=<html>Upload file is invalid and was removed.<br>Size of upload file changed: {0}</html>
StartupMessage.uploadFile.uploadFileSizeChanged.title=Invalid upload file
StatisticsDialog.button.close=Close
StatisticsDialog.label.archivedMessages=Archived messages
StatisticsDialog.label.files=Files
StatisticsDialog.label.fileSizes=File sizes
StatisticsDialog.label.identities=Identities
StatisticsDialog.label.messages=Messages
StatisticsDialog.label.sharers=Sharers
StatisticsDialog.title=Statistics
TargetFolderChooser.title=Choose a target folder
TOF.markAllReadConfirmation.board.content=Do you want to mark all messages in board ''{0}'' read?
TOF.markAllReadConfirmation.board.title=Mark all messages read
TOF.markAllReadConfirmation.folder.content=Do you want to mark all messages in all boards below folder ''{0}'' read?
TOF.markAllReadConfirmation.folder.title=Mark all messages read
UnsentMessages.confirmDeleteMessagesDialog.text=Do you want to permanently delete the {0} selected unsent messages?
UnsentMessages.confirmDeleteMessagesDialog.title=Confirm delete
UnsentMessages.confirmDeleteOneMessageDialog.text=Do you want to permanently delete the selected unsent message?
UnsentMessages.confirmDeleteOneMessageDialog.title=Confirm delete
UnsentMessages.deleteNotPossibleDialog.text=The message is currently uploading and cannot be deleted.
UnsentMessages.deleteNotPossibleDialog.title=Message upload already started
UnsentMessages.disableMessageUpload=Disable message upload
UnsentMessages.folderName=Outbox
UnsentMessages.label=Unsent messages
UnsentMessages.table.board=Board
UnsentMessages.table.from=From
UnsentMessages.table.popup.deleteMessage=Delete
UnsentMessages.table.state=State
UnsentMessages.table.stateUploading=Uploading
UnsentMessages.table.stateWaiting=Waiting
UnsentMessages.table.subject=Subject
UnsentMessages.table.timeAdded=Added
UnsentMessages.table.to=To
UploadPane.filechooser.title=Select files to upload
UploadPane.fileTable.blocks=Blocks
UploadPane.fileTable.enabled=Enabled
UploadPane.fileTable.filename=Filename
UploadPane.fileTable.key=Key
UploadPane.fileTable.path=Path
UploadPane.fileTable.popupmenu.enableUploads.disableAllUploads=Disable all uploads
UploadPane.fileTable.popupmenu.enableUploads.disableSelectedUploads=Disable selected uploads
UploadPane.fileTable.popupmenu.enableUploads.enableAllUploads=Enable all uploads
UploadPane.fileTable.popupmenu.enableUploads.enableSelectedUploads=Enable selected uploads
UploadPane.fileTable.popupmenu.enableUploads.invertEnabledStateForAllUploads=Invert enabled state for all uploads
UploadPane.fileTable.popupmenu.enableUploads.invertEnabledStateForSelectedUploads=Invert enabled state for selected uploads
UploadPane.fileTable.popupmenu.enableUploads=Enable uploads
UploadPane.fileTable.popupmenu.remove.removeSelectedFiles=Remove selected files
UploadPane.fileTable.popupmenu.remove=Remove
UploadPane.fileTable.popupmenu.removeFromGlobalQueue=Remove from global queue
UploadPane.fileTable.popupmenu.showSharedFile=Jump to shared file
UploadPane.fileTable.popupmenu.startEncodingOfSelectedFiles=Start encoding of selected files
UploadPane.fileTable.popupmenu.startSelectedUploadsNow=Start selected uploads immediately
UploadPane.fileTable.popupmenu.uploadSelectedFiles=Upload selected files
UploadPane.fileTable.priority=Priority
UploadPane.fileTable.shared.tooltip=An icon indicates a shared file.
UploadPane.fileTable.shared=Shared file
UploadPane.fileTable.size=Size
UploadPane.fileTable.state.done=Done
UploadPane.fileTable.state.encodeRequested=Encode requested
UploadPane.fileTable.state.encodingFile=Encoding file
UploadPane.fileTable.state.failed=Failed
UploadPane.fileTable.state.unknown=Unknown
UploadPane.fileTable.state.uploading=Uploading
UploadPane.fileTable.state.waiting=Waiting
UploadPane.fileTable.state=State
UploadPane.fileTable.tries=Tries
UploadPane.invalidUploadFilesRemoved.text=One or more upload files were not found or its size changed. The files are removed from upload table.
UploadPane.invalidUploadFilesRemoved.title=Invalid upload files
UploadPane.removeFinishedUploads=Remove finished
UploadPane.showExternalGlobalQueueItems=Show global queue
UploadPane.toolbar.tooltip.browse=Add files to upload
UploadPane.toolbar.waiting=Waiting
--------------020005070500060907010304
Content-Type: text/plain;
name="DownloadDialog.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="DownloadDialog.patch"
SW5kZXg6IHNvdXJjZS9mcm9zdC9maWxlVHJhbnNmZXIvZG93bmxvYWQvRG93bmxvYWRNb2Rl
bC5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0L2ZpbGVUcmFuc2Zlci9k
b3dubG9hZC9Eb3dubG9hZE1vZGVsLmphdmEJKHJldmlzaW9uIDMxOTIpDQorKysgc291cmNl
L2Zyb3N0L2ZpbGVUcmFuc2Zlci9kb3dubG9hZC9Eb3dubG9hZE1vZGVsLmphdmEJKHdvcmtp
bmcgY29weSkNCkBAIC01Nyw3ICs1Nyw3IEBADQogICAgICAgICAJLy8gT25seSBjaGVjayBp
ZiB0aGUgZmlsZSBpcyBub3QgbGluZ2VyaW5nIGFyb3VuZCBpbiBmaW5pc2hlZCBzdGF0ZS4u
LgogICAgICAgICAJaWYoICEgaXRlbVRvQWRkLmlzVHJhY2tlZCgpICl7CiAJICAgICAgICAg
ICAgZmluYWwgVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlIHRyYWNrRG93bmxvYWRLZXlzU3Rv
cmFnZSA9IFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5pbnN0KCk7Ci0JICAgICAgICAgICAg
aWYoIHRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5zZWFyY2hJdGVtKCBpdGVtVG9BZGQuZ2V0
S2V5KCkgKSApIHsKKwkgICAgICAgICAgICBpZiggdHJhY2tEb3dubG9hZEtleXNTdG9yYWdl
LnNlYXJjaEl0ZW1LZXkoIGl0ZW1Ub0FkZC5nZXRLZXkoKSApICkgewogCSAgICAgICAgICAg
IAlmaW5hbCBMYW5ndWFnZSBsYW5ndWFnZSA9IExhbmd1YWdlLmdldEluc3RhbmNlKCk7CiAK
IAkgICAgICAgICAgICAJLy8gQXNrIGlmIHRvIGRvd25sb2FkIGFnYWluCkBAIC03Myw0OCAr
NzMsNDggQEANCiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGdl
dEl0ZW1Db3VudCgpOyB4KyspIHsKLQkJCWZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGl0ZW0g
PSAoRnJvc3REb3dubG9hZEl0ZW0pIGdldEl0ZW1BdCh4KTsKLSAgICAgICAgICAgIGZpbmFs
IEZyb3N0RmlsZUxpc3RGaWxlT2JqZWN0IGZsZiA9IGl0ZW0uZ2V0RmlsZUxpc3RGaWxlT2Jq
ZWN0KCk7IC8vIG1heWJlIG51bGwgb2YgbWFudWFsbHkgYWRkZWQKKyAgICAgICAgCWZpbmFs
IEZyb3N0RG93bmxvYWRJdGVtIGl0ZW0gPSAoRnJvc3REb3dubG9hZEl0ZW0pIGdldEl0ZW1B
dCh4KTsKKyAgICAgICAgCWZpbmFsIEZyb3N0RmlsZUxpc3RGaWxlT2JqZWN0IGZsZiA9IGl0
ZW0uZ2V0RmlsZUxpc3RGaWxlT2JqZWN0KCk7IC8vIG1heWJlIG51bGwgb2YgbWFudWFsbHkg
YWRkZWQKIAotICAgICAgICAgICAgaWYoIGZsZlRvQWRkICE9IG51bGwgJiYgZmxmICE9IG51
bGwgKSB7Ci0gICAgICAgICAgICAgICAgaWYoIGZsZlRvQWRkLmdldFNoYSgpLmVxdWFscyhm
bGYuZ2V0U2hhKCkpICkgewotICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGluIG1v
ZGVsIChjb21wYXJlZCBieSBTSEEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIAlpZiggZmxm
VG9BZGQgIT0gbnVsbCAmJiBmbGYgIT0gbnVsbCApIHsKKyAgICAgICAgCQlpZiggZmxmVG9B
ZGQuZ2V0U2hhKCkuZXF1YWxzKGZsZi5nZXRTaGEoKSkgKSB7CisgICAgICAgIAkJCS8vIGFs
cmVhZHkgaW4gbW9kZWwgKGNvbXBhcmVkIGJ5IFNIQSkKKyAgICAgICAgCQkJcmV0dXJuIGZh
bHNlOworICAgICAgICAJCX0KKyAgICAgICAgCX0KIAotICAgICAgICAgICAgLy8gRklYTUU6
IDAuNzogaWYgd2UgYWRkIGEgbmV3IHVyaSBjaGsvbmFtZSBhbHNvIGNoZWNrIGlmIHdlIGFs
cmVhZHkgZG93bmxvYWQgY2hrIQotICAgICAgICAgICAgLy8gUHJvYmxlbTogd2hhdCBpZiBD
SEsgaXMgd3JvbmcsIHRoZW4gd2UgaGF2ZSB0byBhZGQgY2hrL25hbWUuIEJ1dCBpbiB0aGUg
cmV2ZXJzZSBjYXNlCi0gICAgICAgICAgICAvLyAgICAgICAgICB3ZSBhZGQgY2hrL25hbWUg
YW5kIG5hbWUgZ2V0cyBzdHJpcHBlZCBiZWNhdXNlIG5vZGUgcmVwb3J0cyByYz0xMSwgdGhl
biB3ZSBoYXZlIDIgd2l0aCBzYW1lCi0gICAgICAgICAgICAvLyAgICAgICAgICBjaGshID09
PiBpZiBub2RlIHJlcG9ydHMgMTEgdGhlbiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgc2Ft
ZSBwbGFpbiBjaGsuCisgICAgICAgIAkvLyBGSVhNRTogMC43OiBpZiB3ZSBhZGQgYSBuZXcg
dXJpIGNoay9uYW1lIGFsc28gY2hlY2sgaWYgd2UgYWxyZWFkeSBkb3dubG9hZCBjaGshCisg
ICAgICAgIAkvLyBQcm9ibGVtOiB3aGF0IGlmIENISyBpcyB3cm9uZywgdGhlbiB3ZSBoYXZl
IHRvIGFkZCBjaGsvbmFtZS4gQnV0IGluIHRoZSByZXZlcnNlIGNhc2UKKyAgICAgICAgCS8v
ICAgICAgICAgIHdlIGFkZCBjaGsvbmFtZSBhbmQgbmFtZSBnZXRzIHN0cmlwcGVkIGJlY2F1
c2Ugbm9kZSByZXBvcnRzIHJjPTExLCB0aGVuIHdlIGhhdmUgMiB3aXRoIHNhbWUKKyAgICAg
ICAgCS8vICAgICAgICAgIGNoayEgPT0+IGlmIG5vZGUgcmVwb3J0cyAxMSB0aGVuIGNoZWNr
IGlmIHdlIGhhdmUgYWxyZWFkeSBzYW1lIHBsYWluIGNoay4KIAotCQkJaWYgKGl0ZW1Ub0Fk
ZC5nZXRLZXkoKSAhPSBudWxsCi0JCQkJJiYgaXRlbS5nZXRLZXkoKSAhPSBudWxsCi0JCQkJ
JiYgaXRlbS5nZXRLZXkoKS5lcXVhbHMoaXRlbVRvQWRkLmdldEtleSgpKSkKLSAgICAgICAg
ICAgIHsKLQkJCQkvLyBhbHJlYWR5IGluIG1vZGVsIChjb21wYXJlZCBieSBrZXkpCi0JCQkJ
cmV0dXJuIGZhbHNlOwotCQkJfQorICAgICAgICAJaWYgKGl0ZW1Ub0FkZC5nZXRLZXkoKSAh
PSBudWxsCisgICAgICAgIAkJCSYmIGl0ZW0uZ2V0S2V5KCkgIT0gbnVsbAorICAgICAgICAJ
CQkmJiBpdGVtLmdldEtleSgpLmVxdWFscyhpdGVtVG9BZGQuZ2V0S2V5KCkpKQorICAgICAg
ICAJeworICAgICAgICAJCS8vIGFscmVhZHkgaW4gbW9kZWwgKGNvbXBhcmVkIGJ5IGtleSkK
KyAgICAgICAgCQlyZXR1cm4gZmFsc2U7CisgICAgICAgIAl9CiAKLSAgICAgICAgICAgIC8v
IEZJWE1FOiBhbHNvIGNoZWNrIGRvd25sb2FkZGlyIGZvciBzYW1lIGZpbGVuYW1lIGFuZCBi
dWlsZCBuZXcgbmFtZQotICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0RmlsZW5hbWUoKS5lcXVh
bHMoaXRlbVRvQWRkLmdldEZpbGVuYW1lKCkpKSB7Ci0JCQkJLy8gc2FtZSBuYW1lLCBidXQg
ZGlmZmVyZW50IGtleS4gLSByZW5hbWUgcXVpdGVseQotCQkJCWludCBjbnQgPSAyOwotCQkJ
CXdoaWxlICh0cnVlKSB7Ci0JCQkJCWZpbmFsIFN0cmluZyBuZXh0TmV3TmFtZSA9IGl0ZW1U
b0FkZC5nZXRGaWxlbmFtZSgpICsgIl8iICsgY250OwotCQkJCQlpdGVtVG9BZGQuc2V0Rmls
ZU5hbWUobmV4dE5ld05hbWUpOwotCQkJCQlpZiAoYWRkRG93bmxvYWRJdGVtKGl0ZW1Ub0Fk
ZCkgPT0gdHJ1ZSkgewotCQkJCQkJLy8gYWRkZWQgdG8gbW9kZWwKLQkJCQkJCXJldHVybiB0
cnVlOwotCQkJCQl9Ci0JCQkJCWNudCsrOwotCQkJCX0KLQkJCQkvLyB3ZSBzaG91bGQgbmV2
ZXIgY29tZSBoZXJlCi0JCQl9Ci0JCX0KLQkJLy8gbm90IGluIG1vZGVsLCBhZGQKLQkJYWRk
SXRlbShpdGVtVG9BZGQpOwotCQlyZXR1cm4gdHJ1ZTsKKyAgICAgICAgCS8vIEZJWE1FOiBh
bHNvIGNoZWNrIGRvd25sb2FkZGlyIGZvciBzYW1lIGZpbGVuYW1lIGFuZCBidWlsZCBuZXcg
bmFtZQorICAgICAgICAJaWYgKGl0ZW0uZ2V0RmlsZW5hbWUoKS5lcXVhbHMoaXRlbVRvQWRk
LmdldEZpbGVuYW1lKCkpKSB7CisgICAgICAgIAkJLy8gc2FtZSBuYW1lLCBidXQgZGlmZmVy
ZW50IGtleS4gLSByZW5hbWUgcXVpdGVseQorICAgICAgICAJCWludCBjbnQgPSAyOworICAg
ICAgICAJCXdoaWxlICh0cnVlKSB7CisgICAgICAgIAkJCWZpbmFsIFN0cmluZyBuZXh0TmV3
TmFtZSA9IGl0ZW1Ub0FkZC5nZXRGaWxlbmFtZSgpICsgIl8iICsgY250OworICAgICAgICAJ
CQlpdGVtVG9BZGQuc2V0RmlsZU5hbWUobmV4dE5ld05hbWUpOworICAgICAgICAJCQlpZiAo
YWRkRG93bmxvYWRJdGVtKGl0ZW1Ub0FkZCkgPT0gdHJ1ZSkgeworICAgICAgICAJCQkJLy8g
YWRkZWQgdG8gbW9kZWwKKyAgICAgICAgCQkJCXJldHVybiB0cnVlOworICAgICAgICAJCQl9
CisgICAgICAgIAkJCWNudCsrOworICAgICAgICAJCX0KKyAgICAgICAgCQkvLyB3ZSBzaG91
bGQgbmV2ZXIgY29tZSBoZXJlCisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgLy8g
bm90IGluIG1vZGVsLCBhZGQKKyAgICAgICAgYWRkSXRlbShpdGVtVG9BZGQpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKIAl9CiAKICAgICBwdWJsaWMgdm9pZCBhZGRFeHRlcm5hbEl0ZW0o
ZmluYWwgRnJvc3REb3dubG9hZEl0ZW0gaSkgewpJbmRleDogc291cmNlL2Zyb3N0L2ZpbGVU
cmFuc2Zlci9kb3dubG9hZC9Gcm9zdERvd25sb2FkSXRlbS5qYXZhDQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gc291cmNlL2Zyb3N0L2ZpbGVUcmFuc2Zlci9kb3dubG9hZC9Gcm9zdERvd25sb2Fk
SXRlbS5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9mcm9zdC9maWxlVHJhbnNm
ZXIvZG93bmxvYWQvRnJvc3REb3dubG9hZEl0ZW0uamF2YQkod29ya2luZyBjb3B5KQ0KQEAg
LTM0MSw4ICszNDEsMTMgQEANCiAgICAgICAgIHJldHVybiBkb3dubG9hZERpcjsKICAgICB9
CiAKLSAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZERpcihmaW5hbCBTdHJpbmcgZGlyKSB7
Ci0gICAgCWRvd25sb2FkRGlyID0gRmlsZUFjY2Vzcy5hcHBlbmRTZXBhcmF0b3IoZGlyKTsK
KyAgICBwdWJsaWMgYm9vbGVhbiBzZXREb3dubG9hZERpcihmaW5hbCBTdHJpbmcgZGlyKSB7
CisgICAgCVN0cmluZyBkaXJOYW1lID0gRmlsZUFjY2Vzcy5hcHBlbmRTZXBhcmF0b3IoZGly
KTsKKyAgICAJaWYoIEZpbGVBY2Nlc3MuY3JlYXRlRGlyKG5ldyBqYXZhLmlvLkZpbGUoZGly
TmFtZSkpICkgeworICAgIAkJZG93bmxvYWREaXIgPSBkaXJOYW1lOworICAgIAkJcmV0dXJu
IHRydWU7CisgICAgCX0KKyAgICAJcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHB1Ymxp
YyB2b2lkIHNldEZpbGVuYW1lUHJlZml4KGZpbmFsIFN0cmluZyBuZXdQcmVmaXgpIHsKSW5k
ZXg6IHNvdXJjZS9mcm9zdC9ndWkvQWRkTmV3RG93bmxvYWRzRGlhbG9nLmphdmENCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3QvZ3VpL0FkZE5ld0Rvd25sb2Fkc0RpYWxvZy5q
YXZhCShyZXZpc2lvbiAwKQ0KKysrIHNvdXJjZS9mcm9zdC9ndWkvQWRkTmV3RG93bmxvYWRz
RGlhbG9nLmphdmEJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDM0MCBAQA0KK3BhY2thZ2Ug
ZnJvc3QuZ3VpOworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGph
dmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsK
K2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2
ZW50Lk1vdXNlTGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBv
cnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5
OworaW1wb3J0IGphdmF4LnN3aW5nLkJveDsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlv
dXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5K
RmlsZUNob29zZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOworaW1wb3J0IGphdmF4
LnN3aW5nLkpNZW51OworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKK2ltcG9ydCBq
YXZheC5zd2luZy5KUGFuZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Citp
bXBvcnQgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsOworaW1wb3J0IGphdmF4LnN3
aW5nLldpbmRvd0NvbnN0YW50czsKKworaW1wb3J0IGZyb3N0LkNvcmU7CitpbXBvcnQgZnJv
c3QuU2V0dGluZ3NDbGFzczsKK2ltcG9ydCBmcm9zdC5maWxlVHJhbnNmZXIuZG93bmxvYWQu
RnJvc3REb3dubG9hZEl0ZW07CitpbXBvcnQgZnJvc3QuZ3VpLm1vZGVsLkFkZE5ld0Rvd25s
b2Fkc1RhYmxlTW9kZWw7CitpbXBvcnQgZnJvc3QuZ3VpLm1vZGVsLlRhYmxlTWVtYmVyOwor
aW1wb3J0IGZyb3N0LnN0b3JhZ2UucGVyc3QuVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlOwor
aW1wb3J0IGZyb3N0LnV0aWwuZ3VpLkpTa2lubmFibGVQb3B1cE1lbnU7CitpbXBvcnQgZnJv
c3QudXRpbC5ndWkudHJhbnNsYXRpb24uTGFuZ3VhZ2U7CisKK3B1YmxpYyBjbGFzcyBBZGRO
ZXdEb3dubG9hZHNEaWFsb2cgZXh0ZW5kcyBqYXZheC5zd2luZy5KRGlhbG9nIHsKKworCXBy
aXZhdGUgZmluYWwgTGFuZ3VhZ2UgbGFuZ3VhZ2U7CisJcHJpdmF0ZSBmaW5hbCBUcmFja0Rv
d25sb2FkS2V5c1N0b3JhZ2UgdHJhY2tEb3dubG9hZEtleXNTdG9yYWdlOworCisJcHJpdmF0
ZSBBZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWw7
CisJcHJpdmF0ZSBTb3J0ZWRUYWJsZSBhZGROZXdEb3dubG9hZHNUYWJsZTsKKwlwcml2YXRl
IEpCdXR0b24gb2tCdXR0b247CisJcHJpdmF0ZSBKQnV0dG9uIGNhbmNlbEJ1dHRvbjsKKwlw
cml2YXRlIEpTa2lubmFibGVQb3B1cE1lbnUgdGFibGVQb3B1cE1lbnU7CisJCisJcHJpdmF0
ZSBib29sZWFuIGFkZERvd25sb2FkczsgCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25n
IHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCXB1YmxpYyBBZGROZXdEb3dubG9hZHNEaWFs
b2coSkZyYW1lIGZyYW1lLCBMaXN0PEZyb3N0RG93bmxvYWRJdGVtPiBmcm9zdERvd25sb2Fk
SXRlbUxpc3QpIHsKKwkJc3VwZXIoZnJhbWUpOworCQlzZXRNb2RhbCh0cnVlKTsKKwkJYWRk
RG93bmxvYWRzID0gZmFsc2U7CisJCWxhbmd1YWdlID0gTGFuZ3VhZ2UuZ2V0SW5zdGFuY2Uo
KTsKKwkJdHJhY2tEb3dubG9hZEtleXNTdG9yYWdlID0gVHJhY2tEb3dubG9hZEtleXNTdG9y
YWdlLmluc3QoKTsKKwkJCisJCXNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25z
dGFudHMuRElTUE9TRV9PTl9DTE9TRSk7CisKKwkJaW5pdEdVSSgpOworCX0KKwkKKwlwcml2
YXRlIHZvaWQgaW5pdEdVSSgpIHsKKwkJdHJ5IHsKKwkJCXNldFRpdGxlKGxhbmd1YWdlLmdl
dFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLnRpdGxlIikpOworCQkJc2V0U2l6ZSg4
MDAsIDUwMCk7CisJCQl0aGlzLnNldFJlc2l6YWJsZSh0cnVlKTsKKworCQkJLy8gRG93bmxv
YWQgVGFibGUKKwkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwgPSBuZXcgQWRkTmV3RG93
bmxvYWRzVGFibGVNb2RlbCgpOworCQkJYWRkTmV3RG93bmxvYWRzVGFibGUgPSBuZXcgU29y
dGVkVGFibGUoIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwgKTsKKwkJCWFkZE5ld0Rvd25s
b2Fkc1RhYmxlLnNldFJvd1NlbGVjdGlvbkFsbG93ZWQodHJ1ZSk7CisJCQlhZGROZXdEb3du
bG9hZHNUYWJsZS5zZXRTZWxlY3Rpb25Nb2RlKCBMaXN0U2VsZWN0aW9uTW9kZWwuTVVMVElQ
TEVfSU5URVJWQUxfU0VMRUNUSU9OICk7CisJCQlhZGROZXdEb3dubG9hZHNUYWJsZS5zZXRS
b3dIZWlnaHQoMTgpOworCisJCQkvLyBPSyBCdXR0b24KKwkJCW9rQnV0dG9uID0gbmV3IEpC
dXR0b24obGFuZ3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ub2siKSk7CisJCQlva0J1dHRvbi5h
ZGRBY3Rpb25MaXN0ZW5lciggbmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkg
eworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBl
KSB7CisJCQkJCWFkZERvd25sb2FkcyA9IHRydWU7CisJCQkJCWRpc3Bvc2UoKTsKKwkJCQl9
IAorCQkJfSk7CisJCQkKKwkJCS8vIENhbmNlbCBCdXR0b24KKwkJCWNhbmNlbEJ1dHRvbiA9
IG5ldyBKQnV0dG9uKGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLmNhbmNlbCIpKTsKKwkJ
CWNhbmNlbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lciggbmV3IGphdmEuYXd0LmV2ZW50LkFj
dGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChmaW5h
bCBBY3Rpb25FdmVudCBlKSB7CisJCQkJCWFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuY2xl
YXJEYXRhTW9kZWwoKTsKKwkJCQkJZGlzcG9zZSgpOworCQkJCX0gCisJCQl9KTsKKworCQkJ
Ly8gQnV0dG9uIHJvdworCQkJZmluYWwgSlBhbmVsIGJ1dHRvbnNQYW5lbCA9IG5ldyBKUGFu
ZWwobmV3IEJvcmRlckxheW91dCgpKTsKKwkJCWJ1dHRvbnNQYW5lbC5zZXRMYXlvdXQoIG5l
dyBCb3hMYXlvdXQoIGJ1dHRvbnNQYW5lbCwgQm94TGF5b3V0LlhfQVhJUyApKTsKKwkJCWJ1
dHRvbnNQYW5lbC5hZGQoIEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpICk7CisKKwkJCWJ1
dHRvbnNQYW5lbC5hZGQoIGNhbmNlbEJ1dHRvbiApOworCQkJYnV0dG9uc1BhbmVsLmFkZChC
b3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMTAsMykpKTsKKwkJCWJ1dHRvbnNQ
YW5lbC5hZGQoIG9rQnV0dG9uICk7CisJCQlidXR0b25zUGFuZWwuc2V0Qm9yZGVyKEJvcmRl
ckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMTAsMCwwLDApKTsKKworCQkJLy8gRG93bmxv
YWQgVGFibGUKKwkJCWZpbmFsIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9s
bFBhbmUoYWRkTmV3RG93bmxvYWRzVGFibGUpOworCQkJc2Nyb2xsUGFuZS5zZXRXaGVlbFNj
cm9sbGluZ0VuYWJsZWQodHJ1ZSk7CisKKwkJCS8vIG1haW4gcGFuZWwKKwkJCWZpbmFsIEpQ
YW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCQlt
YWluUGFuZWwuYWRkKCBzY3JvbGxQYW5lLCBCb3JkZXJMYXlvdXQuQ0VOVEVSICk7CisJCQlt
YWluUGFuZWwuYWRkKCBidXR0b25zUGFuZWwsIEJvcmRlckxheW91dC5TT1VUSCApOworCQkJ
bWFpblBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDUs
Nyw3LDcpKTsKKworCQkJdGhpcy5nZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9y
ZGVyTGF5b3V0KCkpOworCQkJdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZChtYWluUGFuZWws
IG51bGwpOworCisJCQl0aGlzLmluaXRQb3B1cE1lbnUoKTsKKworCQl9IGNhdGNoIChFeGNl
cHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCXB1Ymxp
YyBMaXN0PEZyb3N0RG93bmxvYWRJdGVtPiBzdGFydERpYWxvZyhMaXN0PEZyb3N0RG93bmxv
YWRJdGVtPiBmb3JzdERvd25sb2FkSXRtZUxpc3QpIHsKKwkJLy8gbG9hZCBkYXRhIGludG8g
dGFibGUKKwkJdGhpcy5sb2FkTmV3RG93bmxvYWRzSW50b1RhYmxlKGZvcnN0RG93bmxvYWRJ
dG1lTGlzdCk7CisJCQorCQkvLyBkaXNwbGF5IHRhYmxlCisJCXNldFZpc2libGUodHJ1ZSk7
IC8vIGJsb2NraW5nIQorCQkKKwkJLy8gcmV0dXJuIGl0ZW1zIGluIHRhYmxlCisJCWZvcnN0
RG93bmxvYWRJdG1lTGlzdCA9IG5ldyBMaW5rZWRMaXN0PEZyb3N0RG93bmxvYWRJdGVtPigp
OworCQlpZiggYWRkRG93bmxvYWRzICkgeworCQkJaW50IG51bWJlck9mUm93cyA9IGFkZE5l
d0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93Q291bnQoKTsKKwkJCWZvciggaW50IGluZGV4
UG9zID0gMDsgaW5kZXhQb3MgPCBudW1iZXJPZlJvd3M7IGluZGV4UG9zKyspIHsKKwkJCQlm
aW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciByb3cgPSAoQWRkTmV3RG93bmxvYWRz
VGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KGluZGV4UG9z
KTsKKwkJCQlmb3JzdERvd25sb2FkSXRtZUxpc3QuYWRkKCByb3cuZ2V0RG93bmxvYWRJdGVt
KCkgKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGZvcnN0RG93bmxvYWRJdG1lTGlzdDsK
Kwl9CisKKwlwcml2YXRlIHZvaWQgbG9hZE5ld0Rvd25sb2Fkc0ludG9UYWJsZShMaXN0PEZy
b3N0RG93bmxvYWRJdGVtPiBmb3JzdERvd25sb2FkSXRtZUxpc3QpIHsKKwkJdGhpcy5hZGRO
ZXdEb3dubG9hZHNUYWJsZU1vZGVsLmNsZWFyRGF0YU1vZGVsKCk7CisJCWZvciggRnJvc3RE
b3dubG9hZEl0ZW0gZnJvRG93bmxvYWRJdGVtIDogZm9yc3REb3dubG9hZEl0bWVMaXN0KSB7
CisJCQlmaW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciBhZGROZXdEb3dubG9hZHNU
YWJsZU1lbWJlciA9IG5ldyBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlcihmcm9Eb3dubG9h
ZEl0ZW0pOworCQkJdGhpcy5hZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmFkZFJvdyhhZGRO
ZXdEb3dubG9hZHNUYWJsZU1lbWJlcik7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5p
dFBvcHVwTWVudSgpIHsKKwkJdGFibGVQb3B1cE1lbnUgPSBuZXcgSlNraW5uYWJsZVBvcHVw
TWVudSgpOworCQkKKwkJLy8gQ2hhbmdlIERvd25sb2FkIERpcmVjdG9yeQorCQlmaW5hbCBK
TWVudUl0ZW0gY2hhbmdlRG93bmxvYWREaXIgPSBuZXcgSk1lbnVJdGVtKGxhbmd1YWdlLmdl
dFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlhbG9nLmJ1dHRvbi5jaGFuZ2VEb3dubG9hZERp
ciIpKTsKKwkJY2hhbmdlRG93bmxvYWREaXIuYWRkQWN0aW9uTGlzdGVuZXIoIG5ldyBqYXZh
LmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBl
cmZvcm1lZChmaW5hbCBBY3Rpb25FdmVudCBhY3Rpb25FdmVudCkgeworCQkJCWNoYW5nZURv
d25sb2FkRGlyX2FjdGlvblBlcmZvcm1lZChhY3Rpb25FdmVudCk7CisJCQl9IAorCQl9KTsK
KworCQkvLyBSZW1vdmUgaXRlbSBmcm9tIGxpc3QKKwkJZmluYWwgSk1lbnVJdGVtIHJlbW92
ZURvd25sb2FkID0gbmV3IEpNZW51SXRlbShsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rv
d25sb2Fkc0RpYWxvZy5idXR0b24ucmVtb3ZlRG93bmxvYWQiKSk7CisJCXJlbW92ZURvd25s
b2FkLmFkZEFjdGlvbkxpc3RlbmVyKCBuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVu
ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZl
bnQgYWN0aW9uRXZlbnQpIHsKKwkJCQlyZW1vdmVEb3dubG9hZF9hY3Rpb25QZXJmb3JtZWQo
YWN0aW9uRXZlbnQpOworCQkJfSAKKwkJfSk7CisJCQorCQkvLyBDaGFuZ2UgUHJpb3JpdHkK
KwkJSk1lbnUgY2hhbmdlUHJpb3JpdHlNZW51ID0gbmV3IEpNZW51KGxhbmd1YWdlLmdldFN0
cmluZygiQ29tbW9uLnByaW9yaXR5LmNoYW5nZVByaW9yaXR5IikpOworCQlmaW5hbCBpbnQg
bnVtYmVyT2ZQcmlvcml0aWVzID0gNzsKKwkJSk1lbnVJdGVtW10gcHJpb0l0ZW1MaXN0ID0g
bmV3IEpNZW51SXRlbVtudW1iZXJPZlByaW9yaXRpZXNdOworCQkKKwkJZm9yKGludCBpID0g
MDsgaSA8IG51bWJlck9mUHJpb3JpdGllczsgaSsrKSB7CisJCQlmaW5hbCBpbnQgcHJpb3Jp
dHkgPSBpOworCQkJcHJpb0l0ZW1MaXN0W3ByaW9yaXR5XSA9IG5ldyBKTWVudUl0ZW0obGFu
Z3VhZ2UuZ2V0U3RyaW5nKCJDb21tb24ucHJpb3JpdHkucHJpb3JpdHkiICsgcHJpb3JpdHkp
KTsKKwkJCWNoYW5nZVByaW9yaXR5TWVudS5hZGQocHJpb0l0ZW1MaXN0W3ByaW9yaXR5XSk7
CisJCQlwcmlvSXRlbUxpc3RbcHJpb3JpdHldLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZh
LmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25Q
ZXJmb3JtZWQoZmluYWwgQWN0aW9uRXZlbnQgYWN0aW9uRXZlbnQpIHsKKwkJCQkJY2hhbmdl
UHJpb3JpdHlfYWN0aW9uUGVyZm9ybWVkKGFjdGlvbkV2ZW50LCBwcmlvcml0eSk7CisJCQkJ
fSAKKwkJCX0pOworCQl9CisJCQorCQkvLyBDb21wb3NlIHBvcHVwIG1lbnUKKwkJdGFibGVQ
b3B1cE1lbnUuYWRkKGNoYW5nZURvd25sb2FkRGlyKTsKKwkJdGFibGVQb3B1cE1lbnUuYWRk
U2VwYXJhdG9yKCk7CisJCXRhYmxlUG9wdXBNZW51LmFkZChyZW1vdmVEb3dubG9hZCk7CisJ
CXRhYmxlUG9wdXBNZW51LmFkZFNlcGFyYXRvcigpOworCQl0YWJsZVBvcHVwTWVudS5hZGQo
Y2hhbmdlUHJpb3JpdHlNZW51KTsKKworCQl0aGlzLmFkZE5ld0Rvd25sb2Fkc1RhYmxlLmFk
ZE1vdXNlTGlzdGVuZXIobmV3IFRhYmxlUG9wdXBNZW51TW91c2VMaXN0ZW5lcigpKTsKKwl9
CisJCisJcHJpdmF0ZSB2b2lkIGNoYW5nZURvd25sb2FkRGlyX2FjdGlvblBlcmZvcm1lZChm
aW5hbCBBY3Rpb25FdmVudCBhY3Rpb25FdmVudCkgeworCQlmaW5hbCBpbnRbXSBzZWxlY3Rl
ZFJvd3MgPSBhZGROZXdEb3dubG9hZHNUYWJsZS5nZXRTZWxlY3RlZFJvd3MoKTsKKworCQlp
Ziggc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDAgKSB7CisJCQkvLyBPcGVuIGNob29zZSBEaXJl
Y3RvcnkgZGlhbG9nCisJCQlKRmlsZUNob29zZXIgY2hvb3NlciA9IG5ldyBKRmlsZUNob29z
ZXIoKTsgCisJCQljaG9vc2VyLnNldEN1cnJlbnREaXJlY3RvcnkoCisJCQkJbmV3IGphdmEu
aW8uRmlsZSgKKwkJCQkJQ29yZS5mcm9zdFNldHRpbmdzLmdldERlZmF1bHRWYWx1ZShTZXR0
aW5nc0NsYXNzLkRJUl9ET1dOTE9BRCkKKwkJCQkpCisJCQkpOworCQkJY2hvb3Nlci5zZXRE
aWFsb2dUaXRsZShsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy5j
aGFuZ2VEaXJEaWFsb2cudGl0bGUiKSk7CisJCQljaG9vc2VyLnNldEZpbGVTZWxlY3Rpb25N
b2RlKEpGaWxlQ2hvb3Nlci5ESVJFQ1RPUklFU19PTkxZKTsKKwkJCWNob29zZXIuc2V0QWNj
ZXB0QWxsRmlsZUZpbHRlclVzZWQoZmFsc2UpOworCQkJaWYgKGNob29zZXIuc2hvd09wZW5E
aWFsb2codGhpcykgIT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7CisJCQkJcmV0
dXJuOworCQkJfQorCisJCQkvLyBTZXQgbmV3IGRpciBmb3Igc2VsZWN0ZWQgaXRlbXMKKwkJ
CWZvciggaW50IHJvd0luZGV4IDogc2VsZWN0ZWRSb3dzICkgeworCQkJCWlmKCByb3dJbmRl
eCA+PSBhZGROZXdEb3dubG9hZHNUYWJsZS5nZXRSb3dDb3VudCgpICkgeworCQkJCQljb250
aW51ZTsgLy8gcGFyYW5vaWEKKwkJCQl9CisKKwkJCQkvLyBhZGQgdGhlIGJvYXJkKHMpIHRv
IGJvYXJkIHRyZWUgYW5kIHJlbW92ZSBpdCBmcm9tIHRhYmxlCisJCQkJZmluYWwgQWRkTmV3
RG93bmxvYWRzVGFibGVNZW1iZXIgcm93ID0gKEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVy
KSBhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmdldFJvdyhyb3dJbmRleCk7CisJCQkJcm93
LmdldERvd25sb2FkSXRlbSgpLnNldERvd25sb2FkRGlyKGNob29zZXIuZ2V0U2VsZWN0ZWRG
aWxlKCkudG9TdHJpbmcoKSk7CisJCQkJcm93LnVwZGF0ZUNvbW1lbnQoKTsKKwkJCX0KKwkJ
CWFkZE5ld0Rvd25sb2Fkc1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9CisKKwlw
cml2YXRlIHZvaWQgcmVtb3ZlRG93bmxvYWRfYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFjdGlv
bkV2ZW50IGUpIHsKKwkJZmluYWwgaW50W10gc2VsZWN0ZWRSb3dzID0gYWRkTmV3RG93bmxv
YWRzVGFibGUuZ2V0U2VsZWN0ZWRSb3dzKCk7CisKKwkJaWYoIHNlbGVjdGVkUm93cy5sZW5n
dGggPiAwICkgeworCQkJZm9yKCBpbnQgeiA9IHNlbGVjdGVkUm93cy5sZW5ndGggLSAxOyB6
ID4gLTE7IHotLSApIHsKKwkJCQlmaW5hbCBpbnQgcm93SXggPSBzZWxlY3RlZFJvd3Nbel07
CisKKwkJCQlpZiggcm93SXggPj0gYWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbC5nZXRSb3dD
b3VudCgpICkgeworCQkJCQljb250aW51ZTsgLy8gcGFyYW5vaWEKKwkJCQl9CisKKwkJCQlm
aW5hbCBBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlciByb3cgPSAoQWRkTmV3RG93bmxvYWRz
VGFibGVNZW1iZXIpIGFkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuZ2V0Um93KHJvd0l4KTsK
KwkJCQlhZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmRlbGV0ZVJvdyhyb3cpOworCQkJfQor
CQkJYWRkTmV3RG93bmxvYWRzVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKKwkJfQorCX0KKwkK
Kwlwcml2YXRlIHZvaWQgY2hhbmdlUHJpb3JpdHlfYWN0aW9uUGVyZm9ybWVkKGZpbmFsIEFj
dGlvbkV2ZW50IGUsIGZpbmFsIGludCBwcmlvcml0eSkgeworCQlmaW5hbCBpbnRbXSBzZWxl
Y3RlZFJvd3MgPSBhZGROZXdEb3dubG9hZHNUYWJsZS5nZXRTZWxlY3RlZFJvd3MoKTsKKwor
CQlpZiggc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDAgKSB7CisJCQlmb3IoIGludCB6ID0gc2Vs
ZWN0ZWRSb3dzLmxlbmd0aCAtIDE7IHogPiAtMTsgei0tICkgeworCQkJCWZpbmFsIGludCBy
b3dJeCA9IHNlbGVjdGVkUm93c1t6XTsKKworCQkJCWlmKCByb3dJeCA+PSBhZGROZXdEb3du
bG9hZHNUYWJsZU1vZGVsLmdldFJvd0NvdW50KCkgKSB7CisJCQkJCWNvbnRpbnVlOyAvLyBw
YXJhbm9pYQorCQkJCX0KKworCQkJCWZpbmFsIEFkZE5ld0Rvd25sb2Fkc1RhYmxlTWVtYmVy
IHJvdyA9IChBZGROZXdEb3dubG9hZHNUYWJsZU1lbWJlcikgYWRkTmV3RG93bmxvYWRzVGFi
bGVNb2RlbC5nZXRSb3cocm93SXgpOworCQkJCXJvdy5nZXREb3dubG9hZEl0ZW0oKS5zZXRQ
cmlvcml0eShwcmlvcml0eSk7CisJCQl9CisJCQlhZGROZXdEb3dubG9hZHNUYWJsZS5jbGVh
clNlbGVjdGlvbigpOworCQl9CisJfQorCisJY2xhc3MgQWRkTmV3RG93bmxvYWRzVGFibGVN
ZW1iZXIgaW1wbGVtZW50cyBUYWJsZU1lbWJlciB7CisKKwkJRnJvc3REb3dubG9hZEl0ZW0g
ZnJvc3REb3dubG9hZEl0ZW07CisJCVN0cmluZyBjb21tZW50OworCisJCXB1YmxpYyBBZGRO
ZXdEb3dubG9hZHNUYWJsZU1lbWJlcihmaW5hbCBGcm9zdERvd25sb2FkSXRlbSBmcm9zdERv
d25sb2FkSXRlbSl7CisJCQl0aGlzLmZyb3N0RG93bmxvYWRJdGVtID0gZnJvc3REb3dubG9h
ZEl0ZW07CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoZmluYWwgaW50IGNv
bHVtbikgeworCQkJc3dpdGNoKCBjb2x1bW4gKSB7CisJCQkJY2FzZSAwOgorCQkJCQlyZXR1
cm4gZnJvc3REb3dubG9hZEl0ZW0uZ2V0RmlsZW5hbWUoKTsKKwkJCQljYXNlIDE6CisJCQkJ
CXJldHVybiBmcm9zdERvd25sb2FkSXRlbS5nZXRLZXkoKTsKKwkJCQljYXNlIDI6CisJCQkJ
CWlmKCBmcm9zdERvd25sb2FkSXRlbS5nZXRQcmlvcml0eSgpID09IC0xICkgeworCQkJCQkJ
ZnJvc3REb3dubG9hZEl0ZW0uc2V0UHJpb3JpdHkoIENvcmUuZnJvc3RTZXR0aW5ncy5nZXRJ
bnRWYWx1ZShTZXR0aW5nc0NsYXNzLkZDUDJfREVGQVVMVF9QUklPX0ZJTEVfRE9XTkxPQUQg
KSk7CisJCQkJCX0KKwkJCQkJU3RyaW5nIHByaW8gPSAiQ29tbW9uLnByaW9yaXR5LnByaW9y
aXR5IiArIGZyb3N0RG93bmxvYWRJdGVtLmdldFByaW9yaXR5KCk7CisJCQkJCXJldHVybiBs
YW5ndWFnZS5nZXRTdHJpbmcocHJpbyk7CisJCQkJY2FzZSAzOgorCQkJCQlyZXR1cm4gZnJv
c3REb3dubG9hZEl0ZW0uZ2V0RG93bmxvYWREaXIoKTsKKwkJCQljYXNlIDQ6CisJCQkJCWlm
KGNvbW1lbnQgPT0gbnVsbCl7CisJCQkJCQl0aGlzLnVwZGF0ZUNvbW1lbnQoKTsKKwkJCQkJ
fQorCQkJCQlyZXR1cm4gY29tbWVudDsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJdGhyb3cgbmV3
IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gQ29sdW1uIHBvcyIpOworCQkJfQorCQl9CisJ
CQorCQlwdWJsaWMgdm9pZCB1cGRhdGVDb21tZW50KCkgeworCQkJLy8gSGFzIHRoaXMga2V5
IGFscmVhZHkgYmVlbiBkb3dubG9hZGVkPworCQkJaWYoIHRyYWNrRG93bmxvYWRLZXlzU3Rv
cmFnZS5zZWFyY2hJdGVtS2V5KCBmcm9zdERvd25sb2FkSXRlbS5nZXRLZXkoKSApICkgewor
CQkJCWNvbW1lbnQgPSBsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxv
Zy50YWJsZS5hbHJlYWR5RG93bmxvYWRlZCIpOworCQkJfSBlbHNlIGlmKCB0cmFja0Rvd25s
b2FkS2V5c1N0b3JhZ2Uuc2VhcmNoSXRlbU5hbWUoIGZyb3N0RG93bmxvYWRJdGVtLmdldEZp
bGVuYW1lKCkgKSApIHsKKwkJCQljb21tZW50ID0gbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGRO
ZXdEb3dubG9hZHNEaWFsb2cudGFibGUuYWxyZWFkeURvd25sb2FkZWROYW1lIik7CisJCQl9
IGVsc2UgaWYobmV3IGphdmEuaW8uRmlsZShmcm9zdERvd25sb2FkSXRlbS5nZXREb3dubG9h
ZERpcigpICsgZnJvc3REb3dubG9hZEl0ZW0uZ2V0RmlsZW5hbWUoKSkuZXhpc3RzKCkgKSB7
CisJCQkJY29tbWVudCA9IGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlh
bG9nLnRhYmxlLmFscmVhZHlFeGlzdHMiKTsKKwkJCX0gZWxzZSB7CisJCQkJY29tbWVudCA9
ICIiOworCQkJfQorCQl9CisKKwkJcHVibGljIGludCBjb21wYXJlVG8oZmluYWwgVGFibGVN
ZW1iZXIgYW5PdGhlciwgZmluYWwgaW50IHRhYmxlQ29sdW1JbmRleCkgeworCQkJZmluYWwg
U3RyaW5nIGMxID0gKFN0cmluZykgZ2V0VmFsdWVBdCh0YWJsZUNvbHVtSW5kZXgpOworCQkJ
ZmluYWwgU3RyaW5nIGMyID0gKFN0cmluZykgYW5PdGhlci5nZXRWYWx1ZUF0KHRhYmxlQ29s
dW1JbmRleCk7CisJCQlyZXR1cm4gYzEuY29tcGFyZVRvSWdub3JlQ2FzZShjMik7CisJCX0K
KwkJCisJCXB1YmxpYyBGcm9zdERvd25sb2FkSXRlbSBnZXREb3dubG9hZEl0ZW0oKXsKKwkJ
CXJldHVybiBmcm9zdERvd25sb2FkSXRlbTsKKwkJfQorCX0KKworCWNsYXNzIFRhYmxlUG9w
dXBNZW51TW91c2VMaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIgeworCQlwdWJs
aWMgdm9pZCBtb3VzZVJlbGVhc2VkKGZpbmFsIE1vdXNlRXZlbnQgZXZlbnQpIHsKKwkJCW1h
eWJlU2hvd1BvcHVwKGV2ZW50KTsKKwkJfQorCQlwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQo
ZmluYWwgTW91c2VFdmVudCBldmVudCkgeworCQkJbWF5YmVTaG93UG9wdXAoZXZlbnQpOwor
CQl9CisJCXB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChmaW5hbCBNb3VzZUV2ZW50IGV2ZW50
KSB7fQorCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyZWQoZmluYWwgTW91c2VFdmVudCBldmVu
dCkge30KKwkJcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoZmluYWwgTW91c2VFdmVudCBldmVu
dCkge30KKworCQlwcm90ZWN0ZWQgdm9pZCBtYXliZVNob3dQb3B1cChmaW5hbCBNb3VzZUV2
ZW50IGUpIHsKKwkJCWlmKCBlLmlzUG9wdXBUcmlnZ2VyKCkgKSB7CisJCQkJaWYoIGFkZE5l
d0Rvd25sb2Fkc1RhYmxlLmdldFNlbGVjdGVkUm93Q291bnQoKSA+IDAgKSB7CisJCQkJCS8v
IGRvbid0IHNob3cgbWVudSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCisJCQkJCXRhYmxlUG9w
dXBNZW51LnNob3coYWRkTmV3RG93bmxvYWRzVGFibGUsIGUuZ2V0WCgpLCBlLmdldFkoKSk7
CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpJbmRleDogc291cmNlL2Zyb3N0L2d1aS9tb2Rl
bC9BZGROZXdEb3dubG9hZHNUYWJsZU1vZGVsLmphdmENCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBz
b3VyY2UvZnJvc3QvZ3VpL21vZGVsL0FkZE5ld0Rvd25sb2Fkc1RhYmxlTW9kZWwuamF2YQko
cmV2aXNpb24gMCkNCisrKyBzb3VyY2UvZnJvc3QvZ3VpL21vZGVsL0FkZE5ld0Rvd25sb2Fk
c1RhYmxlTW9kZWwuamF2YQkocmV2aXNpb24gMCkNCkBAIC0wLDAgKzEsNTQgQEANCitwYWNr
YWdlIGZyb3N0Lmd1aS5tb2RlbDsKKworaW1wb3J0IGZyb3N0LnV0aWwuZ3VpLnRyYW5zbGF0
aW9uLkxhbmd1YWdlOworCitwdWJsaWMgY2xhc3MgQWRkTmV3RG93bmxvYWRzVGFibGVNb2Rl
bCBleHRlbmRzIFNvcnRlZFRhYmxlTW9kZWx7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9u
ZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwlwcml2YXRlIExhbmd1YWdlIGxhbmd1YWdl
ID0gbnVsbDsKKworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvbHVtbk5hbWVz
W10gPSBuZXcgU3RyaW5nWzVdOworCisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBDbGFzczw/
PiBjb2x1bW5DbGFzc2VzW10gPSAgeworCQlTdHJpbmcuY2xhc3MsCisJCVN0cmluZy5jbGFz
cywKKwkJU3RyaW5nLmNsYXNzLAorCQlTdHJpbmcuY2xhc3MsCisJCVN0cmluZy5jbGFzcwor
CX07CisKKwlwdWJsaWMgQWRkTmV3RG93bmxvYWRzVGFibGVNb2RlbCgpIHsKKwkJc3VwZXIo
KTsKKwkJbGFuZ3VhZ2UgPSBMYW5ndWFnZS5nZXRJbnN0YW5jZSgpOworCQlyZWZyZXNoTGFu
Z3VhZ2UoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVmcmVzaExhbmd1YWdlKCkgeworCQlj
b2x1bW5OYW1lc1swXSA9IGxhbmd1YWdlLmdldFN0cmluZygiQWRkTmV3RG93bmxvYWRzRGlh
bG9nLnRhYmxlLm5hbWUiKTsKKwkJY29sdW1uTmFtZXNbMV0gPSBsYW5ndWFnZS5nZXRTdHJp
bmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy50YWJsZS5rZXkiKTsKKwkJY29sdW1uTmFtZXNb
Ml0gPSBsYW5ndWFnZS5nZXRTdHJpbmcoIkFkZE5ld0Rvd25sb2Fkc0RpYWxvZy50YWJsZS5w
cmlvcml0eSIpOworCQljb2x1bW5OYW1lc1szXSA9IGxhbmd1YWdlLmdldFN0cmluZygiQWRk
TmV3RG93bmxvYWRzRGlhbG9nLnRhYmxlLmRvd25sb2FkRGlyIik7CisJCWNvbHVtbk5hbWVz
WzRdID0gbGFuZ3VhZ2UuZ2V0U3RyaW5nKCJBZGROZXdEb3dubG9hZHNEaWFsb2cudGFibGUu
Y29tbWVudCIpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCBy
b3csIGludCBjb2wpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBTdHJpbmcg
Z2V0Q29sdW1uTmFtZShpbnQgY29sdW1uKSB7CisJCWlmKCBjb2x1bW4gPj0gMCAmJiBjb2x1
bW4gPCBjb2x1bW5OYW1lcy5sZW5ndGggKQorCQkJcmV0dXJuIGNvbHVtbk5hbWVzW2NvbHVt
bl07CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQo
KSB7CisJCXJldHVybiBjb2x1bW5OYW1lcy5sZW5ndGg7CisJfQorCisJcHVibGljIENsYXNz
PD8+IGdldENvbHVtbkNsYXNzKGludCBjb2x1bW4pIHsKKwkJaWYoIGNvbHVtbiA+PSAwICYm
IGNvbHVtbiA8IGNvbHVtbkNsYXNzZXMubGVuZ3RoICkKKwkJCXJldHVybiBjb2x1bW5DbGFz
c2VzW2NvbHVtbl07CisJCXJldHVybiBudWxsOworCX0KKworfQpJbmRleDogc291cmNlL2Zy
b3N0L2d1aS9wcmVmZXJlbmNlcy9Eb3dubG9hZFBhbmVsLmphdmENCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBzb3VyY2UvZnJvc3QvZ3VpL3ByZWZlcmVuY2VzL0Rvd25sb2FkUGFuZWwuamF2YQko
cmV2aXNpb24gMzE5MikNCisrKyBzb3VyY2UvZnJvc3QvZ3VpL3ByZWZlcmVuY2VzL0Rvd25s
b2FkUGFuZWwuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTYyLDYgKzYyLDggQEANCiAgICAg
cHJpdmF0ZSBmaW5hbCBKQ2hlY2tCb3ggbG9nRG93bmxvYWRzQ2hlY2tCb3ggPSBuZXcgSkNo
ZWNrQm94KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBKQ2hlY2tCb3ggdHJhY2tEb3dubG9hZHND
aGVja0JveCA9IG5ldyBKQ2hlY2tCb3goKTsKIAorICAgIHByaXZhdGUgZmluYWwgSkNoZWNr
Qm94IHVzZUJvYXJkbmFtZURvd25sb2FkU3ViZm9sZGVyQ2hlY2tCb3ggPSBuZXcgSkNoZWNr
Qm94KCk7CisKICAgICBwcml2YXRlIGZpbmFsIEpMYWJlbCB3YWl0VGltZUxhYmVsID0gbmV3
IEpMYWJlbCgpOwogICAgIHByaXZhdGUgZmluYWwgSlRleHRGaWVsZCB3YWl0VGltZVRleHRG
aWVsZCA9IG5ldyBKVGV4dEZpZWxkKDYpOwogCkBAIC0xOTIsNiArMTk0LDEzIEBADQogICAg
ICAgICBjb25zdHJhaW50cy5ncmlkeCA9IDA7CiAgICAgICAgIGNvbnN0cmFpbnRzLmdyaWR3
aWR0aCA9IDM7CiAgICAgICAgIGNvbnN0cmFpbnRzLmluc2V0cyA9IGluc2V0czA1NTU7Cisg
ICAgICAgIGNvbnN0cmFpbnRzLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdF
U1Q7CisgICAgICAgIGFkZCh1c2VCb2FyZG5hbWVEb3dubG9hZFN1YmZvbGRlckNoZWNrQm94
LCBjb25zdHJhaW50cyk7CisKKyAgICAgICAgY29uc3RyYWludHMuZ3JpZHkrKzsKKyAgICAg
ICAgY29uc3RyYWludHMuZ3JpZHggPSAwOworICAgICAgICBjb25zdHJhaW50cy5ncmlkd2lk
dGggPSAzOworICAgICAgICBjb25zdHJhaW50cy5pbnNldHMgPSBpbnNldHMwNTU1OwogICAg
ICAgICBhZGQoZW5mb3JjZUZyb3N0UHJpb3JpdHlGaWxlRG93bmxvYWQsIGNvbnN0cmFpbnRz
KTsKIAogICAgICAgICBjb25zdHJhaW50cy5ncmlkeSsrOwpAQCAtMjI5LDYgKzIzOCw3IEBA
DQogICAgICAgICB3YWl0VGltZVRleHRGaWVsZC5zZXRUZXh0KCIiICsgc2V0dGluZ3MuZ2V0
SW50VmFsdWUoU2V0dGluZ3NDbGFzcy5ET1dOTE9BRF9XQUlUVElNRSkpOwogICAgICAgICBs
b2dEb3dubG9hZHNDaGVja0JveC5zZXRTZWxlY3RlZChzZXR0aW5ncy5nZXRCb29sVmFsdWUo
U2V0dGluZ3NDbGFzcy5MT0dfRE9XTkxPQURTX0VOQUJMRUQpKTsKICAgICAgICAgdHJhY2tE
b3dubG9hZHNDaGVja0JveC5zZXRTZWxlY3RlZChzZXR0aW5ncy5nZXRCb29sVmFsdWUoU2V0
dGluZ3NDbGFzcy5UUkFDS19ET1dOTE9BRFNfRU5BQkxFRCkpOworICAgICAgICB1c2VCb2Fy
ZG5hbWVEb3dubG9hZFN1YmZvbGRlckNoZWNrQm94LnNldFNlbGVjdGVkKHNldHRpbmdzLmdl
dEJvb2xWYWx1ZShTZXR0aW5nc0NsYXNzLlVTRV9CT0FSRE5BTUVfRE9XTkxPQURfU1VCRk9M
REVSX0VOQUJMRUQpKTsKICAgICAgICAgcHJpb3JpdHlUZXh0RmllbGQuc2V0VGV4dChzZXR0
aW5ncy5nZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkZDUDJfREVGQVVMVF9QUklPX0ZJTEVfRE9X
TkxPQUQpKTsKICAgICAgICAgZW5mb3JjZUZyb3N0UHJpb3JpdHlGaWxlRG93bmxvYWQuc2V0
U2VsZWN0ZWQoc2V0dGluZ3MuZ2V0Qm9vbFZhbHVlKFNldHRpbmdzQ2xhc3MuRkNQMl9FTkZP
UkNFX0ZST1NUX1BSSU9fRklMRV9ET1dOTE9BRCkpOwogICAgICAgICBleGVjVGV4dEZpZWxk
LnNldFRleHQoc2V0dGluZ3MuZ2V0VmFsdWUoU2V0dGluZ3NDbGFzcy5FWEVDX09OX0RPV05M
T0FEKSk7CkBAIC0yNDYsNiArMjU2LDggQEANCiAKICAgICAgICAgbG9nRG93bmxvYWRzQ2hl
Y2tCb3guc2V0VGV4dChsYW5ndWFnZS5nZXRTdHJpbmcoIk9wdGlvbnMuZG93bmxvYWRzLmxv
Z0Rvd25sb2FkcyIpKTsKICAgICAgICAgdHJhY2tEb3dubG9hZHNDaGVja0JveC5zZXRUZXh0
KGxhbmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMudHJhY2tEb3dubG9hZHMi
KSk7CisgICAgICAgIAorICAgICAgICB1c2VCb2FyZG5hbWVEb3dubG9hZFN1YmZvbGRlckNo
ZWNrQm94LnNldFRleHQobGFuZ3VhZ2UuZ2V0U3RyaW5nKCJPcHRpb25zLmRvd25sb2Fkcy51
c2VCb2FyZG5hbWVEb3dubG9hZFN1YmZvbGRlciIpKTsKIAogICAgICAgICBkaXJlY3RvcnlM
YWJlbC5zZXRUZXh0KGxhbmd1YWdlLmdldFN0cmluZygiT3B0aW9ucy5kb3dubG9hZHMuZG93
bmxvYWREaXJlY3RvcnkiKSk7CiAgICAgICAgIGJyb3dzZURpcmVjdG9yeUJ1dHRvbi5zZXRU
ZXh0KGxhbmd1YWdlLmdldFN0cmluZygiQ29tbW9uLmJyb3dzZSIpICsgIi4uLiIpOwpAQCAt
Mjc3LDYgKzI4OSw3IEBADQogCiAgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFNldHRpbmdz
Q2xhc3MuTE9HX0RPV05MT0FEU19FTkFCTEVELCBsb2dEb3dubG9hZHNDaGVja0JveC5pc1Nl
bGVjdGVkKCkpOwogICAgICAgICBzZXR0aW5ncy5zZXRWYWx1ZShTZXR0aW5nc0NsYXNzLlRS
QUNLX0RPV05MT0FEU19FTkFCTEVELCB0cmFja0Rvd25sb2Fkc0NoZWNrQm94LmlzU2VsZWN0
ZWQoKSk7CisgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFNldHRpbmdzQ2xhc3MuVVNFX0JP
QVJETkFNRV9ET1dOTE9BRF9TVUJGT0xERVJfRU5BQkxFRCwgdXNlQm9hcmRuYW1lRG93bmxv
YWRTdWJmb2xkZXJDaGVja0JveC5pc1NlbGVjdGVkKCkpOwogICAgICAgICBzZXR0aW5ncy5z
ZXRWYWx1ZShTZXR0aW5nc0NsYXNzLkZDUDJfREVGQVVMVF9QUklPX0ZJTEVfRE9XTkxPQUQs
IHByaW9yaXR5VGV4dEZpZWxkLmdldFRleHQoKSk7CiAgICAgICAgIHNldHRpbmdzLnNldFZh
bHVlKFNldHRpbmdzQ2xhc3MuRkNQMl9FTkZPUkNFX0ZST1NUX1BSSU9fRklMRV9ET1dOTE9B
RCwgZW5mb3JjZUZyb3N0UHJpb3JpdHlGaWxlRG93bmxvYWQuaXNTZWxlY3RlZCgpKTsKIApJ
bmRleDogc291cmNlL2Zyb3N0L21lc3NhZ2luZy9mcm9zdC9ndWkvTWVzc2FnZVRleHRQYW5l
LmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3QvbWVzc2FnaW5nL2Zyb3N0
L2d1aS9NZXNzYWdlVGV4dFBhbmUuamF2YQkocmV2aXNpb24gMzE5MikNCisrKyBzb3VyY2Uv
ZnJvc3QvbWVzc2FnaW5nL2Zyb3N0L2d1aS9NZXNzYWdlVGV4dFBhbmUuamF2YQkod29ya2lu
ZyBjb3B5KQ0KQEAgLTcyOSw4ICs3MjksMTcgQEANCiAgICAgICAgICAqLwogICAgICAgICBw
cml2YXRlIHZvaWQgZG93bmxvYWRBdHRhY2htZW50cygpIHsKICAgICAgICAgICAgIGZpbmFs
IEl0ZXJhdG9yPEZpbGVBdHRhY2htZW50PiBpdCA9IGdldEl0ZW1zKCkuaXRlcmF0b3IoKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgTGlzdDxGcm9zdERvd25sb2FkSXRlbT4gZnJv
c3REb3dubG9hZEl0ZW1MaXN0ID0gbmV3IExpbmtlZExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+
KCk7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRnJvc3REb3dubG9hZEl0ZW0+IGZy
b3N0RG93bmxvYWRJdGVtTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGcm9zdERvd25sb2Fk
SXRlbT4oKTsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQo
KSkgewogICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVBdHRhY2htZW50IGZhID0gaXQubmV4
dCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBmcm9zdERvd25s
b2FkSXRlbU1hcC5jb250YWluc0tleShmYS5nZXRLZXkoKSkpIHsKKyAgICAgICAgICAgIAkJ
Y29udGludWU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZhLmdldEZpbGVuYW1lKCk7CiAgICAgICAgICAg
ICAgICAgLy8gbWF5YmUgY29udmVydCBodG1sIGNvZGVzIChlLmcuICUyYyAtPiAsICkKICAg
ICAgICAgICAgICAgICBpZiggZmlsZW5hbWUuaW5kZXhPZigiJSIpID4gMCApIHsKQEAgLTc0
MCwxMiArNzQ5LDI5IEBADQogICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhM
ZXZlbC5TRVZFUkUsICJEZWNvZGUgb2YgSFRNTCBjb2RlIGZhaWxlZCIsIGV4KTsKICAgICAg
ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBm
aW5hbCBGcm9zdERvd25sb2FkSXRlbSBkbEl0ZW0gPSBuZXcgRnJvc3REb3dubG9hZEl0ZW0o
Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGZhLmdldEtleSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmEuZ2V0Rmls
ZVNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZ2V0RG93bmxvYWRNb2RlbCgpLmFkZERvd25s
b2FkSXRlbShkbEl0ZW0pOworICAgICAgICAgICAgICAgIGZpbmFsIEZyb3N0RG93bmxvYWRJ
dGVtIGZyb3N0RHdvbmxvYWRJdGVtID0gbmV3IEZyb3N0RG93bmxvYWRJdGVtKAorCSAgICAg
ICAgICAgICAgICBmaWxlbmFtZSwKKwkgICAgICAgICAgICAgICAgZmEuZ2V0S2V5KCksCisJ
ICAgICAgICAgICAgICAgIGZhLmdldEZpbGVTaXplKCkKKyAgICAgICAgICAgICAgICApOwor
ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZyb3N0RHdvbmxvYWRJdGVtLnNl
dEFzc29jaWF0ZWRNZXNzYWdlSWQoc2VsZWN0ZWRNZXNzYWdlLmdldE1lc3NhZ2VJZCgpKTsK
KyAgICAgICAgICAgICAgICBmcm9zdER3b25sb2FkSXRlbS5zZXRBc3NvY2lhdGVkQm9hcmRO
YW1lKHNlbGVjdGVkTWVzc2FnZS5nZXRCb2FyZCgpLmdldEJvYXJkRmlsZW5hbWUoKSk7Cisg
ICAgICAgICAgICAgICAgaWYoIENvcmUuZnJvc3RTZXR0aW5ncy5nZXRCb29sVmFsdWUoU2V0
dGluZ3NDbGFzcy5VU0VfQk9BUkROQU1FX0RPV05MT0FEX1NVQkZPTERFUl9FTkFCTEVEKSAp
eworICAgICAgICAgICAgICAgIAlmcm9zdER3b25sb2FkSXRlbS5zZXREb3dubG9hZERpcihm
cm9zdER3b25sb2FkSXRlbS5nZXREb3dubG9hZERpcigpLmNvbmNhdChmcm9zdER3b25sb2Fk
SXRlbS5nZXRBc3NvY2lhdGVkQm9hcmROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0ZW1MaXN0LmFkZCggZnJvc3REd29ubG9h
ZEl0ZW0gKTsKKyAgICAgICAgICAgICAgICBmcm9zdERvd25sb2FkSXRlbU1hcC5wdXQoZmEu
Z2V0S2V5KCksIGZyb3N0RHdvbmxvYWRJdGVtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0ZW1NYXAuY2xlYXIoKTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgZmluYWwgQWRkTmV3RG93bmxvYWRzRGlhbG9nIGFkZE5l
d0Rvd25sb2Fkc0RpYWxvZyA9IG5ldyBBZGROZXdEb3dubG9hZHNEaWFsb2cobWFpbkZyYW1l
LCBmcm9zdERvd25sb2FkSXRlbUxpc3QpOworICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0
ZW1MaXN0ID0gYWRkTmV3RG93bmxvYWRzRGlhbG9nLnN0YXJ0RGlhbG9nKGZyb3N0RG93bmxv
YWRJdGVtTGlzdCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvcihmaW5hbCBGcm9z
dERvd25sb2FkSXRlbSBmcm9zdERvd25sb2FkSXRlbSA6IGZyb3N0RG93bmxvYWRJdGVtTGlz
dCApIHsKKyAgICAgICAgICAgIAlnZXREb3dubG9hZE1vZGVsKCkuYWRkRG93bmxvYWRJdGVt
KGZyb3N0RG93bmxvYWRJdGVtKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAg
ICAgIC8qKgpAQCAtODgyLDEyICs5MDgsMTYgQEANCiAgICAgICAgICAgICBpZiggaXRlbXMg
PT0gbnVsbCApIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIExpc3Q8RnJvc3REb3dubG9hZEl0ZW0+IGZyb3N0
RG93bmxvYWRJdGVtTGlzdCA9IG5ldyBMaW5rZWRMaXN0PEZyb3N0RG93bmxvYWRJdGVtPigp
OworICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEZyb3N0RG93bmxvYWRJdGVtPiBmcm9z
dERvd25sb2FkSXRlbU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRnJvc3REb3dubG9hZEl0
ZW0+KCk7CiAKLSAgICAgICAgICAgIGZvciggZmluYWwgU3RyaW5nIGl0ZW0gOiBpdGVtcyAp
IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICAgICAgICAgIC8vIDAu
NzogdXNlIGtleS9maWxlbmFtZQotICAgICAgICAgICAgICAgIGtleSA9IGl0ZW07Ci0gICAg
ICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpdGVtLnN1YnN0cmluZyhpdGVtLmxhc3RJbmRl
eE9mKCIvIikrMSk7CisgICAgICAgICAgICBmb3IoIGZpbmFsIFN0cmluZyBrZXkgOiBpdGVt
cyApIHsKKyAgICAgICAgICAgIAlpZiggZnJvc3REb3dubG9hZEl0ZW1NYXAuY29udGFpbnNL
ZXkoa2V5KSkgeworICAgICAgICAgICAgCQljb250aW51ZTsKKyAgICAgICAgICAgIAl9Cisg
ICAgICAgICAgICAJCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBrZXkuc3Vic3Ry
aW5nKGtleS5sYXN0SW5kZXhPZigiLyIpKzEpOwogICAgICAgICAgICAgICAgIC8vIG1heWJl
IGNvbnZlcnQgaHRtbCBjb2RlcyAoZS5nLiAlMmMgLT4gLCApCiAgICAgICAgICAgICAgICAg
aWYoIG5hbWUuaW5kZXhPZigiJSIpID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5
IHsKQEAgLTg5Niw5ICs5MjYsMjQgQEANCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dn
ZXIubG9nKExldmVsLlNFVkVSRSwgIkRlY29kZSBvZiBIVE1MIGNvZGUgZmFpbGVkIiwgZXgp
OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIGZpbmFsIEZyb3N0RG93bmxvYWRJdGVtIGRsSXRlbSA9IG5ldyBGcm9zdERvd25s
b2FkSXRlbShuYW1lLCBrZXkpOwotICAgICAgICAgICAgICAgIGdldERvd25sb2FkTW9kZWwo
KS5hZGREb3dubG9hZEl0ZW0oZGxJdGVtKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBGcm9zdERvd25sb2FkSXRlbSBmcm9zdER3b25sb2FkSXRlbSA9IG5ldyBGcm9z
dERvd25sb2FkSXRlbShuYW1lLCBrZXkpOworICAgICAgICAgICAgICAgIGZyb3N0RHdvbmxv
YWRJdGVtLnNldEFzc29jaWF0ZWRNZXNzYWdlSWQoc2VsZWN0ZWRNZXNzYWdlLmdldE1lc3Nh
Z2VJZCgpKTsKKyAgICAgICAgICAgICAgICBmcm9zdER3b25sb2FkSXRlbS5zZXRBc3NvY2lh
dGVkQm9hcmROYW1lKHNlbGVjdGVkTWVzc2FnZS5nZXRCb2FyZCgpLmdldEJvYXJkRmlsZW5h
bWUoKSk7CisgICAgICAgICAgICAgICAgaWYoIENvcmUuZnJvc3RTZXR0aW5ncy5nZXRCb29s
VmFsdWUoU2V0dGluZ3NDbGFzcy5VU0VfQk9BUkROQU1FX0RPV05MT0FEX1NVQkZPTERFUl9F
TkFCTEVEKSApeworICAgICAgICAgICAgICAgIAlmcm9zdER3b25sb2FkSXRlbS5zZXREb3du
bG9hZERpcihmcm9zdER3b25sb2FkSXRlbS5nZXREb3dubG9hZERpcigpLmNvbmNhdChmcm9z
dER3b25sb2FkSXRlbS5nZXRBc3NvY2lhdGVkQm9hcmROYW1lKCkpKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgZnJvc3REb3dubG9hZEl0ZW1MaXN0LmFkZCggZnJv
c3REd29ubG9hZEl0ZW0gKTsKKyAgICAgICAgICAgICAgICBmcm9zdERvd25sb2FkSXRlbU1h
cC5wdXQoa2V5LCBmcm9zdER3b25sb2FkSXRlbSk7CiAgICAgICAgICAgICB9CisgICAgICAg
ICAgICBmcm9zdERvd25sb2FkSXRlbU1hcC5jbGVhcigpOworICAgICAgICAgICAgCisgICAg
ICAgICAgICBmaW5hbCBBZGROZXdEb3dubG9hZHNEaWFsb2cgYWRkTmV3RG93bmxvYWRzRGlh
bG9nID0gbmV3IEFkZE5ld0Rvd25sb2Fkc0RpYWxvZyhtYWluRnJhbWUsIGZyb3N0RG93bmxv
YWRJdGVtTGlzdCk7CisgICAgICAgICAgICBmcm9zdERvd25sb2FkSXRlbUxpc3QgPSBhZGRO
ZXdEb3dubG9hZHNEaWFsb2cuc3RhcnREaWFsb2coZnJvc3REb3dubG9hZEl0ZW1MaXN0KTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKGZpbmFsIEZyb3N0RG93bmxvYWRJdGVt
IGZyb3N0RG93bmxvYWRJdGVtIDogZnJvc3REb3dubG9hZEl0ZW1MaXN0ICkgeworICAgICAg
ICAgICAgCWdldERvd25sb2FkTW9kZWwoKS5hZGREb3dubG9hZEl0ZW0oZnJvc3REb3dubG9h
ZEl0ZW0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBM
aXN0PFN0cmluZz4gZ2V0SXRlbXMoZmluYWwgYm9vbGVhbiBnZXRBbGwpIHsKSW5kZXg6IHNv
dXJjZS9mcm9zdC9TZXR0aW5nc0NsYXNzLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3Vy
Y2UvZnJvc3QvU2V0dGluZ3NDbGFzcy5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJj
ZS9mcm9zdC9TZXR0aW5nc0NsYXNzLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC0yODEsNiAr
MjgxLDggQEANCiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDS19ET1dO
TE9BRFNfRU5BQkxFRCA9ICJ0cmFja0Rvd25sb2FkcyI7CiAKKyAgICBwdWJsaWMgc3RhdGlj
IGZpbmFsIFN0cmluZyBVU0VfQk9BUkROQU1FX0RPV05MT0FEX1NVQkZPTERFUl9FTkFCTEVE
ID0gInVzZUJvYXJkbmFtZURvd25sb2FkU3ViZm9sZGVyIjsKKwogICAgIHB1YmxpYyBTZXR0
aW5nc0NsYXNzKCkgewogICAgICAgICBzZXR0aW5nc0hhc2ggPSBuZXcgSGFzaHRhYmxlPFN0
cmluZyxPYmplY3Q+KCk7CiAgICAgICAgIC8vIHRoZSBGSVggY29uZmlnLmRpcgpAQCAtMTA0
OCw2ICsxMDUwLDcgQEANCiAgICAgICAgIGRlZmF1bHRzLnB1dChMT0dfRE9XTkxPQURTX0VO
QUJMRUQsICJmYWxzZSIpOwogICAgICAgICBkZWZhdWx0cy5wdXQoTE9HX1VQTE9BRFNfRU5B
QkxFRCwgImZhbHNlIik7CiAgICAgICAgIGRlZmF1bHRzLnB1dChUUkFDS19ET1dOTE9BRFNf
RU5BQkxFRCwgImZhbHNlIik7CisgICAgICAgIGRlZmF1bHRzLnB1dChVU0VfQk9BUkROQU1F
X0RPV05MT0FEX1NVQkZPTERFUl9FTkFCTEVELCAiZmFsc2UiKTsKIAogCiAgICAgICAgIGRl
ZmF1bHRzLnB1dChDT05GSVJNX01BUktfQUxMX01TR1NfUkVBRCwgInRydWUiKTsKSW5kZXg6
IHNvdXJjZS9mcm9zdC9zdG9yYWdlL3BlcnN0L1RyYWNrRG93bmxvYWRLZXlzLmphdmENCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3Qvc3RvcmFnZS9wZXJzdC9UcmFja0Rvd25s
b2FkS2V5cy5qYXZhCShyZXZpc2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9mcm9zdC9zdG9yYWdl
L3BlcnN0L1RyYWNrRG93bmxvYWRLZXlzLmphdmEJKHdvcmtpbmcgY29weSkNCkBAIC0xNSw3
ICsxNSw3IEBADQogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBp
ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQogIEZvdW5kYXRpb24sIEluYy4s
IDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLg0KLSovDQorICovDQog
cGFja2FnZSBmcm9zdC5zdG9yYWdlLnBlcnN0Ow0KIA0KIGltcG9ydCBvcmcuZ2FycmV0LnBl
cnN0Lio7DQpAQCAtMjgsMzggKzI4LDM4IEBADQogCXByaXZhdGUgU3RyaW5nIGNoa0tleTsN
CiAJcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7DQogCXByaXZhdGUgU3RyaW5nIGJvYXJkTmFt
ZTsNCi0gICAgcHJpdmF0ZSBsb25nIGZpbGVTaXplOyANCisJcHJpdmF0ZSBsb25nIGZpbGVT
aXplOyANCiAJcHJpdmF0ZSBsb25nIGRvd25sb2FkRmluaXNoZWRUaW1lOyAvLyB3aGVuIHdh
cyB0aGlzIGRvd25sb2FkIGZpbmlzaGVkDQogDQotICAgIC8vIHVzZWQgYnkgcGVyc3QNCi0g
ICAgcHVibGljIFRyYWNrRG93bmxvYWRLZXlzKCkge30NCi0gICAgDQotICAgIHB1YmxpYyBU
cmFja0Rvd25sb2FkS2V5cyhmaW5hbCBTdHJpbmcgY2hrS2V5LCBmaW5hbCBTdHJpbmcgZmls
ZU5hbWUsIA0KLSAgICAJCWZpbmFsIFN0cmluZyBib2FyZE5hbWUsIGxvbmcgZmlsZVNpemUs
IGxvbmcgZG93bmxvYWRGaW5pc2hlZFRpbWUpIHsNCi0gICAgICAgIHRoaXMuY2hrS2V5ID0g
Y2hrS2V5Ow0KLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOw0KLSAgICAgICAg
dGhpcy5ib2FyZE5hbWUgPSBib2FyZE5hbWU7DQotICAgICAgICB0aGlzLmZpbGVTaXplID0g
ZmlsZVNpemU7DQotICAgICAgICB0aGlzLmRvd25sb2FkRmluaXNoZWRUaW1lID0gZG93bmxv
YWRGaW5pc2hlZFRpbWU7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBUcmFja0Rvd25s
b2FkS2V5cyhmaW5hbCBUcmFja0Rvd25sb2FkS2V5cyB0cmFja0Rvd25sb2FkS2V5KSB7DQot
ICAgICAgICB0aGlzLmNoa0tleSA9IHRyYWNrRG93bmxvYWRLZXkuY2hrS2V5Ow0KLSAgICAg
ICAgdGhpcy5maWxlTmFtZSA9IHRyYWNrRG93bmxvYWRLZXkuZmlsZU5hbWU7DQotICAgICAg
ICB0aGlzLmJvYXJkTmFtZSA9IHRyYWNrRG93bmxvYWRLZXkuYm9hcmROYW1lOw0KLSAgICAg
ICAgdGhpcy5maWxlU2l6ZSA9IHRyYWNrRG93bmxvYWRLZXkuZmlsZVNpemU7DQotICAgICAg
ICB0aGlzLmRvd25sb2FkRmluaXNoZWRUaW1lID0gdHJhY2tEb3dubG9hZEtleS5kb3dubG9h
ZEZpbmlzaGVkVGltZTsNCi0gICAgfQ0KKwkvLyB1c2VkIGJ5IHBlcnN0DQorCXB1YmxpYyBU
cmFja0Rvd25sb2FkS2V5cygpIHt9DQogDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hrS2V5
KCkgew0KLSAgICAgICAgcmV0dXJuIGNoa0tleTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVi
bGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBmaWxlTmFtZTsN
Ci0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRCb2FyZE5hbWUoKSB7DQor
CXB1YmxpYyBUcmFja0Rvd25sb2FkS2V5cyhmaW5hbCBTdHJpbmcgY2hrS2V5LCBmaW5hbCBT
dHJpbmcgZmlsZU5hbWUsIA0KKwkJZmluYWwgU3RyaW5nIGJvYXJkTmFtZSwgbG9uZyBmaWxl
U2l6ZSwgbG9uZyBkb3dubG9hZEZpbmlzaGVkVGltZSkgew0KKwkJdGhpcy5jaGtLZXkgPSBj
aGtLZXk7DQorCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7DQorCQl0aGlzLmJvYXJkTmFt
ZSA9IGJvYXJkTmFtZTsNCisJCXRoaXMuZmlsZVNpemUgPSBmaWxlU2l6ZTsNCisJCXRoaXMu
ZG93bmxvYWRGaW5pc2hlZFRpbWUgPSBkb3dubG9hZEZpbmlzaGVkVGltZTsNCisJfQ0KKw0K
KwlwdWJsaWMgVHJhY2tEb3dubG9hZEtleXMoZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJh
Y2tEb3dubG9hZEtleSkgew0KKwkJdGhpcy5jaGtLZXkgPSB0cmFja0Rvd25sb2FkS2V5LmNo
a0tleTsNCisJCXRoaXMuZmlsZU5hbWUgPSB0cmFja0Rvd25sb2FkS2V5LmZpbGVOYW1lOw0K
KwkJdGhpcy5ib2FyZE5hbWUgPSB0cmFja0Rvd25sb2FkS2V5LmJvYXJkTmFtZTsNCisJCXRo
aXMuZmlsZVNpemUgPSB0cmFja0Rvd25sb2FkS2V5LmZpbGVTaXplOw0KKwkJdGhpcy5kb3du
bG9hZEZpbmlzaGVkVGltZSA9IHRyYWNrRG93bmxvYWRLZXkuZG93bmxvYWRGaW5pc2hlZFRp
bWU7DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRDaGtLZXkoKSB7DQorCQlyZXR1cm4g
Y2hrS2V5Ow0KKwl9DQorDQorCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7DQorCQly
ZXR1cm4gZmlsZU5hbWU7DQorCX0NCisNCisJcHVibGljIFN0cmluZyBnZXRCb2FyZE5hbWUo
KSB7DQogCQlyZXR1cm4gYm9hcmROYW1lOw0KIAl9DQogDQpAQCAtNzIsNiArNzIsNiBAQA0K
IAl9DQogDQogCXB1YmxpYyBsb25nIGdldERvd25sb2FkRmluaXNoZWRUaW1lKCkgew0KLSAg
ICAgICAgcmV0dXJuIGRvd25sb2FkRmluaXNoZWRUaW1lOw0KLSAgICB9DQorCQlyZXR1cm4g
ZG93bmxvYWRGaW5pc2hlZFRpbWU7DQorCX0NCiB9DQpJbmRleDogc291cmNlL2Zyb3N0L3N0
b3JhZ2UvcGVyc3QvVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlLmphdmENCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0NCi0tLSBzb3VyY2UvZnJvc3Qvc3RvcmFnZS9wZXJzdC9UcmFja0Rvd25sb2FkS2V5c1N0
b3JhZ2UuamF2YQkocmV2aXNpb24gMzE5MikNCisrKyBzb3VyY2UvZnJvc3Qvc3RvcmFnZS9w
ZXJzdC9UcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UuamF2YQkod29ya2luZyBjb3B5KQ0KQEAg
LTE1LDcgKzE1LDcgQEANCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQogICBhbG9uZyB3aXRoIHRoaXMgcHJv
Z3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KICAgRm91bmRhdGlv
biwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuDQotKi8N
CisgKi8NCiBwYWNrYWdlIGZyb3N0LnN0b3JhZ2UucGVyc3Q7DQogDQogaW1wb3J0IGphdmEu
dXRpbC4qOw0KQEAgLTI1LDEwMSArMjUsMTA3IEBADQogDQogcHVibGljIGNsYXNzIFRyYWNr
RG93bmxvYWRLZXlzU3RvcmFnZSBleHRlbmRzIEFic3RyYWN0RnJvc3RTdG9yYWdlIGltcGxl
bWVudHMgRXhpdFNhdmFibGUgew0KIA0KLSAgICBwcml2YXRlIFRyYWNrRG93bmxvYWRLZXlz
U3RvcmFnZVJvb3Qgc3RvcmFnZVJvb3QgPSBudWxsOw0KKwlwcml2YXRlIFRyYWNrRG93bmxv
YWRLZXlzU3RvcmFnZVJvb3Qgc3RvcmFnZVJvb3QgPSBudWxsOw0KIA0KLSAgICBwcml2YXRl
IHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkFHRV9GSUxFTkFNRSA9ICJUcmFja0Rvd25sb2Fk
S2V5cy5kYnMiOw0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkFHRV9GSUxF
TkFNRSA9ICJUcmFja0Rvd25sb2FkS2V5cy5kYnMiOw0KIA0KLSAgICBwcml2YXRlIHN0YXRp
YyBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UgaW5zdGFuY2UgPSBuZXcgVHJhY2tEb3dubG9h
ZEtleXNTdG9yYWdlKCk7DQorCXByaXZhdGUgc3RhdGljIFRyYWNrRG93bmxvYWRLZXlzU3Rv
cmFnZSBpbnN0YW5jZSA9IG5ldyBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2UoKTsNCiANCi0g
ICAgcHJvdGVjdGVkIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSgpIHsNCi0gICAgICAgIHN1
cGVyKCk7DQotICAgIH0NCisJcHJvdGVjdGVkIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSgp
IHsNCisJCXN1cGVyKCk7DQorCX0NCiANCi0gICAgcHVibGljIHN0YXRpYyBUcmFja0Rvd25s
b2FkS2V5c1N0b3JhZ2UgaW5zdCgpIHsNCi0gICAgICAgIHJldHVybiBpbnN0YW5jZTsNCi0g
ICAgfQ0KKwlwdWJsaWMgc3RhdGljIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZSBpbnN0KCkg
ew0KKwkJcmV0dXJuIGluc3RhbmNlOw0KKwl9DQogDQotICAgIHByaXZhdGUgYm9vbGVhbiBh
ZGRUb0luZGljZXMoZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJhY2tEb3dubG9hZEtleXMp
IHsNCi0gICAgCVN5c3RlbS5vdXQucHJpbnQoIkRFQlVHOiBUcmFja0Rvd25sb2FkS2V5c1N0
b3JhZ2UuYWRkVG9JbmRpY2VzOiAiKTsNCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbih0cmFj
a0Rvd25sb2FkS2V5cy5nZXRDaGtLZXkoKSk7DQotICAgICAgICByZXR1cm4gc3RvcmFnZVJv
b3QuZG93bmxvYWRLZXlMaXN0LnB1dCh0cmFja0Rvd25sb2FkS2V5cy5nZXRDaGtLZXkoKSwg
dHJhY2tEb3dubG9hZEtleXMpOw0KLSAgICB9DQorCXByaXZhdGUgYm9vbGVhbiBhZGRUb0lu
ZGljZXMoZmluYWwgVHJhY2tEb3dubG9hZEtleXMgdHJhY2tEb3dubG9hZEtleXMpIHsNCisJ
CWlmKCAhIHN0b3JhZ2VSb290LmRvd25sb2FkS2V5TGlzdC5wdXQodHJhY2tEb3dubG9hZEtl
eXMuZ2V0Q2hrS2V5KCksIHRyYWNrRG93bmxvYWRLZXlzKSkgew0KKwkJCXJldHVybiBmYWxz
ZTsNCisJCX0NCisJCXJldHVybiBzdG9yYWdlUm9vdC5kb3dubG9hZE5hbWVMaXN0LnB1dCh0
cmFja0Rvd25sb2FkS2V5cy5nZXRGaWxlTmFtZSgpLCB0cmFja0Rvd25sb2FkS2V5cy5nZXRD
aGtLZXkoKSk7DQorCX0NCiANCi0gICAgcHVibGljIHZvaWQgc3RvcmVJdGVtKGZpbmFsIFRy
YWNrRG93bmxvYWRLZXlzIHRyYWNrRG93bmxvYWRLZXlzKSB7DQotICAgICAgICBpZiggZ2V0
U3RvcmFnZSgpID09IG51bGwgKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAg
fQ0KLSAgICAgICAgaWYoIHRyYWNrRG93bmxvYWRLZXlzLmdldFN0b3JhZ2UoKSA9PSBudWxs
ICkgew0KLSAgICAgICAgCXRyYWNrRG93bmxvYWRLZXlzLm1ha2VQZXJzaXN0ZW50KGdldFN0
b3JhZ2UoKSk7DQotICAgICAgICAgICAgYWRkVG9JbmRpY2VzKHRyYWNrRG93bmxvYWRLZXlz
KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAJdHJhY2tEb3dubG9hZEtleXMubW9k
aWZ5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFu
IHNlYXJjaEl0ZW0oZmluYWwgU3RyaW5nIGNoa0tleSkgew0KLSAgICAJU3lzdGVtLm91dC5w
cmludCgiREVCVUc6IFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZS5zZWFyY2hJdGVtOiAiKTsN
Ci0gICAgCVN5c3RlbS5vdXQucHJpbnRsbihjaGtLZXkpOw0KLSAgICAJcmV0dXJuIChzdG9y
YWdlUm9vdC5kb3dubG9hZEtleUxpc3QuZ2V0KGNoa0tleSkgIT0gbnVsbCk7DQotICAgIH0N
CisJcHVibGljIHZvaWQgc3RvcmVJdGVtKGZpbmFsIFRyYWNrRG93bmxvYWRLZXlzIHRyYWNr
RG93bmxvYWRLZXlzKSB7DQorCQlpZiggZ2V0U3RvcmFnZSgpID09IG51bGwgKSB7DQorCQkJ
cmV0dXJuOw0KKwkJfQ0KKwkJaWYoIHRyYWNrRG93bmxvYWRLZXlzLmdldFN0b3JhZ2UoKSA9
PSBudWxsICkgew0KKwkJCXRyYWNrRG93bmxvYWRLZXlzLm1ha2VQZXJzaXN0ZW50KGdldFN0
b3JhZ2UoKSk7DQorCQkJYWRkVG9JbmRpY2VzKHRyYWNrRG93bmxvYWRLZXlzKTsNCisJCX0g
ZWxzZSB7DQorCQkJdHJhY2tEb3dubG9hZEtleXMubW9kaWZ5KCk7DQorCQl9DQorCX0NCiAN
Ci0gICAgcHVibGljIHZvaWQgZXhpdFNhdmUoKSB0aHJvd3MgU3RvcmFnZUV4Y2VwdGlvbiB7
DQotICAgICAgICBjbG9zZSgpOw0KLSAgICAgICAgc3RvcmFnZVJvb3QgPSBudWxsOw0KLSAg
ICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTkZPOiBUcmFja0Rvd25sb2FkS2V5U3RvcmFn
ZSBjbG9zZWQuIik7DQotICAgIH0NCisJcHVibGljIGJvb2xlYW4gc2VhcmNoSXRlbUtleShm
aW5hbCBTdHJpbmcgY2hrS2V5KSB7DQorCQlyZXR1cm4gc3RvcmFnZVJvb3QuZG93bmxvYWRL
ZXlMaXN0LmdldChjaGtLZXkpICE9IG51bGw7DQorCX0NCiANCi0gICAgQE92ZXJyaWRlDQot
ICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmFnZUZpbGVuYW1lKCkgew0KLSAgICAgICAgcmV0
dXJuIFNUT1JBR0VfRklMRU5BTUU7DQotICAgIH0NCisJcHVibGljIGJvb2xlYW4gc2VhcmNo
SXRlbU5hbWUoZmluYWwgU3RyaW5nIGZpbGVOYW1lKSB7DQorCQlyZXR1cm4gc3RvcmFnZVJv
b3QuZG93bmxvYWROYW1lTGlzdC5nZXQoZmlsZU5hbWUpICE9IG51bGw7DQorCX0NCiANCi0g
ICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIGluaXRTdG9yYWdlKCkgew0KLSAg
ICAgICAgZmluYWwgU3RyaW5nIGRhdGFiYXNlRmlsZVBhdGggPSBidWlsZFN0b3JhZ2VQYXRo
KGdldFN0b3JhZ2VGaWxlbmFtZSgpKTsgLy8gcGF0aCB0byB0aGUgZGF0YWJhc2UgZmlsZQ0K
LSAgICAgICAgZmluYWwgbG9uZyBwYWdlUG9vbFNpemUgPSBnZXRQYWdlUG9vbFNpemUoU2V0
dGluZ3NDbGFzcy5QRVJTVF9QQUdFUE9PTFNJWkVfU0hBUkVERklMRVNDSEtLRVlTKTsNCisJ
cHVibGljIHZvaWQgZXhpdFNhdmUoKSB0aHJvd3MgU3RvcmFnZUV4Y2VwdGlvbiB7DQorCQlj
bG9zZSgpOw0KKwkJc3RvcmFnZVJvb3QgPSBudWxsOw0KKwkJU3lzdGVtLm91dC5wcmludGxu
KCJJTkZPOiBUcmFja0Rvd25sb2FkS2V5U3RvcmFnZSBjbG9zZWQuIik7DQorCX0NCiANCi0g
ICAgICAgIG9wZW4oZGF0YWJhc2VGaWxlUGF0aCwgcGFnZVBvb2xTaXplLCB0cnVlLCB0cnVl
LCBmYWxzZSk7DQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgU3RyaW5nIGdldFN0b3JhZ2VGaWxl
bmFtZSgpIHsNCisJCXJldHVybiBTVE9SQUdFX0ZJTEVOQU1FOw0KKwl9DQogDQotICAgICAg
ICBzdG9yYWdlUm9vdCA9IChUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290KWdldFN0b3Jh
Z2UoKS5nZXRSb290KCk7DQotICAgICAgICBpZiAoc3RvcmFnZVJvb3QgPT0gbnVsbCkgew0K
LSAgICAgICAgICAgIC8vIFN0b3JhZ2Ugd2FzIG5vdCBpbml0aWFsaXplZCB5ZXQNCi0gICAg
ICAgICAgICBzdG9yYWdlUm9vdCA9IG5ldyBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290
KCk7DQotICAgICAgICAgICAgLy8gdW5pcXVlIGluZGV4IG9mIGNoa0tleXMNCi0gICAgICAg
ICAgICBzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxpc3QgPSBnZXRTdG9yYWdlKCkuY3JlYXRl
SW5kZXgoU3RyaW5nLmNsYXNzLCB0cnVlKTsNCi0gICAgICAgICAgICBnZXRTdG9yYWdlKCku
c2V0Um9vdChzdG9yYWdlUm9vdCk7DQotICAgICAgICAgICAgY29tbWl0KCk7IC8vIGNvbW1p
dCB0cmFuc2FjdGlvbg0KLSAgICAgICAgfQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxu
KCJJTkZPOiBUcmFja0Rvd25sb2FkS2V5U3RvcmFnZSBpbml0aWFsaXplZC4iKTsNCi0gICAg
ICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRGVs
ZXRlIGFsbCBlbnRyaWVzIHRoYXQgd2VyZSBkb3dubG9hZGVkIG1heERheXNPbGQgZGF5ZXMg
YWdvLg0KLSAgICAgKiBAcmV0dXJuICBjb3VudCBvZiBkZWxldGVkIHJvd3MNCi0gICAgICov
DQotICAgIHB1YmxpYyBpbnQgY2xlYW51cFRhYmxlKGZpbmFsIGludCBtYXhEYXlzT2xkKSB7
DQorCUBPdmVycmlkZQ0KKwlwdWJsaWMgYm9vbGVhbiBpbml0U3RvcmFnZSgpIHsNCisJCWZp
bmFsIFN0cmluZyBkYXRhYmFzZUZpbGVQYXRoID0gYnVpbGRTdG9yYWdlUGF0aChnZXRTdG9y
YWdlRmlsZW5hbWUoKSk7IC8vIHBhdGggdG8gdGhlIGRhdGFiYXNlIGZpbGUNCisJCWZpbmFs
IGxvbmcgcGFnZVBvb2xTaXplID0gZ2V0UGFnZVBvb2xTaXplKFNldHRpbmdzQ2xhc3MuUEVS
U1RfUEFHRVBPT0xTSVpFX1NIQVJFREZJTEVTQ0hLS0VZUyk7DQogDQotICAgICAgICBmaW5h
bCBsb25nIG1pblZhbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gKG1heERheXNP
bGQgKiAyNEwgKiA2MEwgKiA2MEwgKiAxMDAwTCk7DQorCQlvcGVuKGRhdGFiYXNlRmlsZVBh
dGgsIHBhZ2VQb29sU2l6ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOw0KIA0KLSAgICAgICAgLy8g
ZGVsZXRlIGFsbCBpdGVtcyB3aXRoIGxhc3RTZWVuIDwgbWluVmFsLCBidXQgbGFzdFNlZW4g
PiAwDQotICAgICAgICBpbnQgZGVsZXRlZENvdW50ID0gMDsNCisJCXN0b3JhZ2VSb290ID0g
KFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZVJvb3QpZ2V0U3RvcmFnZSgpLmdldFJvb3QoKTsN
CisJCWlmIChzdG9yYWdlUm9vdCA9PSBudWxsIHx8IHN0b3JhZ2VSb290LmRvd25sb2FkS2V5
TGlzdCA9PSBudWxsIHx8IHN0b3JhZ2VSb290LmRvd25sb2FkTmFtZUxpc3QgPT0gbnVsbCkg
ew0KKwkJCS8vIFN0b3JhZ2Ugd2FzIG5vdCBpbml0aWFsaXplZCB5ZXQNCisJCQlzdG9yYWdl
Um9vdCA9IG5ldyBUcmFja0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290KCk7DQorCQkJLy8gdW5p
cXVlIGluZGV4IG9mIGNoa0tleXMNCisJCQlzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxpc3Qg
PSBnZXRTdG9yYWdlKCkuY3JlYXRlSW5kZXgoU3RyaW5nLmNsYXNzLCB0cnVlKTsNCisJCQkv
LyB1bmlxdWUgaW5kZXggb2YgZG9ud25sb2FkRmlsZW5hbWVzDQorCQkJc3RvcmFnZVJvb3Qu
ZG93bmxvYWROYW1lTGlzdCA9IGdldFN0b3JhZ2UoKS5jcmVhdGVJbmRleChTdHJpbmcuY2xh
c3MsIHRydWUpOw0KKwkJCQ0KKwkJCWdldFN0b3JhZ2UoKS5zZXRSb290KHN0b3JhZ2VSb290
KTsNCisJCQljb21taXQoKTsgLy8gY29tbWl0IHRyYW5zYWN0aW9uDQorCQl9DQorCQlTeXN0
ZW0ub3V0LnByaW50bG4oIklORk86IFRyYWNrRG93bmxvYWRLZXlTdG9yYWdlIGluaXRpYWxp
emVkLiIpOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCiANCi0gICAgICAgIGJlZ2luRXhjbHVz
aXZlVGhyZWFkVHJhbnNhY3Rpb24oKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAg
ZmluYWwgSXRlcmF0b3I8VHJhY2tEb3dubG9hZEtleXM+IGkgPSBzdG9yYWdlUm9vdC5kb3du
bG9hZEtleUxpc3QuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICB3aGlsZShpLmhhc05leHQo
KSkgew0KLSAgICAgICAgICAgICAgICBmaW5hbCBUcmFja0Rvd25sb2FkS2V5cyBzZmsgPSBp
Lm5leHQoKTsNCi0gICAgICAgICAgICAgICAgaWYoIHNmay5nZXREb3dubG9hZEZpbmlzaGVk
VGltZSgpID4gMCAmJiBzZmsuZ2V0RG93bmxvYWRGaW5pc2hlZFRpbWUoKSA8IG1pblZhbCAp
IHsNCi0gICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7IC8vIHJlbW92ZSBmcm9tIGl0
ZXJhdGVkIGluZGV4DQotICAgICAgICAgICAgICAgICAgICBzZmsuZGVhbGxvY2F0ZSgpOyAv
LyByZW1vdmUgZnJvbSBTdG9yYWdlDQotICAgICAgICAgICAgICAgICAgICBkZWxldGVkQ291
bnQrKzsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0g
ZmluYWxseSB7DQotICAgICAgICAgICAgZW5kVGhyZWFkVHJhbnNhY3Rpb24oKTsNCi0gICAg
ICAgIH0NCisJLyoqDQorCSAqIERlbGV0ZSBhbGwgZW50cmllcyB0aGF0IHdlcmUgZG93bmxv
YWRlZCBtYXhEYXlzT2xkIGRheWVzIGFnby4NCisJICogQHJldHVybiAgY291bnQgb2YgZGVs
ZXRlZCByb3dzDQorCSAqLw0KKwlwdWJsaWMgaW50IGNsZWFudXBUYWJsZShmaW5hbCBpbnQg
bWF4RGF5c09sZCkgew0KIA0KLSAgICAgICAgcmV0dXJuIGRlbGV0ZWRDb3VudDsNCi0gICAg
fQ0KKwkJZmluYWwgbG9uZyBtaW5WYWwgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAt
IChtYXhEYXlzT2xkICogMjRMICogNjBMICogNjBMICogMTAwMEwpOw0KKw0KKwkJLy8gZGVs
ZXRlIGFsbCBpdGVtcyB3aXRoIGxhc3RTZWVuIDwgbWluVmFsLCBidXQgbGFzdFNlZW4gPiAw
DQorCQlpbnQgZGVsZXRlZENvdW50ID0gMDsNCisNCisJCWJlZ2luRXhjbHVzaXZlVGhyZWFk
VHJhbnNhY3Rpb24oKTsNCisJCXRyeSB7DQorCQkJZmluYWwgSXRlcmF0b3I8VHJhY2tEb3du
bG9hZEtleXM+IGkgPSBzdG9yYWdlUm9vdC5kb3dubG9hZEtleUxpc3QuaXRlcmF0b3IoKTsN
CisJCQl3aGlsZShpLmhhc05leHQoKSkgew0KKwkJCQlmaW5hbCBUcmFja0Rvd25sb2FkS2V5
cyBzZmsgPSBpLm5leHQoKTsNCisJCQkJaWYoIHNmay5nZXREb3dubG9hZEZpbmlzaGVkVGlt
ZSgpID4gMCAmJiBzZmsuZ2V0RG93bmxvYWRGaW5pc2hlZFRpbWUoKSA8IG1pblZhbCApIHsN
CisJCQkJCWkucmVtb3ZlKCk7IC8vIHJlbW92ZSBmcm9tIGl0ZXJhdGVkIGluZGV4DQorCQkJ
CQlzZmsuZGVhbGxvY2F0ZSgpOyAvLyByZW1vdmUgZnJvbSBTdG9yYWdlDQorCQkJCQlkZWxl
dGVkQ291bnQrKzsNCisJCQkJfQ0KKwkJCX0NCisJCX0gZmluYWxseSB7DQorCQkJZW5kVGhy
ZWFkVHJhbnNhY3Rpb24oKTsNCisJCX0NCisNCisJCXJldHVybiBkZWxldGVkQ291bnQ7DQor
CX0NCiB9DQpJbmRleDogc291cmNlL2Zyb3N0L3N0b3JhZ2UvcGVyc3QvVHJhY2tEb3dubG9h
ZEtleXNTdG9yYWdlUm9vdC5qYXZhDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gc291cmNlL2Zyb3N0
L3N0b3JhZ2UvcGVyc3QvVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlUm9vdC5qYXZhCShyZXZp
c2lvbiAzMTkyKQ0KKysrIHNvdXJjZS9mcm9zdC9zdG9yYWdlL3BlcnN0L1RyYWNrRG93bmxv
YWRLZXlzU3RvcmFnZVJvb3QuamF2YQkod29ya2luZyBjb3B5KQ0KQEAgLTIxLDggKzIxLDkg
QEANCiBpbXBvcnQgb3JnLmdhcnJldC5wZXJzdC4qOw0KIA0KIHB1YmxpYyBjbGFzcyBUcmFj
a0Rvd25sb2FkS2V5c1N0b3JhZ2VSb290IGV4dGVuZHMgUGVyc2lzdGVudCB7DQotICAgIA0K
LSAgICBwdWJsaWMgVHJhY2tEb3dubG9hZEtleXNTdG9yYWdlUm9vdCgpIHt9DQotICAgIA0K
LSAgICBJbmRleDxUcmFja0Rvd25sb2FkS2V5cz4gZG93bmxvYWRLZXlMaXN0Ow0KKwkNCisJ
cHVibGljIFRyYWNrRG93bmxvYWRLZXlzU3RvcmFnZVJvb3QoKSB7fQ0KKwkNCisJSW5kZXg8
VHJhY2tEb3dubG9hZEtleXM+IGRvd25sb2FkS2V5TGlzdDsNCisJSW5kZXg8U3RyaW5nPiBk
b3dubG9hZE5hbWVMaXN0Ow0KIH0NCkluZGV4OiBzb3VyY2UvZnJvc3QvdXRpbC9GaWxlQWNj
ZXNzLmphdmENCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBzb3VyY2UvZnJvc3QvdXRpbC9GaWxlQWNj
ZXNzLmphdmEJKHJldmlzaW9uIDMxOTIpDQorKysgc291cmNlL2Zyb3N0L3V0aWwvRmlsZUFj
Y2Vzcy5qYXZhCSh3b3JraW5nIGNvcHkpDQpAQCAtNDY2LDYgKzQ2NiwyMyBAQA0KICAgICAg
ICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0CiAgICAgICAg
IHJldHVybiBkaXIuZGVsZXRlKCk7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICogQ3Jl
YXRlIGdpdmVuIGRpcmVjdG9yeQorICAgICovCisgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4g
Y3JlYXRlRGlyKGZpbmFsIGphdmEuaW8uRmlsZSBkaXIpIHsKKyAgICAgICBpZiggZGlyLmlz
RGlyZWN0b3J5KCkgKSB7CisgICAgCSAgIHJldHVybiB0cnVlOworICAgICAgIH0KKyAgICAg
ICAKKyAgICAgICBpZiggZGlyLmV4aXN0cygpKSB7CisgICAgCSAgIHJldHVybiBmYWxzZTsK
KyAgICAgICB9CisgICAgICAgCisgICAgICAgcmV0dXJuIGRpci5ta2RpcnMoKTsKKyAgIH0K
KyAgICAKKyAgICAKIAogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGNvcGllcyB0aGUg
Y29udGVudHMgb2Ygb25lIGZpbGUgdG8gYW5vdGhlci4gSWYgdGhlIGRlc3RpbmF0aW9uIGZp
bGUgZGlkbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkLiBJZgpAQCAtNTg1LDggKzYwMiw4IEBA
DQogCiAgICAgCWlmICghcGF0aC5lbmRzV2l0aChzZXBhcmF0b3IpKSB7CiAgICAgCQlyZXR1
cm4gcGF0aCArIHNlcGFyYXRvcjsKLQkJfQorICAgIAl9CiAKLQkJcmV0dXJuIHBhdGg7Ci0J
fQorICAgIAlyZXR1cm4gcGF0aDsKKyAgICB9CiB9CkluZGV4OiBzb3VyY2UvaTE4bi9sYW5n
cmVzLnByb3BlcnRpZXMNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCkNhbm5vdCBkaXNwbGF5OiBmaWxlIG1h
cmtlZCBhcyBhIGJpbmFyeSB0eXBlLg0Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29j
dGV0LXN0cmVhbQ0K
--------------020005070500060907010304
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--------------020005070500060907010304
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Jtcfrost-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jtcfrost-devl
--------------020005070500060907010304--