Full Code of eczarny/spectacle for AI

master e75c341ec2cb cached
159 files
520.4 KB
141.5k tokens
2 symbols
1 requests
Download .txt
Showing preview only (564K chars total). Download the full file or copy to clipboard to get everything.
Repository: eczarny/spectacle
Branch: master
Commit: e75c341ec2cb
Files: 159
Total size: 520.4 KB

Directory structure:
gitextract_y6p7bt7r/

├── .gitignore
├── .travis.yml
├── CONTRIBUTING.md
├── Cartfile
├── Cartfile.resolved
├── LICENSE.md
├── README.md
├── Spectacle/
│   ├── Resources/
│   │   ├── Certificates/
│   │   │   └── dsa_public.pem
│   │   ├── Images.xcassets/
│   │   │   ├── 10.9 Crash Fix.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── Contents.json
│   │   │   ├── Security & Privacy.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── Spectacle Status Item.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── Spectacle.appiconset/
│   │   │       └── Contents.json
│   │   ├── Localizations/
│   │   │   ├── Base.lproj/
│   │   │   │   ├── Spectacle.xib
│   │   │   │   └── SpectaclePreferencesWindow.xib
│   │   │   ├── en.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   └── Localizable.strings
│   │   │   ├── es.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   ├── Localizable.strings
│   │   │   │   ├── Spectacle.strings
│   │   │   │   └── SpectaclePreferencesWindow.strings
│   │   │   ├── fi.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   ├── Localizable.strings
│   │   │   │   ├── Spectacle.strings
│   │   │   │   └── SpectaclePreferencesWindow.strings
│   │   │   ├── fr.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   ├── Localizable.strings
│   │   │   │   ├── Spectacle.strings
│   │   │   │   └── SpectaclePreferencesWindow.strings
│   │   │   ├── it.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   ├── Localizable.strings
│   │   │   │   ├── Spectacle.strings
│   │   │   │   └── SpectaclePreferencesWindow.strings
│   │   │   └── pt.lproj/
│   │   │       ├── Credits.rtf
│   │   │       ├── InfoPlist.strings
│   │   │       ├── Localizable.strings
│   │   │       ├── Spectacle.strings
│   │   │       └── SpectaclePreferencesWindow.strings
│   │   ├── Property Lists/
│   │   │   └── Defaults.plist
│   │   ├── Scripts/
│   │   │   ├── Security & Privacy System Preferences Original.scpt
│   │   │   └── Security & Privacy System Preferences.scpt
│   │   └── Window Position Calculations/
│   │       ├── SpectacleBottomHalfWindowCalculation.js
│   │       ├── SpectacleCenterWindowCalculation.js
│   │       ├── SpectacleFullscreenWindowCalculation.js
│   │       ├── SpectacleLargerWindowCalculation.js
│   │       ├── SpectacleLeftHalfWindowCalculation.js
│   │       ├── SpectacleLowerLeftWindowCalculation.js
│   │       ├── SpectacleLowerRightWindowCalculation.js
│   │       ├── SpectacleNextDisplayWindowCalculation.js
│   │       ├── SpectacleNextOrPreviousDisplay.js
│   │       ├── SpectacleNextOrPreviousThirds.js
│   │       ├── SpectacleNextThirdWindowCalculation.js
│   │       ├── SpectaclePreviousDisplayWindowCalculation.js
│   │       ├── SpectaclePreviousThirdWindowCalculation.js
│   │       ├── SpectacleRightHalfWindowCalculation.js
│   │       ├── SpectacleSmallerWindowCalculation.js
│   │       ├── SpectacleTopHalfWindowCalculation.js
│   │       ├── SpectacleUpperLeftWindowCalculation.js
│   │       ├── SpectacleUpperRightWindowCalculation.js
│   │       ├── SpectacleWindowCalculationHelpers.js
│   │       └── SpectacleWindowSizeAdjuster.js
│   ├── Sources/
│   │   ├── SpectacleAccessibilityElement.h
│   │   ├── SpectacleAccessibilityElement.m
│   │   ├── SpectacleAppDelegate.h
│   │   ├── SpectacleAppDelegate.m
│   │   ├── SpectacleBestEffortWindowMover.h
│   │   ├── SpectacleBestEffortWindowMover.m
│   │   ├── SpectacleDefaultShortcutHelpers.h
│   │   ├── SpectacleDefaultShortcutHelpers.m
│   │   ├── SpectacleHistory.h
│   │   ├── SpectacleHistory.m
│   │   ├── SpectacleHistoryItem.h
│   │   ├── SpectacleHistoryItem.m
│   │   ├── SpectacleJavaScriptEnvironment.h
│   │   ├── SpectacleJavaScriptEnvironment.m
│   │   ├── SpectacleLoginItemHelper.h
│   │   ├── SpectacleLoginItemHelper.m
│   │   ├── SpectacleMacros.h
│   │   ├── SpectacleMigratingShortcutStorage.h
│   │   ├── SpectacleMigratingShortcutStorage.m
│   │   ├── SpectaclePreferencesController.h
│   │   ├── SpectaclePreferencesController.m
│   │   ├── SpectacleQuantizedWindowMover.h
│   │   ├── SpectacleQuantizedWindowMover.m
│   │   ├── SpectacleRegisteredShortcutValidator.h
│   │   ├── SpectacleRegisteredShortcutValidator.m
│   │   ├── SpectacleScreenDetectionResult.h
│   │   ├── SpectacleScreenDetectionResult.m
│   │   ├── SpectacleScreenDetector.h
│   │   ├── SpectacleScreenDetector.m
│   │   ├── SpectacleShortcut.h
│   │   ├── SpectacleShortcut.m
│   │   ├── SpectacleShortcutHolder.h
│   │   ├── SpectacleShortcutHolder.m
│   │   ├── SpectacleShortcutJSONStorage.h
│   │   ├── SpectacleShortcutJSONStorage.m
│   │   ├── SpectacleShortcutKeyBindings.h
│   │   ├── SpectacleShortcutKeyBindings.m
│   │   ├── SpectacleShortcutManager.h
│   │   ├── SpectacleShortcutManager.m
│   │   ├── SpectacleShortcutRecorder.h
│   │   ├── SpectacleShortcutRecorder.m
│   │   ├── SpectacleShortcutRecorderDelegate.h
│   │   ├── SpectacleShortcutStorage.h
│   │   ├── SpectacleShortcutStorageMigrationDestination.h
│   │   ├── SpectacleShortcutTranslations.h
│   │   ├── SpectacleShortcutTranslations.m
│   │   ├── SpectacleShortcutUserDefaultsStorage.h
│   │   ├── SpectacleShortcutUserDefaultsStorage.m
│   │   ├── SpectacleShortcutValidation.h
│   │   ├── SpectacleShortcutValidation.m
│   │   ├── SpectacleShortcutValidator.h
│   │   ├── SpectacleStandardWindowMover.h
│   │   ├── SpectacleStandardWindowMover.m
│   │   ├── SpectacleUtilities.h
│   │   ├── SpectacleUtilities.m
│   │   ├── SpectacleWindowAction.h
│   │   ├── SpectacleWindowAction.m
│   │   ├── SpectacleWindowMover.h
│   │   ├── SpectacleWindowPositionCalculationRegistry.h
│   │   ├── SpectacleWindowPositionCalculationRegistry.m
│   │   ├── SpectacleWindowPositionCalculationResult.h
│   │   ├── SpectacleWindowPositionCalculationResult.m
│   │   ├── SpectacleWindowPositionCalculator.h
│   │   ├── SpectacleWindowPositionCalculator.m
│   │   ├── SpectacleWindowPositionManager.h
│   │   └── SpectacleWindowPositionManager.m
│   └── Supporting Files/
│       ├── Info.plist
│       └── main.m
├── Spectacle.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── IDEWorkspaceChecks.plist
│   └── xcshareddata/
│       └── xcschemes/
│           └── Spectacle.xcscheme
└── SpectacleSpecs/
    ├── Sources/
    │   ├── SpectacleBottomHalfWindowCalculationSpec.m
    │   ├── SpectacleCenterWindowCalculationSpec.m
    │   ├── SpectacleFullscreenWindowCalculationSpec.m
    │   ├── SpectacleLargerWindowCalculationSpec.m
    │   ├── SpectacleLeftHalfWindowCalculationSpec.m
    │   ├── SpectacleLowerLeftWindowCalculationSpec.m
    │   ├── SpectacleLowerRightWindowCalculationSpec.m
    │   ├── SpectacleNextDisplayWindowCalculationSpec.m
    │   ├── SpectacleNextThirdWindowCalculationSpec.m
    │   ├── SpectaclePreviousDisplayWindowCalculationSpec.m
    │   ├── SpectaclePreviousThirdWindowCalculationSpec.m
    │   ├── SpectacleRightHalfWindowCalculationSpec.m
    │   ├── SpectacleShortcutKeyBindingsSpec.m
    │   ├── SpectacleShortcutSpec.m
    │   ├── SpectacleShortcutTranslationsSpec.m
    │   ├── SpectacleSmallerWindowCalculationSpec.m
    │   ├── SpectacleTopHalfWindowCalculationSpec.m
    │   ├── SpectacleUpperLeftWindowCalculationSpec.m
    │   ├── SpectacleUpperRightWindowCalculationSpec.m
    │   └── SpectacleWindowPositionManagerSpec.m
    └── Supporting Files/
        └── Info.plist

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate

Carthage/Build
Carthage/Checkouts


================================================
FILE: .travis.yml
================================================
osx_image: xcode8.2
language: objective-c
xcode_project: Spectacle.xcodeproj
xcode_scheme: Spectacle

before_install:
  - brew update
  - brew outdated carthage || brew upgrade carthage
  - carthage bootstrap --platform Mac

script:
  - set -o pipefail && xcodebuild -project Spectacle.xcodeproj -scheme Spectacle test | xcpretty


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Contributions come in many forms. Creating an issue that documents a previously unreported defect is just as important as sending a pull request. Spectacle can only be great when the folks that use it are passionate about its quality.

Before you start working on your contribution to Spectacle please keep reading. For even more information read [Contributing to Open Source on GitHub][1].

## Issues

Before creating a new issue check and make sure somebody hasn't already beat you to it. _Please take this time to also review Spectacle's [common issues][2]_. If your defect or feature request doesn't already exist feel free to create a new issue. When creating a new issue take the time to be as clear and descriptive as possible.

Here are a few things to keep in mind when creating an issue for a potential defect:

* What version of Spectacle did you use when encountering the defect?
* What version of OS X did you use when encountering the defect?
* Was there any relevant Spectacle output in the [Console][3]?

Including screenshots or videos are extremely helpful so please include them if you can. Diagrams can also be highly valuable when describing a new feature in a feature request.

## Pull Requests

1. Fork the repository and create your branch from `master`
2. Add tests if your changes can and should be tested
3. Run the test suite and confirm that all tests pass
4. Rebase your changes on top of the most recent changes from `master`

## Coding Style

To help make it easier maintain Spectacle please match the existing coding style as much as possible. This make it easier to both understand and merge your contributions. Only use two __spaces__ for indentation.

## License

By contributing to Spectacle you agree that your contributions will be licensed under its MIT license.

[1]: https://guides.github.com/activities/contributing-to-open-source/#contributing
[2]: https://github.com/eczarny/spectacle#common-issues
[3]: https://en.wikipedia.org/wiki/Console_(OS_X)


================================================
FILE: Cartfile
================================================
github "hamcrest/OCHamcrest" ~> 7.1
github "jonreid/OCMockito" ~> 5.1
github "sparkle-project/Sparkle" ~> 1.22
github "specta/expecta" ~> 1.0
github "specta/specta" ~> 1.0


================================================
FILE: Cartfile.resolved
================================================
github "hamcrest/OCHamcrest" "v7.1.2"
github "jonreid/OCMockito" "v5.1.2"
github "sparkle-project/Sparkle" "1.22.0"
github "specta/expecta" "v1.0.6"
github "specta/specta" "v1.0.7"


================================================
FILE: LICENSE.md
================================================
# License

## Spectacle is distributed under the MIT License:

Copyright (c) 2017 Eric Czarny <eczarny@gmail.com>

Permission  is hereby granted, free of charge, to any person obtaining a copy of
this  software  and  associated documentation files (the "Software"), to deal in
the  Software  without  restriction,  including without limitation the rights to
use,  copy,  modify,  merge, publish, distribute, sublicense, and/or sell copies
of  the  Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The  above  copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED,  INCLUDING  BUT  NOT  LIMITED  TO  THE  WARRANTIES  OF MERCHANTABILITY,
FITNESS  FOR  A  PARTICULAR  PURPOSE  AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS  OR  COPYRIGHT  HOLDERS  BE  LIABLE  FOR  ANY  CLAIM,  DAMAGES  OR OTHER
LIABILITY,  WHETHER  IN  AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT  OF  OR  IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Spectacle

