├── .bundle └── config ├── Gemfile ├── Screenshot └── Screenshot.png ├── Resources └── AppleReserver.sketch ├── Podfile ├── AppleReserver ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── mac-16x16@1x.png │ │ ├── mac-16x16@2x.png │ │ ├── mac-32x32@1x.png │ │ ├── mac-32x32@2x.png │ │ ├── mac-128x128@1x.png │ │ ├── mac-128x128@2x.png │ │ ├── mac-256x256@1x.png │ │ ├── mac-256x256@2x.png │ │ ├── mac-512x512@1x.png │ │ ├── mac-512x512@2x.png │ │ └── Contents.json ├── Device.swift ├── Constant.swift ├── MainWindowController.swift ├── Availability.swift ├── Store.swift ├── AppDelegate.swift ├── Product.swift ├── Info.plist ├── MainViewController.swift ├── Products.json └── Base.lproj │ └── Main.storyboard ├── AppleReserver.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── project.pbxproj ├── Podfile.lock ├── .travis.yml ├── README.md ├── LICENSE ├── Gemfile.lock └── .gitignore /.bundle/config: -------------------------------------------------------------------------------- 1 | --- 2 | BUNDLE_PATH: "Gems" 3 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source 'https://rubygems.org' 4 | 5 | gem 'cocoapods' 6 | -------------------------------------------------------------------------------- /Screenshot/Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/Screenshot/Screenshot.png -------------------------------------------------------------------------------- /Resources/AppleReserver.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/Resources/AppleReserver.sketch -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :osx, '10.11' 2 | 3 | target 'AppleReserver' do 4 | use_frameworks! 5 | pod 'Alamofire' 6 | end 7 | -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-16x16@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-16x16@1x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-16x16@2x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-32x32@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-32x32@1x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-32x32@2x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-128x128@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-128x128@1x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-128x128@2x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-256x256@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-256x256@1x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-256x256@2x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-512x512@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-512x512@1x.png -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Channe/AppleReserver/HEAD/AppleReserver/Assets.xcassets/AppIcon.appiconset/mac-512x512@2x.png -------------------------------------------------------------------------------- /AppleReserver.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /AppleReserver/Device.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Device.swift 3 | // AppleReserver 4 | // 5 | // Created by Sunnyyoung on 2017/9/19. 6 | // Copyright © 2017年 Sunnyyoung. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Device: Codable { 12 | let partNumber: String 13 | let description: String 14 | } 15 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (4.9.1) 3 | 4 | DEPENDENCIES: 5 | - Alamofire 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - Alamofire 10 | 11 | SPEC CHECKSUMS: 12 | Alamofire: 85e8a02c69d6020a0d734f6054870d7ecb75cf18 13 | 14 | PODFILE CHECKSUM: 14519dd0495351e3d80bfac4f73f2029dd98fb96 15 | 16 | COCOAPODS: 1.10.0 17 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: swift 2 | osx_image: xcode9 3 | xcode_workspace: AppleReserver.xcworkspace 4 | xcode_scheme: AppleReserver 5 | before_install: 6 | - gem install cocoapods 7 | - pod repo update --silent 8 | script: xcodebuild -workspace AppleReserver.xcworkspace -scheme AppleReserver CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO 9 | -------------------------------------------------------------------------------- /AppleReserver/Constant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constant.swift 3 | // AppleReserver 4 | // 5 | // Created by Sunnyyoung on 2017/9/19. 6 | // Copyright © 2017年 Sunnyyoung. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct AppleURL { 12 | static let stores = URL(string: "https://reserve-prime.apple.com/CN/zh_CN/reserve/A/stores.json")! 13 | static let availability = URL(string: "https://reserve-prime.apple.com/CN/zh_CN/reserve/A/availability.json")! 14 | } 15 | -------------------------------------------------------------------------------- /AppleReserver/MainWindowController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainWindowController.swift 3 | // AppleReserver 4 | // 5 | // Created by Sunnyyoung on 2017/9/19. 6 | // Copyright © 2017年 Sunnyyoung. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class MainWindowController: NSWindowController { 12 | 13 | override func windowDidLoad() { 14 | super.windowDidLoad() 15 | self.window?.titleVisibility = .hidden 16 | self.window?.titlebarAppearsTransparent = true 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AppleReserver 2 | 3 | ![License MIT](https://img.shields.io/github/license/mashape/apistatus.svg) 4 | ![Platform info](https://img.shields.io/badge/platform-macOS-lightgrey.svg) 5 | [![Build Status](https://travis-ci.org/Sunnyyoung/AppleReserver.svg?branch=master)](https://travis-ci.org/Sunnyyoung/AppleReserver) 6 | 7 | Apple官方预约监控助手,支持 iPhone 13 系列 8 | 9 | ## Screenshot 10 | 11 | ![](Screenshot/Screenshot.png) 12 | 13 | ## Dependency 14 | 15 | - [Alamofire](https://github.com/Alamofire/Alamofire) 16 | 17 | ## License 18 | 19 | The [MIT License](LICENSE). 20 | -------------------------------------------------------------------------------- /AppleReserver/Availability.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Availability.swift 3 | // AppleReserver 4 | // 5 | // Created by Sunnyyoung on 2017/9/19. 6 | // Copyright © 2017年 Sunnyyoung. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Availability: Codable { 12 | let partNumber: String 13 | let contract: Bool 14 | let unlocked: Bool 15 | 16 | init(key: String, value: [String: [String: Bool]]) { 17 | self.partNumber = key 18 | self.contract = value["availability"]?["contract"] ?? false 19 | self.unlocked = value["availability"]?["unlocked"] ?? false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /AppleReserver/Store.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Store.swift 3 | // AppleReserver 4 | // 5 | // Created by Sunnyyoung on 2017/9/19. 6 | // Copyright © 2017年 Sunnyyoung. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /** 12 | { 13 | "storeNumber": "R320", 14 | "city": "北京", 15 | "latitude": "39.933456", 16 | "storeName": "三里屯", 17 | "enabled": true, 18 | "longitude": "116.447967" 19 | } 20 | */ 21 | struct Store: Codable { 22 | let storeNumber: String? 23 | let storeName: String? 24 | let city: String? 25 | let latitude: String? 26 | let longitude: String? 27 | let enabled: Bool 28 | } 29 | -------------------------------------------------------------------------------- /AppleReserver/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // AppleReserver 4 | // 5 | // Created by Sunnyyoung on 2017/9/19. 6 | // Copyright © 2017年 Sunnyyoung. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { 15 | let window = sender.windows.first 16 | if flag { 17 | window?.orderFront(sender) 18 | } else { 19 | window?.makeKeyAndOrderFront(sender) 20 | } 21 | return true 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /AppleReserver/Product.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Product.swift 3 | // AppleReserver 4 | // 5 | // Created by Sunnyyoung on 2017/9/19. 6 | // Copyright © 2017年 Sunnyyoung. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /** 12 | https://www.apple.com.cn/shop/product-locator-meta?family=iphone13 13 | 14 | { 15 | "productTitle": "iPhone 13 256GB 粉色", 16 | "basePartNumber": "MLE23", 17 | "image": "iphone-13-pink-select-2021", 18 | "dimensionCapacity": "256gb", 19 | "dimensionScreensize": "6_1inch", 20 | "price": "6799_00_unlocked", 21 | "partNumber": "MLE23CH/A", 22 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE23CH/A", 23 | "dimensionColor": "pink" 24 | } 25 | */ 26 | struct Product: Codable { 27 | let productTitle: String 28 | let basePartNumber: String 29 | let image: String 30 | let dimensionCapacity: String 31 | let dimensionScreensize: String 32 | let price: String 33 | let partNumber: String 34 | let productLink: String 35 | let dimensionColor: String 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Sunnyyoung 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /AppleReserver/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 4.0 21 | CFBundleVersion 22 | 10 23 | LSApplicationCategoryType 24 | public.app-category.utilities 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2017年 Sunnyyoung. All rights reserved. 29 | NSMainStoryboardFile 30 | Main 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /AppleReserver/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "mac-16x16@1x.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "mac-16x16@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "mac-32x32@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "mac-32x32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "mac-128x128@1x.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "mac-128x128@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "mac-256x256@1x.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "mac-256x256@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "mac-512x512@1x.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "mac-512x512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | CFPropertyList (3.0.2) 5 | activesupport (5.2.4.4) 6 | concurrent-ruby (~> 1.0, >= 1.0.2) 7 | i18n (>= 0.7, < 2) 8 | minitest (~> 5.1) 9 | tzinfo (~> 1.1) 10 | addressable (2.8.0) 11 | public_suffix (>= 2.0.2, < 5.0) 12 | algoliasearch (1.27.4) 13 | httpclient (~> 2.8, >= 2.8.3) 14 | json (>= 1.5.1) 15 | atomos (0.1.3) 16 | claide (1.0.3) 17 | cocoapods (1.10.0) 18 | addressable (~> 2.6) 19 | claide (>= 1.0.2, < 2.0) 20 | cocoapods-core (= 1.10.0) 21 | cocoapods-deintegrate (>= 1.0.3, < 2.0) 22 | cocoapods-downloader (>= 1.4.0, < 2.0) 23 | cocoapods-plugins (>= 1.0.0, < 2.0) 24 | cocoapods-search (>= 1.0.0, < 2.0) 25 | cocoapods-trunk (>= 1.4.0, < 2.0) 26 | cocoapods-try (>= 1.1.0, < 2.0) 27 | colored2 (~> 3.1) 28 | escape (~> 0.0.4) 29 | fourflusher (>= 2.3.0, < 3.0) 30 | gh_inspector (~> 1.0) 31 | molinillo (~> 0.6.6) 32 | nap (~> 1.0) 33 | ruby-macho (~> 1.4) 34 | xcodeproj (>= 1.19.0, < 2.0) 35 | cocoapods-core (1.10.0) 36 | activesupport (> 5.0, < 6) 37 | addressable (~> 2.6) 38 | algoliasearch (~> 1.0) 39 | concurrent-ruby (~> 1.1) 40 | fuzzy_match (~> 2.0.4) 41 | nap (~> 1.0) 42 | netrc (~> 0.11) 43 | public_suffix 44 | typhoeus (~> 1.0) 45 | cocoapods-deintegrate (1.0.4) 46 | cocoapods-downloader (1.4.0) 47 | cocoapods-plugins (1.0.0) 48 | nap 49 | cocoapods-search (1.0.0) 50 | cocoapods-trunk (1.5.0) 51 | nap (>= 0.8, < 2.0) 52 | netrc (~> 0.11) 53 | cocoapods-try (1.2.0) 54 | colored2 (3.1.2) 55 | concurrent-ruby (1.1.7) 56 | escape (0.0.4) 57 | ethon (0.12.0) 58 | ffi (>= 1.3.0) 59 | ffi (1.13.1) 60 | fourflusher (2.3.1) 61 | fuzzy_match (2.0.4) 62 | gh_inspector (1.1.3) 63 | httpclient (2.8.3) 64 | i18n (1.8.5) 65 | concurrent-ruby (~> 1.0) 66 | json (2.3.1) 67 | minitest (5.14.2) 68 | molinillo (0.6.6) 69 | nanaimo (0.3.0) 70 | nap (1.1.0) 71 | netrc (0.11.0) 72 | public_suffix (4.0.6) 73 | ruby-macho (1.4.0) 74 | thread_safe (0.3.6) 75 | typhoeus (1.4.0) 76 | ethon (>= 0.9.0) 77 | tzinfo (1.2.7) 78 | thread_safe (~> 0.1) 79 | xcodeproj (1.19.0) 80 | CFPropertyList (>= 2.3.3, < 4.0) 81 | atomos (~> 0.1.3) 82 | claide (>= 1.0.2, < 2.0) 83 | colored2 (~> 3.1) 84 | nanaimo (~> 0.3.0) 85 | 86 | PLATFORMS 87 | ruby 88 | 89 | DEPENDENCIES 90 | cocoapods 91 | 92 | BUNDLED WITH 93 | 2.1.4 94 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io/api/swift,macos,windows 2 | # Edit at https://www.gitignore.io/?templates=swift,macos,windows 3 | 4 | ### Windows ### 5 | # Windows thumbnail cache files 6 | Thumbs.db 7 | Thumbs.db:encryptable 8 | ehthumbs.db 9 | ehthumbs_vista.db 10 | 11 | # Dump file 12 | *.stackdump 13 | 14 | # Folder config file 15 | [Dd]esktop.ini 16 | 17 | # Recycle Bin used on file shares 18 | $RECYCLE.BIN/ 19 | 20 | # Windows Installer files 21 | *.cab 22 | *.msi 23 | *.msix 24 | *.msm 25 | *.msp 26 | 27 | # Windows shortcuts 28 | *.lnk 29 | 30 | ### macOS ### 31 | # General 32 | .DS_Store 33 | .AppleDouble 34 | .LSOverride 35 | 36 | # Icon must end with two \r 37 | Icon 38 | 39 | # Thumbnails 40 | ._* 41 | 42 | # Files that might appear in the root of a volume 43 | .DocumentRevisions-V100 44 | .fseventsd 45 | .Spotlight-V100 46 | .TemporaryItems 47 | .Trashes 48 | .VolumeIcon.icns 49 | .com.apple.timemachine.donotpresent 50 | 51 | # Directories potentially created on remote AFP share 52 | .AppleDB 53 | .AppleDesktop 54 | Network Trash Folder 55 | Temporary Items 56 | .apdisk 57 | 58 | ### Swift ### 59 | # Xcode 60 | # 61 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 62 | 63 | ## Build generated 64 | build/ 65 | DerivedData/ 66 | 67 | ## Various settings 68 | *.pbxuser 69 | !default.pbxuser 70 | *.mode1v3 71 | !default.mode1v3 72 | *.mode2v3 73 | !default.mode2v3 74 | *.perspectivev3 75 | !default.perspectivev3 76 | xcuserdata/ 77 | 78 | ## Other 79 | *.moved-aside 80 | *.xccheckout 81 | *.xcscmblueprint 82 | 83 | ## Obj-C/Swift specific 84 | *.hmap 85 | *.ipa 86 | *.dSYM.zip 87 | *.dSYM 88 | 89 | ## Playgrounds 90 | timeline.xctimeline 91 | playground.xcworkspace 92 | 93 | # Swift Package Manager 94 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 95 | # Packages/ 96 | # Package.pins 97 | # Package.resolved 98 | .build/ 99 | # Add this line if you want to avoid checking in Xcode SPM integration. 100 | # .swiftpm/xcode 101 | 102 | # CocoaPods 103 | # We recommend against adding the Pods directory to your .gitignore. However 104 | # you should judge for yourself, the pros and cons are mentioned at: 105 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 106 | Pods/ 107 | # Add this line if you want to avoid checking in source code from the Xcode workspace 108 | *.xcworkspace 109 | 110 | # Carthage 111 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 112 | # Carthage/Checkouts 113 | 114 | Carthage/Build 115 | 116 | # Accio dependency management 117 | Dependencies/ 118 | .accio/ 119 | 120 | # fastlane 121 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 122 | # screenshots whenever they are needed. 123 | # For more information about the recommended setup visit: 124 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 125 | 126 | fastlane/report.xml 127 | fastlane/Preview.html 128 | fastlane/screenshots/**/*.png 129 | fastlane/test_output 130 | 131 | # Code Injection 132 | # After new code Injection tools there's a generated folder /iOSInjectionProject 133 | # https://github.com/johnno1962/injectionforxcode 134 | 135 | iOSInjectionProject/ 136 | 137 | ### Ruby ### 138 | Gems/ 139 | 140 | # End of https://www.gitignore.io/api/swift,macos,windows 141 | -------------------------------------------------------------------------------- /AppleReserver/MainViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainViewController.swift 3 | // AppleReserver 4 | // 5 | // Created by Sunnyyoung on 2017/9/19. 6 | // Copyright © 2017年 Sunnyyoung. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import Alamofire 11 | 12 | class MainViewController: NSViewController { 13 | @IBOutlet weak var storeTableView: NSTableView! 14 | @IBOutlet weak var availabilityTableView: NSTableView! 15 | @IBOutlet weak var notificationButton: NSButton! 16 | @IBOutlet weak var timerIntervalButton: NSPopUpButton! 17 | @IBOutlet weak var fireButton: NSButton! 18 | @IBOutlet weak var indicator: NSProgressIndicator! 19 | 20 | fileprivate var products: [Product]? 21 | fileprivate var stores: [Store]? 22 | fileprivate var availabilities: [Availability]? { 23 | didSet { 24 | guard let availabilities = self.availabilities, self.notificationButton.state == .on else { 25 | return 26 | } 27 | for selectedPartNumber in self.selectedPartNumbers { 28 | guard let availability = availabilities.first(where: { $0.partNumber == selectedPartNumber }), 29 | availability.contract || availability.unlocked else { 30 | return 31 | } 32 | let notification = NSUserNotification() 33 | notification.informativeText = "\(availability.partNumber) 有货啦!!!" 34 | notification.soundName = NSUserNotificationDefaultSoundName 35 | NSUserNotificationCenter.default.deliver(notification) 36 | } 37 | } 38 | } 39 | 40 | fileprivate var selectedStore: Store? 41 | fileprivate var selectedPartNumbers: Set = [] 42 | 43 | fileprivate var pollingTimer: Timer? 44 | fileprivate var reserveURL: URL? 45 | 46 | override func viewDidLoad() { 47 | super.viewDidLoad() 48 | self.loadProducts() 49 | self.loadStores() 50 | } 51 | 52 | // MARK: Load method 53 | func loadProducts() { 54 | guard let fileURL = Bundle.main.url(forResource: "Products", withExtension: "json") else { 55 | return 56 | } 57 | do { 58 | let fileData = try Data.init(contentsOf: fileURL) 59 | self.products = try JSONDecoder().decode([Product].self, from: fileData) 60 | } catch { 61 | NSAlert(error: error).runModal() 62 | } 63 | } 64 | 65 | func loadStores() { 66 | Alamofire.request(AppleURL.stores).responseJSON { (response) in 67 | do { 68 | if let error = response.error { 69 | throw error 70 | } else { 71 | guard let values = (response.value as? [String: Any])?["stores"] else { 72 | return 73 | } 74 | let data = try JSONSerialization.data(withJSONObject: values, options: []) 75 | self.stores = try JSONDecoder().decode([Store].self, from: data) 76 | self.storeTableView.reloadData() 77 | } 78 | } catch { 79 | NSAlert(error: error).runModal() 80 | } 81 | } 82 | } 83 | 84 | @objc private func reloadAvailability() { 85 | Alamofire.request(AppleURL.availability).responseJSON { (response) in 86 | do { 87 | if let error = response.error { 88 | throw error 89 | } else { 90 | guard 91 | let storeNumber = self.selectedStore?.storeNumber, 92 | let values = ((response.value as? [String: Any])?["stores"] as? [String: Any])?[storeNumber] as? [String: [String: [String: Bool]]] 93 | else { 94 | return 95 | } 96 | self.availabilities = values.compactMap({ Availability(key: $0.key, value: $0.value) }) 97 | self.availabilityTableView.reloadData() 98 | } 99 | } catch { 100 | NSAlert(error: error).runModal() 101 | } 102 | } 103 | } 104 | 105 | // MARK: Event method 106 | @IBAction func fireAction(_ sender: NSButton) { 107 | let interval = Double(self.timerIntervalButton.titleOfSelectedItem ?? "3") ?? 3.0 108 | if self.pollingTimer?.isValid == true { 109 | sender.title = "开始" 110 | self.storeTableView.isEnabled = true 111 | self.timerIntervalButton.isEnabled = true 112 | self.indicator.stopAnimation(sender) 113 | self.pollingTimer = { 114 | self.pollingTimer?.invalidate() 115 | return nil 116 | }() 117 | } else { 118 | sender.title = "停止" 119 | self.storeTableView.isEnabled = false 120 | self.timerIntervalButton.isEnabled = false 121 | self.indicator.startAnimation(sender) 122 | self.pollingTimer = { 123 | let timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(reloadAvailability), userInfo: nil, repeats: true) 124 | timer.fire() 125 | return timer 126 | }() 127 | } 128 | } 129 | 130 | @IBAction func reserveAction(_ sender: NSTableView) { 131 | guard let url = self.reserveURL, sender.selectedRow >= 0 else { 132 | return 133 | } 134 | NSWorkspace.shared.open(url) 135 | } 136 | } 137 | 138 | extension MainViewController: NSTableViewDataSource, NSTableViewDelegate { 139 | func numberOfRows(in tableView: NSTableView) -> Int { 140 | if tableView == self.storeTableView { 141 | return self.stores?.count ?? 0 142 | } else if tableView == self.availabilityTableView { 143 | return self.availabilities?.count ?? 0 144 | } else { 145 | return 0 146 | } 147 | } 148 | 149 | func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { 150 | if tableView == self.storeTableView { 151 | return self.stores?[row].storeName 152 | } else if tableView == self.availabilityTableView { 153 | guard let identifier = tableColumn?.identifier.rawValue, 154 | let availability = self.availabilities?[row], 155 | let product = self.products?.first(where: { $0.partNumber == availability.partNumber }) else { 156 | return nil 157 | } 158 | switch identifier { 159 | case "Monitoring": 160 | return self.selectedPartNumbers.contains(availability.partNumber) 161 | case "PartNumber": 162 | return availability.partNumber 163 | case "Description": 164 | return product.productTitle 165 | case "Capacity": 166 | return product.dimensionCapacity.uppercased() 167 | case "Status": 168 | return (availability.contract || availability.unlocked) ? "有货" : "无货" 169 | default: 170 | return nil 171 | } 172 | } else { 173 | return nil 174 | } 175 | } 176 | 177 | func tableView(_ tableView: NSTableView, setObjectValue object: Any?, for tableColumn: NSTableColumn?, row: Int) { 178 | guard let partNumber = self.availabilities?[row].partNumber, let selected = object as? Bool else { 179 | return 180 | } 181 | if selected { 182 | self.selectedPartNumbers.insert(partNumber) 183 | } else { 184 | self.selectedPartNumbers.remove(partNumber) 185 | } 186 | } 187 | 188 | func tableViewSelectionDidChange(_ notification: Notification) { 189 | guard let tableView = notification.object as? NSTableView, tableView.selectedRow >= 0 else { 190 | return 191 | } 192 | if tableView == self.storeTableView { 193 | self.selectedStore = self.stores?[tableView.selectedRow] 194 | self.selectedPartNumbers.removeAll() 195 | self.availabilityTableView.deselectAll(nil) 196 | self.reloadAvailability() 197 | } else if tableView == self.availabilityTableView { 198 | guard let storeNumber = self.selectedStore?.storeNumber, 199 | let partNumber = self.availabilities?[tableView.selectedRow].partNumber else { 200 | return 201 | } 202 | self.reserveURL = URL(string: "https://reserve-prime.apple.com/CN/zh_CN/reserve/A/availability?path=/cn/shop/buy-iphone/iphone-11-pro\(storeNumber)&partNumber=\(partNumber)") 203 | } 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /AppleReserver.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 7D11BD8D1F7154C100C8CAAA /* Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D11BD8C1F7154C100C8CAAA /* Product.swift */; }; 11 | 7DF748221F70F3D000949D8E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748211F70F3D000949D8E /* AppDelegate.swift */; }; 12 | 7DF748261F70F3D000949D8E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7DF748251F70F3D000949D8E /* Assets.xcassets */; }; 13 | 7DF748291F70F3D000949D8E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7DF748271F70F3D000949D8E /* Main.storyboard */; }; 14 | 7DF748361F70F66800949D8E /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748351F70F66800949D8E /* MainViewController.swift */; }; 15 | 7DF748381F70F7CC00949D8E /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748371F70F7CC00949D8E /* Store.swift */; }; 16 | 7DF7483B1F70FB6D00949D8E /* Constant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF7483A1F70FB6D00949D8E /* Constant.swift */; }; 17 | 7DF7483D1F70FCC400949D8E /* MainWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF7483C1F70FCC400949D8E /* MainWindowController.swift */; }; 18 | 7DF748421F71240C00949D8E /* Availability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748411F71240C00949D8E /* Availability.swift */; }; 19 | 7DF748441F71289600949D8E /* Products.json in Resources */ = {isa = PBXBuildFile; fileRef = 7DF748431F71289600949D8E /* Products.json */; }; 20 | 7DF748461F7128B700949D8E /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF748451F7128B700949D8E /* Device.swift */; }; 21 | B97DFD65E4E74ACA1B3DE986 /* Pods_AppleReserver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 597DDD580CC45B36A2687C55 /* Pods_AppleReserver.framework */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 0A22BD26D8A0614EE0AB6B2F /* Pods-AppleReserver.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppleReserver.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AppleReserver/Pods-AppleReserver.debug.xcconfig"; sourceTree = ""; }; 26 | 49A7ABB83FFA27EE2FCEA332 /* Pods-AppleReserver.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppleReserver.release.xcconfig"; path = "Pods/Target Support Files/Pods-AppleReserver/Pods-AppleReserver.release.xcconfig"; sourceTree = ""; }; 27 | 597DDD580CC45B36A2687C55 /* Pods_AppleReserver.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AppleReserver.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 7D11BD8C1F7154C100C8CAAA /* Product.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Product.swift; sourceTree = ""; }; 29 | 7DF7481E1F70F3D000949D8E /* AppleReserver.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AppleReserver.app; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 7DF748211F70F3D000949D8E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 31 | 7DF748251F70F3D000949D8E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 32 | 7DF748281F70F3D000949D8E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 33 | 7DF7482A1F70F3D000949D8E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 34 | 7DF748351F70F66800949D8E /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; 35 | 7DF748371F70F7CC00949D8E /* Store.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = ""; }; 36 | 7DF7483A1F70FB6D00949D8E /* Constant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constant.swift; sourceTree = ""; }; 37 | 7DF7483C1F70FCC400949D8E /* MainWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainWindowController.swift; sourceTree = ""; }; 38 | 7DF748411F71240C00949D8E /* Availability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Availability.swift; sourceTree = ""; }; 39 | 7DF748431F71289600949D8E /* Products.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Products.json; sourceTree = ""; }; 40 | 7DF748451F7128B700949D8E /* Device.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Device.swift; sourceTree = ""; }; 41 | /* End PBXFileReference section */ 42 | 43 | /* Begin PBXFrameworksBuildPhase section */ 44 | 7DF7481B1F70F3D000949D8E /* Frameworks */ = { 45 | isa = PBXFrameworksBuildPhase; 46 | buildActionMask = 2147483647; 47 | files = ( 48 | B97DFD65E4E74ACA1B3DE986 /* Pods_AppleReserver.framework in Frameworks */, 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXFrameworksBuildPhase section */ 53 | 54 | /* Begin PBXGroup section */ 55 | 15C17FC1510552A5897398D0 /* Pods */ = { 56 | isa = PBXGroup; 57 | children = ( 58 | 0A22BD26D8A0614EE0AB6B2F /* Pods-AppleReserver.debug.xcconfig */, 59 | 49A7ABB83FFA27EE2FCEA332 /* Pods-AppleReserver.release.xcconfig */, 60 | ); 61 | name = Pods; 62 | sourceTree = ""; 63 | }; 64 | 7DF748151F70F3D000949D8E = { 65 | isa = PBXGroup; 66 | children = ( 67 | 7DF748201F70F3D000949D8E /* AppleReserver */, 68 | 7DF7481F1F70F3D000949D8E /* Products */, 69 | 15C17FC1510552A5897398D0 /* Pods */, 70 | 86149565ADBBC8E56751FBD8 /* Frameworks */, 71 | ); 72 | sourceTree = ""; 73 | }; 74 | 7DF7481F1F70F3D000949D8E /* Products */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 7DF7481E1F70F3D000949D8E /* AppleReserver.app */, 78 | ); 79 | name = Products; 80 | sourceTree = ""; 81 | }; 82 | 7DF748201F70F3D000949D8E /* AppleReserver */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 7DF748211F70F3D000949D8E /* AppDelegate.swift */, 86 | 7DF748271F70F3D000949D8E /* Main.storyboard */, 87 | 7DF748251F70F3D000949D8E /* Assets.xcassets */, 88 | 7DF748321F70F63900949D8E /* Module */, 89 | 7DF748301F70F4ED00949D8E /* Supporting Files */, 90 | ); 91 | path = AppleReserver; 92 | sourceTree = ""; 93 | }; 94 | 7DF748301F70F4ED00949D8E /* Supporting Files */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 7DF748431F71289600949D8E /* Products.json */, 98 | 7DF7482A1F70F3D000949D8E /* Info.plist */, 99 | ); 100 | name = "Supporting Files"; 101 | sourceTree = ""; 102 | }; 103 | 7DF748311F70F63100949D8E /* Controller */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 7DF7483C1F70FCC400949D8E /* MainWindowController.swift */, 107 | 7DF748351F70F66800949D8E /* MainViewController.swift */, 108 | ); 109 | name = Controller; 110 | sourceTree = ""; 111 | }; 112 | 7DF748321F70F63900949D8E /* Module */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 7DF748391F70FB5B00949D8E /* Constant */, 116 | 7DF748331F70F64800949D8E /* Model */, 117 | 7DF748311F70F63100949D8E /* Controller */, 118 | ); 119 | name = Module; 120 | sourceTree = ""; 121 | }; 122 | 7DF748331F70F64800949D8E /* Model */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 7DF748371F70F7CC00949D8E /* Store.swift */, 126 | 7DF748411F71240C00949D8E /* Availability.swift */, 127 | 7DF748451F7128B700949D8E /* Device.swift */, 128 | 7D11BD8C1F7154C100C8CAAA /* Product.swift */, 129 | ); 130 | name = Model; 131 | sourceTree = ""; 132 | }; 133 | 7DF748391F70FB5B00949D8E /* Constant */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 7DF7483A1F70FB6D00949D8E /* Constant.swift */, 137 | ); 138 | name = Constant; 139 | sourceTree = ""; 140 | }; 141 | 86149565ADBBC8E56751FBD8 /* Frameworks */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 597DDD580CC45B36A2687C55 /* Pods_AppleReserver.framework */, 145 | ); 146 | name = Frameworks; 147 | sourceTree = ""; 148 | }; 149 | /* End PBXGroup section */ 150 | 151 | /* Begin PBXNativeTarget section */ 152 | 7DF7481D1F70F3D000949D8E /* AppleReserver */ = { 153 | isa = PBXNativeTarget; 154 | buildConfigurationList = 7DF7482D1F70F3D000949D8E /* Build configuration list for PBXNativeTarget "AppleReserver" */; 155 | buildPhases = ( 156 | BEC73449C094493EE65914CD /* [CP] Check Pods Manifest.lock */, 157 | 7DF7481A1F70F3D000949D8E /* Sources */, 158 | 7DF7481B1F70F3D000949D8E /* Frameworks */, 159 | 7DF7481C1F70F3D000949D8E /* Resources */, 160 | 283B069508CC4032A00F1335 /* [CP] Embed Pods Frameworks */, 161 | ); 162 | buildRules = ( 163 | ); 164 | dependencies = ( 165 | ); 166 | name = AppleReserver; 167 | productName = AppleReserver; 168 | productReference = 7DF7481E1F70F3D000949D8E /* AppleReserver.app */; 169 | productType = "com.apple.product-type.application"; 170 | }; 171 | /* End PBXNativeTarget section */ 172 | 173 | /* Begin PBXProject section */ 174 | 7DF748161F70F3D000949D8E /* Project object */ = { 175 | isa = PBXProject; 176 | attributes = { 177 | LastSwiftUpdateCheck = 0830; 178 | LastUpgradeCheck = 1200; 179 | ORGANIZATIONNAME = Sunnyyoung; 180 | TargetAttributes = { 181 | 7DF7481D1F70F3D000949D8E = { 182 | CreatedOnToolsVersion = 8.3.3; 183 | ProvisioningStyle = Automatic; 184 | }; 185 | }; 186 | }; 187 | buildConfigurationList = 7DF748191F70F3D000949D8E /* Build configuration list for PBXProject "AppleReserver" */; 188 | compatibilityVersion = "Xcode 3.2"; 189 | developmentRegion = en; 190 | hasScannedForEncodings = 0; 191 | knownRegions = ( 192 | en, 193 | Base, 194 | ); 195 | mainGroup = 7DF748151F70F3D000949D8E; 196 | productRefGroup = 7DF7481F1F70F3D000949D8E /* Products */; 197 | projectDirPath = ""; 198 | projectRoot = ""; 199 | targets = ( 200 | 7DF7481D1F70F3D000949D8E /* AppleReserver */, 201 | ); 202 | }; 203 | /* End PBXProject section */ 204 | 205 | /* Begin PBXResourcesBuildPhase section */ 206 | 7DF7481C1F70F3D000949D8E /* Resources */ = { 207 | isa = PBXResourcesBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | 7DF748261F70F3D000949D8E /* Assets.xcassets in Resources */, 211 | 7DF748441F71289600949D8E /* Products.json in Resources */, 212 | 7DF748291F70F3D000949D8E /* Main.storyboard in Resources */, 213 | ); 214 | runOnlyForDeploymentPostprocessing = 0; 215 | }; 216 | /* End PBXResourcesBuildPhase section */ 217 | 218 | /* Begin PBXShellScriptBuildPhase section */ 219 | 283B069508CC4032A00F1335 /* [CP] Embed Pods Frameworks */ = { 220 | isa = PBXShellScriptBuildPhase; 221 | buildActionMask = 2147483647; 222 | files = ( 223 | ); 224 | inputPaths = ( 225 | "${PODS_ROOT}/Target Support Files/Pods-AppleReserver/Pods-AppleReserver-frameworks.sh", 226 | "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", 227 | ); 228 | name = "[CP] Embed Pods Frameworks"; 229 | outputPaths = ( 230 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | shellPath = /bin/sh; 234 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AppleReserver/Pods-AppleReserver-frameworks.sh\"\n"; 235 | showEnvVarsInLog = 0; 236 | }; 237 | BEC73449C094493EE65914CD /* [CP] Check Pods Manifest.lock */ = { 238 | isa = PBXShellScriptBuildPhase; 239 | buildActionMask = 2147483647; 240 | files = ( 241 | ); 242 | inputPaths = ( 243 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 244 | "${PODS_ROOT}/Manifest.lock", 245 | ); 246 | name = "[CP] Check Pods Manifest.lock"; 247 | outputPaths = ( 248 | "$(DERIVED_FILE_DIR)/Pods-AppleReserver-checkManifestLockResult.txt", 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | shellPath = /bin/sh; 252 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 253 | showEnvVarsInLog = 0; 254 | }; 255 | /* End PBXShellScriptBuildPhase section */ 256 | 257 | /* Begin PBXSourcesBuildPhase section */ 258 | 7DF7481A1F70F3D000949D8E /* Sources */ = { 259 | isa = PBXSourcesBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | 7DF748421F71240C00949D8E /* Availability.swift in Sources */, 263 | 7D11BD8D1F7154C100C8CAAA /* Product.swift in Sources */, 264 | 7DF748381F70F7CC00949D8E /* Store.swift in Sources */, 265 | 7DF748221F70F3D000949D8E /* AppDelegate.swift in Sources */, 266 | 7DF748361F70F66800949D8E /* MainViewController.swift in Sources */, 267 | 7DF7483B1F70FB6D00949D8E /* Constant.swift in Sources */, 268 | 7DF748461F7128B700949D8E /* Device.swift in Sources */, 269 | 7DF7483D1F70FCC400949D8E /* MainWindowController.swift in Sources */, 270 | ); 271 | runOnlyForDeploymentPostprocessing = 0; 272 | }; 273 | /* End PBXSourcesBuildPhase section */ 274 | 275 | /* Begin PBXVariantGroup section */ 276 | 7DF748271F70F3D000949D8E /* Main.storyboard */ = { 277 | isa = PBXVariantGroup; 278 | children = ( 279 | 7DF748281F70F3D000949D8E /* Base */, 280 | ); 281 | name = Main.storyboard; 282 | sourceTree = ""; 283 | }; 284 | /* End PBXVariantGroup section */ 285 | 286 | /* Begin XCBuildConfiguration section */ 287 | 7DF7482B1F70F3D000949D8E /* Debug */ = { 288 | isa = XCBuildConfiguration; 289 | buildSettings = { 290 | ALWAYS_SEARCH_USER_PATHS = NO; 291 | CLANG_ANALYZER_NONNULL = YES; 292 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 293 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 294 | CLANG_CXX_LIBRARY = "libc++"; 295 | CLANG_ENABLE_MODULES = YES; 296 | CLANG_ENABLE_OBJC_ARC = YES; 297 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 298 | CLANG_WARN_BOOL_CONVERSION = YES; 299 | CLANG_WARN_COMMA = YES; 300 | CLANG_WARN_CONSTANT_CONVERSION = YES; 301 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 302 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 303 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 304 | CLANG_WARN_EMPTY_BODY = YES; 305 | CLANG_WARN_ENUM_CONVERSION = YES; 306 | CLANG_WARN_INFINITE_RECURSION = YES; 307 | CLANG_WARN_INT_CONVERSION = YES; 308 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 309 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 310 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 311 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 312 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 313 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 314 | CLANG_WARN_STRICT_PROTOTYPES = YES; 315 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 316 | CLANG_WARN_UNREACHABLE_CODE = YES; 317 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 318 | CODE_SIGN_IDENTITY = "-"; 319 | COPY_PHASE_STRIP = NO; 320 | CURRENT_PROJECT_VERSION = 10; 321 | DEBUG_INFORMATION_FORMAT = dwarf; 322 | ENABLE_STRICT_OBJC_MSGSEND = YES; 323 | ENABLE_TESTABILITY = YES; 324 | GCC_C_LANGUAGE_STANDARD = gnu99; 325 | GCC_DYNAMIC_NO_PIC = NO; 326 | GCC_NO_COMMON_BLOCKS = YES; 327 | GCC_OPTIMIZATION_LEVEL = 0; 328 | GCC_PREPROCESSOR_DEFINITIONS = ( 329 | "DEBUG=1", 330 | "$(inherited)", 331 | ); 332 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 333 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 334 | GCC_WARN_UNDECLARED_SELECTOR = YES; 335 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 336 | GCC_WARN_UNUSED_FUNCTION = YES; 337 | GCC_WARN_UNUSED_VARIABLE = YES; 338 | MACOSX_DEPLOYMENT_TARGET = 10.13; 339 | MTL_ENABLE_DEBUG_INFO = YES; 340 | ONLY_ACTIVE_ARCH = YES; 341 | SDKROOT = macosx; 342 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 343 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 344 | VERSIONING_SYSTEM = "apple-generic"; 345 | }; 346 | name = Debug; 347 | }; 348 | 7DF7482C1F70F3D000949D8E /* Release */ = { 349 | isa = XCBuildConfiguration; 350 | buildSettings = { 351 | ALWAYS_SEARCH_USER_PATHS = NO; 352 | CLANG_ANALYZER_NONNULL = YES; 353 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 354 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 355 | CLANG_CXX_LIBRARY = "libc++"; 356 | CLANG_ENABLE_MODULES = YES; 357 | CLANG_ENABLE_OBJC_ARC = YES; 358 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 359 | CLANG_WARN_BOOL_CONVERSION = YES; 360 | CLANG_WARN_COMMA = YES; 361 | CLANG_WARN_CONSTANT_CONVERSION = YES; 362 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 363 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 364 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 365 | CLANG_WARN_EMPTY_BODY = YES; 366 | CLANG_WARN_ENUM_CONVERSION = YES; 367 | CLANG_WARN_INFINITE_RECURSION = YES; 368 | CLANG_WARN_INT_CONVERSION = YES; 369 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 370 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 371 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 372 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 373 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 374 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 375 | CLANG_WARN_STRICT_PROTOTYPES = YES; 376 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 377 | CLANG_WARN_UNREACHABLE_CODE = YES; 378 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 379 | CODE_SIGN_IDENTITY = "-"; 380 | COPY_PHASE_STRIP = NO; 381 | CURRENT_PROJECT_VERSION = 10; 382 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 383 | ENABLE_NS_ASSERTIONS = NO; 384 | ENABLE_STRICT_OBJC_MSGSEND = YES; 385 | GCC_C_LANGUAGE_STANDARD = gnu99; 386 | GCC_NO_COMMON_BLOCKS = YES; 387 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 388 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 389 | GCC_WARN_UNDECLARED_SELECTOR = YES; 390 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 391 | GCC_WARN_UNUSED_FUNCTION = YES; 392 | GCC_WARN_UNUSED_VARIABLE = YES; 393 | MACOSX_DEPLOYMENT_TARGET = 10.13; 394 | MTL_ENABLE_DEBUG_INFO = NO; 395 | SDKROOT = macosx; 396 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 397 | VERSIONING_SYSTEM = "apple-generic"; 398 | }; 399 | name = Release; 400 | }; 401 | 7DF7482E1F70F3D000949D8E /* Debug */ = { 402 | isa = XCBuildConfiguration; 403 | baseConfigurationReference = 0A22BD26D8A0614EE0AB6B2F /* Pods-AppleReserver.debug.xcconfig */; 404 | buildSettings = { 405 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 406 | CODE_SIGN_IDENTITY = "-"; 407 | COMBINE_HIDPI_IMAGES = YES; 408 | DEVELOPMENT_TEAM = ""; 409 | INFOPLIST_FILE = AppleReserver/Info.plist; 410 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 411 | MACOSX_DEPLOYMENT_TARGET = 10.11; 412 | PRODUCT_BUNDLE_IDENTIFIER = net.sunnyyoung.AppleReserver; 413 | PRODUCT_NAME = "$(TARGET_NAME)"; 414 | SWIFT_VERSION = 5.0; 415 | }; 416 | name = Debug; 417 | }; 418 | 7DF7482F1F70F3D000949D8E /* Release */ = { 419 | isa = XCBuildConfiguration; 420 | baseConfigurationReference = 49A7ABB83FFA27EE2FCEA332 /* Pods-AppleReserver.release.xcconfig */; 421 | buildSettings = { 422 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 423 | CODE_SIGN_IDENTITY = "-"; 424 | COMBINE_HIDPI_IMAGES = YES; 425 | DEVELOPMENT_TEAM = ""; 426 | INFOPLIST_FILE = AppleReserver/Info.plist; 427 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 428 | MACOSX_DEPLOYMENT_TARGET = 10.11; 429 | PRODUCT_BUNDLE_IDENTIFIER = net.sunnyyoung.AppleReserver; 430 | PRODUCT_NAME = "$(TARGET_NAME)"; 431 | SWIFT_VERSION = 5.0; 432 | }; 433 | name = Release; 434 | }; 435 | /* End XCBuildConfiguration section */ 436 | 437 | /* Begin XCConfigurationList section */ 438 | 7DF748191F70F3D000949D8E /* Build configuration list for PBXProject "AppleReserver" */ = { 439 | isa = XCConfigurationList; 440 | buildConfigurations = ( 441 | 7DF7482B1F70F3D000949D8E /* Debug */, 442 | 7DF7482C1F70F3D000949D8E /* Release */, 443 | ); 444 | defaultConfigurationIsVisible = 0; 445 | defaultConfigurationName = Release; 446 | }; 447 | 7DF7482D1F70F3D000949D8E /* Build configuration list for PBXNativeTarget "AppleReserver" */ = { 448 | isa = XCConfigurationList; 449 | buildConfigurations = ( 450 | 7DF7482E1F70F3D000949D8E /* Debug */, 451 | 7DF7482F1F70F3D000949D8E /* Release */, 452 | ); 453 | defaultConfigurationIsVisible = 0; 454 | defaultConfigurationName = Release; 455 | }; 456 | /* End XCConfigurationList section */ 457 | }; 458 | rootObject = 7DF748161F70F3D000949D8E /* Project object */; 459 | } 460 | -------------------------------------------------------------------------------- /AppleReserver/Products.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "productTitle": "iPhone 13 Pro 512GB 远峰蓝色", 4 | "basePartNumber": "MLTJ3", 5 | "image": "iphone-13-pro-blue-select", 6 | "dimensionCapacity": "512gb", 7 | "dimensionScreensize": "6_1inch", 8 | "price": "10399_00_unlocked", 9 | "partNumber": "MLTJ3CH/A", 10 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTJ3CH/A", 11 | "dimensionColor": "sierrablue" 12 | }, 13 | { 14 | "productTitle": "iPhone 13 Pro 256GB 金色", 15 | "basePartNumber": "MLTD3", 16 | "image": "iphone-13-pro-gold-select", 17 | "dimensionCapacity": "256gb", 18 | "dimensionScreensize": "6_1inch", 19 | "price": "8799_00_unlocked", 20 | "partNumber": "MLTD3CH/A", 21 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTD3CH/A", 22 | "dimensionColor": "gold" 23 | }, 24 | { 25 | "productTitle": "iPhone 13 Pro 1TB 银色", 26 | "basePartNumber": "MLTL3", 27 | "image": "iphone-13-pro-silver-select", 28 | "dimensionCapacity": "1tb", 29 | "dimensionScreensize": "6_1inch", 30 | "price": "11999_00_unlocked", 31 | "partNumber": "MLTL3CH/A", 32 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTL3CH/A", 33 | "dimensionColor": "silver" 34 | }, 35 | { 36 | "productTitle": "iPhone 13 Pro 128GB 远峰蓝色", 37 | "basePartNumber": "MLT83", 38 | "image": "iphone-13-pro-blue-select", 39 | "dimensionCapacity": "128gb", 40 | "dimensionScreensize": "6_1inch", 41 | "price": "7999_00_unlocked", 42 | "partNumber": "MLT83CH/A", 43 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT83CH/A", 44 | "dimensionColor": "sierrablue" 45 | }, 46 | { 47 | "productTitle": "iPhone 13 Pro 128GB 银色", 48 | "basePartNumber": "MLT63", 49 | "image": "iphone-13-pro-silver-select", 50 | "dimensionCapacity": "128gb", 51 | "dimensionScreensize": "6_1inch", 52 | "price": "7999_00_unlocked", 53 | "partNumber": "MLT63CH/A", 54 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT63CH/A", 55 | "dimensionColor": "silver" 56 | }, 57 | { 58 | "productTitle": "iPhone 13 Pro 512GB 石墨色", 59 | "basePartNumber": "MLTF3", 60 | "image": "iphone-13-pro-graphite-select", 61 | "dimensionCapacity": "512gb", 62 | "dimensionScreensize": "6_1inch", 63 | "price": "10399_00_unlocked", 64 | "partNumber": "MLTF3CH/A", 65 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTF3CH/A", 66 | "dimensionColor": "graphite" 67 | }, 68 | { 69 | "productTitle": "iPhone 13 Pro 256GB 石墨色", 70 | "basePartNumber": "MLT93", 71 | "image": "iphone-13-pro-graphite-select", 72 | "dimensionCapacity": "256gb", 73 | "dimensionScreensize": "6_1inch", 74 | "price": "8799_00_unlocked", 75 | "partNumber": "MLT93CH/A", 76 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT93CH/A", 77 | "dimensionColor": "graphite" 78 | }, 79 | { 80 | "productTitle": "iPhone 13 Pro 256GB 远峰蓝色", 81 | "basePartNumber": "MLTE3", 82 | "image": "iphone-13-pro-blue-select", 83 | "dimensionCapacity": "256gb", 84 | "dimensionScreensize": "6_1inch", 85 | "price": "8799_00_unlocked", 86 | "partNumber": "MLTE3CH/A", 87 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTE3CH/A", 88 | "dimensionColor": "sierrablue" 89 | }, 90 | { 91 | "productTitle": "iPhone 13 Pro 128GB 金色", 92 | "basePartNumber": "MLT73", 93 | "image": "iphone-13-pro-gold-select", 94 | "dimensionCapacity": "128gb", 95 | "dimensionScreensize": "6_1inch", 96 | "price": "7999_00_unlocked", 97 | "partNumber": "MLT73CH/A", 98 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT73CH/A", 99 | "dimensionColor": "gold" 100 | }, 101 | { 102 | "productTitle": "iPhone 13 Pro 128GB 石墨色", 103 | "basePartNumber": "MLT53", 104 | "image": "iphone-13-pro-graphite-select", 105 | "dimensionCapacity": "128gb", 106 | "dimensionScreensize": "6_1inch", 107 | "price": "7999_00_unlocked", 108 | "partNumber": "MLT53CH/A", 109 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLT53CH/A", 110 | "dimensionColor": "graphite" 111 | }, 112 | { 113 | "productTitle": "iPhone 13 Pro 1TB 金色", 114 | "basePartNumber": "MLTM3", 115 | "image": "iphone-13-pro-gold-select", 116 | "dimensionCapacity": "1tb", 117 | "dimensionScreensize": "6_1inch", 118 | "price": "11999_00_unlocked", 119 | "partNumber": "MLTM3CH/A", 120 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTM3CH/A", 121 | "dimensionColor": "gold" 122 | }, 123 | { 124 | "productTitle": "iPhone 13 Pro 512GB 银色", 125 | "basePartNumber": "MLTG3", 126 | "image": "iphone-13-pro-silver-select", 127 | "dimensionCapacity": "512gb", 128 | "dimensionScreensize": "6_1inch", 129 | "price": "10399_00_unlocked", 130 | "partNumber": "MLTG3CH/A", 131 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTG3CH/A", 132 | "dimensionColor": "silver" 133 | }, 134 | { 135 | "productTitle": "iPhone 13 Pro 1TB 远峰蓝色", 136 | "basePartNumber": "MLTN3", 137 | "image": "iphone-13-pro-blue-select", 138 | "dimensionCapacity": "1tb", 139 | "dimensionScreensize": "6_1inch", 140 | "price": "11999_00_unlocked", 141 | "partNumber": "MLTN3CH/A", 142 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTN3CH/A", 143 | "dimensionColor": "sierrablue" 144 | }, 145 | { 146 | "productTitle": "iPhone 13 Pro 1TB 石墨色", 147 | "basePartNumber": "MLTK3", 148 | "image": "iphone-13-pro-graphite-select", 149 | "dimensionCapacity": "1tb", 150 | "dimensionScreensize": "6_1inch", 151 | "price": "11999_00_unlocked", 152 | "partNumber": "MLTK3CH/A", 153 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTK3CH/A", 154 | "dimensionColor": "graphite" 155 | }, 156 | { 157 | "productTitle": "iPhone 13 Pro 512GB 金色", 158 | "basePartNumber": "MLTH3", 159 | "image": "iphone-13-pro-gold-select", 160 | "dimensionCapacity": "512gb", 161 | "dimensionScreensize": "6_1inch", 162 | "price": "10399_00_unlocked", 163 | "partNumber": "MLTH3CH/A", 164 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTH3CH/A", 165 | "dimensionColor": "gold" 166 | }, 167 | { 168 | "productTitle": "iPhone 13 Pro 256GB 银色", 169 | "basePartNumber": "MLTC3", 170 | "image": "iphone-13-pro-silver-select", 171 | "dimensionCapacity": "256gb", 172 | "dimensionScreensize": "6_1inch", 173 | "price": "8799_00_unlocked", 174 | "partNumber": "MLTC3CH/A", 175 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLTC3CH/A", 176 | "dimensionColor": "silver" 177 | }, 178 | { 179 | "productTitle": "iPhone 13 Pro Max 1TB 金色", 180 | "basePartNumber": "MLHK3", 181 | "image": "iphone-13-pro-max-gold-select", 182 | "dimensionCapacity": "1tb", 183 | "dimensionScreensize": "6_7inch", 184 | "price": "12999_00_unlocked", 185 | "partNumber": "MLHK3CH/A", 186 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHK3CH/A", 187 | "dimensionColor": "gold" 188 | }, 189 | { 190 | "productTitle": "iPhone 13 Pro Max 128GB 金色", 191 | "basePartNumber": "MLH63", 192 | "image": "iphone-13-pro-max-gold-select", 193 | "dimensionCapacity": "128gb", 194 | "dimensionScreensize": "6_7inch", 195 | "price": "8999_00_unlocked", 196 | "partNumber": "MLH63CH/A", 197 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH63CH/A", 198 | "dimensionColor": "gold" 199 | }, 200 | { 201 | "productTitle": "iPhone 13 Pro Max 128GB 远峰蓝色", 202 | "basePartNumber": "MLH73", 203 | "image": "iphone-13-pro-max-blue-select", 204 | "dimensionCapacity": "128gb", 205 | "dimensionScreensize": "6_7inch", 206 | "price": "8999_00_unlocked", 207 | "partNumber": "MLH73CH/A", 208 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH73CH/A", 209 | "dimensionColor": "sierrablue" 210 | }, 211 | { 212 | "productTitle": "iPhone 13 Pro Max 128GB 银色", 213 | "basePartNumber": "MLH53", 214 | "image": "iphone-13-pro-max-silver-select", 215 | "dimensionCapacity": "128gb", 216 | "dimensionScreensize": "6_7inch", 217 | "price": "8999_00_unlocked", 218 | "partNumber": "MLH53CH/A", 219 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH53CH/A", 220 | "dimensionColor": "silver" 221 | }, 222 | { 223 | "productTitle": "iPhone 13 Pro Max 512GB 金色", 224 | "basePartNumber": "MLHF3", 225 | "image": "iphone-13-pro-max-gold-select", 226 | "dimensionCapacity": "512gb", 227 | "dimensionScreensize": "6_7inch", 228 | "price": "11399_00_unlocked", 229 | "partNumber": "MLHF3CH/A", 230 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHF3CH/A", 231 | "dimensionColor": "gold" 232 | }, 233 | { 234 | "productTitle": "iPhone 13 Pro Max 512GB 远峰蓝色", 235 | "basePartNumber": "MLHG3", 236 | "image": "iphone-13-pro-max-blue-select", 237 | "dimensionCapacity": "512gb", 238 | "dimensionScreensize": "6_7inch", 239 | "price": "11399_00_unlocked", 240 | "partNumber": "MLHG3CH/A", 241 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHG3CH/A", 242 | "dimensionColor": "sierrablue" 243 | }, 244 | { 245 | "productTitle": "iPhone 13 Pro Max 1TB 石墨色", 246 | "basePartNumber": "MLHH3", 247 | "image": "iphone-13-pro-max-graphite-select", 248 | "dimensionCapacity": "1tb", 249 | "dimensionScreensize": "6_7inch", 250 | "price": "12999_00_unlocked", 251 | "partNumber": "MLHH3CH/A", 252 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHH3CH/A", 253 | "dimensionColor": "graphite" 254 | }, 255 | { 256 | "productTitle": "iPhone 13 Pro Max 512GB 银色", 257 | "basePartNumber": "MLHE3", 258 | "image": "iphone-13-pro-max-silver-select", 259 | "dimensionCapacity": "512gb", 260 | "dimensionScreensize": "6_7inch", 261 | "price": "11399_00_unlocked", 262 | "partNumber": "MLHE3CH/A", 263 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHE3CH/A", 264 | "dimensionColor": "silver" 265 | }, 266 | { 267 | "productTitle": "iPhone 13 Pro Max 1TB 远峰蓝色", 268 | "basePartNumber": "MLHL3", 269 | "image": "iphone-13-pro-max-blue-select", 270 | "dimensionCapacity": "1tb", 271 | "dimensionScreensize": "6_7inch", 272 | "price": "12999_00_unlocked", 273 | "partNumber": "MLHL3CH/A", 274 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHL3CH/A", 275 | "dimensionColor": "sierrablue" 276 | }, 277 | { 278 | "productTitle": "iPhone 13 Pro Max 256GB 银色", 279 | "basePartNumber": "MLH93", 280 | "image": "iphone-13-pro-max-silver-select", 281 | "dimensionCapacity": "256gb", 282 | "dimensionScreensize": "6_7inch", 283 | "price": "9799_00_unlocked", 284 | "partNumber": "MLH93CH/A", 285 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH93CH/A", 286 | "dimensionColor": "silver" 287 | }, 288 | { 289 | "productTitle": "iPhone 13 Pro Max 1TB 银色", 290 | "basePartNumber": "MLHJ3", 291 | "image": "iphone-13-pro-max-silver-select", 292 | "dimensionCapacity": "1tb", 293 | "dimensionScreensize": "6_7inch", 294 | "price": "12999_00_unlocked", 295 | "partNumber": "MLHJ3CH/A", 296 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHJ3CH/A", 297 | "dimensionColor": "silver" 298 | }, 299 | { 300 | "productTitle": "iPhone 13 Pro Max 256GB 远峰蓝色", 301 | "basePartNumber": "MLHC3", 302 | "image": "iphone-13-pro-max-blue-select", 303 | "dimensionCapacity": "256gb", 304 | "dimensionScreensize": "6_7inch", 305 | "price": "9799_00_unlocked", 306 | "partNumber": "MLHC3CH/A", 307 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHC3CH/A", 308 | "dimensionColor": "sierrablue" 309 | }, 310 | { 311 | "productTitle": "iPhone 13 Pro Max 256GB 石墨色", 312 | "basePartNumber": "MLH83", 313 | "image": "iphone-13-pro-max-graphite-select", 314 | "dimensionCapacity": "256gb", 315 | "dimensionScreensize": "6_7inch", 316 | "price": "9799_00_unlocked", 317 | "partNumber": "MLH83CH/A", 318 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH83CH/A", 319 | "dimensionColor": "graphite" 320 | }, 321 | { 322 | "productTitle": "iPhone 13 Pro Max 128GB 石墨色", 323 | "basePartNumber": "MLH43", 324 | "image": "iphone-13-pro-max-graphite-select", 325 | "dimensionCapacity": "128gb", 326 | "dimensionScreensize": "6_7inch", 327 | "price": "8999_00_unlocked", 328 | "partNumber": "MLH43CH/A", 329 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLH43CH/A", 330 | "dimensionColor": "graphite" 331 | }, 332 | { 333 | "productTitle": "iPhone 13 Pro Max 256GB 金色", 334 | "basePartNumber": "MLHA3", 335 | "image": "iphone-13-pro-max-gold-select", 336 | "dimensionCapacity": "256gb", 337 | "dimensionScreensize": "6_7inch", 338 | "price": "9799_00_unlocked", 339 | "partNumber": "MLHA3CH/A", 340 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHA3CH/A", 341 | "dimensionColor": "gold" 342 | }, 343 | { 344 | "productTitle": "iPhone 13 Pro Max 512GB 石墨色", 345 | "basePartNumber": "MLHD3", 346 | "image": "iphone-13-pro-max-graphite-select", 347 | "dimensionCapacity": "512gb", 348 | "dimensionScreensize": "6_7inch", 349 | "price": "11399_00_unlocked", 350 | "partNumber": "MLHD3CH/A", 351 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro/MLHD3CH/A", 352 | "dimensionColor": "graphite" 353 | },{ 354 | "productTitle": "iPhone 13 mini 128GB 蓝色", 355 | "basePartNumber": "MLDG3", 356 | "image": "iphone-13-mini-blue-select-2021", 357 | "dimensionCapacity": "128gb", 358 | "dimensionScreensize": "5_4inch", 359 | "price": "5199_00_unlocked", 360 | "partNumber": "MLDG3CH/A", 361 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDG3CH/A", 362 | "dimensionColor": "blue" 363 | }, 364 | { 365 | "productTitle": "iPhone 13 mini 512GB 红色", 366 | "basePartNumber": "MLDR3", 367 | "image": "iphone-13-mini-product-red-select-2021", 368 | "dimensionCapacity": "512gb", 369 | "dimensionScreensize": "5_4inch", 370 | "price": "7599_00_unlocked", 371 | "partNumber": "MLDR3CH/A", 372 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDR3CH/A", 373 | "dimensionColor": "product_red" 374 | }, 375 | { 376 | "productTitle": "iPhone 13 mini 512GB 午夜色", 377 | "basePartNumber": "MLDN3", 378 | "image": "iphone-13-mini-midnight-select-2021", 379 | "dimensionCapacity": "512gb", 380 | "dimensionScreensize": "5_4inch", 381 | "price": "7599_00_unlocked", 382 | "partNumber": "MLDN3CH/A", 383 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDN3CH/A", 384 | "dimensionColor": "midnight" 385 | }, 386 | { 387 | "productTitle": "iPhone 13 mini 512GB 蓝色", 388 | "basePartNumber": "MLDT3", 389 | "image": "iphone-13-mini-blue-select-2021", 390 | "dimensionCapacity": "512gb", 391 | "dimensionScreensize": "5_4inch", 392 | "price": "7599_00_unlocked", 393 | "partNumber": "MLDT3CH/A", 394 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDT3CH/A", 395 | "dimensionColor": "blue" 396 | }, 397 | { 398 | "productTitle": "iPhone 13 mini 256GB 红色", 399 | "basePartNumber": "MLDL3", 400 | "image": "iphone-13-mini-product-red-select-2021", 401 | "dimensionCapacity": "256gb", 402 | "dimensionScreensize": "5_4inch", 403 | "price": "5999_00_unlocked", 404 | "partNumber": "MLDL3CH/A", 405 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDL3CH/A", 406 | "dimensionColor": "product_red" 407 | }, 408 | { 409 | "productTitle": "iPhone 13 mini 256GB 蓝色", 410 | "basePartNumber": "MLDM3", 411 | "image": "iphone-13-mini-blue-select-2021", 412 | "dimensionCapacity": "256gb", 413 | "dimensionScreensize": "5_4inch", 414 | "price": "5999_00_unlocked", 415 | "partNumber": "MLDM3CH/A", 416 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDM3CH/A", 417 | "dimensionColor": "blue" 418 | }, 419 | { 420 | "productTitle": "iPhone 13 mini 512GB 星光色", 421 | "basePartNumber": "MLDP3", 422 | "image": "iphone-13-mini-starlight-select-2021", 423 | "dimensionCapacity": "512gb", 424 | "dimensionScreensize": "5_4inch", 425 | "price": "7599_00_unlocked", 426 | "partNumber": "MLDP3CH/A", 427 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDP3CH/A", 428 | "dimensionColor": "starlight" 429 | }, 430 | { 431 | "productTitle": "iPhone 13 mini 512GB 粉色", 432 | "basePartNumber": "MLDQ3", 433 | "image": "iphone-13-mini-pink-select-2021", 434 | "dimensionCapacity": "512gb", 435 | "dimensionScreensize": "5_4inch", 436 | "price": "7599_00_unlocked", 437 | "partNumber": "MLDQ3CH/A", 438 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDQ3CH/A", 439 | "dimensionColor": "pink" 440 | }, 441 | { 442 | "productTitle": "iPhone 13 mini 128GB 午夜色", 443 | "basePartNumber": "MLDC3", 444 | "image": "iphone-13-mini-midnight-select-2021", 445 | "dimensionCapacity": "128gb", 446 | "dimensionScreensize": "5_4inch", 447 | "price": "5199_00_unlocked", 448 | "partNumber": "MLDC3CH/A", 449 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDC3CH/A", 450 | "dimensionColor": "midnight" 451 | }, 452 | { 453 | "productTitle": "iPhone 13 mini 256GB 星光色", 454 | "basePartNumber": "MLDJ3", 455 | "image": "iphone-13-mini-starlight-select-2021", 456 | "dimensionCapacity": "256gb", 457 | "dimensionScreensize": "5_4inch", 458 | "price": "5999_00_unlocked", 459 | "partNumber": "MLDJ3CH/A", 460 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDJ3CH/A", 461 | "dimensionColor": "starlight" 462 | }, 463 | { 464 | "productTitle": "iPhone 13 mini 256GB 午夜色", 465 | "basePartNumber": "MLDH3", 466 | "image": "iphone-13-mini-midnight-select-2021", 467 | "dimensionCapacity": "256gb", 468 | "dimensionScreensize": "5_4inch", 469 | "price": "5999_00_unlocked", 470 | "partNumber": "MLDH3CH/A", 471 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDH3CH/A", 472 | "dimensionColor": "midnight" 473 | }, 474 | { 475 | "productTitle": "iPhone 13 mini 128GB 红色", 476 | "basePartNumber": "MLDF3", 477 | "image": "iphone-13-mini-product-red-select-2021", 478 | "dimensionCapacity": "128gb", 479 | "dimensionScreensize": "5_4inch", 480 | "price": "5199_00_unlocked", 481 | "partNumber": "MLDF3CH/A", 482 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDF3CH/A", 483 | "dimensionColor": "product_red" 484 | }, 485 | { 486 | "productTitle": "iPhone 13 mini 128GB 星光色", 487 | "basePartNumber": "MLDD3", 488 | "image": "iphone-13-mini-starlight-select-2021", 489 | "dimensionCapacity": "128gb", 490 | "dimensionScreensize": "5_4inch", 491 | "price": "5199_00_unlocked", 492 | "partNumber": "MLDD3CH/A", 493 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDD3CH/A", 494 | "dimensionColor": "starlight" 495 | }, 496 | { 497 | "productTitle": "iPhone 13 mini 128GB 粉色", 498 | "basePartNumber": "MLDE3", 499 | "image": "iphone-13-mini-pink-select-2021", 500 | "dimensionCapacity": "128gb", 501 | "dimensionScreensize": "5_4inch", 502 | "price": "5199_00_unlocked", 503 | "partNumber": "MLDE3CH/A", 504 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDE3CH/A", 505 | "dimensionColor": "pink" 506 | }, 507 | { 508 | "productTitle": "iPhone 13 mini 256GB 粉色", 509 | "basePartNumber": "MLDK3", 510 | "image": "iphone-13-mini-pink-select-2021", 511 | "dimensionCapacity": "256gb", 512 | "dimensionScreensize": "5_4inch", 513 | "price": "5999_00_unlocked", 514 | "partNumber": "MLDK3CH/A", 515 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDK3CH/A", 516 | "dimensionColor": "pink" 517 | }, 518 | { 519 | "productTitle": "iPhone 13 128GB 粉色", 520 | "basePartNumber": "MLDW3", 521 | "image": "iphone-13-pink-select-2021", 522 | "dimensionCapacity": "128gb", 523 | "dimensionScreensize": "6_1inch", 524 | "price": "5999_00_unlocked", 525 | "partNumber": "MLDW3CH/A", 526 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDW3CH/A", 527 | "dimensionColor": "pink" 528 | }, 529 | { 530 | "productTitle": "iPhone 13 512GB 星光色", 531 | "basePartNumber": "MLE73", 532 | "image": "iphone-13-starlight-select-2021", 533 | "dimensionCapacity": "512gb", 534 | "dimensionScreensize": "6_1inch", 535 | "price": "8399_00_unlocked", 536 | "partNumber": "MLE73CH/A", 537 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE73CH/A", 538 | "dimensionColor": "starlight" 539 | }, 540 | { 541 | "productTitle": "iPhone 13 128GB 红色", 542 | "basePartNumber": "MLDX3", 543 | "image": "iphone-13-product-red-select-2021", 544 | "dimensionCapacity": "128gb", 545 | "dimensionScreensize": "6_1inch", 546 | "price": "5999_00_unlocked", 547 | "partNumber": "MLDX3CH/A", 548 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDX3CH/A", 549 | "dimensionColor": "product_red" 550 | }, 551 | { 552 | "productTitle": "iPhone 13 512GB 午夜色", 553 | "basePartNumber": "MLE63", 554 | "image": "iphone-13-midnight-select-2021", 555 | "dimensionCapacity": "512gb", 556 | "dimensionScreensize": "6_1inch", 557 | "price": "8399_00_unlocked", 558 | "partNumber": "MLE63CH/A", 559 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE63CH/A", 560 | "dimensionColor": "midnight" 561 | }, 562 | { 563 | "productTitle": "iPhone 13 256GB 红色", 564 | "basePartNumber": "MLE33", 565 | "image": "iphone-13-product-red-select-2021", 566 | "dimensionCapacity": "256gb", 567 | "dimensionScreensize": "6_1inch", 568 | "price": "6799_00_unlocked", 569 | "partNumber": "MLE33CH/A", 570 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE33CH/A", 571 | "dimensionColor": "product_red" 572 | }, 573 | { 574 | "productTitle": "iPhone 13 512GB 红色", 575 | "basePartNumber": "MLEA3", 576 | "image": "iphone-13-product-red-select-2021", 577 | "dimensionCapacity": "512gb", 578 | "dimensionScreensize": "6_1inch", 579 | "price": "8399_00_unlocked", 580 | "partNumber": "MLEA3CH/A", 581 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLEA3CH/A", 582 | "dimensionColor": "product_red" 583 | }, 584 | { 585 | "productTitle": "iPhone 13 256GB 星光色", 586 | "basePartNumber": "MLE13", 587 | "image": "iphone-13-starlight-select-2021", 588 | "dimensionCapacity": "256gb", 589 | "dimensionScreensize": "6_1inch", 590 | "price": "6799_00_unlocked", 591 | "partNumber": "MLE13CH/A", 592 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE13CH/A", 593 | "dimensionColor": "starlight" 594 | }, 595 | { 596 | "productTitle": "iPhone 13 512GB 粉色", 597 | "basePartNumber": "MLE93", 598 | "image": "iphone-13-pink-select-2021", 599 | "dimensionCapacity": "512gb", 600 | "dimensionScreensize": "6_1inch", 601 | "price": "8399_00_unlocked", 602 | "partNumber": "MLE93CH/A", 603 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE93CH/A", 604 | "dimensionColor": "pink" 605 | }, 606 | { 607 | "productTitle": "iPhone 13 128GB 午夜色", 608 | "basePartNumber": "MLDU3", 609 | "image": "iphone-13-midnight-select-2021", 610 | "dimensionCapacity": "128gb", 611 | "dimensionScreensize": "6_1inch", 612 | "price": "5999_00_unlocked", 613 | "partNumber": "MLDU3CH/A", 614 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDU3CH/A", 615 | "dimensionColor": "midnight" 616 | }, 617 | { 618 | "productTitle": "iPhone 13 128GB 星光色", 619 | "basePartNumber": "MLDV3", 620 | "image": "iphone-13-starlight-select-2021", 621 | "dimensionCapacity": "128gb", 622 | "dimensionScreensize": "6_1inch", 623 | "price": "5999_00_unlocked", 624 | "partNumber": "MLDV3CH/A", 625 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDV3CH/A", 626 | "dimensionColor": "starlight" 627 | }, 628 | { 629 | "productTitle": "iPhone 13 256GB 午夜色", 630 | "basePartNumber": "MLE03", 631 | "image": "iphone-13-midnight-select-2021", 632 | "dimensionCapacity": "256gb", 633 | "dimensionScreensize": "6_1inch", 634 | "price": "6799_00_unlocked", 635 | "partNumber": "MLE03CH/A", 636 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE03CH/A", 637 | "dimensionColor": "midnight" 638 | }, 639 | { 640 | "productTitle": "iPhone 13 128GB 蓝色", 641 | "basePartNumber": "MLDY3", 642 | "image": "iphone-13-blue-select-2021", 643 | "dimensionCapacity": "128gb", 644 | "dimensionScreensize": "6_1inch", 645 | "price": "5999_00_unlocked", 646 | "partNumber": "MLDY3CH/A", 647 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLDY3CH/A", 648 | "dimensionColor": "blue" 649 | }, 650 | { 651 | "productTitle": "iPhone 13 256GB 蓝色", 652 | "basePartNumber": "MLE43", 653 | "image": "iphone-13-blue-select-2021", 654 | "dimensionCapacity": "256gb", 655 | "dimensionScreensize": "6_1inch", 656 | "price": "6799_00_unlocked", 657 | "partNumber": "MLE43CH/A", 658 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE43CH/A", 659 | "dimensionColor": "blue" 660 | }, 661 | { 662 | "productTitle": "iPhone 13 512GB 蓝色", 663 | "basePartNumber": "MLEC3", 664 | "image": "iphone-13-blue-select-2021", 665 | "dimensionCapacity": "512gb", 666 | "dimensionScreensize": "6_1inch", 667 | "price": "8399_00_unlocked", 668 | "partNumber": "MLEC3CH/A", 669 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLEC3CH/A", 670 | "dimensionColor": "blue" 671 | }, 672 | { 673 | "productTitle": "iPhone 13 256GB 粉色", 674 | "basePartNumber": "MLE23", 675 | "image": "iphone-13-pink-select-2021", 676 | "dimensionCapacity": "256gb", 677 | "dimensionScreensize": "6_1inch", 678 | "price": "6799_00_unlocked", 679 | "partNumber": "MLE23CH/A", 680 | "productLink": "https://www.apple.com.cn/shop/buy-iphone/iphone-13/MLE23CH/A", 681 | "dimensionColor": "pink" 682 | } 683 | ] 684 | -------------------------------------------------------------------------------- /AppleReserver/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | Default 512 | 513 | 514 | 515 | 516 | 517 | 518 | Left to Right 519 | 520 | 521 | 522 | 523 | 524 | 525 | Right to Left 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | Default 537 | 538 | 539 | 540 | 541 | 542 | 543 | Left to Right 544 | 545 | 546 | 547 | 548 | 549 | 550 | Right to Left 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 818 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 932 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | --------------------------------------------------------------------------------