[![Build Status](https://travis-ci.org/eczarny/spectacle.svg?branch=master)](https://travis-ci.org/eczarny/spectacle)

Easily organize windows without using a mouse.

## Important Note

**This project is not being actively maintained.** Unfortunately, after almost a decade of on-and-off development I can no longer dedicate the time needed to be a responsible maintainer of this project. Spectacle will remain available for download but please use at your own risk. The source code will continue to be free and open to anyone, so feel free to make Spectacle your own.

Thanks to all the folks that have made Spectacle the first app they install a new Mac!

_Spectacle users have recommended [Rectangle](https://github.com/rxhanson/Rectangle) as an open source alternative._

## System requirements

Spectacle [0.8.6][1] is the last version to support Mac OS X 10.7; future releases will only support 10.9 or greater. Folks wishing to stay on 10.7 should download [0.8.6][1]. Those looking for a version of Spectacle that supports 10.6 can still download [0.7][2].

## Keyboard Shortcuts

Spectacle makes use of several [keyboard shortcuts][3] that trigger specific _window actions_. A window action is nothing more than a command that tells Spectacle how to change the size and/or position of a particular window.

A keyboard shortcut consists of one or more modifier keys paired with a character key. The common modifier keys Spectacle takes advantage of are:

| Symbol    | Key         |
|:---------:|:-----------:|
|  &#8984;  | Command Key |
|  &#8963;  | Control Key |
|  &#8997;  | Option Key  |
|  &#8679;  | Shift Key   |

The default keyboard shortcuts can be changed at any time. Use new key combinations to trigger window actions, or clear particular keyboard shortcuts to disable window actions entirely.

### Basic window actions

To move a window to the center of the screen use the &#8997;&#8984;C keyboard shortcut. Centered windows will __not__ have their size altered. Maximize a window using the &#8997;&#8984;F shortcut.

Windows can be moved to a number of predefined regions of the screen:

- _Move to the left half_ &#8212; &#8997;&#8984;&#8592;
- _Move to the right half_ &#8212; &#8997;&#8984;&#8594;
- _Move to the top half_ &#8212; &#8997;&#8984;&#8593;
- _Move to the bottom half_ &#8212; &#8997;&#8984;&#8595;
<br /><br />
- _Move to the upper left_ &#8212; &#8963;&#8984;&#8592;
- _Move to the lower left_ &#8212; &#8963;&#8679;&#8984;&#8592;
- _Move to the upper right_ &#8212; &#8963;&#8984;&#8594;
- _Move to the lower right_ &#8212; &#8963;&#8679;&#8984;&#8594;

Windows may also be resized between thirds using any of the shortcuts above. For example, to have a window resized between 1/3 and 2/3 of the left region of the screen simply activate the *left half* &#8997;&#8984;&#8592; keyboard shortcut more than once. Each time the shortcut is activated Spectacle will move the window between 1/3, 2/3, and back to 1/2 of the left side of the screen. This feature also applies to the upper left, lower left, upper right, and lower right shortcuts.

Spectacle can also move windows between horizontal and vertical thirds of the screen. The &#8963;&#8997;&#8594; keyboard shortcut will move a window to the next third of the screen, starting with the horizontal third region on the left of the screen. &#8963;&#8997;&#8592; will move a window to the previous third of the screen.

Resizing a window is just as easy. To make a window a bit larger use the &#8963;&#8997;&#8679;&#8594; keyboard shortcut; &#8963;&#8997;&#8679;&#8592; can be used to make a window smaller. Spectacle will always attempt to maintain contact between the edges of a window and the edges of the screen when resizing.

### Multiple displays

The &#8963;&#8997;&#8984;&#8594; keyboard shortcut will move a window to the next available display. &#8963;&#8997;&#8984;&#8592; can be used to move a window to the previous display.

### Window action history

Spectacle remembers where every window was prior to executing a window action. To undo a window action use the &#8997;&#8984;Z keyboard shortcut. Use the &#8997;&#8679;&#8984;Z shortcut to redo the window action once again.

## Common Issues

### Spectacle is requesting access to use accessibility features

Apple's [OS X Accessibility Protocol][4] makes Spectacle possible. This protocol allows assistive applications to _drive the user interface of another application running in OS X_. In order to do its job Spectacle must be granted access to use these accessibility features. Instructions to do so will be displayed if Spectacle determines it does not have sufficient privileges.

### Spectacle does not resize a particular window as expected

OS X allows applications to place constraints on the size of its windows. This allows application developers to design their user interfaces without needing to worry about supporting every possible window dimension. In these cases Spectacle will not be able to resize those windows to fit into the exact dimensions intended by the shortcut used.

As an example suppose a display has a 2880x1800 resolution and a window is being resized to fit the left half of the display. If the window has specified a minimum allowable width of 1600 pixels Spectacle will not be able to resize the window to fit the expected 1440 pixels. The constraints placed on windows will always be respected despite leading to potentially unexpected results; in this example Spectacle will resize the window's width to 1600 pixels.

### Spectacle behaves strangely with Terminal windows

Terminal (and other terminal emulation applications like iTerm 2) place constraints on how windows are resized so entire rows and columns are always visible. This behavior works great since it guarantees no rows or columns are truncated. Unfortunately it does mean that Spectacle needs to do some extra work to make these windows fit.

To work around the limitations imposed on Terminal windows Spectacle will first try to resize a window to match the desired dimensions. If a window cannot be resized to fit Spectacle will immediately try to make the window a little smaller. This process is repeated until the window can be made to fit with its constraints still in place. The result is a window that is centered within the desired dimensions at the cost of a slightly jittery experience.

### Spectacle does not work with all applications

Most applications built with the Cocoa frameworks can be readily manipulated via the _OS X Accessibility Protocol_; allowing Spectacle to interact with nearly every window it encounters. Unfortunately this is not always the case. Spectacle will be unable to manipulate the windows of applications that build their user interfaces in unexpected ways.

## Building and running

Spectacle uses [Carthage][5]. Before building Spectacle in Xcode run:

    $ carthage bootstrap --platform Mac

Once Carthage builds Spectacle's dependencies open the Xcode project:

    $ open Spectacle.xcodeproj

After Xcode finishes loading the workspace press &#8984;R to run Spectacle.

# License

Copyright (c) 2017 Eric Czarny.

Spectacle should be accompanied by a LICENSE file containing the license relevant to this distribution.

[1]: https://s3.amazonaws.com/spectacle/downloads/Spectacle+0.8.6.zip
[2]: https://s3.amazonaws.com/spectacle/downloads/Spectacle+0.7.zip
[3]: http://support.apple.com/kb/ht1343
[4]: https://developer.apple.com/library/mac/documentation/Accessibility/Conceptual/AccessibilityMacOSX/OSXAXmodel.html
[5]: https://github.com/Carthage/Carthage


================================================
FILE: Spectacle/Resources/Certificates/dsa_public.pem
================================================
-----BEGIN PUBLIC KEY-----
MIIDOjCCAi0GByqGSM44BAEwggIgAoIBAQCY2D8N/yE2yx4+fpl4m4M2FzaBOcY8
B/bFN3bExJcapUAn0IpTvUDO0SZCw28WPQuEnu+RAq00UULTtGtO1H6J975csVBC
KSx5YbSlcui8MzUASHC99+GfccPCSYXNgqzdq72gdQI0/QRZcBA2MrFDFtNOneCZ
0hCOrROwKB5B2iZ6duITRmcOBkcgx+/3sWPmi3860yCbUymhfIPsvyefJCTwDJbc
ulQm4SxPykseLauJluhbSyU5o82CiN2bohv8qzPGq5X29hO77u10QLuyNdpE6pHc
I+CmAxY87Z/vgVxf63RbFqZ9HSi3VI3sH9X+imzP8eCrI44I4NS/6o7zAhUArcVK
GobiXm0fqWZpD7DrcgnEOF8CggEAJLczjeNtMNTRSrhh5SR06FG2sUiCIe1hHPCz
+3WPK+rPDnoC4gft6QxO9zRlnuvISeqNhv1oge5phdVQDWLhUojAQwAi2DU+/hjn
7HjZx0PHs+oE568dH9qyB9F9xKLPpzHld2PJB9t1OMQjrbXuqFSjxecx7Y28f5D6
IaMCS8EwgifS2vMyoPXW8MGpZ6iB5uPHFUZFEvGp6k0+T2V32F5JMgt37DlHA/Ok
kmEMWU2JF14e3O1zU3h6ERhXdmNeRA9rarETO9mW8qLg95qRCR73I7CdhMSrY7/S
6s7bPbPR4VKwORP8LJTKbb7bXQpXrso34hZIOPhL/RUuuJqrGQOCAQUAAoIBAFWc
5KE8FFG8IrA+MG6G1gg0aDOPlrpE4Br/YrivsKlhP+9/jaCW+ESeukJIrNI8uw48
9e9s/WrqH8N5EH1AhTUd3yOAu9zyvj/FLyMnnfFCwHe36uyRUFE9k0MR4jS9NOA6
MEGTbPevEyZFwsioJCQOWGmr94LlTfRP1FXkSN7F7xvPqieUG3lMzD5tq+rqKS0R
G56LWDh2ccbR+HZXtC513HHz4PUUCy/ukcThdND2ca90qCWtqDIw46GxRyROt1wM
qhACEQqijf1GCzEWxSMibVRtTIF2/AWOOOdi8FMOloLnln1R5o3X6XY5nSQ3bj4m
ZvUkmWLQi6tvBv98A6Q=
-----END PUBLIC KEY-----


================================================
FILE: Spectacle/Resources/Images.xcassets/10.9 Crash Fix.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "Spectacle-1.png",
      "language-direction" : "left-to-right",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-4.png",
      "language-direction" : "right-to-left",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-7.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-10.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-2.png",
      "language-direction" : "left-to-right",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-5.png",
      "language-direction" : "right-to-left",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-8.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-11.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-3.png",
      "language-direction" : "left-to-right",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-6.png",
      "language-direction" : "right-to-left",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-9.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-12.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-13.png",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-16.png",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-19.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-22.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-14.png",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-17.png",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-20.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-23.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-15.png",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-18.png",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-21.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-24.png",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-25.png",
      "width-class" : "regular",
      "language-direction" : "left-to-right",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-28.png",
      "width-class" : "regular",
      "language-direction" : "right-to-left",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-31.png",
      "width-class" : "regular",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-34.png",
      "width-class" : "regular",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-26.png",
      "width-class" : "regular",
      "language-direction" : "left-to-right",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-29.png",
      "width-class" : "regular",
      "language-direction" : "right-to-left",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-32.png",
      "width-class" : "regular",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-35.png",
      "width-class" : "regular",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-27.png",
      "width-class" : "regular",
      "language-direction" : "left-to-right",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-30.png",
      "width-class" : "regular",
      "language-direction" : "right-to-left",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-33.png",
      "width-class" : "regular",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "left-to-right",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-36.png",
      "width-class" : "regular",
      "graphics-feature-set" : "metal1v2",
      "language-direction" : "right-to-left",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-37.png",
      "width-class" : "regular",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-40.png",
      "width-class" : "regular",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "1x"
    },
    {
      "language-direction" : "left-to-right",
      "graphics-feature-set" : "metal1v2",
      "idiom" : "universal",
      "width-class" : "regular",
      "filename" : "Spectacle-43.png",
      "height-class" : "regular",
      "scale" : "1x"
    },
    {
      "language-direction" : "right-to-left",
      "graphics-feature-set" : "metal1v2",
      "idiom" : "universal",
      "width-class" : "regular",
      "filename" : "Spectacle-46.png",
      "height-class" : "regular",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-38.png",
      "width-class" : "regular",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-41.png",
      "width-class" : "regular",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "2x"
    },
    {
      "language-direction" : "left-to-right",
      "graphics-feature-set" : "metal1v2",
      "idiom" : "universal",
      "width-class" : "regular",
      "filename" : "Spectacle-44.png",
      "height-class" : "regular",
      "scale" : "2x"
    },
    {
      "language-direction" : "right-to-left",
      "graphics-feature-set" : "metal1v2",
      "idiom" : "universal",
      "width-class" : "regular",
      "filename" : "Spectacle-47.png",
      "height-class" : "regular",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-39.png",
      "width-class" : "regular",
      "language-direction" : "left-to-right",
      "height-class" : "regular",
      "scale" : "3x"
    },
    {
      "idiom" : "universal",
      "filename" : "Spectacle-42.png",
      "width-class" : "regular",
      "language-direction" : "right-to-left",
      "height-class" : "regular",
      "scale" : "3x"
    },
    {
      "language-direction" : "left-to-right",
      "graphics-feature-set" : "metal1v2",
      "idiom" : "universal",
      "width-class" : "regular",
      "filename" : "Spectacle-45.png",
      "height-class" : "regular",
      "scale" : "3x"
    },
    {
      "language-direction" : "right-to-left",
      "graphics-feature-set" : "metal1v2",
      "idiom" : "universal",
      "width-class" : "regular",
      "filename" : "Spectacle-48.png",
      "height-class" : "regular",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Spectacle/Resources/Images.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Spectacle/Resources/Images.xcassets/Security & Privacy.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "mac",
      "scale" : "1x",
      "filename" : "Security & Privacy.png"
    },
    {
      "idiom" : "mac",
      "scale" : "2x",
      "filename" : "Security & Privacy@2x.png"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Spectacle/Resources/Images.xcassets/Spectacle Status Item.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "mac",
      "scale" : "1x",
      "filename" : "Spectacle Status Item.png"
    },
    {
      "idiom" : "mac",
      "scale" : "2x",
      "filename" : "Spectacle Status Item@2x.png"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Spectacle/Resources/Images.xcassets/Spectacle.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "size" : "16x16",
      "idiom" : "mac",
      "filename" : "Spectacle 16.png",
      "scale" : "1x"
    },
    {
      "size" : "16x16",
      "idiom" : "mac",
      "filename" : "Spectacle 16@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "32x32",
      "idiom" : "mac",
      "filename" : "Spectacle 32.png",
      "scale" : "1x"
    },
    {
      "size" : "32x32",
      "idiom" : "mac",
      "filename" : "Spectacle 32@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "128x128",
      "idiom" : "mac",
      "filename" : "Spectacle 128.png",
      "scale" : "1x"
    },
    {
      "size" : "128x128",
      "idiom" : "mac",
      "filename" : "Spectacle 128@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "256x256",
      "idiom" : "mac",
      "filename" : "Spectacle 256.png",
      "scale" : "1x"
    },
    {
      "size" : "256x256",
      "idiom" : "mac",
      "filename" : "Spectacle 256@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "512x512",
      "idiom" : "mac",
      "filename" : "Spectacle 512.png",
      "scale" : "1x"
    },
    {
      "size" : "512x512",
      "idiom" : "mac",
      "filename" : "Spectacle 512@2x.png",
      "scale" : "2x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}


================================================
FILE: Spectacle/Resources/Localizations/Base.lproj/Spectacle.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10117" systemVersion="15E65" targetRuntime="MacOSX.Cocoa">
    <dependencies>
        <deployment identifier="macosx"/>
        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10117"/>
    </dependencies>
    <objects>
        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
            <connections>
                <outlet property="delegate" destination="tMJ-JP-XRD" id="RCY-rC-CyW"/>
            </connections>
        </customObject>
        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
        <customObject id="GWn-WU-GEH" customClass="NSFontManager"/>
        <customObject id="tMJ-JP-XRD" customClass="SpectacleAppDelegate">
            <connections>
                <outlet property="accessiblityAccessDialogWindow" destination="aH5-eW-ySa" id="u6t-Fq-cCp"/>
                <outlet property="disableShortcutsForAnHourMenuItem" destination="qpo-5w-ZIY" id="9Bo-Nc-w85"/>
                <outlet property="disableShortcutsForApplicationMenuItem" destination="msZ-id-Pvw" id="4dY-PO-sgY"/>
                <outlet property="makeLargerShortcutMenuItem" destination="Yun-AA-OVD" id="7P4-V3-6Yd"/>
                <outlet property="makeSmallerShortcutMenuItem" destination="gTe-ym-DB0" id="Qj6-FS-ebO"/>
                <outlet property="moveToBottomShortcutMenuItem" destination="huV-Gw-lbX" id="R2l-hx-4hT"/>
                <outlet property="moveToCenterShortcutMenuItem" destination="xJu-Uo-nZw" id="TUY-VV-2gn"/>
                <outlet property="moveToFullscreenShortcutMenuItem" destination="dwQ-Bl-nEL" id="bbv-zr-yKB"/>
                <outlet property="moveToLeftShortcutMenuItem" destination="Jae-vx-7ZC" id="CBd-QJ-Ojw"/>
                <outlet property="moveToLowerLeftShortcutMenuItem" destination="eN5-A6-iho" id="g7a-5S-hng"/>
                <outlet property="moveToLowerRightShortcutMenuItem" destination="oDU-J0-NkJ" id="XpK-S2-fel"/>
                <outlet property="moveToNextDisplayShortcutMenuItem" destination="I4U-jL-hXq" id="EBQ-xh-fXk"/>
                <outlet property="moveToNextThirdShortcutMenuItem" destination="7HO-L3-O6Q" id="yrD-z7-Yzl"/>
                <outlet property="moveToPreviousDisplayShortcutMenuItem" destination="aPo-Rp-A1X" id="LFz-As-pEk"/>
                <outlet property="moveToPreviousThirdShortcutMenuItem" destination="bV9-Ga-jDG" id="1k3-S5-1pz"/>
                <outlet property="moveToRightShortcutMenuItem" destination="cae-26-Oab" id="dya-ai-hmk"/>
                <outlet property="moveToTopShortcutMenuItem" destination="yh0-ik-weD" id="7Et-V2-jDL"/>
                <outlet property="moveToUpperLeftShortcutMenuItem" destination="ldc-QO-Cq6" id="cDG-Fx-IhZ"/>
                <outlet property="moveToUpperRightShortcutMenuItem" destination="C7t-Sf-kOI" id="w51-Xe-ZMs"/>
                <outlet property="redoLastMoveShortcutMenuItem" destination="187-7k-0Ct" id="TFE-uS-twj"/>
                <outlet property="statusItemMenu" destination="KsA-8w-wcl" id="76U-gs-viQ"/>
                <outlet property="undoLastMoveShortcutMenuItem" destination="l9O-0B-fjp" id="gns-Zw-ZVc"/>
            </connections>
        </customObject>
        <customObject id="qZ6-IG-VBZ" customClass="SUUpdater"/>
        <menu title="Spectacle Status Item" id="KsA-8w-wcl" propertyAccessControl="localizable">
            <items>
                <menuItem title="About Spectacle" tag="-1" id="EA9-dx-Qfg">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="orderFrontStandardAboutPanel:" target="-2" id="P8D-am-ldh"/>
                    </connections>
                </menuItem>
                <menuItem title="Check for Updates..." tag="-1" id="2sj-vF-eSL">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="checkForUpdates:" target="qZ6-IG-VBZ" id="cII-hj-ws3"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="880"/>
                <menuItem title="Disable" id="eZT-Mm-qSc">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <menu key="submenu" title="Disable" id="flL-B2-XIP">
                        <items>
                            <menuItem title="for an hour" id="qpo-5w-ZIY">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <connections>
                                    <action selector="disableOrEnableShortcutsForAnHour:" target="tMJ-JP-XRD" id="tWY-vQ-3Ub"/>
                                </connections>
                            </menuItem>
                            <menuItem title="for APPLICATION" id="msZ-id-Pvw">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <connections>
                                    <action selector="disableOrEnableShortcutsForApplication:" target="tMJ-JP-XRD" id="0P1-RI-4Px"/>
                                </connections>
                            </menuItem>
                        </items>
                    </menu>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="b3s-Pm-hAJ"/>
                <menuItem title="Preferences..." tag="-1" id="ME4-Br-HLT">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="showPreferencesWindow:" target="tMJ-JP-XRD" id="XiZ-6k-zpx"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="1165"/>
                <menuItem title="Center" id="xJu-Uo-nZw">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToCenter:" target="tMJ-JP-XRD" id="8bQ-2O-zty"/>
                    </connections>
                </menuItem>
                <menuItem title="Fullscreen" id="dwQ-Bl-nEL">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToFullscreen:" target="tMJ-JP-XRD" id="P6T-cu-7lj"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="Nmj-XX-uaG"/>
                <menuItem title="Left Half" id="Jae-vx-7ZC">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToLeftHalf:" target="tMJ-JP-XRD" id="Jyu-pQ-sNE"/>
                    </connections>
                </menuItem>
                <menuItem title="Right Half" id="cae-26-Oab">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToRightHalf:" target="tMJ-JP-XRD" id="jr6-2X-ZAa"/>
                    </connections>
                </menuItem>
                <menuItem title="Top Half" id="yh0-ik-weD">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToTopHalf:" target="tMJ-JP-XRD" id="dG6-Fy-O40"/>
                    </connections>
                </menuItem>
                <menuItem title="Bottom Half" id="huV-Gw-lbX">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToBottomHalf:" target="tMJ-JP-XRD" id="7i6-Gr-Jug"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="gbv-tO-TvK"/>
                <menuItem title="Upper Left" id="ldc-QO-Cq6">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToUpperLeft:" target="tMJ-JP-XRD" id="XAq-dc-yRG"/>
                    </connections>
                </menuItem>
                <menuItem title="Lower Left" id="eN5-A6-iho">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToLowerLeft:" target="tMJ-JP-XRD" id="e4K-PQ-wlb"/>
                    </connections>
                </menuItem>
                <menuItem title="Upper Right" id="C7t-Sf-kOI">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToUpperRight:" target="tMJ-JP-XRD" id="3W6-0L-5h1"/>
                    </connections>
                </menuItem>
                <menuItem title="Lower Right" id="oDU-J0-NkJ">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToLowerRight:" target="tMJ-JP-XRD" id="mBh-Kx-JVT"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="0li-21-m4g"/>
                <menuItem title="Next Display" id="I4U-jL-hXq">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToNextDisplay:" target="tMJ-JP-XRD" id="8Jf-bY-L7R"/>
                    </connections>
                </menuItem>
                <menuItem title="Previous Display" id="aPo-Rp-A1X">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToPreviousDisplay:" target="tMJ-JP-XRD" id="wjA-mg-3rC"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="2VE-eu-Tv6"/>
                <menuItem title="Next Third" id="7HO-L3-O6Q">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToNextThird:" target="tMJ-JP-XRD" id="tOU-2B-5ca"/>
                    </connections>
                </menuItem>
                <menuItem title="Previous Third" id="bV9-Ga-jDG">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="moveFrontmostWindowToPreviousThird:" target="tMJ-JP-XRD" id="8oD-A9-mUX"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="dDR-EJ-dud"/>
                <menuItem title="Make Larger" id="Yun-AA-OVD">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="makeFrontmostWindowLarger:" target="tMJ-JP-XRD" id="twG-Hu-ZQM"/>
                    </connections>
                </menuItem>
                <menuItem title="Make Smaller" id="gTe-ym-DB0">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="makeFrontmostWindowSmaller:" target="tMJ-JP-XRD" id="6lw-fW-wPN"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="nH8-Kx-TCA"/>
                <menuItem title="Undo" id="l9O-0B-fjp">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="undoLastWindowAction:" target="tMJ-JP-XRD" id="M8P-vs-ajH"/>
                    </connections>
                </menuItem>
                <menuItem title="Redo" id="187-7k-0Ct">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="redoLastWindowAction:" target="tMJ-JP-XRD" id="WIv-TD-23d"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="OfT-IK-7NI"/>
                <menuItem title="Quit Spectacle" id="Isn-Og-AEv">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <connections>
                        <action selector="terminate:" target="-2" id="V4u-Ow-d6l"/>
                    </connections>
                </menuItem>
            </items>
            <connections>
                <outlet property="delegate" destination="tMJ-JP-XRD" id="eao-lV-3w3"/>
            </connections>
        </menu>
        <window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="aH5-eW-ySa" propertyAccessControl="none">
            <rect key="contentRect" x="422" y="199" width="780" height="360"/>
            <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1028"/>
            <value key="minSize" type="size" width="780" height="360"/>
            <value key="maxSize" type="size" width="780" height="360"/>
            <view key="contentView" id="wR6-GU-kdb">
                <rect key="frame" x="0.0" y="0.0" width="780" height="360"/>
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="q8H-wi-KU2">
                        <rect key="frame" x="129" y="321" width="522" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Spectacle would like to control your windows using accessibility features." id="HRo-tn-M1V">
                            <font key="font" metaFont="systemBold"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="MM0-lm-06Y">
                        <rect key="frame" x="129" y="295" width="522" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Grant access to this application in System Preferences." id="ruu-yJ-Q1F">
                            <font key="font" metaFont="smallSystem"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <button verticalHuggingPriority="750" id="9dg-wQ-O5z">
                        <rect key="frame" x="213" y="251" width="212" height="32"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <buttonCell key="cell" type="push" title="Open System Preferences" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="iPl-AT-Pei">
                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                            <font key="font" metaFont="system"/>
                            <connections>
                                <action selector="openSystemPreferences:" target="tMJ-JP-XRD" id="xfa-vh-epH"/>
                            </connections>
                        </buttonCell>
                    </button>
                    <button verticalHuggingPriority="750" id="nIS-kz-1R7">
                        <rect key="frame" x="425" y="251" width="147" height="32"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <buttonCell key="cell" type="push" title="Quit Spectacle" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="gMV-vD-CUe">
                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                            <font key="font" metaFont="system"/>
                        </buttonCell>
                        <connections>
                            <action selector="terminate:" target="-2" id="bAO-EW-SfZ"/>
                        </connections>
                    </button>
                    <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" id="he4-Bj-XB4" propertyAccessControl="localizable">
                        <rect key="frame" x="-27" y="-383" width="835" height="653"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" image="Security &amp; Privacy" id="zQN-Oe-PPv"/>
                    </imageView>
                </subviews>
            </view>
        </window>
    </objects>
    <resources>
        <image name="Security &amp; Privacy" width="780" height="654"/>
    </resources>
</document>


================================================
FILE: Spectacle/Resources/Localizations/Base.lproj/SpectaclePreferencesWindow.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16C67" targetRuntime="MacOSX.Cocoa" propertyAccessControl="localizable">
    <dependencies>
        <deployment identifier="macosx"/>
        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <objects>
        <customObject id="-2" userLabel="File's Owner" customClass="SpectaclePreferencesController">
            <connections>
                <outlet property="footerView" destination="wNg-Ru-1aI" id="a3s-Yg-9AT"/>
                <outlet property="loginItemEnabled" destination="P6j-bi-KoE" id="Bfa-gg-4G7"/>
                <outlet property="makeLargerShortcutRecorder" destination="iwx-0m-WUf" id="lUC-P6-Vv0"/>
                <outlet property="makeSmallerShortcutRecorder" destination="0jH-Zh-PgG" id="KIO-62-XGL"/>
                <outlet property="moveToBottomShortcutRecorder" destination="hzO-eo-G8F" id="DJU-MT-61C"/>
                <outlet property="moveToCenterShortcutRecorder" destination="mbr-Cs-whm" id="aZl-2a-crG"/>
                <outlet property="moveToFullscreenShortcutRecorder" destination="Wxa-6e-lyM" id="RBe-8y-feS"/>
                <outlet property="moveToLeftShortcutRecorder" destination="4na-E1-mUM" id="mcM-bw-uWP"/>
                <outlet property="moveToLowerLeftShortcutRecorder" destination="u0O-yW-0g8" id="fDR-cZ-vdk"/>
                <outlet property="moveToLowerRightShortcutRecorder" destination="lJh-dh-K7C" id="CCg-we-Urp"/>
                <outlet property="moveToNextDisplayShortcutRecorder" destination="lLw-FX-nqn" id="l2e-tq-Xkb"/>
                <outlet property="moveToNextThirdShortcutRecorder" destination="kGL-qW-2Cn" id="tvD-Rn-p2o"/>
                <outlet property="moveToPreviousDisplayShortcutRecorder" destination="OsP-Gv-gJI" id="v05-17-4dU"/>
                <outlet property="moveToPreviousThirdShortcutRecorder" destination="NdL-ul-8LW" id="WYV-Hd-UOn"/>
                <outlet property="moveToRightShortcutRecorder" destination="eCb-ZU-egY" id="iW0-K6-OeV"/>
                <outlet property="moveToTopShortcutRecorder" destination="rN1-zt-f9E" id="Mw9-c9-b8O"/>
                <outlet property="moveToUpperLeftShortcutRecorder" destination="wLj-pQ-b7w" id="fvL-bO-rKZ"/>
                <outlet property="moveToUpperRightShortcutRecorder" destination="44s-Ps-tmn" id="Kbc-Pj-hti"/>
                <outlet property="optionsFooterView" destination="tke-O4-mlo" id="WfN-Qq-nH6"/>
                <outlet property="redoLastMoveShortcutRecorder" destination="pPP-7U-GSg" id="AYn-wB-Yo2"/>
                <outlet property="shortcutModifierLegendFooterView" destination="t2T-pB-nn6" id="WSX-7H-Osj"/>
                <outlet property="statusItemEnabled" destination="cf8-TV-Yjp" id="0xU-vc-q02"/>
                <outlet property="undoLastMoveShortcutRecorder" destination="au4-Gr-KF9" id="ecz-fA-ywO"/>
                <outlet property="window" destination="JW4-q9-L7q" id="3he-NT-S7L"/>
            </connections>
        </customObject>
        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
        <window title="Spectacle X.Y.Z" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="JW4-q9-L7q">
            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
            <rect key="contentRect" x="283" y="311" width="616" height="513"/>
            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
            <view key="contentView" id="ry3-8n-Juf">
                <rect key="frame" x="0.0" y="0.0" width="616" height="513"/>
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <textField verticalHuggingPriority="750" id="Nwx-2P-V9U">
                        <rect key="frame" x="18" y="451" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Center:" id="oqf-7z-BFa">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="mbr-Cs-whm" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="449" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="guf-X1-Beb">
                        <rect key="frame" x="18" y="422" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Fullscreen:" id="tKr-XE-DEU">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="Wxa-6e-lyM" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="420" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="uY3-hc-TbA">
                        <rect key="frame" x="18" y="364" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Left Half:" id="IWj-rc-Kvi">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="4na-E1-mUM" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="362" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="Gsd-o4-KTI">
                        <rect key="frame" x="18" y="335" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Right Half:" id="WeK-fS-mRh">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="eCb-ZU-egY" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="333" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="edj-pC-f1Z">
                        <rect key="frame" x="17" y="306" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Top Half:" id="AnP-Lv-Hbd">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="rN1-zt-f9E" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="304" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="Dcf-0q-9fG">
                        <rect key="frame" x="18" y="277" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Bottom Half:" id="Awn-mO-sht">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="hzO-eo-G8F" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="275" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="jQx-Df-xE5">
                        <rect key="frame" x="18" y="219" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Upper Left:" id="ldH-1E-mKW">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="wLj-pQ-b7w" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="217" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="b4f-8J-iOX">
                        <rect key="frame" x="18" y="190" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Lower Left:" id="dQP-TR-GMx">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="u0O-yW-0g8" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="188" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="Q8S-XZ-uUw">
                        <rect key="frame" x="18" y="161" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Upper Right:" id="gSY-Au-xOH">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="44s-Ps-tmn" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="159" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="NRc-if-7b9">
                        <rect key="frame" x="18" y="132" width="117" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Lower Right:" id="Vul-FT-BbB">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="lJh-dh-K7C" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="140" y="130" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="4P4-9k-sEd">
                        <rect key="frame" x="286" y="451" width="131" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Next Display:" id="lw7-Ap-kJO">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="lLw-FX-nqn" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="422" y="449" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="aQq-n4-9FK">
                        <rect key="frame" x="286" y="422" width="131" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Previous Display:" id="hmL-EC-pro">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="OsP-Gv-gJI" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="422" y="420" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="sBC-FW-cjv">
                        <rect key="frame" x="286" y="364" width="131" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Next Third:" id="Tze-mR-IV4">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="kGL-qW-2Cn" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="422" y="362" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="FjH-Ke-3MT">
                        <rect key="frame" x="286" y="335" width="131" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Previous Third:" id="s3E-Lp-mJ4">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="NdL-ul-8LW" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="422" y="333" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="sIx-hc-eUS">
                        <rect key="frame" x="286" y="277" width="131" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Make Larger:" id="0f9-kj-bro">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="iwx-0m-WUf" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="422" y="275" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="Iw5-TM-YRu">
                        <rect key="frame" x="286" y="248" width="131" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Make Smaller:" id="SDM-U5-yUR">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="0jH-Zh-PgG" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="422" y="246" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="lYA-bE-Cvq">
                        <rect key="frame" x="286" y="190" width="131" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Undo:" id="CJs-az-eG7">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="au4-Gr-KF9" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="422" y="188" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <textField verticalHuggingPriority="750" id="paN-Mc-McA">
                        <rect key="frame" x="286" y="161" width="131" height="17"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Redo:" id="y7M-cR-DF2">
                            <font key="font" metaFont="system"/>
                            <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                        </textFieldCell>
                    </textField>
                    <customView id="pPP-7U-GSg" customClass="SpectacleShortcutRecorder">
                        <rect key="frame" x="422" y="159" width="140" height="21"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </customView>
                    <box verticalHuggingPriority="750" boxType="separator" id="vWw-ws-BgW">
                        <rect key="frame" x="0.0" y="60" width="616" height="5"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    </box>
                    <customView id="wNg-Ru-1aI" userLabel="Footer View">
                        <rect key="frame" x="0.0" y="0.0" width="616" height="63"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <subviews>
                            <customView id="t2T-pB-nn6" userLabel="Shortcut Modifer Legend Footer View">
                                <rect key="frame" x="0.0" y="0.0" width="616" height="63"/>
                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                <subviews>
                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="t8o-hT-IQi">
                                        <rect key="frame" x="191" y="25" width="28" height="29"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="⌃" id="806-S1-nYH">
                                            <font key="font" metaFont="system" size="24"/>
                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                        </textFieldCell>
                                    </textField>
                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="dj1-Cv-cGv">
                                        <rect key="frame" x="174" y="9" width="63" height="17"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Control" id="7Fe-Da-fYB">
                                            <font key="font" metaFont="smallSystem"/>
                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                        </textFieldCell>
                                    </textField>
                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="l4c-Va-boE">
                                        <rect key="frame" x="258" y="25" width="32" height="29"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="⌥" id="YQm-Kc-fYF">
                                            <font key="font" metaFont="system" size="24"/>
                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                        </textFieldCell>
                                    </textField>
                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="T1t-0q-VR1">
                                        <rect key="frame" x="243" y="9" width="63" height="17"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Option" id="U0H-hG-KAQ">
                                            <font key="font" metaFont="smallSystem"/>
                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                        </textFieldCell>
                                    </textField>
                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="dWs-aZ-UsN">
                                        <rect key="frame" x="325" y="25" width="32" height="29"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="⇧" id="Ir0-AJ-ldj">
                                            <font key="font" metaFont="system" size="24"/>
                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                        </textFieldCell>
                                    </textField>
                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="T2K-sG-8h4">
                                        <rect key="frame" x="310" y="9" width="63" height="17"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Shift" id="dww-8Q-sa1">
                                            <font key="font" metaFont="smallSystem"/>
                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                        </textFieldCell>
                                    </textField>
                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="ePN-Nc-cy9">
                                        <rect key="frame" x="394" y="25" width="32" height="29"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="⌘" id="SQM-4e-yFd">
                                            <font key="font" metaFont="system" size="24"/>
                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                        </textFieldCell>
                                    </textField>
                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" id="Xwv-Yf-TxZ">
                                        <rect key="frame" x="379" y="9" width="63" height="17"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Command" id="jdf-Yu-zrq">
                                            <font key="font" metaFont="smallSystem"/>
                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                        </textFieldCell>
                                    </textField>
                                    <button id="iUO-l8-726" userLabel="Next Button">
                                        <rect key="frame" x="575" y="9" width="32" height="45"/>
                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                        <buttonCell key="cell" type="bevel" bezelStyle="rounded" image="NSGoRightTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="iYb-kS-yHQ">
                                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                                            <font key="font" metaFont="system"/>
                                        </buttonCell>
                                        <connections>
                                            <action selector="swapFooterViews:" target="-2" id="JNg-Dc-I7P"/>
                                        </connections>
                                    </button>
                                </subviews>
                            </customView>
                        </subviews>
                    </customView>
                    <button verticalHuggingPriority="750" id="nKt-CG-zVj">
                        <rect key="frame" x="446" y="74" width="150" height="25"/>
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                        <buttonCell key="cell" type="roundTextured" title="Restore Defaults..." bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="NT7-Sd-Ofw">
                            <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                            <font key="font" metaFont="system"/>
                        </buttonCell>
                        <connections>
                            <action selector="restoreDefaults:" target="-2" id="6ui-XF-TPy"/>
                        </connections>
                    </button>
                    <button misplaced="YES" id="P6j-bi-KoE">
                        <rect key="frame" x="18" y="78" width="246" height="18"/>
                        <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                        <buttonCell key="cell" type="check" title="Launch Spectacle at login" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="cEj-mH-kie">
                            <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                            <font key="font" metaFont="system"/>
                        </buttonCell>
                        <connections>
                            <action selector="toggleLoginItem:" target="-2" id="pwr-Q6-dvi"/>
                        </connections>
                    </button>
                </subviews>
            </view>
        </window>
        <customView id="tke-O4-mlo" userLabel="Options Footer View">
            <rect key="frame" x="0.0" y="0.0" width="616" height="63"/>
            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
            <subviews>
                <button id="g4V-DY-GoG" userLabel="Previous Button">
                    <rect key="frame" x="9" y="9" width="32" height="45"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    <buttonCell key="cell" type="bevel" bezelStyle="rounded" image="NSGoLeftTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="0vX-x3-M6H">
                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                        <font key="font" metaFont="system"/>
                    </buttonCell>
                    <connections>
                        <action selector="swapFooterViews:" target="-2" id="U7e-9q-8hA"/>
                    </connections>
                </button>
                <textField verticalHuggingPriority="750" id="U91-cx-ccf">
                    <rect key="frame" x="297" y="23" width="74" height="17"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                    <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Run..." id="eYU-TH-wcO">
                        <font key="font" metaFont="system"/>
                        <color key="textColor" name="controlShadowColor" catalog="System" colorSpace="catalog"/>
                        <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                    </textFieldCell>
                </textField>
                <popUpButton verticalHuggingPriority="750" id="cf8-TV-Yjp">
                    <rect key="frame" x="372" y="17" width="227" height="26"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                    <popUpButtonCell key="cell" type="push" title="in the status menu" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="in4-v8-tIm" id="6fN-BB-g3d">
                        <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
                        <font key="font" metaFont="menu"/>
                        <menu key="menu" title="OtherViews" id="W2t-KP-bYJ">
                            <items>
                                <menuItem title="in the status menu" state="on" id="in4-v8-tIm">
                                    <modifierMask key="keyEquivalentModifierMask"/>
                                </menuItem>
                                <menuItem title="as a background application" tag="1" id="aWf-FC-J1j">
                                    <modifierMask key="keyEquivalentModifierMask"/>
                                </menuItem>
                            </items>
                        </menu>
                    </popUpButtonCell>
                    <connections>
                        <action selector="toggleStatusItem:" target="-2" id="UbE-2H-Bsc"/>
                    </connections>
                </popUpButton>
            </subviews>
        </customView>
    </objects>
    <resources>
        <image name="NSGoLeftTemplate" width="9" height="12"/>
        <image name="NSGoRightTemplate" width="9" height="12"/>
    </resources>
</document>


================================================
FILE: Spectacle/Resources/Localizations/en.lproj/Credits.rtf
================================================
{\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww11300\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qc

\f0\b\fs24 \cf0 Credits
\b0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
\cf0 Icons and other artwork: {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.fi"}}{\fldrslt 
\b Iiro J\'e4ppinen}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural

\b0 \cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
\cf0 Source code available on {\field{\*\fldinst{HYPERLINK "https://github.com/eczarny/spectacle"}}{\fldrslt 
\b GitHub}}
\b \
{\field{\*\fldinst{HYPERLINK "https://twitter.com/spectacleapp"}}{\fldrslt @spectacleapp}}\
}

================================================
FILE: Spectacle/Resources/Localizations/es.lproj/Credits.rtf
================================================
{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw12240\paperh15840\margl1440\margr1440\vieww11300\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qc\partightenfactor0

\f0\b\fs24 \cf0 Credits
\b0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
\cf0 Iconos y dise\'f1o gr\'e1fico: {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.fi"}}{\fldrslt 
\b Iiro J\'e4ppinen}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0

\b0 \cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
\cf0 C\'f3digo fuente disponible en {\field{\*\fldinst{HYPERLINK "https://github.com/eczarny/spectacle"}}{\fldrslt 
\b GitHub}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://twitter.com/spectacleapp"}}{\fldrslt \cf0 @spectacleapp}}\
}

================================================
FILE: Spectacle/Resources/Localizations/es.lproj/Spectacle.strings
================================================

/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "187-7k-0Ct"; */
"187-7k-0Ct.title" = "Rehacer";

/* Class = "NSMenuItem"; title = "Check for Updates..."; ObjectID = "2sj-vF-eSL"; */
"2sj-vF-eSL.title" = "Chequear actualizaciones...";

/* Class = "NSMenuItem"; title = "Next Third"; ObjectID = "7HO-L3-O6Q"; */
"7HO-L3-O6Q.title" = "Tercer próximo";

/* Class = "NSMenuItem"; title = "Upper Right"; ObjectID = "C7t-Sf-kOI"; */
"C7t-Sf-kOI.title" = "Superior derecha";

/* Class = "NSMenuItem"; title = "About Spectacle"; ObjectID = "EA9-dx-Qfg"; */
"EA9-dx-Qfg.title" = "Acerca de Spectacle";

/* Class = "NSTextFieldCell"; title = "Spectacle would like to control your windows using accessibility features."; ObjectID = "HRo-tn-M1V"; */
"HRo-tn-M1V.title" = "Spectacle necesita tener control de las funcionalidades de accesibilidad.";

/* Class = "NSMenuItem"; title = "Next Display"; ObjectID = "I4U-jL-hXq"; */
"I4U-jL-hXq.title" = "Siguiente monitor";

/* Class = "NSMenuItem"; title = "Quit Spectacle"; ObjectID = "Isn-Og-AEv"; */
"Isn-Og-AEv.title" = "Salir Spectacle";

/* Class = "NSMenuItem"; title = "Left Half"; ObjectID = "Jae-vx-7ZC"; */
"Jae-vx-7ZC.title" = "La mitad izquierda";

/* Class = "NSMenu"; title = "Spectacle Status Item"; ObjectID = "KsA-8w-wcl"; */
"KsA-8w-wcl.title" = "Spectacle estado del elemento";

/* Class = "NSMenuItem"; title = "Preferences..."; ObjectID = "ME4-Br-HLT"; */
"ME4-Br-HLT.title" = "Configuración...";

/* Class = "NSMenuItem"; title = "Make Larger"; ObjectID = "Yun-AA-OVD"; */
"Yun-AA-OVD.title" = "Hacer más grande";

/* Class = "NSMenuItem"; title = "Previous Display"; ObjectID = "aPo-Rp-A1X"; */
"aPo-Rp-A1X.title" = "Monitor anterior";

/* Class = "NSMenuItem"; title = "Previous Third"; ObjectID = "bV9-Ga-jDG"; */
"bV9-Ga-jDG.title" = "Tercer anterior";

/* Class = "NSMenuItem"; title = "Right Half"; ObjectID = "cae-26-Oab"; */
"cae-26-Oab.title" = "Mitad derecha";

/* Class = "NSMenuItem"; title = "Fullscreen"; ObjectID = "dwQ-Bl-nEL"; */
"dwQ-Bl-nEL.title" = "Pantalla completa";

/* Class = "NSMenuItem"; title = "Lower Left"; ObjectID = "eN5-A6-iho"; */
"eN5-A6-iho.title" = "Abajo a la izquierda";

/* Class = "NSMenuItem"; title = "Disable"; ObjectID = "eZT-Mm-qSc"; */
"eZT-Mm-qSc.title" = "Deshabilitado";

/* Class = "NSMenu"; title = "Disable"; ObjectID = "flL-B2-XIP"; */
"flL-B2-XIP.title" = "Deshabilitado";

/* Class = "NSButtonCell"; title = "Quit Spectacle"; ObjectID = "gMV-vD-CUe"; */
"gMV-vD-CUe.title" = "Salir Spectacle";

/* Class = "NSMenuItem"; title = "Make Smaller"; ObjectID = "gTe-ym-DB0"; */
"gTe-ym-DB0.title" = "Hacer mas pequeño";

/* Class = "NSMenuItem"; title = "Bottom Half"; ObjectID = "huV-Gw-lbX"; */
"huV-Gw-lbX.title" = "Mitad inferior";

/* Class = "NSButtonCell"; title = "Open System Preferences"; ObjectID = "iPl-AT-Pei"; */
"iPl-AT-Pei.title" = "Abrir preferencias de sistema";

/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "l9O-0B-fjp"; */
"l9O-0B-fjp.title" = "Deshacer";

/* Class = "NSMenuItem"; title = "Upper Left"; ObjectID = "ldc-QO-Cq6"; */
"ldc-QO-Cq6.title" = "Arriba a la izquierda";

/* Class = "NSMenuItem"; title = "for APPLICATION"; ObjectID = "msZ-id-Pvw"; */
"msZ-id-Pvw.title" = "para la aplicación";

/* Class = "NSMenuItem"; title = "Lower Right"; ObjectID = "oDU-J0-NkJ"; */
"oDU-J0-NkJ.title" = "Inferior derecha";

/* Class = "NSMenuItem"; title = "for an hour"; ObjectID = "qpo-5w-ZIY"; */
"qpo-5w-ZIY.title" = "Por una hora";

/* Class = "NSTextFieldCell"; title = "Grant access to this application in System Preferences."; ObjectID = "ruu-yJ-Q1F"; */
"ruu-yJ-Q1F.title" = "Permitir el acceso a esta aplicación en Preferencias del sistema.";

/* Class = "NSMenuItem"; title = "Center"; ObjectID = "xJu-Uo-nZw"; */
"xJu-Uo-nZw.title" = "Centro";

/* Class = "NSMenuItem"; title = "Top Half"; ObjectID = "yh0-ik-weD"; */
"yh0-ik-weD.title" = "Mitad superior";


================================================
FILE: Spectacle/Resources/Localizations/es.lproj/SpectaclePreferencesWindow.strings
================================================

/* Class = "NSTextFieldCell"; title = "Make Larger:"; ObjectID = "0f9-kj-bro"; */
"0f9-kj-bro.title" = "Hacer más grande:";

/* Class = "NSTextFieldCell"; title = "Control"; ObjectID = "7Fe-Da-fYB"; */
"7Fe-Da-fYB.title" = "Control";

/* Class = "NSTextFieldCell"; title = "⌃"; ObjectID = "806-S1-nYH"; */
"806-S1-nYH.title" = "⌃";

/* Class = "NSTextFieldCell"; title = "Top Half:"; ObjectID = "AnP-Lv-Hbd"; */
"AnP-Lv-Hbd.title" = "Mitad superior:";

/* Class = "NSTextFieldCell"; title = "Bottom Half:"; ObjectID = "Awn-mO-sht"; */
"Awn-mO-sht.title" = "Mitad inferior:";

/* Class = "NSTextFieldCell"; title = "Undo:"; ObjectID = "CJs-az-eG7"; */
"CJs-az-eG7.title" = "Deshacer:";

/* Class = "NSTextFieldCell"; title = "Left Half:"; ObjectID = "IWj-rc-Kvi"; */
"IWj-rc-Kvi.title" = "Mitad izquierda:";

/* Class = "NSTextFieldCell"; title = "⇧"; ObjectID = "Ir0-AJ-ldj"; */
"Ir0-AJ-ldj.title" = "⇧";

/* Class = "NSWindow"; title = "Spectacle X.Y.Z"; ObjectID = "JW4-q9-L7q"; */
"JW4-q9-L7q.title" = "Spectacle X.Y.Z";

/* Class = "NSButtonCell"; title = "Restore Defaults..."; ObjectID = "NT7-Sd-Ofw"; */
"NT7-Sd-Ofw.title" = "Restaurar por defecto...";

/* Class = "NSTextFieldCell"; title = "Make Smaller:"; ObjectID = "SDM-U5-yUR"; */
"SDM-U5-yUR.title" = "Hacer más pequeño:";

/* Class = "NSTextFieldCell"; title = "⌘"; ObjectID = "SQM-4e-yFd"; */
"SQM-4e-yFd.title" = "⌘";

/* Class = "NSTextFieldCell"; title = "Next Third:"; ObjectID = "Tze-mR-IV4"; */
"Tze-mR-IV4.title" = "Siguiente tercero:";

/* Class = "NSTextFieldCell"; title = "Option"; ObjectID = "U0H-hG-KAQ"; */
"U0H-hG-KAQ.title" = "Opciones";

/* Class = "NSTextFieldCell"; title = "Lower Right:"; ObjectID = "Vul-FT-BbB"; */
"Vul-FT-BbB.title" = "Inferior derecho:";

/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "W2t-KP-bYJ"; */
"W2t-KP-bYJ.title" = "Otras vistas";

/* Class = "NSTextFieldCell"; title = "Right Half:"; ObjectID = "WeK-fS-mRh"; */
"WeK-fS-mRh.title" = "Mitad derecha:";

/* Class = "NSTextFieldCell"; title = "⌥"; ObjectID = "YQm-Kc-fYF"; */
"YQm-Kc-fYF.title" = "⌥";

/* Class = "NSMenuItem"; title = "as a background application"; ObjectID = "aWf-FC-J1j"; */
"aWf-FC-J1j.title" = "aplicación en segundo plano";

/* Class = "NSButtonCell"; title = "Launch Spectacle at login"; ObjectID = "cEj-mH-kie"; */
"cEj-mH-kie.title" = "Ejecutar Spectacle al iniciar";

/* Class = "NSTextFieldCell"; title = "Lower Left:"; ObjectID = "dQP-TR-GMx"; */
"dQP-TR-GMx.title" = "Abajo a la izquierda:";

/* Class = "NSTextFieldCell"; title = "Shift"; ObjectID = "dww-8Q-sa1"; */
"dww-8Q-sa1.title" = "Shift";

/* Class = "NSTextFieldCell"; title = "Run..."; ObjectID = "eYU-TH-wcO"; */
"eYU-TH-wcO.title" = "Ejecutar...";

/* Class = "NSTextFieldCell"; title = "Upper Right:"; ObjectID = "gSY-Au-xOH"; */
"gSY-Au-xOH.title" = "Superior derecha:";

/* Class = "NSTextFieldCell"; title = "Previous Display:"; ObjectID = "hmL-EC-pro"; */
"hmL-EC-pro.title" = "Monitor anterior:";

/* Class = "NSMenuItem"; title = "in the status menu"; ObjectID = "in4-v8-tIm"; */
"in4-v8-tIm.title" = "en menu de estado";

/* Class = "NSTextFieldCell"; title = "Command"; ObjectID = "jdf-Yu-zrq"; */
"jdf-Yu-zrq.title" = "Command";

/* Class = "NSTextFieldCell"; title = "Upper Left:"; ObjectID = "ldH-1E-mKW"; */
"ldH-1E-mKW.title" = "Superior izquierdo:";

/* Class = "NSTextFieldCell"; title = "Next Display:"; ObjectID = "lw7-Ap-kJO"; */
"lw7-Ap-kJO.title" = "Monitor siguiente:";

/* Class = "NSTextFieldCell"; title = "Center:"; ObjectID = "oqf-7z-BFa"; */
"oqf-7z-BFa.title" = "Centro:";

/* Class = "NSTextFieldCell"; title = "Previous Third:"; ObjectID = "s3E-Lp-mJ4"; */
"s3E-Lp-mJ4.title" = "Tercer anterior:";

/* Class = "NSTextFieldCell"; title = "Fullscreen:"; ObjectID = "tKr-XE-DEU"; */
"tKr-XE-DEU.title" = "Pantalla completa:";

/* Class = "NSBox"; title = "Box"; ObjectID = "vWw-ws-BgW"; */
"vWw-ws-BgW.title" = "Caja";

/* Class = "NSTextFieldCell"; title = "Redo:"; ObjectID = "y7M-cR-DF2"; */
"y7M-cR-DF2.title" = "Rehacer:";


================================================
FILE: Spectacle/Resources/Localizations/fi.lproj/Credits.rtf
================================================
{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf420
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww11300\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qc\partightenfactor0

\f0\b\fs24 \cf0 Tekij\'e4t
\b0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
\cf0 Kuvakkeet ja muut grafiikat: {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.fi"}}{\fldrslt 
\b Iiro J\'e4ppinen}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0

\b0 \cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
\cf0 L\'e4hdekoodi saatavilla {\field{\*\fldinst{HYPERLINK "https://github.com/eczarny/spectacle"}}{\fldrslt 
\b GitHubissa}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://twitter.com/spectacleapp"}}{\fldrslt \cf0 @spectacleapp}}\
}

================================================
FILE: Spectacle/Resources/Localizations/fi.lproj/Spectacle.strings
================================================

/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "187-7k-0Ct"; */
"187-7k-0Ct.title" = "Tee uudelleen";

/* Class = "NSMenuItem"; title = "Check for Updates..."; ObjectID = "2sj-vF-eSL"; */
"2sj-vF-eSL.title" = "Tarkista päivitykset...";

/* Class = "NSMenuItem"; title = "Next Third"; ObjectID = "7HO-L3-O6Q"; */
"7HO-L3-O6Q.title" = "Seuraava kolmasosa";

/* Class = "NSMenuItem"; title = "Upper Right"; ObjectID = "C7t-Sf-kOI"; */
"C7t-Sf-kOI.title" = "Yläoikea";

/* Class = "NSMenuItem"; title = "About Spectacle"; ObjectID = "EA9-dx-Qfg"; */
"EA9-dx-Qfg.title" = "Tietoja Spectaclesta";

/* Class = "NSTextFieldCell"; title = "Spectacle would like to control your windows using accessibility features."; ObjectID = "HRo-tn-M1V"; */
"HRo-tn-M1V.title" = "Spectacle haluaisi hallita ikkunoita käyttöaputoimintojen avulla.";

/* Class = "NSMenuItem"; title = "Next Display"; ObjectID = "I4U-jL-hXq"; */
"I4U-jL-hXq.title" = "Seuraava ikkuna";

/* Class = "NSMenuItem"; title = "Quit Spectacle"; ObjectID = "Isn-Og-AEv"; */
"Isn-Og-AEv.title" = "Sulje Spectacle";

/* Class = "NSMenuItem"; title = "Left Half"; ObjectID = "Jae-vx-7ZC"; */
"Jae-vx-7ZC.title" = "Vasen puoli";

/* Class = "NSMenu"; title = "Spectacle Status Item"; ObjectID = "KsA-8w-wcl"; */
"KsA-8w-wcl.title" = "Spectacle Status Item";

/* Class = "NSMenuItem"; title = "Preferences..."; ObjectID = "ME4-Br-HLT"; */
"ME4-Br-HLT.title" = "Asetukset...";

/* Class = "NSMenuItem"; title = "Make Larger"; ObjectID = "Yun-AA-OVD"; */
"Yun-AA-OVD.title" = "Suurenna";

/* Class = "NSMenuItem"; title = "Previous Display"; ObjectID = "aPo-Rp-A1X"; */
"aPo-Rp-A1X.title" = "Edellinen näyttö";

/* Class = "NSMenuItem"; title = "Previous Third"; ObjectID = "bV9-Ga-jDG"; */
"bV9-Ga-jDG.title" = "Edellinen kolmasosa";

/* Class = "NSMenuItem"; title = "Right Half"; ObjectID = "cae-26-Oab"; */
"cae-26-Oab.title" = "Oikea puoli";

/* Class = "NSMenuItem"; title = "Fullscreen"; ObjectID = "dwQ-Bl-nEL"; */
"dwQ-Bl-nEL.title" = "Koko näyttö";

/* Class = "NSMenuItem"; title = "Lower Left"; ObjectID = "eN5-A6-iho"; */
"eN5-A6-iho.title" = "Alavasen";

/* Class = "NSMenuItem"; title = "Disable"; ObjectID = "eZT-Mm-qSc"; */
"eZT-Mm-qSc.title" = "Poista käytöstä";

/* Class = "NSMenu"; title = "Disable"; ObjectID = "flL-B2-XIP"; */
"flL-B2-XIP.title" = "Poista käytöstä";

/* Class = "NSButtonCell"; title = "Quit Spectacle"; ObjectID = "gMV-vD-CUe"; */
"gMV-vD-CUe.title" = "Sulje Spectacle";

/* Class = "NSMenuItem"; title = "Make Smaller"; ObjectID = "gTe-ym-DB0"; */
"gTe-ym-DB0.title" = "Pienennä";

/* Class = "NSMenuItem"; title = "Bottom Half"; ObjectID = "huV-Gw-lbX"; */
"huV-Gw-lbX.title" = "Alapuoli";

/* Class = "NSButtonCell"; title = "Open System Preferences"; ObjectID = "iPl-AT-Pei"; */
"iPl-AT-Pei.title" = "Avaa järjestelmäasetukset";

/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "l9O-0B-fjp"; */
"l9O-0B-fjp.title" = "Kumoa";

/* Class = "NSMenuItem"; title = "Upper Left"; ObjectID = "ldc-QO-Cq6"; */
"ldc-QO-Cq6.title" = "Ylävasen";

/* Class = "NSMenuItem"; title = "for APPLICATION"; ObjectID = "msZ-id-Pvw"; */
"msZ-id-Pvw.title" = "ohjelmassa APPLICATION";

/* Class = "NSMenuItem"; title = "Lower Right"; ObjectID = "oDU-J0-NkJ"; */
"oDU-J0-NkJ.title" = "Alaoikea";

/* Class = "NSMenuItem"; title = "for an hour"; ObjectID = "qpo-5w-ZIY"; */
"qpo-5w-ZIY.title" = "tunniksi";

/* Class = "NSTextFieldCell"; title = "Grant access to this application in System Preferences."; ObjectID = "ruu-yJ-Q1F"; */
"ruu-yJ-Q1F.title" = "Salli pääsy tälle ohjelmalle järjestelmäasetuksissa.";

/* Class = "NSMenuItem"; title = "Center"; ObjectID = "xJu-Uo-nZw"; */
"xJu-Uo-nZw.title" = "Keskitä";

/* Class = "NSMenuItem"; title = "Top Half"; ObjectID = "yh0-ik-weD"; */
"yh0-ik-weD.title" = "Yläpuoli";


================================================
FILE: Spectacle/Resources/Localizations/fi.lproj/SpectaclePreferencesWindow.strings
================================================

/* Class = "NSTextFieldCell"; title = "Make Larger:"; ObjectID = "0f9-kj-bro"; */
"0f9-kj-bro.title" = "Suurenna:";

/* Class = "NSTextFieldCell"; title = "Control"; ObjectID = "7Fe-Da-fYB"; */
"7Fe-Da-fYB.title" = "Ctrl";

/* Class = "NSTextFieldCell"; title = "⌃"; ObjectID = "806-S1-nYH"; */
"806-S1-nYH.title" = "⌃";

/* Class = "NSTextFieldCell"; title = "Top Half:"; ObjectID = "AnP-Lv-Hbd"; */
"AnP-Lv-Hbd.title" = "Yläpuoli:";

/* Class = "NSTextFieldCell"; title = "Bottom Half:"; ObjectID = "Awn-mO-sht"; */
"Awn-mO-sht.title" = "Alapuoli:";

/* Class = "NSTextFieldCell"; title = "Undo:"; ObjectID = "CJs-az-eG7"; */
"CJs-az-eG7.title" = "Kumoa:";

/* Class = "NSTextFieldCell"; title = "Left Half:"; ObjectID = "IWj-rc-Kvi"; */
"IWj-rc-Kvi.title" = "Vasen puoli:";

/* Class = "NSTextFieldCell"; title = "⇧"; ObjectID = "Ir0-AJ-ldj"; */
"Ir0-AJ-ldj.title" = "⇧";

/* Class = "NSWindow"; title = "Spectacle X.Y.Z"; ObjectID = "JW4-q9-L7q"; */
"JW4-q9-L7q.title" = "Spectacle X.Y.Z";

/* Class = "NSButtonCell"; title = "Restore Defaults..."; ObjectID = "NT7-Sd-Ofw"; */
"NT7-Sd-Ofw.title" = "Palauta oletukset...";

/* Class = "NSTextFieldCell"; title = "Make Smaller:"; ObjectID = "SDM-U5-yUR"; */
"SDM-U5-yUR.title" = "Pienennä:";

/* Class = "NSTextFieldCell"; title = "⌘"; ObjectID = "SQM-4e-yFd"; */
"SQM-4e-yFd.title" = "⌘";

/* Class = "NSTextFieldCell"; title = "Next Third:"; ObjectID = "Tze-mR-IV4"; */
"Tze-mR-IV4.title" = "Seuraava kolmasosa:";

/* Class = "NSTextFieldCell"; title = "Option"; ObjectID = "U0H-hG-KAQ"; */
"U0H-hG-KAQ.title" = "Optio";

/* Class = "NSTextFieldCell"; title = "Lower Right:"; ObjectID = "Vul-FT-BbB"; */
"Vul-FT-BbB.title" = "Alaoikea:";

/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "W2t-KP-bYJ"; */
"W2t-KP-bYJ.title" = "MuutNäkymät";

/* Class = "NSTextFieldCell"; title = "Right Half:"; ObjectID = "WeK-fS-mRh"; */
"WeK-fS-mRh.title" = "Oikea puoli:";

/* Class = "NSTextFieldCell"; title = "⌥"; ObjectID = "YQm-Kc-fYF"; */
"YQm-Kc-fYF.title" = "⌥";

/* Class = "NSMenuItem"; title = "as a background application"; ObjectID = "aWf-FC-J1j"; */
"aWf-FC-J1j.title" = "taustaohjelmana";

/* Class = "NSButtonCell"; title = "Launch Spectacle at login"; ObjectID = "cEj-mH-kie"; */
"cEj-mH-kie.title" = "Käynnistä Spectacle kirjauduttaessa";

/* Class = "NSTextFieldCell"; title = "Lower Left:"; ObjectID = "dQP-TR-GMx"; */
"dQP-TR-GMx.title" = "Alavasen:";

/* Class = "NSTextFieldCell"; title = "Shift"; ObjectID = "dww-8Q-sa1"; */
"dww-8Q-sa1.title" = "Vaihto";

/* Class = "NSTextFieldCell"; title = "Run..."; ObjectID = "eYU-TH-wcO"; */
"eYU-TH-wcO.title" = "Suorita...";

/* Class = "NSTextFieldCell"; title = "Upper Right:"; ObjectID = "gSY-Au-xOH"; */
"gSY-Au-xOH.title" = "Yläoikea:";

/* Class = "NSTextFieldCell"; title = "Previous Display:"; ObjectID = "hmL-EC-pro"; */
"hmL-EC-pro.title" = "Edellinen näyttö:";

/* Class = "NSMenuItem"; title = "in the status menu"; ObjectID = "in4-v8-tIm"; */
"in4-v8-tIm.title" = "valikkopalkissa";

/* Class = "NSTextFieldCell"; title = "Command"; ObjectID = "jdf-Yu-zrq"; */
"jdf-Yu-zrq.title" = "Komento";

/* Class = "NSTextFieldCell"; title = "Upper Left:"; ObjectID = "ldH-1E-mKW"; */
"ldH-1E-mKW.title" = "Ylävasen:";

/* Class = "NSTextFieldCell"; title = "Next Display:"; ObjectID = "lw7-Ap-kJO"; */
"lw7-Ap-kJO.title" = "Seuraava näyttö:";

/* Class = "NSTextFieldCell"; title = "Center:"; ObjectID = "oqf-7z-BFa"; */
"oqf-7z-BFa.title" = "Keskitys:";

/* Class = "NSTextFieldCell"; title = "Previous Third:"; ObjectID = "s3E-Lp-mJ4"; */
"s3E-Lp-mJ4.title" = "Edellinen kolmasosa:";

/* Class = "NSTextFieldCell"; title = "Fullscreen:"; ObjectID = "tKr-XE-DEU"; */
"tKr-XE-DEU.title" = "Koko näyttö:";

/* Class = "NSBox"; title = "Box"; ObjectID = "vWw-ws-BgW"; */
"vWw-ws-BgW.title" = "Box";

/* Class = "NSTextFieldCell"; title = "Redo:"; ObjectID = "y7M-cR-DF2"; */
"y7M-cR-DF2.title" = "Tee uudelleen:";


================================================
FILE: Spectacle/Resources/Localizations/fr.lproj/Credits.rtf
================================================
{\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww11300\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qc

\f0\b\fs24 \cf0 Cr\'e9dits
\b0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
\cf0 Ic\'f4nes et autres \'9cuvres: {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.fi"}}{\fldrslt 
\b Iiro J\'e4ppinen}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural

\b0 \cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
\cf0 Code source disponible sur {\field{\*\fldinst{HYPERLINK "https://github.com/eczarny/spectacle"}}{\fldrslt 
\b GitHub}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
{\field{\*\fldinst{HYPERLINK "https://twitter.com/spectacleapp"}}{\fldrslt \cf0 @spectacleapp}}\
}

================================================
FILE: Spectacle/Resources/Localizations/fr.lproj/Spectacle.strings
================================================

/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "187-7k-0Ct"; */
"187-7k-0Ct.title" = "Rétablir";

/* Class = "NSMenuItem"; title = "Check for Updates..."; ObjectID = "2sj-vF-eSL"; */
"2sj-vF-eSL.title" = "Vérifier les mises à jour...";

/* Class = "NSMenuItem"; title = "Next Third"; ObjectID = "7HO-L3-O6Q"; */
"7HO-L3-O6Q.title" = "Tiers suivant";

/* Class = "NSMenuItem"; title = "Upper Right"; ObjectID = "C7t-Sf-kOI"; */
"C7t-Sf-kOI.title" = "En haut à droite";

/* Class = "NSMenuItem"; title = "About Spectacle"; ObjectID = "EA9-dx-Qfg"; */
"EA9-dx-Qfg.title" = "À propos de Spectacle";

/* Class = "NSTextFieldCell"; title = "Spectacle would like to control your windows using accessibility features."; ObjectID = "HRo-tn-M1V"; */
"HRo-tn-M1V.title" = "Spectacle souhaite contrôler vos fenêtres à l'aide des fonctionnalités d'accessibilité.";

/* Class = "NSMenuItem"; title = "Next Display"; ObjectID = "I4U-jL-hXq"; */
"I4U-jL-hXq.title" = "Écran suivant";

/* Class = "NSMenuItem"; title = "Quit Spectacle"; ObjectID = "Isn-Og-AEv"; */
"Isn-Og-AEv.title" = "Quitter Spectacle";

/* Class = "NSMenuItem"; title = "Left Half"; ObjectID = "Jae-vx-7ZC"; */
"Jae-vx-7ZC.title" = "Moitié gauche";

/* Class = "NSMenu"; title = "Spectacle Status Item"; ObjectID = "KsA-8w-wcl"; */
"KsA-8w-wcl.title" = "Spectacle Status Item";

/* Class = "NSMenuItem"; title = "Preferences..."; ObjectID = "ME4-Br-HLT"; */
"ME4-Br-HLT.title" = "Préférences...";

/* Class = "NSMenuItem"; title = "Make Larger"; ObjectID = "Yun-AA-OVD"; */
"Yun-AA-OVD.title" = "Agrandir";

/* Class = "NSMenuItem"; title = "Previous Display"; ObjectID = "aPo-Rp-A1X"; */
"aPo-Rp-A1X.title" = "Écran précédent";

/* Class = "NSMenuItem"; title = "Previous Third"; ObjectID = "bV9-Ga-jDG"; */
"bV9-Ga-jDG.title" = "Tiers précédent";

/* Class = "NSMenuItem"; title = "Right Half"; ObjectID = "cae-26-Oab"; */
"cae-26-Oab.title" = "Moitié droit";

/* Class = "NSMenuItem"; title = "Fullscreen"; ObjectID = "dwQ-Bl-nEL"; */
"dwQ-Bl-nEL.title" = "Plein écran";

/* Class = "NSMenuItem"; title = "Lower Left"; ObjectID = "eN5-A6-iho"; */
"eN5-A6-iho.title" = "En bas à gauche";

/* Class = "NSMenuItem"; title = "Disable"; ObjectID = "eZT-Mm-qSc"; */
"eZT-Mm-qSc.title" = "Désactiver";

/* Class = "NSMenu"; title = "Disable"; ObjectID = "flL-B2-XIP"; */
"flL-B2-XIP.title" = "Désactiver";

/* Class = "NSButtonCell"; title = "Quit Spectacle"; ObjectID = "gMV-vD-CUe"; */
"gMV-vD-CUe.title" = "Quitter Spectacle";

/* Class = "NSMenuItem"; title = "Make Smaller"; ObjectID = "gTe-ym-DB0"; */
"gTe-ym-DB0.title" = "Réduire";

/* Class = "NSMenuItem"; title = "Bottom Half"; ObjectID = "huV-Gw-lbX"; */
"huV-Gw-lbX.title" = "Moitié bas";

/* Class = "NSButtonCell"; title = "Open System Preferences"; ObjectID = "iPl-AT-Pei"; */
"iPl-AT-Pei.title" = "Ouvrir Préférences Système";

/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "l9O-0B-fjp"; */
"l9O-0B-fjp.title" = "Annuler";

/* Class = "NSMenuItem"; title = "Upper Left"; ObjectID = "ldc-QO-Cq6"; */
"ldc-QO-Cq6.title" = "En haut à gauche";

/* Class = "NSMenuItem"; title = "for APPLICATION"; ObjectID = "msZ-id-Pvw"; */
"msZ-id-Pvw.title" = "for APPLICATION";

/* Class = "NSMenuItem"; title = "Lower Right"; ObjectID = "oDU-J0-NkJ"; */
"oDU-J0-NkJ.title" = "En bas à droite";

/* Class = "NSMenuItem"; title = "for an hour"; ObjectID = "qpo-5w-ZIY"; */
"qpo-5w-ZIY.title" = "pour 1 heure";

/* Class = "NSTextFieldCell"; title = "Grant access to this application in System Preferences."; ObjectID = "ruu-yJ-Q1F"; */
"ruu-yJ-Q1F.title" = "Accorder l'accès à cette application dans les Préférences Système.";

/* Class = "NSMenuItem"; title = "Center"; ObjectID = "xJu-Uo-nZw"; */
"xJu-Uo-nZw.title" = "Centrer";

/* Class = "NSMenuItem"; title = "Top Half"; ObjectID = "yh0-ik-weD"; */
"yh0-ik-weD.title" = "Moitié haut";


================================================
FILE: Spectacle/Resources/Localizations/fr.lproj/SpectaclePreferencesWindow.strings
================================================

/* Class = "NSTextFieldCell"; title = "Make Larger:"; ObjectID = "0f9-kj-bro"; */
"0f9-kj-bro.title" = "Agrandir:";

/* Class = "NSTextFieldCell"; title = "Control"; ObjectID = "7Fe-Da-fYB"; */
"7Fe-Da-fYB.title" = "Contrôle";

/* Class = "NSTextFieldCell"; title = "⌃"; ObjectID = "806-S1-nYH"; */
"806-S1-nYH.title" = "⌃";

/* Class = "NSTextFieldCell"; title = "Top Half:"; ObjectID = "AnP-Lv-Hbd"; */
"AnP-Lv-Hbd.title" = "Moitié haut:";

/* Class = "NSTextFieldCell"; title = "Bottom Half:"; ObjectID = "Awn-mO-sht"; */
"Awn-mO-sht.title" = "Moitié bas:";

/* Class = "NSTextFieldCell"; title = "Undo:"; ObjectID = "CJs-az-eG7"; */
"CJs-az-eG7.title" = "Annuler:";

/* Class = "NSTextFieldCell"; title = "Left Half:"; ObjectID = "IWj-rc-Kvi"; */
"IWj-rc-Kvi.title" = "Moitié gauche:";

/* Class = "NSTextFieldCell"; title = "⇧"; ObjectID = "Ir0-AJ-ldj"; */
"Ir0-AJ-ldj.title" = "⇧";

/* Class = "NSWindow"; title = "Spectacle X.Y.Z"; ObjectID = "JW4-q9-L7q"; */
"JW4-q9-L7q.title" = "Spectacle X.Y.Z";

/* Class = "NSButtonCell"; title = "Restore Defaults..."; ObjectID = "NT7-Sd-Ofw"; */
"NT7-Sd-Ofw.title" = "Rétablir par défaut...";

/* Class = "NSTextFieldCell"; title = "Make Smaller:"; ObjectID = "SDM-U5-yUR"; */
"SDM-U5-yUR.title" = "Réduire:";

/* Class = "NSTextFieldCell"; title = "⌘"; ObjectID = "SQM-4e-yFd"; */
"SQM-4e-yFd.title" = "⌘";

/* Class = "NSTextFieldCell"; title = "Next Third:"; ObjectID = "Tze-mR-IV4"; */
"Tze-mR-IV4.title" = "Tiers suivant:";

/* Class = "NSTextFieldCell"; title = "Option"; ObjectID = "U0H-hG-KAQ"; */
"U0H-hG-KAQ.title" = "Option";

/* Class = "NSTextFieldCell"; title = "Lower Right:"; ObjectID = "Vul-FT-BbB"; */
"Vul-FT-BbB.title" = "En bas à droite:";

/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "W2t-KP-bYJ"; */
"W2t-KP-bYJ.title" = "OtherViews";

/* Class = "NSTextFieldCell"; title = "Right Half:"; ObjectID = "WeK-fS-mRh"; */
"WeK-fS-mRh.title" = "Moitié droit:";

/* Class = "NSTextFieldCell"; title = "⌥"; ObjectID = "YQm-Kc-fYF"; */
"YQm-Kc-fYF.title" = "⌥";

/* Class = "NSMenuItem"; title = "as a background application"; ObjectID = "aWf-FC-J1j"; */
"aWf-FC-J1j.title" = "comme une application d'arrière-plan";

/* Class = "NSButtonCell"; title = "Launch Spectacle at login"; ObjectID = "cEj-mH-kie"; */
"cEj-mH-kie.title" = "Ouvrir Spectacle au démarrage";

/* Class = "NSTextFieldCell"; title = "Lower Left:"; ObjectID = "dQP-TR-GMx"; */
"dQP-TR-GMx.title" = "En bas à gauche:";

/* Class = "NSTextFieldCell"; title = "Shift"; ObjectID = "dww-8Q-sa1"; */
"dww-8Q-sa1.title" = "Maj";

/* Class = "NSTextFieldCell"; title = "Run..."; ObjectID = "eYU-TH-wcO"; */
"eYU-TH-wcO.title" = "Lancer...";

/* Class = "NSTextFieldCell"; title = "Upper Right:"; ObjectID = "gSY-Au-xOH"; */
"gSY-Au-xOH.title" = "En haut à droite:";

/* Class = "NSTextFieldCell"; title = "Previous Display:"; ObjectID = "hmL-EC-pro"; */
"hmL-EC-pro.title" = "Écran précédent:";

/* Class = "NSMenuItem"; title = "in the status menu"; ObjectID = "in4-v8-tIm"; */
"in4-v8-tIm.title" = "dans la barre d'état";

/* Class = "NSTextFieldCell"; title = "Command"; ObjectID = "jdf-Yu-zrq"; */
"jdf-Yu-zrq.title" = "Commande";

/* Class = "NSTextFieldCell"; title = "Upper Left:"; ObjectID = "ldH-1E-mKW"; */
"ldH-1E-mKW.title" = "En haut à gauche:";

/* Class = "NSTextFieldCell"; title = "Next Display:"; ObjectID = "lw7-Ap-kJO"; */
"lw7-Ap-kJO.title" = "Écran suivant:";

/* Class = "NSTextFieldCell"; title = "Center:"; ObjectID = "oqf-7z-BFa"; */
"oqf-7z-BFa.title" = "Centrer:";

/* Class = "NSTextFieldCell"; title = "Previous Third:"; ObjectID = "s3E-Lp-mJ4"; */
"s3E-Lp-mJ4.title" = "Tiers précédent:";

/* Class = "NSTextFieldCell"; title = "Fullscreen:"; ObjectID = "tKr-XE-DEU"; */
"tKr-XE-DEU.title" = "Plein écran:";

/* Class = "NSBox"; title = "Box"; ObjectID = "vWw-ws-BgW"; */
"vWw-ws-BgW.title" = "Box";

/* Class = "NSTextFieldCell"; title = "Redo:"; ObjectID = "y7M-cR-DF2"; */
"y7M-cR-DF2.title" = "Rétablir:";


================================================
FILE: Spectacle/Resources/Localizations/it.lproj/Credits.rtf
================================================
{\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww11300\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qc

\f0\b\fs24 \cf0 Riconoscimenti
\b0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
\cf0 Icone ed altri elementi grafici: {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.fi"}}{\fldrslt 
\b Iiro J\'e4ppinen}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural

\b0 \cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
\cf0 Codice sorgente disponibile su {\field{\*\fldinst{HYPERLINK "https://github.com/eczarny/spectacle"}}{\fldrslt 
\b GitHub}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
{\field{\*\fldinst{HYPERLINK "https://twitter.com/spectacleapp"}}{\fldrslt \cf0 @spectacleapp}}\
}

================================================
FILE: Spectacle/Resources/Localizations/it.lproj/Spectacle.strings
================================================

/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "187-7k-0Ct"; */
"187-7k-0Ct.title" = "Ripristina";

/* Class = "NSMenuItem"; title = "Check for Updates..."; ObjectID = "2sj-vF-eSL"; */
"2sj-vF-eSL.title" = "Verifica aggiornamenti…";

/* Class = "NSMenuItem"; title = "Next Third"; ObjectID = "7HO-L3-O6Q"; */
"7HO-L3-O6Q.title" = "Terza successiva";

/* Class = "NSMenuItem"; title = "Upper Right"; ObjectID = "C7t-Sf-kOI"; */
"C7t-Sf-kOI.title" = "In alto a destra";

/* Class = "NSMenuItem"; title = "About Spectacle"; ObjectID = "EA9-dx-Qfg"; */
"EA9-dx-Qfg.title" = "Informazioni su Spectacle";

/* Class = "NSTextFieldCell"; title = "Spectacle would like to control your windows using accessibility features."; ObjectID = "HRo-tn-M1V"; */
"HRo-tn-M1V.title" = "Spectacle vorrebbe controllare le tue finestre usando le funzioni di accessibilità.";

/* Class = "NSMenuItem"; title = "Next Display"; ObjectID = "I4U-jL-hXq"; */
"I4U-jL-hXq.title" = "Monitor successivo";

/* Class = "NSMenuItem"; title = "Quit Spectacle"; ObjectID = "Isn-Og-AEv"; */
"Isn-Og-AEv.title" = "Esci da Spectacle";

/* Class = "NSMenuItem"; title = "Left Half"; ObjectID = "Jae-vx-7ZC"; */
"Jae-vx-7ZC.title" = "Metà sinistra";

/* Class = "NSMenu"; title = "Spectacle Status Item"; ObjectID = "KsA-8w-wcl"; */
"KsA-8w-wcl.title" = "Spectacle Status Item";

/* Class = "NSMenuItem"; title = "Preferences..."; ObjectID = "ME4-Br-HLT"; */
"ME4-Br-HLT.title" = "Preferenze…";

/* Class = "NSMenuItem"; title = "Make Larger"; ObjectID = "Yun-AA-OVD"; */
"Yun-AA-OVD.title" = "Ingrandisci";

/* Class = "NSMenuItem"; title = "Previous Display"; ObjectID = "aPo-Rp-A1X"; */
"aPo-Rp-A1X.title" = "Monitor precedente";

/* Class = "NSMenuItem"; title = "Previous Third"; ObjectID = "bV9-Ga-jDG"; */
"bV9-Ga-jDG.title" = "Terza precedente";

/* Class = "NSMenuItem"; title = "Right Half"; ObjectID = "cae-26-Oab"; */
"cae-26-Oab.title" = "Metà destra";

/* Class = "NSMenuItem"; title = "Fullscreen"; ObjectID = "dwQ-Bl-nEL"; */
"dwQ-Bl-nEL.title" = "A tutto schermo";

/* Class = "NSMenuItem"; title = "Lower Left"; ObjectID = "eN5-A6-iho"; */
"eN5-A6-iho.title" = "In basso a sinistra";

/* Class = "NSMenuItem"; title = "Disable"; ObjectID = "eZT-Mm-qSc"; */
"eZT-Mm-qSc.title" = "Disattiva";

/* Class = "NSMenu"; title = "Disable"; ObjectID = "flL-B2-XIP"; */
"flL-B2-XIP.title" = "Disattiva";

/* Class = "NSButtonCell"; title = "Quit Spectacle"; ObjectID = "gMV-vD-CUe"; */
"gMV-vD-CUe.title" = "Esci da Spectacle";

/* Class = "NSMenuItem"; title = "Make Smaller"; ObjectID = "gTe-ym-DB0"; */
"gTe-ym-DB0.title" = "Riduci";

/* Class = "NSMenuItem"; title = "Bottom Half"; ObjectID = "huV-Gw-lbX"; */
"huV-Gw-lbX.title" = "Metà bassa";

/* Class = "NSButtonCell"; title = "Open System Preferences"; ObjectID = "iPl-AT-Pei"; */
"iPl-AT-Pei.title" = "Apri Preferenze di Sistema";

/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "l9O-0B-fjp"; */
"l9O-0B-fjp.title" = "Annulla";

/* Class = "NSMenuItem"; title = "Upper Left"; ObjectID = "ldc-QO-Cq6"; */
"ldc-QO-Cq6.title" = "In alto a sinistra";

/* Class = "NSMenuItem"; title = "for APPLICATION"; ObjectID = "msZ-id-Pvw"; */
"msZ-id-Pvw.title" = "per APPLICATION";

/* Class = "NSMenuItem"; title = "Lower Right"; ObjectID = "oDU-J0-NkJ"; */
"oDU-J0-NkJ.title" = "In basso a destra";

/* Class = "NSMenuItem"; title = "for an hour"; ObjectID = "qpo-5w-ZIY"; */
"qpo-5w-ZIY.title" = "per un'ora";

/* Class = "NSTextFieldCell"; title = "Grant access to this application in System Preferences."; ObjectID = "ruu-yJ-Q1F"; */
"ruu-yJ-Q1F.title" = "Concedere l'accesso a questa applicazione nelle Preferenze di Sistema.";

/* Class = "NSMenuItem"; title = "Center"; ObjectID = "xJu-Uo-nZw"; */
"xJu-Uo-nZw.title" = "Centra";

/* Class = "NSMenuItem"; title = "Top Half"; ObjectID = "yh0-ik-weD"; */
"yh0-ik-weD.title" = "Metà alta";


================================================
FILE: Spectacle/Resources/Localizations/it.lproj/SpectaclePreferencesWindow.strings
================================================

/* Class = "NSTextFieldCell"; title = "Make Larger:"; ObjectID = "0f9-kj-bro"; */
"0f9-kj-bro.title" = "Ingrandisci:";

/* Class = "NSTextFieldCell"; title = "Control"; ObjectID = "7Fe-Da-fYB"; */
"7Fe-Da-fYB.title" = "Control";

/* Class = "NSTextFieldCell"; title = "⌃"; ObjectID = "806-S1-nYH"; */
"806-S1-nYH.title" = "⌃";

/* Class = "NSTextFieldCell"; title = "Top Half:"; ObjectID = "AnP-Lv-Hbd"; */
"AnP-Lv-Hbd.title" = "Metà alta:";

/* Class = "NSTextFieldCell"; title = "Bottom Half:"; ObjectID = "Awn-mO-sht"; */
"Awn-mO-sht.title" = "Metà bassa:";

/* Class = "NSTextFieldCell"; title = "Undo:"; ObjectID = "CJs-az-eG7"; */
"CJs-az-eG7.title" = "Annulla:";

/* Class = "NSTextFieldCell"; title = "Left Half:"; ObjectID = "IWj-rc-Kvi"; */
"IWj-rc-Kvi.title" = "Metà sinistra:";

/* Class = "NSTextFieldCell"; title = "⇧"; ObjectID = "Ir0-AJ-ldj"; */
"Ir0-AJ-ldj.title" = "⇧";

/* Class = "NSWindow"; title = "Spectacle X.Y.Z"; ObjectID = "JW4-q9-L7q"; */
"JW4-q9-L7q.title" = "Spectacle X.Y.Z";

/* Class = "NSButtonCell"; title = "Restore Defaults..."; ObjectID = "NT7-Sd-Ofw"; */
"NT7-Sd-Ofw.title" = "Ripristina predefiniti…";

/* Class = "NSTextFieldCell"; title = "Make Smaller:"; ObjectID = "SDM-U5-yUR"; */
"SDM-U5-yUR.title" = "Riduci:";

/* Class = "NSTextFieldCell"; title = "⌘"; ObjectID = "SQM-4e-yFd"; */
"SQM-4e-yFd.title" = "⌘";

/* Class = "NSTextFieldCell"; title = "Next Third:"; ObjectID = "Tze-mR-IV4"; */
"Tze-mR-IV4.title" = "Terza successiva:";

/* Class = "NSTextFieldCell"; title = "Option"; ObjectID = "U0H-hG-KAQ"; */
"U0H-hG-KAQ.title" = "Opzione";

/* Class = "NSTextFieldCell"; title = "Lower Right:"; ObjectID = "Vul-FT-BbB"; */
"Vul-FT-BbB.title" = "In basso a destra:";

/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "W2t-KP-bYJ"; */
"W2t-KP-bYJ.title" = "OtherViews";

/* Class = "NSTextFieldCell"; title = "Right Half:"; ObjectID = "WeK-fS-mRh"; */
"WeK-fS-mRh.title" = "Metà destra:";

/* Class = "NSTextFieldCell"; title = "⌥"; ObjectID = "YQm-Kc-fYF"; */
"YQm-Kc-fYF.title" = "⌥";

/* Class = "NSMenuItem"; title = "as a background application"; ObjectID = "aWf-FC-J1j"; */
"aWf-FC-J1j.title" = "come applicazione in background";

/* Class = "NSButtonCell"; title = "Launch Spectacle at login"; ObjectID = "cEj-mH-kie"; */
"cEj-mH-kie.title" = "Apri Spectacle al login";

/* Class = "NSTextFieldCell"; title = "Lower Left:"; ObjectID = "dQP-TR-GMx"; */
"dQP-TR-GMx.title" = "In basso a sinistra:";

/* Class = "NSTextFieldCell"; title = "Shift"; ObjectID = "dww-8Q-sa1"; */
"dww-8Q-sa1.title" = "Maiuscole";

/* Class = "NSTextFieldCell"; title = "Run..."; ObjectID = "eYU-TH-wcO"; */
"eYU-TH-wcO.title" = "Esegui…";

/* Class = "NSTextFieldCell"; title = "Upper Right:"; ObjectID = "gSY-Au-xOH"; */
"gSY-Au-xOH.title" = "In alto a destra:";

/* Class = "NSTextFieldCell"; title = "Previous Display:"; ObjectID = "hmL-EC-pro"; */
"hmL-EC-pro.title" = "Monitor precedente:";

/* Class = "NSMenuItem"; title = "in the status menu"; ObjectID = "in4-v8-tIm"; */
"in4-v8-tIm.title" = "nel menu di stato";

/* Class = "NSTextFieldCell"; title = "Command"; ObjectID = "jdf-Yu-zrq"; */
"jdf-Yu-zrq.title" = "Comando";

/* Class = "NSTextFieldCell"; title = "Upper Left:"; ObjectID = "ldH-1E-mKW"; */
"ldH-1E-mKW.title" = "In alto a sinistra:";

/* Class = "NSTextFieldCell"; title = "Next Display:"; ObjectID = "lw7-Ap-kJO"; */
"lw7-Ap-kJO.title" = "Monitor successivo:";

/* Class = "NSTextFieldCell"; title = "Center:"; ObjectID = "oqf-7z-BFa"; */
"oqf-7z-BFa.title" = "Centra:";

/* Class = "NSTextFieldCell"; title = "Previous Third:"; ObjectID = "s3E-Lp-mJ4"; */
"s3E-Lp-mJ4.title" = "Terza precedente:";

/* Class = "NSTextFieldCell"; title = "Fullscreen:"; ObjectID = "tKr-XE-DEU"; */
"tKr-XE-DEU.title" = "A tutto schermo:";

/* Class = "NSBox"; title = "Box"; ObjectID = "vWw-ws-BgW"; */
"vWw-ws-BgW.title" = "Box";

/* Class = "NSTextFieldCell"; title = "Redo:"; ObjectID = "y7M-cR-DF2"; */
"y7M-cR-DF2.title" = "Ripristina:";


================================================
FILE: Spectacle/Resources/Localizations/pt.lproj/Credits.rtf
================================================
{\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\margl1440\margr1440\vieww11300\viewh8400\viewkind0
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\qc\partightenfactor0

\f0\b\fs24 \cf0 Cr\'e9ditos
\b0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
\cf0 \'cdcones e outras ilustra\'e7\'f5es: {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.fi"}}{\fldrslt 
\b Iiro J\'e4ppinen}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0

\b0 \cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc\partightenfactor0
\cf0 C\'f3digo fonte dispon\'edvel no {\field{\*\fldinst{HYPERLINK "https://github.com/eczarny/spectacle"}}{\fldrslt 
\b GitHub}}
\b \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
{\field{\*\fldinst{HYPERLINK "https://twitter.com/spectacleapp"}}{\fldrslt \cf0 @spectacleapp}}\
}

================================================
FILE: Spectacle/Resources/Localizations/pt.lproj/Spectacle.strings
================================================

/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "187-7k-0Ct"; */
"187-7k-0Ct.title" = "Refazer";

/* Class = "NSMenuItem"; title = "Check for Updates..."; ObjectID = "2sj-vF-eSL"; */
"2sj-vF-eSL.title" = "Buscar Atualizações...";

/* Class = "NSMenuItem"; title = "Next Third"; ObjectID = "7HO-L3-O6Q"; */
"7HO-L3-O6Q.title" = "Terço Seguinte";

/* Class = "NSMenuItem"; title = "Upper Right"; ObjectID = "C7t-Sf-kOI"; */
"C7t-Sf-kOI.title" = "Direita Superior";

/* Class = "NSMenuItem"; title = "About Spectacle"; ObjectID = "EA9-dx-Qfg"; */
"EA9-dx-Qfg.title" = "Sobre o Spectacle";

/* Class = "NSTextFieldCell"; title = "Spectacle would like to control your windows using accessibility features."; ObjectID = "HRo-tn-M1V"; */
"HRo-tn-M1V.title" = "O Spectacle deseja controlar as janelas usando recursos de acessibilidade.";

/* Class = "NSMenuItem"; title = "Next Display"; ObjectID = "I4U-jL-hXq"; */
"I4U-jL-hXq.title" = "Monitor Seguinte";

/* Class = "NSMenuItem"; title = "Quit Spectacle"; ObjectID = "Isn-Og-AEv"; */
"Isn-Og-AEv.title" = "Encerrar Spectacle";

/* Class = "NSMenuItem"; title = "Left Half"; ObjectID = "Jae-vx-7ZC"; */
"Jae-vx-7ZC.title" = "Metade Esquerda";

/* Class = "NSMenu"; title = "Spectacle Status Item"; ObjectID = "KsA-8w-wcl"; */
"KsA-8w-wcl.title" = "Spectacle Status Item";

/* Class = "NSMenuItem"; title = "Preferences..."; ObjectID = "ME4-Br-HLT"; */
"ME4-Br-HLT.title" = "Preferências...";

/* Class = "NSMenuItem"; title = "Make Larger"; ObjectID = "Yun-AA-OVD"; */
"Yun-AA-OVD.title" = "Aumentar";

/* Class = "NSMenuItem"; title = "Previous Display"; ObjectID = "aPo-Rp-A1X"; */
"aPo-Rp-A1X.title" = "Monitor Anterior";

/* Class = "NSMenuItem"; title = "Previous Third"; ObjectID = "bV9-Ga-jDG"; */
"bV9-Ga-jDG.title" = "Terço Anterior";

/* Class = "NSMenuItem"; title = "Right Half"; ObjectID = "cae-26-Oab"; */
"cae-26-Oab.title" = "Metade Direita";

/* Class = "NSMenuItem"; title = "Fullscreen"; ObjectID = "dwQ-Bl-nEL"; */
"dwQ-Bl-nEL.title" = "Preencher Tela";

/* Class = "NSMenuItem"; title = "Lower Left"; ObjectID = "eN5-A6-iho"; */
"eN5-A6-iho.title" = "Esquerda Inferior";

/* Class = "NSMenuItem"; title = "Disable"; ObjectID = "eZT-Mm-qSc"; */
"eZT-Mm-qSc.title" = "Desativar";

/* Class = "NSMenu"; title = "Disable"; ObjectID = "flL-B2-XIP"; */
"flL-B2-XIP.title" = "Desativar";

/* Class = "NSButtonCell"; title = "Quit Spectacle"; ObjectID = "gMV-vD-CUe"; */
"gMV-vD-CUe.title" = "Encerrar Spectacle";

/* Class = "NSMenuItem"; title = "Make Smaller"; ObjectID = "gTe-ym-DB0"; */
"gTe-ym-DB0.title" = "Diminuir";

/* Class = "NSMenuItem"; title = "Bottom Half"; ObjectID = "huV-Gw-lbX"; */
"huV-Gw-lbX.title" = "Metade Inferior";

/* Class = "NSButtonCell"; title = "Open System Preferences"; ObjectID = "iPl-AT-Pei"; */
"iPl-AT-Pei.title" = "Abrir Preferências do Sistema";

/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "l9O-0B-fjp"; */
"l9O-0B-fjp.title" = "Desfazer";

/* Class = "NSMenuItem"; title = "Upper Left"; ObjectID = "ldc-QO-Cq6"; */
"ldc-QO-Cq6.title" = "Esquerda Superior";

/* Class = "NSMenuItem"; title = "for APPLICATION"; ObjectID = "msZ-id-Pvw"; */
"msZ-id-Pvw.title" = "no APPLICATION";

/* Class = "NSMenuItem"; title = "Lower Right"; ObjectID = "oDU-J0-NkJ"; */
"oDU-J0-NkJ.title" = "Direita Inferior";

/* Class = "NSMenuItem"; title = "for an hour"; ObjectID = "qpo-5w-ZIY"; */
"qpo-5w-ZIY.title" = "por uma hora";

/* Class = "NSTextFieldCell"; title = "Grant access to this application in System Preferences."; ObjectID = "ruu-yJ-Q1F"; */
"ruu-yJ-Q1F.title" = "Conceda acesso a este aplicativo nas Preferências do Sistema.";

/* Class = "NSMenuItem"; title = "Center"; ObjectID = "xJu-Uo-nZw"; */
"xJu-Uo-nZw.title" = "Centralizar";

/* Class = "NSMenuItem"; title = "Top Half"; ObjectID = "yh0-ik-weD"; */
"yh0-ik-weD.title" = "Metade Superior";


================================================
FILE: Spectacle/Resources/Localizations/pt.lproj/SpectaclePreferencesWindow.strings
================================================

/* Class = "NSTextFieldCell"; title = "Make Larger:"; ObjectID = "0f9-kj-bro"; */
"0f9-kj-bro.title" = "Aumentar:";

/* Class = "NSTextFieldCell"; title = "Control"; ObjectID = "7Fe-Da-fYB"; */
"7Fe-Da-fYB.title" = "Controle";

/* Class = "NSTextFieldCell"; title = "⌃"; ObjectID = "806-S1-nYH"; */
"806-S1-nYH.title" = "⌃";

/* Class = "NSTextFieldCell"; title = "Top Half:"; ObjectID = "AnP-Lv-Hbd"; */
"AnP-Lv-Hbd.title" = "Metade Superior:";

/* Class = "NSTextFieldCell"; title = "Bottom Half:"; ObjectID = "Awn-mO-sht"; */
"Awn-mO-sht.title" = "Metade Inferior:";

/* Class = "NSTextFieldCell"; title = "Undo:"; ObjectID = "CJs-az-eG7"; */
"CJs-az-eG7.title" = "Desfazer:";

/* Class = "NSTextFieldCell"; title = "Left Half:"; ObjectID = "IWj-rc-Kvi"; */
"IWj-rc-Kvi.title" = "Metade Esquerda:";

/* Class = "NSTextFieldCell"; title = "⇧"; ObjectID = "Ir0-AJ-ldj"; */
"Ir0-AJ-ldj.title" = "⇧";

/* Class = "NSWindow"; title = "Spectacle X.Y.Z"; ObjectID = "JW4-q9-L7q"; */
"JW4-q9-L7q.title" = "Spectacle X.Y.Z";

/* Class = "NSButtonCell"; title = "Restore Defaults..."; ObjectID = "NT7-Sd-Ofw"; */
"NT7-Sd-Ofw.title" = "Restaurar Padrões...";

/* Class = "NSTextFieldCell"; title = "Make Smaller:"; ObjectID = "SDM-U5-yUR"; */
"SDM-U5-yUR.title" = "Diminuir:";

/* Class = "NSTextFieldCell"; title = "⌘"; ObjectID = "SQM-4e-yFd"; */
"SQM-4e-yFd.title" = "⌘";

/* Class = "NSTextFieldCell"; title = "Next Third:"; ObjectID = "Tze-mR-IV4"; */
"Tze-mR-IV4.title" = "Terço Seguinte:";

/* Class = "NSTextFieldCell"; title = "Option"; ObjectID = "U0H-hG-KAQ"; */
"U0H-hG-KAQ.title" = "Opção";

/* Class = "NSTextFieldCell"; title = "Lower Right:"; ObjectID = "Vul-FT-BbB"; */
"Vul-FT-BbB.title" = "Direita Inferior:";

/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "W2t-KP-bYJ"; */
"W2t-KP-bYJ.title" = "OtherViews";

/* Class = "NSTextFieldCell"; title = "Right Half:"; ObjectID = "WeK-fS-mRh"; */
"WeK-fS-mRh.title" = "Metade Direita:";

/* Class = "NSTextFieldCell"; title = "⌥"; ObjectID = "YQm-Kc-fYF"; */
"YQm-Kc-fYF.title" = "⌥";

/* Class = "NSMenuItem"; title = "as a background application"; ObjectID = "aWf-FC-J1j"; */
"aWf-FC-J1j.title" = "em 2º plano";

/* Class = "NSButtonCell"; title = "Launch Spectacle at login"; ObjectID = "cEj-mH-kie"; */
"cEj-mH-kie.title" = "Abrir ao iniciar a sessão";

/* Class = "NSTextFieldCell"; title = "Lower Left:"; ObjectID = "dQP-TR-GMx"; */
"dQP-TR-GMx.title" = "Esquerda Inferior:";

/* Class = "NSTextFieldCell"; title = "Shift"; ObjectID = "dww-8Q-sa1"; */
"dww-8Q-sa1.title" = "Maiúsculas";

/* Class = "NSTextFieldCell"; title = "Run..."; ObjectID = "eYU-TH-wcO"; */
"eYU-TH-wcO.title" = "Manter:";

/* Class = "NSTextFieldCell"; title = "Upper Right:"; ObjectID = "gSY-Au-xOH"; */
"gSY-Au-xOH.title" = "Direita Superior:";

/* Class = "NSTextFieldCell"; title = "Previous Display:"; ObjectID = "hmL-EC-pro"; */
"hmL-EC-pro.title" = "Monitor Anterior:";

/* Class = "NSMenuItem"; title = "in the status menu"; ObjectID = "in4-v8-tIm"; */
"in4-v8-tIm.title" = "na barra de menus";

/* Class = "NSTextFieldCell"; title = "Command"; ObjectID = "jdf-Yu-zrq"; */
"jdf-Yu-zrq.title" = "Comando";

/* Class = "NSTextFieldCell"; title = "Upper Left:"; ObjectID = "ldH-1E-mKW"; */
"ldH-1E-mKW.title" = "Esquerda Superior:";

/* Class = "NSTextFieldCell"; title = "Next Display:"; ObjectID = "lw7-Ap-kJO"; */
"lw7-Ap-kJO.title" = "Monitor Seguinte:";

/* Class = "NSTextFieldCell"; title = "Center:"; ObjectID = "oqf-7z-BFa"; */
"oqf-7z-BFa.title" = "Centralizar:";

/* Class = "NSTextFieldCell"; title = "Previous Third:"; ObjectID = "s3E-Lp-mJ4"; */
"s3E-Lp-mJ4.title" = "Terço Anterior:";

/* Class = "NSTextFieldCell"; title = "Fullscreen:"; ObjectID = "tKr-XE-DEU"; */
"tKr-XE-DEU.title" = "Preencher Tela:";

/* Class = "NSBox"; title = "Box"; ObjectID = "vWw-ws-BgW"; */
"vWw-ws-BgW.title" = "Box";

/* Class = "NSTextFieldCell"; title = "Redo:"; ObjectID = "y7M-cR-DF2"; */
"y7M-cR-DF2.title" = "Refazer:";


================================================
FILE: Spectacle/Resources/Property Lists/Defaults.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>AutomaticUpdateCheckEnabled</key>
	<true/>
	<key>BackgroundAlertSuppressed</key>
	<false/>
	<key>BlacklistedApplications</key>
	<array>
		<string>com.adobe.Photoshop</string>
		<string>com.divisiblebyzero.Spectacle</string>
		<string>com.valvesoftware.steam</string>
	</array>
	<key>DisabledApplications</key>
	<array/>
	<key>StatusItemEnabled</key>
	<true/>
</dict>
</plist>


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleBottomHalfWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    var oneHalfRect = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
    oneHalfRect.height = Math.floor(oneHalfRect.height / 2.0);
    if (Math.abs(CGRectGetMidX(windowRect) - CGRectGetMidX(oneHalfRect)) <= 1.0) {
        var twoThirdsRect = SpectacleCalculationHelpers.copyRect(oneHalfRect);
        twoThirdsRect.height = Math.floor(visibleFrameOfDestinationScreen.height * 2 / 3.0);
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(oneHalfRect, windowRect)) {
            return twoThirdsRect;
        }
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(twoThirdsRect, windowRect)) {
            var oneThirdRect = SpectacleCalculationHelpers.copyRect(oneHalfRect);
            oneThirdRect.height = Math.floor(visibleFrameOfDestinationScreen.height / 3.0);
            return oneThirdRect;
        }
    }
    return oneHalfRect;
}, "SpectacleWindowActionBottomHalf");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleCenterWindowCalculation.js
================================================
var SpectacleCenterWindowCalculation = (function () {
    var centerWindowRectInVisibleFrameOfScreen = function(windowRect, visibleFrameOfScreen) {
        var calculatedWindowRect = SpectacleCalculationHelpers.copyRect(windowRect);
        calculatedWindowRect.x = Math.round((visibleFrameOfScreen.width - windowRect.width) / 2.0) + visibleFrameOfScreen.x;
        calculatedWindowRect.y = Math.round((visibleFrameOfScreen.height - windowRect.height) / 2.0) + visibleFrameOfScreen.y;
        return calculatedWindowRect;
    };
    return {
        centerWindowRectInVisibleFrameOfScreen: centerWindowRectInVisibleFrameOfScreen,
    };
})();

windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    return SpectacleCenterWindowCalculation.centerWindowRectInVisibleFrameOfScreen(windowRect, visibleFrameOfDestinationScreen);
}, "SpectacleWindowActionCenter");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleFullscreenWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    return visibleFrameOfDestinationScreen;
}, "SpectacleWindowActionFullscreen");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleLargerWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    return SpectacleWindowSizeAdjuster.resizeWindowRect(windowRect, visibleFrameOfDestinationScreen, 30.0);
}, "SpectacleWindowActionLarger");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleLeftHalfWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    var oneHalfRect = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
    oneHalfRect.width = Math.floor(oneHalfRect.width / 2.0);
    if (Math.abs(CGRectGetMidY(windowRect) - CGRectGetMidY(oneHalfRect)) <= 1.0) {
        var twoThirdRect = SpectacleCalculationHelpers.copyRect(oneHalfRect);
        twoThirdRect.width = Math.floor(visibleFrameOfDestinationScreen.width * 2 / 3.0);
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(oneHalfRect, windowRect)) {
            return twoThirdRect;
        }
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(twoThirdRect, windowRect)) {
            var oneThirdsRect = SpectacleCalculationHelpers.copyRect(oneHalfRect);
            oneThirdsRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 3.0);
            return oneThirdsRect;
        }
    }
    return oneHalfRect;
}, "SpectacleWindowActionLeftHalf");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleLowerLeftWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    var oneQuarterRect = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
    oneQuarterRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 2.0);
    oneQuarterRect.height = Math.floor(visibleFrameOfDestinationScreen.height / 2.0);
    if (Math.abs(CGRectGetMidY(windowRect) - CGRectGetMidY(oneQuarterRect)) <= 1.0) {
        var twoThirdRect = SpectacleCalculationHelpers.copyRect(oneQuarterRect);
        twoThirdRect.width = Math.floor(visibleFrameOfDestinationScreen.width * 2 / 3.0);
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(oneQuarterRect, windowRect)) {
            return twoThirdRect;
        }
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(twoThirdRect, windowRect)) {
            var oneThirdsRect = SpectacleCalculationHelpers.copyRect(oneQuarterRect);
            oneThirdsRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 3.0);
            return oneThirdsRect;
        }
    }
    return oneQuarterRect;
}, "SpectacleWindowActionLowerLeft");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleLowerRightWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    var oneQuarterRect = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
    oneQuarterRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 2.0);
    oneQuarterRect.height = Math.floor(visibleFrameOfDestinationScreen.height / 2.0);
    oneQuarterRect.x += oneQuarterRect.width;
    if (Math.abs(CGRectGetMidY(windowRect) - CGRectGetMidY(oneQuarterRect)) <= 1.0) {
        var twoThirdRect = SpectacleCalculationHelpers.copyRect(oneQuarterRect);
        twoThirdRect.width = Math.floor(visibleFrameOfDestinationScreen.width * 2 / 3.0);
        twoThirdRect.x = visibleFrameOfDestinationScreen.x + visibleFrameOfDestinationScreen.width - twoThirdRect.width;
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(oneQuarterRect, windowRect)) {
            return twoThirdRect;
        }
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(twoThirdRect, windowRect)) {
            var oneThirdsRect = SpectacleCalculationHelpers.copyRect(oneQuarterRect);
            oneThirdsRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 3.0);
            oneThirdsRect.x = visibleFrameOfDestinationScreen.x + visibleFrameOfDestinationScreen.width - oneThirdsRect.width;
            return oneThirdsRect;
        }
    }
    return oneQuarterRect;
}, "SpectacleWindowActionLowerRight");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleNextDisplayWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    return SpectacleNextOrPreviousDisplay.moveWindowRectToDisplay(windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen);
}, "SpectacleWindowActionNextDisplay");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleNextOrPreviousDisplay.js
================================================
var SpectacleNextOrPreviousDisplay = (function () {
    var moveWindowRectToDisplay = function(windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
        if (SpectacleCalculationHelpers.rectFitsWithinRect(windowRect, visibleFrameOfDestinationScreen)) {
            return SpectacleCenterWindowCalculation.centerWindowRectInVisibleFrameOfScreen(windowRect, visibleFrameOfDestinationScreen);
        } else {
            return visibleFrameOfDestinationScreen;
        }
    };
    return {
        moveWindowRectToDisplay: moveWindowRectToDisplay,
    };
})();


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleNextOrPreviousThirds.js
================================================
var SpectacleNextOrPreviousThirds = (function () {
    var findNextThird = function(windowRect, visibleFrameOfDestinationScreen) {
        var thirds = thirdsFromVisibleFrameOfScreen(visibleFrameOfDestinationScreen);
        var result = thirds[0];
        for (var i = 0; i < thirds.length; i++) {
            var third = thirds[i];
            if (SpectacleCalculationHelpers.rectCenteredWithinRect(third, windowRect)) {
                var j = i;
                if (++j >= thirds.length) {
                    j = 0;
                }
                result = thirds[j];
                break;
            }
        }
        return result;
    };
    var findPreviousThird = function(windowRect, visibleFrameOfDestinationScreen) {
        var thirds = thirdsFromVisibleFrameOfScreen(visibleFrameOfDestinationScreen);
        var result = thirds[0];
        for (var i = 0; i < thirds.length; i++) {
            var third = thirds[i];
            if (SpectacleCalculationHelpers.rectCenteredWithinRect(third, windowRect)) {
                var j = i;
                if (--j < 0) {
                    j = thirds.length - 1;
                }
                result = thirds[j];
                break;
            }
        }
        return result;
    };
    var thirdsFromVisibleFrameOfScreen = function(visibleFrameOfDestinationScreen) {
        var thirds = [];
        for (var i = 0; i < 3; i++) {
            var third = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
            third.x = visibleFrameOfDestinationScreen.x + (Math.floor(visibleFrameOfDestinationScreen.width / 3.0) * i);
            third.width = Math.floor(visibleFrameOfDestinationScreen.width / 3.0);
            thirds.push(third);
        }
        for (var i = 0; i < 3; i++) {
            var third = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
            third.y = visibleFrameOfDestinationScreen.y + visibleFrameOfDestinationScreen.height - (Math.floor(visibleFrameOfDestinationScreen.height / 3.0) * (i + 1));
            third.height = Math.floor(visibleFrameOfDestinationScreen.height / 3.0);
            thirds.push(third);
        }
        return thirds;
    };
    return {
        findNextThird: findNextThird,
        findPreviousThird: findPreviousThird,
    };
})();


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleNextThirdWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    return SpectacleNextOrPreviousThirds.findNextThird(windowRect, visibleFrameOfDestinationScreen);
}, "SpectacleWindowActionNextThird");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectaclePreviousDisplayWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    return SpectacleNextOrPreviousDisplay.moveWindowRectToDisplay(windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen);
}, "SpectacleWindowActionPreviousDisplay");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectaclePreviousThirdWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    return SpectacleNextOrPreviousThirds.findPreviousThird(windowRect, visibleFrameOfDestinationScreen);
}, "SpectacleWindowActionPreviousThird");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleRightHalfWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    var oneHalfRect = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
    oneHalfRect.width = Math.floor(oneHalfRect.width / 2.0);
    oneHalfRect.x += oneHalfRect.width;
    if (Math.abs(CGRectGetMidY(windowRect) - CGRectGetMidY(oneHalfRect)) <= 1.0) {
        var twoThirdRect = SpectacleCalculationHelpers.copyRect(oneHalfRect);
        twoThirdRect.width = Math.floor(visibleFrameOfDestinationScreen.width * 2 / 3.0);
        twoThirdRect.x = visibleFrameOfDestinationScreen.x + visibleFrameOfDestinationScreen.width - twoThirdRect.width;
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(oneHalfRect, windowRect)) {
            return twoThirdRect;
        }
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(twoThirdRect, windowRect)) {
            var oneThirdsRect = SpectacleCalculationHelpers.copyRect(oneHalfRect);
            oneThirdsRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 3.0);
            oneThirdsRect.x = visibleFrameOfDestinationScreen.x + visibleFrameOfDestinationScreen.width - oneThirdsRect.width;
            return oneThirdsRect;
        }
    }
    return oneHalfRect;
}, "SpectacleWindowActionRightHalf");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleSmallerWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    return SpectacleWindowSizeAdjuster.resizeWindowRect(windowRect, visibleFrameOfDestinationScreen, -30.0);
}, "SpectacleWindowActionSmaller");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleTopHalfWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    var oneHalfRect = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
    oneHalfRect.height = Math.floor(oneHalfRect.height / 2.0);
    oneHalfRect.y += oneHalfRect.height + (visibleFrameOfDestinationScreen.height % 2.0);
    if (Math.abs(CGRectGetMidX(windowRect) - CGRectGetMidX(oneHalfRect)) <= 1.0) {
        var twoThirdsRect = SpectacleCalculationHelpers.copyRect(oneHalfRect);
        twoThirdsRect.height = Math.floor(visibleFrameOfDestinationScreen.height * 2 / 3.0);
        twoThirdsRect.y = visibleFrameOfDestinationScreen.y + visibleFrameOfDestinationScreen.height - twoThirdsRect.height;
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(oneHalfRect, windowRect)) {
            return twoThirdsRect;
        }
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(twoThirdsRect, windowRect)) {
            var oneThirdRect = SpectacleCalculationHelpers.copyRect(oneHalfRect);
            oneThirdRect.height = Math.floor(visibleFrameOfDestinationScreen.height / 3.0);
            oneThirdRect.y = visibleFrameOfDestinationScreen.y + visibleFrameOfDestinationScreen.height - oneThirdRect.height;
            return oneThirdRect;
        }
    }
    return oneHalfRect;
}, "SpectacleWindowActionTopHalf");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleUpperLeftWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    var oneQuarterRect = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
    oneQuarterRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 2.0);
    oneQuarterRect.height = Math.floor(visibleFrameOfDestinationScreen.height / 2.0);
    oneQuarterRect.y = visibleFrameOfDestinationScreen.y + Math.floor(visibleFrameOfDestinationScreen.height / 2.0) + (visibleFrameOfDestinationScreen.height % 2.0);
    if (Math.abs(CGRectGetMidY(windowRect) - CGRectGetMidY(oneQuarterRect)) <= 1.0) {
        var twoThirdRect = SpectacleCalculationHelpers.copyRect(oneQuarterRect);
        twoThirdRect.width = Math.floor(visibleFrameOfDestinationScreen.width * 2 / 3.0);
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(oneQuarterRect, windowRect)) {
            return twoThirdRect;
        }
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(twoThirdRect, windowRect)) {
            var oneThirdsRect = SpectacleCalculationHelpers.copyRect(oneQuarterRect);
            oneThirdsRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 3.0);
            return oneThirdsRect;
        }
    }
    return oneQuarterRect;
}, "SpectacleWindowActionUpperLeft");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleUpperRightWindowCalculation.js
================================================
windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSourceScreen, visibleFrameOfDestinationScreen) {
    var oneQuarterRect = SpectacleCalculationHelpers.copyRect(visibleFrameOfDestinationScreen);
    oneQuarterRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 2.0);
    oneQuarterRect.height = Math.floor(visibleFrameOfDestinationScreen.height / 2.0);
    oneQuarterRect.x += oneQuarterRect.width;
    oneQuarterRect.y = visibleFrameOfDestinationScreen.y + Math.floor(visibleFrameOfDestinationScreen.height / 2.0) + (visibleFrameOfDestinationScreen.height % 2.0);
    if (Math.abs(CGRectGetMidY(windowRect) - CGRectGetMidY(oneQuarterRect)) <= 1.0) {
        var twoThirdRect = SpectacleCalculationHelpers.copyRect(oneQuarterRect);
        twoThirdRect.width = Math.floor(visibleFrameOfDestinationScreen.width * 2 / 3.0);
        twoThirdRect.x = visibleFrameOfDestinationScreen.x + visibleFrameOfDestinationScreen.width - twoThirdRect.width;
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(oneQuarterRect, windowRect)) {
            return twoThirdRect;
        }
        if (SpectacleCalculationHelpers.rectCenteredWithinRect(twoThirdRect, windowRect)) {
            var oneThirdsRect = SpectacleCalculationHelpers.copyRect(oneQuarterRect);
            oneThirdsRect.width = Math.floor(visibleFrameOfDestinationScreen.width / 3.0);
            oneThirdsRect.x = visibleFrameOfDestinationScreen.x + visibleFrameOfDestinationScreen.width - oneThirdsRect.width;
            return oneThirdsRect;
        }
    }
    return oneQuarterRect;
}, "SpectacleWindowActionUpperRight");


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleWindowCalculationHelpers.js
================================================
var SpectacleCalculationHelpers = (function () {
    var copyRect = function(rect) {
        return {
            x: rect.x,
            y: rect.y,
            width: rect.width,
            height: rect.height,
        };
    };
    var rectCenteredWithinRect = function(rect1, rect2) {
        var centeredMidX = Math.abs(CGRectGetMidX(rect2) - CGRectGetMidX(rect1)) <= 1.0;
        var centeredMidY = Math.abs(CGRectGetMidY(rect2) - CGRectGetMidY(rect1)) <= 1.0;
        return CGRectContainsRect(rect1, rect2) && centeredMidX && centeredMidY;
    };
    var rectFitsWithinRect = function(rect1, rect2) {
        return (rect1.width <= rect2.width) && (rect1.height <= rect2.height);
    };
    return {
        copyRect: copyRect,
        rectCenteredWithinRect: rectCenteredWithinRect,
        rectFitsWithinRect: rectFitsWithinRect,
    };
})();


================================================
FILE: Spectacle/Resources/Window Position Calculations/SpectacleWindowSizeAdjuster.js
================================================
var SpectacleWindowSizeAdjuster = (function () {
    var resizeWindowRect = function(windowRect, visibleFrameOfDestinationScreen, sizeOffset) {
        var resizedWindowRect = SpectacleCalculationHelpers.copyRect(windowRect);
        resizedWindowRect.width = resizedWindowRect.width + sizeOffset;
        resizedWindowRect.x = resizedWindowRect.x - Math.floor(sizeOffset / 2.0);
        resizedWindowRect = adjustedWindowRectAgainstLeftAndRightEdgesOfScreen(windowRect,
                                                                               resizedWindowRect,
                                                                               visibleFrameOfDestinationScreen);
        if (resizedWindowRect.width >= visibleFrameOfDestinationScreen.width) {
            resizedWindowRect.width = visibleFrameOfDestinationScreen.width;
        }
        resizedWindowRect.height = resizedWindowRect.height + sizeOffset;
        resizedWindowRect.y = resizedWindowRect.y - Math.floor(sizeOffset / 2.0);
        resizedWindowRect = adjustedWindowRectAgainstTopAndBottomEdgesOfScreen(windowRect,
                                                                               resizedWindowRect,
                                                                               visibleFrameOfDestinationScreen);
        if (resizedWindowRect.height >= visibleFrameOfDestinationScreen.height) {
            resizedWindowRect.height = visibleFrameOfDestinationScreen.height;
            resizedWindowRect.y = windowRect.y;
        }
        if (againstAllEdgesOfScreen(windowRect, visibleFrameOfDestinationScreen) && (sizeOffset < 0)) {
            resizedWindowRect.width = windowRect.width + sizeOffset;
            resizedWindowRect.x = windowRect.x - Math.floor(sizeOffset / 2.0);
            resizedWindowRect.height = windowRect.height + sizeOffset;
            resizedWindowRect.y = windowRect.y - Math.floor(sizeOffset / 2.0);
        }
        if (resizedWindowRectIsTooSmall(resizedWindowRect, visibleFrameOfDestinationScreen)) {
            resizedWindowRect = windowRect;
        }
        return resizedWindowRect;
    };
    var againstEdgeOfScreen = function(gap) {
        return Math.abs(gap) <= 5.0;
    };
    var againstTheLeftEdgeOfScreen = function(windowRect, visibleFrameOfDestinationScreen) {
        return againstEdgeOfScreen(windowRect.x - visibleFrameOfDestinationScreen.x);
    };
    var againstTheRightEdgeOfScreen = function(windowRect, visibleFrameOfDestinationScreen) {
        return againstEdgeOfScreen(CGRectGetMaxX(windowRect) - CGRectGetMaxX(visibleFrameOfDestinationScreen));
    };
    var againstTheTopEdgeOfScreen = function(windowRect, visibleFrameOfDestinationScreen) {
        return againstEdgeOfScreen(CGRectGetMaxY(windowRect) - CGRectGetMaxY(visibleFrameOfDestinationScreen));
    };
    var againstTheBottomEdgeOfScreen = function(windowRect, visibleFrameOfDestinationScreen) {
        return againstEdgeOfScreen(windowRect.y - visibleFrameOfDestinationScreen.y);
    };
    var againstAllEdgesOfScreen = function(windowRect, visibleFrameOfDestinationScreen) {
        return (againstTheLeftEdgeOfScreen(windowRect, visibleFrameOfDestinationScreen)
                && againstTheRightEdgeOfScreen(windowRect, visibleFrameOfDestinationScreen)
                && againstTheTopEdgeOfScreen(windowRect, visibleFrameOfDestinationScreen)
                && againstTheBottomEdgeOfScreen(windowRect, visibleFrameOfDestinationScreen));
    };
    var adjustedWindowRectAgainstLeftAndRightEdgesOfScreen = function(originalWindowRect, resizedWindowRect, visibleFrameOfDestinationScreen) {
        var adjustedWindowRect = SpectacleCalculationHelpers.copyRect(resizedWindowRect);
        if (againstTheRightEdgeOfScreen(originalWindowRect, visibleFrameOfDestinationScreen)) {
            adjustedWindowRect.x = CGRectGetMaxX(visibleFrameOfDestinationScreen) - adjustedWindowRect.width;
            if (againstTheLeftEdgeOfScreen(originalWindowRect, visibleFrameOfDestinationScreen)) {
                adjustedWindowRect.width = visibleFrameOfDestinationScreen.width;
            }
        }
        if (againstTheLeftEdgeOfScreen(originalWindowRect, visibleFrameOfDestinationScreen)) {
            adjustedWindowRect.x = visibleFrameOfDestinationScreen.x;
        }
        return adjustedWindowRect;
    };
    var adjustedWindowRectAgainstTopAndBottomEdgesOfScreen = function(originalWindowRect, resizedWindowRect, visibleFrameOfDestinationScreen) {
        var adjustedWindowRect = SpectacleCalculationHelpers.copyRect(resizedWindowRect);
        if (againstTheTopEdgeOfScreen(originalWindowRect, visibleFrameOfDestinationScreen)) {
            adjustedWindowRect.y = CGRectGetMaxY(visibleFrameOfDestinationScreen) - adjustedWindowRect.height;
            if (againstTheBottomEdgeOfScreen(originalWindowRect, visibleFrameOfDestinationScreen)) {
                adjustedWindowRect.height = visibleFrameOfDestinationScreen.height;
            }
        }
        if (againstTheBottomEdgeOfScreen(originalWindowRect, visibleFrameOfDestinationScreen)) {
            adjustedWindowRect.y = visibleFrameOfDestinationScreen.y;
        }
        return adjustedWindowRect;
    };
    var resizedWindowRectIsTooSmall = function(windowRect, visibleFrameOfDestinationScreen) {
        var minimumWindowRectWidth = Math.floor(visibleFrameOfDestinationScreen.width / 4.0);
        var minimumWindowRectHeight = Math.floor(visibleFrameOfDestinationScreen.height / 4.0);
        return (windowRect.width <= minimumWindowRectWidth) || (windowRect.height <= minimumWindowRectHeight);
    };
    return {
        resizeWindowRect: resizeWindowRect,
    };
})();


================================================
FILE: Spectacle/Sources/SpectacleAccessibilityElement.h
================================================
#import <Carbon/Carbon.h>

@interface SpectacleAccessibilityElement : NSObject

+ (SpectacleAccessibilityElement *)frontmostApplicationElement;
+ (SpectacleAccessibilityElement *)frontmostWindowElement;

- (SpectacleAccessibilityElement *)elementWithAttribute:(CFStringRef)attribute;

- (NSString *)stringValueOfAttribute:(CFStringRef)attribute;

- (AXValueRef)valueOfAttribute:(CFStringRef)attribute type:(AXValueType)type;
- (void)setValue:(AXValueRef)value forAttribute:(CFStringRef)attribute;

- (CGRect)rectOfElement;
- (void)setRectOfElement:(CGRect)rect;

+ (CGRect)normalizeCoordinatesOfRect:(CGRect)rect frameOfScreen:(CGRect)frameOfScreen;

- (BOOL)isSheet;
- (BOOL)isSystemDialog;

@end


================================================
FILE: Spectacle/Sources/SpectacleAccessibilityElement.m
================================================
#import "SpectacleAccessibilityElement.h"

#import <AppKit/AppKit.h>

@implementation SpectacleAccessibilityElement
{
  AXUIElementRef _underlyingElement;
}

- (instancetype)init
{
  if (self = [super init]) {
    _underlyingElement = NULL;
  }

  return self;
}

+ (SpectacleAccessibilityElement *)frontmostApplicationElement
{
  NSRunningApplication *frontmostApplication = [NSWorkspace sharedWorkspace].frontmostApplication;
  SpectacleAccessibilityElement *frontmostApplicationElement = [SpectacleAccessibilityElement new];
  AXUIElementRef underlyingElement = AXUIElementCreateApplication(frontmostApplication.processIdentifier);
  frontmostApplicationElement.underlyingElement = underlyingElement;
  CFRelease(underlyingElement);
  return frontmostApplicationElement;
}

+ (SpectacleAccessibilityElement *)frontmostWindowElement
{
  SpectacleAccessibilityElement *frontmostApplicationElement = [SpectacleAccessibilityElement frontmostApplicationElement];
  SpectacleAccessibilityElement *frontmostWindowElement = nil;
  if (frontmostApplicationElement) {
    frontmostWindowElement = [frontmostApplicationElement elementWithAttribute:kAXFocusedWindowAttribute];
    if (!frontmostWindowElement) {
      NSLog(@"Invalid accessibility element provided, unable to determine the size and position of the window.");
    }
  } else {
    NSLog(@"Failed to find the application that currently has focus.");
  }
  return frontmostWindowElement;
}

- (SpectacleAccessibilityElement *)elementWithAttribute:(CFStringRef)attribute
{
  SpectacleAccessibilityElement *newElement = nil;
  AXUIElementRef underlyingElement;
  AXError result = AXUIElementCopyAttributeValue(_underlyingElement, attribute, (CFTypeRef *)&underlyingElement);
  if (result == kAXErrorSuccess) {
    newElement = [SpectacleAccessibilityElement new];
    newElement.underlyingElement = underlyingElement;
    CFRelease(underlyingElement);
  } else {
    NSLog(@"Unable to obtain the accessibility element with the specified attribute: %@ (error code %d)", attribute, result);
  }
  return newElement;
}

- (NSString *)stringValueOfAttribute:(CFStringRef)attribute
{
  if (CFGetTypeID(_underlyingElement) == AXUIElementGetTypeID()) {
    CFTypeRef value;
    AXError result;
    result = AXUIElementCopyAttributeValue(_underlyingElement, attribute, &value);
    if (result == kAXErrorSuccess) {
      return CFBridgingRelease(value);
    } else {
      NSLog(@"There was a problem getting the string value of the specified attribute: %@ (error code %d)", attribute, result);
    }
  }
  return nil;
}

- (AXValueRef)valueOfAttribute:(CFStringRef)attribute type:(AXValueType)type
{
  if (CFGetTypeID(_underlyingElement) == AXUIElementGetTypeID()) {
    CFTypeRef value;
    AXError result;
    result = AXUIElementCopyAttributeValue(_underlyingElement, attribute, (CFTypeRef *)&value);
    if ((result == kAXErrorSuccess) && (AXValueGetType(value) == type)) {
      return value;
    } else {
      NSLog(@"There was a problem getting the value of the specified attribute: %@ (error code %d)", attribute, result);
    }
  }
  return NULL;
}

- (void)setValue:(AXValueRef)value forAttribute:(CFStringRef)attribute
{
  AXError result = AXUIElementSetAttributeValue(_underlyingElement, attribute, (CFTypeRef *)value);
  if (result != kAXErrorSuccess) {
    NSLog(@"There was a problem setting the value of the specified attribute: %@ (error code %d)", attribute, result);
  }
}

- (CGRect)rectOfElement
{
  CGRect result = CGRectNull;
  CFTypeRef positionValue = [self valueOfAttribute:kAXPositionAttribute type:kAXValueCGPointType];
  CFTypeRef sizeValue = [self valueOfAttribute:kAXSizeAttribute type:kAXValueCGSizeType];
  CGPoint position;
  CGSize size;
  AXValueGetValue(positionValue, kAXValueCGPointType, (void *)&position);
  AXValueGetValue(sizeValue, kAXValueCGSizeType, (void *)&size);
  if ((positionValue != NULL) && (sizeValue != NULL)) {
    CFRelease(positionValue);
    CFRelease(sizeValue);
    result = CGRectMake(position.x, position.y, size.width, size.height);
  }
  return result;
}

- (void)setRectOfElement:(CGRect)rect
{
  AXValueRef positionRef;
  AXValueRef sizeRef;
  positionRef = AXValueCreate(kAXValueCGPointType, (const void *)&rect.origin);
  sizeRef = AXValueCreate(kAXValueCGSizeType, (const void *)&rect.size);
  [self setValue:sizeRef forAttribute:kAXSizeAttribute];
  [self setValue:positionRef forAttribute:kAXPositionAttribute];
  [self setValue:sizeRef forAttribute:kAXSizeAttribute];
  CFRelease(positionRef);
  CFRelease(sizeRef);
}

+ (CGRect)normalizeCoordinatesOfRect:(CGRect)rect frameOfScreen:(CGRect)frameOfScreen
{
  CGRect frameOfScreenWithMenuBar = [[[NSScreen screens] objectAtIndex:0] frame];
  rect.origin.y = frameOfScreen.size.height - NSMaxY(rect) + (frameOfScreenWithMenuBar.size.height - frameOfScreen.size.height);
  return rect;
}

- (BOOL)isSheet
{
  return [[self stringValueOfAttribute:kAXRoleAttribute] isEqualToString:(__bridge NSString *)kAXSheetRole];
}

- (BOOL)isSystemDialog
{
  return [[self stringValueOfAttribute:kAXSubroleAttribute] isEqualToString:(__bridge NSString *)kAXSystemDialogSubrole];
}

- (void)dealloc
{
  if (_underlyingElement != NULL) {
    CFRelease(_underlyingElement);
  }
}

- (void)setUnderlyingElement:(AXUIElementRef)underlyingElement
{
  if (_underlyingElement != NULL) {
    CFRelease(_underlyingElement);
  }
  _underlyingElement = CFRetain(underlyingElement);
}

@end


================================================
FILE: Spectacle/Sources/SpectacleAppDelegate.h
================================================
#import <Cocoa/Cocoa.h>

@class SpectaclePreferencesController;

@interface SpectacleAppDelegate : NSObject <NSApplicationDelegate, NSMenuDelegate>

@property (nonatomic, strong) IBOutlet NSMenu *statusItemMenu;
@property (nonatomic, strong) IBOutlet NSWindow *accessiblityAccessDialogWindow;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToCenterShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToFullscreenShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToLeftShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToRightShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToTopShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToBottomShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToUpperLeftShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToLowerLeftShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToUpperRightShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToLowerRightShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToNextDisplayShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToPreviousDisplayShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToNextThirdShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *moveToPreviousThirdShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *makeLargerShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *makeSmallerShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *undoLastMoveShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *redoLastMoveShortcutMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *disableShortcutsForAnHourMenuItem;
@property (nonatomic, strong) IBOutlet NSMenuItem *disableShortcutsForApplicationMenuItem;

- (IBAction)showPreferencesWindow:(id)sender;

- (IBAction)moveFrontmostWindowToFullscreen:(id)sender;
- (IBAction)moveFrontmostWindowToCenter:(id)sender;
- (IBAction)moveFrontmostWindowToLeftHalf:(id)sender;
- (IBAction)moveFrontmostWindowToRightHalf:(id)sender;
- (IBAction)moveFrontmostWindowToTopHalf:(id)sender;
- (IBAction)moveFrontmostWindowToBottomHalf:(id)sender;
- (IBAction)moveFrontmostWindowToUpperLeft:(id)sender;
- (IBAction)moveFrontmostWindowToLowerLeft:(id)sender;
- (IBAction)moveFrontmostWindowToUpperRight:(id)sender;
- (IBAction)moveFrontmostWindowToLowerRight:(id)sender;
- (IBAction)moveFrontmostWindowToNextDisplay:(id)sender;
- (IBAction)moveFrontmostWindowToPreviousDisplay:(id)sender;
- (IBAction)moveFrontmostWindowToNextThird:(id)sender;
- (IBAction)moveFrontmostWindowToPreviousThird:(id)sender;
- (IBAction)makeFrontmostWindowLarger:(id)sender;
- (IBAction)makeFrontmostWindowSmaller:(id)sender;
- (IBAction)undoLastWindowAction:(id)sender;
- (IBAction)redoLastWindowAction:(id)sender;
- (IBAction)disableOrEnableShortcutsForAnHour:(id)sender;
- (IBAction)disableOrEnableShortcutsForApplication:(id)sender;

- (IBAction)openSystemPreferences:(id)sender;

@end


================================================
FILE: Spectacle/Sources/SpectacleAppDelegate.m
================================================
#import "SpectacleAppDelegate.h"

#import <Sparkle/Sparkle.h>

#import "SpectacleAccessibilityElement.h"
#import "SpectacleDefaultShortcutHelpers.h"
#import "SpectacleMigratingShortcutStorage.h"
#import "SpectaclePreferencesController.h"
#import "SpectacleScreenDetector.h"
#import "SpectacleShortcutJSONStorage.h"
#import "SpectacleShortcutManager.h"
#import "SpectacleShortcutTranslations.h"
#import "SpectacleShortcutUserDefaultsStorage.h"
#import "SpectacleUtilities.h"
#import "SpectacleWindowPositionCalculator.h"
#import "SpectacleWindowPositionManager.h"

@implementation SpectacleAppDelegate
{
  NSDictionary<NSString *, NSMenuItem *> *_shortcutMenuItems;
  NSStatusItem *_statusItem;
  id<SpectacleShortcutStorage> _shortcutStorage;
  SpectacleShortcutManager *_shortcutManager;
  SpectacleWindowPositionManager *_windowPositionManager;
  SpectaclePreferencesController *_preferencesController;
  NSTimer *_disableShortcutsForAnHourTimer;
  NSSet<NSString *> *_blacklistedApplications;
  NSMutableSet<NSString *> *_disabledApplications;
  BOOL _shortcutsAreDisabledForAnHour;
}

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
  NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
  NSNotificationCenter *workspaceNotificationCenter = [NSWorkspace sharedWorkspace].notificationCenter;
  [notificationCenter addObserver:self
                         selector:@selector(enableStatusItem)
                             name:@"SpectacleStatusItemEnabledNotification"
                           object:nil];
  [notificationCenter addObserver:self
                         selector:@selector(disableStatusItem)
                             name:@"SpectacleStatusItemDisabledNotification"
                           object:nil];
  [notificationCenter addObserver:self
                         selector:@selector(updateShortcutMenuItems)
                             name:@"SpectacleShortcutChangedNotification"
                           object:nil];
  [notificationCenter addObserver:self
                         selector:@selector(updateShortcutMenuItems)
                             name:@"SpectacleRestoreDefaultShortcutsNotification"
                           object:nil];
  [notificationCenter addObserver:self
                         selector:@selector(menuDidSendAction:)
                             name:NSMenuDidSendActionNotification
                           object:nil];
  [notificationCenter addObserver:self
                         selector:@selector(inputSourceSelectionDidChange)
                             name:NSTextInputContextKeyboardSelectionDidChangeNotification
                           object:nil];
  [workspaceNotificationCenter addObserver:self
                                  selector:@selector(applicationDidActivate:)
                                      name:NSWorkspaceDidActivateApplicationNotification
                                    object:nil];
  [workspaceNotificationCenter addObserver:self
                                  selector:@selector(applicationDidDeactivate:)
                                      name:NSWorkspaceDidDeactivateApplicationNotification
                                    object:nil];
  [SpectacleUtilities registerDefaultsForBundle:[NSBundle mainBundle]];
  _shortcutMenuItems = @{
                         @"MoveToCenter": _moveToCenterShortcutMenuItem,
                         @"MoveToFullscreen": _moveToFullscreenShortcutMenuItem,
                         @"MoveToLeftHalf": _moveToLeftShortcutMenuItem,
                         @"MoveToRightHalf": _moveToRightShortcutMenuItem,
                         @"MoveToTopHalf": _moveToTopShortcutMenuItem,
                         @"MoveToBottomHalf": _moveToBottomShortcutMenuItem,
                         @"MoveToUpperLeft": _moveToUpperLeftShortcutMenuItem,
                         @"MoveToLowerLeft": _moveToLowerLeftShortcutMenuItem,
                         @"MoveToUpperRight": _moveToUpperRightShortcutMenuItem,
                         @"MoveToLowerRight": _moveToLowerRightShortcutMenuItem,
                         @"MoveToNextDisplay": _moveToNextDisplayShortcutMenuItem,
                         @"MoveToPreviousDisplay": _moveToPreviousDisplayShortcutMenuItem,
                         @"MoveToNextThird": _moveToNextThirdShortcutMenuItem,
                         @"MoveToPreviousThird": _moveToPreviousThirdShortcutMenuItem,
                         @"MakeLarger": _makeLargerShortcutMenuItem,
                         @"MakeSmaller": _makeSmallerShortcutMenuItem,
                         @"UndoLastMove": _undoLastMoveShortcutMenuItem,
                         @"RedoLastMove": _redoLastMoveShortcutMenuItem,
                         };
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  _blacklistedApplications = [NSSet setWithArray:[userDefaults objectForKey:@"BlacklistedApplications"]];
  _disabledApplications = [NSMutableSet setWithArray:[userDefaults objectForKey:@"DisabledApplications"]];
  _shortcutStorage = [[SpectacleMigratingShortcutStorage alloc] initWithShortcutStorage:[SpectacleShortcutUserDefaultsStorage new]
                                                                   migrationDestination:[SpectacleShortcutJSONStorage new]];
  _shortcutManager = [[SpectacleShortcutManager alloc] initWithShortcutStorage:_shortcutStorage];
  SpectacleWindowPositionCalculator *windowPositionCalculator = [[SpectacleWindowPositionCalculator alloc] initWithErrorHandler:^(NSString *errorMessage) {
    NSAlert *alert = [NSAlert new];
    alert.alertStyle = NSWarningAlertStyle;
    alert.messageText = @"Encountered an unexpected error";
    alert.informativeText = errorMessage;
    [alert runModal];
  }];
  _windowPositionManager = [[SpectacleWindowPositionManager alloc] initWithScreenDetector:[SpectacleScreenDetector new]
                                                                 windowPositionCalculator:windowPositionCalculator
                                                                          sharedWorkspace:[NSWorkspace sharedWorkspace]];
  _preferencesController = [[SpectaclePreferencesController alloc] initWithShortcutManager:_shortcutManager
                                                                     windowPositionManager:_windowPositionManager
                                                                           shortcutStorage:_shortcutStorage];
  _shortcutsAreDisabledForAnHour = NO;
  [self manageShortcuts];
  [self disableShortcutsIfFrontmostApplicationIsBlacklistedOrDisabled];
  BOOL automaticallyChecksForUpdates = [userDefaults boolForKey:@"AutomaticUpdateCheckEnabled"];
  BOOL statusItemEnabled = [userDefaults boolForKey:@"StatusItemEnabled"];
  if (statusItemEnabled) {
    [self enableStatusItem];
  }
  [[SUUpdater sharedUpdater] setAutomaticallyChecksForUpdates:automaticallyChecksForUpdates];
  [self updateShortcutMenuItems];
  if (!AXIsProcessTrustedWithOptions(NULL)) {
    [[NSApplication sharedApplication] runModalForWindow:self.accessiblityAccessDialogWindow];
  }
}

- (BOOL)applicationShouldHandleReopen:(NSApplication *)application hasVisibleWindows:(BOOL)visibleWindows
{
  [self showPreferencesWindow:self];

  return YES;
}

- (IBAction)showPreferencesWindow:(id)sender
{
  [_preferencesController showWindow:sender];
}

- (IBAction)moveFrontmostWindowToFullscreen:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionFullscreen];
}

- (IBAction)moveFrontmostWindowToCenter:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionCenter];
}

- (IBAction)moveFrontmostWindowToLeftHalf:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionLeftHalf];
}

- (IBAction)moveFrontmostWindowToRightHalf:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionRightHalf];
}

- (IBAction)moveFrontmostWindowToTopHalf:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionTopHalf];
}

- (IBAction)moveFrontmostWindowToBottomHalf:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionBottomHalf];
}

- (IBAction)moveFrontmostWindowToUpperLeft:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionUpperLeft];
}

- (IBAction)moveFrontmostWindowToLowerLeft:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionLowerLeft];
}

- (IBAction)moveFrontmostWindowToUpperRight:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionUpperRight];
}

- (IBAction)moveFrontmostWindowToLowerRight:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionLowerRight];
}

- (IBAction)moveFrontmostWindowToNextDisplay:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionNextDisplay];
}

- (IBAction)moveFrontmostWindowToPreviousDisplay:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionPreviousDisplay];
}

- (IBAction)moveFrontmostWindowToNextThird:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionNextThird];
}

- (IBAction)moveFrontmostWindowToPreviousThird:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionPreviousThird];
}

- (IBAction)makeFrontmostWindowLarger:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionLarger];
}

- (IBAction)makeFrontmostWindowSmaller:(id)sender
{
  [_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                              action:kSpectacleWindowActionSmaller];
}

- (IBAction)undoLastWindowAction:(id)sender
{
  [_windowPositionManager undoLastWindowAction];
}

- (IBAction)redoLastWindowAction:(id)sender
{
  [_windowPositionManager redoLastWindowAction];
}

- (IBAction)disableOrEnableShortcutsForAnHour:(id)sender
{
  NSInteger newMenuItemState = NSMixedState;
  if (_shortcutsAreDisabledForAnHour) {
    _shortcutsAreDisabledForAnHour = NO;
    [_disableShortcutsForAnHourTimer invalidate];
    [self enableShortcutsIfPermitted];
    newMenuItemState = NSOffState;
  } else {
    _shortcutsAreDisabledForAnHour = YES;
    _disableShortcutsForAnHourTimer = [NSTimer scheduledTimerWithTimeInterval:3600
                                                                       target:self
                                                                     selector:@selector(disableOrEnableShortcutsForAnHour:)
                                                                     userInfo:nil
                                                                      repeats:NO];
    [_shortcutManager unregisterShortcuts];
    newMenuItemState = NSOnState;
  }
  self.disableShortcutsForAnHourMenuItem.state = newMenuItemState;
}

- (IBAction)disableOrEnableShortcutsForApplication:(id)sender
{
  NSRunningApplication *frontmostApplication = [NSWorkspace sharedWorkspace].frontmostApplication;
  if ([_disabledApplications containsObject:frontmostApplication.bundleIdentifier]) {
    [_disabledApplications removeObject:frontmostApplication.bundleIdentifier];
    [self enableShortcutsIfPermitted];
    self.disableShortcutsForApplicationMenuItem.state = NSOffState;
  } else {
    [_disabledApplications addObject:frontmostApplication.bundleIdentifier];
    [_shortcutManager unregisterShortcuts];
    self.disableShortcutsForApplicationMenuItem.state = NSOnState;
  }
  [NSUserDefaults.standardUserDefaults setObject:_disabledApplications.allObjects forKey:@"DisabledApplications"];
}

- (IBAction)openSystemPreferences:(id)sender
{
  NSURL *preferencePaneURL = [NSURL fileURLWithPath:[SpectacleUtilities pathForPreferencePaneNamed:@"Security"]];
  NSBundle *applicationBundle = NSBundle.mainBundle;
  NSURL *scriptURL = [applicationBundle URLForResource:@"Security & Privacy System Preferences" withExtension:@"scpt"];
  [[NSApplication sharedApplication] stopModal];
  [self.accessiblityAccessDialogWindow orderOut:self];
  if (![[[NSAppleScript alloc] initWithContentsOfURL:scriptURL error:nil] executeAndReturnError:nil]) {
    [[NSWorkspace sharedWorkspace] openURL:preferencePaneURL];
  }
}

- (void)dealloc
{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)manageShortcuts
{
  SpectacleShortcutAction action = ^(SpectacleShortcut *shortcut) {
    [self->_windowPositionManager moveFrontmostWindowElement:[SpectacleAccessibilityElement frontmostWindowElement]
                                                      action:shortcut.windowAction];
  };
  NSArray<SpectacleShortcut *> *shortcuts = [_shortcutStorage loadShortcutsWithAction:action];
  if (shortcuts.count != 0) {
    [_shortcutManager manageShortcuts:shortcuts];
  } else {
    [_shortcutManager manageShortcuts:SpectacleDefaultShortcutsWithAction(action)];
  }
}

- (void)enableStatusItem
{
  _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
  NSImage *statusImage = [NSBundle.mainBundle imageForResource:@"Spectacle Status Item"];
  [statusImage setTemplate:YES];
  _statusItem.highlightMode = YES;
  _statusItem.image = statusImage;
  _statusItem.menu = _statusItemMenu;
  _statusItem.toolTip = [@"Spectacle " stringByAppendingString:SpectacleUtilities.applicationVersion];
}

- (void)disableStatusItem
{
  [NSStatusBar.systemStatusBar removeStatusItem:_statusItem];
}

- (void)updateShortcutMenuItems
{
  for (NSString *shortcutName in _shortcutMenuItems.allKeys) {
    NSMenuItem *shortcutMenuItem = _shortcutMenuItems[shortcutName];
    SpectacleShortcut *shortcut = [_shortcutManager shortcutForShortcutName:shortcutName];
    if (shortcut) {
      shortcutMenuItem.keyEquivalent = [SpectacleTranslateKeyCode(shortcut.shortcutKeyCode) lowercaseString];
      shortcutMenuItem.keyEquivalentModifierMask = SpectacleConvertModifiersToCocoaIfNecessary(shortcut.shortcutModifiers);
    } else {
      shortcutMenuItem.keyEquivalent = @"";
      shortcutMenuItem.keyEquivalentModifierMask = 0;
    }
  }
}

- (void)enableShortcutsIfPermitted
{
  NSRunningApplication *frontmostApplication = [NSWorkspace sharedWorkspace].frontmostApplication;
  // Do not enable shortcuts if they should remain disabled for an hour.
  if (_shortcutsAreDisabledForAnHour) {
    return;
  }
  // Do not enable shortcuts if the application is blacklisted or disabled.
  if ([_blacklistedApplications containsObject:frontmostApplication.bundleIdentifier]
      || [_disabledApplications containsObject:frontmostApplication.bundleIdentifier]) {
    return;
  }
  [_shortcutManager registerShortcuts];
  [[NSNotificationCenter defaultCenter] postNotificationName:@"SpectacleShortcutChangedNotification" object:self];
}

- (void)disableShortcutsIfFrontmostApplicationIsBlacklistedOrDisabled
{
  NSRunningApplication *frontmostApplication = [NSWorkspace sharedWorkspace].frontmostApplication;
  // Do not disable shortcuts if the application is not blacklisted or disabled.
  if (![_blacklistedApplications containsObject:frontmostApplication.bundleIdentifier]
      && ![_disabledApplications containsObject:frontmostApplication.bundleIdentifier]) {
    return;
  }
  [_shortcutManager unregisterShortcuts];
}

- (void)applicationDidActivate:(NSNotification *)notification
{
  NSRunningApplication *application = notification.userInfo[NSWorkspaceApplicationKey];
  if ([_blacklistedApplications containsObject:application.bundleIdentifier]
      || [_disabledApplications containsObject:application.bundleIdentifier]) {
    [_shortcutManager unregisterShortcuts];
  }
}

- (void)applicationDidDeactivate:(NSNotification *)notification
{
  NSRunningApplication *application = notification.userInfo[NSWorkspaceApplicationKey];
  if ([_blacklistedApplications containsObject:application.bundleIdentifier]
      || [_disabledApplications containsObject:application.bundleIdentifier]) {
    [self enableShortcutsIfPermitted];
  }
}

- (void)menuWillOpen:(NSMenu *)menu
{
  NSRunningApplication *frontmostApplication = [NSWorkspace sharedWorkspace].frontmostApplication;
  self.disableShortcutsForApplicationMenuItem.hidden = NO;
  if ([_blacklistedApplications containsObject:frontmostApplication.bundleIdentifier]) {
    self.disableShortcutsForApplicationMenuItem.hidden = YES;
  } else {
    self.disableShortcutsForApplicationMenuItem.title =
      [NSString stringWithFormat:NSLocalizedString(@"MenuItemTitleDisableShortcutsForApplication", @"The menu item title that displays the application to disable shortcuts for"), frontmostApplication.localizedName];
  }
  if ([_disabledApplications containsObject:frontmostApplication.bundleIdentifier]) {
    self.disableShortcutsForApplicationMenuItem.state = NSOnState;
  } else {
    self.disableShortcutsForApplicationMenuItem.state = NSOffState;
  }
}

- (void)menuDidSendAction:(NSNotification *)notification
{
  NSMenuItem *menuItem = notification.userInfo[@"MenuItem"];
  if (menuItem.tag == -1) {
    [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
  }
}

- (void)inputSourceSelectionDidChange
{
  [_preferencesController loadRegisteredShortcuts];
  [self updateShortcutMenuItems];
}

@end


================================================
FILE: Spectacle/Sources/SpectacleBestEffortWindowMover.h
================================================
#import <Foundation/Foundation.h>

#import "SpectacleWindowMover.h"

@interface SpectacleBestEffortWindowMover : NSObject <SpectacleWindowMover>

- (instancetype)initWithInnerWindowMover:(id<SpectacleWindowMover>)innerWindowMover NS_DESIGNATED_INITIALIZER;

@end


================================================
FILE: Spectacle/Sources/SpectacleBestEffortWindowMover.m
================================================
#import "SpectacleBestEffortWindowMover.h"

#import "SpectacleAccessibilityElement.h"
#import "SpectacleWindowPositionManager.h"

@implementation SpectacleBestEffortWindowMover
{
  id<SpectacleWindowMover> _innerWindowMover;
}

- (instancetype)initWithInnerWindowMover:(id<SpectacleWindowMover>)innerWindowMover
{
  if (self = [super init]) {
    _innerWindowMover = innerWindowMover;
  }
  return self;
}

- (instancetype)init
{
  return [self initWithInnerWindowMover:nil];
}

+ (instancetype)newWithInnerWindowMover:(id<SpectacleWindowMover>)innerWindowMover
{
  return [[self alloc] initWithInnerWindowMover:innerWindowMover];
}

- (void)moveWindowRect:(CGRect)windowRect
         frameOfScreen:(CGRect)frameOfScreen
  visibleFrameOfScreen:(CGRect)visibleFrameOfScreen
frontmostWindowElement:(SpectacleAccessibilityElement *)frontmostWindowElement
                action:(SpectacleWindowAction *)action
{
  [_innerWindowMover moveWindowRect:windowRect
                      frameOfScreen:frameOfScreen
               visibleFrameOfScreen:visibleFrameOfScreen
             frontmostWindowElement:frontmostWindowElement
                             action:action];
  CGRect movedWindowRect = [frontmostWindowElement rectOfElement];
  CGRect previouslyMovedWindowRect = movedWindowRect;
  if (movedWindowRect.origin.x < visibleFrameOfScreen.origin.x) {
    movedWindowRect.origin.x = visibleFrameOfScreen.origin.x;
  } else if ((movedWindowRect.origin.x + movedWindowRect.size.width) > (visibleFrameOfScreen.origin.x + visibleFrameOfScreen.size.width)) {
    movedWindowRect.origin.x = visibleFrameOfScreen.origin.x + visibleFrameOfScreen.size.width - movedWindowRect.size.width;
  }
  movedWindowRect = [SpectacleAccessibilityElement normalizeCoordinatesOfRect:movedWindowRect
                                                                frameOfScreen:frameOfScreen];
  if (movedWindowRect.origin.y < visibleFrameOfScreen.origin.y) {
    movedWindowRect.origin.y = visibleFrameOfScreen.origin.y;
  } else if ((movedWindowRect.origin.y + movedWindowRect.size.height) > (visibleFrameOfScreen.origin.y + visibleFrameOfScreen.size.height)) {
    movedWindowRect.origin.y = visibleFrameOfScreen.origin.y + visibleFrameOfScreen.size.height - movedWindowRect.size.height;
  }
  movedWindowRect = [SpectacleAccessibilityElement normalizeCoordinatesOfRect:movedWindowRect
                                                                frameOfScreen:frameOfScreen];
  if (!CGRectEqualToRect(movedWindowRect, previouslyMovedWindowRect)) {
    [frontmostWindowElement setRectOfElement:movedWindowRect];
  }
}

@end


================================================
FILE: Spectacle/Sources/SpectacleDefaultShortcutHelpers.h
================================================
#import <Foundation/Foundation.h>

#import "SpectacleShortcut.h"

NSArray<SpectacleShortcut *> *SpectacleDefaultShortcutsWithAction(SpectacleShortcutAction action);


================================================
FILE: Spectacle/Sources/SpectacleDefaultShortcutHelpers.m
================================================
#import "SpectacleDefaultShortcutHelpers.h"

#import <Carbon/Carbon.h>
#import <Cocoa/Cocoa.h>

static NSArray<SpectacleShortcut *> *builtinDefaultShortcuts(void);

NSArray<SpectacleShortcut *> *SpectacleDefaultShortcutsWithAction(SpectacleShortcutAction action)
{
  NSMutableArray<SpectacleShortcut *> *defaultShortcuts = [NSMutableArray new];
  for (SpectacleShortcut *defaultShortcut in builtinDefaultShortcuts()) {
    [defaultShortcuts addObject:[defaultShortcut copyWithShortcutAction:action]];
  }
  return defaultShortcuts;
}

static NSArray<SpectacleShortcut *> *builtinDefaultShortcuts(void)
{
  return @[
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToCenter"          shortcutKeyBinding:@"alt+cmd+c"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToFullscreen"      shortcutKeyBinding:@"alt+cmd+f"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToLeftHalf"        shortcutKeyBinding:@"alt+cmd+left"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToRightHalf"       shortcutKeyBinding:@"alt+cmd+right"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToTopHalf"         shortcutKeyBinding:@"alt+cmd+up"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToBottomHalf"      shortcutKeyBinding:@"alt+cmd+down"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToUpperLeft"       shortcutKeyBinding:@"ctrl+cmd+left"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToLowerLeft"       shortcutKeyBinding:@"ctrl+shift+cmd+left"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToUpperRight"      shortcutKeyBinding:@"ctrl+cmd+right"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToLowerRight"      shortcutKeyBinding:@"ctrl+shift+cmd+right"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToNextDisplay"     shortcutKeyBinding:@"ctrl+alt+cmd+right"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToPreviousDisplay" shortcutKeyBinding:@"ctrl+alt+cmd+left"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToNextThird"       shortcutKeyBinding:@"ctrl+alt+right"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MoveToPreviousThird"   shortcutKeyBinding:@"ctrl+alt+left"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MakeLarger"            shortcutKeyBinding:@"ctrl+alt+shift+right"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"MakeSmaller"           shortcutKeyBinding:@"ctrl+alt+shift+left"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"UndoLastMove"          shortcutKeyBinding:@"alt+cmd+z"],
           [[SpectacleShortcut alloc] initWithShortcutName:@"RedoLastMove"          shortcutKeyBinding:@"alt+shift+cmd+z"],
           ];
}


================================================
FILE: Spectacle/Sources/SpectacleHistory.h
================================================
#import <Foundation/Foundation.h>

@class SpectacleHistoryItem;

@interface SpectacleHistory : NSObject

- (void)addHistoryItem:(SpectacleHistoryItem *)historyItem;

- (SpectacleHistoryItem *)nextHistoryItem;
- (SpectacleHistoryItem *)previousHistoryItem;

- (BOOL)isEmpty;

@end


================================================
FILE: Spectacle/Sources/SpectacleHistory.m
================================================
#import "SpectacleHistory.h"

#import "SpectacleHistoryItem.h"

@implementation SpectacleHistory
{
  SpectacleHistoryItem *_lastHistoryItem;
  SpectacleHistoryItem *_currentHistoryItem;
  NSInteger _size;
}

- (void)addHistoryItem:(SpectacleHistoryItem *)historyItem
{
  if ([self isEmpty]) {
    _currentHistoryItem = historyItem;
    _lastHistoryItem = _currentHistoryItem;
  } else {
    historyItem.previousHistoryItem = _currentHistoryItem;
    _currentHistoryItem.nextHistoryItem.previousHistoryItem = historyItem;
    _currentHistoryItem.nextHistoryItem = historyItem;
    if (![historyItem previousHistoryItem]) {
      _lastHistoryItem = historyItem;
    }
    _currentHistoryItem = historyItem;
  }
  if (++_size > 50) {
    _lastHistoryItem.nextHistoryItem.previousHistoryItem = nil;
    _lastHistoryItem = _lastHistoryItem.nextHistoryItem;
    _size--;
  }
}

- (SpectacleHistoryItem *)nextHistoryItem
{
  SpectacleHistoryItem *historyItem = _currentHistoryItem.nextHistoryItem;
  if (historyItem) {
    _currentHistoryItem = historyItem;
    _size++;
  }
  return historyItem;
}

- (SpectacleHistoryItem *)previousHistoryItem
{
  SpectacleHistoryItem *historyItem = _currentHistoryItem.previousHistoryItem;
  if (historyItem) {
    _currentHistoryItem = historyItem;
    _size--;
  }
  return historyItem;
}

- (BOOL)isEmpty
{
  return _size == 0;
}

@end


================================================
FILE: Spectacle/Sources/SpectacleHistoryItem.h
================================================
#import <Foundation/Foundation.h>

#import "SpectacleMacros.h"

@class SpectacleAccessibilityElement;

@interface SpectacleHistoryItem : NSObject

@property (nonatomic, strong) SpectacleAccessibilityElement *accessibilityElement;
@property (nonatomic, assign) CGRect windowRect;
@property (nonatomic, strong) SpectacleHistoryItem *nextHistoryItem;
@property (nonatomic, weak) SpectacleHistoryItem *previousHistoryItem;

- (instancetype)initWithAccessibilityElement:(SpectacleAccessibilityElement *)accessibilityElement
                                  windowRect:(CGRect)windowRect NS_DESIGNATED_INITIALIZER;

+ (SpectacleHistoryItem *)historyItemFromAccessibilityElement:(SpectacleAccessibilityElement *)accessibilityElement
                                                   windowRect:(CGRect)windowRect;

SPECTACLE_INIT_AND_NEW_UNAVAILABLE

@end


================================================
FILE: Spectacle/Sources/SpectacleHistoryItem.m
================================================
#import "SpectacleHistoryItem.h"

@implementation SpectacleHistoryItem

- (i
Download .txt
gitextract_y6p7bt7r/

├── .gitignore
├── .travis.yml
├── CONTRIBUTING.md
├── Cartfile
├── Cartfile.resolved
├── LICENSE.md
├── README.md
├── Spectacle/
│   ├── Resources/
│   │   ├── Certificates/
│   │   │   └── dsa_public.pem
│   │   ├── Images.xcassets/
│   │   │   ├── 10.9 Crash Fix.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── Contents.json
│   │   │   ├── Security & Privacy.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── Spectacle Status Item.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── Spectacle.appiconset/
│   │   │       └── Contents.json
│   │   ├── Localizations/
│   │   │   ├── Base.lproj/
│   │   │   │   ├── Spectacle.xib
│   │   │   │   └── SpectaclePreferencesWindow.xib
│   │   │   ├── en.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   └── Localizable.strings
│   │   │   ├── es.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   ├── Localizable.strings
│   │   │   │   ├── Spectacle.strings
│   │   │   │   └── SpectaclePreferencesWindow.strings
│   │   │   ├── fi.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   ├── Localizable.strings
│   │   │   │   ├── Spectacle.strings
│   │   │   │   └── SpectaclePreferencesWindow.strings
│   │   │   ├── fr.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   ├── Localizable.strings
│   │   │   │   ├── Spectacle.strings
│   │   │   │   └── SpectaclePreferencesWindow.strings
│   │   │   ├── it.lproj/
│   │   │   │   ├── Credits.rtf
│   │   │   │   ├── InfoPlist.strings
│   │   │   │   ├── Localizable.strings
│   │   │   │   ├── Spectacle.strings
│   │   │   │   └── SpectaclePreferencesWindow.strings
│   │   │   └── pt.lproj/
│   │   │       ├── Credits.rtf
│   │   │       ├── InfoPlist.strings
│   │   │       ├── Localizable.strings
│   │   │       ├── Spectacle.strings
│   │   │       └── SpectaclePreferencesWindow.strings
│   │   ├── Property Lists/
│   │   │   └── Defaults.plist
│   │   ├── Scripts/
│   │   │   ├── Security & Privacy System Preferences Original.scpt
│   │   │   └── Security & Privacy System Preferences.scpt
│   │   └── Window Position Calculations/
│   │       ├── SpectacleBottomHalfWindowCalculation.js
│   │       ├── SpectacleCenterWindowCalculation.js
│   │       ├── SpectacleFullscreenWindowCalculation.js
│   │       ├── SpectacleLargerWindowCalculation.js
│   │       ├── SpectacleLeftHalfWindowCalculation.js
│   │       ├── SpectacleLowerLeftWindowCalculation.js
│   │       ├── SpectacleLowerRightWindowCalculation.js
│   │       ├── SpectacleNextDisplayWindowCalculation.js
│   │       ├── SpectacleNextOrPreviousDisplay.js
│   │       ├── SpectacleNextOrPreviousThirds.js
│   │       ├── SpectacleNextThirdWindowCalculation.js
│   │       ├── SpectaclePreviousDisplayWindowCalculation.js
│   │       ├── SpectaclePreviousThirdWindowCalculation.js
│   │       ├── SpectacleRightHalfWindowCalculation.js
│   │       ├── SpectacleSmallerWindowCalculation.js
│   │       ├── SpectacleTopHalfWindowCalculation.js
│   │       ├── SpectacleUpperLeftWindowCalculation.js
│   │       ├── SpectacleUpperRightWindowCalculation.js
│   │       ├── SpectacleWindowCalculationHelpers.js
│   │       └── SpectacleWindowSizeAdjuster.js
│   ├── Sources/
│   │   ├── SpectacleAccessibilityElement.h
│   │   ├── SpectacleAccessibilityElement.m
│   │   ├── SpectacleAppDelegate.h
│   │   ├── SpectacleAppDelegate.m
│   │   ├── SpectacleBestEffortWindowMover.h
│   │   ├── SpectacleBestEffortWindowMover.m
│   │   ├── SpectacleDefaultShortcutHelpers.h
│   │   ├── SpectacleDefaultShortcutHelpers.m
│   │   ├── SpectacleHistory.h
│   │   ├── SpectacleHistory.m
│   │   ├── SpectacleHistoryItem.h
│   │   ├── SpectacleHistoryItem.m
│   │   ├── SpectacleJavaScriptEnvironment.h
│   │   ├── SpectacleJavaScriptEnvironment.m
│   │   ├── SpectacleLoginItemHelper.h
│   │   ├── SpectacleLoginItemHelper.m
│   │   ├── SpectacleMacros.h
│   │   ├── SpectacleMigratingShortcutStorage.h
│   │   ├── SpectacleMigratingShortcutStorage.m
│   │   ├── SpectaclePreferencesController.h
│   │   ├── SpectaclePreferencesController.m
│   │   ├── SpectacleQuantizedWindowMover.h
│   │   ├── SpectacleQuantizedWindowMover.m
│   │   ├── SpectacleRegisteredShortcutValidator.h
│   │   ├── SpectacleRegisteredShortcutValidator.m
│   │   ├── SpectacleScreenDetectionResult.h
│   │   ├── SpectacleScreenDetectionResult.m
│   │   ├── SpectacleScreenDetector.h
│   │   ├── SpectacleScreenDetector.m
│   │   ├── SpectacleShortcut.h
│   │   ├── SpectacleShortcut.m
│   │   ├── SpectacleShortcutHolder.h
│   │   ├── SpectacleShortcutHolder.m
│   │   ├── SpectacleShortcutJSONStorage.h
│   │   ├── SpectacleShortcutJSONStorage.m
│   │   ├── SpectacleShortcutKeyBindings.h
│   │   ├── SpectacleShortcutKeyBindings.m
│   │   ├── SpectacleShortcutManager.h
│   │   ├── SpectacleShortcutManager.m
│   │   ├── SpectacleShortcutRecorder.h
│   │   ├── SpectacleShortcutRecorder.m
│   │   ├── SpectacleShortcutRecorderDelegate.h
│   │   ├── SpectacleShortcutStorage.h
│   │   ├── SpectacleShortcutStorageMigrationDestination.h
│   │   ├── SpectacleShortcutTranslations.h
│   │   ├── SpectacleShortcutTranslations.m
│   │   ├── SpectacleShortcutUserDefaultsStorage.h
│   │   ├── SpectacleShortcutUserDefaultsStorage.m
│   │   ├── SpectacleShortcutValidation.h
│   │   ├── SpectacleShortcutValidation.m
│   │   ├── SpectacleShortcutValidator.h
│   │   ├── SpectacleStandardWindowMover.h
│   │   ├── SpectacleStandardWindowMover.m
│   │   ├── SpectacleUtilities.h
│   │   ├── SpectacleUtilities.m
│   │   ├── SpectacleWindowAction.h
│   │   ├── SpectacleWindowAction.m
│   │   ├── SpectacleWindowMover.h
│   │   ├── SpectacleWindowPositionCalculationRegistry.h
│   │   ├── SpectacleWindowPositionCalculationRegistry.m
│   │   ├── SpectacleWindowPositionCalculationResult.h
│   │   ├── SpectacleWindowPositionCalculationResult.m
│   │   ├── SpectacleWindowPositionCalculator.h
│   │   ├── SpectacleWindowPositionCalculator.m
│   │   ├── SpectacleWindowPositionManager.h
│   │   └── SpectacleWindowPositionManager.m
│   └── Supporting Files/
│       ├── Info.plist
│       └── main.m
├── Spectacle.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── IDEWorkspaceChecks.plist
│   └── xcshareddata/
│       └── xcschemes/
│           └── Spectacle.xcscheme
└── SpectacleSpecs/
    ├── Sources/
    │   ├── SpectacleBottomHalfWindowCalculationSpec.m
    │   ├── SpectacleCenterWindowCalculationSpec.m
    │   ├── SpectacleFullscreenWindowCalculationSpec.m
    │   ├── SpectacleLargerWindowCalculationSpec.m
    │   ├── SpectacleLeftHalfWindowCalculationSpec.m
    │   ├── SpectacleLowerLeftWindowCalculationSpec.m
    │   ├── SpectacleLowerRightWindowCalculationSpec.m
    │   ├── SpectacleNextDisplayWindowCalculationSpec.m
    │   ├── SpectacleNextThirdWindowCalculationSpec.m
    │   ├── SpectaclePreviousDisplayWindowCalculationSpec.m
    │   ├── SpectaclePreviousThirdWindowCalculationSpec.m
    │   ├── SpectacleRightHalfWindowCalculationSpec.m
    │   ├── SpectacleShortcutKeyBindingsSpec.m
    │   ├── SpectacleShortcutSpec.m
    │   ├── SpectacleShortcutTranslationsSpec.m
    │   ├── SpectacleSmallerWindowCalculationSpec.m
    │   ├── SpectacleTopHalfWindowCalculationSpec.m
    │   ├── SpectacleUpperLeftWindowCalculationSpec.m
    │   ├── SpectacleUpperRightWindowCalculationSpec.m
    │   └── SpectacleWindowPositionManagerSpec.m
    └── Supporting Files/
        └── Info.plist
Download .txt
SYMBOL INDEX (2 symbols across 2 files)

FILE: Spectacle/Sources/SpectacleWindowAction.h
  type NSString (line 3) | typedef NSString SpectacleWindowAction;

FILE: Spectacle/Sources/SpectacleWindowPositionCalculationRegistry.h
  type CGRect (line 8) | typedef CGRect *(^SpectacleWindowPositionCalculation)(CGRect windowRect,
Condensed preview — 159 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (570K chars).
[
  {
    "path": ".gitignore",
    "chars": 249,
    "preview": "# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!defau"
  },
  {
    "path": ".travis.yml",
    "chars": 330,
    "preview": "osx_image: xcode8.2\nlanguage: objective-c\nxcode_project: Spectacle.xcodeproj\nxcode_scheme: Spectacle\n\nbefore_install:\n  "
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2010,
    "preview": "# Contributing\n\nContributions come in many forms. Creating an issue that documents a previously unreported defect is jus"
  },
  {
    "path": "Cartfile",
    "chars": 172,
    "preview": "github \"hamcrest/OCHamcrest\" ~> 7.1\ngithub \"jonreid/OCMockito\" ~> 5.1\ngithub \"sparkle-project/Sparkle\" ~> 1.22\ngithub \"s"
  },
  {
    "path": "Cartfile.resolved",
    "chars": 181,
    "preview": "github \"hamcrest/OCHamcrest\" \"v7.1.2\"\ngithub \"jonreid/OCMockito\" \"v5.1.2\"\ngithub \"sparkle-project/Sparkle\" \"1.22.0\"\ngith"
  },
  {
    "path": "LICENSE.md",
    "chars": 1188,
    "preview": "# License\n\n## Spectacle is distributed under the MIT License:\n\nCopyright (c) 2017 Eric Czarny <eczarny@gmail.com>\n\nPermi"
  },
  {
    "path": "README.md",
    "chars": 7588,
    "preview": "# Spectacle\n\n[![Build Status](https://travis-ci.org/eczarny/spectacle.svg?branch=master)](https://travis-ci.org/eczarny/"
  },
  {
    "path": "Spectacle/Resources/Certificates/dsa_public.pem",
    "chars": 1178,
    "preview": "-----BEGIN PUBLIC KEY-----\nMIIDOjCCAi0GByqGSM44BAEwggIgAoIBAQCY2D8N/yE2yx4+fpl4m4M2FzaBOcY8\nB/bFN3bExJcapUAn0IpTvUDO0SZC"
  },
  {
    "path": "Spectacle/Resources/Images.xcassets/10.9 Crash Fix.imageset/Contents.json",
    "chars": 9816,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Spectacle-1.png\",\n      \"language-direction\" : \""
  },
  {
    "path": "Spectacle/Resources/Images.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Spectacle/Resources/Images.xcassets/Security & Privacy.imageset/Contents.json",
    "chars": 288,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Security & Privacy.png\"\n    },\n "
  },
  {
    "path": "Spectacle/Resources/Images.xcassets/Spectacle Status Item.imageset/Contents.json",
    "chars": 294,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Spectacle Status Item.png\"\n    }"
  },
  {
    "path": "Spectacle/Resources/Images.xcassets/Spectacle.appiconset/Contents.json",
    "chars": 1315,
    "preview": "{\n  \"images\" : [\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Spectacle 16.png\",\n      \"scal"
  },
  {
    "path": "Spectacle/Resources/Localizations/Base.lproj/Spectacle.xib",
    "chars": 18099,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3"
  },
  {
    "path": "Spectacle/Resources/Localizations/Base.lproj/SpectaclePreferencesWindow.xib",
    "chars": 39935,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "Spectacle/Resources/Localizations/en.lproj/Credits.rtf",
    "chars": 992,
    "preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1348\\cocoasubrtf170\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green25"
  },
  {
    "path": "Spectacle/Resources/Localizations/es.lproj/Credits.rtf",
    "chars": 1229,
    "preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf470\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green25"
  },
  {
    "path": "Spectacle/Resources/Localizations/es.lproj/Spectacle.strings",
    "chars": 3905,
    "preview": "\n/* Class = \"NSMenuItem\"; title = \"Redo\"; ObjectID = \"187-7k-0Ct\"; */\n\"187-7k-0Ct.title\" = \"Rehacer\";\n\n/* Class = \"NSMen"
  },
  {
    "path": "Spectacle/Resources/Localizations/es.lproj/SpectaclePreferencesWindow.strings",
    "chars": 4021,
    "preview": "\n/* Class = \"NSTextFieldCell\"; title = \"Make Larger:\"; ObjectID = \"0f9-kj-bro\"; */\n\"0f9-kj-bro.title\" = \"Hacer más grand"
  },
  {
    "path": "Spectacle/Resources/Localizations/fi.lproj/Credits.rtf",
    "chars": 1204,
    "preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf420\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green25"
  },
  {
    "path": "Spectacle/Resources/Localizations/fi.lproj/Spectacle.strings",
    "chars": 3794,
    "preview": "\n/* Class = \"NSMenuItem\"; title = \"Redo\"; ObjectID = \"187-7k-0Ct\"; */\n\"187-7k-0Ct.title\" = \"Tee uudelleen\";\n\n/* Class = "
  },
  {
    "path": "Spectacle/Resources/Localizations/fi.lproj/SpectaclePreferencesWindow.strings",
    "chars": 3930,
    "preview": "\n/* Class = \"NSTextFieldCell\"; title = \"Make Larger:\"; ObjectID = \"0f9-kj-bro\"; */\n\"0f9-kj-bro.title\" = \"Suurenna:\";\n\n/*"
  },
  {
    "path": "Spectacle/Resources/Localizations/fr.lproj/Credits.rtf",
    "chars": 1114,
    "preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1348\\cocoasubrtf170\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green25"
  },
  {
    "path": "Spectacle/Resources/Localizations/fr.lproj/Spectacle.strings",
    "chars": 3852,
    "preview": "\n/* Class = \"NSMenuItem\"; title = \"Redo\"; ObjectID = \"187-7k-0Ct\"; */\n\"187-7k-0Ct.title\" = \"Rétablir\";\n\n/* Class = \"NSMe"
  },
  {
    "path": "Spectacle/Resources/Localizations/fr.lproj/SpectaclePreferencesWindow.strings",
    "chars": 3974,
    "preview": "\n/* Class = \"NSTextFieldCell\"; title = \"Make Larger:\"; ObjectID = \"0f9-kj-bro\"; */\n\"0f9-kj-bro.title\" = \"Agrandir:\";\n\n/*"
  },
  {
    "path": "Spectacle/Resources/Localizations/it.lproj/Credits.rtf",
    "chars": 1124,
    "preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1348\\cocoasubrtf170\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green25"
  },
  {
    "path": "Spectacle/Resources/Localizations/it.lproj/Spectacle.strings",
    "chars": 3868,
    "preview": "\n/* Class = \"NSMenuItem\"; title = \"Redo\"; ObjectID = \"187-7k-0Ct\"; */\n\"187-7k-0Ct.title\" = \"Ripristina\";\n\n/* Class = \"NS"
  },
  {
    "path": "Spectacle/Resources/Localizations/it.lproj/SpectaclePreferencesWindow.strings",
    "chars": 3988,
    "preview": "\n/* Class = \"NSTextFieldCell\"; title = \"Make Larger:\"; ObjectID = \"0f9-kj-bro\"; */\n\"0f9-kj-bro.title\" = \"Ingrandisci:\";\n"
  },
  {
    "path": "Spectacle/Resources/Localizations/pt.lproj/Credits.rtf",
    "chars": 1200,
    "preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1348\\cocoasubrtf170\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green25"
  },
  {
    "path": "Spectacle/Resources/Localizations/pt.lproj/Spectacle.strings",
    "chars": 3856,
    "preview": "\n/* Class = \"NSMenuItem\"; title = \"Redo\"; ObjectID = \"187-7k-0Ct\"; */\n\"187-7k-0Ct.title\" = \"Refazer\";\n\n/* Class = \"NSMen"
  },
  {
    "path": "Spectacle/Resources/Localizations/pt.lproj/SpectaclePreferencesWindow.strings",
    "chars": 3972,
    "preview": "\n/* Class = \"NSTextFieldCell\"; title = \"Make Larger:\"; ObjectID = \"0f9-kj-bro\"; */\n\"0f9-kj-bro.title\" = \"Aumentar:\";\n\n/*"
  },
  {
    "path": "Spectacle/Resources/Property Lists/Defaults.plist",
    "chars": 553,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleBottomHalfWindowCalculation.js",
    "chars": 1088,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleCenterWindowCalculation.js",
    "chars": 971,
    "preview": "var SpectacleCenterWindowCalculation = (function () {\n    var centerWindowRectInVisibleFrameOfScreen = function(windowRe"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleFullscreenWindowCalculation.js",
    "chars": 246,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleLargerWindowCalculation.js",
    "chars": 306,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleLeftHalfWindowCalculation.js",
    "chars": 1079,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleLowerLeftWindowCalculation.js",
    "chars": 1207,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleLowerRightWindowCalculation.js",
    "chars": 1502,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleNextDisplayWindowCalculation.js",
    "chars": 343,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleNextOrPreviousDisplay.js",
    "chars": 584,
    "preview": "var SpectacleNextOrPreviousDisplay = (function () {\n    var moveWindowRectToDisplay = function(windowRect, visibleFrameO"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleNextOrPreviousThirds.js",
    "chars": 2318,
    "preview": "var SpectacleNextOrPreviousThirds = (function () {\n    var findNextThird = function(windowRect, visibleFrameOfDestinatio"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleNextThirdWindowCalculation.js",
    "chars": 302,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectaclePreviousDisplayWindowCalculation.js",
    "chars": 347,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectaclePreviousThirdWindowCalculation.js",
    "chars": 310,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleRightHalfWindowCalculation.js",
    "chars": 1368,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleSmallerWindowCalculation.js",
    "chars": 308,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleTopHalfWindowCalculation.js",
    "chars": 1427,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleUpperLeftWindowCalculation.js",
    "chars": 1373,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleUpperRightWindowCalculation.js",
    "chars": 1668,
    "preview": "windowPositionCalculationRegistry.registerWindowPositionCalculationWithAction(function (windowRect, visibleFrameOfSource"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleWindowCalculationHelpers.js",
    "chars": 852,
    "preview": "var SpectacleCalculationHelpers = (function () {\n    var copyRect = function(rect) {\n        return {\n            x: rec"
  },
  {
    "path": "Spectacle/Resources/Window Position Calculations/SpectacleWindowSizeAdjuster.js",
    "chars": 5679,
    "preview": "var SpectacleWindowSizeAdjuster = (function () {\n    var resizeWindowRect = function(windowRect, visibleFrameOfDestinati"
  },
  {
    "path": "Spectacle/Sources/SpectacleAccessibilityElement.h",
    "chars": 698,
    "preview": "#import <Carbon/Carbon.h>\n\n@interface SpectacleAccessibilityElement : NSObject\n\n+ (SpectacleAccessibilityElement *)front"
  },
  {
    "path": "Spectacle/Sources/SpectacleAccessibilityElement.m",
    "chars": 5433,
    "preview": "#import \"SpectacleAccessibilityElement.h\"\n\n#import <AppKit/AppKit.h>\n\n@implementation SpectacleAccessibilityElement\n{\n  "
  },
  {
    "path": "Spectacle/Sources/SpectacleAppDelegate.h",
    "chars": 3154,
    "preview": "#import <Cocoa/Cocoa.h>\n\n@class SpectaclePreferencesController;\n\n@interface SpectacleAppDelegate : NSObject <NSApplicati"
  },
  {
    "path": "Spectacle/Sources/SpectacleAppDelegate.m",
    "chars": 18924,
    "preview": "#import \"SpectacleAppDelegate.h\"\n\n#import <Sparkle/Sparkle.h>\n\n#import \"SpectacleAccessibilityElement.h\"\n#import \"Specta"
  },
  {
    "path": "Spectacle/Sources/SpectacleBestEffortWindowMover.h",
    "chars": 263,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleWindowMover.h\"\n\n@interface SpectacleBestEffortWindowMover : NSObjec"
  },
  {
    "path": "Spectacle/Sources/SpectacleBestEffortWindowMover.m",
    "chars": 2609,
    "preview": "#import \"SpectacleBestEffortWindowMover.h\"\n\n#import \"SpectacleAccessibilityElement.h\"\n#import \"SpectacleWindowPositionMa"
  },
  {
    "path": "Spectacle/Sources/SpectacleDefaultShortcutHelpers.h",
    "chars": 165,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleShortcut.h\"\n\nNSArray<SpectacleShortcut *> *SpectacleDefaultShortcut"
  },
  {
    "path": "Spectacle/Sources/SpectacleDefaultShortcutHelpers.m",
    "chars": 2850,
    "preview": "#import \"SpectacleDefaultShortcutHelpers.h\"\n\n#import <Carbon/Carbon.h>\n#import <Cocoa/Cocoa.h>\n\nstatic NSArray<Spectacle"
  },
  {
    "path": "Spectacle/Sources/SpectacleHistory.h",
    "chars": 280,
    "preview": "#import <Foundation/Foundation.h>\n\n@class SpectacleHistoryItem;\n\n@interface SpectacleHistory : NSObject\n\n- (void)addHist"
  },
  {
    "path": "Spectacle/Sources/SpectacleHistory.m",
    "chars": 1369,
    "preview": "#import \"SpectacleHistory.h\"\n\n#import \"SpectacleHistoryItem.h\"\n\n@implementation SpectacleHistory\n{\n  SpectacleHistoryIte"
  },
  {
    "path": "Spectacle/Sources/SpectacleHistoryItem.h",
    "chars": 851,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n\n@class SpectacleAccessibilityElement;\n\n@interface Specta"
  },
  {
    "path": "Spectacle/Sources/SpectacleHistoryItem.m",
    "chars": 654,
    "preview": "#import \"SpectacleHistoryItem.h\"\n\n@implementation SpectacleHistoryItem\n\n- (instancetype)initWithAccessibilityElement:(Sp"
  },
  {
    "path": "Spectacle/Sources/SpectacleJavaScriptEnvironment.h",
    "chars": 389,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n\n@class JSContext;\n@class JSValue;\n@class SpectacleWindow"
  },
  {
    "path": "Spectacle/Sources/SpectacleJavaScriptEnvironment.m",
    "chars": 1295,
    "preview": "#import \"SpectacleJavaScriptEnvironment.h\"\n\n#import <JavaScriptCore/JavaScriptCore.h>\n\n@implementation SpectacleJavaScri"
  },
  {
    "path": "Spectacle/Sources/SpectacleLoginItemHelper.h",
    "chars": 253,
    "preview": "#import <Foundation/Foundation.h>\n\n@interface SpectacleLoginItemHelper : NSObject\n\n+ (BOOL)isLoginItemEnabledForBundle:("
  },
  {
    "path": "Spectacle/Sources/SpectacleLoginItemHelper.m",
    "chars": 3410,
    "preview": "#import \"SpectacleLoginItemHelper.h\"\n\n@implementation SpectacleLoginItemHelper\n\n+ (BOOL)isLoginItemEnabledForBundle:(NSB"
  },
  {
    "path": "Spectacle/Sources/SpectacleMacros.h",
    "chars": 222,
    "preview": "#pragma once\n\n#ifndef SPECTACLE_INIT_AND_NEW_UNAVAILABLE\n#define SPECTACLE_INIT_AND_NEW_UNAVAILABLE \\\n- (instancetype)in"
  },
  {
    "path": "Spectacle/Sources/SpectacleMigratingShortcutStorage.h",
    "chars": 508,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n#import \"SpectacleShortcutStorage.h\"\n\n@protocol Spectacle"
  },
  {
    "path": "Spectacle/Sources/SpectacleMigratingShortcutStorage.m",
    "chars": 1004,
    "preview": "#import \"SpectacleMigratingShortcutStorage.h\"\n\n#import \"SpectacleShortcutStorageMigrationDestination.h\"\n\n@implementation"
  },
  {
    "path": "Spectacle/Sources/SpectaclePreferencesController.h",
    "chars": 2926,
    "preview": "#import <Cocoa/Cocoa.h>\n\n#import \"SpectacleShortcutRecorderDelegate.h\"\n\n@class SpectacleAppDelegate;\n@class SpectacleSho"
  },
  {
    "path": "Spectacle/Sources/SpectaclePreferencesController.m",
    "chars": 8411,
    "preview": "#import \"SpectaclePreferencesController.h\"\n\n#import <QuartzCore/QuartzCore.h>\n\n#import \"SpectacleAccessibilityElement.h\""
  },
  {
    "path": "Spectacle/Sources/SpectacleQuantizedWindowMover.h",
    "chars": 262,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleWindowMover.h\"\n\n@interface SpectacleQuantizedWindowMover : NSObject"
  },
  {
    "path": "Spectacle/Sources/SpectacleQuantizedWindowMover.m",
    "chars": 2235,
    "preview": "#import \"SpectacleQuantizedWindowMover.h\"\n\n#import \"SpectacleAccessibilityElement.h\"\n\n@implementation SpectacleQuantized"
  },
  {
    "path": "Spectacle/Sources/SpectacleRegisteredShortcutValidator.h",
    "chars": 168,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleShortcutValidator.h\"\n\n@interface SpectacleRegisteredShortcutValidat"
  },
  {
    "path": "Spectacle/Sources/SpectacleRegisteredShortcutValidator.m",
    "chars": 322,
    "preview": "#import \"SpectacleRegisteredShortcutValidator.h\"\n\n#import \"SpectacleShortcutManager.h\"\n\n@implementation SpectacleRegiste"
  },
  {
    "path": "Spectacle/Sources/SpectacleScreenDetectionResult.h",
    "chars": 603,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n\n@class NSScreen;\n\n@interface SpectacleScreenDetectionRes"
  },
  {
    "path": "Spectacle/Sources/SpectacleScreenDetectionResult.m",
    "chars": 711,
    "preview": "#import \"SpectacleScreenDetectionResult.h\"\n\n@implementation SpectacleScreenDetectionResult\n\n@synthesize sourceScreen = _"
  },
  {
    "path": "Spectacle/Sources/SpectacleScreenDetector.h",
    "chars": 546,
    "preview": "#import <Cocoa/Cocoa.h>\n\n#import \"SpectacleWindowAction.h\"\n\n@class SpectacleAccessibilityElement;\n@class SpectacleScreen"
  },
  {
    "path": "Spectacle/Sources/SpectacleScreenDetector.m",
    "chars": 4951,
    "preview": "#import \"SpectacleScreenDetector.h\"\n\n#import \"SpectacleAccessibilityElement.h\"\n#import \"SpectacleScreenDetectionResult.h"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcut.h",
    "chars": 1880,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n#import \"SpectacleWindowAction.h\"\n\n@class SpectacleShortc"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcut.m",
    "chars": 6179,
    "preview": "#import \"SpectacleShortcut.h\"\n\n#import <Cocoa/Cocoa.h>\n\n#import \"SpectacleShortcutKeyBindings.h\"\n#import \"SpectacleShort"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutHolder.h",
    "chars": 954,
    "preview": "#import <Carbon/Carbon.h>\n\n#import \"SpectacleMacros.h\"\n\n@class SpectacleShortcut;\n\n@interface SpectacleShortcutHolder : "
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutHolder.m",
    "chars": 1926,
    "preview": "#import \"SpectacleShortcutHolder.h\"\n\n#import \"SpectacleShortcut.h\"\n\n@implementation SpectacleShortcutHolder\n\n- (instance"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutJSONStorage.h",
    "chars": 196,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleShortcutStorageMigrationDestination.h\"\n\n@interface SpectacleShortcu"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutJSONStorage.m",
    "chars": 4424,
    "preview": "#import \"SpectacleShortcutJSONStorage.h\"\n\n@implementation SpectacleShortcutJSONStorage\n\n- (NSArray<SpectacleShortcut *> "
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutKeyBindings.h",
    "chars": 296,
    "preview": "#import <Foundation/Foundation.h>\n\n@class SpectacleShortcut;\n\nNSNumber *SpectacleConvertShortcutKeyBindingToKeyCode(NSSt"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutKeyBindings.m",
    "chars": 12891,
    "preview": "#import \"SpectacleShortcutKeyBindings.h\"\n\n#import <Carbon/Carbon.h>\n\n#import \"SpectacleShortcut.h\"\n#import \"SpectacleSho"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutManager.h",
    "chars": 809,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n\n@class SpectacleShortcut;\n\n@protocol SpectacleShortcutSt"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutManager.m",
    "chars": 7687,
    "preview": "#import \"SpectacleShortcutManager.h\"\n\n#import <Carbon/Carbon.h>\n\n#import \"SpectacleShortcutHolder.h\"\n#import \"SpectacleS"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutRecorder.h",
    "chars": 453,
    "preview": "#import <Cocoa/Cocoa.h>\n\n@class SpectacleShortcut;\n@class SpectacleShortcutValidation;\n\n@protocol SpectacleShortcutRecor"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutRecorder.m",
    "chars": 13909,
    "preview": "#import \"SpectacleShortcutRecorder.h\"\n\n#import <Carbon/Carbon.h>\n\n#import \"SpectacleShortcut.h\"\n#import \"SpectacleShortc"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutRecorderDelegate.h",
    "chars": 413,
    "preview": "#import <Foundation/Foundation.h>\n\n@class SpectacleShortcut;\n@class SpectacleShortcutRecorder;\n\n@protocol SpectacleShort"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutStorage.h",
    "chars": 277,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleShortcut.h\"\n\n@protocol SpectacleShortcutStorage <NSObject>\n\n- (NSAr"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutStorageMigrationDestination.h",
    "chars": 250,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleShortcutStorage.h\"\n\n@protocol SpectacleShortcutStorageMigrationDest"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutTranslations.h",
    "chars": 550,
    "preview": "#import <Foundation/Foundation.h>\n\n@class SpectacleShortcut;\n\nNSString *SpectacleTranslateKeyCode(NSInteger keyCode);\nNS"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutTranslations.m",
    "chars": 10472,
    "preview": "#import \"SpectacleShortcutTranslations.h\"\n\n#import <Carbon/Carbon.h>\n#import <Cocoa/Cocoa.h>\n\n#import \"SpectacleShortcut"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutUserDefaultsStorage.h",
    "chars": 164,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleShortcutStorage.h\"\n\n@interface SpectacleShortcutUserDefaultsStorage"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutUserDefaultsStorage.m",
    "chars": 2552,
    "preview": "#import \"SpectacleShortcutUserDefaultsStorage.h\"\n\n@implementation SpectacleShortcutUserDefaultsStorage\n\n+ (void)initiali"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutValidation.h",
    "chars": 541,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n\n@class SpectacleShortcut;\n@class SpectacleShortcutManage"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutValidation.m",
    "chars": 4440,
    "preview": "#import \"SpectacleShortcutValidation.h\"\n\n#import <Carbon/Carbon.h>\n\n#import \"SpectacleShortcut.h\"\n#import \"SpectacleShor"
  },
  {
    "path": "Spectacle/Sources/SpectacleShortcutValidator.h",
    "chars": 265,
    "preview": "#import <Foundation/Foundation.h>\n\n@class SpectacleShortcut;\n@class SpectacleShortcutManager;\n\n@protocol SpectacleShortc"
  },
  {
    "path": "Spectacle/Sources/SpectacleStandardWindowMover.h",
    "chars": 261,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleWindowMover.h\"\n\n@interface SpectacleStandardWindowMover : NSObject "
  },
  {
    "path": "Spectacle/Sources/SpectacleStandardWindowMover.m",
    "chars": 1312,
    "preview": "#import \"SpectacleStandardWindowMover.h\"\n\n#import \"SpectacleAccessibilityElement.h\"\n\n@implementation SpectacleStandardWi"
  },
  {
    "path": "Spectacle/Sources/SpectacleUtilities.h",
    "chars": 407,
    "preview": "#import <Cocoa/Cocoa.h>\n\n@interface SpectacleUtilities : NSObject\n\n+ (NSString *)applicationVersion;\n\n+ (void)registerDe"
  },
  {
    "path": "Spectacle/Sources/SpectacleUtilities.m",
    "chars": 3563,
    "preview": "#import \"SpectacleUtilities.h\"\n\n@implementation SpectacleUtilities\n\n+ (NSString *)applicationVersion\n{\n  NSBundle *mainB"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowAction.h",
    "chars": 1733,
    "preview": "#import <Foundation/Foundation.h>\n\ntypedef NSString SpectacleWindowAction;\n\nextern SpectacleWindowAction *const kSpectac"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowAction.m",
    "chars": 2620,
    "preview": "#import \"SpectacleWindowAction.h\"\n\nSpectacleWindowAction *const kSpectacleWindowActionUndo = @\"SpectacleWindowActionUndo"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowMover.h",
    "chars": 603,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleWindowAction.h\"\n\n@class SpectacleAccessibilityElement;\n\n@protocol S"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowPositionCalculationRegistry.h",
    "chars": 815,
    "preview": "#import <Foundation/Foundation.h>\n#import <JavaScriptCore/JavaScriptCore.h>\n\n#import \"SpectacleWindowAction.h\"\n\n@class S"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowPositionCalculationRegistry.m",
    "chars": 931,
    "preview": "#import \"SpectacleWindowPositionCalculationRegistry.h\"\n\n#import \"SpectacleJavaScriptEnvironment.h\"\n#import \"SpectacleWin"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowPositionCalculationResult.h",
    "chars": 552,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n#import \"SpectacleWindowAction.h\"\n\n@interface SpectacleWi"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowPositionCalculationResult.m",
    "chars": 589,
    "preview": "#import \"SpectacleWindowPositionCalculationResult.h\"\n\n@implementation SpectacleWindowPositionCalculationResult\n\n@synthes"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowPositionCalculator.h",
    "chars": 744,
    "preview": "#import <Foundation/Foundation.h>\n\n#import \"SpectacleMacros.h\"\n#import \"SpectacleWindowAction.h\"\n\n@class SpectacleWindow"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowPositionCalculator.m",
    "chars": 3271,
    "preview": "#import \"SpectacleWindowPositionCalculator.h\"\n\n#import <JavaScriptCore/JavaScriptCore.h>\n\n#import \"SpectacleJavaScriptEn"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowPositionManager.h",
    "chars": 1601,
    "preview": "#import <Cocoa/Cocoa.h>\n\n#import \"SpectacleMacros.h\"\n#import \"SpectacleWindowAction.h\"\n\ntypedef void (^SpectacleFailureF"
  },
  {
    "path": "Spectacle/Sources/SpectacleWindowPositionManager.m",
    "chars": 9482,
    "preview": "#import \"SpectacleWindowPositionManager.h\"\n\n#import \"SpectacleAccessibilityElement.h\"\n#import \"SpectacleBestEffortWindow"
  },
  {
    "path": "Spectacle/Supporting Files/Info.plist",
    "chars": 1254,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Spectacle/Supporting Files/main.m",
    "chars": 117,
    "preview": "#import <Cocoa/Cocoa.h>\n\nint main(int argc, char *argv[])\n{\n  return NSApplicationMain(argc, (const char **)argv);\n}\n"
  },
  {
    "path": "Spectacle.xcodeproj/project.pbxproj",
    "chars": 80122,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 47;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "Spectacle.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 154,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Spectacle.xcode"
  },
  {
    "path": "Spectacle.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Spectacle.xcodeproj/xcshareddata/xcschemes/Spectacle.xcscheme",
    "chars": 4248,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1120\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleBottomHalfWindowCalculationSpec.m",
    "chars": 2717,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleCenterWindowCalculationSpec.m",
    "chars": 1282,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleFullscreenWindowCalculationSpec.m",
    "chars": 1293,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleLargerWindowCalculationSpec.m",
    "chars": 18354,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleLeftHalfWindowCalculationSpec.m",
    "chars": 2696,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleLowerLeftWindowCalculationSpec.m",
    "chars": 1317,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleLowerRightWindowCalculationSpec.m",
    "chars": 1324,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleNextDisplayWindowCalculationSpec.m",
    "chars": 1321,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleNextThirdWindowCalculationSpec.m",
    "chars": 4888,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectaclePreviousDisplayWindowCalculationSpec.m",
    "chars": 1337,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectaclePreviousThirdWindowCalculationSpec.m",
    "chars": 4918,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleRightHalfWindowCalculationSpec.m",
    "chars": 2714,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleShortcutKeyBindingsSpec.m",
    "chars": 26060,
    "preview": "#import <Carbon/Carbon.h>\n#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleShortcut.h\"\n#import \""
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleShortcutSpec.m",
    "chars": 5255,
    "preview": "#import <Carbon/Carbon.h>\n#import <Cocoa/Cocoa.h>\n#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"Specta"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleShortcutTranslationsSpec.m",
    "chars": 12742,
    "preview": "#import <Carbon/Carbon.h>\n#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleShortcut.h\"\n#import \""
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleSmallerWindowCalculationSpec.m",
    "chars": 20010,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleTopHalfWindowCalculationSpec.m",
    "chars": 2703,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleUpperLeftWindowCalculationSpec.m",
    "chars": 2727,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleUpperRightWindowCalculationSpec.m",
    "chars": 2768,
    "preview": "#import <Expecta/Expecta.h>\n#import <Specta/Specta.h>\n\n#import \"SpectacleWindowPositionCalculationResult.h\"\n#import \"Spe"
  },
  {
    "path": "SpectacleSpecs/Sources/SpectacleWindowPositionManagerSpec.m",
    "chars": 11524,
    "preview": "#import <Expecta/Expecta.h>\n#import <OCHamcrest/OCHamcrest.h>\n#import <OCMockito/OCMockito.h>\n#import <Specta/Specta.h>\n"
  },
  {
    "path": "SpectacleSpecs/Supporting Files/Info.plist",
    "chars": 733,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  }
]

// ... and 14 more files (download for full content)

About this extraction

This page contains the full source code of the eczarny/spectacle GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 159 files (520.4 KB), approximately 141.5k tokens, and a symbol index with 2 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!